chiark / gitweb /
@@@ fltfmt mess
authorMark Wooding <mdw@distorted.org.uk>
Sun, 21 Apr 2024 23:30:51 +0000 (00:30 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 21 Apr 2024 23:30:51 +0000 (00:30 +0100)
91 files changed:
Makefile.am
buf/lbuf.3.in
codec/baseconv.c
configure.ac
debian/control
hash/Makefile.am
hash/siphash.3.in [new file with mode: 0644]
hash/siphash.c [new file with mode: 0644]
hash/siphash.h [new file with mode: 0644]
hash/t/hash-test.c
hash/t/hash.bench
hash/t/siphash-mktv.c [new file with mode: 0644]
hash/t/siphash.tests [new file with mode: 0644]
hash/tests.at
hash/unihash.3.in
m4/mdw-probe-fltfmt.m4 [new file with mode: 0644]
mem/alloc.3.in
mem/alloc.c
mem/alloc.h
mem/arena.3.in
mem/arena.h
mem/growbuf.3.in
mem/growbuf.h
mem/pool.3.in
mem/pool.c
mem/pool.h
mem/sub.c
mem/sub.h
struct/buf-float.c
struct/buf.c
struct/buf.h
struct/darray.c
struct/dstr.c
struct/hash.c
struct/t/assoc-test.c
struct/t/dstr-putf-test.c
struct/t/sym-test.c
sys/fdpass.c
sys/mdup.c
test/Makefile.am
test/bench.3.in
test/bench.c
test/bench.h
test/example/Makefile.am
test/example/adhoc.c [new file with mode: 0644]
test/example/parse-machine [new file with mode: 0644]
test/example/testex.c
test/t/tvec-test.c
test/tvec-adhoc.3.in
test/tvec-adhoc.h [new file with mode: 0644]
test/tvec-bench.3.in
test/tvec-bench.c
test/tvec-bench.h [new file with mode: 0644]
test/tvec-core.c
test/tvec-env.3.in
test/tvec-main.c
test/tvec-output.3.in
test/tvec-output.c
test/tvec-output.h [new file with mode: 0644]
test/tvec-remote.3.in
test/tvec-remote.c
test/tvec-remote.h [new file with mode: 0644]
test/tvec-timeout.3.in
test/tvec-timeout.c
test/tvec-timeout.h [new file with mode: 0644]
test/tvec-types.3.in
test/tvec-types.c
test/tvec-types.h [new file with mode: 0644]
test/tvec.3.in
test/tvec.h
trace/trace.3.in
utils/Makefile.am
utils/align.h
utils/bits.3.in
utils/bits.h
utils/exc.h
utils/fltfmt-convert.c [new file with mode: 0644]
utils/fltfmt.c [new file with mode: 0644]
utils/fltfmt.h [new file with mode: 0644]
utils/gprintf.c
utils/gprintf.h
utils/macros.3.in
utils/macros.h
utils/maths.h
utils/t/bits-test.c
utils/t/control-test.c
utils/t/fltfmt-test.c [new file with mode: 0644]
utils/t/fltfmt-testgen [new file with mode: 0755]
utils/t/fltfmt.tests [new file with mode: 0644]
utils/t/versioncmp-test.c
utils/tests.at

index 2c63a82bfb72088e181815d0daeb59cf971d9e5e..f6384599d74567e3936b593031412e10f500f038 100644 (file)
@@ -25,6 +25,7 @@
 ### MA 02111-1307, USA.
 
 include $(top_srcdir)/vars.am
+ACLOCAL_AMFLAGS                 = -Im4
 
 SUBDIRS                         =
 
index ac445d13e4ea6105ba9458b65a1c7c38c8caa52b..b97036158bdee8e726607f2d6deb48558a1a605d 100644 (file)
@@ -30,6 +30,7 @@
 .\"--------------------------------------------------------------------------
 .TH lbuf 3mLib "6 July 1999" "Straylight/Edgeware" "mLib utilities library"
 .\" @lbuf_close
+.\" @lbuf_flush
 .\" @lbuf_free
 .\" @lbuf_snarf
 .\" @lbuf_setsize
@@ -62,7 +63,6 @@ lbuf \- split lines out of asynchronously received blocks
 .B "typedef void lbuf_func(char *" s ", size_t " len ", void *" p );
 .PP
 .BI "void lbuf_flush(lbuf *" b ", char *" p ", size_t " len );
-.\" @lbuf_flush
 .BI "void lbuf_close(lbuf *" b );
 .BI "size_t lbuf_free(lbuf *" b ", char **" p );
 .BI "void lbuf_snarf(lbuf *" b ", const void *" p ", size_t " sz );
index 53fceb2818eb4039f83ec24659782d5c168da793..7ab32df420215174515a8166f33acd6f3faf5479 100644 (file)
@@ -419,7 +419,7 @@ static int ctxn##_dec(codec *c, const void *p, size_t sz, dstr *d)  \
 static void ctxn##_destroy(codec *c)                                   \
 {                                                                      \
   ctxn##_codec *bc = (ctxn##_codec *)c;                                        \
-  if (bc->ctx.indent) xfree((/*unconst*/ char *)bc->ctx.indent);       \
+  if (bc->ctx.indent) xfree(UNCONST(char, bc->ctx.indent));            \
   DESTROY(bc);                                                         \
 }                                                                      \
                                                                        \
index 5a5e0ff63348edc695284e7c80cc35016c623cde..416b25f12bfafe295de6ef15b7da4549893d9fad 100644 (file)
@@ -55,6 +55,7 @@ MLIB_LIBS=
 dnl Headers.
 AC_CHECK_HEADERS([float.h])
 AC_CHECK_HEADERS([stdint.h])
+AC_CHECK_HEADERS([valgrind/valgrind.h])
 
 dnl Libraries.
 mdw_ORIG_LIBS=$LIBS LIBS=$MLIB_LIBS
@@ -71,18 +72,21 @@ AC_CHECK_TYPE([socklen_t], [],
   [AC_DEFINE([socklen_t], [int],
      [Define to `int' if <sys/socket.h> does not define])],
   [AC_INCLUDES_DEFAULT
-#include <sys/socket.h>
+@%:@include <sys/socket.h>
 ])
 
 dnl Which version of struct msghdr do we have?
 AC_CHECK_MEMBERS([struct msgdr.msg_control],,, [
-#include <sys/types.h>
-#include <sys/socket.h>
+@%:@include <sys/types.h>
+@%:@include <sys/socket.h>
 ])
 
 dnl Find out whether we're cross-compiling.
 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
 
+dnl Floating-point formats.
+mdw_PROBE_FLTFMT
+
 dnl Set the master library list.
 AC_SUBST([MLIB_LIBS])
 
index 54a897686ed0e97a4c124147d112a1d90874bcaf..c441dab8711ae7e5387b780007c655ade6d860a4 100644 (file)
@@ -2,7 +2,7 @@ Source: mlib
 Section: libs
 Priority: extra
 Maintainer: Mark Wooding <mdw@distorted.org.uk>
-Build-Depends: debhelper (>= 10), python, libadns1-dev
+Build-Depends: debhelper (>= 10), python, libadns1-dev, valgrind
 Standards-Version: 3.1.1
 
 Package: mlib2
index 6654a6a187ff94112667ec11986b17ebfce05814..cf290fc32c7ee0e62822bb9c76f9831eb251154c 100644 (file)
@@ -60,6 +60,12 @@ endif
 
 EXTRA_DIST             += t/crc32.tests
 
+## SipHash.
+pkginclude_HEADERS     += siphash.h
+libhash_la_SOURCES     += siphash.c
+EXTRA_DIST             += siphash.3.in
+LIBMANS                        += siphash.3
+
 ## Universal hashing.
 pkginclude_HEADERS     += unihash.h
 noinst_LTLIBRARIES     += libunihash.la
diff --git a/hash/siphash.3.in b/hash/siphash.3.in
new file mode 100644 (file)
index 0000000..180762c
--- /dev/null
@@ -0,0 +1,281 @@
+.\" -*-nroff-*-
+.\"
+.\" Manual for SipHash
+.\"
+.\" (c) 2024 Straylight/Edgeware
+.\"
+.
+.\"----- Licensing notice ---------------------------------------------------
+.\"
+.\" This file is part of the mLib utilities library.
+.\"
+.\" mLib is free software: you can redistribute it and/or modify it under
+.\" the terms of the GNU Library General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or (at
+.\" your option) any later version.
+.\"
+.\" mLib is distributed in the hope that it will be useful, but WITHOUT
+.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+.\" FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+.\" License for more details.
+.\"
+.\" You should have received a copy of the GNU Library General Public
+.\" License along with mLib.  If not, write to the Free Software
+.\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+.\" USA.
+.
+.\"--------------------------------------------------------------------------
+.so ../defs.man \" @@@PRE@@@
+.
+.\"--------------------------------------------------------------------------
+.TH siphash 3mLib "14 April 2024" "Straylight/Edgeware" "mLib utilities library"
+.\" @SIPHASH_KEYSZ
+.\" @SIPHASH_BLKSZ
+.
+.\" @siphash_setkey
+.
+.\" @siphash
+.\" @SIPHASH
+.
+.\" @siphash_init
+.\" @siphash_hash
+.\" @siphash_done
+.\" @SIPHASH_INIT
+.\" @SIPHASH_WORD
+.\" @SIPHASH_FINAL
+.
+.\"--------------------------------------------------------------------------
+.SH SYNOPSIS
+.nf
+.B "#include <mLib/siphash.h>"
+.PP
+.B "struct siphash_key { kludge64 k0, k1; };"
+.B "struct siphash { ...\& };"
+.PP
+.B "#define SIPHASH_KEYSZ 16"
+.B "#define SIPHASH_BLKSZ 8"
+.PP
+.BI "void siphash_setkey(struct siphash_key *" k ", const octet *" p );
+.PP
+.ta \w'\fBkludge64 siphash('u
+.BI "kludge64 siphash(const struct siphash_key *" k ,
+.BI "  const void *" p ", size_t " sz );
+.ta \w'\fBvoid SIPHASH('u
+.BI "void SIPHASH(const struct siphash_key *" k ", kludge64 &" z_out ,
+.BI "  const void *" p ", size_t " sz );
+.PP
+.BI "void siphash_init(struct siphash *" s ", const struct siphash_key *" k );
+.BI "void siphash_hash(struct siphash *" s ", const void *" p ", size_t " sz );
+.BI "kludge64 siphash_done(struct siphash *" s );
+.PP
+.BI "void SIPHASH_INIT(struct siphash *" s ", const struct siphash_key *" k );
+.BI "void SIPHASH_WORD(struct siphash *" s ", kludge64 " m );
+.ta \w'\fBvoid SIPHASH_FINAL('u
+.BI "void SIPHASH_FINAL(struct siphash *" s
+.BI "  const void *" p ", unsigned " n ", size_t " msz );
+.fi
+.
+.\"--------------------------------------------------------------------------
+.SH DESCRIPTION
+.
+SipHash is a cryptographic pseudorandom function (PRF)
+and message authentication code
+designed in 2012 by Jean-Philippe Aumasson and Daniel J.\& Bernstein
+as a keyed hash function to be used to implement data structures
+to defend against malicious input.
+It therefore provides similar benefits to mLib's
+.BR unihash (3)
+module.
+Specifically, this module implements the SipHash-2-4 variant
+described in the original paper.
+.PP
+Prior to hashing,
+a
+.I key
+must be prepared.
+To prepare a key,
+fill a buffer with
+.BR SIPHASH_KEYSZ "\ =\ 16"
+bytes (128 bits) of random data,
+and call
+.BR siphash_setkey .
+Alternatively,
+initialize the
+.B k0
+and
+.B k1
+members of the
+.B struct siphash_key
+structure directly.
+The main limit on security of the hash function
+will come from the randomness of the key;
+the C library's
+.BR rand (3)
+function is likely unacceptable.
+.PP
+Once a key is prepared, messages can be hashed.
+The simplest interface is the
+.B siphash
+function:
+pass in the prepared key and the buffer containing the message,
+and it will return the computed hash.
+Slightly more complex, but possibly faster,
+the
+.B SIPHASH
+macro will leave the computed hash value in
+.IR z_out .
+The hash has type
+.BR kludge64 :
+this can be readily converted to a more convenient type using the
+.BR GET64 (3) macro;
+see
+.BR bits (3)
+for more details about the
+.B kludge64
+type.
+.PP
+If it's not convenient to arrange that
+the message data is in a single buffer,
+then the message can be processed in pieces.
+The
+.B siphash_init
+function intializes a hashing state
+in a structure of type
+.BR "struct siphash" .
+The pieces of the message can now be presented, in order,
+to the
+.B siphash_hash
+function,
+which will update the hashing state as necessary.
+The pieces and their sizes do not have to be aligned
+in any particular way.
+Finally, the
+.B siphash_done
+function computes and returns the final result,
+which is the hash of
+the concatenation of the message pieces, in order.
+The hashing state is clobbered as a result,
+and will no longer produce useful results
+(though no undefined behaviour will result).
+.PP
+Finally, there is a low-level interface, which is harder to use.
+It is provided primarily for the benefit of the
+.B SIPHASH
+macro,
+but is made available to client programs
+in case it turns out to be useful.
+The internal state managed by the internal macros
+consists of four
+.B kludge64
+variables named
+.IR a ,
+.IR b ,
+.IR c ,
+and
+.IR d .
+The macro
+.B SIPHASH_INIT
+will initialize these variables appropriately
+to begin processing a fresh message,
+given a prepared key
+.IR k .
+The macro
+.B SIPHASH_WORD
+updates the state given the next 64-bit word of the message;
+SipHash uses a little-endian convention,
+so the word should be read using
+.BR LOAD64_L_ (3)
+or similar.
+When only seven or fewer bytes of the message remain,
+call the macro
+.B SIPHASH_FINAL
+to compute the message hash.
+This expects, in addition to the four state variables,
+a pointer
+.I p
+to the tail of the message,
+the length
+.I n
+of the tail,
+and the overall message length
+.IR msz ,
+in bytes;
+the hash is returned in the
+.B kludge64
+output variable
+.IR z_out .
+.
+.SS "Comparison with unihash(3)"
+Since
+SipHash
+and mLib's existing
+.BR unihash (3)
+perform similar functions and were designed with similar motivations,
+it's natural to compare them.
+.PP
+SipHash is newer \(en by nearly a decade.
+.B unihash
+returns a 32-bit hash;
+SipHash
+returns a 64-bit hash,
+so will certainly be preferable for huge data structures.
+.PP
+SipHash can be (and, here, has been) implemented
+without leaking message or other secret data into
+caches or other microarchitectural state.
+Alas,
+.B unihash
+does have these kinds of leaks.
+The consequences of compromising a hashing key are
+generally limited to denial of service;
+furthermore, microarchitectural leaks can only be exploited by software
+sharing hardware resources with the victim,
+and locally executing software generally has other,
+more effective means
+to deny service.
+In many cases,
+.B unihash
+is adequate;
+if security agaist local adversaries is important,
+use SipHash.
+.PP
+In terms of performace,
+.B unihash
+seems faster than SipHash on very short messages
+\(en up to about 35 bytes.
+Despite the designers' efforts,
+SipHash has significant finalization overhead,
+which are better amortized over longer messages;
+as a result, SipHash performance improves with message length.
+By contrast
+.B unihash
+has no per-message startup or finalization overhead,
+and performance
+.I decreases
+with message length, mostly as a result of poorer cache utilization.
+.PP
+For now, based on these findings,
+mLib continues to use
+.B unihash
+in its
+.BR sym (3)
+hashtable implementation.
+.
+.\"--------------------------------------------------------------------------
+.SH SEE ALSO
+.
+.BR crc32 (3),
+.BR siphash (3),
+.BR unihash (3),
+.BR mLib (3).
+.PP
+Jean-Philippe Aumasson and Daniel J.\& Bernstein,
+.IR "SipHash: a fast short-input PRF" ,
+INDOCRYPT 2012.
+.
+.\"--------------------------------------------------------------------------
+.SH AUTHOR
+.
+Mark Wooding (mdw@distorted.org.uk).
+.
+.\"----- That's all, folks --------------------------------------------------
diff --git a/hash/siphash.c b/hash/siphash.c
new file mode 100644 (file)
index 0000000..998283c
--- /dev/null
@@ -0,0 +1,74 @@
+/* -*-c-*-
+ *
+ * The SipHash-2-4 message authentication code
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include "siphash.h"
+
+/*----- Main code ---------------------------------------------------------*/
+
+void siphash_setkey(struct siphash_key *k, const octet *p)
+  { LOAD64_L_(k->k0, p + 0); LOAD64_L_(k->k1, p + 8); }
+
+void siphash_init(struct siphash *s, const struct siphash_key *k)
+  { SIPHASH_INIT(s->a, s->b, s->c, s->d, k); s->n = s->msz = 0; }
+
+void siphash_hash(struct siphash *s, const void *p, size_t sz)
+{
+  const octet *q = p;
+  kludge64 m;
+  size_t n;
+
+  s->msz += sz;
+  n = SIPHASH_BLKSZ - s->n;
+  if (sz < n)
+    { memcpy(s->buf + s->n, q, sz); s->n += sz; return; }
+
+  if (s->n) {
+    memcpy(s->buf + s->n, q, n); q += n; sz -= n;
+    LOAD64_L_(m, s->buf); SIPHASH_WORD(s->a, s->b, s->c, s->d, m);
+  }
+  while (sz >= SIPHASH_BLKSZ) {
+    LOAD64_L_(m, q); SIPHASH_WORD(s->a, s->b, s->c, s->d, m);
+    q += SIPHASH_BLKSZ; sz -= SIPHASH_BLKSZ;
+  }
+  if (sz) memcpy(s->buf, q, sz);
+  s->n = sz;
+}
+
+kludge64 siphash_done(struct siphash *s)
+{
+  kludge64 z;
+
+  SIPHASH_FINAL(s->a, s->b, s->c, s->d, z, s->buf, s->n, s->msz);
+  return (z);
+}
+
+kludge64 siphash(const struct siphash_key *k, const void *p, size_t sz)
+  { kludge64 z; SIPHASH(k, z, p, sz); return (z); }
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/hash/siphash.h b/hash/siphash.h
new file mode 100644 (file)
index 0000000..f61714f
--- /dev/null
@@ -0,0 +1,271 @@
+/* -*-c-*-
+ *
+ * The SipHash-2-4 message authentication code
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_SIPHASH_H
+#define MLIB_SIPHASH_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <string.h>
+
+#ifndef MLIB_BITS_H
+#  include "bits.h"
+#endif
+
+/*----- Constants and data structures -------------------------------------*/
+
+#define SIPHASH_KEYSZ 16               /* size of a SipHash key in bytes */
+#define SIPHASH_BLKSZ 8                        /* size of SipHash blocks */
+
+struct siphash_key { kludge64 k0, k1; }; /* a prepared SipHash key */
+
+struct siphash {                       /* a SipHash context */
+  kludge64 a, b, c, d;
+  octet buf[SIPHASH_BLKSZ]; unsigned n, msz;
+};
+
+/*----- Implementation macros ---------------------------------------------*/
+
+/* The initial state, not intended for user consumption. */
+#define SIPHASH__A0 X64(736f6d65, 70736575) /* some pseu */
+#define SIPHASH__B0 X64(646f7261, 6e646f6d) /* dora ndom */
+#define SIPHASH__C0 X64(6c796765, 6e657261) /* lyge nera */
+#define SIPHASH__D0 X64(74656462, 79746573) /* tedb ytes */
+
+/* --- @SIPHASH__ROUND@ --- *
+ *
+ * Arguments:  @kludge64 &a, &b, &c, &d@ = four state variables (updated)
+ *
+ * Returns:    ---
+ *
+ * Use:                Does one round of SipHash.  Not really intended for user
+ *             consumption.
+ */
+
+#define SIPHASH__ROUND(a, b, c, d) do {                                        \
+  ADD64((a), (a), (b));        ADD64((c), (c), (d));                           \
+  ROL64_((b), (b), 13);        ROL64_((d), (d), 16);                           \
+  XOR64((b), (b), (a));        XOR64((d), (d), (c));                           \
+  ROL64_((a), (a), 32);                                                        \
+  ADD64((c), (c), (b));        ADD64((a), (a), (d));                           \
+  ROL64_((b), (b), 17);        ROL64_((d), (d), 21);                           \
+  XOR64((b), (b), (c));        XOR64((d), (d), (a));                           \
+  ROL64_((c), (c), 32);                                                        \
+} while (0)
+
+/* --- @SIPHASH_INIT@ --- *
+ *
+ * Arguments:  @kludge64 &a, &b, &c, &d@ = four state variables (output)
+ *             @const struct siphash_key *k@ = prepared key
+ *
+ * Returns:    ---
+ *
+ * Use:                Initialize a SipHash state.
+ */
+
+#define SIPHASH_INIT(a, b, c, d, k) do {                               \
+  kludge64                                                             \
+    _a0 = SIPHASH__A0, _b0 = SIPHASH__B0,                              \
+    _c0 = SIPHASH__C0, _d0 = SIPHASH__D0;                              \
+  const struct siphash_key *_k = (k);                                  \
+                                                                       \
+  XOR64((a), _a0, _k->k0); XOR64((b), _b0, _k->k1);                    \
+  XOR64((c), _c0, _k->k0); XOR64((d), _d0, _k->k1);                    \
+} while (0)
+
+/* --- @SIPHASH_WORD@ --- *
+ *
+ * Arguments:  @kludge64 &a, &b, &c, &d@ = four state variables (updated)
+ *             @kludge64 m@ = message word (multiply evaluated)
+ *
+ * Returns:    ---
+ *
+ * Use:                Update a SipHash state with a single message word.
+ */
+
+#define SIPHASH_WORD(a, b, c, d, m) do {                               \
+  XOR64((d), (d), (m));                                                        \
+  SIPHASH__ROUND(a, b, c, d); SIPHASH__ROUND(a, b, c, d);              \
+  XOR64((a), (a), (m));                                                        \
+} while (0)
+
+/* --- @SIPHASH_FINAL@ --- *
+ *
+ * Arguments:  @kludge64 &a, &b, &c, &d@ = four state variables (updated)
+ *             @kludge64 &z_out@ = hash result (output)
+ *             @const void *p@ = pointer to message tail
+ *             @unsigned n@ = length of message tail in bytes (must be less
+ *                     than @SIPHASH_BLKSZ@)
+ *             @size_t msz@ = overall message size (at least mod 256)
+ *
+ * Returns:    ---
+ *
+ * Use:                Completes a SipHash operation, storing the final result in
+ *             @z@.
+ */
+
+#define SIPHASH_FINAL(a, b, c, d, z_out, p, n, msz) do {               \
+  const unsigned char *_p = (const unsigned char *)(p);                        \
+  kludge64 _t, _u;                                                     \
+                                                                       \
+  /* Prepare the final message word.                                   \
+   *                                                                   \
+   * This is kind of annoying.  Overrunning the input buffer could be   \
+   * disastrous.  This fiddly switch seems faster than building the    \
+   * value in a byte buffer and then loading it.                       \
+   */                                                                  \
+  SET64(_t, 0, 0); SETBYTE64(_t, (msz), 7);                            \
+  switch (n) {                                                         \
+    /* case 7: */                                                      \
+    default: SETBYTE64(_t, _p[6], 6);                                  \
+    case 6:  SETBYTE64(_t, _p[5], 5);                                  \
+    case 5:  SETBYTE64(_t, _p[4], 4);                                  \
+    case 4:  SETBYTE64(_t, _p[3], 3);                                  \
+    case 3:  SETBYTE64(_t, _p[2], 2);                                  \
+    case 2:  SETBYTE64(_t, _p[1], 1);                                  \
+    case 1:  SETBYTE64(_t, _p[0], 0);                                  \
+    case 0:  break;                                                    \
+  }                                                                    \
+                                                                       \
+  /* Finish the hashing job. */                                                \
+  SIPHASH_WORD(a, b, c, d, _t);                                                \
+  SET64(_t, 0, 0xff); XOR64((c), (c), _t);                             \
+  SIPHASH__ROUND(a, b, c, d); SIPHASH__ROUND(a, b, c, d);              \
+  SIPHASH__ROUND(a, b, c, d); SIPHASH__ROUND(a, b, c, d);              \
+                                                                       \
+  /* Combine the hash-state words into a single result. */             \
+  XOR64(_t, (a), (b)); XOR64(_u, (c), (d)); XOR64((z_out), _t, _u);    \
+  SET64((a), 0, 0); SET64((b), 0, 0); SET64((c), 0, 0); SET64((d), 0, 0); \
+} while (0)
+
+/* --- @SIPHASH@ --- *
+ *
+ * Arguments:  @const struct siphash_key *k@ = prepared key
+ *             @kludge64 &z_out@ = hash result (output)
+ *             @const void *p@ = pointer to message
+ *             @size_t sz@ = message size in bytes
+ *
+ * Returns:    ---
+ *
+ * Use:                Hash a message using under the key @k@, leaving the result in
+ *             @z@.
+ */
+
+#define SIPHASH(k, z_out, p, sz) do {                                  \
+  kludge64 _a, _b, _c, _d, _m;                                         \
+  const octet *_q = (p); size_t _sz0 = (sz), _sz = _sz0;               \
+                                                                       \
+  SIPHASH_INIT(_a, _b, _c, _d, (k));                                   \
+  while (_sz >= SIPHASH_BLKSZ) {                                       \
+    LOAD64_L_(_m, _q); SIPHASH_WORD(_a, _b, _c, _d, _m);               \
+    _q += SIPHASH_BLKSZ; _sz -= SIPHASH_BLKSZ;                         \
+  }                                                                    \
+  SIPHASH_FINAL(_a, _b, _c, _d, (z_out), _q, _sz, _sz0);               \
+} while (0)
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @siphash_setkey@ --- *
+ *
+ * Arguments:  @struct siphash_key *k@ = prepared key structure to fill in
+ *             @const octet *p@ = pointer to key data (@SIPHASH_KEYSZ = 16@
+ *                     bytes)
+ *
+ * Returns:    ---
+ *
+ * Use:                Prepare a SipHash key.
+ */
+
+extern void siphash_setkey(struct siphash_key */*k*/, const octet */*p*/);
+
+/* --- @siphash_init@ --- *
+ *
+ * Arguments:  @struct siphash *s@ = hashing state to initialize
+ *             @const struct siphash_key *k@ = prepared key structure
+ *
+ * Returns:    ---
+ *
+ * Use:                Initialize a state for hashing a message in multiple pieces.
+ */
+
+extern void siphash_init(struct siphash */*s*/,
+                        const struct siphash_key */*k*/);
+
+/* --- @siphash_hash@ --- *
+ *
+ * Arguments:  @struct siphash *s@ = hashing state
+ *             @const void *p, size_t sz@ = input message buffer
+ *
+ * Returns:    ---
+ *
+ * Use:                Update the hashing state by processing the provided input
+ *             message chunk.  The address and size do not need to be
+ *             aligned in any particular way.
+ */
+
+extern void siphash_hash(struct siphash */*s*/,
+                        const void */*p*/, size_t /*sz*/);
+
+/* --- @siphash_done@ --- *
+ *
+ * Arguments:  @struct siphash *s@ = hashing state (clobbered)
+ *
+ * Returns:    The completed hash.
+ *
+ * Use:                Complete the hashing operation tracked by the state,
+ *             returning the resulting 64-bit hash.
+ */
+
+extern kludge64 siphash_done(struct siphash */*s*/);
+
+/* --- @siphash@ --- *
+ *
+ * Arguments:  @const struct siphash_key *k@ = prepared key
+ *             @const void *p, size_t sz@ = input message buffer
+ *
+ * Returns:    The completed hash.
+ *
+ * Use:                Hash the message data in a single input buffer under the
+ *             control of the supplied key, returning the resulting hash.
+ *             This is simpler and faster than the @init@/@hash@/@done@
+ *             interface.
+ */
+
+extern kludge64 siphash(const struct siphash_key */*k*/,
+                       const void */*p*/, size_t /*sz*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index 57a6ce8273ac27113a192732eb64bda35c69276f..f587c300e5b43decd342dc6a95f796622208cb3e 100644 (file)
 
 /*----- Header files ------------------------------------------------------*/
 
+#include "tvec.h"
+#include "tvec-bench.h"
+#include "tvec-types.h"
+
 #include "crc32.h"
+#include "siphash.h"
 #include "unihash.h"
-#include "tvec.h"
 
-/*----- Main code ---------------------------------------------------------*/
+/*----- Register allocation -----------------------------------------------*/
 
 enum {
   RH, NROUT,
   RK = NROUT, RM, NREG
 };
 
+/*----- Testing utilities -------------------------------------------------*/
+
 struct step { size_t s; };
 
+static void run_step(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
+{
+  static const size_t steps[] = { 1, 5, 6, 7, 8, 23 };
+  struct step step;
+  size_t i;
+
+  fn(tv->in, tv->out, 0);
+  tvec_check(tv, "whole buffer");
+
+  for (i = 0; i < N(steps); i++) {
+    step.s = steps[i];
+    fn(tv->in, tv->out, &step);
+    tvec_check(tv, "step = %lu", (unsigned long)steps[i]);
+  }
+}
+
+static const struct tvec_env step_testenv = { 0, 0, 0, 0, run_step, 0, 0 };
+
+static void before_hash(struct tvec_state *tv, void *ctx)
+  { tvec_allocbuffer(&tv->in[RM].v); }
+
+/*----- CRC32 -------------------------------------------------------------*/
+
+static const struct tvec_regdef bench_regs[] = {
+  { "msz", &tvty_buffer, RM, TVRF_ID },
+  TVEC_ENDREGS
+};
+
+static const struct tvec_regdef crc32_regs[] = {
+  { "m", &tvty_bytes, RM, 0 },
+  { "h", &tvty_uint, RH, 0, { &tvrange_u32 } },
+  TVEC_ENDREGS
+};
+
 static void test_crc32(const struct tvec_reg *in, struct tvec_reg *out,
                       void *ctx)
 {
@@ -56,59 +96,77 @@ static void test_crc32(const struct tvec_reg *in, struct tvec_reg *out,
   }
 }
 
-static void before_hash(struct tvec_state *tv, void *ctx)
-  { tvec_allocbuffer(&tv->in[RM].v); }
+static const struct tvec_test crc32_test =
+  { "crc32", crc32_regs, &step_testenv, test_crc32 };
 
 static void bench_crc32(const struct tvec_reg *in, struct tvec_reg *out,
                        void *ctx)
   { crc32(0, in[RM].v.bytes.p, in[RM].v.bytes.sz); }
+
 static const struct tvec_env crc32_benchenv =
   { 0, 0, 0, before_hash };
+static const struct tvec_benchenv crc32_bench =
+  { TVEC_BENCHINIT, 1, -1, RM, &crc32_benchenv };
+static const struct tvec_test crc32_benchtest =
+  { "crc32-bench", bench_regs, &crc32_bench._env, bench_crc32 };
 
-static void test_unihash(const struct tvec_reg *in, struct tvec_reg *out,
+/*----- SipHash -----------------------------------------------------------*/
+
+static const struct tvec_urange
+  siphash_keyrange = { SIPHASH_KEYSZ, SIPHASH_KEYSZ },
+  siphash_hashrange = { 8, 8 };
+
+static const struct tvec_regdef siphash_regs[] = {
+  { "k", &tvty_bytes, RK, 0, { &siphash_keyrange } },
+  { "m", &tvty_bytes, RM, 0 },
+  { "h", &tvty_bytes, RH, 0, { &siphash_hashrange } },
+  TVEC_ENDREGS
+};
+
+static void test_siphash(const struct tvec_reg *in, struct tvec_reg *out,
                         void *ctx)
 {
   const struct step *step = ctx;
-  unihash_info ui;
   const unsigned char *p = in[RM].v.bytes.p; size_t sz = in[RM].v.bytes.sz;
-  uint32 h;
+  struct siphash_key k;
+  struct siphash s;
+  kludge64 h;
 
-  unihash_setkey(&ui, in[RK].v.u);
+  siphash_setkey(&k, in[RK].v.bytes.p);
   if (!step)
-    out[RH].v.u = unihash(&ui, p, sz);
+    h = siphash(&k, p, sz);
   else {
-    for (h = UNIHASH_INIT(&ui); sz > step->s; p += step->s, sz -= step->s)
-      h = unihash_hash(&ui, h, p, step->s);
-    out[RH].v.u = unihash_hash(&ui, h, p, sz);
+    siphash_init(&s, &k);
+    for (; sz > step->s; p += step->s, sz -= step->s)
+      siphash_hash(&s, p, step->s);
+    siphash_hash(&s, p, sz);
+    h = siphash_done(&s);
   }
+  tvec_allocbytes(&out[RH].v, 8); STORE64_L_(out[RH].v.bytes.p, h);
 }
 
-static void bench_unihash(const struct tvec_reg *in, struct tvec_reg *out,
-                         void *ctx)
-  { unihash_hash(ctx, 0, in[RM].v.bytes.p, in[RM].v.bytes.sz); }
-static void setup_unihash(struct tvec_state *tv,
-                         const struct tvec_env *env, void *pctx, void *ctx)
-  { tvec_allocbuffer(&tv->in[RM].v); unihash_setkey(ctx, 0); }
-static const struct tvec_env unihash_benchenv =
-  { sizeof(unihash_info), setup_unihash, 0, before_hash };
+static const struct tvec_test siphash_test =
+  { "siphash", siphash_regs, &step_testenv, test_siphash };
 
-static void run_step(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
+static void setup_siphash(struct tvec_state *tv,
+                         const struct tvec_env *env, void *pctx, void *ctx)
 {
-  static const size_t steps[] = { 1, 5, 6, 7, 8, 23 };
-  struct step step;
-  size_t i;
+  struct siphash_key *k = ctx;
+  ASSIGN64(k->k0, 0); ASSIGN64(k->k1, 0);
+}
 
-  fn(tv->in, tv->out, 0);
-  tvec_check(tv, "whole buffer");
+static void bench_siphash(const struct tvec_reg *in, struct tvec_reg *out,
+                         void *ctx)
+  { siphash(ctx, in[RM].v.bytes.p, in[RM].v.bytes.sz); }
 
-  for (i = 0; i < N(steps); i++) {
-    step.s = steps[i];
-    fn(tv->in, tv->out, &step);
-    tvec_check(tv, "step = %lu", (unsigned long)steps[i]);
-  }
-}
+static const struct tvec_env siphash_benchenv =
+  { sizeof(struct siphash_key), setup_siphash, 0, before_hash };
+static const struct tvec_benchenv siphash_bench =
+  { TVEC_BENCHINIT, 1, -1, RM, &siphash_benchenv };
+static const struct tvec_test siphash_benchtest =
+  { "siphash-bench", bench_regs, &siphash_bench._env, bench_siphash };
 
-static const struct tvec_env step_testenv = { 0, 0, 0, 0, run_step, 0, 0 };
+/*----- Unihash -----------------------------------------------------------*/
 
 static const struct tvec_regdef unihash_regs[] = {
   { "k", &tvty_uint, RK, 0, { &tvrange_u32 } },
@@ -117,28 +175,49 @@ static const struct tvec_regdef unihash_regs[] = {
   TVEC_ENDREGS
 };
 
-static const struct tvec_regdef crc32_regs[] = {
-  { "m", &tvty_bytes, RM, 0 },
-  { "h", &tvty_uint, RH, 0, { &tvrange_u32 } },
-  TVEC_ENDREGS
-};
+static void test_unihash(const struct tvec_reg *in, struct tvec_reg *out,
+                        void *ctx)
+{
+  const struct step *step = ctx;
+  unihash_info ui;
+  const unsigned char *p = in[RM].v.bytes.p; size_t sz = in[RM].v.bytes.sz;
+  uint32 h;
 
-static const struct tvec_regdef bench_regs[] = {
-  { "msz", &tvty_buffer, RM, TVRF_ID },
-  TVEC_ENDREGS
-};
+  unihash_setkey(&ui, in[RK].v.u);
+  if (!step)
+    out[RH].v.u = unihash(&ui, p, sz);
+  else {
+    for (h = UNIHASH_INIT(&ui); sz > step->s; p += step->s, sz -= step->s)
+      h = unihash_hash(&ui, h, p, step->s);
+    out[RH].v.u = unihash_hash(&ui, h, p, sz);
+  }
+}
 
-static const struct tvec_benchenv crc32_bench =
-  { TVEC_BENCHINIT, 1, -1, RM, &crc32_benchenv };
+static const struct tvec_test unihash_test =
+  { "unihash", unihash_regs, &step_testenv, test_unihash };
+
+static void setup_unihash(struct tvec_state *tv,
+                         const struct tvec_env *env, void *pctx, void *ctx)
+  { unihash_setkey(ctx, 0); }
+
+static void bench_unihash(const struct tvec_reg *in, struct tvec_reg *out,
+                         void *ctx)
+  { unihash_hash(ctx, 0, in[RM].v.bytes.p, in[RM].v.bytes.sz); }
+
+static const struct tvec_env unihash_benchenv =
+  { sizeof(unihash_info), setup_unihash, 0, before_hash };
 static const struct tvec_benchenv unihash_bench =
   { TVEC_BENCHINIT, 1, -1, RM, &unihash_benchenv };
+static const struct tvec_test unihash_benchtest =
+  { "unihash-bench", bench_regs, &unihash_bench._env, bench_unihash };
+
+/*----- Main program ------------------------------------------------------*/
 
-static const struct tvec_test tests[] = {
-  { "crc32", crc32_regs, &step_testenv, test_crc32 },
-  { "unihash", unihash_regs, &step_testenv, test_unihash },
-  { "crc32-bench", bench_regs, &crc32_bench._env, bench_crc32 },
-  { "unihash-bench", bench_regs, &unihash_bench._env, bench_unihash },
-  TVEC_ENDTESTS
+static const struct tvec_test *const tests[] = {
+  &crc32_test, &crc32_benchtest,
+  &siphash_test, &siphash_benchtest,
+  &unihash_test, &unihash_benchtest,
+  0
 };
 
 static const struct tvec_config testconfig =
index 7d877ac01c873d294d26df4b26419343523bda57..19dfb6f2b9c8a662d65faecff79057004ac22144 100644 (file)
@@ -13,6 +13,18 @@ msz = 16 kB
 
 msz = 1 MB
 
+[siphash-bench]
+
+msz = 16
+
+msz = 256
+
+msz = 1 kB
+
+msz = 16 kB
+
+msz = 1 MB
+
 [unihash-bench]
 
 msz = 16
diff --git a/hash/t/siphash-mktv.c b/hash/t/siphash-mktv.c
new file mode 100644 (file)
index 0000000..285d1ec
--- /dev/null
@@ -0,0 +1,49 @@
+#include <stdio.h>
+
+#include "siphash.h"
+
+#define TAP 0x8299
+
+static void step(int *rng_inout)
+{
+  unsigned i;
+  int x = *rng_inout;
+
+  for (i = 0; i < 8; i++) x = (x << 1) ^ ((x >> 31)&TAP);
+  *rng_inout = x;
+}
+
+static void fill(int *rng_inout, unsigned char *p, size_t sz)
+  { while (sz--) { *p++ = *rng_inout&0xff; step(rng_inout); } }
+
+static void dump(const char *name, const unsigned char *p, size_t sz)
+{
+  size_t i;
+
+  printf("%s = ", name);
+  if (!sz)
+    fputs("\"\"", stdout);
+  else for (i = 0; i < sz; i++) {
+    if (!i || i%4) ;
+    else if (!(i%32)) fputs("\n    ", stdout);
+    else if (!(i%4)) fputc(' ', stdout);
+    printf("%02x", *p++);
+  }
+  fputc('\n', stdout);
+}
+
+int main(void)
+{
+  unsigned char k[16], h[8];
+  unsigned char msg[1024];
+  int rng = 0xe6161f4d;
+  unsigned i;
+
+  for (i = 0; i <= sizeof(msg); i++) {
+    if (i) fputc('\n', stdout);
+    fill(&rng, k, sizeof(k)); dump("k", k, sizeof(k));
+    fill(&rng, msg, i); dump("m", msg, i);
+    siphash(msg, i, k, h, sizeof(h)); dump("h", h, sizeof(h));
+  }
+  return (0);
+}
diff --git a/hash/t/siphash.tests b/hash/t/siphash.tests
new file mode 100644 (file)
index 0000000..0759913
--- /dev/null
@@ -0,0 +1,20270 @@
+;;; -*-conf-*-
+;;; siphash tests
+
+[siphash]
+
+;; These were generated by the reference implementation at
+;; https://github.com/veorq/siphash.  Sadly, none of these test messages
+;; longer than 63 bytes.
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = ""
+h = 310e0edd 47db6f72
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00
+h = fd67dc93 c539f874
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 0001
+h = 5a4fa9d9 09806c0d
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 000102
+h = 2d7efbd7 96666785
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203
+h = b7877127 e09427cf
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04
+h = 8da699cd 64557618
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 0405
+h = cee3fe58 6e46c9cb
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 040506
+h = 37d1018b f50002ab
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607
+h = 6224939a 79f5f593
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08
+h = b0e4a90b df82009e
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 0809
+h = f3b9dd94 c5bb5d7a
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a
+h = a7ad6b22 462fb3f4
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b
+h = fbe50e86 bc8f1e75
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c
+h = 903d84c0 2756ea14
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d
+h = eef27a8e 90ca23f7
+
+k = 00010203 04050607 08090a0b 0c0d0e0f        ; this one is the example from
+m = 00010203 04050607 08090a0b 0c0d0e  ; the SipHash paper
+h = e545be49 61ca29a1
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f
+h = db9bc257 7fcc2a3f
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10
+h = 9447be2c f5e99a69
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 1011
+h = 9cd38d96 f0b3c14b
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 101112
+h = bd6179a7 1dc96dbb
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213
+h = 98eea21a f25cd6be
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14
+h = c7673b2e b0cbf2d0
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 1415
+h = 883ea3e3 95675393
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 141516
+h = c8ce5ccd 8c030ca8
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617
+h = 94af49f6 c650adb8
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18
+h = eab8858a de92e1bc
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 1819
+h = f315bb5b b835d817
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a
+h = adcf6b07 63612e2f
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b
+h = a5c91da7 acaa4dde
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c
+h = 71659587 6650a2a6
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d
+h = 28ef495c 53a387ad
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e
+h = 42c341d8 fa92d832
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+h = ce7cf272 2f512771
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20
+h = e37859f9 4623f3a7
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    2021
+h = 381205bb 1ab0e012
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    202122
+h = ae97a10f d434e015
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223
+h = b4a31508 beff4d31
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24
+h = 81396229 f0907902
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 2425
+h = 4d0cf49e e5d4dcca
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 242526
+h = 5c73336a 76d8bf9a
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627
+h = d0a70453 6ba93e0e
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28
+h = 925958fc d6420cad
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 2829
+h = a915c29b c8067318
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a
+h = 952b79f3 bc0aa6d4
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b
+h = f21df2e4 1d4535f9
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c
+h = 87577519 048f53a9
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d
+h = 10a56cf5 dfcd9adb
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e
+h = eb75095c cd986cd0
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f
+h = 51a9cb9e cba312e6
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30
+h = 96afadfc 2ce666c7
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 3031
+h = 72fe5297 5a4364ee
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 303132
+h = 5a1645b2 76d592a1
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233
+h = b274cb8e bf87870a
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34
+h = 6f9bb420 3de7b381
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 3435
+h = eaecb2a3 0b22a87f
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 343536
+h = 9924a43c c1315724
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637
+h = bd838d3a afbf8db7
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38
+h = 0b1a2a32 65d51aea
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 3839
+h = 135079a3 231ce660
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a
+h = 932b2846 e4d70666
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b
+h = e1915f5c b1eca46c
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c
+h = f325965c a16d629f
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c3d
+h = 575ff28e 60381be5
+
+k = 00010203 04050607 08090a0b 0c0d0e0f
+m = 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
+    20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c3d3e
+h = 724506eb 4c328a95
+
+;; Here are some more tests which I generated using the reference
+;; implementation, but using my own driver code -- see `siphash-mktv.c'.
+
+k = 4db6c655 70f606df faf08326 e2a04d45
+m = ""
+h = 5dafb4aa fef15ba8
+
+k = 2f151baf 21330e3d 6e527ba3 ff2e18cf
+m = 02
+h = 23d14c57 f1403b0e
+
+k = 66f5f67c 72a31653 e8866fb7 4a638901
+m = 10b1
+h = 2c6f33c8 daf11b8f
+
+k = ed0994b4 5c8d2735 7bd922a5 5fffbcb3
+m = c3f114
+h = e22762a8 78fc33db
+
+k = 9a294e28 75083d3f 2849c1ca 715a42b3
+m = cfd2e5de
+h = 91992760 4c387aec
+
+k = e5b6a637 a8d385a3 d749fb25 02722a7f
+m = 2cbfea1f c5
+h = 8f555826 39a81465
+
+k = e006bec6 d3bd7d35 aef737ef cd230294
+m = a0da7d8e 39d0
+h = 4deac633 ca228100
+
+k = e2d3178f bdac0e6f 0c6ca351 bc090a12
+m = daad11d3 cd800b
+h = 0a013c48 9b0ba476
+
+k = 8cc99e27 3a3db037 40c1b725 e055b75a
+m = 46d2db40 b21d850a
+h = 678474da e0fefc09
+
+k = 2596cf89 6be288f5 3d7f252c 7d59d4d1
+m = 07cc516e 289d4be9 dd
+h = 52b61080 61626fd9
+
+k = aa234eda 30922d9c 003afdb8 21c76498
+m = d0a07316 2b0dea2f 1b63
+h = 472d3c3c 21e8a54d
+
+k = 0f9f1afe 4d007eac d3c4c5c6 b8878e64
+m = 8b13ed6c 6b41a1ec c415ba
+h = 87d939dc 68182dcb
+
+k = e7be34b5 a4b04f75 bc1f4add 0b3659a6
+m = 109d6be9 35d1f7b0 502c84d4
+h = a3899e19 6d67269b
+
+k = 697d6c91 3a4c94a5 6f745b5c e1097df8
+m = 5110b3ef c197f9d7 d9c7c7ed 6c
+h = df9b8f19 b0e2be64
+
+k = 7775afeb 6e8ca94a 0add77ed a7176cdd
+m = 1ce9f1c0 b399e6fc da2bbeee 56a5
+h = acf31246 15dccfa2
+
+k = e6e7b8f6 53291423 5046885a 0ea0d1e1
+m = b4365f1f bd61f7cc 12a235bb 78a6a3
+h = d3592c5e 20457b50
+
+k = 7ec7f1af 18c55dfa 631f1172 bd9e10b3
+m = e7060a21 c666cfe5 dc3d0bc8 7e3931d3
+h = 8a17edad e4020969
+
+k = 9f8f02ae 4cd218a1 fc0d8516 6608a6ba
+m = 0beed97c a084c190 971b2fe1 581bc73d 6b
+h = 11809d66 547041af
+
+k = 633d2d73 43a65e48 26a25cce d49e8e61
+m = 19056770 e490542e 469bf73c 08505dc3 d8bb
+h = 8741763c 6e301166
+
+k = bc8a0d9c cf1976d0 a255703a 0239fb18
+m = bf496a15 37af13d1 1bb15081 e54eaf05 723144
+h = 9b01a1cb 908acfe5
+
+k = 22ab20dd cd1aa05f d49e0ee8 c0f8e8d7
+m = 2610e499 00863602 9b44e539 4c560725 2480fc08
+h = 46409569 85a0ac41
+
+k = cf789941 39ffd3d6 17b4ce00 dccca9f8
+m = fedd9c64 0abfc3fb ebb3f6bf 5d01f8bd 2d99dcca 50
+h = ae0fba95 63b69ffe
+
+k = 23228c15 2da131be 7badd065 58752b6e
+m = 121945a1 0b71d715 796931c6 3b990ea8 6617cd57 590f
+h = 67eeaf2a 5ca3982e
+
+k = 26e524ae 5f5f3299 8a2a6c4d 5ba46f0d
+m = b1acde44 48abf2a5 a7ba0956 58a2fa52 69b282ec e18376
+h = a1a99646 81060f6b
+
+k = 94981df5 b05e5bb1 38f088d9 c052f532
+m = 1fdd3312 68bcb086 63d54d52 7cc6bb08 a2d9ec64 a0cbffba
+h = fe921552 046575d0
+
+k = 482d3508 1134e77b 3e8561f9 7d6d2d7f
+m = 2669a098 71f3cbd0 8af17864 9725c573 d071f328 58aee223 7c
+h = 6e49cce7 cf0ee196
+
+k = 9921022b 0fe2c39d c97c9f42 82ba3b58
+m = 1c5858b0 15c5d4d9 47ed9f95 c014c564 04864530 13fb07b3 d047
+h = a6bc6cb5 68219b30
+
+k = 1bf326ff 33e6e954 b7a73a79 2d1543a8
+m = bf7998a4 b1f5354c 590edb43 3baca283 8c148ecd 18293cde 7ee1bf
+h = 0f6c5230 b1c06f80
+
+k = 60286cb7 5a6b3301 b38623e6 c668e5ed
+m = 4bb038a3 353c8f29 b907af77 3b99a701 e7c2e458 c5482fe5 e7e2ba4c
+h = ba3bed21 dda765f2
+
+k = 8812e1e7 f2483975 13dbf79e d341e94a
+m = 81de3e94 9ae06599 ec3759f7 12603589 79cd0bb1 df20fe11 531a22c0 9b
+h = 952ef266 d2ce49c0
+
+k = f3105ca8 68b628c9 c3c2855c 646abdb3
+m = 6e318e40 eb675186 2baa89b9 30e59939 8be66d26 1485d192 ff0789be 27bf
+h = cffbee7e 06f08fef
+
+k = 069ed094 4d433c5b 2b75ef66 32e99f6a
+m = ba5ab2d1 14863b60 255819ed 81659873 9beee69c 63a4a3cc 2f834a2c 58a7f4
+h = 8911ffcd 5624c464
+
+k = 8f346f54 f44581c8 3418ee15 c97d885f
+m = 71a47821 b5ffe1c3 a28f046c 535f0cf2 a02e0242 419daa2b d007110b 55af3749
+h = c9ad349e c20e88ab
+
+k = 5be8ab56 a5cc5aad 6af13cc0 d56f39ff
+m = c668d12c 488d9607 8267c647 1d367abd 0b116499 e1f38a38 efde4959 0a023c6c
+    7f
+h = 2ab58600 b7a16a4a
+
+k = e2fb0225 ee4f7d4c ccdc4c98 4dc619f9
+m = da78936f d19d244f 1e5b0bb9 6dfb50f0 40000c86 5fda4f7f d700df31 25fcdb6f
+    8061
+h = 4c0597f6 bf239a20
+
+k = c86e44ba a5a24556 2695b08e 0539890d
+m = c98454b7 b96f6fd4 a12f8b4c e42c6775 19363c48 d5243b47 f0951c6c 5546ce47
+    496101
+h = f35aa143 8d039b76
+
+k = 5fe4b7b6 560d322b ab88b848 041162bb
+m = 7c173e04 06b9c398 2b18b4f7 ea9205fb a7d05f2d 8b4e1106 d3f4c01d 8955f86c
+    05907b5e
+h = 4ae7349e 8bd36e91
+
+k = fdee4868 1b4b2a1d c8f697b3 9f037908
+m = 48e5f26e d34de825 4dbd638d 362d88e5 6da989a5 10400de0 2c9ddb80 71a32bb9
+    8838ce7f be
+h = 33db560d f868020b
+
+k = 13be235a 6e57a2db 85abc31c 86e12c80
+m = 1542a67f 537a358e c86847c7 84298fcc d7d423c0 b280d108 53b75b02 d154152b
+    13339224 3b63
+h = f568bb98 aa94b0d9
+
+k = 7f879b62 424edd98 a4b831fd f4019b9b
+m = 21281f28 6fd7e0ed c8dd5183 5fb7f078 e43f65fd aa52190e f3bb76dc 32d82174
+    2eed494e 83c7f1
+h = feb11118 b35c971d
+
+k = 325d476f b2b0ed2e 2b726ca4 e71d8abf
+m = 5ab66b6b 2c53d99d f1bde9e6 f6545e95 0c427a4c 65a802ef fc489b3f dcf2cdc9
+    a8ddf84a bed2e4c2
+h = bdb57a94 3804046c
+
+k = d995a5a9 b4a1d390 4b407a1e f1b338ca
+m = c9efa6d8 8c695995 9b86b207 b308566e de7866c7 1aeff95c 14f64074 44f38520
+    e0fd6f73 4a8be451 65
+h = 709d0b5a 50633c4d
+
+k = 91a5035f 0908a789 390f09a6 8617e9a8
+m = ab29517f 1fc4b5be 75ab337d 8ef8614e e93f2caf 774edad1 26110a9a 43b11327
+    905dc9e5 fe82d5a2 263e
+h = 0893619a 21501ef1
+
+k = 2b0352c0 5c22d6ba 6e244ed7 d517279c
+m = 2eb29005 67a435fa 19859dda f5d5f833 b573e7a7 4dfd931f b8414c06 1c2c8edd
+    00402d45 2c783663 694f25
+h = ac151478 3ff399f6
+
+k = f72fd1a2 d6dc378e 5685ba17 ed5c35a4
+m = 710b5929 489384ec 945656e1 d8bdbf02 2cb8a315 6c9f63e3 ef88a7c1 6332a57b
+    a83e416c 795aa4ab f4537134
+h = 51f03fc5 aabb02f3
+
+k = bd45ea9d 45ab2810 ff475f2c a3c43156
+m = b2c46eec d8dd7387 4755191e 6765a1a5 64b9c637 ae597f93 65bbd7e4 687ea441
+    f1fb32a0 54a7a63a b190e8a5 2c
+h = 43c35a05 dbec35b4
+
+k = 016aea94 0d445662 1f8b5369 dfc68f7a
+m = aaf1ae45 c50bbc2d a22a028c 0407c594 0bc5eb82 9a4539c1 0f3484f5 cde0f14a
+    b9947a39 43d84254 bac6b328 a9a7
+h = 7fa1cc0e 1245ef87
+
+k = 8f3aac28 c2497801 fbbabd60 fec4f765
+m = 347e6baa 26f76bfa ab17931b 9ad9b357 bbc33979 36272974 84744d2c e95936d7
+    022c380b cc544653 ca5237bd 045743
+h = 0a0cacba 279285c4
+
+k = 8c231943 b8b8c4ca 67e93457 0edef972
+m = 2b486adc 6e07333c 738188b6 ded9c143 265b931d 40afb248 380b0650 3a3e3945
+    67fc3216 53aa0f57 4b0bdde1 596cd07e
+h = 81e25c3e 80fa046f
+
+k = 7ded29e9 48cc6e4f bc11e090 45a066f5
+m = 00ee90e3 2b2b07a8 2fd674ce ef9f370a 7735e4fd 6869e15e da4bfdcc b68d0499
+    bcc29133 006259b3 6fef5f82 cae25c2c 6e
+h = c309e8f6 e2518ab1
+
+k = af29989e 4a218e48 326a9f40 606451ff
+m = fe686524 ea6d7d2a c8e42fc5 dc7e9085 a61175c2 30a28d45 af3d024e edb9659b
+    7bae45f5 713def7b 003a2f97 d199aa75 b755
+h = 8b1632ff 157cb6bb
+
+k = 87a0d8c9 adf84257 bfab5223 516ecb7a
+m = 6f18a4a4 df739e00 bea8d15c 6aec0e72 6577f27b aca9dc1c afe1e338 cf32e854
+    cebeca73 aaadd03a 9116de9d 97410c60 1bf0e0
+h = 7528120f e26b82a9
+
+k = 5d666a15 318889e2 3a16af4a a05bedcc
+m = 3080d753 7b3ab3b7 95e1cfe8 0a38cdc1 417ab7a6 ab929d69 2b9f2b08 dd290fa3
+    8fda2d25 2f22f681 a50e79d3 b6e8d269 19ccf589
+h = e2f39d56 067a26d9
+
+k = eddb813c 066cfcdf 2513b32a 6312e868
+m = b900db61 59ba6a8c 4b741f21 07630e05 739e2814 a5889c7d 884b5c37 489f66fd
+    7cc4c0b7 c829ef53 8bc3b3fb daffd24b 091b8421 4f
+h = 12ad0e1d 85279a81
+
+k = adc0e39d ab1517ac dae73cd8 1425e635
+m = 26860019 f60fbc03 ced95413 a9419e1a e5be580e 392cd334 a63eb9a9 02662dc0
+    0900c703 671646ec e42a054f ddf20614 18bd3095 67fc
+h = c28e3354 76085993
+
+k = e4462170 dbe19193 e2a0bf88 4f414764
+m = 735c990c a9d15945 a2967c63 31323399 1852251b 6f027ac9 58e67fe7 e6af2439
+    9ce2b678 04881a0b f2f0d2fc 4e8b20a1 7a84be87 ce7afd
+h = bddbd483 dbf145d5
+
+k = f389779e 9a4f8178 3fba34ac 4b0d2a68
+m = 8296780d 93f20912 94889de0 f4e4be80 5dd53960 71389841 34920098 be77c03e
+    06a33e46 71d54014 94c8e096 e93b5cb5 a1ae3039 ad91965f
+h = 48918bb9 8dd8137d
+
+k = 9bf79ac9 830aa7ce 58d25b2b 65917709
+m = af10e778 9c8c0616 53cbdbb2 81bcae84 c4d2de79 d70e3a60 193d1ef5 8535a66d
+    124cc6ec aeec202f 56f55f8f 43c2f9a6 5a1e6e7e 82a7ad1f 67
+h = 9393a774 a134e027
+
+k = 0fd80975 a62dc82c 5d6e91e4 7749f13d
+m = 270be46f dc97517e a83f0fc4 7363867f a3b86d93 1544d4de 863b721f 519b94c9
+    aa446151 3ee03944 0667fa37 67e85247 09b79ddb 98022fb4 013c
+h = 0ed356b2 418f8662
+
+k = 0fe7b415 fd94a16f 5f2c782c 09fd127d
+m = 10281755 dbd25682 04a4f30e b1095471 d9b9a9bd 4927a76f addb4e7c edf97439
+    c90f806a e7de5e55 1cc17185 ff6af51b a0fd8156 642f2cbe 5f9a67
+h = 90adba0e 3b8385b1
+
+k = 272c791a 64cbfbb9 6e176db0 d83e2adf
+m = e91a5361 a5d245c4 36b5cba1 9f1383bb 2869f4be 5ce5b2e2 077db778 fcb2661d
+    e7b8b940 5b1176b7 38e2f186 2f40ab22 48871e1c 335ec6da 91557910
+h = 3037052a 0724e108
+
+k = d1ef8101 8b733d41 0e7c59e5 ee4ad45b
+m = 17ab59f6 e989b095 c6c478e0 c7336f77 3d57fd93 9dd2808e 60505ea2 3d6809ed
+    2e481391 fabe9adf 4f90b0c6 6e79f1f0 000815ed 282cb5cf 8577761f 17
+h = 09f56237 8b416307
+
+k = 004a4bfa f3691f38 d61fedd0 17aa8c40
+m = fb0f7236 05179f62 bb2909d8 23c7e5e3 6e10fd55 513e10ed 3c90db62 55e743c5
+    60c11b1c 9612a528 5e62fea9 a7ad3c24 d2f8e03d 19126bd2 2707c097 57d2
+h = 897f8cf0 abc7f99d
+
+k = 0e058437 9f28d9ac a2fa5e7d ad88e9a2
+m = 36bb2690 3e8c81b2 d7ad2fc7 7e77daf3 52784997 f40adbd1 d918b901 e2c43d98
+    74a339bb 7ca68d09 346675ea 4390f412 609222ff 826880ad 08473e94 f9a198
+h = 6196670f 4d523519
+
+k = 57ce580c 2bc4c174 82b0ff3b 92329920
+m = dfa08041 193982ce 25e86d8b a818b516 94837654 95e4a574 656a5d76 9e7e56f3
+    b75cdbbe 357cedac e7df7d96 eca1aea2 b87d779d 32166353 8e014840 8ea1a032
+h = 4fbc3b67 c20df80a
+
+k = ed377e19 d4345a32 11d39397 3dbb4005
+m = 77727415 17638d4c 77acb4eb ebc8545e c42226ab ce9cc78c 8021a305 d2cfa1ca
+    cb01ffad a4c99f44 87ed80aa 43f58f35 c698586e a5ea89df d88f8cb5 1d7d270f
+    5e
+h = 3dfb5638 74f8f5a1
+
+k = ad76ed56 cad8ae1c 1d836181 9a077552
+m = ddacdf87 d132477c db8b3e0a 81025723 fcc535c0 ca782b13 84c7b396 aa614ac1
+    5f56ee36 be7eabc8 a545a932 7070ad33 e31f610f 9c658188 e718bde4 4e0d34ba
+    6979
+h = c39180a4 a902d1c4
+
+k = 53ed9edf 619c4320 7cec2edf 330f5ad5
+m = 00a6f77e 4ced1222 30db43cc 8215a95d f442d456 9329b699 c11778a8 b975d1d7
+    96805d5b d1beeb46 f8adfc07 fc3ffa79 68d774e5 4d46c5e5 c1e8aade 1aa5cb38
+    8e8375
+h = ea927c20 f13c8019
+
+k = 82b2a0ba ea48b3e3 1790125f 27f53942
+m = 00900cba 6e54e476 09993065 62c0cff2 e31504d3 0ebfd273 cb476d76 ee8d47d6
+    c970557e 6767c0dd 9a17be3f 69049f7b dccb28a4 33fdc426 2822be6b d7fadc38
+    6188119c
+h = a36fd158 76cc703a
+
+k = bf2febdb 5aa6687e fc335dc7 77f2d03e
+m = 3043b5a5 ff252a49 43bb8259 f85dffe8 4d429252 4831ef2e 787022e1 a0ac17b8
+    70151a2e a39297cf 66b940b6 df559ca8 b111c80b 7d2d3b1d 5b701bb7 622210e1
+    23b30121 e2
+h = be3f31d6 4f093b16
+
+k = 73be2fab 11e32c57 d1571b4b 22aa558f
+m = 96e03cf3 b9aa46de b92f83c5 21d3aece 46101cd5 85abef82 09ccd897 a7022e11
+    e38f2ad5 1d365c9f 018ef7e4 404889cf 490c8ced 4efade5c 38a12068 526f6a3a
+    f51b262d c23e
+h = 6d30bcbd b7349272
+
+k = 58923a7b 7640b9cf c0222d55 7a3b0099
+m = 34d3b175 68aacea2 3493d186 2e52de06 217d67eb 62b0be4d 07d223c4 8e543879
+    1ed5bd81 c19f68b4 aaae1978 965c6d0b 4e95aa08 3912fde4 5501b5e0 8fa027ea
+    4f760978 f3599a
+h = 55d02dbd 4625b346
+
+k = 0b3ed5b4 3829cc04 267011d2 22b01d5a
+m = 43ad56e9 6333d9c6 3b3c2636 a6102f0c a95b3f19 91237440 e7ccc486 d7420328
+    3f49ed49 a12cfc24 bcfb977f bfd06aba 85f56bd3 bb7d3ac2 f3377e76 dad67fa6
+    b26a4cd2 45058719
+h = 8828d5e2 35a1a612
+
+k = f1893c01 58fb9db4 be0c07c3 f8590680
+m = 8a34e69a 1894bed3 01594a2f 94402401 9019a131 52afdb42 e2c0aff1 d3d5d367
+    8363a388 942e43d9 e05ec656 6a93a47b 162a8777 5e19280f 1d061cb4 c788774b
+    63e9ec39 1f002ad3 82
+h = b32a12e5 21b13f55
+
+k = 2baa4cdd 1e97c97d 0fed6749 adf1991f
+m = 4418d19a eabfa174 a3ae5a7b aad12e4c 670fae72 4eab122f 988723ae a84c4a78
+    a2d31511 e578630e 1e845fda f64d4750 8bf3edd1 0ab3fa29 3bca6333 c14db746
+    8c84a338 b35916bd b862
+h = d2b55ca5 e9955930
+
+k = bd497c04 8e1af59e d9035e87 0154b6d1
+m = 476f239c 70fdc29e 598bf82f 50335d80 7b1d7813 8607d074 7f6bc44b d99eaaa8
+    3e38a510 b8a405bf cf94f3c8 f4dad5ee 5919b70f 48d8ed6a c2784ca7 33d1f602
+    5341411a d5968ee5 6e9692
+h = ff5159ac cfa70ceb
+
+k = 40330c18 8f0e541c b68c729c aaf0e6a6
+m = 55aeab89 a160f0db cca4c97b bd6c4b82 e123e823 c0d99cb1 53e4e71f cbe734f3
+    808bc73e 823eaa5f 1a2f0a7d 3b390fb2 a40edde5 e413b557 a095ae97 c5ff20b5
+    fe830f27 66db1736 b7f44257
+h = 0e3869c8 3d9d70b0
+
+k = 4c0767bf d209fa63 5ca51fa7 f2e92129
+m = 25bf465a c21969f2 d4efbc89 bd65a108 ceba298d f9e199b6 6d09dd97 34655629
+    a8c2eae9 85c7b631 e4bd462d 8045000e 2cba0da1 3962c6b4 14fe78c1 b6bccd78
+    460eb1a5 992764b0 494de66f a0
+h = 48caaf81 d84e8e9c
+
+k = 9addbd86 cb98ac41 6aa3e2a5 4aefba65
+m = a97f9c3a 991baf39 1f82c112 cc8c39e7 50aff05f 90387cba a62c70be b5c3f74a
+    56731751 7ee3bfff 33c4a8dc a22a2765 4387554b a08e4a6a 6b28a2c2 c785a5a7
+    2736d44e 0f3112a5 c53141c9 83c3
+h = 10eece5b f468d3bd
+
+k = 94ff4d47 4ddaa8a0 d39a5a5c cb5af10a
+m = 107e0dc1 4876bf7a fe27ad2b d78c1143 aef187d3 f9e14ef8 4ae8694f 4d140296
+    87bd39f9 b8901b0d 481ffa6e 47296a11 024d3278 e9b4dd40 6e4724a0 5bca326f
+    c5258e60 c203722c 7d2fcbea 38092b
+h = 74567965 904ef58c
+
+k = dafb9f99 14cd3618 41f3e0b6 7a78a2bf
+m = a5bea9a5 54648f73 c5ab8f82 f941c0f8 03269f84 26f386c6 ff388ad9 2341e339
+    74c74db0 a515e13b a6709489 ace70d79 66f2cc20 375159e3 c0c52f7f 421aa08e
+    5323b29e 7655ca14 eb516929 bd5f9bac
+h = 78d93f39 d398027b
+
+k = d9285d45 efc0728a 449779fc 7d6b2f18
+m = 525b7dc9 ba26c164 717357d5 b14ecfad 7668dfc4 7ffbc9b3 e2dfdc5b 0da805d3
+    9b975455 f025fd96 63c7a5cb 0eeb9898 7249fe3b 883e9457 66d6748c fea79ed4
+    f7f6c96b 1e9fd286 20c872c9 6d32e131 94
+h = d8f38812 c53d7851
+
+k = 1af8bbf9 f0da14b0 911863e0 078a65fd
+m = b19fd8f8 029b92bb 4b9100e0 7fe09236 469112e1 43338375 afb77aa2 c84be296
+    570b31bc 13efe60c 06f5b56f 7f3f1c0b b063bc94 cc127cfe 54549141 359d04e7
+    0af4c120 ddb38006 80ed3599 0369b20f a572
+h = fd5d1de3 00e935ed
+
+k = 33739afe 70a035b7 318bd23d edb4138a
+m = f4a3d8f5 c0cdc724 58bcaf86 90e7ef01 0bb41a9b 8a249f78 eca69f13 2d7466d7
+    58525c33 46dc1676 83362e67 36606995 13314692 4a63d9dc 2178da96 2a18a244
+    f876f60d 267c989c aa14fc4d d7fbb91b 2b1b64
+h = ec5a0965 417fd1ee
+
+k = 9134945b 5233ee0f 5caaff39 34405150
+m = 46379804 e46244da b0be0eff bf06c748 6db0ede9 7c44c99a ecb0634a bb2e40ff
+    8a624fc6 9e68fe48 926b2682 7dd56a29 2d8df82d a87da387 c872c202 e2db9870
+    d80dbdd3 3e2e3208 4ede4b53 2b9c3e0f 2d8a5b94
+h = 5a1d8f3f 27133fad
+
+k = ed839635 5d608122 e429925c ec35a6d2
+m = 2346b795 86429755 3ca47099 5dd439f4 5ceb445f 67619ffe 95587669 531c9462
+    3592b43e fdd90246 19a07101 a2c81571 a03b19af 47961642 198ff2a7 e2e6e5e6
+    617ef5b0 c490fc95 b26ab7c9 ede0052d 6360cf1e ed
+h = baa7d44e c129bcd5
+
+k = c3fb6f51 ad55228c 2c8be8c7 4c5a4cd4
+m = 4d2f76b4 9a81965c 792addba 8d340991 ec8a7b2d 24684e34 00df4f6e 5ab9fcf0
+    847c7b55 1c72ac90 61049832 db621d75 fe0d9039 920de5c1 28a2279d 3b2a7b0e
+    2c159eba 84432a3c 31fb717f f9dd666a 38b1529f 7643
+h = e5468e19 55702c6e
+
+k = 0706a930 22839f44 5257bfaa c276b460
+m = 546b6a1c d475f4ba 845bb0b0 0fe168a3 661e23fc f4241445 8b595170 2f669b0e
+    de981ece 473979a0 c37b82fd 62565278 7ccaa2cd e2054d58 e213813e f57cd236
+    f4db1255 4253abbc b6739216 90ba1b6a 2eba1cbe 4f91c6
+h = b431aa33 3e28ea31
+
+k = 6a78cad2 18272a4e 7746c035 5c5a520b
+m = cb8a13fd e6e3806c 38088859 d23310d1 a33b3e39 b3fe1ea2 f3a0b711 dbaf774d
+    659c1a75 e1a21c10 fb8709a2 76dde64c 6657f3f3 29e0490a f85001d9 86dd9e23
+    2a4bd6f5 8667e372 3e41c6d3 960a7563 c54d98e1 2ad68185
+h = e159725b 0db654cc
+
+k = bdc9bdf2 ce4f1ca8 09978dac f2d1db56
+m = d03ddcca f5e7bc3a eab8631b 0382c304 e81ce8e5 d80d663e 0652c86b 427665d5
+    694e38c4 59adec0f d43f8924 6c8a720c 6c6ef40f 3927f27d bbe36e33 b3883b63
+    c88b0c36 2361fb4e 83faf3f9 17f03a85 a76d7a51 72d4f528 9d
+h = c56370d1 4c1edd80
+
+k = 9f9ab7b6 04631bec 1ef81db6 47532cad
+m = 5d9ad407 0bd5a528 206d5869 b5a8d9b5 94a31bcf 14e5d593 f04592b0 0c8f3722
+    a1a8037c 0de06881 790f0098 0e529873 bb917614 34664f4f 471df1ab 8bedafd4
+    2d878ded 2b342075 42d952c0 1f88bbb6 1d586ee3 9733aeb7 4199
+h = 0240cfae 314e7d05
+
+k = 00246b53 6c6df195 d89bb79c a6efc47c
+m = 4334409f 5ab82a4c db498d5b 95a8194c 4d09c466 cd16f613 e60a7eb3 e57dec4b
+    cfcdc925 586b1c38 431b5979 5732ac12 b48550d1 d3abdfe1 0ed71cdc 566c8954
+    8350595f b91bd5df 1b944458 57595fcb d46c7ffc d31437fe 5f2c62
+h = 76d05199 04ed20a0
+
+k = a59d841d c3e57937 39804f83 7f4d6efe
+m = 02059822 3dea73ac fd6a6771 42a2aad5 32cf1efb 2170efe4 92d521d1 3a461760
+    0e7ad5c6 44b479cd 30348e10 ffaba95a b923ff3e 065e8974 ae42f8b9 36f06a93
+    2f8d1ffc 3ce06cca d288d3e2 c588afd6 24025e12 69d2b01c f5669bb0
+h = 8410693c 573162da
+
+k = 74c75a61 7b74fb12 5cb9bbc0 3d4a8237
+m = 4703fa85 44ac9eaa e53352ad e4682aae f268aff4 3a6a2832 3f96c699 c9301519
+    b1ae3ea8 3a8e53a5 58dd1a7a bf2985f7 81704cdf 3625df9a 7db8388b 3df98701
+    acd934b7 4b076f1e 80fba14a b80cff41 4b8a5cab 1411a06d 0d64d3d3 6a
+h = 73b13044 88f11837
+
+k = 107f92f4 ff678338 2f69e1d4 55176fdb
+m = 1345646f a5a5b834 55ba8f38 599576cf 913a8e9f 44be62c9 0409092e 6f054a4b
+    980ec1bb f6216906 086dc042 0877b0f2 c1557b93 19600d55 06329ed8 6404d5e0
+    4cd0f367 5ee521f8 b0aef3fc 1093afc4 ccf82cc2 f1bba0ab 725d56b3 b6f7
+h = 78220c2f ed41a8c7
+
+k = 784ae7e4 9d71bbb5 9034cbbf a81cd240
+m = 9c804371 3db41de1 a341edad f30fc30d c06126ca 6a92ac92 a6fcb5be 1cd34b0f
+    7d8767b5 170c210e 03fd769a d87457a0 01f7dd3a 8688358e 822ae2fc 4dc7dda8
+    8ce8dae9 cefbf681 980fb2d4 377cbc2d b1155ef4 587e6937 f26ef62f aface9
+h = a0fb8e8a 26864e64
+
+k = 49084619 458bbf64 837459fd b50e4612
+m = f50d3f4e ea5b2fab 6bfe08e9 e0a103cc 17e9f611 1f65d55c 7f6eac74 aed32524
+    c8c8b5d4 7332d18b 1b213c63 3b3bf6a4 0f88942f 4f8cd2b8 c275678f c74ada79
+    61a19c1d 948adfff d778238d bce694d5 db8f9179 edb27934 add23307 c57d7464
+h = 9619e9c9 6bd92cdb
+
+k = ba90b333 aee00567 88c57583 7ee3719d
+m = cdf41f71 3dd261cb fceb5c7f 4b823318 18eee445 509f194c d7768911 f2cd015d
+    b9a3d628 b2edd3da 72093069 80cf2776 6ac6a6bd 3f7f9bbf 1054c719 ba368c25
+    86d44e37 010e2c55 949af766 477db16a 26d7dbaa 880c1547 17840408 460e3055
+    15
+h = 2b22da6b e5f145ac
+
+k = 9e472571 7e5a464f 4ac2eaa5 57f82992
+m = 55d0fdfb 98b034d4 d1cb99b7 0b86da64 8e968e38 dd34b448 2e14dbe2 6cdae6ab
+    4d3e9307 94a6b01a d7687f81 0f9b64ae 9cc7c6e0 8410ac6a 2fabb6d7 aa826c3c
+    0238ab1b a3f682b0 5a890cbf 1a429d67 05c83e91 8ff1f9e7 e670f283 c683fbc9
+    e43e
+h = 04055684 ff863364
+
+k = 2101252d d362b70c fa069b3f fe2c4546
+m = fb9a8f7f 1c5a3647 b94fc134 9473823e 932a537c 49391a20 a019586e 52f33ebb
+    ae37b208 d9f3ccb9 2dc87fca 12cb1195 240c30fe 5c35e04a a98962ff 766d3af1
+    9b6b8320 b24910d9 26acde40 97293f28 b435f8c3 0debde66 63acd2db 35a86b5b
+    54dc03
+h = 68224395 f0302284
+
+k = 58e76688 128a3d92 70f84ed7 c5eb3666
+m = 9f239d35 d818eca8 9d74b78e d501ae96 cededd31 f9291e4e 8f49f175 9fb63911
+    38074dce 537391ef c03cbe63 e0697cd2 1048d142 351a725a 9cd58bfd 68ab86bf
+    a449b83f 3426b22c 83e874a2 871e0e29 57d4d831 9a891ebc d389383c c8476307
+    42fbb28a
+h = fc45640e b389eb9e
+
+k = 165e90bd e72d08ff 7dd1706e ce6e01d1
+m = 046eb109 661140f4 a6051838 2092c0d3 b39d6445 6c2807a4 96627d71 3b02a94f
+    491440e1 db3e34a0 54f6f05e 5cecb7ca 137b4ce0 cc956b7c 2706d5fc bcec8f39
+    ef469995 7dbb81c1 9b3e3676 0c9f85a5 7c3f0e07 12fad6b4 d9bb5b98 32b5b5aa
+    5d51d4e1 c9
+h = fc4445e9 d07c105c
+
+k = 8549aecf 06af11b0 2a4f16cc 0850d8b3
+m = d6acd626 7aed35b0 893156cb b107494b 000a3fa6 26604651 419e255d 6dd4f8b6
+    40e4fe7b 298b7e22 e3f92af5 6100992d f9683e07 c40314ef 017a6fee 9e464b37
+    e4766f52 1aad8389 dd5ea6d4 5fdf654a 9825cb62 d0b7dd42 b9f41841 6612a931
+    3122ee6a 27c4
+h = 169b8505 4889be3b
+
+k = 59db7b34 aff81909 6c2eadd2 366d1212
+m = d6da5624 dfbf3066 73fbbdb8 6d681bec f79bbce9 51415a82 2686d7e6 d1e32f38
+    5c83011e f310b3d5 53933a75 38de1cea 73264436 eeecc073 7fba1539 ce44b6db
+    1d7a623e e81ac235 a13d523c 426ba591 b953913c a1b9ea36 1cee9e8c 104bea41
+    52c2e848 17c0ee
+h = d4e55602 d8cc645f
+
+k = ad2b201d a663daa3 20bd9b62 8604a650
+m = 72ae2495 c52d4177 87a09edb 176b0f8f 5827e85d d61b85cf 4deea2eb c74b1d28
+    7a0714c2 d8c480e0 2c216ec7 6d805fef da7f7466 36ba6e61 ae20107c 5403aa0d
+    4e83c9d5 35cd1aa2 77cc8825 f8298c97 c6037fe4 53ff9df3 aa8723af 2a19a6f0
+    5742f462 08511fd8
+h = 1dfa192a e83f5e11
+
+k = cd0e4d31 1d08e59d f5717777 de568191
+m = 45dab248 8f069151 766ef482 53b49f35 9cdc7c52 1c5c22c8 46785cae c6840a13
+    884d1553 ccced606 862f2914 5a0c2f75 710e9937 eb625f6e 7621e347 d401962a
+    4b913869 63f9cb3a dde712df 4c13b564 c8595309 dc144fdc 645a6bb2 fa3fefd8
+    f80c6b95 41e65dc5 af
+h = 659cf0ad 4a033bf2
+
+k = 47beea4f eb48fa43 66ec607c 7e7f4f3d
+m = a3651143 98409c54 f91b104a 75cbe5d9 71b8adf9 8e6b742f 68a66d97 a9c8e4ef
+    ee252443 4dbceeee 8811d938 d8517c75 60b6a642 d5a52431 7285362c 6f78e692
+    6ae5e9e4 0054a737 9a2c8574 06198021 d1e86be7 26db2900 718b8534 53569022
+    b47faa9c 2742edbe 21f8
+h = e9dc729f 64f36d1a
+
+k = 981dfe7c 8e65b955 59b2a9c5 1178f5b1
+m = 589306a9 c5562c1a b5f06b42 511d8a6f 3c5ec62e 96af3db8 b530ee29 450b310d
+    b1e29063 1b5e6ab8 2ff3bc19 aa910e3e 018daf90 da45bb95 8e70a622 dd8334b5
+    bc35c308 94fccfa9 bae84efa 62a17f00 1b863606 68c6a756 58ebc4ba da333674
+    61b26474 dadb0ede f25efb
+h = 930dd905 63011435
+
+k = 1f03296c f9bcd5b4 8d9b4314 7120f559
+m = bd7f37cc f4b60625 e84d8338 feb35c13 fc35b008 38dac2ad eba868f8 d7ee9d10
+    feaac722 ba89b2fc a5a7f997 3b57401f d9aa521f 4a6975ec 820d34f1 0589d2a2
+    221c66fc 3cbacd7e 50c256e4 7a1eb477 cf1daed1 a00ddd14 b6954d8d 273c7211
+    29532acd 39463d6a b071a564
+h = 977b4b50 155b0e75
+
+k = 93962211 2e623558 7e426eb2 343dec58
+m = f0d1b159 d7172699 49482cc9 865b16f0 ee3a5497 de516bbe e8437f4c 1b6b59c9
+    5f9a3b18 0258b8ef 72c78fda 1221fce9 937dfb1d b7baad33 0325086a 17066edc
+    84aebb29 79b48278 1d9f178b a5c2f5cf f3ff0d27 c29cee39 7416780d 59727524
+    fc9a666c 72a49b0c 3a72ee06 2f
+h = 99eda6b5 66241f03
+
+k = bbd00a1d 51feb79c a0725e92 9dfba64f
+m = d29a5f96 857cc44e 8f165b16 97fe4589 565339aa 929253e0 341619fa fc65af88
+    10e1b4e9 06a56c43 34240f68 8ac638d2 106ef548 30e514d0 181fff60 4074dab5
+    4a695fb6 9737b618 ba95c8b8 85dce2b9 1216126c 5aef0269 fc841b0f 86f31fb2
+    5fa9e547 3d25619a 413008b0 a206
+h = eeda2f80 31ad35eb
+
+k = 93267b1b dd7f7433 f95cf40a 2972b9fb
+m = eaa3a983 3acb2f11 4a3332c6 f385c152 c1638528 ec709eb1 930e2ce9 b6ddec75
+    23ebdbf9 0a6c897b ff923310 d1e33b1e cf636746 03bd7832 29629d92 6547281a
+    278edf8e 3be868d4 7121accc 6951f746 c04edc2b 4380325a 9ec9d3e8 f2d414a5
+    2140fc2b 286572b1 869ba631 ac5c6b
+h = 720f5a3a 93c09a81
+
+k = 099ee10f 9e90193c 26d0b4e3 2b094320
+m = ed01b3a0 edec2f03 efd52a5a 2f9786f9 54ef5a06 cee3b8ea cc438af4 f0088975
+    8f9110d3 cab15d19 66af913b 93aa3258 400b273e c7dfbdcf 3542e643 53120abf
+    785d63b2 1a1e4e7c 52c47e57 29c81cc3 8bb8199a deebaa56 bb4ad5f1 6f4a9e6e
+    abfe18ce 31631468 010cc29a e1e04acf
+h = cee4c7fe aad9b062
+
+k = bd481dc4 46da7253 dddd3dea 9ddb93e7
+m = ffd2b18c e6832fb5 ae703979 67bc4d2a 56cb50f4 75322dc7 2a7b5bf0 f3587a16
+    7a76df18 cc02c2c3 96878c60 2d8a7bf3 7d87b269 282641ae 8ae39003 e57798fe
+    19df7f0a 1a6d9668 016570e2 effcb17b 8f8aea8c 7228d62a 2516cf70 87d2c1ad
+    7f568981 e1252c12 d7362d7f cfda012f e0
+h = cb65b08d 8a20625a
+
+k = 4524b15e bc55073b 623d598e f9f35f14
+m = 888c7930 547ef40a dc601654 fa222735 b57edcbb a8f8facf 871a29fe 7fadfc52
+    b3d9b9fe 4fb76d20 f656cc1b c7c41fd3 2133e361 4da9813a ad34096a cc22cf91
+    a73a1d5b 27824948 f03a7170 97d67eb2 92d4af02 c9148d78 e890bf7f 5346f410
+    1b8c4813 3b687228 09ae9f65 de872f8e a145
+h = 699b9b6a cbf3fa36
+
+k = 555373f0 9c2570df 3c774646 f71f3be8
+m = dc5dab4d bac05c73 fede25ca ac9364b1 794c4a45 6b187664 4b16aca1 84d4edc8
+    37856fa1 2b439df7 0199cd92 983fca6e edef1610 9007932e d41f280d 0b488c50
+    bdcc5588 60199f1c a411d898 013552a3 0c395cdb a72ba5a5 5210b93c efc725e4
+    fbc5638e ae58eba7 02274d2b 62ed7ef6 21a53b
+h = 66219ca3 12141cf4
+
+k = ee250d77 1507a237 7d0dde91 9ead5d79
+m = d6234497 e90db537 8a2b3626 c2c310c3 cf4217e6 f45da846 1f26b12e 8dc6c385
+    77b4b3f6 578af550 a9ed67a7 5b9f9846 38325e87 b37df698 dd001beb a4fc8104
+    2d9fb431 11bedbc6 b992d58f 3474ed35 9017a1e2 d094ab1f cf785a1e 8db0a60e
+    6cccdb6c 779c494a 3f2cc17c f90560b4 cbaa345a
+h = 9325fbe3 4572a1e7
+
+k = c27fabd8 d4cdc0db 63d762af a512f463
+m = 21d46af7 7cfb999e 786e8ec7 e9a6e47e a1460a6e 2654ff5a 4053c9a0 2ceb89fb
+    2404e79d 95c6f56d 34cab7b8 acb44d2c 1b9956c9 ea77b36b 5e63f817 1007750d
+    a7cf3f48 09336787 fec17d9d 327f992b 3d0529c6 87261131 1c12cc24 5c334e7a
+    8b4b32ce 5420a9d2 4e844a4d e08d9187 25ff6344 73
+h = 26c5c964 7711b722
+
+k = 6ea6b587 8ab03c0e ee48f0c0 1e8d7c4c
+m = e803c72e 2867fb54 8c38c9dd 150364ef 696ab29c 095c2251 2b7814d6 2ea088b6
+    6d60d4ef b2abba6f 90de20f9 85051140 636d0201 ea1bf3cc 6adf6dae 4820fdb6
+    c1aa8f9d b09b1a37 0d55872d 125a8927 2d5a3194 5fab4c29 a7f4d25d 14f32e3a
+    a9262c14 69071e75 66a66e3f 7a2a9347 0172591b 6bab
+h = f26f16c7 ced9eeb4
+
+k = a43f87f0 9b62ab71 7ce94041 de327445
+m = 10122929 4e42ee3d 5d5a57ee 856ef27f 12eaf49d cc1337fa 89616740 0e155e04
+    6f06dbdc 33fee153 59dedd3c 266310f6 dcb4f7e2 3698de0d 9697282f 7b884dab
+    fb939262 8479efa0 0c266f33 59984ee6 395f9af0 682b3b53 5a013ab0 03d20df6
+    7d344e81 732cf3b0 8c1e1753 edae21e0 05010fef 820d08
+h = 31f060a4 dc538967
+
+k = 5a9b6f4e 6176f645 67c1f5dd 375df0b9
+m = d889cc19 518b568e d63a9af1 58e39748 48c67af3 da46ad13 3369f293 3553537b
+    6c571c79 e8721b97 e280b27c 7e2f2d0c 60f73c96 43926c56 2e9d5cfd 55e5d2ca
+    e6fd7e05 58009878 4da34c7e ebc2c736 b4b25fdb 26fe825b c9f8308f 02d5eba3
+    5610891d 0ae47dbb 07a8d8c6 c3625a12 49c544b9 f32cd824
+h = a5ba24a3 792db8be
+
+k = 4cf7ab9c c8274f17 4068bb84 ab21516e
+m = f1486b92 910df434 c7bdb39d a4bb954d 091267bf a864de7c 7dbfacf2 3659f031
+    36a9a022 fbee6858 ddb18f26 c9e0a1c6 ec393927 209b4b8c 799b3fe7 db9cafa7
+    c002886d 9fcaebf7 41344b67 b8852a45 5b04978c c3921ed0 17d557b3 7c929dc2
+    b406fe15 47eec6b4 0fd2b90b 0b7b69ca d3a17b97 30f622db a8
+h = c0ad6cdb 7e3baa1e
+
+k = 7e99ecfa aa44894a caaeae1b 61ea9ebf
+m = a2e37a9f e134e858 1cf7a3ab 85874a63 75b1778c 443ee82b b4e15102 7c27ece4
+    10fc4b7e 05546687 cb43b2e0 2393be28 933ebe29 80fecfe2 552a5bf6 428b1bc2
+    8747e4b0 13c1d237 fc8ba213 b933a93e 30c914f9 facb3601 537cb77a 65337d11
+    a6fba65a 015c3d29 a07674dd ff638dcb 5fba14ba bbfd832a 8f8a
+h = 9f1659a8 891b5eb6
+
+k = 2ec509ad 36fd692d d6d18c43 6ad1d92e
+m = 101ae9b7 595f0334 08e2a74b 34f44248 674415e6 e8109428 ff9bcba3 f7b5b539
+    60d45806 3c2bea69 53af2877 4e5c9e65 e3e87d3e 2f0a637f 2fb2b663 f4992740
+    f95ba99e 13285e28 980c8e68 9fefe74d 7fad9ec9 1b57962a 8b17c130 93e93a56
+    1d091667 eddf29c0 a516f586 0323403d c6b67131 048f20d5 b7c36a
+h = 31437f72 b99f0f08
+
+k = 52e63a19 eb7cadc6 091c2b5b 157e36d2
+m = e41491e7 f30e9ce2 8e071873 d350dbdb a8b7b8dd e6b938f8 638c97c5 b9320f6d
+    ced7c0ea 6169b1c2 baf775ba 0128a7ea 8ad2a7f3 608115da 67b36073 23fa9beb
+    9a9a874a 78e27035 e3946850 60267357 9bae69f8 1e9535b8 73944594 aa9277c6
+    5e107f6e 209868d0 9253ff46 55920bf7 974dd9e5 bd8f2828 4b1f8d85
+h = ee52b4b9 1b86f2d7
+
+k = 82c1c226 6452d7a5 53ba2edd 1391d153
+m = da5ff96a deddb63d 3fc8e7a8 e5fce834 8c507f90 b4a75ceb ac24939f 85996ba1
+    af08a29c 1893f64a fd8e172c f54d1240 c6d33793 69d940d5 55c87bf8 a8255586
+    afafb6f5 5d6ebbe5 6292c05b c1d9dfa4 a7e23163 c1e43e17 c93ec300 41021ec3
+    d499489b 3b417038 a9d57913 4522fd1f ef194c80 8677436e ea4808d7 9f
+h = bf0f1990 7a9d39c2
+
+k = 41943486 dca6a31b 03960397 fb773395
+m = 8ef0eefb 8c3b9c37 c5753549 2159bdbe 0360c028 df77efae 3dbf3966 69387864
+    05b41584 46c84c1a ddf3266c a563fcfc 81c9352c 96a2fdc0 f823ba0f 28266898
+    d240c764 a229a4d0 e1797f75 59684488 406d0644 e39bf36b d7d9a9e5 5aeb7e3a
+    35152b30 ca4fd92d 43d9a3f5 ab0f3490 6f5e4704 617b1db5 6a35c0e3 df73
+h = 2591922b a7b51f8a
+
+k = 2d8fab1f cf8b5a2b 473d663f f7b7c89d
+m = 90890545 e87ca58c 3f57fb9b 3523ec12 767af1fa 6e26578f 17d7827c 58d697ab
+    f4af6a53 19a31e21 76d16378 f14e18ce 11538492 0f30dc0c 16b1ee50 8f7b9ee2
+    80112d7a eae21cef 6eed45cb dc50888c d314980e 446cf8b0 d5868dae bec0ff4f
+    9ee1e188 fe7104c2 51ff019e 4f9518c8 e0fac594 c7800df6 a9d62400 080ad9
+h = 47df09f7 265a652d
+
+k = 6b1dde0f c5f24f27 a844a934 68734d5b
+m = e4f82d40 4c57dcd1 31bc8245 7b9c6fa2 99cfeb8b 4d77ddcf 86a793c1 858482b4
+    27c9905f fe83ab3d adaf92bd 7ddf771b 83c7ee1f 1eaf5a93 82bcac0b 7742ba0a
+    0f086dc8 1395fdbc 22e25e8d 5ea82088 a757a460 8e4f977c 40c9769b a2f55e50
+    02553d2d c8a52e7f 52572879 c5e315c5 aca27b62 f1f228e3 03f3f248 01810f29
+h = 912c8acd 1b203a7f
+
+k = 0aee3aea 1d8185bf 6aa5edd1 74355cf8
+m = 065af460 321100d9 3229dda4 9889d04a 1ff310bd 4c5411d9 b424976e 5fc3b38e
+    ee899bec 490e637e 6e83eef5 4a677df1 9d269626 6061e11e fca3016f 28c4b689
+    47d3a6c3 edb4f964 1859578e 0e7576ea ef9d0956 ea4dba78 85b63a4c 1f4a667b
+    be2aa10e 3c67259e 974129cb 5c489dec e63b2e10 1f3b60f3 196b73e5 789b5cfb
+    bf
+h = 346057ca 3e4fc764
+
+k = 2952eea6 6fd26724 84bcf898 92dbf78a
+m = cad2da65 cb775431 41f70a45 e1bd6ae3 f259ad55 e944052d e7a494fe 85bd044a
+    41d71246 16a3b3e3 7213751c 1f7f4afd 8dc6617e 269061b1 e2bdafc1 7791fe95
+    1ce8cb1d 9ab1c72c fb7d4543 40045d9f 4c2104bd 38dcc6fa 057748be 11784422
+    5531a2f7 b712b8fd bc74f7f5 4c8626a1 66dde67a f64cb1a5 4455c63a 765fbe55
+    3db9
+h = 7f7bc160 54f2f498
+
+k = 54efff46 500edc7a a5a4870c ab764fd8
+m = cd8a9d6a 6e8aeac9 0bdf13f3 17c92f36 445e0f51 9f85db99 9922817b ada2d2e1
+    e9328f42 c7f95c99 1ed3d8fb ca3ac0f8 d0b53ab0 0486c204 055552d8 e52835ae
+    de1ab7af 313a1368 66cc72af 0c7ce580 9bbee976 5a377976 e49736b7 afc2b626
+    649e4343 9a2366b2 8d2ab44f e1d53134 706519a3 fec71f43 f650b54a c2252ffc
+    116e06
+h = cd82a012 86b55529
+
+k = db9caade 173181c6 188be3ec 48c20eb5
+m = 8eff1089 5cfb918b c5469319 22886de5 eacf8222 6eb865d8 7d5a1f88 185c1915
+    73e4eaa0 a15991e3 0cf9c162 3fbe1c44 31086972 bf3f30b4 ff8be70e e5c413de
+    2ce0b145 e0306c5d a9df920b 09ed3283 1dbc0345 7b5d760e 779e4a00 698dc2dd
+    881685ec b706129d 9a522a88 8f285306 6e2fa09b 63a8f41c 48edad07 5e39e26f
+    1a796466
+h = 4246d837 5cfab82f
+
+k = 8b71ecf6 a87308b3 d3a05163 081b6fe4
+m = 6f3a93a2 f15c1a6d 8feed878 112b22c8 22476e87 12965a9b 0bc05352 05b4dc62
+    77e20472 c71c5997 f293d1bd b803b2ac 8eecd214 16430368 4bf038fe c307b20d
+    6a948307 0861f7c4 df3f685f 33b7a090 19a00807 cb81a081 2b0221a2 9d35b701
+    0e53d567 fcd906ea 0281da8d 9ef83da3 57eeda4f 917e6ebd ac7316e7 a10cfa8a
+    5df9e815 2e
+h = 9c8b6d6e 72df1ce7
+
+k = 6878b9e1 c6cd4ebc 1fc60ecd e6a7c37e
+m = d4e59320 8aca9c45 42252817 5e9602e4 4bb6d468 2fbb95f4 ea828a41 b1deac11
+    fa84415b 64de58a6 ad98e080 6360f18b 6bb8bd73 f5aa8c31 29fbbf39 5fff710f
+    7018679b fc8c61d0 4c64410d 63959091 28014149 b0aab4d7 8800d69d 3a69c74e
+    324de249 b1e7ea90 65730c2b a482c462 48778f24 526ea283 bce60f4b c3e99dae
+    4b3ac014 c9c3
+h = 333c616f 49c59f5a
+
+k = 1b997c2e ff5f8f8e 384af5b3 d409dba3
+m = cf0a393b 7b8eaec5 b3256b46 da32f4fd ad3b5f37 c8591472 33d233e2 4bc39148
+    928a41be 4efe76a5 9b0c73eb 06337823 ba38a868 162c80d6 fd125947 3ae53222
+    e86816b0 c001357f bbd67a57 9c1df7ac 224e394b 2f0b0d27 b58880fb 160c2ffd
+    9d4aed25 0528238a b5f91d9a a945a049 14c2061a 6f0adccd 655735dc e1546f03
+    87db473e ff02c1
+h = 3b63da97 0c05c5bf
+
+k = 65c06277 2f38c1f7 83f87080 987149eb
+m = 0de5e289 7f760e55 8cc269b9 552c1edf d929064b 23eda54d c072e6d6 38bd411c
+    b3d0c8e8 7850bbe7 dba44bbb 23622cb6 92723ab5 2d5ec034 05578670 943e8c70
+    d6fa4ee6 280dde69 b34895b0 9cfb3070 1954791d b43c5246 02d6607f 6978a785
+    49e03121 a4eeb437 fd4dc15d ab391fe3 a5f75e31 d682f703 46423309 376a96c3
+    55338c96 3b3c60e6
+h = 6316283d 69ca98b9
+
+k = 1c62631a 577d5dab c083534d 661c139a
+m = 6eda0888 11008ef8 d78b2b77 eb2eab11 e3b557d1 e55a0b46 534885f6 6ddc17e8
+    95d4cf69 b6f94be7 a9a982fa 64fb89d8 31496cbb b38d0bfc 130a5af2 7a04e925
+    dc81674f 42a7ce2c 5a78082e 4941d9fe eae2930b e545ddaf 13950113 459cc540
+    7bdcba7f 50f044e4 8e1aec7e 0034de6d 7e2b5187 a9136547 3d03e190 8f2f8391
+    c7604162 f713f8b3 f1
+h = 30d67c8c 8f43307c
+
+k = 3ca9d417 22df6085 8ad48a0e d62a8a60
+m = d4739d7c 902064bd 59c843c9 18f9be52 3880c233 754d543b fc38edaa f7610002
+    1fe1583c 776209e5 612f8f7f a697eb0b 7fb6a81e 4509806a a7887e08 cb47a9e5
+    9565d551 05243c01 6f6ed30c cd50d133 23b6c494 9641f01c e52bca47 c2436ce3
+    9ddb19b6 a3afa3dc 37f15b76 4f61bd1a f5d3c269 dd821ec3 84197929 d34abc65
+    bf4e411f 3646f0a7 046c
+h = e3ae43a4 57677e24
+
+k = 24b76257 a797fece 205fe646 1760f27a
+m = b2a3e71f 0568cae0 e22e2a0d 3e7ae875 3ff3b171 700835e4 489fe606 a5804442
+    13399590 0102c925 b3aca5b7 0b56c68c 07362c76 ca3f8c9a b58f2731 d16999fb
+    872b73fe 001a257a 2f6ffa3c f8f01076 55d60ae5 434dacb7 ffec6dda 7518516c
+    1ab1c9a9 7cf17b55 fcc7c57e a9e92e9b c4506c2f 6006a830 d8aefb97 251d64a5
+    c6c1aa87 6d2d0dac d0f7d3
+h = 6566dc63 1ea353e7
+
+k = 3c489039 ccb0d33a c3855c68 f3a22a33
+m = 42d0321e 6cbb3292 877efe29 a2480740 45e9ce4d e1432054 292364d1 0ecca9ad
+    9c3b052c 5506f927 f1363625 782bfb63 339a6456 adbb002d 478920b3 30bf9d77
+    979c73d8 dbef0afc 7875a354 761f2c8b 1b7c7918 13038ebe d39a3352 b3137e82
+    9668cb82 0cab4bb2 13ad6eaa af5687c9 b61a5463 bd8b1d7c 6a741907 24059214
+    ce0436ee 32809c5a b9dcb214
+h = c0a88790 e34f291e
+
+k = 3f7e3b1b 7491b509 4711e1a2 0314b837
+m = 845e04d2 8fc97310 b2a68652 ba5f7b7e 7fb9f241 5ef3af05 9f346720 f988645b
+    1153f37f 6142816f 98516e9c 29914e99 0afde986 13a46db6 213ff6e3 12037880
+    a88c003f 1dff12b4 ff2bf547 7b0a4bc2 963570b9 5bcdd861 687915f3 bd53b519
+    d7f2b467 a240c903 55d441f0 a897f10e 75091d1c 9576be2c cea1b208 a4b527a7
+    cb711059 8f0db388 264d9335 b1
+h = 9ba63a60 c7cfc70f
+
+k = 640a58d6 5d0d8893 15b2c93c 4d4584a9
+m = 82a77180 908b4df8 4e44406e 7f65bc26 6704f438 22f3942d 92076bb0 03c244e7
+    08d599fe 1560f999 505fa249 45b350a8 b024f170 1134bd43 8a07993d 3bb64279
+    8de23288 566b2b2f 936212c8 24b0445c ec9fa01e db968703 38a66570 e480663f
+    42b2471a 8c2121da bf82c1ce 6c7b6e3b b3cdd55c 0a06da13 fb78a923 6cb11392
+    b7d2c699 001424d2 f8083ded 9db9
+h = 5bdb25ca bdd32ca5
+
+k = d2801c24 8096e9fa 3c19262c 4859296d
+m = 78c3741f 374fe842 d2f03596 c89e347d f8f4952d 2ce5ad49 b4d67a1e 9bf50d08
+    9fa441dd 82bd2b80 4c7f901c 9b880cd1 6e6cb169 e7934194 1d2a8448 70fc5dff
+    ee29d8cc b3fe0e2f e2ae3b13 965c2a08 a16f2890 163a12e5 dc726eba 4010212d
+    181cfa68 a118f59e e531c061 2fd6a25f 9de9d4b3 ed542bfd 89251a2d 646f970d
+    211dae38 deacd92b e008cbbf 270059
+h = 79c2393e fa198c5a
+
+k = 0d16e2be b5e3d5da a5fb41cf 0c6373a3
+m = fbe9528e 981fd9c2 ca327c84 7950ae06 845f09ae e85ab005 eef704a9 414945c2
+    1b5c7d99 ead89ba0 6b7884c9 a692eeba f21ce123 7aad106d 38f2b53d 10d98e38
+    0a739361 59f9e2e1 cf6735b3 5d060ade 0c4ce068 aaa04f83 bf6d9774 094670ed
+    6a2510ea aaacc82e 306f70ba 33aac3d6 cd04332a 4ea1b2b2 24680123 72586d2c
+    bdaea57c 8e4d0a58 d92c5fd3 80edbf34
+h = b0bd0df1 8f7c069b
+
+k = 5f73c5fc df7ce24a af83ca16 014f9e99
+m = 0fb46e34 cd58dcd6 87740188 7dfd70de 2cba7af1 570225db 432befb3 739837e8
+    8a8bac38 18f18826 cde1ece4 cf6af104 92c94e3f dc3660b2 c62b1234 3cc6adc8
+    69d119fb 423fdd2d 995eaa91 64b1347e 209ed6da a108688d fa380da0 c885c65a
+    ddbfaa13 0c09ee6a 018753a1 480e7c26 b41d9150 e0c88bd5 1d0365c9 f44dbe70
+    095c761d 985bdadb 06f96fef 8b38a0cf a2
+h = c265a8dd 1f4b0271
+
+k = 4444e9b1 048b14d7 c32e8624 d12c6761
+m = 54a5bc7b 3ebfd2fd 7b995b8d c061124a 69dad999 63ee4e94 0f408afb adf15d1d
+    3f6d1f16 cdecd51e 32872be5 6f529a16 5aedaf7b e49c8452 370eda42 90d48f69
+    6b0fa936 2d48a194 11787bf8 8615c2fe f013f44e 2197a58f 1799c05b 14bae084
+    62f0d30a 0b44de80 0df868d1 0a668716 0d10f463 52e68648 ac8b988f 6df76109
+    0dd770c2 526ed835 98c1717e 1bc23aca f69d
+h = 566e0773 508552e4
+
+k = 47280c9f 05eba5f4 dab4bbbc 5fc1a3f4
+m = e4026b1a fff3410c c81f241b 285a0cd2 69434841 4c866cf5 c36dde5b bdb16f00
+    c08b9e13 3b4c743a 9f8f1d1f 0fedc51b fc541f25 83c122ab 94a0178c 3dbae1a3
+    46826250 4915d123 6b1ae44a 80d95e76 f2d352e4 da609946 27688401 d766ee75
+    10a32594 7660e0b8 42c43c6e 816c9f90 97da614d 486006dd 9faefff5 28c2dcf9
+    1e5cd510 c3b084e4 3a40f6b7 5e475bf9 188c00
+h = e60888ed c6cc2f99
+
+k = 942d66dc 9103b5ed 30d89946 d990fb9a
+m = d879e2ea 3a374247 d57dfab9 f45cb9c4 76ce3726 70f3c953 0b7e1c05 ffbd4cbc
+    f62d9dd6 6ba2ae02 c19f899f 96a25d5b b1ac5bc2 465e085e 6296898a 5e35fec5
+    8d1d3d3e 57711ff0 61238e0d 6aaf9f56 38d20c7e fb5d9631 9e2c4255 5487f027
+    61ecaf39 1a3d1642 b34c3e71 727caadc 87c95260 bf5165a1 1682ac09 6774b0be
+    90c17073 86a59545 0481c346 118fb52d c50d2c1f
+h = c19a1558 9cc40dd9
+
+k = 069424b1 42755b32 d9276e99 8ce08a5d
+m = 1182e194 c2b49eaf 40bc9616 810a3b82 bd0536db 444f1bc0 bcfbaefb f6aef8cd
+    d69f6484 eab673b2 90008273 d11b2930 d4cafd3c e9ec9bc8 5181e3c2 acaf1ce7
+    3a0518eb 9c373625 00b2c79d 27db9527 af47cc38 f61086f9 f8a00c7a 301dc8b7
+    fdc671d4 c7c1afc3 23d55619 fd73ea65 8fa8460a 44774115 00221ee5 76b30e74
+    9d3a7b55 47644da8 1f924f8a 8f27d566 82188d4d 52
+h = e5fb06a8 379233cc
+
+k = 6ade3075 1e5eec24 91a4ddd3 cb52fd10
+m = e1bbe454 40f6b8a0 158ba96e d8008b97 91334e4f 7e1d218e 822d1633 f628f486
+    49207c73 d445105c 890e7354 bf0b4dc1 858d4c7c 1a64f106 bd4f979a 5b3aba5d
+    7dcefebf 222ac342 28ce8b19 79b3d407 f7a4c2b9 be55640f ad85a82a f7115123
+    6b92640e 5bdf6797 e49c741e 4fcdf9e4 5921cee9 2980a4d0 5688e813 709b2233
+    d1df7f0b 123826f9 a0df000c 8848dd13 f2e7ae7a 2c1e
+h = a2c92019 13dc7412
+
+k = 54fe206d 5a6fad29 0b1cfda7 55f2753e
+m = bc8e2e63 651a6288 5db82b52 41724680 6881d76f 4e3d9ad8 c1742f8c fc86350a
+    0aef3d34 ffb63e45 97f58522 77b37356 ef1667c3 69befb7a 11aeb2f4 5cd5a7d9
+    275b74da 7fb91585 f8a83ebb 478413bf 484523d8 f98552a9 be8ce9bf 7a843089
+    10138e10 e5443d09 57beb824 5258dd98 c57ed43e c5187ee2 e8bbe0d5 930db8a0
+    ca98131a f9e7e3f3 254dc690 fccb805c c76144c2 0d996f
+h = d7f8f298 08dd38b5
+
+k = 4665d99a e194b9ec efcba2ab 74b6fe66
+m = 8d329cf7 9fdd9bc3 3c78c128 4e02eb84 7cd0a685 08a5dd0d a72457f1 9d434c41
+    daf15a86 cf340160 034959be 67e67691 9957fac5 9638983c 1b796630 0ac155e9
+    2bc9cf23 31f95ef0 20b02253 a22c1e78 66afdac2 6334564a f176a850 41ee7665
+    016524d7 5cb6acaf 4c730b24 1a91fbb1 9ea0fb13 b1d8b569 4fb0f130 6060bf8d
+    e756c93e 19d92c50 0ad262d5 cecb711c 68904097 f9e1c0dc
+h = a2784af0 79d0e29a
+
+k = 949494b0 382a622d 5e96abae ca47aa3e
+m = 416b4b95 7c32b6fd 63d6d38c 8571806e 99328fd5 37fe1475 92726ede 9e2234b5
+    ed0ca707 cab552af 43a6b7b4 87679486 c9eac5e3 2b7e2a4e c4c7d585 c0dce290
+    af4eb80f 1668dcdb 528e8a9d d08557ac 18019d2a f7491c8f 849e24d3 052722fe
+    4ff01ecf adc4b89f 3ddaed28 d4722aa1 2a507586 c7d9bbad c3d0c451 9759e580
+    c963c0a4 d31a85e1 9de0b3d5 51e322cf 9680f503 056b6c91 07
+h = 292cac72 1c421002
+
+k = 8a5f94b5 f45ede70 12ead79a 11915fc7
+m = 367b97f4 29590c55 c6fefe24 9782e5b5 96061f4a 69c1ec58 700d6842 696e3d8b
+    f5a51edb 567afa10 9e12d86a 7dfe0b41 6b43d8e1 b6be1640 657f5764 dcef1221
+    3ba4a54c ad3631d4 cb47f019 6caa8119 2242cf99 54c7c66b 8c1905af a5805bb3
+    5026befa 9803f258 8ee0191f a6fd205e 2e085e2a 6634ea38 4b5ce278 a03a65ab
+    d404b8b1 868d9cba 5980babb b0f740ee ad27a002 e660488f 86f3
+h = 7c9a167b 7965b28b
+
+k = 88325840 19273741 b53d2b42 df1e144c
+m = dbdba38b 689b1298 08a0a07f 16c4947d e149ec61 3a0ce8f5 278cd171 2772abea
+    7d61bc5b 228ba7da a0585491 9699ba94 29f49436 b009a624 20b86afa f17dbeb0
+    1215ad70 66efaf2a e3ca0df1 eea38a0e 83156c82 43b856b7 a4680632 3d5d60ab
+    eaf1c37a 7fe17d89 50ccdb5c 6b1da172 36a6299b 45562f74 78717c9e bb2f279e
+    d8d26917 7cf253b6 c7dd2b9f 7c5c23b0 73696d6e efbf613a a7936c
+h = 1ada6d0c 1f15d072
+
+k = 19877684 5768c3e3 c8a058f6 33c744c0
+m = e2774fd4 f10c9afa 3dd528e7 559e2ed1 49cafc80 99863071 40c4ade4 2e6c14d2
+    39d62135 cf06ae62 e5eb16d0 2f9a83c9 3701bc63 15f7e1bb ec7bddda 26cd1d0e
+    83dbb37c 61b1f7f1 693916ee 9f7ebf06 8f51d071 293a35d5 34c9930d 889c4be0
+    50fb7323 18e89a0c 9ab33e3d 50344ded 2bb5e0f9 7a1cfbca a6642ff3 cee513fd
+    39843a3b 7ea6d292 65ba6f28 80e52bba fb631413 3b7d0eee 7029dc36
+h = a6afc4d7 d46cf504
+
+k = bf747c60 eeadbf80 57e9250b fa40f84a
+m = 99f7bbbf 7467d52f 67b006b3 3f49b93a 12dc7b3b cd651e1a 34166570 42b0b545
+    f797d607 fdfb752f 179b07e3 3916d1e5 add2f1ce 244d6338 fbd26bac ef613627
+    5c2cf292 febb57d4 c2130e69 5ec1e674 8a778de3 b84327c2 673091bf d4e64634
+    832f13cc a36abcf8 34ec8d5f bf777b1c 17f94950 88253e95 efa63ef0 9aea9f18
+    e4488ff3 17fe9378 a4958ec7 31b5914b e4614cd0 1b7eaab3 ad196561 ac
+h = e7523725 1efe9eb2
+
+k = f36bc2a6 6fd1eb69 7408eecb 14022f51
+m = 2d82bb47 6a8fd17c 64937223 fa6d7278 0a62b965 fcfcd19f 04ec9516 83ec886a
+    977b37db 590cd984 38b386f9 07ab26f9 8a64150a 464622da 041be21c 5087e741
+    db1acc12 bde0f875 81847e97 24714c27 46596c8c 1153fde0 665a0eb5 af27d5aa
+    a2fe9ea9 239c076b ac9dcc8f 2f2ded89 cbd1d3ae ac36b82b 434236bb 1d706fdb
+    57eac6f5 e8c3c4b6 7fc431a2 4e3e8260 7b694ed0 faada45a 62c1f210 05af
+h = 7fafcf1d 470fc0e0
+
+k = 08d158f4 ceb66d4e c278c0e3 f5063877
+m = fd301bf6 6217cb6e a72a2a3d f49f7294 735628f9 51a3b363 fdca12ff a396f584
+    b9bb86a5 f04d63cb cfe7a2b0 b6fb5afe f6f2b61e 033234a1 550f885a c6b1b551
+    3e9d0daf a18a1141 64bfe029 c80e3c82 142078c8 b3bad9e9 442f01f2 a56ae0ba
+    4c2620af 6b167879 ce51155d def55d4f 1320e07c 29ff31ce f64253f6 b7cd7cde
+    ef936285 0823794e ec7fa3d5 f7696168 14bc0905 af881081 b4598b9d f53789
+h = fbd8e948 0094311c
+
+k = cd3be32e ef13892c 5d9b484b f19b8bea
+m = 49ab9fb6 c4df0ab1 09af1571 af944b1b 519b02ad f86bf4e7 172eea64 4a18458b
+    3efd0fb5 3465543b b0d0d231 47184612 46cb2a11 c169c646 74fd2f43 1efcf193
+    46881465 87c5351e 5997aba1 288c746a be7eb3b4 2988bea8 2c145819 caa83afa
+    4786ac7e 597e6760 6c128d7d d91131c5 65ec0e9c 6219def3 e3f120a1 0a8e1f12
+    d7253623 a58a351a 12522cc5 5d2eb775 8b83bcad 7ebb198f 6586e513 a3b1b297
+h = a80b8928 e99e5054
+
+k = 6cbf9dc1 eb5eabd6 f3731d20 a6e20daa
+m = c6aa34e0 f7a2020c 2b96eb5d e784fa9e 49229133 ec822f22 79ee2eaf d59cb9ad
+    d5767d73 3aeee726 0f546a6a 2ef975d3 f7ce0bb8 f7433028 fe005a96 5acc833e
+    3d3084fd 3819b094 7e81906a 675d172d aee3de24 865c81ea a8515907 d72ee79e
+    c05125f0 c1108d56 57634c51 9bc0b219 290804e4 1d54291e e11a52d6 38681523
+    ddb282f8 b5102ff9 92f4c8b1 cded9c24 f72f073b a4373a7d 6787911f 9f502178
+    b9
+h = 446408ce 81fd98c9
+
+k = bad72cb9 83edd198 432a3b0d 34ae64ea
+m = f328a5dd d08786f4 be3502ca 0a2a58da d8321f5a 260403bf 4c5831f4 bd29b0f2
+    e51b69b8 207845bf 299e4040 a258e760 b188af03 b03dc96a 536995bf 2a105da8
+    3c9b020f ad3a9e20 49291d4d f232870b a9ff161d 29ddb7bf d52465f8 c676ecf5
+    9cf13d48 a6064ee9 bd836e9b 683c7a8e f327518b 85a0731c 0688c514 7a9bf309
+    96714ab8 deafb1e6 fb730c7e 2a642bd2 60576f11 a8790319 f64e1776 8c39e59a
+    b797
+h = 0122eaa0 f49091b7
+
+k = 0ea6c88e 01dc33c4 4b578674 4abc14d0
+m = ba9eae60 772bdd71 3e84de56 5a4a7dbd c20c9a1b 26e9a545 4a8b54b7 3d683480
+    e5e086d2 3f9099e3 c686757e 603a2fe7 b1380a14 241e02ee 437bbccf 64ab1ba4
+    8a4d4fb7 4abba974 e9243724 f3f146a3 b077ef6f 5a1371a5 7598d242 627c275a
+    84d22a41 6d99fbe0 4f0c00a6 de7f1400 e21d8521 f5d6846d 3d671678 c262d991
+    448bff01 3ae55e34 47f730d4 b33355c4 ad5143e3 beade3c0 a93bd0c5 277a4f23
+    788e36
+h = 0a369035 93eb0090
+
+k = ab4d0dc3 cb7530df 6851b550 6128437d
+m = 01c31a5c 212d5df0 0db25384 58044ce3 502f8ae2 584fac25 170ef306 e8ce4327
+    ddc17370 bede1497 3823d80a 40674d73 e601a003 d243665a 88beec77 b638df45
+    d4a791cb 7f1ab888 5aca4eaa e282cde1 9620ebf4 84635372 232fad4d 5c6ef930
+    c34073bc 71213c64 a1f4fa44 4fbf7977 8b8af957 4abbae94 260c327c 76ef301b
+    e9c054a8 18084186 c350edcb 232cca61 15865c7d c3cf6c42 71ebd5f6 efbc06af
+    eeeb00fd
+h = 662eb25d 9de7e8f7
+
+k = c7b17e13 8e671b2a 13ff215b adc00969
+m = 477bf0f7 3fd81e83 c813b083 fba54291 e62ddd5e db10b400 74ed7744 2f267cfa
+    8e028bfc 0c6199a0 0c02c921 862e84ae 746bd239 31d69358 47edd18c e7b91a9c
+    72de3b58 965c042b 364bdc39 3f740a8b 556828ff 4317d669 45ccbf7b 34b8fcc7
+    57ab79bc 39577b47 ba38f96c 72e88c33 8b91f5b2 106f8d7d 21d4d4f9 2374d64f
+    9e0d90fe f23b0e58 7bfd6ae2 ee4c8e0e cf853725 3f9d8d16 e1f67868 d5f564da
+    391a3f1b 5a
+h = e88fabdc 9043fffd
+
+k = e2461cea 46fe12ff 614214ef 87a32c4e
+m = 61ce1d80 3aae4ddd 35de1036 5948e3f3 bdea9389 144c0704 542f0bba b022c448
+    2bc2fcca 25eb74a2 47b5f7aa 68bcf07e 43c68fcd 1666a22e 762d5018 58f20fbd
+    adffba0c 1b9792ee 13db9ded e6d503e7 263d81f3 a8710756 9a838596 3ecfe689
+    68dbb48a 2d1297bc 94d506a5 335f57ee 219339ad b79d555c dc3a2866 e2f578e3
+    4857d2ad 5280683c 237d0aba aaedc98b be05fabc 09b3d14a d0942277 de7aac1e
+    7d12f8a3 a6b4
+h = a9496c51 6a5a4b8d
+
+k = ca2af7ae 0329e750 b560cb30 69233d23
+m = b7045f42 eb98839e 88cd9c3f 31ce2182 74c96de4 b743d4a2 554a5e06 18c9ae14
+    cf177f9f e87addbc 6f7e1418 6608ad24 dbf9a1ab 10026746 f444cf3f 3e4208eb
+    5e25472d 80b099a1 8a9ea7ef 0f63f3b5 898e9a3c f204f579 9aab13bc f92f1861
+    79b19127 1baa7266 287b2ed2 b79ab564 f488cdcb a5cfa9c5 69bdc961 be396e38
+    3cf26867 d65e1672 6406ffa2 4254c3cc da7e85b8 361d8229 0e0a0d76 21758c86
+    353bfa3b 8e8b6a
+h = eb35c0af 3d8b6e89
+
+k = b41f41a4 13876579 f1f1635d c5293afd
+m = 81508eb5 ac311817 4b84742a 9b960221 76985f90 5ad412e4 d35911cc 17d75497
+    2a84910a dc3d8b2f a773b11d 4427227b 96fe88f1 7cc127cc 34856ff3 806a7402
+    dbe5b7d3 9ff3d410 b73a3edf 6a943365 50c3fd42 ce1b562b b0b47d93 a6755136
+    d850b6be 31e93ac4 8fd9acc7 9539486d 7503c752 0dd93576 27866edf d863a3c3
+    27de78be d66fc2a7 c5e00a46 d9af4049 19b9acdf 5ed51281 9aa72e1b ab576242
+    41b1caa4 828d1ba0
+h = d4169f0a dafe493f
+
+k = 2bb92493 98e856d0 fcc76603 ada3038c
+m = 79fbb757 12a6dc4a ae4db1c5 717c1dbe bb2aa569 436f7e13 6fa92798 6c9edf03
+    85eb6fa4 266a8de6 9d313aa7 eabc70bc 28cb6e20 9d3c077b 952c1837 83b16ba8
+    6c28d571 66c1ba24 dcb43180 5546230b 6a8b6612 840bebe9 857b2f76 777c3549
+    e00811ed 4a5b7937 602eb665 5bbf5024 274e8359 0ffdd11c f2e1ade7 0dfcfffc
+    7ae836cd 9e118742 289caf30 1b058022 70994102 37828c54 4e7417e3 676c7728
+    d59095fd c30911a1 ec
+h = 23d16b52 54afb58c
+
+k = fdc5f32a 30e2d44d a0483f5f 6ba213d3
+m = d39c2f9d d1ea5f63 3e23ea72 8fa69a52 315b4ec8 bda338b2 b843ac8b 6eec8f9a
+    8d42908a 905fc168 78cd06e5 0c2772db 2fdc5f10 5a29fe56 eda4ca98 497e4d4b
+    e9dcfa76 52cedf28 c07b3b83 5939f0ca dc6168c1 71366b7f 8340280d d09fb428
+    5467728b c1ad5ad7 ce2c1288 b54e2f3f 7bd91f5f 945019e0 c6e7c330 0282956a
+    daacf8be 41414500 f57512d0 ce63db35 ddc22d9f bea79419 32b0b364 9d3ee347
+    65969b0a 986ad350 051a
+h = f8fa34a9 bff0b669
+
+k = 471e7acb b4c2123f 5ca7c5c3 849b4ae8
+m = e884c1fc 1fb47f34 19e8bf7e 442b07af 48194a66 73e8b7e4 43888400 b2d3a4b4
+    78c18506 0175440d 71c6646b 2d0c8bd3 853d5c86 0134a9f8 8965f2f0 66029489
+    6725245a 9c650da5 21b73d9c 397a24bd 16147167 d8b6d004 1663ac68 2be82fff
+    0ed67387 9936f6e6 29857300 2b5b1b42 31ceca47 cd5e3e17 9af4bf21 6b7401cf
+    3112f805 4a674781 99944ee1 603c226a 97496d42 1010a9fe 8cbb4913 163a31ce
+    017fe480 cd38db32 c5bee0
+h = 5ca7be59 50307988
+
+k = 9ddc4dd2 514e8d03 aecbcd97 4f0ab703
+m = 25fc8eed 6691e1a9 56448654 441768eb d5852e50 8cb5132a 2073254d 4110eabf
+    a80e6b49 8a236ad5 02cc5f50 d2994c4c ef11b866 92c7c96a 48e354a6 6c84e0b9
+    3e15afc3 f2e1ebb0 b7981e2e 7650ccf3 2b66e652 5112a2ad 9e2d7ebc e7c05b45
+    d4847516 d925dcc5 d7ed9bd8 52093320 ed1143b1 08c4513c c17c9a95 9dc7431e
+    13d9a885 ab764709 50d97d1a 7f315e01 0a95e673 220c1824 07cd9bb6 799e7c7a
+    ec23cf2f aafcdf22 857c391a
+h = 96d4cf1b 34724059
+
+k = bded9bf7 c8cbaa62 06695646 b38c09ec
+m = 2699a35b c00141fc 9825e904 58fd6ad3 65984c79 3ddef41c 7a4b3429 27ea33a7
+    b74c5a1b 24b37dea 93d3d4f8 60ee965b d18248d8 83df75f8 75f86917 6728929e
+    ea4d3d70 938610f4 2ab10e97 fa2c5359 14284066 4134d4ee 224a5fbb 72f6bcba
+    1568a520 90f5eefe d81175c3 5ef71735 2d3539d4 e002784d c7a64cfd cbab8d1e
+    7f8d5922 56954a0a 086bd274 6dbcffea ec23953f 1e73b244 68e8aeb3 69287ad8
+    8078ba48 a37ad60d 9cab6544 94
+h = cf10e167 cdbcb847
+
+k = b656e0b9 0877b4e1 437e751f 0f676d47
+m = 3179362d e1f11574 6e0dbdd1 58360357 df2e3ba0 ffc96ec2 197f265f 74839124
+    d3652092 bc360daa 5c9e7967 e6229e2a 19f4d97e 6af6a6f4 d9275d0f 40626a59
+    e3d31673 71e61495 f743683d 5243d398 870f7227 5953013b 8907b633 52659f0c
+    af5c95ba 4a8ab795 342ed7eb 0ac1a3da c995486c 075a5339 2d3e84a8 2a618803
+    3eb6f80d ad3e0f90 a3497259 87e37c08 a65f6150 d746b5ac 8a109f04 7dcc8b26
+    4f528606 74f899d4 8660f204 3b05
+h = 4d254a8a 693d46e8
+
+k = 648dbb94 d42d3f5e 286a53ee eca9ee07
+m = 76dd0411 17560a7e ddd5ca62 c4ead7d3 1779f04e f47afe71 8e800dde b8dbf512
+    089c969b 72b956e8 a092406f ea368ee8 4e7cb6e2 954b0309 8eddb69d ef819867
+    73f9f839 817a1104 b838bb9c 787d87a9 8ae94749 37eef4d8 668057a0 24e39a88
+    5e8bdea8 9532a8da c4966195 5cf9fcaf 245ff6c8 62237a43 3b039b98 fd57de6e
+    80ad1811 2fa22a8c bedaf0c9 a467620e a03e998f c4177934 118f74ef 69db2291
+    e6cebd7a 3cc47e0e d731cb8c 7d2d3d
+h = 705a396e e4770f1d
+
+k = 52c16e59 62affe0c 15c6b108 162cccb6
+m = c2cdebd4 e526cd05 b90f3f66 1d640d2d 156a3ce7 8b433576 756c4743 f616adf0
+    d49d0302 bc0bf771 f32ab7b6 c253781b 9344f816 dfbdf3fc dca84916 6dd61a8d
+    2afd2709 cdb79f68 240c66bb f7c553c0 8399f51a 3673fe0c bf3a7d0d cfa4da4b
+    4a46219a e50d839b 3df74996 d0d8e4b4 d254097b b6065b6f eb072811 cf1ef3aa
+    ed089a12 76455729 f4cf5d51 da7cce85 ddca4a32 2fa0851f be5510f9 8e00714f
+    ea4fdca1 b4459cb3 2f40426f e94ff1b7
+h = c0633302 83a97a67
+
+k = c5018cea d600caf1 7ac2cfed a0645b70
+m = bb162ba9 e2e46660 eed5d5bc 9c37e93a bad97f95 7da13755 31789ada 9ad1d593
+    7f911999 72d7ca6d 788a3ff7 f2846a03 ecd1daee 8bd54075 1e2d1cc8 cf7563cb
+    709fa829 fa362d63 dad4c3d3 eebdb40a 1afd35a0 74b0f99f 2e9568f1 b8a3bc09
+    1e50497f 8d163d24 8f860244 1f6ff0f4 cd61485f e882b899 1a56de82 8242f87d
+    ba8bc133 5218a0e7 d869f53e 791180b9 c8752de3 98e61727 0b35b561 50f85c77
+    ec245bd5 a1c87273 74efc707 6c73e137 d6
+h = 76455c8c 7ad537aa
+
+k = 59ac6df8 75d0311a 5e0f77d1 8feb1e33
+m = 2850d3bf 266b5440 903f8ae2 05dfd732 f20802f8 b436fade 23005283 a2e4694c
+    fcf53926 33a23af7 933672e3 88c9d178 2c07b815 08eda2a0 4c103ade 756c392b
+    50a973a9 68562239 27af68c0 fa3d4f02 aac4902b ff95990f 5c0dc0bf 3125b1bb
+    0572acb0 a0944fed d40ef822 5304a4cd c7375ce0 86e45e8b f6649841 89ee1298
+    3bad6ce5 5f3f940a d434eb09 1ca54ecb d6006e48 b1b2ebef 01801813 f9af431f
+    7424fae2 653c979b e534c84b e8d0d244 5f6e
+h = aaad1b11 ef4e6b09
+
+k = 805701ec ff444bbd 061807e5 eaa7180f
+m = 404ed7d6 136a2898 4e5a5018 71cd57d6 39adbd20 d0bb962f d08c7a66 01e3be3f
+    91107afa 30888228 73b2cb8e 631e30b3 55fd6a98 5068349e b0f67f66 53b36a7e
+    7245b192 634a3e3c 4e407648 1381e2af 8b78e3af 39743aa1 829b31d6 cfca69cf
+    50dfb516 778c5251 633859ee 3abe6632 e8d63f7f 10bc192d da1863eb 245a603b
+    6af66b49 6a9b0371 7eb130f6 c8ad44d1 89a99f67 1f5098ac a9195781 5167ba20
+    58c01d5c 59c7aee2 946b0eb4 265be9a2 64400f
+h = 8962946c ab7f36a3
+
+k = 48a05256 367bfe7d 51062e19 b276a0eb
+m = 37885760 83d2064a 2dab8fec d1f6c204 b8a5401e 15bd99db d38fbb09 309d1135
+    31c36132 e0526dca 6aa78fc4 c757dc01 d25421b6 bb205724 d6186123 90257cbd
+    8f4669fc 653f33d8 1812fee2 a1ad886b 5ef72b5d b36789a6 46539010 831b198b
+    b7a46263 b7af7e9b 612d2209 bebd8ecb ce422203 3b5f75f6 617f7875 7a7f561b
+    1e31d538 fae85885 a9a32f2d 920538a8 64213357 9e97feeb c118fb38 8260da3f
+    52c1ca6b a9d6ee25 74a27ceb a6a23629 6140bbf1
+h = 9337c177 a3b96014
+
+k = 87bf944e a01649c2 b9128032 3ed7fbc1
+m = 40170471 1edc4f81 62292ed7 7daf9320 7870fc7f 4f661184 e2dde33c c5ac1a0a
+    a7e11910 fa36a182 1c9dc034 003c514a 1bff8bd5 a97cbf47 7216390f 7ab16aef
+    18ead878 b94ff683 da439134 f7b4afb3 d979bbb6 5ab181f5 81c7337a 8efb20cc
+    aa8e6fd0 d6d492d1 26e382fa e041d29e cb8ab810 7f8f96a4 e65155ad 167b8515
+    00e3ba49 8a5ca326 8cd7da24 87ffb0c3 44c9bedb a221a07a 8d0ad6d7 32365979
+    f1277f2f 2092b38c 5fd88d9d 2d42aad2 34e0c59a 9b
+h = f7d2da51 0f4d6802
+
+k = eda160ba df69259a 5e5d6f78 73fb75b6
+m = 099ba3bd fcc0d299 365ccbe5 3d00534f f92f92ba 25909a23 e1499b2f 547a141f
+    c2a32792 0ce19a87 adeb44d5 8e3d2708 13225deb 2074ccdb a12f2f4b 2f03cbba
+    38b44018 252e74ee 07b7b8a8 41cff418 96c035bc 0a3b5b38 257cfce7 339f3065
+    4496c54e 172197c7 0ebf8387 affb9ddf 016c58d5 217600c0 c55f34e3 fa627eea
+    ba2c276a 7783f95f 55770388 314d7de9 8070befc cf1f602a 450f1924 cb4be476
+    660ed240 44223649 5f70b074 9fd9cd6a e09ae4b6 8f3e
+h = 23a052cf 5dac23b8
+
+k = 69a39b64 8890cdce 8a403167 58f449d0
+m = 7bc9e7a9 ec300d88 e0405e09 20611dcf db7b28e9 f6a7a8a7 2490acab 6387be6e
+    3970e87a 055b1ab1 dad620a9 d1fcc93c 9d9b6cc1 23cb263d 437f49b6 bc0030f5
+    1d494d4c fa6ce74a 3849305a cc43c8c4 c8640162 a7818908 bfab35f4 2e8551e3
+    6c1fb11c f3be98a9 06b016c5 d7efa1c0 4da44949 7d19cf6c 30db5212 c64a0771
+    5a0f46a5 3f030859 1cbc6ec2 18727338 bff85938 dc0c7e79 c3570973 893066f5
+    1dfecbdb f2149c47 7ff3f805 d81e9782 80fff174 fe85f1
+h = 15a2369f 22d9a8d0
+
+k = e4754789 21ab651e 91021f4a d1a5298e
+m = 5c3b31bd 960ac59d 9d387afc 09faa7e2 de2dfa0d fc5659fb 22862d30 48984efd
+    309e176c 9dfdc93b 5ccd8192 5ee44520 afb8dddd e1696a51 022dc488 863ce556
+    178cc49c 519628a8 5907680f edfe24ad b9e1f760 9a747fc7 7e1d0ac6 c2336d5b
+    d8c3936e 319b602d 30242ee1 2b81b256 c2a3e483 b8899bde cf97dd7c 55520a44
+    d8b50ec2 cfae3409 d167aa84 c996f06f f458a840 45416999 1e979559 210d809d
+    d45b2f34 4564414a 327a4363 0a37d570 6203152b a22c9f40
+h = b146c115 82eed389
+
+k = ea720d6d 5b8ced20 e5691063 42511342
+m = 68dafb7c 723023d6 f98fd0b2 8a401d3b d738bc09 d023b70b 8a107b6b 96389402
+    0466ed6f a60124c9 c9a4ac83 275e8927 173e35b5 6d1de7af da9e7a1a 7dff89e4
+    87b3d13c ceaf489f db256e0f a580cf13 1a69f82b c163b789 7591a606 82e85b55
+    dc7d75d8 2efaf39c 8297f24c e2075c59 bdc4c644 0b70c75d 45d027a1 657632d5
+    78646361 3f5ab804 ec4cf9a3 93d7056b aaa564ff a58dc929 34342ae3 507ebc86
+    05becbd3 5cc93c38 3bf24526 c3e41eb1 6b9649ae f63de665 87
+h = 48bf20cf ed049844
+
+k = ef770bef 66dc87f1 3e7c1833 2be3c89c
+m = 70684181 e6ffeb3e 5c48c961 55b4d712 779b77eb f89b6389 ecd99209 d8a3943c
+    7393e7bf ba915755 684503b9 491b8a95 08f5ccac 885826a2 c75eccff 00e73fd1
+    f3db283b 89f7c74b 5a14952e df48ae2b 01ddc8cc ce77759a 7938e025 c05e38f1
+    356bff35 3206522a c7335a4d 6bef081b 50c8bcfc 63fc0400 2cabeb7b 7a0b6fa6
+    30921dc0 81f23361 3277226a 5b6a8b1c c2a00674 ffef1bfc 78c5aa0c b44019f1
+    7b3361ed a698ff7b 43fad2ae 12587e14 811908ec da595dc7 7968
+h = fa9cf6be 5cf48dd6
+
+k = d7f1e543 f0bfa51d 4ba18497 c2a53540
+m = 69c1c3a2 b224a791 880f77d9 89766a15 9818087e 361041f5 0ee478e4 b491f464
+    f2308e62 7a76ac8c 206ee9e0 8e350ed8 a5ba6988 dac05ec3 869d2169 d60b850a
+    d050604c 8b620670 ef9f7da4 d278d564 a3d75382 b10381d8 131f2c70 86d4df1a
+    9c88e8c6 4aa4fb5e f2d69adb e4ba5ef8 4dc63699 181cd83c 29cbbf8d b995ff63
+    60437c2b 1e22e9d4 cfdaeaec 59481b59 5834f707 3ea67878 e9346799 5f187e09
+    0202b552 a64b6ee9 6f8dbe00 603d1e46 2420868a 7cfc7194 cdabdc
+h = d0bafcc6 bb088a33
+
+k = 434db056 f1d41a3d 8d97abda 1cfdbf9c
+m = 7e377960 a01c65f9 c35b16ec 53344212 d23004bf 06cd5be8 19b2e536 6e222061
+    0e8c87bd fd93c3c8 b6f35d5b d7e571cb 50099a00 5ed5dcd6 64c12550 7449955f
+    be5976a6 3d2e9633 2e6f0100 c94aa87c 467d5b2d 53ac001e 751a69d0 1dcced9f
+    0523dc90 475d62dc f884a9b5 a23ff092 a39b1e9b b4747d2d d8ea7f90 ff6dacb9
+    18cb493b 72c796ee cb7c8c02 ec31411e f2e4a602 8767fbe0 2be23232 a0b636d7
+    ddcb8285 665a2e28 3fdef84e 57fb325c a2c02109 4d5e1025 8d9422cf
+h = c93b96e6 75aa8855
+
+k = 3bbff6f3 9492a60d cd93f11e 9f7c6c6e
+m = 31ff171f a4e8a683 9847795b 06bd88cd acb4b021 299b3e19 5ece46d6 6cb652d0
+    83fef1f5 789073bb a5be17c1 0bdeb86e a39df3dd fb4d402b 71c317ca 9bcba8ba
+    6507f0d2 a4c32736 b74af208 9cc07bd9 d728f0ca 7268261c abb1eb7e 5db66a73
+    b6f27e5d 27abee46 ce9a1ac3 4e366104 b1c48338 506212bb 4f5c0224 ad753d11
+    141ba622 62803e5d 389fed77 85ac8adf 2faf9098 d783a88a 910eec21 7da3f119
+    49035fb9 44ffbcca 3098f289 4f2e1f1f fdcf9774 f7d40f43 1df69c20 e2
+h = bf132f2a e64eb716
+
+k = 5eb66cf9 87c2e56d f0335c65 8e8e752d
+m = 068e58a7 941d8432 06a78368 1498db17 535993fb 566e34a3 8a6b2972 7702148b
+    b7d15715 ab254165 97610948 b787ded5 bd750165 1a47da1a b0699a18 333955c1
+    d87c6f8e f3a03c9d d25d29c2 e5bcce8e 70da9163 1f0b7129 bb065939 c6b7c700
+    eba4b672 a11b71b9 885ee455 4abe1071 23c77012 71168214 59a2a10d 1162c92d
+    ae511064 69e612b9 35a03d94 11b8c701 dbf61a24 375c28cd 805a9fad 84f76fb9
+    bb0d26f9 ed926a24 8a48cae0 1e0e4df8 e63994fc d9803141 393ebb7a 0dd8
+h = 24129068 6c7bdd89
+
+k = fccb3bd4 4ff751da 9e94f413 72a30634
+m = f96477d9 b575f427 7dd9c56b af2173fe 1de07eae 623cd336 88b63526 78d06660
+    9501a41e 0b6f0b34 91bc6fcf f8153713 319600a2 34178fdd 83be20e0 33bc8d77
+    1baa25b6 d6b9c91d fee3c7ff 8f3ad730 b30d6cc6 80426342 90f1ee2e af9d9c04
+    b54f4446 367ca522 f119101a a6c82bf5 4204dde2 a726990e 78c3ffd4 3e520179
+    0ba69aaa d5beb7d8 b290d641 018e882a b309d32e fd773098 958c3035 199cd5c4
+    161a4bc1 5ee82244 49ea7bfd f4e021a7 b03037e4 98fc3c7c 231d484a 1f18c8
+h = 44a4db55 4d117422
+
+k = 04802ea6 1faa0608 6fab5a73 9cb1dbbe
+m = a3a9bf8e 558abf73 3e3397f3 f91ea5f2 a0a3f3d1 347c72e6 e4a4246b 76a82aab
+    ca7fe9df 24ef8b60 8363fa47 6d2dc76c ace14dfe 2a441ec2 4dda65dd 60df1e52
+    5e6148ee 538f17a8 e68fd5ee ca343292 32f9716f 49fea32d 6b95a45f e36e2437
+    56bc483f a8571530 8459d0d2 a4f60760 9bd75aee 016f9cb1 6c82347c 389d41d6
+    c88c5634 d6286532 f4a69ada a21fc965 9129db99 092e4915 404df6f1 e0c89eec
+    db8d4e80 4c180d63 d511b152 1007c8b0 b5638d9d e511ce5a 5325bc30 1dcf2132
+h = a2f940b1 02e789e0
+
+k = d5087bc2 32e10b33 1e6da5fe a9e7a21c
+m = 80ad4fd3 d1694b29 7747f5cf 2782673c 67e0afb9 d5485101 d19bd92b 407782db
+    d0f005cc 7bcc0f42 42fbd237 a6c11628 4aa5f675 95bb73ae d33bebde 7c853849
+    f69daf03 f8507488 f0f3ee81 d4b4d533 76454690 b0ef3f21 2d6b3b16 11b666b4
+    455dbc83 25e2017b f28e31aa f819ae91 a849b618 9ffb8f2e b8c7bb6c 2b7207d6
+    87f13286 0757cd69 56c91007 4ec3f60f 10a9981b 91af00b4 b17d7098 ac80390f
+    a9f7cfe4 e7e17798 0d7dea87 7d475c04 5cff25bc 681163bb e53aa76c 88333f02
+    4b
+h = bfe90d0c 9e69dd3a
+
+k = 4a5cb90e d8b296b7 db8835e4 671f240b
+m = 8f4b17d0 7717b6df 21838b95 6a00fd95 a857ba6a 9fd5287b c7491620 b170b0a6
+    e129f7e2 76bdfebc 673c02ce c8f9ce1a c92d0769 912c1ce2 65f921b5 67f896e4
+    ef4e6b6d f3710f6b b4a688ad ebf7d29b ce3b35ba 36b2a900 7656cad7 dd4e5e8b
+    273e255f cc6cfffb 52377a2d 61402095 9f249121 86dd9c9b 32958c91 6f05927c
+    ed2988d1 29ceba8f 342a8a03 068ed619 4a2cfd4d 6aae3243 16aec954 e254fc7d
+    a93af995 526a23a8 47031d92 e252be71 fd9ea1ee aa5a16a8 4f0fcd63 5b54afcb
+    b4a5
+h = ac00e853 dc6ecaed
+
+k = bf4093d8 447270a0 8e9bb9d6 27c8d558
+m = 24793a7d 93596b7b 73a5272b c9277dc5 4065a5ac 09069b55 251905d5 54a4937a
+    d1a7e326 3b320dd1 648bad3a 33c44ae1 d39b53d0 2ec66bca a8bf3849 d1d7f09c
+    77b4f637 a08ac8b4 dd54d7d4 5e185951 c494bc6e e5502df4 ace5c8a4 53229411
+    5150a07e 6be15207 66c6894d 51d3f796 4f14d08c 45b5d20f 1d039663 c14b510c
+    137a8c23 18a2eda9 f7c6362f d2dec254 867cad8a 5c23a255 60e1139c 7005727b
+    1387562e 3ddfb456 77813d5b 35aa60c3 9f63d648 de9df10f 26a64cc3 b22d80a0
+    14b084
+h = 4179c05b 054600b2
+
+k = 12a5a2fc 3eb6717a bc7fcb6a 0a005e6f
+m = cc0b8a34 e8791f32 b80aafe3 16e67b49 ba967bbc a6c9d356 8a8ba096 0726720d
+    613793db db00dc6c c4b193ac 06b82fa5 70b24b0d 1166d3af 4d9ca932 1c710272
+    19cbe0b5 6a4d85df d67927d5 8aa46e7f 2d389b24 05c3a8aa 05deddef 5ac61f1a
+    1f30bcd9 3603c3c6 64e42f87 d0466272 6239f11d 5a6b745b 5c85094f 02cc10ba
+    a02c26d2 486b571a 23bdaa35 f93156a6 41fd081f 0ce8e5fa 9dee9621 94a65a6c
+    3bc76fc4 6a563f77 4ea1c157 c8f01793 2a290d6d 283f0113 f4c6c8d3 06c723a1
+    d05ed988
+h = 8c52314a ed92272a
+
+k = 994e03dd 784aa43e f0dcd825 1bd27868
+m = 53b127f8 0376b0b5 8f23eb53 734e327a b607a5a3 b9066c58 a2ee18fa fdf063ba
+    441696c0 87224ae5 8aafdd1f e0d73ed1 a046cde4 8953f2d7 ecbbf2ef fe8ff312
+    9844089f c4506d4b 35192d46 c9b4be15 b31a7cc5 4dcd76cc e06f4cef fd331063
+    847b7021 8d46355b 794b9790 88dbea2a fbb23cbe 9c2243ce b12c7ef6 edfcdd94
+    12a56a6c 5a8a3a0e 376e868e 33a07487 afd122ca 85d5f3b3 9572f809 031836eb
+    c36bebcf 8711202e 6fe53b22 0dabf93f ca2f149a 7d809b97 312e9783 d71a2279
+    7f6332e3 d5
+h = e9c583b3 ad8c4aac
+
+k = 12ea9fc7 acf21a61 7fcf39ed 0bc1e4a1
+m = bf5334e0 6983cd3a 58814a43 7c77c40c 764d06ba 7ec40f23 51d62ebf 35f54d24
+    81ddf527 859cb98e 05abd8dd c7089da3 63097978 61bebac7 ac67c77e f6527fd7
+    a57aaf76 a309dfcf 72d25b3c bf4fc6cb 0d181e9b 505f967b 46bb3481 c74e2365
+    a6f48f9c f6808df5 5977ea4b 3c5baabd 63c3190a 3eb0b2c6 64424654 535b7608
+    f3527d2b 4006462f 960e903d 0c245d0e db9c5f16 b8f3e317 16521c87 b8f054d3
+    b7c99281 f67701e7 22b43195 bb808ae6 e36a53d4 4fadf96e d41d4455 bfc21f69
+    75b8afbe f29f
+h = 352faa5a 74d623c2
+
+k = 4fd3eeeb 98a19200 b253626d f717dc36
+m = 945a3c54 74e62320 446b52c1 58df7966 59aeb9d0 041f6464 645fcc9d 26d6a340
+    9987fde4 deecbcf7 7168d5af 356ec3ac f68487c7 ab7f8db3 efbab288 589fac57
+    90e7eec8 5ea8bc35 70ad815e 5f629322 c49da0fd 2880e509 ba730342 a1555a2e
+    bc24943f da915058 c74e6364 8657727a 4530d027 b3687ffe 0b68591b f9c17460
+    358e4f02 515f3817 91013956 ed17c58d 278c3a49 9ed7b0c5 10bb6128 a7feea41
+    fd0ff3c3 df794d2a eef695db f1359fb4 cf49c109 5eeeacd6 fb024f3a 7a6f704d
+    891da301 fc5141
+h = 292358e9 d17f9bdc
+
+k = 98efc77d 20573b40 5b01c4a6 e527e192
+m = 1b73d28b 25ce113c 01702390 5475497a 161c7ff5 312c85c9 c50b8a01 b92fc792
+    83acf1ae 08936155 6afdfd67 e072e077 82cd707b bd942a67 16859d50 f2892e26
+    fa2254f7 59b9f087 308b5ca0 aa58276e 8095390d e282248e 37606409 c0523e62
+    362ea34f 1b6d93f8 4ff7db56 c24bd577 e390d8a0 4f307d78 4a289e36 e0006d87
+    1a2f6ce5 118db33e 440f5dfd f0ead555 db21a4b7 aecec114 0afa36fc e867772c
+    8a718161 cb4d9051 29600e41 fb97edfa 00f7dc3d 4a6a0bb3 125756e3 233c0c98
+    ebd08a89 5858f9f8
+h = 90c88d2a 78da9561
+
+k = 2dc2e996 b502230e 0b78d97a bd58f618
+m = 6204fd4c 1713f46c 0e1f070d 639c8659 60c5ce22 de2dd1cd bc0c2079 95beecd5
+    1369cd7e c6390451 31f2f6e2 2ca3d334 88b92e46 1622af6f bdc897bd f62a8380
+    3cd959df a113b5b1 1d66b1aa 49dd23cd ff9b0fbe 8c83494f 1e6c5ef7 2c927c8d
+    5838a82c c48ef13f e71c0699 b150e957 638c6662 9465ea33 4fc5b86c c2760df6
+    c4f0de33 b7b989c0 27b7946d ee0323fb 954eb01f c197aea7 274cb76a 17925996
+    ccd87ab0 2125c521 b658a973 62a07f84 364477cc 0993742a 35c94c57 ab005f50
+    a0f5f5e8 a9df83c6 4d
+h = a062537c 3f347298
+
+k = ee37bad8 04f52140 07fb80a9 327e4daa
+m = 7ae033d6 a74276e8 b9fab91c f84d8044 233bdc38 42d1cc28 3e477f63 6acd7900
+    5d26dad5 9f3bed22 0a8e3039 15b1532b 36b4c313 2f2402fd 336db66f e0d12dbb
+    908e0ffc 2cd6ed4c 44ec181b 50fe2ce7 21aa69b5 a39b6574 c587d4c2 fa5ec8cd
+    0709697c 74a19b27 36cf52ce 7a495e53 0984dbe3 f29f0436 1e7bf888 23c5672b
+    b4b1d633 018e83e8 63305912 d4116d16 7ebb02dc a4bfe716 c79ce84a 13967743
+    487a42d7 55c05257 1e4ede27 9584eb9f cfc7f694 7ed586d9 f00deab7 28365c71
+    4ce07e6f 2b900c0c 2d96
+h = 30db7f79 37824fd2
+
+k = ef31335c e0d7803a ff77b977 b698f20c
+m = 9920db8e 02a14519 7f4c1041 89045a74 12d94432 44197bda 0b643140 4defb539
+    34feeb0f 1305707b c09cc15e 84bdebc7 e38afc04 359dfd5a bad906f5 14c26386
+    080ad6bd 4f03ca11 0d00c0bd cc08981b d796ba67 5fc66508 c6dc1049 9989a5b2
+    f05c34d0 8105df46 f96f7dcb e8eaf3c0 8929d0b7 816197db bef1df96 c5936483
+    48d5630c a809861d e88a0b76 e19923ea 16e09482 ed27a038 a6647bb1 7dc15fa1
+    9181f0e9 304453f5 4dd6b7bd 095f89a5 846647ec eaf79b6f bff45b38 5dbbc02f
+    ce8beab6 86b53f69 55fc1f
+h = 8023d302 ca2234c3
+
+k = 670b918b ea36516c f40fa715 3d1763e1
+m = a4d84cec 9281c4aa 98b89300 b9bf2bc3 84203460 9c018edd 4f555fda 15846336
+    0b44919c 7faf9218 1f41121f 451c6735 c6a670e8 cc1299a2 ea412173 04631dd1
+    845f5431 931ffa2d 744466d0 3f2d62c3 d03796a2 a5335493 3e82751e afee0958
+    8c111229 95d7057d fc2e3e37 a3948d94 9e667cad d1bcc278 bba184f6 b2403417
+    f70fbfb0 1afaa9a5 e2404d07 4ecd1308 2cc35a9e 143a4a60 42f90f3d 1f451640
+    b06c68e5 09115b9a 00f7375d f36395d2 7f1082cc ab81a8af d67b223d 4638fa03
+    e33c9862 612babb2 c34c6611
+h = ca633a9a d5cfcff5
+
+k = 2e491118 cf2dd137 b5f1e102 20bdf25b
+m = fe038e80 061c68e2 7f2e21fa cb15998e 64011db1 72bd3bb0 2d630302 e3e594db
+    3a232ffd c56d41ff 71a47e81 2fda6da0 afdad9f5 f541085e cb0108d9 1357d054
+    f92bfccb e50fa0ca fbece768 4d41269f a4546344 25ad0d06 b4bb83a3 128d831e
+    6e798368 b956d8ca 13932b14 3c8b3782 6685a25d d18af013 a8da0f2f 48c76e09
+    64c80fcf a20ce354 2f4895dd 20014e4b 2a1de5f6 4d7ce7da 5a11e970 3b0af04b
+    5ef66828 f348089f 5efc2099 bba71a15 11c1e971 9f0f16e5 33483170 d7e21e47
+    f3228ccd 7dd4693b 4d2b65d1 b1
+h = a659a11a 10fd8201
+
+k = 293ab615 a0eae816 c01e20ca 4f09bdab
+m = 967618e5 b66ba11b 2f78be1b 8671a887 3f06169c 50701f76 83f97fcc e778d270
+    2105b771 7442e136 4525040d 1ee0c643 0cfb49da 604bd3d7 ebb584a9 88d7f4d4
+    747ec7f5 309a2826 3975b625 692c3f1c 00cbb315 d7597b52 466059c8 62acddc8
+    fe5bee97 335782f1 f0c51b3b f129e05a 38a462e9 30f37162 8e4e211b af49e723
+    34ec616c c943dc78 a6c9d1f2 925bfec9 eefc5915 e2b23757 8d5bc6a6 65160aaa
+    e9ff39d2 aba2e47c a43ac6b8 b4f9a835 bf0edeef 5aa0b430 675ccd52 eefbeba9
+    e32bf3e6 dd7a74a1 a3712a6c 2348
+h = 3887578d 660f4cfc
+
+k = 133ccfbd efbb4243 0dd3f8fa 611454b9
+m = a07834ca 5dd540da 1836bec2 8d8f3c21 683d6711 850d11f5 8d2a3cc0 a55c9823
+    fa3e6804 c3cf6be3 beb60b01 18ebc253 00feaf04 6554b700 16ff74db b6280958
+    3b878530 70783a9c 0afc272e c071ef50 c696eff4 b07234a7 38d51e58 b31e9e32
+    4b64839e 4d11b288 855c0ed0 88165dd9 c2394049 f7ffc286 0d353834 9546f645
+    95719562 cfead00b bb4d00db 114d1be9 8a910d35 6c6b2639 935dd6dd 16acbec2
+    9765a8a5 dc7a5267 3005af9e f10a79da 7544a542 12d1b949 98e8017a 022164d4
+    56295f6b 5dd5f9e3 88b6328b b79221
+h = 23a9786f 607dc81e
+
+k = 78504876 eef39a70 f9fe4ab0 fab54db6
+m = b04d4b06 82c18e0d 5b7d4b6d e711bc31 d84e2267 64c1ecf9 451184c9 56a39692
+    75c65a0b cfd859a3 5734de22 61594b4b a15f11fa b99a900e 2d9c4886 40e72886
+    6df9925f ba283b25 0e91f5c2 6dce7635 f674f8fe a4f90dbe b1cab0f5 1e9f8008
+    0966a621 63085d9f 5e8d0d6d 5cfb220f d0215545 e07fe82f abba65b5 5b922cae
+    568e32e7 714556e5 6e040a90 0c599470 4e26438e a4684ed3 8079b67e 916169d7
+    51909311 bd1319eb 77dc1625 aa4a2b1a 198df2a7 f9d4243a c33ce3f8 30aed810
+    d046edad e9c057ce 551461fc 22331470
+h = 13b7a46b 351639ed
+
+k = 51508087 fb2a857e 93ca6a55 61a44e46
+m = 3e0ac2f7 3a4c4b93 d5475b89 fb2d342f df46bab5 10668b7a 78263afe 2b1a74d9
+    082d4d35 6d013321 b48c9702 2604cea7 ff7aa218 c30a55f1 78e6c0e4 cc4730e8
+    5a9d8b34 e61281d0 bc8bd9ca 88dbaa00 db51623b dd8ece3e f5009588 926f3fc0
+    d3d70856 a0da867c 9194c24a 6ed0465d c3b17dc4 a7762e49 84b7d01d 472396cf
+    903d3b7d 13502b5f 1010965b 5f6c96d8 91a4b20f 2987f5a9 736835fa 6ee9f324
+    6969af72 64b09e60 c173afbb 64eb4710 52253ba7 9265d562 cae84749 5a770ee1
+    7c816c7c 32b3dcb4 495f6902 ad81299d 0c
+h = a13c034d d7cc3aef
+
+k = 23ab6178 215fc20d 9c9c910a c9654d44
+m = 2c7d7b2d 59d7a59a d91ff9ed 838b6006 aff41794 f2823952 fcbef6d8 b64b8d0e
+    db7c0f7f e8004c78 1753cc98 e4ad18cd 2b55b6b0 b0133466 98806070 84ac2b3d
+    aa64ddd5 0208a02b 951f1c2b d1d3224c f0a405db 47a64d57 1e4a49a5 e5116222
+    0517e596 9f369a83 d0f6d84e b56863a3 53171688 2cea4b46 e88e4d47 2cb34d78
+    dae5e6f4 62ea956e d986c2f9 60677dd3 47ae9b02 828fa94e 70f42434 691bad5b
+    77314836 492aeac6 732d806a 4dcc923e 26804ce0 a586136e 81cab843 33b3f42e
+    dd874f9b ba0e338b 84477497 70ef05f4 e947
+h = 88352351 70fed85b
+
+k = d75921b0 f28fd35c a418c210 5648c42a
+m = e5f09499 ab765f35 dc349c50 ba0d0a65 fba7853f cb0a1df0 0dab135d 2613eeae
+    b3967e50 20e59515 04f0a862 4ca1c121 facbf299 2844fd76 5b57d8eb eccf57d0
+    070557c6 6bb40919 b64ecd80 a1a905bb ba23f271 e798d91c 9092cd9d c90e01fb
+    461b0748 9c0f0032 139ea1e6 d4c75e70 5947a7b7 b0ce7c0b 16070f5d d51be7f9
+    4e6337a8 2bb8460e 1d65cfd0 d9c060ed ab6e2c2d 43c62eb6 0aad5d90 a282c55d
+    4b8912da 053a07f4 21f1816f e4cad00d 83f77058 37033bf2 18f5b89e 3ba65a63
+    9c95463c 2de9b372 a234c14d af89005c 88ffb6
+h = 3407f62c c4dee6d1
+
+k = 54d9a25a a13910d9 0d5c9e9b 0897ba9a
+m = 256d0931 2c4215f3 a78021d4 46bcf3e9 b0f7210c 48f69d56 9a486fbf 10a0d3e3
+    a235fd91 1c9817d8 7d71ddc8 5a3e2510 091e8845 0afb61e0 3bdac9b3 906665c0
+    9618d551 0ae16e80 01af47b6 4ed2cee2 bc8b6348 55e53507 406e2c8e c0c21be5
+    0009c8d5 a79a5336 97acf680 334506a7 2d575a5e 8bb7caed d43385e9 ea0c333a
+    4f787a2f 9d1f5ca1 39798f75 b9945d8e 1c75856c 781455a1 34d99488 da431b57
+    ab504061 88c3a44f aff986cf db0a5b1d 2712c596 47b0cfa9 2e04048a 4b4f8d26
+    e9150312 3b527cb5 1de4570f 4dfcda22 7d2621bc
+h = 17772713 4265073e
+
+k = 1767f43f 69f7254e cbb9808c b34be0e0
+m = dc2b76be 64601ce4 878f3ca2 92a94079 566e3811 95b2d762 db6c31a2 f35690f3
+    14c249d0 1d2fcdbb c201c607 bc2090cc 2fb7512f 087b00b8 0056e453 ececaff5
+    afdb1a8d 6cc89dc5 bae3b8e6 585c591d 138ff485 82026392 545912c7 15313f1c
+    756ec5c1 2c1285b2 0454eec6 16348364 c33c65b6 73091788 46c9e7e3 6995001a
+    1a79fc6b dea466cd 04961ad0 edc6cee6 5dfd285b a03112f0 62d7f6c1 76a32a21
+    1240851f 5ab5fb86 d2aa6386 fda279cf a0ea5dbc 4f820404 32478a76 69ad7eeb
+    b4be0da1 9606ddbe 883aa9a8 dacae566 fb2b5452 03
+h = 21a5b9e9 b861df4a
+
+k = 7689efc6 b27cd139 36bff761 f46fe590
+m = 88942858 434d00b2 a9359000 853c1e28 140e0805 eba72bc2 152d84ef f9b59a57
+    3cb75ef7 61a11603 c8859451 f41fc881 42eff1cf 919dc119 e0cb6e89 95bdcee8
+    ad69d273 2b41048d 1a3da816 ec77ef50 26c0863e 2fc67099 f0863afe f4baceb8
+    15977c38 e34a708a e9f6483a 9c3a4ca6 90f6df65 3a6984f6 5f48175f 1137df29
+    140f7cc9 e5bf3ba0 e940e522 f9f3cd18 58f92a6d 32557a4e 97ef79d5 780b4083
+    c0016364 10102088 9dafa096 54620ef2 25b03e3b 51057442 30a2f8c5 d9aed837
+    6119da06 ca29bae1 5fb2e5fd 780b696b 984d31f6 4e5c
+h = 1254d42a 704d2b84
+
+k = 9e7ce331 23df5dde d86795d8 4bf1749b
+m = d196808b 0da3fe53 eb090a0a c521217f ae1c48ec 875266c8 156704b0 2380b3a4
+    7277c2a1 7222f1ba 8f1e9d9f 1a516f1b ceaadca7 cbc2034c effbff8a e91ccfd6
+    1efb3ab1 2e0dfa1a f7a85503 20148b43 c3ad97c4 4fdec012 bbddced2 9e0d0ddb
+    70b9cbb3 10b68ec4 28737edd 686b7066 5c393f8d 8a3bb3fd 51ddb7a1 ed326675
+    021564d0 c77fb5f8 3f420cc9 45da8250 0e6cdefd 65fbe13a 855b641d fc124ac9
+    ff90490a eea08a50 b5889ec4 00c0e35d 3eec12f7 df7da57c 6db62ea7 a419a356
+    9ecbc35c f8a17c72 bc091099 4ecc05d3 8a931067 2c59d3
+h = 7288e718 18eb8069
+
+k = b481ea0a 790886b4 0c92b41d 1c047323
+m = a79f90c7 795022ed 4293ffbd 1ffa8aca c2ef7400 1f80d7eb 5cff085b b2783b9e
+    adc9239c 910bfe30 2e9c9f9e ccad020e 57894ea5 173bcdd0 d29582d3 88bf47f3
+    02b55d4f 196065a9 2b368949 d82191bd 53f74bef 36aaf6a1 66d6b6aa 1fac473e
+    763dd099 1c02ec5d 51b1f7ae d95a8ace c3cd56c1 6e5e0660 8d9248e8 62ceaf40
+    d146ec50 25df604b 452ab99a a35ee17d dee93261 f5a98dde 4a461577 e6bfcf38
+    b89e0a53 8e0779da 3671c8d4 bff7f226 ea52b9cb fa025eb2 a79bd9cc e6d171dc
+    e803833e 8af71380 9bcdcf9a 760d78dc 2e3cb19b cc23e62d
+h = bb60e50f 592579f9
+
+k = d25c89a7 81d58b91 cd040ca5 9d63e365
+m = bafb41ca 9bb42e49 99458b54 e43a14a6 04738d6d d1f9314f 2298f872 68739e4d
+    41c2b94f 484985b7 b3302342 a0c52fcb 22c06d3a f2fd269f 00c8a873 209ddea2
+    0a71c793 f1b765fd c51afb91 fdd37d64 1f6d7ccc 103acef5 7d7d13c2 3d8ff12b
+    eb16f371 47f8093b 552a89f7 b2422c96 60c2212a a4b1fc37 84822025 838e95d9
+    5a151d59 b6bdcff5 731f8de8 fa3bc770 8229de5f e517b432 1bbb684f 0c42eee6
+    2f62b1ca bc090161 0a99bc0c 0fcd57b0 5787eb0c 0be9cad5 bd61f5f6 0abd98c1
+    1136abf2 1ac9b01b eb5accfe fbd6bab8 253c6947 dabdebef ad
+h = d61d9ef0 7212537b
+
+k = 874ed21f cb017900 e74a0785 e3f55d85
+m = 965c014e e176d1a9 b88d5886 0c7387a3 9cf23983 12f33298 f17330e5 4e03ac24
+    beb75f5b 86da275e fba6aeb9 a6732476 c26cd908 c6158c78 9724d51a ec0db3d8
+    ed7cd1f3 e1c33f23 86ffb921 157bf10f 88100214 cd186bd6 e67f1bf8 c85785b2
+    2ce9e341 0a9315a9 7bfd480b 668d7a11 4a141f99 13c67989 24549c6e 8feb3804
+    220987cc c71afaa3 9a6766f0 0c36d5f2 195b93fd f7c6449b 6b0fed74 8ff139fa
+    1f31ab6c c5c9f9bd 54bc2c5e a848b18a 7df35beb eed164dd e691c4f5 914b9f21
+    3d388af7 d1d67a67 069c5c14 90dd5e27 15d3b28d 9c798d34 fcfa
+h = f9ff6118 2677ef22
+
+k = 434cb875 417ec770 7d94f41e 39e9428a
+m = 7b001ab2 0728b44e 80b2f972 2184efcf 19818b15 09ebec17 9ea55f32 2000baf9
+    fd4fc71b 2add5fdf 8a1ba38f 3bd91999 4e5f5456 a9603262 e535aa3f 6dfce9e9
+    91df8e57 7fc7c796 9a065f58 e53eeca5 0f48d34f ba4b7f48 17213191 ddefd781
+    8cad986f 5ae84e0d 8216ab49 da619b86 1213fa0c f42de9fd 7a85ddae 1e006621
+    242472a7 f1c9398f 793fcb87 c163a285 b34931a9 7a5b59f5 40b407a1 f2091516
+    471d732a 4a96708b 065f5eec a4487d11 37683b83 4d026371 937d73c5 f3cd2e44
+    e2ae4e10 e05b2a10 462cfd85 c6ca9077 b1254c5f b7d1bf21 5fa902
+h = 171e7ca5 3562ebfd
+
+k = fc9b8d4f e6591fb3 5da6d097 f6768274
+m = 9b72cd84 cb374768 ebe555af 5e372300 34328808 6d1d5caa 529b3732 054d55b2
+    5904c528 d829ddd9 8262e05e 4d0563db d27e6409 c25c267e 0acd6128 b1586163
+    c94573e5 d125ddf0 4a963c21 39fc03fb c942bef2 239a9442 45d46eb4 fae17e61
+    600e7e73 44e0eab3 a961a72a d73ac618 efb0dece 02cb4e6c d778ed36 42f667e9
+    9d4b8f84 803bc559 906a5dc5 136bf9f6 dede5ecc fdc1ff88 584ed9ea 4c76aa4e
+    5ce30008 2bd6ae19 e6ca93b0 dc254669 673f272e b91a86e3 4ace24b6 3090a348
+    c50c3dd7 6fd9a19d 3f392f25 5072370f 9537cf62 e1626db6 15a9f520
+h = 7992e08d 643193f6
+
+k = 96c7a40b d63f6e5b f859a858 c45496c6
+m = eacadc7e 028276b4 fe14a4b9 cf84a68f 8f943e8e 07ce8fa1 dc01ca72 adcf324a
+    b99f11e9 fb06030f 32329d63 fdbaac5e ecf293d6 2e77c791 d9f9737d d2ec0f2f
+    c821b716 c9793f76 91d3565f 939fc70a 53c98696 e143f767 0e297475 056009e7
+    b805b41c 788e6c1c f9047881 6a16ccea 8da96bc3 8110a3bb 80b9002f 49a33c16
+    2eff7a15 c954fc07 ea1e714d f159065d db96b1e8 2395fb7a 08ed6bc7 7db6b369
+    b62217df d874021d e7d4bdef cdb17844 eef5d768 ff66d6d1 e460476f e6355e3c
+    3c3aaf67 140df80f a57589bc 0665d897 f4f35261 f74ef563 6485043f 30
+h = fae8df05 c72bc1ad
+
+k = d9ac71a2 fb604d06 f4b8e318 d4235275
+m = 508d99f5 88a8a35b 3528ee02 b613a708 4b707147 c722e85c 9bb3c2c0 ae63a628
+    563dc824 b0635cb3 a52cded9 50a9bbeb 0c9af557 87b2b1f2 534532e8 4eb42a86
+    b69998b0 81865eb2 af7f44c9 ba472081 ed78c2f0 ca4172ea 583efa19 81fe587f
+    cb988e60 e206e280 cff5959a 7eebcfc1 7c9a4e9d ff1c3178 a7cb51c7 c9d32373
+    fd5a9fa7 4172b40d 08f57d74 850aaca7 de7235d3 93db7984 8dbba934 e604935b
+    44c2aad3 e9354a0f a81cc170 c0aab026 fa5adacb 79710184 c91f337e 6fe16b70
+    4b8de34d 5f886af5 e09f5576 d81d2494 a3e346f1 e6fc3483 d0d9e68c e7ca
+h = d16664c0 2d485e3f
+
+k = 6570a74c 0b19d0ed d565ba6f a7806e68
+m = 34a29e68 974ceaa7 5cfee2e2 73e5444a c239c6f2 b4f7ab88 70b46082 3d185c6c
+    d8051d72 996dae8a 361c3cfe 7c3cdcf9 d4b2a991 a4cb6640 2c624f0a 688e9f47
+    5c2f8ebf 76438026 bf0d9d99 01f0c214 84e2431e f304c146 00e9c3b7 160aab8b
+    aabc3bc6 98c1f0a5 973bba3c 3cb22b23 4d7c6477 cec8abc3 33f3238e 0c48fa3a
+    49857171 53b428ee 0bafdbbd 63ea7052 fe23ff41 89adbdf5 e084cab7 079cbe69
+    784cdcf0 a08a49bb 51c7a723 9404680f 2e559018 47d08c07 ceea93bb 4fd51b35
+    5bbeaea1 75a7f2f5 bb276c00 c6fbafde a9c423e1 41d5b29d 443e6522 2771a2
+h = 6af812ad bb966f8a
+
+k = dc831218 2f211349 2dfad423 76a74271
+m = 4876f24a 94e40b57 b2a2095f 46322fd4 293c8f12 85560fbf 2823af7f be40475f
+    b794dcd6 0e181008 fc581901 80133529 7ddf1e6f fbaa848f 2a4ab2ac 99fd0c8c
+    161a5249 87f2c1dc 0482c54a bd572cfa a000cc1d 46d8ff4a 556e923c f20a3d7e
+    7c0ea9e0 5fa3f320 4351cd84 1ebc78bc a125b761 8f73d456 cb001a44 37caa5ff
+    0edd0957 65581c64 162e4d62 555405d0 e60689c7 cb4fa3bf feecd13f ab3519ae
+    a65d07be e6fbb40b 48be3124 d4774fda 170beba6 3e09fe5a 929ba058 c248c4a4
+    912ed90f 50a89fb8 33733fc4 ee69b43f ea9ff1b9 e9568168 3a6a7e8e 94d64a6a
+h = 27326a23 61ad72f4
+
+k = 3a30c608 cf5bd39c d1d5ae29 5ae03286
+m = d25ef27c eb17723b e6050f09 be9a9b94 3209ec41 37dcd989 41a95b8b 6c4b2807
+    ef799268 e4e6aa4d 45beef86 0e236089 6317b2b4 57948134 95b6973d 8c9d4b72
+    19b2f1dc fd24c5a6 67d7b91d f90df8d0 70cf9eeb 8a8d6b09 4228f8b1 02f78705
+    99c51561 c71ffbe1 958f40d9 8e51da0b 35eb2466 e6a556a5 d0c4a3a1 3919f8c5
+    5afd4c91 5db7cbc1 87918269 d2060c37 11814f43 ba2d5ace b175bf0f e9fa3958
+    f1034984 37c5c46d 44aa3f18 959fdbe9 0be941c8 b40ef772 619a512f 196e44ce
+    6c8113c6 51d1296d bb8bc08e 9e2761b2 510f8c16 20f94d0d 7529b727 22654de8
+    af
+h = 25e2d080 6478f702
+
+k = 2be15038 3e0e5e1b 9ab646b5 36735dab
+m = bb1d224a f26071ed 3b7eed4d 62d13f5e 2bb61e2f 33bb167f 4251417e 41343eb6
+    ce72b647 974bd64f 83bacb40 fd286705 aff3eef0 0340cf66 f6dfc41c 7534d675
+    ee492206 c3ebcac3 aed8580b fbcd68f4 906cebca bd097e4c 60fcb106 0861585d
+    c407bc47 a2b37a16 8af5a770 5afacb93 0acd61fd b167bc1d 22673dba 1520bc9d
+    51313db7 49ec26bc e31cc1c5 e3253d2d a1555649 a3c2b751 9ddd3b2e 47ccc5ef
+    22177b59 bf6e3193 ecb0181b ca8261dd 28b0c7a8 d4bf1c92 9fe3ccd8 a6bdd671
+    3a1a3fee f14d79c5 c2880078 f07486e7 54b24573 5242b213 4f3fdbb1 36e50f9d
+    8f30
+h = 41f549c6 52a9d2ad
+
+k = 49e78923 20dd0c52 0cd5c344 c523c4b9
+m = 0b76bd82 0dd9b826 b4ef3530 ccda4d5e 74debfc6 9b0859a2 64313fbc 1c272ac7
+    1357dd5a b398ee43 6a568b38 94aea130 7d0534c3 9cd82ff6 17ae69b4 32aad565
+    dfe0c0dc cf0d7503 0532ec68 7657142a 1fe03981 bf492a54 172c18e7 3159ac1d
+    d7d40209 77e79fa6 8522e2c8 6c0c8903 44ce45d4 4b98bd4f ae1412c1 ddde3785
+    2e675efb 44eec8fc a3ed695e a6ad0bb6 058fd2b7 4e8c0e4d acc48a00 3dbdb140
+    360244d2 5f43dbcb 2f9d33f5 2e5a2ac0 355d9607 c037fe9b 1819cbd9 2f232508
+    2d37e949 1335d8ec f2520082 32236e92 7854a86f f02f3259 3d23e10e f4c001ec
+    5b9b80
+h = 58f640c1 89773a39
+
+k = e7c33914 4addae55 c7963924 5b710c03
+m = 91bd07e5 f8fa11f2 f55a4150 66c098c8 793b458a 682389c4 f4df4695 86d27e9d
+    ec72dd64 e5c3218b f434776b ebe5d304 1d2ed7da 7b159ca4 834ec839 3b637c22
+    d6ca4e85 ce4096c5 fa73fbd8 040af86a 74dde35f 83511b69 ac74eb1c d223777d
+    4131eeca 7cb62f71 f846ffc1 08e9dd16 c809f0fa b3506c87 5fd2027b 53088653
+    d634f993 276e3936 a9c0ea4b 07a4fba9 876151b9 8b2f8997 260feb9a 60f3b752
+    3db94420 ee703162 ba936228 25208059 7f35db68 733fbc5d 555fa5b7 778d783d
+    5b808bef 568f866b 8667c0fc e3d2817b 5bd230d0 ae6c79ea 43f358ef 8d6545d8
+    9544cb11
+h = bba9b838 f68c24f7
+
+k = 45a2e4f4 da7e62c0 900180e4 e49e7d5d
+m = 9c51cd69 499f539e b3859dbc afffad8e f78a4cff 993fbf16 0299dedd 6fe61fb4
+    295eb2da d832055a b26c2394 cbcba49f aad9d655 6c0c9826 0039cf3f 8e8750cf
+    828fa4bb 3aef127b 8d10f9da 98c206d4 43f4cb0e 49d1c916 8a9b3cc7 4d3a2d49
+    bc6d6778 daa53cd4 f9485cb6 17b8c47f c066e2c7 507ab840 f0ce7642 d31aee57
+    fd776639 3e979582 01354fc9 572560fc 8e37dbfc 8147daf2 c39df9ec 1e6ccffc
+    b11eafed ad157130 a6d15cf6 72d9550d 607a299c dd653be8 e3577881 5d6d823c
+    1d3c96ab 88984d94 bdd06122 6778e6e2 a2449dfc 9186ddc3 ab51d040 6dee5c17
+    9852f5e9 07
+h = 182ff12c 311445f1
+
+k = e5e04e9d 5b16fa1d bf94a94a b085aabe
+m = 4a40778d 2282ef14 deefe2ca 71e1c93b 14f13c14 bb057ef1 af42a4e9 8133eabc
+    25c8ced9 d7b03d9f 5ef86d1b a640c328 b4612470 e654a74e 2c4594cb 6a92830b
+    6428c194 3d959439 e4a2baa6 d5be0e74 220f71a6 49e97a62 97fc9b05 a2a27820
+    22fccb27 5e41af73 8e0d5f7f c9025936 7381e74c 3c06de09 9f9b9797 b9447fb4
+    1341d68a 926ecfa7 86cd525c 51ab74a3 25a07263 f3564caa e325aa4a a61a8ad5
+    c24c4693 27f30eb4 22836ba0 a8374097 ef8e4bcf 799bff0c 223f661f 7115f06c
+    d63e16a1 e9c3dd2f 3f9a6223 9ba1073e 06fe313d fcee1c8e 31a4861e 8a52953e
+    154f4f9b 4606
+h = 86358c05 13d1f113
+
+k = 5473c9a6 a3516e33 fa8ad34e 36ec9422
+m = 54c2a7ef 331f6d74 d38d97b6 a4477269 cafcf0b9 27b0e603 16700bfb 0680dda6
+    18601235 dcb0e90b 57429771 f5b64d0d 816e4d43 7cd10bdf 26ab41d9 4c38a272
+    b54d16f8 0461562a 6febea41 3262588c b811a88c 9cb6ca06 a61385f1 53a0d0fd
+    04159af4 ee130fab 870d5e24 cdcef114 401c230c 996e12a9 47f919f6 699d29ea
+    ac71b3e0 243ce872 cf2a8862 0d709447 6f192174 fcb4b92b 31dd162a 9181d50a
+    774136de ffbcc9da d528dc7a cfd2b24f 1b019a57 93e3457c 1b59f5e0 f44e164c
+    eb101044 0faf4390 52afb37b cfeaf8ca b674957f 1e4c44d7 c34a5616 c336c3f1
+    55e75c7e 237b33
+h = 3fee7270 9ddf73bd
+
+k = 528f6ae0 9496b1b4 64bbe626 2554e6e4
+m = 32523950 bbf602e0 db546b0c 4ffee88a cd3d821f 6631aaa2 311a02cd 59c265bc
+    e762a814 6db87808 8d9b4588 eb9b06e9 b0beace4 ee4b7497 73434894 26b984f3
+    e4cfc566 1fad9f07 2e84c16d 89297122 9dc48bac 41c698b4 fad358f8 979b0d90
+    3c0fda3d debe17df 98c822ac a43ed76a 87ddf195 51aba632 d5a13443 14c5872f
+    a252ca82 9ecc02a7 15f12285 3487a7fa ff644ceb b2d21562 580d579d 529df3d7
+    12c8147d c5097e4d 58a98071 95e9a2e3 1e19d38d f5e30c37 c59c25e8 9269823a
+    adc2a288 c53abe0c 71ddc333 ee85d5f6 f7428aa3 0e6fdc6b 4b1959f4 8493510a
+    c7788a9d ada3bc02
+h = 6bee028f 5195cd4c
+
+k = 73806bcd d7668a19 22f6ac43 d445a6ec
+m = 4b30fee3 baea6458 6c4c2e33 34d96daa 6af402d8 097a937f 31bed063 49d40394
+    ac48fbc7 bc9a0fd1 4af8082f 35944ad1 eeca7e56 3703276c 163e70bb 03b66fa7
+    2fc2735a ca60b975 27df748d e4a327a7 7ab71d1d 1a8d185e bef0eebe 3ccc6837
+    b2414f1b ab419bc9 0041aae4 17509269 e4c287c6 933cbc4f 83fd51af 0718be6a
+    e3e5f273 1016754d 17e6915a cf5ebca9 695cb091 9beb7499 e9e48708 b1b4ac35
+    820c71a5 df0f1e27 ee475ae3 7d3596b9 2bc0cf3b f2249926 4efc7165 4f86cc87
+    21430474 fbbfabba 2fa5fe80 95fa1d56 bf08a8be 0deeaa74 1a3fa92f a221746e
+    e7693da6 aab0b2cc 10
+h = ebefafda 11d15b8a
+
+k = c790c703 48068429 bf9556cb b7c3d35c
+m = 76f432fa b4145164 da80deaf a99e773c 6c41ef7d 2cfccc40 0f7fc81c dc0dfb68
+    e03c1957 46bc51c2 e13b74ef 648f6896 6ab680fc 25eda2de 59b66ea4 50a22ffe
+    9e399654 f94feaf9 94636fda 2d84cf3e 25d7e428 f084694f 93d8ed75 f13bb28d
+    97515de1 e2aad8cf c59803d2 ef1e0cba e74af54f 836e402a 041d4cf6 7228c520
+    79382fef 6b9789b5 227f095e 6502df81 3c960834 9cab8ea5 2d33095e 0deef294
+    b6d386b7 94ecd78f ab01459d 19b7a1ec 9633939d 13de2261 b64b706f e9d17378
+    f7d31220 07ed1642 911cb620 4fca6f05 4acf9855 5abe5dec d9073dc7 8babd7a2
+    8b541a15 6b1acdac d892
+h = e3512615 003336ea
+
+k = 8eb52cc3 c19b0c44 ef481657 7487cf6e
+m = 924d18fe ec79507f ae3921ab de2e1951 ee84e9f1 446bc208 909fd423 a43ab26f
+    97b927c7 496d5cc0 065efc9a d8662da9 a378456c 023bb186 01b77c6c 6cd9e7f8
+    2ec4aa3a 1fc20a99 13071425 e96274d7 0412d0e1 0a199955 a495bbd2 67cfb005
+    421a5284 3341b541 4ffc64e7 1080356b 2a5c0da3 62cc3c7b 4f62a662 0201781c
+    2369e109 f9b50ae1 f4044c70 5caad2ce ee3894a1 3c6250ee bb57bb52 f1e40ed8
+    f8731266 97f744b1 c033fa7f ede1161e 129ed047 b9e677b5 026877fb 3f51c83e
+    953b7354 3f469447 67ffbc69 bb9c5a34 0f21e9be f04441f0 84877efd efef1db0
+    72961669 54cf3b86 50ba62
+h = 2c4e9d83 bda63b32
+
+k = 6087ecc9 bb861d00 88ffe128 2736b3c9
+m = 70ebe338 6dc8b925 31869455 e3366161 24a34bf1 150834b3 804c3148 3b9a60fb
+    e7cfe298 ebe8f495 f6bcdd3a 17aba80f c4e8bc9e 6c74c0b9 521e2007 6dba9b2b
+    b223908f 877145de 852ab66d 31468b24 ba30323a b5491ef2 ee6e8716 67d8c17f
+    6a5cd3a1 cdd1f22a 3f3b1fc2 ca00ea1d d6cf41e5 c6a2813a 965758a9 c01bb52a
+    0ab6c6ed ff33694a dff088ea ef9ee71b b26f2a00 35e98c1d 299f5d87 d4de2250
+    b99fe983 1e217df1 b3300154 282e88b6 557ec8f1 dbb7e121 44768d03 cbb3aa7c
+    5347afee d7d96398 26ef5ef4 8ef41b80 5488acd8 e0330c35 2fd4d2f3 279df763
+    9d658669 b1659571 614235f1
+h = 52bda02c c6cfbb58
+
+k = 42e3a420 ee3bd192 fda991eb 8c14f665
+m = 2403e3dc 560bfe2b 215d886e 2250cfaf d27e0f9d a24393c4 d7d7f145 74b9664a
+    77255bac ff389743 78252352 c4b9801f b4ce6814 e1ae7ef6 ca4e82ee 8f47dad2
+    5d0d4df7 3bc09978 c94e8ec6 3bd3390d 2b9415dc 8344e784 0c5fab1e f18ef101
+    aa9a08b6 43c6c3c5 299473cf 9bf9f6de ae5e6ded 2d545aa9 bdab6cd6 e5a599a3
+    d0eb0835 743b577b 548864cb 849b9d20 cf26f59f 7f4aa00d bd6706f4 5339a100
+    425b010c 94814a26 1010bcfa 4afe30f6 45ead766 0ef67956 675ed97c 66b4a267
+    1aa7ca41 c0f5186c ea51a03c 154019fb 42b6dd3c b6cbd853 d1b67813 93c41607
+    5d9afc5d 06f49973 dd4ac5cd 48
+h = 5e52acb3 2825e395
+
+k = 492e052a 3ff1a0be 2f21eabf 9d273dad
+m = d4becc3a 5a29cb8c bb755e88 2fa08ed5 6ef1748f 0c05c8c9 923801e7 7ff34aa5
+    98462278 ca4a9072 f17236aa f984343e b9f320d2 3b50ed6d 9bfff4d6 da8e92aa
+    14b8d375 b53f3e8e 020d584f 2ac25428 68e30caf e0c9fdf7 0b6e28d0 61838a64
+    7f0073bb 1bae4858 5b8aecf7 dc3506f7 da96869f f45cf2b2 86db10ba 98733ab9
+    fad87e1d 4551b06d a3b90d64 88e78ba0 61529129 14e6a268 a817250f f32c4742
+    d60310d4 215ca54c d58e0def 8991ea55 61fbce25 23cca276 59db1736 00f4d51c
+    b4c77377 e3472e87 6b6073aa 628a9190 d6ee8a95 b978c118 3383e61c 32282bcc
+    57ad3e45 ba065fd8 c5e7907e d5f8
+h = 40475e01 8a886766
+
+k = bd56adad 01a6e36b 46c1a435 eaef94e2
+m = 9e90c1e9 538687af ed6054c2 eb9d0cc9 598d8caa 1f0c0d77 4476c685 3bde71ac
+    22a5eff2 e4f3eb61 f7879452 5860a8d7 413edbc2 85903c8c 92a9b9c7 e60ec905
+    05901c6f 82f6df72 98b709ca 5b405fa9 26058931 3d06d1e1 54c0369c b59d816e
+    84534d19 d3e08e19 4457e2be 7f3aa915 65d851cf 907534c0 5965370f 18685c59
+    15a31242 c5b561bd 887f03f4 ba3bfdba c646d906 2cc8e2d0 099a9dde 57c0de1d
+    ea9e0bfe 39295493 eae81fdb d622ba50 bbdc29f5 15eb11f3 90060b30 ac0fd3ec
+    06c099d9 4c523a47 981ea806 13ed58de 42bf2529 904ead27 67a2d072 cbac7256
+    14ac563a 510ff15e cbe029e5 9ae607
+h = 004f65fd 1b19b9a2
+
+k = 6a28c2ba ee34632a 127a4c78 78592e3f
+m = 07ab386f 9c298dd7 970e74a8 7e2d4b20 51ab3cff 98961aba 51f3f1b9 ae9a6e39
+    0dac9103 a61d6c0b 7061b596 dffb6ac6 46085691 5352a6fd d82bcb6c 122ebedd
+    04941f58 21ead7a2 0a8d96f4 f052b5c1 8f1e710c 6c2c5f37 4d061aa7 8db82ff2
+    934c453a 234473a5 e69c6587 397d7981 2c9aefb6 33e64d45 7c036779 150eba61
+    3284f35f 2c4d905f 06674ec4 bda0a153 8e66ba3f 221a0b43 aadf6f33 90b97ffa
+    2a23ebd9 2e1250f1 09e4c9c1 76f19d08 f5b16463 98aeea1a 213eb7ba 4ab8a50c
+    c02a3da3 858c2a7b 1dd3491f fc8d4461 26d18e53 02db5b58 8c2cf0e2 b601c8e1
+    2f5186c9 22f88714 16862e46 d19599a3
+h = 0d0991b2 e6317408
+
+k = e25b9190 fc279f2a 7c242741 0f0b66a6
+m = f5516234 63dc3e98 53cdcd36 66405527 262e1d6f d475ede1 5de4e24d 829451c8
+    d0565524 b1a52cfd eb8d7d6f 30f366b4 50e07a56 95ae12e3 f19cd84d 74bff918
+    8184dec2 6d0035cb 0395c28a 61b00e82 f47393d5 b723f13b 9f0b4ddd a583d83c
+    f2dc870c 4a4e7388 22bcd16f 3cd47572 9ac74b70 418046f2 8f7a7a25 46a89193
+    f2b1ae51 2bd8389f 360abd18 01c82311 b0016356 e089a5f6 51fea91f b6f90141
+    0c795d29 0426df0c c941ff00 608ac7d1 4f9cd747 88956c92 cc2940f9 f43785e4
+    bd2279b2 0c81af17 76ff4009 d549bc64 dfb0dc74 aa0d57bc 10589dad 97de014a
+    8f461143 59cb306a c270293a ba4cbf8a af
+h = 2452cdaf fedc929f
+
+k = 15358436 8acd324c 4d3787e0 c4bb5505
+m = 90b5bf03 4a25a4ef 50063b16 ede30137 d72819b4 d36c194a 3637d97e 619d764c
+    07660687 b44c210d fef07233 abb78bc3 817f4359 cbce6abd 0e342384 d2c2e099
+    0a93d731 9aa9192c 67205cd0 fa3a065d 035dc4a8 0f5c8fe9 7e9e83ec 09221b07
+    f098ca66 931d5e2a a4590bc3 bced08db d403fd8e 303daa33 2e2b1da2 463b9359
+    ad6d1058 bd640794 300f48c0 a2e6c3bf 2b908e5c ec509ab5 6adb8f8d 4ee3f8e5
+    6ce72caf 63d6496e c8847a51 b765db65 10a5f59e f2341e6a c5fe58a5 eff5ee3c
+    2ff0c3b0 6f048390 847601b0 cdd3203b d4d1749e bd6175d5 d38c75da f80b9a68
+    2dca531b 86a67da0 c61b3117 07e63aed c686
+h = b5edca41 f86c4e99
+
+k = fce071da 49b0f3c7 2ecc1710 e3a1e6db
+m = 020cf137 86330d33 4c63da89 3aa88116 bf22e2eb 26d16129 39310880 b71eb3dd
+    f590070b 3381db3f e2950bd2 29c5a7f4 b711731b a3ee1a3c 7c88abd1 c7ba5f4f
+    937c0bbe e2db9aec c0c1ebfa 4e1dada5 f418a25a 36601710 b5ad4dc3 8463020d
+    479a69cf 730f68b3 d971b42b e65404fd 28f121fd fc8d96b3 d6bd0862 2543191e
+    c4a3a567 9bb98996 ab1c5507 21c2a978 399a4650 df41c78d ba118a0e 2617f257
+    ca46144a 33593b93 e23ae5c5 7f5faee1 7dfe99a2 bb0d450a 101c5969 6dec357e
+    fb5677e1 7aeb5725 4dee54f1 254f22ba 0cfaf2ae c52379a3 195cd97b 134995d0
+    11d22e10 028a3bd7 7a633187 6516e313 48cd5d
+h = f0a8d51a 64d73cff
+
+k = 905de2ef bea443a4 23cfd622 4ca459b6
+m = f5ae488e 25f8a1da d36feef9 b734d669 1c4746da 3178b05d 8f49644e 80cca9d4
+    8252c0ea 3b1405b7 ee39d855 2e6e3e63 3767db13 8bac9159 70a98010 7d0cf62b
+    be7cda75 4a5845a2 c8e555d8 d5597bbc 740e23fc cbb4c7c4 e8749608 1d14f372
+    7a87f431 5d10a4e7 b3d6f161 5d3232bf 8175ab80 ca9b5377 ef4011d1 554d4592
+    98098275 dad09597 327c449c a90a4d6d 6e42fb62 bbfe0dff 6770191a 663a838f
+    b11b6561 8bc13461 d72d53e5 2cf6cf1d b7c8798a 628710fa ee2ff7ab 1d03aba7
+    0a629032 a4ba26bf 31d707db 20e600bb 2d3e081a ec54d621 229ad894 e3c9ba12
+    4f673e84 0d90ff98 6e165f5c 6c2c8ae7 7233e3e8
+h = 0dc95bba 8d2ba34a
+
+k = 36b8df67 b8af5e50 f67fc7b3 afb92833
+m = 6338c5bc ed7f8dba f972fa4c d7f4c2d0 f5fddac4 a84c13e2 5b36a07a 7055e4fc
+    2a5cf47c d2496d28 ad25c38c 00371e62 b1c89511 4267659b d9601487 1f9c1aaa
+    eb18b16f fd9db9ad 10ef5333 22762340 b3cb6855 7426ba40 5ea90a28 9f09f5fe
+    7b888262 501715e7 ca3e3146 8a5fef6c 85b6fdb8 29ebf9f9 780c22c0 2935502e
+    fcb14ed6 dcafc203 25eb8333 f09583f8 cfd292fd 8b3a6375 0d87cbaf b19696d2
+    e6ab29f6 a199fd9c b9de3d9a afd11a6f 994348b8 3c36f29c f6d6485e 7028c053
+    9c8e4a4d 7777964a 3c87dbd3 89b5935b 046b8aa4 6dd16040 4f64e42b 56528c6d
+    306d9449 c3bbf5b5 167a5618 8881b1d6 844c19a2 52
+h = fb443949 e96922ef
+
+k = e364c687 d264cbe1 b1fae2a3 d1f4ce5b
+m = bc6daada 695a5050 9e707482 bd5671a7 f63d5d34 0f592682 a5571f81 34a15594
+    88426f4e 4777fc07 b9950d19 00806b18 8c59b6d4 468d2c3d c19c7265 08d0889b
+    0b4a310e b47671d8 dceef7e8 a837e41f 242aa48e 01e4ffd8 a5a28004 08fc6aed
+    98871a5c e109a4f8 71542236 fdcfaa05 3c729e3b d860c50a 3ba5995a 1e5bc9d4
+    8c00a741 aaa378bf c7ffab46 c5827797 a4e4c4d4 a983d5f4 140cb5e1 e2c0f0fa
+    b0c1212c c280ba54 c3cc627e 405ce0b6 dbdfbe83 444bd65a 787ca46a 7a89986e
+    70f9765e f46bb5a5 cecdfe76 8fb019bd 547ccca7 db5982c9 5a47dfe0 27ce6924
+    0f026ff3 fe25d2e2 3f30cb1a 78e6f767 8274b27b 95f4
+h = 2a58d44c db39202a
+
+k = d54259f1 b9f7c097 25a2b7af c6c2a430
+m = 5c930cc7 2414e590 10077d42 3a532c1d 98c2f0db a1363392 7fe6826e 3bf6ec22
+    35567a05 6eb4e728 2579fda0 3ca04c96 b49d2bb9 d1163740 7641b249 3d20fcd3
+    99e06d20 da4943ba f20c7432 f8528cb9 0e07e22c ae3a7e9d 8b5aa2a5 2c38d0a3
+    6cfb5eb7 de6dea00 1bc1dbe9 fca7f652 e8d6a21f 92c970cc 5a67c78d d067bf4d
+    966027d8 942fcc5c 468a24ba 1dabe07a 83869193 360fd563 76272de8 46d420d8
+    763a72e0 0c28bc74 7e585daa 900b4ffb ba92be3c ff34fb4c 4ecf5b33 8ab83fc7
+    4d87865b 9b2e7d8d 61897804 eaada3f3 3d010adc 2d9b3e2b 3a5789ae 717e30a5
+    7a165933 02a24951 56c3fcfa cdf36611 157e4068 dfb599
+h = 0f9f42e4 fd4cb352
+
+k = 0f072d21 9cc5947f b6c809f5 5a644321
+m = bd01af52 33881b76 d836fad4 ef8541f4 245c4036 96919866 4f3c4bf1 c81f965e
+    68bc826a fa5e37a5 2d7768fc 693bb5c3 803738c9 3b46f015 312c6329 366f6819
+    e9dd57c1 7ce396f4 59ac34ea 8c71869b 52f1562e 98792a48 1e92d447 0e3d84c6
+    977d954d 64849dd4 1d4b8eed 556e2d53 f84dad03 f91b1355 38be167a 7b7b52b3
+    72f66772 2d537e71 ee1d3dd1 9c4af884 5af3974f e7992067 0d45a6ec 4a30abce
+    c501754b 6623091f b30b767b 786e52da 1ee38691 1a561e4a 7b3c7cec 52e38d18
+    269fccd5 4eab9640 c3fe0413 97c5c825 fb8e8127 f1800ee7 02a4a6ff 0115f09c
+    26469211 3c380c6a 0bd40428 114eb57f f27d12fb efebbd64
+h = 90ab5145 de40725d
+
+k = 4c0fc039 ba5438ad cabf2770 c0ac06bc
+m = 542776df b529015f 203fcd7f daea2769 6158443d de5299a9 bed14ac4 a1b1cb13
+    373746d2 62152232 1d94b4e1 793571fc e917ada0 6e35b5f9 cdad418c a388a8c9
+    dd0013a2 39fafe4a 9751eaee 75b38f21 ba1d0c1d fc67e2bf 61df922d 01e7b89e
+    7c04b585 a43ab099 8f400922 b90ba10b a5097f66 6dc4ec74 4e7f0c13 7e32a130
+    8fb95463 fd803d5a 6266b396 a6585511 956d82d8 15d71d78 f08a2398 b462ce0d
+    3c807493 d36276a2 567f8166 b51c7768 a740da5e f404b947 f342e37d 12cee6bd
+    c94139a9 037df82c ea58b6b4 5da46040 b5691968 5a42160e 4c847baa 06e06b5f
+    57d6398f bda8b0ed 2441f7ac 2832bc00 5211b534 dd5afe53 84
+h = 499d26b5 9334d3f6
+
+k = 28e8ed85 44f3c1c9 42ddb8de 846ea6e2
+m = 387490f9 d7550801 3396291b 5e3f02c9 1f9da821 86997d39 8fac6bf4 e9a329b2
+    48f3dd2f e02ad853 1bcf0495 c4af349b 9f2ee73a 489a811f 8068f256 83e4d1b7
+    80b95b83 a846bde8 e05ce367 36549c96 2d0e7b8e e6880e57 b334a120 16fec9ae
+    89799578 1db648d3 7edb9f51 ab89c817 88fb90f5 a4cd7dde 81be4c50 aef0c9bd
+    f3bb1a47 9dd45f20 b6606ef6 5c8d4047 04ac75ae 1c0816a7 59bfe9cd 85261149
+    2e2eab7f de0293ea 50991e71 74aa10c2 e72637d8 76a42d2f 9cc916fe ee1fd64e
+    3e5bf45b 67d9d85f 9e0b93f4 d3de954a e140d2d6 7fae7af7 c66cd466 e8162132
+    1c094a4e 5a757a36 44f32252 669248d3 e19f052d 70979302 4580
+h = 96d90583 87bb10c5
+
+k = 5747af45 b3401ea1 7b43c59c 7d7c3ea6
+m = caeba9a0 029e7e74 673f768b ddc23031 e5c0c5eb 2939dc72 a346f3d9 a4fc5486
+    12833dc4 b302fd80 b2a3e995 02b68234 95923c2f 199f11e3 5b83bf6c 6321deb2
+    72fc666e 8d8aaafa 60e5e3b9 7fda71b3 7182a167 82773436 e0b53708 fef7ee01
+    3d099803 1383b294 a170186f a561e44f 169d5634 a821c368 8ab85474 2dc7096d
+    86362bce 1cbbd5d2 d17e8c6e 9daca16d 374c4ecd 372b3e12 5a2e1cab dd23d12d
+    95fb1996 101fcd98 116c2ec7 8a03b95b dc832539 61431d2c 624def70 2b1ab7c7
+    bc17e342 64309409 a87e638e 070b6a8f 2290512f 0794522c e08b69e4 ac467130
+    62aa27ea 6f8c99fe 12e13654 f5405532 9de852b3 834d4a2b cc36ff
+h = bee92f9a 1ae9089c
+
+k = dbcc8dce 23caf06f 1c245c71 1e42574e
+m = 1d7f3004 9b93df48 8e2e9171 7a169007 33789d23 672017d7 0adb1c52 ab1ed5bb
+    e35b5be5 19be511c 2de69700 1f869c71 c0ca780f 1396cbfe 0ffb8fe9 a8f1f1e5
+    94869858 a1e5411c 77c8b309 defcb733 3c5bb185 a29a4ebc 31d99977 6dddeaa4
+    8a3aa6d9 ba916f63 7456ff07 b91aa692 da41f125 5c4fe65d d6311bda 0c019e66
+    4e404862 95f00101 44081685 413705e8 a9d1f3c1 6eaf5b4d 277eaee9 33da500c
+    58dee5c6 a3966f65 f4034a5b 87491ff6 39c14eaf f136cb6d 4ade3fb9 6c17d1ab
+    ad6c854f 8f08af99 72f0ac32 68e7dc47 7fdeb8df 37909e38 c1ff2a65 1f9e4e60
+    434a3e05 6e09c33a 8979690c 7af08c31 30d16672 3091bcb9 ab8acc72
+h = 89a8c7aa c1bc9f67
+
+k = 3c40f99d 5afd5089 533f835f a60e3c2b
+m = eaa153cb dc4d4ed7 99261827 da5a0f29 66dd9532 1ad784cd f7b7fddf c60d0e6b
+    25d78c05 dd3dd405 5da21573 afb950f3 5f3f79cc f7829510 57888efe c359d43b
+    a9208b17 83caabf9 5dc587d0 b378dd50 c73a388f 00c93bb6 886df19e 5c4b348c
+    5174c549 003c088f e279fa94 fce2eb60 1fdb4d6a a2445cb4 3d0cca19 609ad401
+    8e4fc785 71124d49 85084e3a b4b817f2 6e440fef 2db01370 433a4634 42d3bf9c
+    c989ee74 d011f157 cd2670bb 43ee4ffd 7a152b66 8de43185 7741f159 c9f17075
+    e18f86ca 797b5098 58ade35e 1ff4e186 201b696c 1d127eec 85469840 b2a96ed0
+    e1164597 7f6d7e9a 688ac7d5 871ec416 2be81591 0a72b4c5 2b915403 ac
+h = cb258c80 c9691ad0
+
+k = d8d4d00f 80e126d7 c649d301 06f54c5a
+m = cf56d934 e0c1f919 67bf0007 0af8c4df 936f09f2 51c4d27f d4cbb72e 617fe3ed
+    628336d7 9386a59b a5036af3 5ee666c1 69fb79bf 7ccabac2 6e247cef 4cf6ad6a
+    7f301ea4 076421b7 f0c58a2d 6cfe1a7e 2620f2e9 6d661aa2 200f76bb b4f3ae1b
+    d00f9326 7a4a8836 4da3a8a0 003bfff1 14ad3500 8129c199 0d46a14f b3de7594
+    e8ceff05 9ada6014 28b487bb 8371097d de411ab5 813eb68a bf14754c ab81fb2f
+    aaff0b6f d94d6149 a63d1f21 e7726720 5b9e355c 161c3483 c139a255 2d8b79eb
+    4889a58a 39400d7f 5d07f1e7 89b8d8c5 40bff8c1 00898f48 a42f54aa a3f7d24c
+    461cb778 854b0f7e 012ac056 ee6ba905 aa806746 c9f6042d 838b3fc6 ccc9
+h = bacc3331 7f5b9435
+
+k = 2724eab9 0f4081ee 7def11e1 4f6b3740
+m = 5c84a7e9 61932894 b364fb7a c904c751 d05ba12f ffcbc75d 838344ab 53331752
+    75ee59c6 17b529c5 575bcff6 07e4988c 8cdd6bfb 7f98d4f9 0298136f f191342b
+    b658b589 6c594d3c 0e5d0de5 0befdefe 429d8881 f3abbc4a d3f53aa4 5955538a
+    cc2c8476 d52ca7f4 c9a0d584 39267fcb 05e0e290 ed5280ec 7c78c6f9 c1fe0569
+    f0cccb2b daee6d5f b32484f9 cc6f3d40 85157d30 5148474b becffe00 64b9dc6a
+    3a4a802c 90d9aadd 98c13c56 718def28 0a76f726 31117cf9 27303c9a 97829f1b
+    b2ad12e1 282fe32e 18e73e6b fe2b043d cfff9d1a 1626c691 b29d8a1a 9ba80a17
+    8f43ad71 443c0a76 ded26953 2a5079c4 d878b9f1 f6dc528e 1152c887 1d00fe
+h = 2f187d34 154fe242
+
+k = 66da5462 f71e95f9 bf95d89b 699c49ea
+m = 316551b6 9a19623b 1c06624d f8aaf5ab 7565b4ee 008eb7a0 f91cd891 50c8f586
+    8bed04c1 b40e8923 c76caa7f d75dc24a a141ed75 c17a331e 70cca5f8 ed446ccf
+    fb9bd1fb 077122a6 7adacd7e cba24efd 08d40bc1 e840a0f6 97353740 2dca53f3
+    8652f272 c6bc2af3 10270119 ff1bed53 115acc7f 715a277e a8b6a9d5 8f0da7a4
+    b5280099 58e81e30 81b664b3 4d8952c8 73c5fa00 e634790e 4e0004ea 5c9bdef0
+    3a0e3664 d326b9bf 7cb57a31 28fcccdb 6b675319 b32b30bd b9b79e5b e5ed83ab
+    5c964a63 c4b87a63 64e08358 f196839b 608432a5 6287e7dd 59cde57e 9168121f
+    e36db43a a82c93bc 0f8c7af5 566607a0 a83e8c5f ca389424 786c4415 8e8b3d0a
+h = 7ebbd968 47ad9439
+
+k = e1344cb5 d7349b08 16e01650 2c2022a2
+m = 7f116d69 bd480932 d5d293af b43e595c c9a84271 d071a71a eb2bbe93 7f4e1a23
+    176bf937 ba725b39 20380686 b2579639 7a4b47f4 cb6e2d61 76d48eef 88619400
+    a2ff25a6 86856578 0796ac2b 8408f445 f0b4c09b f4569353 96bdb474 225bbb15
+    29a7cc53 41904468 0abcc21a 8809dea0 641d6b01 4da54445 1a2b1c95 c758211a
+    4fdaa35e 313d364e 6028225e 7dbe10b5 5cbcee78 81430c94 c638c91e afb795a1
+    f3c86297 87997472 de9f705d b17c227c a8824fe4 ed007251 6c6f2bbf aecea8dc
+    72d0cf1f eea69ba7 9dd9278a 3e677061 435a3d8d beeb8284 d62f5bcd 3327d17a
+    9c61fb07 b41288bb 9628c843 b7715f54 a11ed718 0144b9d7 88cae3e1 835193c7
+    e8
+h = 37e37128 4c1a93be
+
+k = 38149cb3 450977ff 102a7dff f5543962
+m = d8390272 a543a762 1b953808 c478ed99 79ed0eb1 735a553b 234ace3b 76735b43
+    61859645 1d97b193 987dbbcf f4bc1c0b 8948f5f1 66037645 3b205b13 49cff0a5
+    dca54add 94fcc304 a5728210 972428b2 de91169a 19359be2 65956e1a 0176c37c
+    51348619 9b8d90fb e36c10eb 4ee80e03 56e7030a eb9ce794 cdd69aa8 5356ef9e
+    4787fb2f 8aa99bbf 3652cd94 2506b4cf 6b80814b 63b1ca95 9059d965 98a28353
+    c0348f62 da3f7cf3 5d0bedd4 1edc33dc dcdbf2da c3b98416 f971a50d 82ee28ac
+    5cbdc8ec a68723a1 861e72af 701e5ba1 0ea10ea7 233d95e9 c60f2c95 b6fa6576
+    08667c62 9717cdbc b0b63e54 d0b1da3e 1a5d5a3d 01b02df0 49870153 e91e65cf
+    c972
+h = 597c095f e95e6f50
+
+k = 19a7431a 7a3ba7de b2ea2a33 83589e6d
+m = 611152b1 60747507 7111b8b6 1c2f90a0 201f1798 cc1e264d 79735d4a fc21811a
+    06eceb70 17544d9f 296cf300 5006eaf1 50effab9 e37e6790 a66a0dde c4c14b0f
+    632571fb 1e485bb1 f736230f e8f9d038 ffba72f6 31238630 278a6fd6 142a1ff9
+    3958e1a8 5880ac34 a28dcccb 2c1f2102 7bd9d3da 72dd3003 70ce2745 37930d9f
+    72955203 c0d02d59 9d663f6e 17c86646 815320ab d4990533 51d7497a 678e8b18
+    c8a6f47f 098e63ea c249bef3 98ac3112 02ceb747 3dfa8320 18c0dcaa b5121103
+    0f5f6d67 3991d017 55d06a86 9f6b8068 9bc2fbe0 dabf1f98 4c503786 c934ce0c
+    fe53b8ae 76d1d6ff 7e08f378 b53eaaee 6522de21 12d291cf a3953879 3c8c3518
+    3f1ced
+h = 98b389b5 1f2f6fa1
+
+k = 1f90aa2f 2ab09bf1 c8b4c6c7 1614466d
+m = 96947d02 abc84719 d866a482 b217737d 329266e8 c2375867 f985649e a54869fe
+    3db9842c 1775d826 606e3f4c bc889f3b 04c7ab92 a6907a11 a3b1bea5 73bf8f71
+    7580ccfa 07feaab4 7d56cc5b 24e4cd54 e199d5f8 f479455a 30b9a25c 28c36d5d
+    3e290cd9 89c8f94a 95923d41 4c056161 53b82561 d83c080e 7af56ed4 1be8cf85
+    d793563e 733a0e0c 4fd775d2 f7252698 949fa344 ae14c4a2 afc833ce 9f26198a
+    d974f81d 83dd05dd cf9d6552 65db8a0d 9e600176 56764e9a dd9ff843 5e684e2f
+    0a1e8fc4 6e365db0 0f61bd7a b5636fa7 946ffb8b fe4a5838 4123657e f3fa3a59
+    d66090da 437c0fd4 309976d2 39cd73f4 a329d4ed d9a2c1c0 215c86b8 0839af5f
+    f6ba819a
+h = 5a30ee80 2fe6decc
+
+k = 55467b61 c63b50de 9957d582 5403e9e3
+m = 232d3bdc 15dc0bcc a3c2e42c e16b5aa0 98d4e855 dc5dee48 4dbb0c42 b8f284f6
+    443bd6f6 68dabb28 5275efee 93ad813a 14509991 9fff877d 5231c261 c8cd36be
+    bd207c80 c070493b 38943391 b23907d1 e81d911d 9ca2771c 5ecd0d66 aa6b1834
+    83735de2 76f5a401 cb38c047 528d5e6c 8cf39c8c 31f51d48 d419d7a1 4d1b4fba
+    42778049 fa3b4849 0923750f 6a9397fa da76bbc3 5ec0497b bc849e5b c8f659a5
+    6110a9ec e5b2b737 9b074019 12e0172e 1dabfd0e d88cb231 ade9caab 4bc785db
+    768119c3 bef3b2d6 24b8fbcf 08773b47 c8ee0015 ebb87e11 c12e72a9 19344fac
+    22dbc154 e1b7796f 5bce622a 83dd48a2 a52c9ad0 f2e00dde 69bb4808 5ed65053
+    9411c739 f2
+h = a46faea6 16fc82e5
+
+k = 1b4ac7a2 c6b0e0bc f516dcb1 8bd5d2a2
+m = ce6010ba c2208e5b 57af5382 5b3b6d50 77db50b9 51c87d43 56c1ae40 ff6ce2bc
+    12f14837 cebfd1ed 46bea610 4d440170 a1a8959e 5f8c7d8c 494e583e c9dd4d55
+    c8c12075 af547186 4fca9bf3 b0a6e102 f7a2d5de 0ca0b71e acfdb632 86bad8df
+    5c199e7c ed8c244f b2525d7f 09ce92ca 194814d9 4a42153a 91b1e31b 8a3f5239
+    1a8e5357 78bd6df3 7c09219a 5a4a89d1 382867cc 92c2fce7 44315e7a d9e48ba5
+    1e2e38d5 eb891c05 a2023769 c7ed0749 157c3c68 7a0e5b4a 6988c8b0 57e4fcf1
+    6eccba00 a0938312 736841a9 4df2e7d3 34c79d5c 0de49d23 a19c74e6 f228f95c
+    67f9ac00 c62f6fb4 a0df5379 f46352d7 869c67c8 41142e40 a42d837a 9feb546d
+    1d65d61b 00b7
+h = 56b1a66f 9a75b7e6
+
+k = 4364260d 1b590389 16a60ff3 6f6c2f56
+m = b1b32db4 4f8e1ad3 bdd3c9e0 854bfea6 2c8e9aca afe61ef1 bc849821 52bea796
+    ec2a04ab 40340b36 0117bc15 020a43f3 aa0fedeb d66b1e08 458117e8 a2318170
+    d54936c5 83b53268 e21d9089 33c5f32f 6e35b87e 870f7c91 5e13363c fe2fe6a0
+    c9631084 3b0d5a90 d363fe5c 3f9bcf2d b51c874b df61dbee cfc87baf 42db9372
+    a8cd6408 f4921093 6f3a359d 22740066 75be9723 82435311 0ef2cceb 9f784f61
+    9b84ff0b c2674e1d 19802e22 baf103c0 56261acd 05ad13ac 8268f4d6 2b51bfc1
+    0f4052d6 d8427c57 cb055f0a 9abc6f39 9bf75aff 7a0b5d42 a984897d 7b20049d
+    6ad59462 0d03a8ab d74b00f5 b18cab6c 45cc2086 ae54ee70 4cf6517d 188b61bf
+    89494df0 8e2b57
+h = 90f4fbb3 c2e04502
+
+k = 5e435f9b ed375de8 0954a258 1c941956
+m = e381e25d fb18a54d feff6021 0d3f7cde c2d1b872 9d94714d d7230c6e cda510ce
+    293e5060 24f54fc3 9060a3aa 990d69a2 8d2a2edf ac99c059 47a28767 15404548
+    6c510af8 0f59baee 72109064 97d3ed91 4db3e3de 6d23b42a c2e33bff f45f7a9f
+    f4a82e48 fa2c5b0e 893820ad 4900eba0 a8f0c0a1 6d76803b f01bc6ee 56ebdec0
+    d07f3cb4 71529540 06e9818d 78e37d6f 840dbcb6 17642488 b74cd13c 2dd86ca6
+    d35f9224 efaf1591 19fde8e5 7d74f89a 47cbd374 e83168cf cee1e363 36d3ebe4
+    eea9fbe6 8226df4b 1fae3a5f 864ecd70 11d1a1fd bf417b95 9d0e3a2f a34f9af4
+    1f39226f 3a633489 f24b9bc6 74e92650 3c9783a8 b8d19731 552df2c2 82138259
+    d8356fbe c6308c59
+h = cc90b36e 4e7c2ed3
+
+k = b63c4679 a3efc13b 69811f11 b36f32d7
+m = 20bdd4f6 f4175e73 fe5a1791 ae6b4dfc 012645fb 7972f079 d25753c3 34f65418
+    f7b67027 7829f649 6209bb4f 19f1d334 b55be565 c0ef33bc c270693c 9a200308
+    dc8bb2df 88486ee8 e773d7e4 2e761e46 d403feab 7d4c4a58 0f436dda 3dbfecf2
+    56af005e be91b65b 300e5452 81ab48ba eb06cee9 116fb8e3 eea7c12e 04cf2262
+    590f7da8 c5779246 bcefffbe 78ebc3e9 350e9f0a 55c504e5 eff46429 5eb68a5a
+    74cbc764 60ca45f5 7839273a 42dfc41d 21614816 a46ab213 fcd7ce79 e46e6600
+    a11f2af9 1ea9f3bf 6f319cc1 7b6dfa6b 573c21b7 a5dd6c90 c1b911b7 d44628b5
+    a30cbc73 d5d38523 129039c5 9a1bec78 d9379232 768ce438 3826907a a7237301
+    cef888e4 0851c30e 3a
+h = c33b2c4f 91eefc82
+
+k = 62ed25ff c0de7782 ab5e51cb 4e21ac12
+m = debe65f8 219c4a39 f4f66588 e3b5bb90 93d7a770 fbe8d720 bb7e6c54 6ec9678a
+    58011aaa a13d142b f82fb293 2cb3ca4c cc4bb39f 5785bb33 216346b0 b809d91c
+    1b1bc4b8 cd5bf3b7 73ee7cb7 06608d23 48e5452d 446bd0f4 997edb00 eb318a6d
+    14cad0c3 f3094969 f01c27c3 2bb28388 c69c4ae9 db1e20f8 bc9075e3 9b7e4244
+    d921d3a5 f29656e8 f4b5f32c 7188cdf5 d849260c a71969a3 498b7837 1953465d
+    269ac3bf 46cc744b b6fb78ed 7ece4bb9 06e07064 96c258f8 eb92b3d1 fca356a8
+    d6d88df6 fc2242cb 84d6eb4a b61a4248 363a7106 01ed5058 7d12beb5 1ca5f057
+    895f4b53 e585c04e 52409d8e 965b19e2 2c9c34e7 678b8bea 923ba721 9ac074c4
+    d3dc5ce2 cb7f2fe3 de07
+h = 68a5c052 7189d80b
+
+k = 9f81159d 105cb996 f2e71c07 6ce4d230
+m = 2a99913e f59b4290 1c560dbf 71386416 53098953 a9020d37 a0c8db8c 6c91e9a5
+    31b5a819 ad6d3518 fa65c336 e9aa4088 f3e87776 3a42478d 48566a06 ba642b9b
+    70bf4b69 a561f319 c8eae1d9 a07674ad ffc29d27 f468e549 c97b19b9 805dd1f6
+    e2ad285f fc634b4f 97977d70 04da57ea e86c7f3a cf774f91 e4fbf037 d8a1a20a
+    73308b5d b4ffe6b2 f43a5d8d 7c0603a6 7db3bb47 71a61061 838ea4fd 8ecc52cd
+    b4af9693 3e3f870c 71052246 bb27009b 69f7d18a 31490459 9e9f03e8 1dd57f3e
+    8b949a50 a8c15505 b9bfe73e 6291e325 2a997f53 9b82b213 c4ffd27c 075524fb
+    ec8916fa e8dd3ba7 4adda0ce c00cc15b f57a4531 9f72ec4e 6a1d0dfd f923cda7
+    dfa39943 f6d46311 2bcb3b
+h = f5a29e79 7287d4fd
+
+k = 83d009e1 64af2f98 fe26c7ac cf7baac8
+m = c3951a3b d4d43e49 42b82339 4bfc5ea8 70e19644 eec6a9a4 89090023 128c44cb
+    758490b2 5ed537d4 dd602db7 3238c71e bc3557cb de4e3281 23af9e4f 7c2669c4
+    33439019 13431207 f2a28379 5a214cfa 432b880a 0cc4a218 90a429e2 a80ddfe1
+    6621315d b4092c50 18826b62 cf4f3e95 183c8900 3633ca46 4a4e0532 191dd987
+    c8f7c80c d1542cb5 5ad96873 438ee345 a1befb58 19264f4c a410e31d 7d9c89d6
+    3ce1a445 9b6e70a3 ddeaf3d4 c4ba5084 6afa7e61 35fd9877 50b4b88e 686ebbca
+    2f507edf eaf8aa26 c4d036f3 38ef30e8 37f57120 2d20c87f 0a27325d 5969a435
+    0487fa2c 34c96b2c 6d4b1b45 ba9182df 57c46406 40c448db 90841f19 c80fad67
+    a45b92ae a797b1ef 52c34e23
+h = 0c2480ae 7a50b4a8
+
+k = e9c232c8 296b2ed0 b3122c65 92278ba8
+m = 110fde8a 495e3f79 2b6e24b5 5e7d22cf 620e0f56 829ac13c 9a436bf5 4a1100ca
+    0a756ab9 85e55d69 3dba60be ca1894cd 03ed97e0 798cd7f5 f3450cb0 687c8bed
+    284b3bb0 9745def7 9c0fa405 d830eb15 c7cf729d 034e4a34 7ade0fde 5d8e79cf
+    e2666597 54e61e30 af28f385 072ca2b3 7c1510d4 8a9a3c60 602521aa 8447802e
+    8af4255d b64ec0a4 eb0f992f 2c771aab 49cecd08 3a6d1f21 30a2400e 1c63cc67
+    61374541 a9a6e75e ace09029 a5c9368d 9f88242f 07865f25 2c5579d9 d4de8f1e
+    ba9b45e9 947e5511 001b9dc8 c752e77a d9e6eabd e030cde5 b5a04104 2ff96c00
+    b7355b1d a2a5cbb7 7608d31e ed6fc739 c17586a0 50c470b0 1cecf442 3eff7f3c
+    8e5656d9 b2a1820c 79d142c2 33
+h = 7284ed53 1ce1d2fb
+
+k = c5bf0c51 87cafc98 c70a7506 8c2aa736
+m = 2417f734 2fe1ec3c 1d1f6876 bacf09f2 b764213b c0037e84 5062c427 3d60550d
+    ee1bf717 8c90a5e2 c3ac93a8 e09fab93 a7dd02cf 44d52579 bee55197 f15c5420
+    a8f01b21 55f043f0 bcc85087 59758491 900b7028 697e1d00 f84740fd 2f4bca61
+    7529eceb c330412e f8fcc5cb f3b5cae6 f7d180b6 cce70043 4c42ffbc 2b66a415
+    69107b32 ddc1cc1d b4819f54 0f745938 9920895a 2bbb0f01 c3a99e34 f001677d
+    22be83fa 0e892519 f6296109 7b194b40 3dcf1eb9 2648cdcb dd0f95c2 d5cdd39c
+    a693c0c2 48407cca c0b54aaf 35d5d424 fa4fc53f fdd44695 0fb16f4f c2f9dff6
+    77eba9ce 0729a647 a4658a08 4f19e648 ea7142e8 1f70bebb d8f00942 ac8bea75
+    d4013aa8 1d5e6877 61431cf2 378f
+h = a903962d b48c93cf
+
+k = 956e231b 3f721d03 e7a63558 82e6091c
+m = 777b3b1c a6a304c3 d5c877d2 37a9ed44 0886c989 791ed714 995b75a7 847f8007
+    82d40052 421d4854 e60e67be 4b0dd7ca b08f28bb 7e9a9c8c 3dc40205 f068102c
+    02ba6a4a f8177c76 daed4df7 15200ee8 11565533 e87b09e5 28ee67e6 744181a4
+    c3d34d4d b0d36fda 63b4e8cb 42f2d22e 6549fc81 cff8b649 17368dd6 46cce47a
+    7e5ec7ae b15b17f8 c48a3689 a6e11a16 2e9a0c72 25cae09f 5bc1df08 3eec3fda
+    056812dd 978c9693 f8b4e473 2eae35ec fdf487fe d8c644e4 4cfc0d8c c3aef44e
+    84923b95 df034288 590289f8 8bf8ca69 8d2fe7ab c79e5657 5777525b 67ae2e31
+    2d13afba a5dec6e8 3b4c4829 01ac650a f05e1030 8852329b a1073706 36f208bc
+    9ceb8ccd c345362e dca0e8e9 9f8e10
+h = 76d3256d 5743226a
+
+k = b1688e9a 148b0909 08e80f4b 1577ef8a
+m = 07ad3138 38423d48 5e9dabe3 124e9dea 54f702b1 11a95198 39e29f8c 01ca377d
+    3876c7f6 321f0698 2aaedc18 38ac9306 f3d1e221 00768482 27fc4cef b588adf3
+    cc5eb96e 1530a8b8 5f0cef23 75bfdccb 5f005d67 aca07fe8 68eb55f2 f7d27d0f
+    c8940eb9 09669f88 2aac0090 d4c41b9b 98f90f5c b5a07a65 7e227b87 7fcccd16
+    c7493275 a39acce1 695558d1 ac15e401 202e3975 90ed635f 380d1395 9081d810
+    a461ce95 9a7e38cf 64cdff8e 8078c0ce 87dc4e04 760a929d 831273f6 4166bed7
+    67991753 c3e1b66b e57f8dcb 3186a32b ad37ab2e aba7a377 11a01ec6 88dc3c63
+    c87ec399 2e424e80 74df115d f89c3320 9cfcb7af 4e8ce015 c28bc665 a5f2df30
+    00ebb109 b46cb083 18526671 02f713c5
+h = 15befc3e 935affc0
+
+k = d33ade88 070b03d9 5a755be9 811f9d33
+m = a99e7480 2130bd57 4df04525 7e9b3a57 c39ed4fc f21931e2 c87b3757 8eca8b0d
+    f844b285 793bddff 3dcafd59 588b410d 59729424 c0d6812c a7487de7 9c8a329b
+    3c9fb596 4d15bac2 6f73293c 197dd7a9 4282f3dd b0dab002 1ab8bf9f 84c7b2ba
+    ffc3d72d 7c77eef2 63bc64be 6a39b99f 2fb27d83 dd32bd81 8ab09858 25031a74
+    7fe0fe42 e9a6a203 1b3765a0 33e1c64c 3430fafc cfde4486 600c1444 6ae440b7
+    ace55d4f 4cb08370 724b820b 2d04b02e 3af9cd1d c6d4bfb9 6c015120 854f3ce4
+    bad3d7de 5cd2b4cc 3af9d3cf d03ba611 bd6c5418 a25c96fa 329cd6a0 181e1dc5
+    1c09ebf1 46c5e85d a2c9a658 98c626e4 a46aab51 25b1c265 1bcfe473 ad3da1b3
+    db2a3dd1 763514e3 8983b2f0 4b420e66 c9
+h = d2634b5a 25726795
+
+k = da4e82c4 1f529cbf 300098d1 e522cc7a
+m = 9bb5912c be1e3412 b29612e1 16fc65ef c430280b 4ff54295 d97f795a d7901824
+    6271fc26 08065602 0f49cf75 99d28d4f 4e48cb8e ef94f69a 03a9ef5d c444432a
+    48f1d8ef 2cbbd98d 7e84ff7c df0944bc 3697ac11 809565fa ccc7723f 8ed755fe
+    3ed1d537 bb5a8219 0c04f3da eec3c7fd 640275a7 69fea35e 4b791209 f9efd155
+    52abd1c4 1012b530 99732bee 2796ff16 d89ef360 5ef46073 75753067 c6941f93
+    d3c375be a17e99b2 ab9cc99a 1a28818f 73a2b6f0 158c5c71 362a5af6 dca64deb
+    6d0d36f0 fac7e74f 775d186d 6c6cceee 263ab76d f2fba61a b57c1184 00b79273
+    9b791c9b aebddb74 b8799119 b62415b5 ac0c6bdc f50eb25d 4ff4af46 d7961a82
+    16ef1678 832aacf7 f3638488 3b14b7e5 ae01
+h = 05187c33 160f548c
+
+k = 8a5d4ffb d7144446 d7cf997b 2a049c9f
+m = 7a164679 4135b02c 3dc819ba a88beaba b0aabd0c 40fbbcf2 23e0a666 39315ec7
+    1cf61be9 6dc2ab69 cdc53eb1 3354c5ca 29888ac6 2f32cedb 242213b7 782e4c96
+    fe838eac ea13fcc4 d625c308 936c0020 af5c6036 e5ea5431 3ad27bca a7d6fa9e
+    79c010a4 aa96bcf4 002f17d6 0a8931e2 016b069f 56f523bf fdca1c03 a473c1a7
+    4eeaa8f7 9ed41a26 ea569149 80326564 1a67f313 9339f535 3111e5c2 27d3436d
+    33c11e29 3a1eb274 153ca3cd 160e2e03 d32a2d0f af47a1d0 0cdda16b 83bff8d3
+    6b806977 97a06746 37d67bc3 e57a0174 ad04fd35 d07a11ee f1d4c7c5 2f418d9c
+    6f56bf35 6a75be43 8fe8e55c b63d2dd1 eef7d19d 7e97aab0 92e580e4 c01a6f0a
+    4acd374a 5af7c893 f3ce7a8f 673036ca 524620
+h = 6c6a92ae c2277445
+
+k = f0e81528 39e2b1bc 96b268c1 7acdbb0f
+m = 2c757393 2aae097b 078c5614 11b82881 e0e14044 8c2d078b 2c5d747a 70a6d0c9
+    e340ade6 be90c7f6 e9a93e05 6342897e 37fb0d61 1142d171 592c0d4e 291f1925
+    9a8ead87 872b2ea2 7beb43e3 47675383 3f667248 ef80e19f 3756e91b d9e5d409
+    5025c67d 9240e28f a5b10f47 28e9bdbb 58877bc0 c47ef20b 5659319d fac81148
+    3a05154c d60570d0 fd0545cf e8fafcb5 466036e7 804c1ffc acb9a442 0eb92e60
+    c028ca77 296933ff f3cb7d94 f24da3f9 0464b664 5c50b2c7 57f7a792 24b917be
+    53e2ab82 985c6103 cf916483 a9e75fd9 b2cbd339 655bb9d7 be5df86c 9458e666
+    023f4ffe 0991f1b0 2000734b ccd693d2 02b13f74 c6c3b356 affc87d9 d4516195
+    97f6d53f 702845aa 92880f74 72c4d9e4 8f0b9c17
+h = fc879fa5 76a5e3cc
+
+k = 885524bb 6ba9f687 b5770471 1ebc4f31
+m = ef11b7a3 c046a7ab dc59d724 73557f84 99c96c67 37fa4ef5 51511caf 01565121
+    fa05e267 a1f802f0 33db0298 5c7d83c1 4cb32323 0d0b8cef 2b2da29e dd56c316
+    d621e8e8 a4c26c29 6abe4156 67dea1a5 b6ea36d7 e9b781aa 76f24046 610e3fb1
+    a8da44bd b8395fa8 bef1f1cd 528b6e8c 612a6e99 c0d5b564 92cfe7c5 31c9bbc7
+    78753487 718a8d2e e3b56866 368452e7 543271aa bd731908 fa98d294 e50eda48
+    f251d20b f405403f 6ed8becd c8a36405 9b26465e deda1026 ad3d849e 9cd1c0db
+    efeba444 95c15aa3 6ec33cb0 4c4c2960 dbe4c4d4 5e836249 3c55f988 9d56a126
+    3e36a809 70570abf 5fe03c9a 28d2958f 6bc2ce33 fca6e9ad 8657d1eb 410c0547
+    97194d66 eba92d0e 0d39dd63 b22f9e18 195824aa 56
+h = 5cc44cd3 c6fb93cd
+
+k = d88d287c cd9ed23d f6d9d235 92cb0e0e
+m = e726bab4 e5530913 88e4bed2 01fc6728 831dae69 4cc84f3a 6a5561d4 4ee72ee6
+    6925cbbf 39154fd4 545e041e df2fc1e4 2ffb8df8 90ae6f87 e70a6cea 75022e48
+    81762a72 7091704f 0debe34a a8719c37 82cfda23 6a68d2de 09dbaf35 155dddf1
+    10fba5dc 2a29562a c96339fe 639162c8 3f7b7530 095823df 09ef6baf ffa91175
+    67373c8f 968b0d93 38d26e43 530042b6 432f7964 56c6f060 88dab90f aa3102b1
+    893f0455 1a26c14f d133bd21 0b6083d1 7a07a5e3 d526359c ec1dd31f c0573073
+    6b15f6c8 2699d81f b16ba7d0 7a3dcc7e bea0a1af 250146d3 4aa6022b 59ad68e8
+    8f02ac73 cad0565c 1679ffe4 3f19b214 a94369cd 4916774b 8e67cf32 798353c5
+    0758f4d0 b07bcb2b d111bdad 6bb4461a c45a05b3 ed65
+h = 687f68b3 8ad5af60
+
+k = e22973bf 865dbdcc 1bbd473b a2e3e07b
+m = ac5b7e7c 199f3e98 9926b160 5be1c5ef d1024e55 f5a040c2 3ab74576 f668231b
+    98249b7e cc4b071d 8d3975b4 e67183ad 1fb04bff 6d348a4d 98a76d6c f4f9bbf7
+    a344eabc 66f7a3ca 8f626fd1 f3cdf8b0 90bf7a4b 9122b9f7 796cb5c3 3a28e575
+    61a5b233 7480f1a5 55cfc2c7 79f0c0a4 a4a1eb38 c79cbdf4 f5f82157 5a102790
+    e8626a37 8b643479 1afc93ae 8ad5f218 c7c60760 b6678079 732abf92 dfafe711
+    c9c3ae64 f34cf1f1 9910384a c03d826b 53129b57 e5f5e78b 1da44001 65670a31
+    d48e5b07 bb627ab5 e138669d 5b1b1257 ff8ba245 1298376e 73c89cbc 78a713e4
+    b22f6d57 2ce0f094 955669f4 92326ae7 ea5c5695 4364c01f e85d0663 6d7417d1
+    ecf5839e 7e987e49 57a2a56a 0d6a6f1b af7939a2 3dd5a6
+h = c257e449 b15946ca
+
+k = ff8b7cac fd3c60da 8afc4ed4 38c232dd
+m = e0add807 b6331b65 77394a85 bfec06ae 556ea5b8 bcf6fe89 73492d1f b49dfd68
+    a3402229 7578dc07 04e93f19 15212fc3 f9d9bb74 edf01739 f7e5cde2 37c2c194
+    d28faf63 3a4218e0 2b68796e 49cc462d 282cd40f 602e2b1d d9464a5b 3ef48f2d
+    2e8ddf7f 5c6ec6b2 10c896fb 36bd798b 31df4192 745c906b ae6d0bec d7fbbc22
+    fc089bea 2a8df207 e29d7237 ae602bda f3ae042e 4cdea23e b8c433b1 5979c568
+    7ccce0c7 b63b7938 311c7dbd c68a182f 03cbc138 c5887f7c cc499837 0cc0601f
+    060ec8fc b00d359c d25e5516 6df42605 d4d44667 7ed17c80 7a999465 f220c3ea
+    8de06c2b 7bb41e51 f82fad99 6f04c5e1 3e18f791 ea780f21 b65293f6 9347ae8e
+    42446851 de230191 d63bb733 af543490 b8ed60d7 9d7f24a9
+h = 48ba531d 1c076684
+
+k = 887a54d7 1e316454 f760afb9 29c836bd
+m = 9e90973e f8a65eef 7524f6bf e3dea78f c89348f6 f24178b4 a5fddbab 2d83a698
+    1c8567d2 f5419cb1 813c17f6 b8220a4a 1d42a2ab 196704e2 8fa99510 cccb963a
+    fcba32f2 ba57b843 25967f98 33aca45e dedac226 5da19eb5 9045164b 37bca6c3
+    3fd30987 ce2e0240 bf85ceeb 7f5c1412 969f2025 082b9c73 bc47dd27 89e34ee4
+    a1d4d454 a3772c7b d5ac7b18 d2481079 6b7c234a 57b4764a 598d5c81 f7cb0a8d
+    f8c54789 179b7e15 50279859 bf897a35 3c62289a 878a7a1b 725ef6ce c9208f17
+    61bdbeed 18aef7e8 fa77cd4f 68e38100 738af57a edf84b3a 37927e3d b37b29c8
+    0b4f55a2 dc2756d3 6d4dcda8 a40f47da 84dda693 041b330d ed698c98 5d11c843
+    31901ce8 56e01846 6b29a21b ea3c3bf9 3492ef60 855c64f8 bd
+h = dfea5443 da290e4b
+
+k = 6304fb3c 14deff19 db44113c f60a9409
+m = 9934b7e0 47f671b5 eb94803e 5c1ecaca 1f9d968a 00645f48 997dcfd1 4ecd4a0e
+    d5f1076e b31fd581 96c63e67 b68d205a ae7af01b a337311c 78ba111f 8339af04
+    155b1642 557acd67 7bdb485f 7148b857 b49208b2 a38cdd65 dc7845bf f59eb75e
+    e9f3b7d9 ecb0cda1 f582e05e 13e5555b e6cd6d0d e286900c 9ab8c4ed 75b6075d
+    a45cdb2b 0e63973c 2265281b c8c9c936 e05372fb 04d86411 3f26674a df1f16d1
+    eedb0212 3921fd42 85c9a6f5 77c53ef2 f9397934 6d31ca39 e28f6e10 26996987
+    bc19db05 fa49941c f519df43 6984effe 91550454 3ae97c06 56a29b00 123b7ad7
+    b811093f 8019c182 723717f7 bb146afe 8cf322ae 6ef5b09e 0048c333 ac68ed38
+    4c61e2f2 3de3fe34 ad367cec a119b82f a2e77d0d 59c18831 f28f
+h = 6f354262 ac978c8b
+
+k = e3452527 a0c3aecc c2985c38 433619a3
+m = b8bca5a8 f5858bc0 32b06065 38daabf8 930054ff 08367a82 66c2d7b2 10749fbc
+    6d0d7eef 479c4f87 15f32cbd 282b3fd0 98e265be c55a3b5a f2a02d84 0f34dc48
+    61770146 fda8318a e8ffc4df 00a08c1e 51c357fc 9b26627f cc130b28 17ee285a
+    b15f7b6e 1ca8922e 9595c48a bddcaf33 00087786 80da6657 d8b569f9 b03356e7
+    4bba56dc 773af6a9 ce5b8c88 2b826e2a 03a83d38 1926542c 65e531e5 7268ab3b
+    38b6e119 22f3af94 c3a915d9 f91699b5 d0fbf9e2 c45d20c4 ebe5f4a3 42928d36
+    8b613637 583ded31 6984663c 809b90e8 e1f6a386 edc4a878 6ce13910 c94d4d23
+    b9eaa8ae 212db8b2 b3b1fc33 db003444 3033d40e 0aec331d cec7cc0b e35c901a
+    71998c57 1dca5d4a 31403251 46d97ef3 f4a65e83 d98bb466 efb48e
+h = b028d8b0 54a9ecf0
+
+k = 2244b2dc d3c2b9ac 6a6d5a8e 17159a04
+m = d56ba2d9 a9af574e 37aa25b5 5af439a9 e8b04126 57e13060 d22fcd3e 050f4626
+    e897f5fe b706643f a17f51fe e2ce466a f0f1164b 2ae8fd59 6799924d cd41d3ae
+    8b26e700 525606db 7fd2fa7c 96d5517e ff4df157 185a4fd8 b406f47f c22e4a61
+    ae585440 0824dfbc 7e2b624e 65f24169 0fe1c5a2 6568d668 8c6ea36a 276a2c95
+    18672be1 d4306508 b5fafc65 a3880f78 5bdb18b3 6055d4f0 3ba599d0 1e07d080
+    a7913acb 37b3c611 20a9b6f3 b6a26eec 5deb7d2a b732dc08 f501bd3b b2767bf9
+    0fdefe61 7d55a5bb 6a68ba06 24cdb4e9 3029770f 6672ba5f e05e6780 765b781d
+    29164996 68a12139 d726bb2d 007e9cb3 459377b2 94aa64c8 24c4e27f 582dc1a8
+    7bf65142 6758db12 124ebc03 910037f7 c710f4f5 68b49f34 4f89f49c
+h = 37e45cc8 7c6b5b54
+
+k = 928d2c45 f5a08f52 91ca6ac2 53a3e7ab
+m = 7cb2de0a a2826ab7 505de0ef 66bf040c 115fb97f 5deda50b aec8cb12 e3c30141
+    3233dbe8 6ab08908 8182b3c8 fbeac7c0 b1b81822 c1039468 25805050 00dabbbd
+    fa6a1039 e34e9191 a21f8446 fbb6d6f0 07f5359e 3ffe6db8 33127d21 76c3a871
+    5ee66373 bee1b2ef a2539d17 4d6093ad 7d247323 25bf51a0 1c38d0b8 dc3a43e2
+    82fb508d a7eb0eda d16c51af b991e1f3 01f0e68e 96a38a07 bbddb3bf 75534801
+    ed368657 1c98f24e c318827e d90900e2 c2209b43 91e42e5c 0853d1ee 28bf27e1
+    1231aa2b a50b675e fa99bb47 b07cbc3b fe9edd62 bf15f931 4086ca9c bcee9541
+    602086c4 58db1719 99360168 9ee635a8 d5de0b5a 78a2c185 18ab6397 ea7f17b8
+    7beeca5e 0ca7cc51 9c88fde5 8cbeb837 6104ba5d 53e069d1 62133303 35
+h = 0a459dc1 14edc6fd
+
+k = a67bc4c7 45c808c7 d4d0f917 03b1b064
+m = d491a069 21662b4d 18ff8d2c 98a0025a 570f5252 995e9266 780effcf 90660a9c
+    74143148 aa82fd2b 9fba7c40 566301ba 683b4bf8 66181bd5 842275be f207e586
+    bdb78fff c596fa65 dd28ffa3 dabfbb73 8709633e 716c5bbc 9c38f768 03e8916a
+    b9416126 5f738d5e 6235f48e 1418e978 26c6454c f7056586 8269dc59 0bd6842b
+    d3dde250 b92e298e c0d8e671 5a613f12 59b9c89a 2cd8037d a845db4b fc127a4f
+    7e35f583 7d7fbc7c 3ddade63 1852f991 98402836 23cebf55 191ddf28 5280eb41
+    b74ccfad 3b5ab51f c2391edf c1448ac2 84dc209e 6a48e64b 71756c68 8c3469de
+    c5751af8 e3805c36 8969e7b1 391c4182 9026e6c9 f44a95bf 089bd5c1 5e02aca8
+    03e838aa 38ec0624 1a32ceb5 6995769c 21468b50 2a139d02 f3e60b0b 06be
+h = e40c38a2 e65117f1
+
+k = 21501bc9 13a476f1 e0951e97 ddf59c43
+m = 1408ef9c 21d1ca57 6fd8f248 6ec2ed66 dc0dc362 fcb19a3a b6293b74 8f6c3f78
+    40b9695e f119f546 18dd9bc7 73fac4d4 298d0c1f 366f85ff cafb5230 37e24a66
+    a0fb1209 8d5df272 0abbccbf ceda37c2 62ecd612 d8aef585 2296b34f 1a0856b2
+    2f8f555d 82cd33a1 d03949f7 9d632e87 0924db9e 65d4a733 eb2e0635 e0848377
+    ef5041c0 f9f2739f 2afe90e6 6c6cb20d 9897e3ad cc8b8e1f 86ce6fe9 acdd931d
+    ba794f33 6b34f74d 2503ba19 368d8fd8 3583b8b0 5297db47 ea6f68f9 15b4513c
+    748c15bd 27f98c8f 16dfe4cc 05a7d0b0 c3b0ee44 0f71ad7f 39b96342 d5e219de
+    0e63c3b1 91ead119 a069de2e 01a36297 909aaae3 58aca198 0ae32309 70cee9bf
+    c9f6250c 4618feba 1afb850a 4020a89c ef8ebbac 019a086c 80ab05b9 1809b8
+h = 63013e0f b6490b98
+
+k = da5ed8bc 366010a6 7a2e4f84 81bc5062
+m = bb5fcee3 696b7165 90597615 833bf5e6 ba865d0a 318cc4f7 27f64667 c5c3f45b
+    eb011e5f b8e50f8d 9121c22c 3e3796a6 dbb185a4 1ad409c6 52940eac e3a0b412
+    06d448a4 1be7a927 5224e28d 9fad1068 2525b4ce 265ec67f fccb4ebb 395f4515
+    d2bd8ae3 8038f4bb 727b7f29 f974ff6d 6c3de18a a29531e9 6d87719e 0cbd8505
+    1c6429cb 9e957c4f 1b16c489 79bae2df 2f0a3806 ce68eae3 d118f06d c25ea862
+    cf9f557d ffcda325 dd1388b2 8a790572 7e425068 b234f3ba a6c3f785 6dd8f331
+    0986d8a9 a43e0797 6f681dd0 5f6941ec ec9c5763 5a6b1035 6ec89b26 12ab6d69
+    1782c52c 867d9ce7 a58b02eb 71417fcb 414f400a a034fc6e 56067863 d655f1c6
+    1a9f0b64 64fdabcc d5ec7fc7 a6c57fda 45ef723d ca27ec35 7641cb44 54b991a8
+h = eb071273 263c710e
+
+k = e0e999a8 42d700a2 b4ce5611 671d499e
+m = 6e5f55e2 dc97a0cb 85616cf0 72958964 f8f0ce6e ba5f8c62 c80ade23 12228a85
+    9e050359 993203aa f178e4b7 fcb9a80a c19d314f 489ccd88 d3565252 d5dfad85
+    867a60d9 83a7b05d a51e713e b6b5cfc7 9d4e1eed 47e23413 f61f9de8 96a6f8e6
+    581719ed 1d224f74 b768b7f2 0b83c80e ddd828d8 0178d489 0dd95145 15b02322
+    baf53642 773f65f0 1118254c 3d467904 7647edf7 32edf161 7ae16d20 bcd0695b
+    63ff7f22 6b40f767 42824b83 75088ffc 68eccfc9 fbc8b6d1 25d38b4d 65a5c63c
+    33b52543 0c8102fe 757d3a4f ada410af 64429a65 a491f6e0 7a7063a4 e7808d3d
+    5013d6b2 0990df09 9af0d9ad 36373951 083e3a21 a8f8c825 1e0b3f12 0523e625
+    43c1fab1 215d6884 4bddc368 a464c37a 8a0cd20c 132fa7c5 69df57c9 e74c608e
+    f0
+h = ef6dc466 d2de4867
+
+k = bf76e8ee bf47c134 2cbb47be b1bb0a01
+m = fef3a8d2 f0528cb7 c6000489 1466d811 601b9845 709bd5b5 6621d7e9 47ded2e9
+    7af3e461 2b286457 e4ecc57f 52ffabad 283bed51 f5623c47 85c2a5d8 e24a4547
+    26f90028 492c7d52 180139c4 3cc712ed 4eaa506d 8dcb7a24 53547aaa 439d0518
+    f9f33e52 6d96a489 83b77f9c 93979afc c63cec34 9fe747ac d8cef49b facd40c9
+    04321b7f 5834e071 e041b47d e14fccfb c66c2bca c2134d67 330675e5 01a26361
+    e8cc9f90 317ab2ff 8c3197d6 e06b5d07 ce135a0b 417587ce 855ed9de b4e5de0d
+    8052a3f0 f43b0daa 60abe74e 89c44a8a 19fb7a8c c130d39a 1a4cebbd bc477a79
+    0f038b43 38f23f83 4c9f52de 1b8826cf fbf46b19 f898b886 e27f095f a5570be4
+    a72cf3dd b8e42d6a 347e6ead f162f0ec 07d84778 49139951 baedda95 72b83823
+    3a2d
+h = b693046e d9aab1a5
+
+k = 314251e6 a0c70d17 b165e41f 95c8a9d8
+m = 9829cd5f d3bc9421 225faaba 1a68318f dde8c840 8efc2049 eb4facda 8c24b8cd
+    e513e892 42647afd acd314ee 2e7f8074 d83892e1 402e4e18 9e466211 bcc4a5e1
+    6f55f3bd 63f59811 385674aa 5c2dd872 c6c5f09a ae8cba39 969abdb1 d059cad7
+    8449a7ec 57b1696b 408744e3 4fea01fe 8648a4d3 05cda212 02700c18 3de514b4
+    2d2d5341 a63d73e9 480244b1 31bed73d 86a38e01 a930b24c 579e9309 6901004a
+    1c3c0d20 093886ff 1ad211ef b2e98757 b6e2a708 9a99cc4c befd5c56 c81c1f7c
+    4fb06c5d e25f62fc be26685e 94230b95 e94ce970 7fef5274 10b494d3 a7f7439a
+    bf3265d6 ad27757a d981c8c2 a40cc20d bce70100 e90238ba b6e7450a b1064547
+    321593b4 c0f03f36 ef2206a0 1d379ac7 4fcdc3e5 5d672bbd 691e855d 20c3322a
+    958313
+h = 66028938 43701066
+
+k = 656be78c 6ee5ed9d e64ae38d 917e8e4f
+m = c57269be 4ed39e7f a0fb78c8 b88909fd 1f205ae7 5818a626 b8a92413 bea1b0af
+    4c2837c5 3761717f 2b37961a b6f6ecee 80b076ca b130449c ede6ef9a e33547eb
+    1843ba9d 4596f8db 456c1030 b8d0b3bc 6a2b3da4 f2da054e e7d72fd9 2b6b23c2
+    cbafa32b 9f463227 14b42bdf c94d5ae4 67004348 c27d1262 5feb572f 906b0336
+    082ebc9f 76b779fc 844b9fb7 506a6da1 52bfc643 242c4468 0420c54f 3112b085
+    f7a63113 90614aaf 15e1445c 83d642d4 f88167aa 061957ef f6d0339f 6d1a3fba
+    eefe2656 0a52f45a 70dd2b98 83934887 d1b5986a cc674666 1a1f631d a5777c06
+    b22c70c8 41f87136 3f9e3060 c5d81355 08d597fc 12fab3a7 be301266 411c36e3
+    c692d2ed 0c9da8ce bda2e2b1 f8e51005 92571a69 9c0ff38b 26c4e58f a514c0d9
+    4ecea38b
+h = 27a926d0 da4f7799
+
+k = 42f607ec 2d11edc7 86eacd63 f14963f2
+m = 21cae968 f7b5659a 88575d16 194bcd68 5ca0b813 2e18c44e b61212b1 e9292453
+    1b01d86b ab905484 01577a37 97b4aa95 6e29c6ba 25da2e86 381022cf 6d5b5d1f
+    9d2f5590 17de8223 9be4e7c9 c39542a2 7851c208 9fd58629 89757f28 68bf4f81
+    7fe275d7 fbbf63b1 4b811c0b eccd9228 32922ec5 7ff50d2d 1be33b74 f5561b99
+    4bc3b1db 0274ee0b 3ba7f7db b2eaa0ce df73829a b0e16edc cb81c9b2 5380fc86
+    f0a624f9 994a7b36 3369d54e 6acbec8f 2ed09896 6c9d6ad0 3cb583a0 d85ec9ff
+    40bde293 8ffa1e05 9842015a 60ebb71e 4edec795 ed8a0764 030978fa 545282bf
+    051fc02e 361a22a0 06431fa1 d5c512ca e4c7a61a 0c608143 adccda2e 7b892267
+    34ceddc0 ee941169 3cbcd909 af10d978 1ae86ba4 85b6edb0 38ebc381 7523dc8e
+    b74b05a5 06
+h = 1b121ced c582f2f7
+
+k = e7aa97ba 4ab7855e ff7fbeee 97114a0a
+m = ca8f339e b598678b 2d1d4177 4910601b 3cdcbb7b 8a5fc7e9 882de969 26cff58d
+    6cf27ac1 0f0b6f26 3d4bbbd4 239b7e61 840495e0 8c264a9f 9eefabdf d912cb1a
+    aef48585 bbac43f9 307c5579 df04440b 82353dc2 c5feaacd 8f3f7f65 3d6feb2d
+    1e045a88 cdbe9bb9 6597ddb1 0fe1103a 5ae037bd 055516b9 474ce0e9 892c5311
+    4f95b94f fc565f89 b8533d49 6ec107b2 065844c2 7178d1f3 2aa716d3 873b6107
+    94bcf28e 87a53a2d 8694c6df b3b8abae e6f92583 ce94f9f9 e8fbea06 e01d1f6c
+    8a38dfc9 c861ea80 44b454db ea700706 c52b8d56 0db0f86a da17ad36 756769d3
+    b9441090 f171cc35 32bc49f7 f91e1c96 3058a00c 7c9087ed 3b9ecb24 095e67b1
+    c78fbe79 13662120 1ff0816a e784c7e1 8283821a a9485b83 08aff4de 0ac3948f
+    9ce6e09c d800
+h = c85ce096 fe91a241
+
+k = 7dd5739b f493087d cebe9202 06dca3a9
+m = 4cdc6069 42091614 3a33282b 97ce4c8d 78a2881a f0045814 ab726b02 a88fccc0
+    cdfdc55c 932b4a7b bd3160f9 7e14f920 345b5950 9e2a2536 47e0b838 2b18b057
+    68ac372a e8be050a 7771665f 28ebfffb 7b7822e7 e5fe8c6b a5fbe766 df1974c7
+    2a90da49 c68afc3b e84e167b d75e2963 2e0b5de2 1dcdc448 70251ddf 8a4ed169
+    b30c9212 d2cf5495 64c4ad6c 6a28b4b9 d505a26b a61114bc d5a4588a e11d3d6d
+    9b0da4b6 0c17bd21 6224fb3d f6aba38c 6da484de eeb08f75 ff05e789 8bcc0903
+    a8e2b3a3 07eaf5a6 f46f8c9f f0888aaf 2e4ad5fb 82cf484f baad0cbb f6849c98
+    6a591659 b989fe59 315692e1 fed011ef 2ddb1d10 110b7cf0 6f924282 350ed309
+    6ae70d8f f0100e6a ea270a51 a57e2222 47869de6 8de0bb87 5c24d0af 98d83d4d
+    7aa0e3d9 b9d79f
+h = 4887883d f952c5f4
+
+k = ef3d7a12 91691186 83c21ded 71f8840d
+m = 2069c036 97304d57 530c235d 3f9a87e1 257b4429 b74a0b9f 2cf83210 0754d062
+    3b9b9774 7d605380 34e494fa 887f397b bea3761f 34349705 4233bddc b05243df
+    2d9819cd 533513fe 9b995d47 ba718f84 7c71a299 30e5a119 977e6057 fd1d780c
+    50449065 9932c7b6 8a1b35be 6910bdf1 be038b2c 91109cc1 c3d43f1f 483e3809
+    f0eec3c3 27e618a2 6e9463d7 05e8da31 1f8e22c5 7150a631 d1ff80a9 431ab9a5
+    133df03d 11b26675 3295e5ef 17ed0d18 c0edbf61 1f95d4d4 d677b6b1 95545e31
+    c789b363 35107666 ebc6feec 8a9e4a9a 2cc0b1f1 9bca603c 2c2990a6 fcd38c36
+    ab953fb6 3b668072 eb633286 a1751e1a 658601fe 48845aad a7798f2a 37f747ca
+    2d74bad6 af193ae7 fd745844 8eb3475f cd4ff80b 49858858 e3d3e9ea 5bb5c426
+    98aae625 49107ff9
+h = 2a9bb626 5e4a8785
+
+k = 7f9f3b04 78ab9803 2211668f 88633178
+m = 273c889c d4c9ca7d 91950386 ef98104d 692faaf9 29f53d36 1cc40199 0489a927
+    cadab76d df1b7cbc ac3d9959 5ecedf96 6c24e540 7e5f4db1 c098abe6 c664adf2
+    6f47908f 1875df82 a8e47420 5d739413 8901ce41 02749de1 d76d4e45 81d6fe0e
+    8d7fff35 20f25b56 265abe25 b7e51828 4863700d 929194c2 346e76d4 e0e83fa1
+    bc7d4a41 9db3e309 3d044381 9f28b0ca da9eb287 19897600 d5ad99de 8ec89ac4
+    a7f701c5 87bccfd7 770e6fc9 5f8dddc6 2de5c9e7 1f62f2b5 613af769 5d8f8a65
+    faf95024 84588773 775907f3 58f5a9f1 3ff4f35a 096a8ddc ba357655 4dd7fd48
+    816ad17c dc8eb79c 0582c027 f3f7cf92 cdda1ee1 9189df34 1cfac82d 51a4a398
+    ad30977a 74a419a6 ad49393d e9ff120d ebbbaf04 4ae975c6 6e98cccc 87bdf9d3
+    419fe5ba b9f1722e 09
+h = 4a6d98e8 7f055cd2
+
+k = 75f30b2e 17944428 fbf81929 d8be0c47
+m = 0fd84955 864b635d 05e3c39b 1e7fd49f db9dd2ca 06c51778 c8ddc56e 1592f4e9
+    fd088464 f061661d fa43e2c1 3b3db4ac 5baebbf1 2ec115bc 4fd98ce5 c5ca3921
+    9bdaaf7d 1a7997c4 beeaedc0 19361685 c01989be 8fb1d2e0 505c32a5 bb1fc7cc
+    572a7253 28ad92ed 1bdc3667 f609c8f7 81123977 d6e9c275 45c64fc2 b92ed6ac
+    ea03e4d5 c7826f37 1ade54f8 dc3751e8 3fcd15d2 dfc24bab a645bfcf 50b3b3b9
+    f937e210 f714f8be b0b96834 d4015371 6530213f be35af69 090d21b8 20a6cd50
+    6869b3cb f3246c7b 782138a8 7265b804 d0fb674b 0b2f5139 d328c95d 5f4a2d84
+    0e2e89f1 76bc3bd2 64527db1 9f4b7887 05cb423c 07d0c2b5 a9de2376 29b8afdb
+    8ef826b8 066a08a1 b3686728 87692c3d 8e180067 6d2736c9 74541c45 8647d3d2
+    c4ce1cf1 3277747a f07c
+h = ff66348e c71a0bfe
+
+k = 09483122 9dcbcbfe ce1e2360 9cf3d1bd
+m = cb635e3a 2e26cab9 d509cc74 88f14fbb eb382cf6 04789e6d 553151b0 82378289
+    d499f721 31393d3b c7e28df9 e63a7928 cc94d221 9a2d79e7 4c60bef0 3e90d4dc
+    35177c9e 2f196d83 836c1b5e febf653a 2ce40143 cfc4f225 ca041fb0 0e0e9ab5
+    5195de94 8da25b7d d8ca62d0 df446fda 346b165b 0a13f01a 295340ae 0cc34a13
+    25345619 e70a7e64 7c5a2a39 d7edd804 3f3e3cab 4dc839e5 c893be6c 109cab86
+    e1b07fc2 806e2fa9 4dab192a e3886bc9 292c82a6 52a86052 2bcc50a7 f1812b32
+    6823933c 605274b8 3340bc08 aa4ebe8d 71c502a6 31f51d92 d474a5f1 cd743f64
+    41ef38e4 0b04bede 4b035bad f41b6adf 64318079 16acd806 bdffe6c2 a59b2927
+    ac941dab 51c48efe fab59d68 5825ea6a d57c5df9 5f33b929 978ade1d 2924bf0f
+    77b3f643 e166da8d f5d75d
+h = d33c5d73 84bec969
+
+k = 343043f5 5fdf2ef3 689b59a0 f892f362
+m = e740eb52 60d04387 8a861a15 6e781a5e 9466c962 a447cc5d 9577aca0 ea787708
+    8af48d2b 620cbeca 94580b90 2108d7db 70366138 9f5a6b12 e976243b dffbc053
+    8a75c114 9ca9649d da89ac46 d36533c0 e0b4687b b0463823 b6c3f759 fd2f250b
+    d6d677fa 83aaa29c 1801f69a 9744a578 c0d55a1d a96882dc 53a8d075 ea99f699
+    4ad131ff c4280117 641b7764 2f900718 99ddbc48 354bd2c4 93c48a98 8ae8b935
+    65b7ba0d 0b4aae48 2e12b178 35b90114 d1dfcee4 1f240ba4 4b577314 e5aa0f03
+    2db8eba1 485d845a 0cca65cf 24463a71 daf11a36 ef9adb65 5bd205de f8d71dfb
+    251ec624 a16a86cb 02330c74 fda1f9c0 4fff49b3 fc574a00 531cc653 1c36c564
+    989492d1 0ea38f4f b43a043e c5bb2ee6 78598fb1 1bcf6147 a3884a6a ac7e9432
+    d4f1e35f c1dd2342 b710f128
+h = 81556d6b d03237c4
+
+k = 4f4c0e8e 2fb03292 b41d3204 e4da1e1f
+m = e0f65514 968495b2 c28f1d88 eaea4b30 7eb563ad c3755ccf 0f549bdb 03256142
+    6f45f6a7 29aba84e ea9df0c8 a7bd02cc c9f88050 5a655f29 9e01a0d7 ea298a53
+    fe145896 a823d1e2 9850e67c 40631f57 b8077834 8532a7fb 06fcd118 8efa64cb
+    2559817b f9316178 0fb55518 b17053de c54250b6 e1db8a12 7a23d89a 32af850c
+    b40e3ed6 5088f429 289ba1fc 5dae274d af6eb6fa 6a655a95 f91cb1dc 28ecba1f
+    cdf04b41 f92b48a6 3f88a0fb fc77e318 a9e4b9e7 77eb2fc7 4461de6b 6b9cfb81
+    4314bf4a 0bf4e498 03575610 2a090ed6 1ea16305 4955792e 4969b0f3 070e359d
+    1ba04929 8ccd6fb7 60409c52 4181b9b5 885f75ac facbfe2c 37524202 3717274b
+    fc95a659 24ef4cb6 b54a0593 19656382 ebe785ad ad9a5dfb 6a9df4e9 a50f282e
+    ff053b3a 7cc77ef5 a132d4ae ae
+h = da435154 bbf5491c
+
+k = 3c6fb5a3 b13361e0 9cd24ff8 52de7c27
+m = 59189fcb 68aff8db 758d91ea c8057939 3b67d5a0 203baa8a d2edb3c5 a2c78a87
+    9500c864 89c6e348 837cc7ec 9471bdbe 5b886c59 1ea57200 7a56e64e feacbdf6
+    f250f5f0 860e32f7 cdd48c7b c330503e bc5df3c6 764c96d5 9bce83fa 7f79d15c
+    99253b89 31f2287a c3f3b913 314e1ed7 4be63842 32860ccc 1da974c4 d2ed091b
+    7fd7e76b 97df7d89 1ce2e4a4 ad0f67b5 454408c3 a17ef877 4e12ce42 a6026091
+    5d2247de 6a4abf13 93431911 a2f120a8 d346fc63 068efd79 0a3f1387 ef0aad04
+    115ba635 691e3215 b735d270 b370676d f4c66cbd cd90c163 28daef33 a1a82b75
+    00bd091f 768558e5 bc466434 34ef967e 485c6958 029eaccc 97668876 7a0f1011
+    b4defa9b acdf75c7 522b7f3f b22ffe64 a96b9530 bba983e3 930ff95e a40e03a9
+    0b292f71 1951c353 3319fa72 b871
+h = 77c7a734 85a94320
+
+k = 44d26718 c722ea8b 838fbab2 b538544e
+m = 7643fbcf ce64586d 087bbcca 477c9c33 d178d18d 8a01cdf9 e4872121 ecdc99b6
+    528c0ed0 9046d19b 37a42e1f 087e11df 1e64377a ba8747e3 88dc9cbe 814bb89f
+    f25d468b 27767de2 787383c0 8a786de5 7ebfc885 afcda5f6 97daca7b d1344f3a
+    2a8941d5 8035dd17 9ea076e5 226215d5 42aa888c 549e8eff 99ca4db9 c4e8c7f8
+    1d9646c3 0268225d d9b3edb4 1e94be01 57a97d32 a0cc71f3 d764842f 3e5db638
+    339fa232 9402259c 28c43852 9985085e 6aa514a8 c463f6f8 fdbe06af 57d990ad
+    9373b63e 5fbb6162 e05b06d2 c92ffb79 ed6ae341 89b88133 b9f5597d 3ecea35f
+    b29c8f11 61bbd221 db0a0c63 d99e3740 bc09ce1b a10807d4 18e3b363 1a8ab4ff
+    a92d86f9 7d2502c2 fc2754c8 5597a63e cea26ce7 7d20071b 71a07e87 58246fd8
+    f613ec54 fb70f831 e636803f e5d977
+h = e89b1875 6ce9d1c1
+
+k = ac37067f 31e03d55 83542044 a76d2708
+m = 09f2c96b 87fbd206 9b151639 3fd53097 eb4c3959 a530d7cd 9cc5e633 0ffc34d3
+    61e880af afdfa325 8bb123e4 190f4488 ccc2c02a 94fd04ee be5cd8d8 2960a990
+    7dfc6bd3 c02c4b6e d215dca4 52b83571 50b0415a af5f5c71 4dd12b96 9f38c484
+    644e0d39 3a23142f 94a36a25 e034d2bf 81424bce 04a23978 a18b038b 40dcbfe2
+    5428fec3 5e22f40a d41c8b04 398add1d 5a12f832 4929adef aa6997fd 1333cb22
+    c2512277 3c47ddaf 09a795e2 9835c21b 858db9d6 b50e0551 98a0ee9f 21d96561
+    9a3370b1 9b06cf9a b4ae99d9 41ac708c 76dabe3d 8be9f510 ee067ee9 b46516ab
+    08f51482 fda63129 6a65a46e 86ca8802 7d20b806 7b5ee5a8 c4a11f19 5dd2b2ee
+    391da800 1cdc66f3 08286138 b854342f e7e7a6a1 dcc8bb43 80b74a90 6e347c1c
+    d153e5ea 2aac9cc2 0305f013 895dca6f
+h = b6886440 86274dc2
+
+k = 72e8a198 51c7c2a8 f3dabecf f689f946
+m = b9542b6c 3db89c5b b6f1cdf8 04a2659e 8f8ae591 20dcd105 838107ab 25c1c74e
+    dc258c87 1bbe4055 5bbe90c1 f373127f f42ee7eb 4b2766f2 336e1d25 4f90f64c
+    d4bf2316 4cf14584 ca1e5a1d 91cb9ed0 84b8520e 298f38ad 2e8cccaa 2d63d468
+    c4162c4e da0395e1 83bc35e4 eecb354e ea38d556 2d0e704e 36a99fd5 2810c729
+    4393da34 c1ca979f b1900cf8 c76c884c 5ff14405 a4bfb517 eeb97f2c 4451b769
+    f57a1eb3 7e009409 24cea5a3 4297c4e1 398ea182 93654b92 9c639e37 c8764db0
+    1ebc6968 e5ffecb9 381f992a 4a306a58 69646764 b4fa8f84 d6926edf db97ee0f
+    6d6e2b89 1a4cf886 e0bd51a5 3add80ec a0ff31f1 2791a74e 35784d5e d94cbc35
+    292978ad f58cb4f5 22fe7a92 48dbdd02 751808f4 e34c677c 5b9ec720 76454fab
+    787d34d6 9f26a5d2 9e4b0e61 a744b88d 2b
+h = 720bff7a 3decbcef
+
+k = 53e06a77 2ff60909 7f2d6134 ddb6ca25
+m = 7fcee89c 9b06d88f 6ab4ee25 89f04e8a 0a584223 4728d031 f2bbfb46 38cd95ad
+    c9ddffee 8858d0d0 2577901f 440d805c 49f79afe e144a800 2c5de799 f5c532c9
+    54f1e8a0 912f223e d5c1495f 720f6c8e c2cd43ac 3163313a 46048052 b8a1351a
+    1411b6c4 861448b7 817b4f4f a3b81a23 7b4d5629 7a2a1a81 103eba02 29c989bb
+    b9369381 6e2dcdcc 825db7e0 fac763df 2c0e6cb2 a1cac1c4 7a76107a 671f0a85
+    186cc0a1 b5caf515 8d5ad981 0be210b0 08170700 db1ef749 9b5b9259 10209b8c
+    f34f3394 4edd3aa2 e927676f f4c17740 4d28a30f e41b4fd0 b342d554 491c598f
+    ec1fb43c a474e0df ca4fb4ca b9462b49 bb5dfeb8 f35e3f04 e185fc26 a8121f06
+    ad0af8f0 85904a0e a914b959 8bc4c0ce 7740362f d208c226 6dc31ffb 3af1b72d
+    0c782fb0 90b4e59b d37711ac eed969cf 42e4
+h = 2964b3e0 25932160
+
+k = bcc123bb 769c62f8 e6cfb31e 16ed0fdc
+m = 418d6cb4 2e7b26dc 7c73d699 08b029f7 9a3f81e8 2f82543d 63651b59 dd21f977
+    83e8e411 4f7a4674 18b3fdf2 56b30950 726983a3 18ef0643 0ce68981 b01548d5
+    4a4af00b c1960406 c6ab6bb9 b9065a32 b951472f c83c3f4d a43f3e46 0b6964b6
+    1f09219c 91d0cc08 e84e7660 671254a5 9a203449 92593182 5e8be852 8e45867b
+    f14c337d 4ad71ae1 e8cbd2df 1a85de31 33acc9af 24cebb55 546ad104 71b24a19
+    ddd84687 b61479ba e5fae00c 7df492f2 9e1e0aa7 147dbf6e 5ad78c47 2a058ed6
+    5ee1c3d3 b6f018e5 16bde8fe 8cf59034 42ffb913 b1e2c76d e5738882 7f984c58
+    571b97f3 5df66ee6 c2da12da 8941c1f0 a69676d9 d01a0a12 bd966e4e af6e9151
+    35c69996 3b760d43 e57f4b23 52044779 7aba7899 c934bb9b 881ebe67 08f9fff1
+    dd5f04b9 233070ad cca33512 9bbed354 5eacd1
+h = a7314b0e 2eed7a3e
+
+k = 0bfd7623 10e4fafd 7bbfb387 231deb59
+m = 1be5ea7a 24aded05 44972d7b ce6123ee 23dab55e 76cc1fd4 66344dd6 cde42d43
+    39269cc4 21e5144c 11c8df38 473cb051 a872a289 325f244f 54a9aeda ae8902ae
+    0984efa6 f1f93197 02ed01e7 b25ef908 5bec2e0d dcfffd01 9d6aea69 b176592d
+    2cd4c19d d081742e b2e92d0e 7a79b312 cc94fb6b c230a783 92f26521 a2509a04
+    b4d6476b 50d1ebd5 c34feaf3 dee63f2d 102569cf c938b502 16305d42 5b57e93f
+    386ee408 9c75bd56 e418e91c 56f41ec1 1ba7f89a c030c571 08049d05 3d76b494
+    23918fa4 5c014963 b9513a66 237076da a0e19d01 6ee9bf37 565a3bcc 49f2b839
+    33ef110a 91d26156 f0698602 7da92617 9b38b2ea 3b85c72a 5333fd4b 99a36b95
+    8041f174 762bb5a8 8ac7e847 d56fa0b0 c6a8c992 de6114c2 fdf2c7da 9474378f
+    5db8479d eecd2475 c28fef87 8a5f1635 35702c50
+h = e99f2f3f 98423e1e
+
+k = d2231791 f1ca2e24 91d12fa5 e183d685
+m = d1ce0d29 1bb24c74 dd4e2980 49bf75bf c2774958 4ba664e5 eab2d3c9 ae826c45
+    66514a38 d5568d0e 39d97e9b 038b8a4c c3c5a1ee 37e99478 978b8d01 78eea409
+    10561667 1c080436 50a4df46 8a5691a4 e01100e1 50357d44 874b5279 483a8cbd
+    5d2de900 8bb7b8a3 6d1fa371 63c2cb33 e3fc572b d0b65406 85e0d689 6e1a9e4a
+    593c748c ddbd430d b68f9dd8 a737ca00 b490e0b5 4cfe8fdd 190f6d69 9446518d
+    8ac34d18 3ca598b9 84524ad3 3144df92 12dc3453 bf11839a 139ef38e fd9a871b
+    d7862d76 c522476e b212c0e6 7d4b26e2 e1453069 54234df0 93b10c3a 83342b93
+    faf2f9d2 dd8d1fc2 7e66304a 0e75b44e 0e5727a2 eb74da08 897b5596 fff01a6d
+    1fe21016 fcc406d8 2bbd7f29 0ee24882 590b86ca 1a9fadc8 b750f672 76f9160e
+    12d74d3f 0e0e3b32 4d394489 f2716bc2 1fdd4162 d1
+h = 2317995c 5f1709dc
+
+k = 16f27358 cdc86dd2 fbc161ea c115c1eb
+m = 32e3795a bc2c7836 42698a73 60c4ecad 7b5f1e3e 414e1fd2 ee1c658f 1d60851e
+    26c068e0 41cabc47 7146df08 49a351f9 d4fd1ce3 7265d227 e55ee6e2 0732030a
+    7f31ad91 3f971ac7 13816d28 002dc032 3696265a f1e5c545 fcaaf614 5c59e2ff
+    a5d11f07 b4340cb1 da40e6fb afe58995 8d2d696f 02b90bec 2bcfdb44 ce3a4cb8
+    72e0b19a ae8a63a3 dac50757 2582a2ff 7b14b02c 2171172e 5a2212a8 4340b688
+    df62dec8 2e33ad3d 6df33d89 54981998 f2d33e9a 75d2dc50 664dbd5b 662a9c47
+    6fdde90f f595b1be ab95b8fe 2d765c1a 47c0fb24 3df6d4f4 7f2c4c24 2af1f5e7
+    a4e9666e 4ce70637 560d5a32 8632949b 619c3804 0d3645cb 4863c246 d270982b
+    272f24bb 29a3ceef 2ea807ca 0855bd32 eb0a41be 037e1c3e 37ec16ff 0c978ae9
+    c06721d4 c9937868 ea68b711 eea7216c 6d9657a7 b6ea
+h = 866d2936 7bc6915d
+
+k = 0be5227c d0c3736f 90afb10d 25ca5a68
+m = 86890a39 7c6d6192 80254a89 04cf170d 0f51b9fe d1ffa26e cb4cb403 16dce9ad
+    795dfb3d d60a33eb 3f93714f 04f4b2ca af79f66b 9651217a c53b721b ba195ad5
+    20606766 d286bee9 bdff1e25 402f0fe9 c629c69f 4d9d22d7 3862c83f 8a751dd8
+    6b51aca9 13c60439 cfa8ea80 5225dfb7 79627584 4143e352 3d95f0af d60a3ac9
+    f7d82459 c46d9716 9aee632c f44ad3a2 b25a3737 d2c32857 4300afdf f082f76a
+    303a4678 19ec3110 ed969717 cfa8a83e 6a973951 e39e83d1 2ce90e8a 296fdf20
+    e9df8d38 0a1338d1 4d8eb855 de1c2626 c02198a9 c3a7385b a186d74a 9eb553c6
+    a2f35c2f 76eb93e2 9ab58cd9 7c98d6dd b19138df e93bf1a4 a2c95879 e77d6d6a
+    71c9d996 9087d421 d77a455b 8d479d04 80c88bec 7d4af04d be2c6d72 b60c9cbb
+    28cc6320 9647e2d2 80059759 dd34d5b1 cb04a3e9 d06441
+h = 8b12460a f9fc4368
+
+k = 04df5d14 371b4192 4ff8c19e f9401a91
+m = 43b55bc6 5a1d7153 f7e4832d 3d842f1c dc3ed4a4 f215b4e5 5fae0c97 dda03ea5
+    745ac08e f3ee9bba 200a1c34 dbfd95b9 64fe16e4 f1f4fdaf 50474c23 583d0dc5
+    001f757e 447b3d9e 270e29b3 35331beb 5ce764d7 6ef275f0 6f7013f3 2b6eb1cf
+    417269a5 aa123036 5d5f415a 54b8f4f3 aa461203 c9dda5d0 3c40440f 4893369a
+    d47c08a4 2079b8d6 363708c2 dc703e4d 6afe5972 1dffd1c1 4b710e83 197f9d86
+    fc71c247 00874599 5ae3bbfb f531d861 33a5f4b7 2c41d068 bf7339e1 584201c4
+    a024bd21 be3f0ce2 f85f33a3 b003e24c 77eed3d3 796a231d 048c2014 81c4464e
+    ce199c9f d7b345c4 544c6387 26416c2d 02171bd0 2ff2b6e4 02cf6834 aaa7f530
+    2348b640 51cef4f8 2b30469a 1f67d1a7 e683ecf6 1a31489a 1c7c0250 ad765ac8
+    5d5ca5f9 8901735b 105ef918 c9fd63b3 24ebe52e 432f89bc
+h = 98b268e7 2cdd15e0
+
+k = 2e4fd517 d8440494 9b197a04 09a6b574
+m = 2585edbb 4820badb 2ee7026c 869b6554 18170d19 ce3295c0 bc50b062 af72bdd3
+    bed9eb53 53c4a25d 4753a22e 8360ffd4 8c5941b8 f19f10b3 269fa616 7b677671
+    6427a9cc bf5d78b2 d45b4313 ea2fac6d 98d3606f d9946269 af9a0744 ec093814
+    93ca17cf 8a4db6b4 fac9e66c a033eb97 c9a58298 9dffaf37 6d01fa13 85cc2f6b
+    3cd8ec09 03a8c2b3 337c02f5 8ae8c860 916c1893 113a5b0f fbabb4ba 8663e8b7
+    99d363e8 0db40e46 4f6c76e0 68d9eaa3 0091bb96 d409247e e5fb68fd 14427397
+    f553c405 abc1671e 8b83b9ae a9acf53c 5034c374 f5dba30a d6178ccf 1c81974f
+    fa5b7baf 4860160f 8ec3b7dd a5825269 83ba3836 c8d99632 1e85ad93 bbdb5a51
+    b8c9a99c a0125022 17416ebb 335ee0b5 9ba0a82d 300326be 8ce338ff 676954c3
+    5299b11b 5da797aa 3493be4e cc143cce 1875085b 8f02f0e8 e4
+h = 6eab6e55 dfb6b30c
+
+k = 3a143a04 a465f6e3 f1295cc2 7f628ee5
+m = bf822f79 020fece8 eb0b7a41 7ff32253 b5c7c01d 6f4e0ba0 c34f40fe 12ce3796
+    74ab41b8 aedd734f e1313edf 34f70571 be119fa5 8449812e 5d479b8e 4af8b8f8
+    6db91011 8db8b394 448e3f2b 9917142f 0e7727cb 902ce55d 4cccfd6c 5d8b2a1a
+    c4f9c9b7 aa6f167f f3654c5a 3346be40 debeb71a d1712a34 e1e47773 01394c3f
+    835d3116 20a54823 5098f4b5 b5dccb6a fa0b2643 58191ab7 d23ed1e5 bb3a7acb
+    6486fa1a 794b8b49 86ff95bb 9ad472bd a32d787e f84d4f16 88a7f242 feb0d054
+    0c0453af a722c5f9 21e2c706 f513ccac c0ee9b78 3bebdcbf 9d97dbf5 2d2f4f80
+    b3a7be3a 12e3b4e8 2fc2191d fff7c241 2bcb6953 f991dcd9 8ab7e48f da62aa5d
+    f04bfde9 6cca48d9 9e0203ea d8e84a87 b23d5795 aeb07aa0 109c8cea be25e7d5
+    29c2aaf4 bc6a96b2 b6c79552 220d15c8 609629d7 25d9f09e e132
+h = 360a2fb5 2dc1c7bb
+
+k = bf5b8ec6 5abedc57 554e3009 d8f00640
+m = fe3cdfa0 2b7d80e8 3edd89ee 0c242df5 7a24977a 01506f16 10798732 559554ac
+    b5a735da 4dbe55b7 1b08a727 9b414d33 c25744e4 7a751617 cb223315 0f048e40
+    ae2aa640 6301fdae d49f3a54 eeb738c0 290e3a7f f77e42ec 15f54c24 f4f01ab7
+    7c8f9ffd 856b5193 4cc0312d 22d16ec8 0fa258f6 27f5d7b3 6e5e14a2 84f523a6
+    9f13ea74 508c4c39 9a0a84e0 440827fc 959595e8 d93242f5 c4c0af19 a52167c9
+    74445554 f3a604ad a28216d8 ee36c160 58617800 84076354 58c77b07 32084baf
+    9cfdcc7d 122dc199 c12247fe d6da8368 e05d21b2 faf3553e a66c9a7a af6c149d
+    20a4a195 dc61e516 e2499d54 65675e1c 6748354d e15e330f 5ccc9a13 b2b401f0
+    2a0170ab 561014d5 88456d58 1e28c60a f81b8629 be2b31b9 d918c0a9 8bc39d71
+    4d5a729f 52bb35ef 66d4a96c 47cf0ad0 bfda7798 2baee035 3f098f
+h = a63111a2 f828b04f
+
+k = ccfff42e c56bc39e dce06ff9 7f72ab27
+m = 65d29ec8 cef5843f a3c5a938 ca7585e1 7e8797fd c44dec42 90b5698c 384558d3
+    789d9587 e21831b9 75039666 699cdfaf 638f9297 58eabeb6 d3506de6 6a1a6d5a
+    08e75662 43807d4b ecd49db1 3efc84aa 108b97ce a32d4325 a9924b59 6bf5eb7b
+    1c454560 67a14fb0 673832e0 3eec65f2 b1fb77cd e3f1b58f 153248d9 2dba1613
+    616788e4 7146aa03 3f39bfab 98dd2dfe 31d5bf1a fe9c20c3 96735e9a 56ff61c7
+    30e123d5 210b932b e464f367 4bb1e78c a24f0bd2 1b6f3ec5 572d90cd 18d732a1
+    077ef7de ea3c56c4 ce60158c 1561de0e 22fbc456 4dd5c9fb 99dcb556 d00722ce
+    99518a88 5b149968 596bdb60 ececc8ee d0d6038b f6397d3a e84122b0 7be169c4
+    a74cda4d 6df412b6 d750e391 d01aff9a 1274fa4f 38efcf74 1d71fb49 30a5a769
+    fbf38920 c864cee6 0c6f4ccd b1bb4f5a 09be11b6 9ddced54 189a458a
+h = e1a591ae 65bb766c
+
+k = 2b1ae44d c0163fe4 e264d0cc c0652a11
+m = 025772ec a162265e a573016f 2e942cd4 37fc32f4 83db9df6 f6145725 3299a720
+    b607d689 5535cfb6 3a3aa571 c77356de 82b3422c b6f9525a 70e5dd84 697586dc
+    387ad4d0 f71204e4 bb3efad0 cacf7114 7b69f244 bd74d1b9 dfaeba07 9f0e1116
+    d1a545f2 f3916f15 656dc740 922e29bd 83145b4c 20784cab e1ce9f71 7b745b82
+    15e68286 a1022e74 b5e85630 e9aec15c 082736cd e9d6e925 fbe338dd 58e1e7dc
+    f2ae5155 339eb432 326a304a 7bd9c252 36299930 5e429161 3ecbafb4 f7416d9c
+    9e377201 9021272d 1959f9b2 d9fe1039 6e3a02ea f5bd09ae fb88ec5e 6786dac1
+    4208a529 025dfd11 dfe94f80 8731bdf9 96276863 51717779 1a5178ad 10b40ad2
+    68514b65 1e00e282 7fbbd685 57b64e95 5e0dc34e 4e3e382c a6a949f6 4a26242f
+    bfb89a47 9e9392f9 1961c49a 1ad9b4a2 f42d22c3 53c1429a 74f9d53d 94
+h = 9aca1807 83912d8b
+
+k = 37b5cd5c 9c4dd0fe 168da58c 00be2873
+m = 85d7c0ca 42f91767 93821629 c71b48eb f7528617 8cbccc6d 59e5ac43 ec7ebab5
+    031ed7ed 93ebcf2b a976e52c 33123355 51944e21 68c5a5f4 760aeded 700ca1da
+    757b3d91 0e5cde25 833e7b81 3e6ad448 3cd7b2d0 9a66c8fe 6fbd94de 93ecf4ff
+    b9edd79d 9391dfff 5d8b7fa1 2240c579 ca699236 a4406326 cff177ee 78d6e0f2
+    ba07da72 e604524d e87e545c 095c8e91 7d8fa9a6 0700c5b7 e1d74a94 1ad6286e
+    8c242199 e512b573 141e78a7 d776c992 d2af0ba5 8ae1f278 56a2176e d4f93abe
+    0f6d90fb f68cd645 21306f6a bda70da2 998ab97c c80d8ce2 7a3172e3 7806a92f
+    d5c01a03 23e58158 3c7002c6 1488d738 d1922a02 b6b4038e 56bc6e5e a2a5465c
+    e5e95ae6 0bdcf799 ca4171db 15dcf003 0b4d9619 73b1f4ea 86cec364 fa406c2d
+    d38ea67a 46c1a93c a093c70e d1e73092 6819f798 4129555b 87a18802 b123
+h = 7980388d 418975aa
+
+k = 5ec8d206 4a0eab52 a1f8afbd 30929833
+m = 8f7183ac 2ee5b24b c5fc0204 40456565 8b0d43e3 3ad1b8e5 259384b9 c1b0810e
+    dff62154 02c3bd1b 0c145ff9 2580afd9 2a98f6da a725d23b be10034a 7e030e65
+    5f4e2a7e b6f68aea aad322dd 6339dc97 19f81564 154d51a9 4bb2ed9f 114d4fcd
+    399fa04a 76259881 d2cee97b 5b8d98b3 be3fbbc0 6f9cab35 16a5f422 f15e59f5
+    f949975a 13951d9e 4b0ba670 2839eb2c 74d742cc 6a94c45e e72febac 42c8b585
+    0956b315 437c3113 b6cb4074 84767c34 262cc74c a2e83194 c9a91e2c d36149d8
+    b3b96d34 a85b104c ca118347 1e3c8a0e 2d022249 86ba644c 1b0faafb 90cdb6d1
+    7c2e72d7 1c920a4b d32771cd 356191ac 70f32629 30944fdd c48f0f83 b5bc523c
+    7772f3f4 01f20559 a9e1d4e9 d728b17a 07eb83f2 e239bd71 e5ab86cb 116a5026
+    40fbe728 c23e5b6f 777fffc5 aa8afb03 eb139c4e fff4e277 8d001067 a4e297
+h = ca0e4122 b5eba035
+
+k = 3eb9642b d5db98a6 a77fa5d3 4e9fcb15
+m = 29133c89 445591b6 88b3ab71 ed20dd2c 0c9c98c2 11c29da3 8a33d8de df9d2764
+    cd2da670 e94f4720 07603bd1 13e32546 2bd0075d 0b6ac008 e21d5fe9 98c020d7
+    529ccf38 a115d304 5b5e6de1 a04b501e bf5ec59d f08c801f dc83451d d1dc29f8
+    8fa1e8e7 c91039e7 451336df 0d0b8433 b634f67e 15e272d8 aeace5db 8e0f9c0f
+    66bd39f4 c1dac64e 48fb5f6e cf6073fb a6eeac86 4333e1da 073ac4ef a71cec3f
+    1d175e40 4f96ca4b 26591ecd c82dc4db bc40bc80 2d0aaaca 2ce43a33 9e5b5509
+    db4ad6ab 42c8714a 7290d379 16c8a334 36aa8192 084bee3c 885e4528 56ef83d4
+    dc572cd4 5997859b bf71de22 e5e410c2 1af8057f af11598b eea8dbd4 3f5d1006
+    79e295f4 c4031d34 c9810581 87cf2a1f ef0ad3dc b7bc72f0 d5ef0196 36989f99
+    e306818c ab51f507 2a20d9d1 81d92728 023662e8 1084ccee ed09ac63 40a2976c
+h = 37bfcd40 b4ad0a61
+
+k = cb0de244 66ed79e6 8af5f000 a471bb14
+m = 71284dc4 96d14a04 494825ec 4edf0282 ee8dabc2 bf1bc896 16559e51 38bad49c
+    ededff4a 2a2361e9 728ae2e6 aaf313e1 cc4c91c5 9e9e0601 e7b7dd2e c65bff29
+    0fb89d1b 61fc8534 92693cc6 f22d0aab 08792844 1696e287 aa2ab338 c1fa3fb2
+    8383324c 68e9c02e f33c0cea bb69b0b0 4563cd61 b580da70 4c5385e3 bfe9204f
+    05b8aed8 5798a9e7 012a8417 4c9f07aa fd9a9f5f 5b57329a 00af06f1 a2e6d696
+    ed0f38c1 66a365bc f09b7678 e233298e 5a7dab6b 17ea4833 76ce6399 c3e5cdd3
+    e3166027 0a14df89 aacdb400 2e88c3bd 087648d0 0956c738 60c1b759 c0ebae22
+    371e10a3 7197c531 774b9888 44f8782c 0ac95f48 40e8ef8a f4ba042c 6932fe5b
+    b31d48d4 0fd72abc d45623c7 eefdbede 6922d308 f43eefc5 4bce57ed 45573d87
+    5c5b065c 55f14260 c4b484d7 82e8e39c 19a87a36 9c96575c 5f428e80 e4c519b8
+    1d
+h = 8abb0902 5d06658f
+
+k = a67e02f8 7c909ef9 e253c027 763ec115
+m = 6edf29d8 8e9ac6bb f914f4ff 3155935a 9ddea700 a618bc77 c2a52ca0 b0f64348
+    cd5b40c7 66733102 c488491b 4ebc73c0 a1435d17 82eaf844 c3aa8dc4 9a799549
+    2662d2ae 1080667a 564578fa 16beba24 9343436e 169c6fd8 ccebe8a2 215d61bf
+    834fc89f 16295dbe 05f1bad9 f136a3cb 676eb6d8 62eda72d 01d9f518 722b4713
+    8ea8fa81 9aed06be a5e64090 70889044 3a9b952f fc9a5e0f 6e51566c 13e1ce5b
+    8900fc9c b6b2f69a 95dfbd7b d798ea00 ec4c6cc7 8cce5184 d0433a0e 94ff82b2
+    e6c050f6 9d49c20b f1c0074b 3c717fa8 d2027eec dfd62c16 336fb1f4 34ba2158
+    ee30527a b1e40ac6 3a12888c 88667904 c0672f01 ce2ef496 5d6772e6 90570739
+    f5174599 a6f3dc8f cb4e9662 856bde84 c75d63c4 2d257c2c 8adbe2ad 544a422c
+    8fd81bba 2f00ce1e d98e6194 8af4a397 f5b29439 d64d2360 99880696 d9766b39
+    1dba
+h = 8e601f7f 5573d8db
+
+k = 7d15b1a8 0f9e8208 35e40a9f deebcbab
+m = 5ed8da5f 4a89cbc5 bc3da465 0502c4df 9de50e2c 1910a5c3 c2e990cb 98e9879d
+    6c9e25fe 78d09ff8 256b42f9 b05e151d 1fd20767 c45c78ec 6af4f5ce be4c4ae9
+    644e2a6c 65ffa931 4ff748c7 47913c25 4db15792 ac532350 8c07266a 67ed7175
+    8e9efdac df90f1ec 0bb7c103 8485343e 516ad45d 5b110a12 86f53f8d a357ebea
+    984a4220 e3c72d41 cab5b2b9 2a4cded0 5a01fd9b 35c9bafe 49115c9f 8f6129b1
+    7f4ca529 06797f74 763dab23 6d17746c aa974ca9 55315e14 d0534c0f 3246da40
+    75442aa8 997ea37c d771a56e 3c13ccdd 511a3bb7 70c3395b 95af4d83 bf71a57a
+    9480f2d5 f8587a13 19a17879 47ae0458 18e56dd5 991b88de 401e6d2e a5a0323a
+    5359edee f03a4e86 447dfcbc e7e7e91a ae1997a6 67225bb2 2ee135c7 a4f3ddda
+    ac8541aa cf6a10da ae6aac8a 10c80483 e6eb4d9f 655bcc21 c8f55ee2 9815618b
+    fac430
+h = 687ff4c4 1c262ae0
+
+k = 9166dfc6 d27dd1e1 7b53f4cd 3443b909
+m = 84eaf926 c02fcfae bfdcd86c 5c3aa23a 3ec207cf e018132a cfe61e9c dc7e1104
+    2a5c6bc4 4852d395 5d4cab0d 13e92b3f d9c12a5f 23b4c340 4258a501 6980080e
+    40696a10 3b585602 fd07afb5 1f78b4c3 b3f16d7a b0f4e8fa 4f6653f9 dadb296b
+    adeb2799 73b9b1f7 9ff18e4c 18b8fd5a 8e0405c6 be5dd465 1b722261 70471306
+    1bbe964c 298c7192 f0c17b72 36288345 e7c521b3 aa7e495f 203845b0 df8c0dde
+    68771dc3 a2a2d8b6 6b399e7a e936cab3 471ce922 2a16c417 50754942 72004579
+    35c53833 11f9ec1b 40182989 6bf13ea9 540cc9f2 1c157880 c74ae27e 7d66abe0
+    bd10b04f c0e890a9 87d85229 0fb00886 909d8025 0c8ebe9a 9ddba817 ae94fa00
+    c57da4ab 52bca2f4 20ea8983 a5a195fa f8ef01a3 23cee5b8 ada0fa92 ff79ca18
+    d8c23cd0 07655476 abba5134 588f74da 788ddac7 0df1bb96 6c69e12a be68a87f
+    19220e21
+h = 845f2e3a 8ca99f4f
+
+k = a6551ba4 06a389ac e6722cb8 32e5f1bb
+m = 944471f7 01ae81dc 00080761 216caa00 61aebfee e6f527dc 4f408385 2594da16
+    b68d9933 3ecb1756 32d4c111 de4706e3 e3c7252a 573bada1 22eca72f 6c58149f
+    da684748 26a29dce 78a98121 e0f52677 4cf418aa ebab837a 583d6244 e2b1a253
+    a4590462 ee5e9c87 40b031e1 9ec7aabc 192a10d7 5e6060c6 738efa6e c8a0e143
+    a381bdc6 d8c40684 6f932f43 e2029689 9b3e71fe e36c3316 93976f86 69be9fc7
+    234691f8 8caf5dd6 6f0aeca1 e41e1d39 c06e794c a6121d1e 2b9dfa2f 7bee2f81
+    b226a602 c6958e5b 636250a0 6c70e815 28b9e268 503680d8 837f7db1 7f5e1120
+    5a6ec609 4640efeb db376692 be4e038d 977bf4f4 ede2bcb0 e8196266 de7d5cd8
+    4442b721 5efc9f37 b14cbd67 d42da385 ffba97f3 8fcf9e33 fdf86cb6 f86e4fc3
+    c5134577 61f9092f 0e208235 24811ccd 8bae9b8f ee1c5e6a 4ce0099c 45f44eea
+    118c0e6c 7b
+h = 2d1c9a2b 0df9dc97
+
+k = 01fb5116 d9de986d 51ab858a 0829f9cc
+m = c0a85ba2 588a934b 84cdce0b b4bd5c0c c4e89e35 e48dd9c8 fc959272 273e767e
+    b0f46c9e 14cfaccf 176267b3 b68b51f4 365fd9fd 02a15142 ec47d265 0b746566
+    636981f5 095f772d fb5c581f 4dba4008 aaa162b6 486d8984 a02103b6 bb4d45de
+    e6364bd8 ccbdac09 84c3947e 82cb27b0 2fc12748 4fde853e 4cfe263e 987f4742
+    8878264c bc105e6e 37ce0fa7 b5775e51 aab2c46b 300f70b7 be80e4ae a9d8101f
+    8946b302 5e32b642 71dc7fb8 84864820 d95ed352 4dd6e1d2 a2bab433 b77b1321
+    6bfd0dde 011e65f5 e17607fa ca1abaf1 8fb8906f ab6bab48 0ff1890a c74312cc
+    c68b4213 9a529496 d0b68103 baeaf2b8 3e382080 b6da0e8b 1321f68d 8fbaf52b
+    d72c090a b5ca2bd6 62eb0029 ebdb01f0 89667475 132782f9 c0a874ef 9a341760
+    a5b84c68 86baccf5 cfe661cb 2f3ff9a4 de432eac 9944b01c 98206133 464c93be
+    fcf45431 e4dc
+h = dcb3e741 0283f870
+
+k = 94c8d09e 68408ecd 809d699b 3d7353cd
+m = dfb56f52 e5c6a9ba ea1fe21d 59b602cf ffd6ade6 9fd6021a e489b16d a60c43b1
+    0261d457 f8f7fbba ad46ef53 34a4b921 a4c8fc3d 57a6707c 45588e5c e6581fdd
+    70880531 25c6716b 5fcb5fee 76090fca 3782a65c 5b67e5b0 c1ccbbe1 528236c8
+    0e5c15a4 aa704107 3fe44b6d 51507e22 84ca55f5 eda4a893 e13813eb 2d6a5879
+    c17667ad 5a693873 78d5629a 4d76bc93 4eb0fc97 b352f9ca 5ba12f95 cbf2254f
+    0311c935 2a863880 46072ed5 c0099a7f 4e267289 706c4c6e db14db32 e132f257
+    e49b8311 b9ed0be3 642906e9 26bcfee1 9adeef12 d4090b9a 27c4b8ab 47d95854
+    67377b36 79ac7063 0ee14c75 ed608568 56fbb507 2d8c56c6 cb48d9e9 9b6dbbe2
+    c2f6c831 060659df c3441dd9 b12decfc 108a381d 95294ed6 72778c63 55b7716d
+    92388023 f349f8a9 0b823ce8 0a391694 545a73dc c6fb2622 b88cd330 281c102b
+    fde10137 5c1a10
+h = 66bc3e2d 6e09488d
+
+k = 19052e19 0cddfffa b5cbf1f3 2247ab54
+m = 3c734127 4fdf910c f21470d8 099151c6 69ac478e d06509fe 4f215d72 6adfdb00
+    8a086f84 76b1c795 b7edb385 3fe7fe92 e8817021 48cc1b47 cac63803 50d37f65
+    9223f02a 176220ae 5967cce9 ab8d576d 656541e5 3ff831b1 717efa32 06feed91
+    0ba65982 619f9388 a214e857 8c85c464 e12262c0 b17d450c fa76d99e d62d80bf
+    10f3349f 59d0f357 33643dfd 2a64d8f9 55dd41b2 6bfea828 a99a7cf1 cb4ea40c
+    1c21536d 161ec9b2 e897748a 3be4dcaf 32815dd6 38b412d4 0cb84d68 22979ecf
+    ed871804 f4bed5b0 a32ba3d1 ac5ff7a4 7fa1ac67 1b480157 be5bec76 6b705052
+    22b228c2 0e76ee4b 8cb596d9 2ef09580 5d827a9e 3698e251 08c609c4 762e074f
+    908d5ea5 7ec2252e 28442989 318d8a89 2dbd8f0c 20598e2e 56784c85 4759b533
+    a81dc939 703515a7 8a0ce769 45f49667 6476b86e bdf5e5ef 1d8d885d b9cc07ca
+    2d51fa91 aedd983e
+h = 2eec64b3 c894d865
+
+k = 587c1015 80078e4e 1f8629af 4f753b88
+m = 5c77ffd4 070648ef 1e75508e 75b8c891 8d91c74c dfeddae7 ef01b1b4 c764e23d
+    84b5db91 8c0fa9ae 021dfc7e 7c66f0cd c579f0dc 96aa3c2d baff0ec0 9e0c4b2c
+    e70d67e6 e40a4925 9988302b c2eef22c 7116543a 2bdee706 e0742a14 9289e08f
+    643b912c a700ed5a 4c6174a0 6fd7e1a5 9d4d36f2 7c9fbf51 88d63539 f5f3c772
+    7139f0b6 34df154d 3afa2b9b 0331a791 e662c02c d9c702fe 426b7463 0499adbc
+    d5253906 c562a3be afac98c0 fc6aa590 3a9f2899 99825a32 02b5cf16 c9f3072a
+    948f0b57 e7a1ef23 ae2ae48b 5bc5517e 97dddcfc 1b1c5897 5bbec933 0abbc466
+    531439f8 d83486d2 4aa4efaa 61c66099 3f1b01c9 a7efc67c c22ffe9f 59c3c90b
+    9c629e23 e57c7d0e 7fffb40b 7eda2a9c 09f3fa4a 6677a335 63c84a92 9adb9d9e
+    37399860 0fce0731 50cb356b 447fba71 46fc4d94 19d4aa40 fd769e33 f699bc8b
+    d3db0d6a eeb22339 b2
+h = fba309fd 8c2b0394
+
+k = 06ee6a00 80064376 81ad1b64 fbe2a151
+m = 750c091c 5c617b2b ad713394 64f32fbb 0c87eadc ed2c27a6 686539f2 36d81dbd
+    d4a371f1 611b5d88 c768d13e d18410df 43c3d523 f86b05f9 3ae9c693 8b42d8b7
+    7b8ca2f1 b78dd431 cd914c1a 9672d6ce 3fd74d30 1b5c52db 2834b0a5 2140382b
+    5308a783 138ae9dc 832f3be4 aef28bf1 d05bda8f 8e4a374c 53226c39 b44f33ee
+    c1f954f9 d58db46f 2f2ab4a6 737443f3 51614578 1e69555f a6633ad1 4965089b
+    5b6b80a0 3fa6c43a 379ff977 11463435 90d1a081 f3d25423 f4a30304 f8bf397c
+    54acdb16 82d80344 960c7826 e3580b8d 1e532dd6 89c6ef4a 9cfd3360 38258a2f
+    050679e7 f82364e0 c7185337 004bdc8f d9b69f01 fded08f2 0d5b6517 e1ba7dce
+    6d90a7af a2dd0689 3b182863 ad305069 42a3a6d8 00859f96 2cf18589 534e2eab
+    98bea403 9b03ea4f a94dc279 521d088a 56177aa3 7ebe0dc6 ac7915f1 194b6547
+    881b6e4c bac34ca7 d982
+h = a82a5e31 1d847bd9
+
+k = 1aea6236 569773e6 5a0ae2ad ae83bf14
+m = ee1db34c 42a6ccd2 6f85124e d8dca340 827d3c5c 8894aa34 82150ae5 f026b9eb
+    f7066fa4 31bf5305 f0bd5913 37f164b1 9c1ef457 597bc7c6 7fab8ab0 e4829be7
+    6bbd3368 71f88c70 bd6c2ee1 8609b131 18a2ee0b baa17b80 01282aa0 192f943c
+    5fbf68d2 5fa4576d c914171f a56bf33a 3dcd03ab 665ace96 56e0e828 1362e1eb
+    91a75d59 24495f65 12b2095b 7b2093eb 6ddef855 b53a0679 444f2752 22541731
+    d0bc7ce9 7db415cf 7e387e49 c002a213 8ae26553 6779bfde 76eb090b d790ae6d
+    a0ff4ee8 d4f73b6f d86384f3 78651242 e623bca2 bc4957e9 579a43d6 f658e23a
+    d26631fc 579ab2bb db73e8e0 e1bd75be b1108898 70c776fe 900c1080 98e829eb
+    0f299a74 f2d6ed01 8a86a4c3 31823c61 40289c02 0218bfa5 4b630a8e 1de0cf5e
+    6f63cc91 3ad534a5 94a2530a 844ad5c4 d81cb5c3 13d8bdb5 40a975ba 62665a76
+    07939962 88a1934c 7741ba
+h = 65ce0d72 e042cc64
+
+k = c8394277 1562e550 455881d0 b43144f9
+m = 3d18d0ff 1ef515c7 6e7c81be fbc2396b 5bb75527 1e91016d 075e6f22 c4e47c94
+    0c474502 ec3bd09b 9a4cb4c8 5ff5c363 c55cfea5 b09c7b80 a9adfed7 adcc2b5a
+    567b765c 75c1229a b274d6d8 170ab1c1 a771187b de6b7ff6 685e4a73 e4a17751
+    500c483d f47f20fd 3bbe3924 1299e4c2 fbb62d14 af3ae4c8 5f3813d0 833b28db
+    187e3be6 9ba3c61b b1bcde93 d51cb668 6b776593 356d8cfd b212245d 96d5c9c7
+    aa420655 2df8bd07 15c98239 752fe169 e5138956 a7bf505a fbe8e6fa 6fd85ddd
+    75e5a091 7f170fe8 7904e179 ea414640 7b639175 b5e14c61 bef31344 38d2a6dc
+    376ea6ec a3730a01 a8fb0348 0198e6f0 f5ade5d5 1091d1ad 71201e38 042384d2
+    72e0c100 0fd70b88 110325b5 7805b1e4 6f315d72 d74fc976 f7a55a85 c6cdffb8
+    12639a83 54db830f 7fbb7730 4b83290a a11698cb 9d7098c7 6059337b 04205174
+    7b455fab 5ce0b658 df2a5925
+h = 8a170a6d 125fdbe7
+
+k = 203530f0 1dd317fc ca404613 76868604
+m = 65d4c6d9 0e62d52b 37cf404f ea43f5be 751273ed 67a7f19f 54248419 e3069e0c
+    e8bae3fe f3e20055 a1342d94 7251aa1b 48eaa207 4d59b974 4d6b6cb6 8fd5211a
+    9f6f4b56 c5e20ab7 c2b050a6 c9881a6b 0740f062 4114931a b6271153 1823d8d5
+    60ddf582 fc021dcf 9cb0c777 80058704 ccd2de17 1fb951fd 3a150590 5aff38a4
+    65b4ffc9 ca36d265 401d9530 760f309e 882e071b 7e3e2ce7 856aa2ac 54402f30
+    8015189a cb53f554 516ef545 e9af8004 50c9c63e 6a61c7b3 0cb72c95 68028a96
+    ef795ce1 1a6fa4f3 83b29a41 77f35fbd 960d3b52 a322a7cb eded8e55 de5dc053
+    e8836960 8ad5e046 ce7684b5 79b2dd5e 12078507 edb61fd8 f02186a1 65250ba9
+    6c8498be 022448a7 83dacad8 25301438 a84628bb ff0b10d0 be164853 e2a2a450
+    9543b096 75b35b19 d0f1056b 56d303a1 7ad13561 f6900fa1 05a36a67 690c2efe
+    3f2a13b2 65314d01 3c3ec660 1b
+h = 4563b564 40e2698d
+
+k = e8dad111 e744df8b 1405f0de d6ee074b
+m = 2acff406 95d6670f 79986981 461a4a17 dbb75e97 4e1159ef 979a489a e6bfffed
+    3947eb1f ef758a2f f1d68384 9687e2ef 9a0e5164 0ceaac71 6ee0860f dc328e80
+    df3548fe 562a5dfc 73626c52 626f1496 e3dfcdab d06052f4 f4ea9373 05b14a0c
+    7fb5d09c 4f9dca67 feb5895e afd4231c 8a77d34b 8e7e0beb 5c0ff423 29510157
+    629a1bc4 17d44012 8fcb4dc8 2f8543d2 fc4d106d 8f12221f 89813134 c4d1c304
+    ba67c1e4 aa73830a e8042af7 4a5dc2c7 84d2f264 18b734e0 1007a4b2 1a6f4188
+    3df810ff 860f80a5 a07504bc 683dda34 97f43c1e ca7d7f0a 6dfff8e9 e3c43e9d
+    a042a28a 1ca2852f bee6f65c 4108a13a 2b766ad2 0a2e8300 97642c02 aafe5b2f
+    c59f49fd 0b10898c ef799f8b ae766dcd b82c3e9e 9c270a39 035392ab 26886790
+    0b4c0ef7 0bd9f347 1224651b c952e903 400da717 723d0a9f 15eae23c 88fee961
+    97a91648 00bdde9a 514d2ec6 9cef
+h = 466ff8df c7fbc1f4
+
+k = 1f453122 effe72a3 20e1f34c 598c4d82
+m = 9eaf4d5a dc511c50 b47c8d13 4e5839e3 1219bf14 f6f73fd3 4853bb9f 5d33f604
+    d709766a 6718a1da c08fb23b c3c788c9 743cb268 ab20f877 5d5c92ce c7e88cf1
+    467047d2 e9b7b257 ba10f5f1 f81bb93a 6d3e88f5 75839853 82c844e8 e47d40d5
+    000c9db2 1b29f51f e49454cb 3141a21d a30ebf03 8376954a 482853af 61aea649
+    3f2d1082 69491f14 47b0921b 559b81da 08dff6fe 02b84030 f68f44ab c79f5d02
+    aad032b8 4468c454 3c7626f0 6ac9bf39 497dfa3f 481f7eec 1c7398a4 4f0f4acf
+    4daf659e 2abf7b0a 0e7a615c 9e84c4d4 6ee3e31f 8d5feaac 9d15960f b022b185
+    5d3b64f3 e91c6f77 5770c8b4 6bde15ee c067771b 623fd2b6 ebe9bd7e 33a95b3f
+    ae91b43f b827d80c b79996e7 1ffa25e0 d9c29c45 d7ed3758 04de7880 5de9affe
+    5cf6f7fe 5be420b6 353d1011 0e5c27a5 33d8eef8 1c9e6273 67f40b6d f436a0c5
+    d75fc798 6dd96ac1 24d5bf6a 933dca
+h = 8cceda02 f90ca6f8
+
+k = 1695e1d4 d1cb34b7 08a5028f 1dcd2a1d
+m = 1e20e52a cb0eba1f fc229f7a 26e8f8e9 1c9b14ad 069a4db4 b872cd09 40a4166c
+    2b9a9222 17089c53 665ccbb4 ed64fdb3 1d59224b 851132d1 54499b3d 997321db
+    a235b7e9 b9a7cdfe 04be09c6 240e359d 90a0401d a70def39 e0b2abc0 68b4f479
+    2fb605b7 96abe47b e2a43d22 f91e553b d86e660d bd55906d fca64ee3 00a68998
+    ea8ca28a 3efc0d79 0101b3d9 a185c3b5 3bde6a1c e3b8baae 724966dd dd52a77f
+    93c75586 067d3751 bc067e40 56e433ac 5c023be6 36ffc516 9bbcd428 8a61fd14
+    e8225bf3 a994f8c5 1248f106 97c382d2 326cb730 01064c07 caf6d1c2 176d16d4
+    edce151f 8bda56ce 3a531a31 83c735c5 269d07a8 7cb008b9 cb4e2884 da101e87
+    21996619 2179adfe 69fd9392 fcd2b6b7 8293ec8d 83d08087 75aa5bc9 8ed8b48a
+    adb94ec9 7b24764b a4c843a7 5d4e4697 2b436611 a94e077a 4abb8f81 e39c6299
+    0b2a308c 6cfa6ac5 f0dca236 3f6bcbcf
+h = f422dc28 d3e58746
+
+k = cb6a3f30 0852cc77 5e0f0b84 31842c74
+m = 3d252081 342ae29d 2b22570e dd3f3f7e ff580f91 a02a120b 278c259f dd97a123
+    49b89c7b 2261fc16 d51712c5 78f7de74 6a999cec ffdf6ea5 e8c6c7b1 68c00533
+    65564a67 3ffaa51b 208688cb e4fd6187 29f30cc2 a4a36616 4f61b57a 688d05fa
+    2712abb9 f07d7276 6df54430 518da665 c229c0c4 b310b889 c365639a 416b3a51
+    88744868 92a13bde c9e8e7e3 b82cbd20 08a2e39f 605f25f9 e346c6cc b286553e
+    64617b31 d5e5674a e9740d3b 9c71dccf 76dc724c 01c8f8a5 88843104 07ad9126
+    71c36aff 7039682e f815b46a a525b210 3cdd014d 7a22ff18 40cd241d fca20a91
+    d5fa99a9 a4b9de81 e2e87e97 fbbdf6e9 4f34f6eb 34fd9c20 4b3d37c5 3f0cec6b
+    5834b585 068ae14d 735cd77d 8e51e5cf e6d95bea 135e7b87 a3903a26 7e09fb2c
+    05fa262b feddaa9f 119dc025 3578b75d 24083274 331629cf b2d584e9 84971d2d
+    8f2ce1d9 59e0c4c0 9b74a64a c7cac39d 54
+h = 4d26060d 93b1175d
+
+k = 941d73e9 b122f41e 338fc755 6e3a8926
+m = fc6fa1f1 e2f099eb 2e7b6f0b 9461f580 7b86100b 029b5060 aaa891d6 be463d34
+    ff473e68 46c6f751 d74fdefd 2970de5c 8edbe22a 305cdd12 e0468a79 2666a39c
+    934066db 679916ff 969ac727 f4eecf0a 5c4e1c2f 061872c7 9c654e80 4c300d6e
+    40b31a1d e8a8b7fe c65ce2b6 15c472da b9c22082 f048aff3 738581f3 6189366a
+    cd6e2d83 20a55fce 8e67914f 4f81a292 d745df13 89c9ed25 2b03b433 af1a9fb7
+    5523ba13 bd287388 7c8ae79d e3d8ce07 dccfe87a bd6cdf1b ab258bfb eb417edf
+    fef13904 764ead3f d12e618a d542df9f fac074e7 b301a146 aa996f74 0a408541
+    0283be56 b7083e50 979d4262 22606c82 30b5badb 3d0a5ee4 46f8e2fb 756a806c
+    acd9c2e2 a9710972 0413d8e9 baf3e77b a68a3434 ece833d8 0f8d20a4 cf056ba6
+    fd7bcacf f1d7a231 7ec7ff8d 1fcf6c2c 8d5cbdfa 553fea68 880e3dad 01cff313
+    1951a901 06484648 f4aff418 d6a015fa 579a
+h = 1e57cefa f0626501
+
+k = 9aedd64d 4d542e84 fe165a11 ab1c0348
+m = 8ab7ef06 0aab0e3a b245cdac 1d45a0d2 40da1cf9 3c1e9d48 8176b172 68388fbd
+    2b2979fe 92dd0f26 43c07d4f 1a1608a4 06e3b28c 419c0220 293711d6 92bd327e
+    055ec702 220d9c18 71513b01 7e225883 a20393ea 2100ea4c 55ab9344 e7269c0e
+    ef990550 822a5732 c26903fb f1afa2d9 800b0f3d 0a07d0bf 53428952 8774b76c
+    bf70e1c8 1bd84c38 a5eb7a0c c0796adf 2663b8bd 083ddb20 a24a1909 482cbfc6
+    604af1be 4e3446d9 f56efd10 b0a7801c 3f8d57e6 116c56a9 b64a1032 74be4eba
+    3b07703b 338e02dd 6da7fbda 2b262103 916d120d b99986fc 90a67b7e 9a984cbf
+    4abdec26 72f7e2ca 0eb93a28 537fa346 c0ec687a 150b8b1d bc0c8d29 96ac5f3a
+    2bcc840f 9ba55330 c2817c3d 8d5b9d3c 84e80173 3ee9399e c55b3c2f 100ed9bd
+    32c8269c 7cc82051 38177a9f 80200d6b b1f46dde d8c22546 de69a86b 54288e12
+    ff8fb27a 74b2c42d feb514e4 2dcc38ad 8a6707
+h = d047d67c 508ffca2
+
+k = f379db6c 3051a64e 2595c5e0 d8c429f2
+m = ad7c95df 03cd88d2 4107a176 844e1e1a 8655250c a0130d67 41f08c0c e31a916f
+    bed4f485 a4b16990 9b2f587b 0bd300ee d29513fd 1574b5a1 85d879fa 7db643ec
+    ced0ed3c fa1b57d4 31b33bea 4449e573 afc62000 41ed55f8 ea01d379 9241f8be
+    1c943ee0 bc79081a d2db50ce 0ca65714 a94f74d2 8bd001be 3122c5ed 677197ed
+    957a15da cea0e17b f59d1eb7 5ead7315 817510da 42fdda75 57411e52 d2ef8e45
+    727e0b10 80a727fa 09a82e9d bf1371dc 68f15ab2 cd3788e2 160cb93c cffbb501
+    6c164f06 4f0559d8 e420031e b200f41f f8c8c3e1 f818c2e7 2affc78b bf253101
+    c243e5f5 8c7f7d0b 78832109 27b525e4 f8072e59 6ecfa125 573ae6f3 ff725631
+    d7116aab 1ae8415f 9090d56e 5e7a9433 e1c098ae 3611d6f0 249ae831 34b1e0b5
+    9a47fda6 6f145c47 a3e9cf8f 028f9c17 a6b1b3a9 c414b40f 94dbb139 265d868d
+    eaf662c3 2204f689 87e51fc2 37ced8ab 92ae07e7
+h = 29957c0f 4fa1cd34
+
+k = f8d90a1d 79afba6d 44a25185 ccda1993
+m = c771b014 6af0eff4 5d441769 ba80cc17 c0dd49e7 1bf6f088 1b9eb3c2 15535c49
+    1e615feb cd84dd76 ccecff53 be63750e 63867266 f2f74366 9255daba 7e82f399
+    ac783f73 219d548f cfb25c72 f8499238 5d6751d8 4d9c4a0d 38f51292 d7dbefdc
+    fb0a515d 82c75724 1737cdd6 4ba3ee2c ec67ea0b 6ceb6dce 8f4446bf bcb4f47e
+    1b794742 cf2ec950 0f56a8d4 d495f2db 7f32ee15 64a78b11 db1f6b15 6104214f
+    4b401049 c435de2a f75df71c d7569c51 4f0a8895 f6e781db 8ad61a58 05c238a3
+    e0feb015 c6229493 bc9174b5 e361e07f 826b9e60 28400ed5 19fd9ac1 c46da6ce
+    4e50491b 5d242f3e 2b160306 ff6aed30 2ccebcac 539bee49 bc780cbe 7dfecf75
+    102d9c4a 8858fb14 65af9e38 6a48b3bd 97a622e6 ac6549df 3312f58e 32da7a8e
+    d4910e73 6fe75adf f30b374d 4dae5779 9e7d03b9 67631d50 4fd3bc2c b1e7730d
+    6543888f 1962d271 a73ad9bb 5c86fde2 ceefc171 3c
+h = 72b5218b ab684e04
+
+k = 24fa04ed cfde1a8f 562d825a 88566883
+m = 6271da49 02f3873f eea568ca 9e4288f1 275dc6a8 534793da 49a52101 195e4df1
+    42219cc1 f3fdbea1 ccd1f207 a6e1d008 52639745 5e0c454b 20f00320 91d64d0e
+    08436a1d 3dc87893 4d731515 955ab5f2 fc1a4db3 de3da655 4f98b521 574d65f9
+    3a12a63b 1f088b7c 7042cb74 3493c780 a5397d04 93c73715 ae6ef6cf d3c53658
+    a01b2a4e f05ad696 9c93cc2b 1d789456 11953729 6c12686c 676ec3b7 1445b3e2
+    4df08be8 80b0b59c 05b7f271 d6ec0df4 b4026471 7d3cd253 4afc9a1f 921b083c
+    fa834a81 f5a4d474 07179c0b c4671f71 2b69eab2 e1e537f0 0cc29c08 7a87763b
+    9c624f93 588eace0 2079fdf2 c1890e64 716190dc 017f5b22 c7cce5af 324cbc65
+    aa188773 3f19bacb 34170bec d8f1ee08 2797cff5 74c542c4 ecab69c5 7ba300f1
+    3226481e 28789aa7 5b3addd8 020c149c 38910029 24d1aac0 2252c889 0607bd72
+    05c8d9fc 292b3c24 4c2e2fbc d72d9380 d58b6854 b433
+h = 9fd00b9c 29b31661
+
+k = 6e0533c3 68991a08 8eb45a7c d77484b9
+m = a39f295a 8d1b7cb3 4e6f470d 139a67d3 c083e775 bc7d2275 b0d300a2 81aa009f
+    7bc0af26 92f2607c 75719fe2 aac6a1d3 3089090c 570d36cc b0593d9f 534927a2
+    117a2706 b3aa96a6 ab9424f3 d74da977 5c4f8ebf fb2313ce 02debbaa bfd03b17
+    e1b0334b bf103f97 79deeee3 ca09556c 1fcf7a55 06c4a13a 271a75e4 f1cb367c
+    3097eebd ee2eae71 c95f32d3 cc8fd5f3 106f76a4 89d05703 a837fd9c fde09f9d
+    bebc8dea ae286f02 49d294f7 c7d3ff41 94dde67d b483c82c ea500629 ebe45723
+    6b733232 bc3f38c2 c95e481d c50d8faf 026da746 8d396607 bacfaa9b b3bde65d
+    d6731be2 e16fb57c d4892ebd 8c3ac674 5c1fdf25 f4f88cb3 c0d8e9f4 08c0a703
+    545bea56 eb8ca4f9 3d7c30cd 8d098d65 e56edc11 e5a4f2f9 9d93ff61 480d6aab
+    09d41d6a fa28209e 8f5c58e3 d9dd6fad d044acb0 87721024 554d7a1f 4bd3c81c
+    f601eef9 65ca268a 78715370 7995023c 92689d5b c38c22
+h = 1f755174 155e6335
+
+k = 5996b5e8 13e21ef2 57ad176b e2297b21
+m = 1b7c0442 f8136c3c bcb1f482 41e3964d dc3cf3f5 b679bf82 bfc5ca39 0b9bcf21
+    61037454 ec7ffebf 8c838dd6 65013984 f9e7ca7d 7d2b7521 10cc4ac2 b68e794a
+    61684737 75515e51 7dc4e396 8ca1902f 5e8af292 374d66ef 17af2620 6d20f789
+    998c90a5 fcc3ba8c 2d5265ca 02496ac9 3258dac0 6a93853d d3c68a57 d171ed41
+    d7c9292e 1ebe9efe 49221853 fd1d3768 222f940a 8ca44744 23d1d3d4 841250a6
+    531a573f ed9375e7 e457c6c7 cd5f7ec2 97a46809 126f6235 28a7e35e 1a0e3621
+    f3d185ce 7f81166d bd12ede2 a006e6df 3fe14d22 91b3885b f178d65e 65e58827
+    e24003b5 69f98333 9a37b6d1 8fa44741 88061041 35be1d3a 9e83792d 3d22a5cf
+    7b74992c f4a95986 b91a918b 943ff736 8a1169bb b2cfa3e9 b3c7bcbb 8714586d
+    098be99f c4db1442 68e1342d e732bdac c06af223 d8a07aab 2bdc0597 8aa191da
+    5d0880e8 d2d0ff5c cf2d2e13 9fb08fbd 96616bfd 869e080a
+h = 3c93280c 9da47524
+
+k = b8e5f8a0 2646250d ab7df091 1fa46f70
+m = 95476834 77ef57be 0f92c5d1 43dffab3 3e4b300f 819793c1 ac34da54 f015ce8e
+    492bd86b c74afbfd a4ac90f3 0248c27d cb627faf c6f6ac33 50e4ed9b e549c2a0
+    c9595480 8a44043b 79023318 766e5393 d526036c f7ef084a ecacbd14 5021de5a
+    690828f9 d2ed279e e820e891 a732f2c6 f20654eb 9df38f73 64749382 e612bfb6
+    3ac5555b ecede868 6d77b1ff 0932322d 35a51b37 4156210f 1b82d783 23e0980f
+    bf2d7d78 138d6700 1c79a16d f3e135a3 c1c14090 4e67161b 999f83db 0bf5a444
+    0ecf420d 13609a2e fb73bb76 bdb23d58 dffcba57 efdddb73 ecd663d1 5a00d557
+    15234105 558765da e7f54925 61ffd557 95549887 a43dbe64 c93f650e bf671544
+    3dca270a 35854c48 c4af8ffe 179b272a a95ce0a0 6a54426b be3978c2 b7feaec6
+    cf98e376 7cb489f5 30d4f601 a2f15a38 f76b95a5 f5b68f39 606c12c3 7dfe65b0
+    dc6160cb ec5dd420 f985ff11 bd6ad582 4286621c 5a4ee285 2f
+h = 506fff22 54698f24
+
+k = aaa66596 c673e3dc 94fb1f52 1308bbd4
+m = 5d70d84a 803c42c8 c795b04c 7cd8e110 09c52c7d 9e34e735 b9a203d5 a09b3f22
+    dab2ba20 666d9b3b 17ad930c f9cd9220 5f0f3ab6 7cd6929d 67ee9887 19f7aca6
+    2a62e2d0 3dc09efb 509b9b60 616a1bf5 407075da 26d7759a c698eac9 e57d7d41
+    5214373a 4657d62e 4e63d837 10ec2e94 ffff920d f4576c40 912ba75c acbbcbfa
+    f76c1d98 f0b0427c 4263c34c 7dd8ef3d 979db237 5a7a11c5 8b944043 c5efae90
+    bd3a5daa 6d597d9a 1668ca36 d95c908c 3bcb343b 1263e3a8 3d48f987 2da1569c
+    04e9ec6a b07c6c2e 16dfbef5 b170050b 6e7a9248 cbdd13e8 cc3a52af 56217165
+    24e3acb5 45caab1d cb2ec3f0 eeeaf97f 5ad62a1b d449f5eb ae0e7a91 98e603e5
+    983ec504 92ec9a78 97f413f2 08df4116 95073722 e2e06e01 04ba5133 ff40b368
+    9451b2ca 72245423 7d851221 7a3ed0da 86c46151 5e608910 d25ebc3a ccd969e9
+    50eea2b4 622847cf 28f437a8 2d67dcd8 2ec4021a cb2b73e8 ec91
+h = fe7678ca fa18843f
+
+k = a24d416f a54c6595 552450ce 10d1597e
+m = c3c7a774 b6faca0f 1337c9e2 add7e8d6 a7624578 0ec2445b 3d925c31 c1041b9c
+    eff62090 e795f72f b3927ecb 57995289 842096da cd508735 882bb70f 7c5aee3a
+    accd3bf7 f37c5bcb b3c664fc df0bdb24 b72ea898 d2920794 c729ff77 9d4ca4c5
+    81220874 e4df4438 0eca2b86 31da1770 85d74161 cea1877d f27f8bd1 f47eb3e4
+    93b90853 eff3ae80 63172fe5 d5352396 cc5270ec bd841aa9 0a0dbb4e c6c04451
+    2e25f5f7 30ccb1bf 3e418a26 a9caec5e 68f488d7 6731f187 49eeac14 a4e32d30
+    49051b52 8a91df66 9c8b61d7 6d64c594 810eb7b2 0c95f184 aa67bef9 c997a0ff
+    e8620750 71225065 381e1b83 a6dffa6a 236b2fb7 1c4062db 62eea5cb 2f9a5d3a
+    d83183f7 c744a046 c7090c85 d3c6bfaf 87281907 0379cd90 cbc7ade4 fbc72b96
+    08fec3d7 02e5b53a 86499d22 615ca09c 423c70cf aca7134f 86b62105 75e79511
+    3240c4d4 0f470674 2ac024e3 d2e8e323 c9a23703 537835ca d3f807
+h = fc7f02ad 4c02106f
+
+k = 6e264eca ce7ecf04 6759cf51 ac50d776
+m = 402dc38a 3b652323 d90de685 4636bafc 417edaa1 26001a2e e2ffe2ee f063497f
+    230d73f0 d36b02a1 b6044add b4c55336 687bdcf4 9777704a 2f8a3132 ea28381b
+    9321b871 28a9c87d d8eed9c2 5bdbe179 d01642ad 9928512a b0bb9f58 7821ae23
+    2071e304 39bc7506 044ce31e 2fad96d9 56a8a9d2 7ecccb16 c42529ec dd132b23
+    8e45d012 5a3362f0 52f587af 523b5e86 ea79222b 4181c414 63e7b3e9 feb2468f
+    4513a277 47d92ca8 443757a7 7dd3226e fc2c7a14 1afa7461 40081492 3df25510
+    8462eba3 cbef0bf2 bd5f969f 93501d61 8b1c0cc3 f811653d 6f152d61 7a4791f3
+    20e6d353 887be208 f174113a ca206635 6b97ea1f df089222 692a3a49 bb21f706
+    b29e9388 748d9abc 8176f566 ca2a10cc a5a18dbd 7473288e bf108caa 6c29e116
+    48b6351c b8d48cb2 ce01c3cf c71ee88a e4dddace dae95f8d 6be6ef13 35241a95
+    d5337efc dbee33ed 1c8dc042 9d97afb0 0ebfaab8 f790098d 064093f9
+h = 0dd4e96d d674dc38
+
+k = 25b7c397 22d4d3d5 47bac9c7 4125bf93
+m = f2fd106e 1b6f5e59 e77740cf 5e62c386 6c3d4409 3ccc79c8 f6dbb7a0 ee310697
+    2f42a433 015e4100 05950e45 d1988f42 dda3c845 a008edb7 6d8a649a 7ecd26cb
+    cacbc865 9c3008f4 c7a47584 99d59669 cec8f6cd 482b35ad 7dfc8556 aec1343f
+    0a1b1883 33144e68 d6adcf40 8e00ef2e 25595966 8c03a60e c95745b9 4c234bd3
+    5100f6bd ab82018b 61964811 591ac135 450b1231 6c31c6e9 64fe0634 e081ae39
+    6f45f934 7b81c190 fee6579d 1d1e811a 365b6a01 609e07db 5cf7be76 9e0c1d4a
+    4c209945 9765eaea e4e565b2 d88af937 310b5264 d8216da8 34542f4a 0ac5a161
+    a6624aaa c59df698 1ae02dd9 d10fecf9 104f62ce 612f2f3c ef6d6328 23e38381
+    481d575a 5f3be2bf 98a322ac f13d3116 6fc53aca 2352785e c72ae700 27fa70c7
+    47ac44ee 23e31a17 48fd0b75 10eb3829 35d39668 aecb6b94 9cbcd2db df388707
+    491ae66e 8ad0e50f 4339df8e 74171aa7 dcb14b7c 2b39eab6 8ab720e8 a1
+h = d298dc53 65a5c4e8
+
+k = 70b3333c 00d56423 ef8a7219 47a873a2
+m = 1a1f43b9 35c774eb 35d17b82 96c03656 47e10e0d c4b15155 e709dec5 037ac32f
+    fae442c5 a447f932 c32968f6 fef04720 fd57c696 0c3b948e d80b6fa7 a2c7e0d5
+    a051745e c5185382 32c41534 2960a4dc 37779435 646ffa55 db888336 a5893f3a
+    a19cb827 140751ca d1f51b3f ae1bf463 81852304 72b2452f 246c7b84 215fcdd1
+    cec4a12a 2f0b75de 89c61982 7e0990e8 65d4f895 8839d7a6 4af4c10f 9d717436
+    3b154f1e 66227267 ef66354b 507a526c 1cd5f8f7 04088755 9c83a951 e71b11a8
+    2e97e796 28ad3fd0 1834bc20 8ed73969 91c2328c 11c9b3ad c5ae969b 7a3bcbc7
+    1d27a379 9b27c057 b00bb2c5 a85c966a c8545add a08850b6 93e1331d 3bf263fb
+    c951deae 3802c72e 55fe10f0 420b544d 19152fed c49a89f5 316aa373 55d7cb4d
+    c237003a 557bf50a 4ab0dda1 121fd6fc e21b1267 9e0aa1d9 6760027d 3a90921e
+    eb6c8418 ccdb71e3 c72a0805 1ce39cdd bc01c8a3 d56996ae b1625eb1 09b6
+h = 1a57d7e5 95117501
+
+k = a1a82b08 0056ad63 0458ac10 b7070614
+m = 2430ae79 eccc9bbf d7cff15a 07a2b83a 8672a873 09578666 38b52bb1 68634937
+    fbb01e03 0f626aac a47c5f52 2eb13016 18c4cdce 86f42e24 caffce81 976398d4
+    313efc79 2a221aa7 2efc2bf1 9b528a69 5f835761 f3e48ad8 91e88e30 d8c78def
+    506c4a23 61121222 76acf938 182fa5c9 12db8d2f 6ea9d6a9 d89b2780 6e90b447
+    5582057f 0d1b0882 eddc1c90 c53063d1 26b66b1c 703da6e7 71d82267 88879abb
+    a843ec47 defc14ed 38153d1b 74fee3eb ce000c1b 41589c84 8bab2e49 3bd2dadf
+    22aa0afb f507717a 38d69070 5bd6e131 649e801c 2e6c136a f652a123 4a85d186
+    b19444bb 0d7dbc0c d64977af 5d5b7c99 e83a1aca af5e9e34 81be934a 144c2b6f
+    dbad593b e96c1ede b33c1e6c f2ac7a7d 680283be 27b7fc03 c3d75ea0 9b3fc1da
+    96ed7994 fa4c5a42 514aa391 4e8670be ff9952fd ec03dcf0 8dcd939b 9eaadd4c
+    4e562d33 03858823 59a2fc72 6a4ee29d 9f268df1 9303e1e3 b1c323d8 58534e
+h = 9c1681ff 08395b27
+
+k = 6162ead6 83b46506 31192544 3042ddfa
+m = ffbc469e 5ec9d356 328b6572 d18d2bfb d1bedae6 2c2f2896 55e0131e 105d35e8
+    19ad1b75 23a66493 42897b47 2cf6ab8f 85e28e40 d99cc8d3 8ded2a80 7582400b
+    da94f55b 03337349 97d5691e 7af50a44 29da23f1 decab590 aea2f254 d2c6ae4b
+    5a73a451 c7dfb4a8 fdfe1f5f 78bf6f23 7fc8d950 237db776 b8b546cd 12e4b198
+    b9f6a6f3 22e8b44f 4727e2af c48e9114 57d19d63 37f1d041 461b3182 87f9c8af
+    14cea3b3 68ea1a14 a8e154b1 976894b4 f674ebe7 f88b4634 367a9c7a d4c63399
+    8e467795 ea58f8d5 7a35411e c38072fb 3e2360aa d3caa797 92eb8f0c 10df0f8b
+    eaf1df5a 71753d61 e8bad1ab 6af9b30b b0cd1bda 5fdde2cc 95f94ef7 f5e2cc68
+    117c4ba6 70a179fa 23177519 21cc9671 68855604 b5f87ed1 7997ad1d 92a76c49
+    5b931827 78975e16 3ebd39b0 d978cb48 d647c98c 80903d08 3adf6f61 80901edd
+    e7ad9b46 14867abf 50399e15 3ad44d14 d0e577cd 05ff4685 14e333b3 6f8ec567
+h = 26244386 b79a6ad4
+
+k = 2721ae50 f79de2ef 0b64cc0d 7fcd2b39
+m = 191fbffc f955e205 61806d84 efe2f55b 3295a751 2f5febfe 5a114934 723f390c
+    c28d993e aa81e9c0 3a42afeb bcf35925 af34bbe6 bef50191 5d3dbe9d e88f9f21
+    f19c6cbf aea22773 ed44ea2c b83f3dbb 7a6d734c df4c8efb e62ac90b 09d38105
+    6cedecca 6f51417c 542ce3cf 7270476d 3dbd7d15 d067ea95 702490ef 340edd71
+    f459a21b edccf4c0 ac1e58d8 bffe7b42 381e626c cf37ed37 43e41f54 be05d4eb
+    9eb442aa cb7539ee a0464b53 ca440236 a324bc55 40318d0f 182396a9 4717fd98
+    61423f40 c71b77da 24cf5f0d 9249b3b7 02bac839 a977acdb f609b16b e8160807
+    44e72be8 44786e95 6d282fd9 021c7b14 4767963c 112c7d23 00f58824 e29d35bc
+    41deaba8 45554d22 e6e7e6b9 65b218f6 0093c8a3 234b74b6 8686b1a5 5b6f850c
+    9fce7e8c 290a4311 e97efa0d de2dd1ea bc531af5 55bc2afb abba6781 438a0385
+    bf4217e0 04c7bca1 78801a1e 40fe5587 d8c9f517 eee93f1d 0fa3cc0e 408fcee3
+    fd
+h = 704b2d66 c90e0a11
+
+k = 3b3b522a c4b61775 1ccc1bef 7e129b7c
+m = f0b5822f e1f85a8e dff8fed3 3a635b15 10be65af 7f6256b0 ca0df095 f6d6b90f
+    5d9db55a afc148be 2d1eda77 671284fa 72c454fa 1c45b379 85e846e3 4896fc01
+    f2769145 a30d2156 7ac89a07 b343be9e 04acdfaf d03f87f3 0f2fd7b6 f4230330
+    143cdec4 646291f6 0fec4bff 0f482265 978fc226 7d8c0e14 b73de374 89f13d96
+    cbe9b125 0cd197f9 0149b5e4 23aa0605 73e1e0e7 7ebe66e2 cc3eaad7 c46be792
+    57f3bb3d 5dc27abb c09f21d3 dbe4304f a41022b6 d132c955 05bd7765 2d33329e
+    5c295f24 a7a75d14 c223ee28 d1655625 b5dd282f f3320974 ee6258df 446d922c
+    cdb0737a 1332e238 b7e44dd8 83b38857 53671e3d a17b404e d142894c 3562e8f8
+    2f38f870 cacbd436 92486e31 8d53a60d 3bca1377 60ffda98 5e500300 68e68690
+    e6fe5462 7b5a532e 71e076ea 3370fe6b 74ee980a 2264a5a8 761d1f4f cce5287a
+    5aacb9c2 b424ba9d 853901da 0da1a102 939ba76d 945f1c30 be528511 d010259f
+    8a2b
+h = 1b295f97 b03a2edd
+
+k = 5f4ebaa0 7e68fb1f a5cfbff1 e24f97e1
+m = 8c4b55fc e475a3bc caebe4ca 68e946f8 b0ce5c4c 869350e9 a0713bd2 cca7a967
+    3b446c33 fdfc2e34 b726b895 2d8d09b1 857b786e 89da26bc a9fa6435 ca26c4a8
+    56cf76c4 08c056b3 79d2d3b8 98164aec 8cb3842c 4b8ff629 824f5ff4 8879187f
+    172139ee 40f222e8 2fd65f8e af1ca228 f2bd671d 839212af 48bf27b5 72820607
+    af110cb3 08850d7b 34b8fec7 4fb0c70e 7b6cfcf9 e0198a99 e2d8b94e 2b765546
+    d92d9788 c961ec74 4722c4ab 94e6a136 6517d4ef 2b94ba0e 988c1dc7 f6331c53
+    f8638494 581a4e65 5779f7de 7bf3cb33 70d5d234 dd32517e fc62bca3 0dc57791
+    1bf1a2e1 735932a6 6aaf4c95 9dd7450f 14618108 d8a5823f 9479b1d8 aaf30ccf
+    8fe99225 f59cacac 33e4ce37 f352cc9c 4db6ee3c 7d1bea79 6c0e66b2 643f152b
+    8b30c7f6 3309533e a48ad492 b75ac9dd 5051936a 133b9f60 9fbd00ac a9538f24
+    272ad46b 0b4ab17e 6d3bc106 c77e03ab d0c10ce8 78341fd5 ead9a619 8d233b44
+    a917d3
+h = b458415c 55bd7b61
+
+k = ae88a0aa 7513b44c 7c79850c 810868f0
+m = dad339a7 52581eb3 7112c6af 8ccf6879 b4cda16f e6ade869 61628339 fbc1a669
+    f7da0fe1 9f39d1ee 8f25a17a ba430198 5f936599 f76c9853 fe2ffac7 c718e7d8
+    da0d2ba0 5edfe2f3 1718c68b 4f27d0e5 95d67444 25c352b1 d816b04b 313cca76
+    2ac8534c 526a3da9 5149b55f f3223c95 25727075 77a4d497 b5338b43 1442b039
+    413160ee a2cad28e 8d789f7a d1c24f41 bade41c9 ba24dd7c 64c9de97 329367a7
+    baf1a4bd d01b9243 c5f4cc51 50f31b17 db401720 1b0ce57a d4b392ef d8ca99f2
+    77e8c8e7 d47a42fb e94ff7c3 5f4ef088 db664a3d 77fe86ab 02f7816f 039c7686
+    78831abc 7604c262 30cde507 a001150d 4b142988 9108ee89 093a9916 427388c7
+    106f0270 aaddee30 0707573e 7063dac3 260d8c36 045b2470 c51e7aa6 06386b86
+    3e6e0505 f6734581 f77bcbd5 5e6e48f3 fcd3251b 2a1b8dbc 0cec3973 1d859c7c
+    c42b4e71 20c373a6 e09ec958 22fb9cd0 e1130740 1d5a62dd 931ee434 4f1b674c
+    7d002b48
+h = 87a1cf8b 464e4a9a
+
+k = 851e5528 8432e3ea 3d391401 335e157f
+m = 347ad142 8c98e252 c28b43ea abcfe6fe 85b5c6d7 4e9c773c 5873ec75 48d5bb2a
+    dd6a7fdc eed287ef f4f47b96 ee8ee07b 790e4147 56aac544 cab8c00e 27e51d1a
+    8fa04660 aa8a575e bd66e4da 0f4da46f 8e773867 5348c84f 070e9e01 82386272
+    125750ba b9a9bf82 3f9513e4 c0add49d 89e7e0ac 9818bb1f 23c9bceb 15bbe3cc
+    9be2d0b4 e18f1193 7eb2e869 8bf56faa a7638371 40e53621 6052001d 10b938a8
+    45bdf6d6 e1e7f1ec 7488326f 0f57f236 4de3a280 731e92b0 943c62a8 a35e2fff
+    20b0e454 c195349c 71abc818 42bb433d cd580a87 f5fbf841 4c745c95 a579c949
+    bf90ae7c 08bb2a3a 0fd99bc5 5b86d2cd c3f97869 68a75bd4 9fb6d928 512ff06c
+    e574dad4 178c842e 7120e913 b3de0fe8 cc956eb4 f038fbb4 d0868690 939e2298
+    c0bb744a 319143ec 183f9fec 8b1fe63b 22cb009a d0ee6c03 1c27f4f0 fc1c8f1b
+    53bebef1 ac0b2937 8c951015 16b6dc5e 574eeb43 d20ab3f2 82a6bd66 5b62052d
+    f2d25202 f7
+h = 684c403f 2a5fd537
+
+k = 0a4e0a6d 0bd11330 95e3c2bf 5b40b6a4
+m = 87ed904a 52013a9f cb10bdc4 2c55e7a0 1b447947 1b18d746 a72483d2 f76e0068
+    b0d33b07 d00a7acd 81ac2862 1a31eaee 4dd39399 41bc7cdd f4b79579 40bd1e45
+    e8ed5611 56969d5c 19ad0e21 e5d27672 baa770bb bdf7305a 39ed672c 4b96bdf0
+    2c80764b 5b0c698f 52695b8f 4d099a0d fb9ff68b 2f8ed0e9 a138ee17 5f45c16c
+    d7256a4d 8bcfd1ea eb81e42f a9cdd1c0 e2a6a269 7802e0d7 4a7483bf 494466a0
+    ba8c7c99 01a5bbf2 dcef4367 5f5844c7 f0af07e8 8712568c 62635b47 08979966
+    f84745cb f80a9a34 007d7b3f d5dee585 16fb2024 727a956b 3841a47e 689f7b97
+    07d86ceb 0935bd16 ff78dea9 66bcb057 fd68287a 2b194d70 77220b29 8f9250e2
+    dc385dd0 8f4fe961 7f00e246 86c00b6f 1cfa4f9e 471c5b37 6ac121ab 6896dbf2
+    8d794773 89fab889 1d7f8c0b dc520354 c1671bfc 548d2553 abe819c0 958fc460
+    d55a1609 b813c0e9 aa80ae0a f8102ef9 b2d9c110 ea27285b 2d9b8164 3080623b
+    f44796b7 f105
+h = 271216ef 22f2fb45
+
+k = 20f92336 c277e089 ca4fb34c 7644cf32
+m = 8c08fc6a a5983a02 c6d332e1 be3a91f5 20b9bf66 e3eef20f c8cb89da dbe19bc9
+    67e1d561 dc41fa92 da008d50 3969978d a892531c 7e71d95a 7399730c 057815ca
+    c583acee b14be2a9 f6d86414 7df1057d c358ed45 cd3aca17 9a7babaa bb102999
+    96289151 4ed0e8d5 ade0f6e7 16d68dac be08e419 ab074341 ef7a0b33 d21e4391
+    1053a668 1ead83b4 b995c682 295a39be a650ba64 401d10a9 78b9f89f 14e9f55c
+    f939cf0a afd1297f 55822807 d7e88efd ce74a8fe ed9235eb e927557e 6d78456b
+    5cf4c60b 94b20425 e732e364 f6e75332 7aeba2de e2e0e6dd 404fa5e1 87b60716
+    e6accd9d 0b20e06d 71bb2de0 61f591ef c2eaa60a b5648c98 f1249e1b 2a76de46
+    4919bcfa 08af087f 6dba8d13 39ce57e0 871d6816 4b4da982 e0e06fba 631f6532
+    9ed9af51 d15d5c98 3842ffe8 bfd5f2b2 8a0a0f9e dd9a56f0 4a95df6c 2b6a035a
+    76180eda d2b71ca1 27e7d9a5 eff5f73c f6ae22c2 bbbf9b2a ee8b9330 cf25f642
+    04754973 c6d454
+h = e57dbeb2 f5d88776
+
+k = 47d5c73c 646842cb 5f6cd3c8 66192530
+m = 2f61f981 374aae1b 326ee2b9 fc147c97 887a28f9 a02f9e74 bbf761f1 0b32f8a8
+    7b44b002 4a368e2a ee9dfebb c4d3479b fa54dbc9 aedaa4e9 87eb70a5 570dc33d
+    1fd27a47 2f687f76 b72c1c62 1320f669 a2c839d9 2f0d679f ec630712 3883553e
+    449ceb78 75390b3b f868b8ec 1e3a1657 9645bef5 b59a8790 5f8f5d5f ef3b1a48
+    4d061850 95142c68 883babfb ef34dcde 81257548 4e2a32e9 c986112b 55264c78
+    0525c525 f2da7c57 8edda8d3 f9b96954 909ce512 468e21e6 bdbba680 04719803
+    0cbbf1ba 535f6af4 8a554deb 21d609a7 9a43ca86 5647113e 75b91bf4 05deafa1
+    e3ea3982 96fe44d0 9a87eec2 294d2720 6cdf3b8e b5b732d9 1f2285bb f92c1fe3
+    809a19ea dd58f785 57abf7ce e78081a7 4fc7bd00 0eb1028f a1396d74 e6fbc131
+    3ef01435 41cc3d70 919f0836 cae23e78 c68ab312 9a4f5054 829f0dd9 26837b82
+    dd22c609 66ac7fe6 cb40d354 f0429f70 070dc8fb 1f696f59 3bea9e53 88959766
+    64f70c7b a657b796
+h = d1a113b4 a15f33ec
+
+k = 4b0612f2 46b0ff80 36ba80d7 c001bfd0
+m = e7d4161a 54511d12 a969a28e ee639200 15a1e4db 3c174592 37239958 32955dfa
+    d2cf1cbd d9d1a2fc fa220a5d 6f9cc710 b9f602bb e9b5417e 94b00130 2b9c3fc4
+    788ee684 a548b394 50feac60 f8506443 e147f848 2b20e0bb 51c95624 3b84db21
+    707ec40f 1951d23d 771e5ec2 1606c499 d13babba 6e418bb0 2cb5665d f6570b8b
+    dccea003 2d844c3f b158a83c f8fff224 8b8247b1 fb080010 fdd9aff8 1adc2127
+    b1f58e67 d19c6fd2 c36e4ff9 1617f30e 2f929b9a 55c611b8 1fe3aeee 8e300391
+    b51b7818 b48191a9 08c44064 8560b402 2a055a6b 34037cdf 5c985af0 573e28dc
+    764ccdbf 7a48746f 310d62e6 3550093b ee420108 c6c2145f 047bb2d1 ec3fdee2
+    eac358f2 9a8eb218 c4830aa1 fbc2e8fc e61abe45 81158eba 00dee125 39c511d6
+    e5ff5c17 605b1033 c2e2a16b 94082698 908a21f5 cc83f99a 06593f7f 2d3bd269
+    db371420 070540b6 b5c9a907 950aaf61 03274a90 3424c893 bc35087e bd054807
+    e22ab8a0 99776f7c f2
+h = 15eba5a8 4c9cc81c
+
+k = a38ebf3d 6f708706 61c7c6c0 c180202e
+m = 256c9e30 06bef283 beddc701 ab6bbbb6 1e132325 783196f7 a183e791 45968477
+    fbb31d0e 74b50476 4681a2b0 86cddb03 40e725fb 27a6a6fa c7f0c9a9 c22824fd
+    75d67a7d c2084f59 6e6858a3 31296d98 6b1daad6 e6b54284 de7b0690 9c37f0b6
+    6341eba8 a9b47be6 fd6fac1c 3167dc88 12f5f761 b3d50afa c3a54738 49f66faf
+    631fa25f a8788292 571f264b 277007b8 3074aa3d 1b3dc90b 908c81d4 e9874880
+    a18e78e4 6b0b4e01 fc4294c4 7b0f683e 11e288ef 37ebc8f9 a2c7669b e3f6bbc6
+    539759cc b29142e0 660d394b cbe0e688 31a96002 cd64c8ae 6bbe7d34 6009e491
+    48da65fc 9d1a7a8d 691c2af5 201decad 7f5e9c1c c9a88931 f993aa93 aa5cd1f7
+    1561b29d 8d6a5448 7e3b0a4b d5d6eb8c ff79dc16 53347198 1ebce080 f424f619
+    fa0d8582 30420b6c 8d05e443 0486c6df 871aa86e f3a452ff 129eb83e 94ecd65e
+    fe9190ad 7afb17d8 f0ba4eb9 a82ec38f 25196f7f 61103d46 af780412 db46da47
+    c48b66eb babb52f4 31d9
+h = f0723f74 7d9af0ac
+
+k = bdff7f95 a5d74207 a3bd377c fb1c5e76
+m = 21eef79e ed0c6f44 ae2ca8be 08aa7d8c 4138c5eb ff81ae5c f82229e6 8059a5a3
+    b6483ed0 f8044cc0 f0f28e5c 49020451 8821668e 34865bcc b583bfa8 1d5a15f5
+    fd42f9fd 187fe5c5 59e2a4e4 30d95342 8864d242 42a0b7d6 7299ad0d 7328cd1e
+    7d50019b fbe598e9 7d2391c8 15b3bbda d92401fc 580e505e abc3a0b5 a67323da
+    0d7bb36f e84d4d82 00f68250 51e0bdff 3a745247 040bd728 9ba81295 03f1c4f6
+    01666121 9d532d00 a2b44456 4d7e4962 0ff3d5c8 f2623947 9d98d41f d06bee70
+    6b410ed0 dfb3a36d 6fc0d08e 95992135 9a4148bc 8c86ddaa 0e290080 26a8e643
+    fc081113 76249955 aa10bc5e 8035acf4 6ab9b2fc 13173ba9 b6e045fe f033bbde
+    28265b51 1ea1e34a 90cb80e2 0b3e2a8c 1266a680 9014d262 0ac0715e 14cb138d
+    6a9b56d5 984b0ec2 f140b203 5f1c5761 2df36503 b8416e3a 94d2a7bc 6ef34ba6
+    c426a391 b74ac067 05dfdb4f ed7a49b6 d8fd023d c895046e a12d779e 988b9918
+    ecdd4402 ddfc9d66 823305
+h = 7d32b325 74e14b4c
+
+k = 0db50bc6 b5769afd fc10c531 6f041489
+m = 839f4f91 87d30d81 b4c32ed0 ef7a02ba 1acc5944 10661193 3503184a f77decec
+    6d4b4e85 5c594676 6e20dd39 275a1f6f 32fa2c67 0417c206 59c46785 93669c10
+    8dcfb263 402b997d e31ac106 8fc7be23 835a77e5 dbc53c6c eded2b3a 40727005
+    ea0546be fa3863bb 7f4bea1c 35b94810 39685c98 ac0fb584 2c0cd919 353109a9
+    4e6b22e5 03dd6489 aa8ee76d 92c4c644 2c709867 c9102567 4bcee17f 87e1d066
+    ebd408e5 ee649dcc 06273c5f f2f3b805 4de8c84b 9e2ce95f cd4dc613 d45f57a8
+    0e2961b2 c3915cb3 196e9972 cef5b4f5 225f7a8e f2ec048f 38b03bd7 2329c88a
+    57d9ef70 606e47ca 8035b980 ac5ddbf5 eb152cf2 cbef42bb 558246a3 602c0709
+    4d0566c4 05678c81 f7565a0f 0c4a9a3b e26fa54b 6e5ac498 1b12fa94 88e1c84a
+    6028bb3a 7d3eab68 384cbc9f 50e573c2 07da95de a26eb9f5 0d988d6c 392fe82b
+    c1e82780 89cb1286 1a66b694 491a88d5 3d575e01 99a3632f 1d7244b7 0cd4700c
+    fd3b5bb5 9aefae72 6a4b004a
+h = d6c0c31d 59467ead
+
+k = b486d984 f4c9605e 7d2a62ff e366250a
+m = ed920bff 6fd0d2bd 10decd77 260eae2f ba493730 b13794d9 44599279 5c82df92
+    314ae94c 8b27d787 fe3f4de2 cd84bc27 2928fe5a 9b22680b 3ea1f61b 766858a2
+    697cec62 ce0c24d5 d59fa6ea a0002b8d e0307255 bf5df9f3 58ef4765 393711f6
+    022d81e7 7172cdab d1f507c6 a0aff01a e0cf71a0 a1b3e20f 74b35e75 9e04cb7c
+    d018c257 c2a73998 6d1f84a2 3c5df696 2127fe4f fce3d006 6356c146 600b734b
+    54b5c6b0 87e38ab9 44c21101 6117c1e7 89ce68fe 6442e42c 02eb7e2e 2d864d32
+    ff0da29b 92a1eb05 21571c55 9dfd8fda e66b06c7 79596425 3b3c747d 8f90bb4e
+    7ee581f2 d9bcde41 7decfe0b 42e20eff 0f7a9ffc 78b34e37 23a1a42e fa4ec090
+    070c7e4e f01962fb 86ff35b9 d35b2131 8d31e1a5 42fb8c18 90ea97c5 83040b65
+    8cdb72d0 cad03957 f48b319d f4aa1662 fd036257 dbc340f4 3f671822 f7548f1c
+    28f98e19 09968850 0875be48 dd3814a7 fe145d82 7feae1e1 5f6a5688 04d9061f
+    ba2eb9ff a35d36ad cf6c6e8f 64
+h = 01e7a54c ae14aaa0
+
+k = 488fc097 329a696f 7e46b54f 7b34e58c
+m = bc292fe7 e603f46f 7ac21263 028901c1 48501370 bfda2138 80e068fd ccb106cb
+    d1ec297f 6907b676 b2925a67 dcc31105 940c19e4 3419d4cc e0d7de2a c98f7188
+    26fe6120 eddea11a cce0b780 9a725ebd d739d78a 9d7b04ce 6f1a1ee8 198158fa
+    ac614761 43ab42a0 9c673237 e91c84d3 ee023b00 340cd08e a5f5a07c b2a46986
+    9ac9fc63 5409d41f 1de25dcf a4a69bf4 27a5a7b0 a4d3ae75 3b982566 0bd3ec4b
+    a4f3a9f6 8f6dea9f 525bed86 7225ec9a 9568d7ec a918e694 711f440a f9936140
+    833b9bcb 0d53fb6b c03fbfca 836e4c57 1b6f07b8 1ee33dc3 92ad7902 685e9767
+    4601a960 ba7da174 725ce7b1 96515ad0 b43f77fe 7399adc8 ea068d06 e5946727
+    64e7a7b3 a2ec0261 72b22bb2 93e1d779 d0d6a454 70557942 a8c69868 4b244b94
+    df209fcc b6185686 be1c5950 53a59613 e41c0623 1a8d8f70 b95707c7 8468cfb9
+    2c8d8110 58652872 c2b102ce cd4c19cf 431919de 6c706b7b bcd48c6a aa7498db
+    6833aa9c b4ae688f 6cd644e1 85bb
+h = e7c6ac09 cff2e967
+
+k = 6647855d 8f42299e 32051ba4 1973ca76
+m = 9b8f5e84 06354fde 98fb17f9 227fe8b2 5938c0b6 70a0073f a8325257 bc0c8f93
+    8e6a1ee0 70ecce86 f6973c41 88d583e4 019c687e 5c7914f5 3ce4cc19 ecde44d6
+    eb3d7674 eada2d6d b29f6cde 73ec259e e4a2c5c9 26e3eea2 4ff9807b a1bc546e
+    193762ee ce874ff0 816e3706 58c3bf67 3eb17dc6 e26ec25b 3c1edfda b94bb593
+    c0f67343 bc6ddc82 528a229e 73d50d97 cc1ee34a 57fcb6f7 b80d1e11 5a6e0a20
+    a09bc8af 6d9cca49 c1bba3ae 8fbc953a 0bb32e87 c8747798 0190f53d 477d30d9
+    aa03382e 703420ad f1ac2e12 70fc99d5 955183e2 3fe282ea 0cc939b2 3cf46e87
+    200dc37e 20bf691f fd3a31db 82b9b754 ec99954c e155be46 171fea89 8112b919
+    0fb26d2e ecacda10 2f6ff5a6 aa12ba9d 01df5ab2 0589ec49 a4c1b25d b333c815
+    2f290de1 d5f94614 2828f16c 5096ccf5 2b6a8a1b 67424007 624ba9a9 fdf6975b
+    d2f79c98 0802be2e 8c2d9111 7e0d9fd1 40569d94 c5090dfc b4828a60 ff1bddf2
+    90a04a7a 2287d77c 9837438d 122cba
+h = 6d7f1cec 6f3fc7ae
+
+k = bc9d34db 5a8c3f6b 8c0524a1 64edcce0
+m = 373f4394 5b3d0c0c fe034a9f 7d328f2a b3d41c8c 65f62e19 9a06addf 85cfb34a
+    dd5e3abf 8857abcb fb79a9ee 419b67bd 0fad43a9 49d457ae 1f50493d 142ed0f8
+    e5dcfc74 64ba89b3 eaf00177 b333ddcf e98371f1 9f3b2266 a199ef8c b049cace
+    7900cb8d 8851bfd3 04490464 d3543b06 b6107d21 10f18209 80d6a8cf bfd4d708
+    e06f184b 4ee451bc ac858c9c 7cdf7a8f 503978a5 c981c408 2be90aca 643827dc
+    53b58d2e b8028942 f2255cd2 4ddf8a9a 0103ab8a 36b8c135 ae99ab58 15a2808e
+    38a0f25f 8f240d86 c1b319f4 bc3f0d54 9fb0b332 0895fb73 4b25c532 2c044fe2
+    894c2cc2 31ef5902 1e578cd3 e2cfec2a 112a867f c4a9121b f9b6570e b94b0da7
+    05113471 4e6cceb2 34144c00 019bb935 a0ec94ac 121c7384 4a416592 06de6da1
+    a9eb6ed4 ffe62494 68f06f6f b6b08759 7a64c356 4483ce93 003619a0 53f12ad0
+    bf8f577e 8a0bd1a7 1f4f5c2f e077c128 1d059716 f846cb6e 0b637cdb 667a29f6
+    8b50e823 7c82dbc3 93599ad5 5e3a0140
+h = 91b416d9 c60ea221
+
+k = 0847f241 1f1ddab0 d38f050a 6f58ea74
+m = 0eaf7a0d 82087f5f af14287c 40df4110 1d9d1f3b 23467424 32630144 6c44b792
+    dabff85a ea91ca23 3abb7310 7464e5c5 d011b5fe 6f2651c6 1453ac00 ff752625
+    375d1901 79ee8524 4cda4e46 b964d4ed f1d7cc23 c9c110fe b7bb792d 445acc20
+    5c39399b 10dc5919 778db103 6adfaa69 7e4db2c9 6c557463 deb7c059 7c1cd606
+    2a4d7fb2 6b8a860b 592af7de b8887f6e 0940301d 26fd9380 bbdbdf6a b62eed6b
+    bc0bc740 721840c7 91988606 55c25c86 0243e4a0 19b4ca24 c0a9cfdf 3ffe3c61
+    577442f0 4001aed3 232952ee 1a6f95f4 57b698fc 2c9e32f1 e65ea0d2 1629b7cb
+    e9139c5d cda8d09f 6475bc9b 0986fdf3 e3abab15 9d4a860d 65700543 5ac78943
+    604da10c 3ed02620 a3d709a6 058f7d27 557c1960 7db2a784 528fdd1f 03f71a16
+    825c5a1f f4a1e200 df436845 ba7fd9b1 55bec0c7 5c82b53c 047c30d5 6c85c2b7
+    9beba1ef d6028514 1317cb81 ce119cc5 39cfb5b3 db82c905 f5bc641c 2c688ff3
+    64de7fce f28f0f32 53b186d2 1fd90970 1b
+h = f490e25e 1382a0b6
+
+k = 63804891 9a0599da b0226b28 304a17ab
+m = 6dffead0 ea0b7114 36cd98cd 1dd92dfc 3ba92163 425a3a92 e8e9d40c e05ec4fb
+    728b3911 bf825b6d 21fb4fab efd333a8 9aff2fc6 7bc020a7 193d2ffa 51ac4a9a
+    e2424fa8 4dff5400 956bab4b 21bc2832 27904a70 3bb2fb8e 6af84883 35340494
+    5ee9543c 5f33a814 d3f12768 75fefa9d 8e65912c 544ed8b7 b5205c3f 9801607d
+    45ff3343 22ca53f7 81d04a96 3b01f62d 1cd3e7b4 2b0112a2 674e5179 bff19029
+    2ec03f71 777de4d3 707694d0 c648909b 46e103d5 1770a8d0 9b61f71c 644a8963
+    1668e117 993aa5e9 cc261938 a23498f7 56fccedf 1dfe2d01 01746d97 04aae764
+    a0489c2e 6ff7a72b 5c29e2e9 b5aaff2d 85d3b606 0e070d1b 95ba6f05 f03f45d2
+    ceebdf43 5dc6ec57 e590d8ec 190fb940 feeee850 f9c0f316 0e812dc8 85b2effe
+    57b367d1 5cea2bd7 a89e5129 ff90dbea 3ea3217a 4a79f960 d92e8cb3 3ede9610
+    79c2b2a2 e0b2e7b3 5737edff 9b809e07 50bcfee3 3cc62757 3552938a b8f9672e
+    b87a937e 98eb7c48 dfb7fe37 63cfb46f a458
+h = eb3403c2 8f09e8ae
+
+k = bd2b53e6 daed1be7 be368cbc e2d4ce8c
+m = dc6adc07 734b5119 11bc5336 e6da0286 dcf245a8 ec3ab294 1f114702 c8a6f015
+    8bccbebf 3feed810 2106c05c 2c62bd36 08f712bf 7c33b972 1c6b64a6 5b2a1e50
+    2bf42589 8f247980 e24e3cdd 38033320 82eba16e 178ee8fc c5f6637e 503b6854
+    c30300d5 5d94a638 30937f1b 04c530aa a5174c49 bed886ec 846e7560 9d040227
+    4a20ad7c c2bdfd4f 7e3fba06 fad25baf f7ca3c66 ce6f034c 316e1090 37abaf2e
+    2b6c1eb2 41936a5c abedf110 3b152568 5361c210 3ae96b22 886c27bf 03fc0766
+    01b77b8c a3f1e2a0 abdadc82 4675b15e 511c2406 5faa4b5e 45423dda 9b4def69
+    0ac32c70 59286555 73d9402b 3fb7309d 7d9b9e99 a3803839 fbc1f569 8b87ca13
+    32fc08a1 7a2e564b 5849044e af410b93 ac8472ee 2e81b60b bdafacc6 6bca1abf
+    7858f365 88b54810 a5c48b26 399abd1e 77427467 f16a754b e7208593 5a138e79
+    5f3caefb e6a1e902 ad83a985 ce71b911 f3e4e428 269f1b65 69355c85 a3b1ced1
+    d28c0493 95de3c7f 764298b3 1ef8f261 7cba5c
+h = b8994eea 2212bad8
+
+k = ad8d3bcc 9c6d877e 935e581f fe8855ad
+m = 0a7a8b44 169ce902 8f0621eb 2eb997ea 70bdea18 a21d388f a726bd5b 6a298393
+    b62eae4a d10e8017 92ac8c63 ea847b04 f0ae9cd6 b2a417dc 3cefdfb8 680a9e1e
+    921f4127 65138464 6d92e4ed d4173bfb b9c967eb c7e42033 8933e1f8 3db2a0aa
+    dd596090 7dc4facf 5506d96c 61bdf07e 3f5f3144 a7be2ead 70543c36 72d02f05
+    87536b2c 72a1589b d4a4db48 ec265d7a 208d90e2 b0b53257 f9ce18de 35c20b93
+    9caff348 b1d0ce47 d0270157 3f3c60c8 78f5a859 4a0d65c8 69861105 f5b1fc56
+    cd676857 1432116c 4d9d770c de6b49c9 73072478 08ff27fc c42af1a4 07c0c67c
+    b608dda7 2a7da60a adbb0051 4737a9b0 a9737a88 f3fa3d7f 192be3e9 46b553a4
+    3a5b9f36 63766066 07014e22 c5659035 22ba24f0 ffbe927c 2f7a69ac ba12e2fa
+    3d25109f b5dac12a 13888b35 302adebe d180fbdd 8d06b3a7 ccecab9a 0d4e0d79
+    0b033634 4e225028 8f74ce88 1e484aea b3673b59 0668e1c0 091dab58 e1467aee
+    c79ddfa7 708b2076 54a3efbe 2e9af81a df6c6aed
+h = ea87c14f deaefc9e
+
+k = 769774ae b5f60e8c 5a625f1a df02055a
+m = 9bdc7b74 1c17fa4e 1d71a503 06e9f166 d94a28d7 0f087cad 57428187 7ea51243
+    aab6ae4b 7283a9bc 99386232 e17793a0 ad312f57 9c03daba e704f368 6d834205
+    b711bff2 45cc2708 61cbe441 d0c0b7a7 dd0d8b16 d88a67f3 fe831a31 a097e8b9
+    64c0d362 bbd9e5a0 a9730b18 070fdf4b dadf14eb 110409b1 b6aab403 de6a8d9b
+    25da5b3f 4ecaddbf 9303453d 7acccb86 a0ed6a62 40052c73 95f3b545 a87cb57a
+    6e289f08 f1abd480 ccea3eef 7e454682 78e6ddbf 978fc78c aa1ab6da f0616cb3
+    7ff803c1 a82248a8 b5de7ed7 6e7b1fe1 759dadb1 cb0b9bbb 63425cd0 08686693
+    81ccfd9c a8f379f0 cb707413 90cbf763 65e36338 37ec8da9 14957204 66649fb7
+    564df792 73183988 613906a1 4691563e e108deff 78e7a12f 04576fae ac7324dc
+    38a046bd 55284e39 9fd56100 2f0d3b9e c2c4c1f4 33691ebc 4369f024 dddfdecd
+    a2e13145 0a4500bf 56b70ea7 cafb3428 1d8f1a4a 724ad014 29aee202 155c0fdb
+    cdebeb24 f52820ef 88a8aa31 fddea38e 44b1c792 35
+h = 484df0a5 ad6bb550
+
+k = 223316e1 49d6623e 52161fd5 50cb7bef
+m = 6350a06d e9bd38e5 13b31fa3 44ad9489 4d823152 5650f2d4 8d5d2117 af6d7e9d
+    3845b7da 439be072 2bababf8 9569ceeb 5d109c4d af12e544 9f3b06ab b3260cf5
+    93408fea c6ef7057 f9096ae8 d7dd324c 35a7bbd6 13cfe406 654b8f71 3894a62b
+    adcf56cb 8be94d36 2be8bfb1 c6807306 963c65d5 5ef476be fe37519e 2df660a3
+    35af97ac 72c168ab d8a392ae e92f965e 370ce1f6 da02844c ea96672a 789f1dbe
+    bd613ff5 761f2ab2 8159473a 5e32aa3a 7fe4ba1e 3c6d4b8b d5722887 ab41dc75
+    efb18dce 530f5151 b0255704 ef7553dc d1a7d8d0 6aee2a46 6c4aefa7 f4f2cb84
+    dadb55ae 134c64aa 66da4cd6 7bb77659 e37a2af2 bbe4b57b caa579e2 9eff140b
+    4e4d0b7d 4c46f810 9315a011 35be46ea 7fd871d0 6a4ddb42 e012b71a f17dba50
+    900b6971 b0d95443 c7704211 27599dca c538e466 de448a91 13a07a6b 88251b46
+    a822bde7 1a0ab1c2 923c7806 6178b1ca 0a63c332 f57e3982 568abde9 8d65348e
+    61d25f4e 0681393e deba6af6 04508860 4b6235e6 e31d
+h = 49df03e7 a121580b
+
+k = 64ba5082 ca605bed 56f0cdaa c912a68a
+m = c40594c0 b402b4a5 95d186cb 04609664 bb4f34a4 091dfc5c 1fee6d20 8ed7f069
+    a01b7767 8bddfa39 2d257569 42ef7be7 cd890090 da191cbb fa4d1330 945f97d5
+    b7d89593 8936bb8f d3bfb53c d1f90f06 a414a025 6724fe03 dc772fdb 6fd39ab4
+    9ba58f63 35e36a53 2f4f05dd a9bf4f3b 263f7317 d34f229c 2af0ef4a 1d1bbf52
+    ea7fab85 3cb6ebc0 c3262de6 a64acbe8 dc8cdbf0 b10bc287 9074971d 70ff579f
+    5dc7bafe 638f49de 605da438 7419efc6 f16cbce8 baabce4e 7b7c5ba8 fb3b621d
+    851e7505 1493c492 c806aa4c a80be145 8cd813bd 19215c9e b9841f1c b9d80380
+    4577b042 b40d0745 2f83a1fd e1a34d0d b2038169 b81292dc ae3f723a ceb82f17
+    78f2c7c1 e9b59974 e15c1af6 1ff6b9f6 970df65c 898bc55a cb178a36 235d2dd0
+    8ec24cdf 20275473 a91f134c 9f03ce7f dfc05b26 ac79f211 bf02f8b4 c9faf470
+    62a0ac2f 936c5dcf d4b83af2 d48bc7bb 3630c658 636aee96 dd2bc135 6a22d0bd
+    1287e795 a9708518 efca35ea 5e6aefc6 0d37db6c aa8feb
+h = 23102bfd cde30873
+
+k = 25a079eb 23cac5b2 4a3a8905 b8b24e59
+m = ce8f8892 5955db6c 88dd636c 86719cb8 3c44c625 fe15c865 4dfeb5a0 84f7018c
+    0c54f306 85e4b90b fb9d11c5 92bb99df f05b114a 87a61cc4 ba898c4a 2301f2a2
+    c62fad26 410ef7aa ecefab99 1ba8b0d0 d28a4790 9405b4c1 f42c995d f6457c82
+    34f5a88c a632ce4e f53d85b3 d126fc3b b9427222 35f1f483 66f6e428 4d3d7b61
+    56a8982a aae29ac9 6d67c9d7 a8518382 ba520164 effd58f8 032547c9 655b31a7
+    fafe0219 ec2c1ab6 3a26087f c06b8e8d 4bfeb6e4 9f63eaa7 40d9ecb9 72693c12
+    124793cb 90e1b1ee 51302eb9 38d96b49 5cbc18a4 6324456d 301205ba e1253ec1
+    de15f69a ebb01b0b 48a596e5 17fea3be 2510c49e 3b320629 b4b634ce 3109985d
+    bfb50dcf 2dd25af8 3d19f333 eec765ce 42263db9 aeb402ae 5b01c6d8 fd9acd9d
+    72c6894d a5d30d1d a614cfcd b7f2fede 67d394a7 547b1102 383b0e6b 4131be0c
+    4dbe5db1 867c8197 d39a8c23 b942f17a a18710a6 85016515 3788148e ee7cf443
+    0dba9e82 05f8ae0d a1e79629 4b6a0e6a 5c2dc8b2 d7a13ed8
+h = 73d27325 6223b8d0
+
+k = a3284334 f32b4f5e 0a2c2b34 582c7ede
+m = 5cf14511 5a01b9c2 97b167cf 87ce0c94 c88dce13 ae71bbda 8bd628ec 05e5c7a8
+    f0920e44 1d024415 1c75ed1f 559b01be d101ac51 b2f30a6d 4dd4a97d 048bd7bb
+    77ad2301 c18d0a3d 848bf317 e5f7b9d3 30d351b8 6578ca13 1f8bd200 537f1eae
+    d2a6eb71 20bb2e9a 65e75d9b c6e82ff1 dbd1ce0b 6781f923 defb8326 7ec39a50
+    0fded390 a7b70c51 3b02bb6f 40025189 3f65b5ff efe7a51f 59a19623 69f97375
+    e2716083 5f70d94e e793d37b cd7b804c e44004da f05a6ee2 59547dc9 76212728
+    af8e610e 2cb9f4ec bf9ce63e 2c375d82 5061233c ad2af72a ac72676d 78f4aa51
+    7f12efff 4a4611ce 6458a308 8524eb6c c852f311 4d6c01e4 340a8c90 e747fbdf
+    3011baf5 dd59ce47 33f625bd cc158540 a5fb1525 bf9346fd ca1322f6 19b95be8
+    e9269d80 246adbb9 045578f0 69abbca7 39d60338 472c4c40 52c33384 02e09896
+    062d5ff0 faa9d6f8 acff429c 674de51a 53da095a c1dd63bf 97d4696d 5780f6a6
+    11c399f2 25b9e1f3 2818bec2 c431d44b 0529cd21 f61a41bd 3b
+h = 08467b5c e6721461
+
+k = a3363f69 52d7d066 cc32572c 6f271ff1
+m = 1ef0508e c3c50a1c aec6b04a 1039226e 3d36d6b7 7d9aa616 929ad7e1 81105fa9
+    e7d525ee b5e2b15f ba96b07a 8f685e64 d2734474 e6f9b029 d1733537 b9a97a37
+    115ae97b 36f962a9 7136f2d7 8326104f 2d991388 fbae9122 9beaf157 ca35bfa6
+    8c3b0ad2 97d66120 d1363f91 90322361 302aaa0a f23dcfd6 bb42a4ec 75e44aed
+    bea43096 cf700652 4db54c2f 1a60acff b14452f2 0134506c 39108df8 ef2d9cac
+    ffab98c6 6d3f547c af1526a2 6a2bcfaa 923a7534 4703732e 551a441b e72ac7c6
+    97e27ed7 0367e5d6 d9e6d6b1 7e50870a 13f8e6b4 da6fa6c4 5be77ab1 b7c7bad4
+    799a53aa 597be083 2066aa7a 0d70f51f 8a15e348 9987532c 909d517f b190fb18
+    70b8c18d b85cc47f 71e2efbb 2894388c f2ba6d16 47784b4d 817ced0a b30c35d9
+    5430ba9c 8f98a9aa 994093c8 3263d608 4bbd18f4 118c9762 7bb43840 f27cee19
+    a566be26 e3b49dfb b439db27 49e1e1e6 61c69175 12bccacc 4d95d331 fb889849
+    443f4f43 1f83c44d 362cfd70 36654e1d 16b27c14 6918ce36 bcdb
+h = 3ee29021 eb925642
+
+k = 934d461e 43f9647e e67d6588 7556e9a9
+m = aba57c20 b0447f88 42dfcd1f e9ba66e8 64df8b68 254ec7ae 9fcb80c9 0c7e46ae
+    84ba5878 b773719f 2dfc6dbf 8aefac15 e22fbad5 dbe72f54 d14886a3 920ca77e
+    3ddc36cb 805ffd2c 76109ce1 ec448623 8e79458c 3acbcc16 6eab2a50 a47c7a8e
+    69671c2f f369dd95 371d0011 56e11b32 0ba5dec4 4123d6a2 e631794b 140a1c4c
+    0fc101ef 654f3042 4599aade c3cceb04 515790dc ab9997b3 7664d8d5 29521d3c
+    5a556e64 ac10521b b82162d2 06df54b4 cd917a67 8d1355ab f8938754 e9a5f288
+    1cfe4e33 65566967 e2b78c42 5fb2a2f6 976c05b9 1c063aff 546faa89 5a14c1dc
+    6c34e8eb a9e210a6 9a9c26a5 083526e5 7ee4eb64 c10fd561 c93f3cf3 46fd6c73
+    f1bdc798 610b75a8 57fd8a70 0bfdba1a f62e406d ffb25346 1ae575c0 27ae48b4
+    47fc1a84 7eef574d 5ea76b1a f8ae8e36 734b7830 495c36ab f86f4c33 a5c4a2ad
+    612b5475 e9295ff7 6a025fdf e24c8e12 638b6510 98255548 1f5176de eada4f37
+    1abd7405 f7b579cf 86b557c8 7883d762 c54527e5 ce392acc 6e89ee
+h = 3554e461 cbedfa19
+
+k = 72bf8b7f 6ef0eb80 bb10e743 68ddc22a
+m = 7a7158cb 9bc5c224 d22e0e4f 9c4e1088 d907b2c3 006a2e5e ef556c66 791344b9
+    a82a390d afb54e82 d078c109 02c7827c a846ef9f c94208f6 e17e64cc d972a791
+    8c89f5ed ac540e68 171b23b5 c731ed42 e7c49e29 8d0fa57b 84bbce80 c812d67d
+    fca2c5f1 7eff4a51 9810a9c7 c4f2d102 fef0ad34 11504055 42c04939 80bced4a
+    30ec572a b6735350 3c378ee1 652d3574 048aa8bf a9094cab 0da7e9f1 42e0586d
+    bf9f2b6a a981ba42 edde0448 5204557a 737124d8 74100eee 0e7c7a42 33812b2e
+    9a2df7e0 92c10e26 12d1804d d14f7fad 63fb2986 b7e86669 5ab1cca2 eb7b595a
+    b28f5fb0 221b5591 b15f7ccd d3ed5767 d0803bf1 ed9321b9 577d8ea0 65e2ee06
+    89ab03e0 d39c6f86 f1ddcaa5 a6142435 0eaeff81 a1e1aa9f b9811452 33da485f
+    d4d1269a 9493b869 f62754fe af8cd110 6f97b6b5 953629fd 3f6ceaa3 4f5cc97c
+    841b4306 cca96154 dde247f6 f08767cc a2657d87 ae2f2698 e06580de ee9eebe2
+    3446faf9 b3afa006 eaaa200e e826561b 94b089ad 6f1c10b9 7231e0be
+h = 77a2c8ce 04299a9e
+
+k = 6017d8fd c904e11e da3e0bfa 1e0b7c45
+m = 681ddd85 23980e65 133d15fd af703edc 3163e4ca 79a102f5 038dd928 d3fc313e
+    4a91e8b0 125e2b80 0b347f5b 018a11c2 c42b73df ebdfca54 d70b01a2 121f1c57
+    9e6dd916 979af7bb ecdf1b11 a556dd6f f857a28b c39a1282 e6ada6bc 4629df5e
+    146f2d46 0c129086 e290e164 9f6e196d c15a54d6 74447cc3 ab19e9fd 3c51675e
+    25b3017a b492a6a7 ed5f03d9 5cc1c15f e70d3bbd ca191133 20bd4972 768921af
+    4c9cbe1f 5b777d4a 093e0eff 328654c9 b1fb601e 3d88b418 5db95c17 024db82e
+    b5068e74 7f1b8aea ee068063 cb4712e6 1dfaf462 56a929d4 8a23ddf0 95c086a2
+    b41180ab 3d7c042f 8ee96ee8 0b4aa155 7ce6b657 932ec9cf 73ccc807 bc570ea2
+    b1cc1f53 6922b2bd 1111f8f1 5c364700 1951563a 2c4a1a0d 1b981f25 2fad740a
+    27773eae 381527f0 e02f7ad3 1067aa19 9014cc23 1caa2f43 9ce33027 6af2bff7
+    7750e4df bf7ca64c 6d986380 37ba69fa f879ddf1 c9bf853a 3a856a57 c9fb816e
+    39655fbc 551ea2bb 630abd6d 2cbeb3e8 116650b2 d91de11d 14b2c30f 51
+h = 13945923 087c55a3
+
+k = 7ca0ff89 e1e264ec 315e28b1 cdd67c75
+m = a0f95f2a fcf03ec7 a622a67c 4557880e d31a6fbb 71c04197 061c73bd be08ba10
+    9d26d55f 0dc82307 1c8ac497 5e10a227 82436975 0ad3fe5d 34fe320b 33c39607
+    65b96088 e4a8898a ec1bbe43 5616c567 59f908b7 23585e1e 38e74da0 32247b4f
+    fffee06b 60ef05b5 7932c487 27f956c5 7b08b768 eaae7072 ae97b5d0 8167c6ee
+    b6b7b78f ba3f61ab 668e9cfc 8f915202 f2e199e9 0e6ae406 0d16a269 9532c383
+    a43a7acf f3048a8f f0f64199 95fd7458 868e5246 91d4e520 c79f50e1 e040f538
+    b9fa154c ae724c40 0a8d9f26 38611c9b d6e5e726 9b372091 4499de08 79d9493b
+    0d656500 854a9313 fba1b803 6c906177 58de0455 9f5fcf90 78aa8a22 06cb8057
+    4db1c050 ab82325e ad796804 6b40bf11 ffa1ad46 cea0f1c7 e44759f6 cac56de7
+    80a2ac92 5a4cd283 b5e43790 95eb1182 10f2ef4f 4cfe8157 1ed125bd e3fa47af
+    ad26b48e 58d596a4 977ba185 0b275ffa 3ad6daeb cccdf5b3 6d464b18 3fb483cb
+    5ea7dfcc 22a15c10 86daa27d f5cd99d0 23af1b06 72782661 36cacd0f bac6
+h = 71b97a95 e887d544
+
+k = 879baa23 2acc02e3 415310ec 959077af
+m = f25a67f4 a31c20bb 9fcf6826 8fae347b 91de8120 009f62ba 765c9698 063443b7
+    aa836c09 2ff7cd32 2988507e 42857a8d e00b3b04 69dfdc90 ee81e37f 9bbdec4c
+    bbc2abdf cb07c25a 037a2138 8b40b86c d00b049b 0a0c4899 deb4d59e 8c469841
+    e3fc27e9 7147b963 4ebbfd37 3e5564fd 2de59634 7c036910 12f4a5ec b7af321c
+    5e54b066 0a945489 4f79e9e1 353fab16 9d73b0ef 5b6a1f61 884d7391 e6cef47a
+    d4f19bd7 fd6787a8 9fd6acc4 aa73ad2a 7f6de89f 3a40f224 dcb5b9d5 3c3b2283
+    aa270416 e213e4e0 92443528 f5957751 c8d81dc8 3ad55524 718ed5a7 38456790
+    abb947cf e57d8417 e28049fc d6d206c7 00380d13 4290a61e d0fd01bb 4de02178
+    d18aface 2d8dc802 29594b73 29435d8e caeaf71d 19fc4f9c d652dd7e d4779df0
+    e7827f91 2b90ebe2 8bd8f093 f2e15760 f0e3eab8 cb1ad7ae ece2fcb7 5120f329
+    07b2ac70 88ad58f1 c73dff79 77bfcafa e625c0c0 6e3e6d49 60ffd0b6 db320ea0
+    c9493891 b884e136 5fb39037 23a46af9 5e0c93d7 52cc5409 d2b88708 90c869
+h = ad928648 9979db1b
+
+k = dd9ce4d5 66957353 f1b72b3d e29760f8
+m = 52b75b5f 482fca0d 20821e8f c126e1ba 72e73f67 3119afbd 6cebb6a8 b73188f7
+    709c5478 ab9cd3a0 8e44b26c df9aaca9 85655620 010aa888 b8c7af9a b87ae62a
+    ee125630 53241cff 796a0691 436b6729 c197bb41 e178b4a9 5dc47b55 f98a124e
+    31db022d 6ef24a7a bc6518fe c7911028 42193ddc e7643dee 1e38707d a783d287
+    45a138ff 1b1beaf3 5a52646c 68b73d38 28b180e0 162c6a9e 113b2d6f edfe14cd
+    38b7466a 89507f84 493484d2 dbbf4037 b68f2592 62761f8f 6d1f2efd f05c8e97
+    5c1500eb bbd4313b 77ae79cc 430b4f7c 4184bbdc cac131bf d998ac26 c8dc7f75
+    e5350360 eccb50b1 bfc5fd22 45fdd28c 051fc035 36db67ff c6d59f3e d1f5ce2b
+    915560f9 0810c2de b47e2d15 1c67dc16 073ac283 3ddfe3c3 89b4769e 97e75218
+    d6d3e316 93273fde 52499b56 cf13df6f d6f107a1 18b4f990 95a34f3f 3e81885f
+    ab7815a4 fb3425e3 c5d1a4b6 5ceb8c2d 032caeac 07cfffe6 50674ba2 ecd0d982
+    ebd54f34 2cf75981 c89b24f5 b3d0f759 ab148e5d f7e17664 c83738be b328e59f
+h = 7b1c932f d89b71a0
+
+k = b0499bf5 1d178e7a a7157d1a 435dc0d1
+m = cd42d95f 3855d939 69205c3f 64010718 e6544fe6 d81e3fc9 5476ddb6 6a5736e0
+    abfc1ec8 b0a7a284 b7b89e6a d43e9cec 87b052b9 6cd0849d 10493050 24c6c9bf
+    034579f6 6e8c86ef c8977c14 86c5f55a 392f5acd 810a08b1 71191b4d f6ee538b
+    b92adf3f 5521f843 9ec6b77b 6facd5e7 56772646 dd924ef5 28f975a8 a1bf68d8
+    b121cc7a 191e5042 ef5d06c7 a2bf5c89 19d48ae5 6d93bba1 9a75a4cb 6bc4668d
+    44d6cc46 293fae7d 7649a151 8fcff4a1 c850cafc 1f581c42 1c24df64 8a5ef12b
+    bedf1571 406470ad 1b17120e 26de2a66 666a11e2 0a5bf6c6 ab40c9f9 04292c0e
+    53947289 c46e960b f9332e90 662ae5e4 060a916d 3e5c361f c7b5e243 2eda857f
+    c2ef23cd e1191960 fe2f33dc f600e76c 808fe2ab b264dde0 5a5eb048 9bf93091
+    cd5a5f93 086b0d35 d7e1aeb7 9dfbf792 b67e17e2 2ac330e8 77795110 88f69070
+    10f6118f 441de85d f95147be 88a143b0 9fa17bf2 dc9183c1 34ff1fe2 c43496bc
+    678eaa8e 0da27efb 1fa809f5 2604fd18 33a0fac1 710549b3 dbdd1566 c688ef04
+    af
+h = 9245a922 84400b26
+
+k = 048bded9 bfc680c7 984c8eaf 69995ee9
+m = b5096329 f3b246fb 70309382 9336c9ee 0051721a ffd6804b 451a591b 2c034b5c
+    4aab74e6 d657eba3 95a23d71 aa347408 e82e8ed0 0f38cbe3 269efe93 fa7554c4
+    736a35b7 75b170b8 8b7c1d72 31cc7aef 8eb21ac9 9b5babd9 59dc7e5e 3958cec7
+    9ab64849 31966988 4c4c0c18 9cf90800 1ecfdeb4 541800c4 c7235b22 a3b0d7eb
+    264f2ce6 a056c88a c32ea5c1 0cdf757a f23988a4 23287584 68f9bb37 1fbdb75f
+    be2d6485 53e1ce1c c9ef6bde 3f5dd5fc 575f3695 c04234cf 2e48f683 448c5e6c
+    676a2535 90eda91f 44c261f7 c0e5bd1b e962e1f9 1bae872a f086b965 6078062c
+    04db36c3 200d5a5a 201f2412 0092c272 8b9af0bb 1f9ee1ae 588cc07d 94dd2e61
+    d079f617 61ef1fc4 74aed98d a1e945ae 6c530756 5e91fef2 6d97f37c 50ab63ae
+    623676b3 e38fbe47 57e0e7cc d826d90f af60b58f a5bb10c2 9e2f5ec3 6c7acd5b
+    9a450bc0 969c2b0a ee9ad854 8f300f76 3324b764 803ddc23 2546f610 a597255a
+    2a4a5601 72e81266 4484e1ec 83de1579 e8604a9e 00ac49d8 e64c8baa d014694e
+    c29d
+h = 6a9c3a6c 341c90eb
+
+k = a45dfcbe 7cdfea9d 98418acf 5f6bac63
+m = d4f0dd43 6a2e9004 ab4dfe41 fe7e4a01 d938b7c1 9e9f0730 9fd7b349 c44bd58c
+    b5385760 3be2c32f 1d3ce490 31c2213a eda089d6 53fd4669 89a74998 ef0fb544
+    c7f57ad0 8d801ed1 4f22d618 5575931f e209f825 f40463d4 9eb5f448 24fb1e2c
+    7683d764 5bdf840d c086a96c c12d4921 7ee5e195 694e2a84 500b705f a910b592
+    e3108364 4278e9d5 2da5b6fc 1a5c979a 9f01c161 964bab14 f1ff040f 3852d726
+    2f2e4a35 7beb773c 444ce2a2 3ac75ab7 a506ffa8 1bd1cf90 f2b4d62d 4d65a330
+    a6bd3e59 ce98784c fd19657d 7cfd877e 024ec552 68b76016 53f9ed2b 67b40955
+    1a71f4b1 adef30b1 da0cfac4 cede19d3 8235b15a 03de7af3 8a1e9cd4 b28c0ce3
+    6891d6b5 86ed156e c5a54c20 cfa23cc4 d5964e2b 97727aca f05b9d27 41296a6c
+    54a63d03 84e9e891 b2a3349c a04d7541 944a9c7a a07610a6 cde8d8ac 0f17c47d
+    a0d94972 0c8d05c8 238bd44c d52c64be 7d296752 0294c7b3 023a2b84 61b23d04
+    23d22fd9 d5965c8e 9e6addd8 54dcbf73 a0b55843 5c25f65e bf7bc59a d19e048f
+    b872e2
+h = 5cf51bea 3d65ad8f
+
+k = da82d561 628aa533 d57bb2b7 25150e18
+m = 1d63b68c dc6be452 423ccc91 eb028928 891055d6 aad30ac1 6ea27a07 56b8e00d
+    0bd38448 89dded05 c16723b5 486d662f 9b76fab5 f220baba e402dec4 704c028b
+    87fe1031 20a7cbd4 dfc7e92a adb83c3c ef19580b 159406ee f1769894 c0732782
+    b9a08832 b23bf5c2 939409ff 759d74bf eb488833 df462289 4567ca02 0d586b2a
+    d05865f1 b2e20c89 675afca9 56ce2308 c38ed13a b8b01ff6 b1e00a68 4d38f3f6
+    4850f60f 0112dc23 e86145e1 7f6902be a175a662 a05e29f3 11c3ffdf 0f820d39
+    ba4fcd6c 2046710d 4e61faa4 833bfe4f 6adf8285 73aee815 ba7732fc 02a5ff59
+    d5f7e0eb 7967302f ec8b12d6 7117bde5 a75fb8a8 6ee736c1 c509ffd1 d4bfb733
+    06b0b52f d3a2bcc7 303746a7 ad63c3b1 9aea01c1 2b9beee2 84e15f75 cbcbb4e6
+    bb2dd1be 21e08491 83e62ca0 a91d9aaf 953acd88 4da09d43 600855fb 68512414
+    fcd6c9e3 06fb5c8f 5c6a1140 400adf33 0f1ed5a2 27827e69 be587f15 d86145e1
+    cf695ab4 3d759c70 18442021 499a9ec1 5ab50d48 30c4ac15 8b6cc2f6 162fe915
+    b343633c
+h = 915b5744 10dacd5f
+
+k = a6ce6719 114bb581 a8ffd84a 4ebbbc46
+m = 4b7af61c 2494307a c3b6e1e4 31c1bbe3 96af564d d5cafbd4 ea740f83 2faf1fe4
+    5c7eafd0 f5be8fa9 8e6c0d30 40f9f3f6 4a09eeed 17917594 75897d2f c9b72069
+    4afccb55 f6f87058 95046ab1 af11a6d5 c4cd5073 3b72a7dc 5ee34731 f628a6b4
+    60c93be8 e85ba846 4f7080ee 8e72bda9 07fd9e82 4877c4c4 a2299870 7f4f3b3d
+    ffb2ab96 ff1ff456 bfb719b4 a57b22e8 1d07c6ce 8747181c 74f27f3b 80ac1069
+    9fe9444e 17178edc 5dc67b40 e27e149c d353b971 36464759 9358a26a 6fa108a4
+    401c083c d94c9767 69a36be5 f0e04088 315296aa 0b33f44e 49b7887c 1e43d72e
+    e9bac7c1 783d046c e85d8438 ac62bade 47422041 f27c9b80 d32c3abe 1dc0997e
+    bfd4d9a1 e76c1db6 602773b4 b613e46e 269a81a4 7ee05f3f 6cf73114 a5e75d9f
+    066aa14e 3207d4ec a9494df0 ae2bc725 ab5fb7f1 90b1e695 c4bbe608 85c356ca
+    fa109422 5d1e6fdb 1814b4d3 682cc817 2ea64375 2840acb8 488b55e9 5a733bc3
+    5dd18409 149ab4f6 aa750832 8d7aa6fe 838e1cea 4bf658d6 1fd1b089 65d278f6
+    3d7e63d2 ea
+h = ed92f89f 5a1979be
+
+k = 25bbb1b3 02618d65 01c637d3 a194d20b
+m = cf3811ca 8bb4efd4 a5f08981 b0d348b6 3c2170dc eb5e5773 94887319 9ab748d2
+    1c171ab8 74f2adff 704b6797 a1e88391 226fff0b 1ae43be0 2dd3688a 89c4a02e
+    f5a4f6d3 8ff11c95 58f2bb08 770dd3d3 2e21ddc7 4abc9b4b 31c589c6 78719b9c
+    1d17c04b 80b53740 9e4a4616 37aba9f8 b172ee26 cc2b8fb5 448f75c7 11fb1217
+    244b6ca3 c5334387 80cd9f10 b43a50e9 76804914 a226aa72 49adb9f4 a2a6bb4b
+    e1d44105 fc38e484 3f35ccfb ed666bec 54154896 ce276b81 04364075 ce66f4bf
+    45b7460c 4c7ab0e7 51a674ba 914cf6a9 04fdf0b4 5463beb5 50cccf40 f8f9d4e2
+    eda06d4e b8bee465 9bdf4b8e aba7d4d7 7fb801e5 466b18e7 cfd6d3e8 8943656a
+    7609de2e 8ac36b13 3662b319 65b7a281 87ff459e eb14f7a4 de82b000 61b8d565
+    2242f2c5 9fbb986b 90ac4524 e9b210a6 b14c66ee ec63a37b f31bf698 7c36074a
+    190215fc 1c920608 ccd35eee eb7c1479 99df27a9 36eca00d 5791ea82 afdcf67d
+    5b876360 e3446295 62add178 cc03d1f6 e7e3ff22 52903eaa 15b88a58 d54dc0af
+    16747375 4dc4
+h = 8a44ec0d bc970556
+
+k = 7b34696f 7a7837be bac02aa8 c59a8d65
+m = 2ad5772c 6973a52e 8901b5c4 73b24cc2 758c9b7e 6023513e 494bc5eb 11dac05e
+    8286e8fa c6a44237 4e67f274 726b9cff 40c1cf2d dc36ff10 5ca4c4a9 e72856dc
+    1118dcc0 8dbf7592 66ad4dc0 7f2e9ce8 d9a2133d d1f2d44f 44c0cf3f 95a6914f
+    8bd8d906 aa46a18e dc72a0b9 bec536c7 f5811225 45d87404 f77d5432 a8409ddb
+    1cbd7425 a125a920 99198a4b 432839ee 37a34cdd e1c6e34a 2b64082b 24aa7983
+    4f1d0929 a63e3a0c 96228139 aa9af0ce a6e83b51 28729865 b63acdff c6cec5ff
+    2034fe0f cef8bf7a 463968d9 1ea2fa4f 7fe92059 c533a60d 3eaac49d 37b52f0d
+    ed53b09c d0a630e8 2ae42a4d d960b881 4908d1b1 426fd6a6 225f75f5 a032e283
+    2c6c8766 8e4b70a8 91e71492 3a159af7 c05eae93 67de0698 30f74889 b0b6ff19
+    7cec973e a3fabf72 0896a17e c95a9a03 42e3e462 cef5ec65 8e1245fa 6ff3569d
+    065ed97f 9ff92499 3a2df288 e5b6feb1 04154b18 53cf2cae 416bec85 faf507db
+    e3f4b49e 1aa63335 5d70dc33 02223488 51c7b238 52022310 246e042b c9c9f6ab
+    aa98a5f4 5bef37
+h = b7df1216 bb5c12a3
+
+k = 9c33975b 6bca0c9a f3ee1d4e 63702cc4
+m = 546952c0 d3b85db4 64fdaa9c 80f06b28 1c2898e1 fc4bf3ec c79f158d 1743eb04
+    26d0fe9b 8e369906 94ce67ae 93dc3f8e 766be202 82610820 8f873875 36312953
+    75ed5a12 6c42038e 6c9a6a47 7d7dc6c0 024a947e 7b1a9732 fcc34553 07bb2fb2
+    dfc78c1c ca7454f0 eef026eb 88de8b6e 444d4e15 41c76c80 2dc2faae e9b53e13
+    67f5fa58 f428f59e 2e81e9fb de137a4a 417b7c10 af0bda78 122d5d64 16f89410
+    9eaf2678 bc8ccf6d 4263c645 aa4af67a bb0e4bdf 210ace84 b23985bc 2910b635
+    2ea04dfd 43d0506d 5dc19226 02392d24 cd3caa74 465d8775 df3ebfa3 398fdfa5
+    183116fa 182543be 1442f07c 61301c7d 115fdc16 3a4209ed 6f926627 279c5302
+    7bf9114a e834fe36 c6b1079d 7e6aac82 4055dba2 4923577a a285ab88 bd76d3cd
+    dca4a220 4dd88317 889cb38a b5dc0ddd 99ea063b 4f271ad5 e9b816ca de75c649
+    e79305b4 bf3b8aa0 55830b05 272466d5 c99ada39 78d1b3a2 87a401f4 fa13ef41
+    1a80a868 52d422b2 9a144e15 274646ed cfaf687b d2b59080 fa6501ee 08dee77f
+    6b1df0f9 52e966f0
+h = 30cedfb5 a19683e7
+
+k = 6a28ff05 256c6a73 fc58db92 6197bc85
+m = 8e42f42b 09b97f10 6bcf0a6e 33853920 e4c87152 841c4277 d8bf565c 961e2677
+    53775b0c cb9303eb a93493d4 e5f9f5bf 8d8dbbfc 6500510b f996210e f9178b7f
+    f498a629 587be285 a1e77861 2534dfdb f6c4ead8 a745f5b9 6c8beb7c 41e47f6c
+    3c947df9 f160d740 438604c3 e915e90f d79d3943 136d7dba e92c9be7 4b83a395
+    fd9512ba 67b622c4 417d0a94 f87a1942 846c7746 9e276aba 814ae9ae bb562c47
+    db8b03d9 4af54aad b98d09cf f1ddc9b4 eb6655c7 84312d40 f5c64c85 c4f721a7
+    dc6f9893 8b7d9664 15ea7a2f dd3d7cdf 89b665ba d06c8ae2 18a48c6a 7e84f253
+    957f00a3 52f3884e 6cfe93b5 3726a560 f60b3220 670e86eb 6ea7d80a 5d8316b1
+    b4d73bf3 c394adbd 6e459cfd 8567fa8c 4c60c0f3 984f5f36 e2982cc9 c20bb440
+    f03eda3a 7958d035 ccc90aff 304e28b6 c989bfae b43af847 a2b75e94 ef5c7394
+    f910ed5a 9ff1d1d9 7b63fc34 4fad3f8e b7024e4d c32c28d6 846b58fd 1db40bb6
+    084e98af e95a41b1 5afc4a50 eaee3d2a 3239926e 773c4331 2d08fa7b 06b0d8a7
+    29df166d d25c0fe7 c2
+h = c3f7c7d4 3b135fd5
+
+k = 75c658db d72b60b5 8c41f6cd 15fa4ecf
+m = 435506e1 407d3a64 e0e4d98e d61e1de3 4203caeb 38fd9fb9 aa0b12d3 8b401aef
+    8113287a bf8a07f3 e10e3990 b273d0ed ccff637c c272a3e4 fd882f88 85d82b8b
+    5432c466 32c5dce5 359d9123 15a40287 95c98055 ed9b92e0 ac70154f da4559c2
+    fff4aa5b 30976852 ad95dbde 865d7535 7ff94242 f0f4e774 5d173395 f5909f83
+    665ae77e 0eacbaba 4d2e5f1f ef39de10 2df589f0 a2da7c91 5ebe363f ddf70d33
+    92c73547 2f5c3875 c90203cc c7e21e46 637769c3 e2c56c3f 3dfa4e18 ab7234ae
+    cb1de8a7 7eac58ab cc10b151 fcd38889 29e83f9d 2de3a8ce 96cca2a5 947e15fd
+    209bb526 06294042 cebf53e0 87030c00 66328678 883e6cbc 837dcbad a60453ec
+    fd4fb176 115b91f7 27586b29 0a153e42 bb314b74 682469e5 dcb4fdd9 b33c14a3
+    77f23b3a 8978d159 926bb18b 7a2db9dc 552b998d 8e62c773 bee5766d ae9bd158
+    2a7559e0 69cc9848 e74e668f 71b48160 9825c1b8 552f5b0b 1844e7b2 7f44cd1f
+    c5c9e9e6 45c04be3 57ca8a1d ac780597 25658a99 5684631d e0048b46 9eeab609
+    d8b4d0e2 0da26037 0951
+h = 2b53ae8c 709ca2a9
+
+k = 0fd84593 99b1fa04 9b22e545 addeb271
+m = d02bd7ae d4cbe0e7 9f645ac3 592eff54 525e42f2 33c35926 cec968df aa484c88
+    7da305e8 b3a5678a 29cdee71 b1e24e3f f4756d4a a4919dc7 1a7aea43 63f32765
+    5e860e37 c91a0832 641d0723 e239f3b8 c2eede97 fe7c811f ebde92c1 5608bec3
+    37f4cc36 128cefa6 ec316ada b23ca825 a922c801 f5b38a2a ed97d708 c2849092
+    a145666f bfbe1e9d a9334abd 840a5f1b 72ff2bd2 d12462da 6dbfda99 9d459a73
+    c4d5b709 ee2e5225 ae898dd9 82a93077 67799e9a b31f1f95 eaba50a4 d46a5a01
+    f851e2ef 8f089739 6eb14de3 b3cf37dc 6097d176 ed4e9654 f3706fdf 296817c2
+    cc95b86e 82be3656 218f245b e86a0309 1d64334a 93719d09 04646414 ac6db800
+    f0b180f1 8e688faa f6270795 d3b14151 a9161e96 168b98be a723d6a5 50fefa49
+    530fc31e 603dc448 4955545b 93d0821c fda984f5 4ac5e7a0 5c5496e1 3295939b
+    2cb29dd1 1f7accdf 94330e9d a31b5f45 2dc0a18b 137351a4 79d6c065 b37b02d0
+    4b6045ce 5932dc6f 8b7ed7f5 56079245 17525048 1e34de94 709b697c 21837d9e
+    884072ac 071d0316 ab18c3
+h = a1c20d1d c29f7de0
+
+k = 0504a3b3 8ed0e91d 38a9842c 77e56863
+m = 29834be7 5ba3e298 6324b071 9fba976a efcf9cff 8505e116 1b3a4987 086921d9
+    4347902e 9469a3c0 3e6997dc 67f6bed2 605e82d9 48994b19 cab601ec 093da944
+    8273b13f 99afe01e 10d0ee7b 79c2dfa1 1ac67932 75dc2a3f 06a109c7 24cc18e5
+    4ba1932f 1cbc6164 4a0ea600 eb654fde 262b4899 685b17c3 c5db5d13 19b0973d
+    cccb6b2f ce3429bc 972be5ec c20e044a f24c0762 e20528ff 8542b5f9 1f92b1c3
+    f0b1fd9a 65aca66b 409783f2 e4652733 0c6b20e2 69092254 7a822a90 e8f45f65
+    c0b7f910 3bd1ed13 5a40ca85 a0a1c5f6 349baeaf 337dca9c c3fd66a2 09f572fe
+    4ef99b2a f99d4d67 8e18674d 12fee48c 373ebf0d 11c1c729 085a2a2b 43e41468
+    6e4320ca aeec8159 4a7414a1 4e6269e5 30a28baa 356ad7d3 12f927cd c2a8a020
+    c26f3ac3 d4c00c62 31f1eeb4 96d051a1 a50a6d71 52374157 305a724d 974b87b5
+    e701b9b8 9295558d ef4f4e09 99fb1d4b 3eca0d3b 8bdf025d d337481a e1f3dc13
+    4499f5ba 393a3beb a3cd6e91 1267ab70 f7416438 563fa7ac 49378977 a73e066f
+    91a0e972 bfbbb0ef bd62ecf1
+h = 4d39ac00 7bf5c310
+
+k = e58723c4 6d791cf4 885ff375 b96b01a4
+m = 61e59cda 15980838 6f2a224f 61c8ae83 438989fa d503e71a 3d1f8c7b 7193102b
+    3f66e020 3fc7485f 517428b2 2341243a 42d16f1a 3a7f0b8a 25733db7 309e4fd6
+    31a57853 d8df10a8 a11ef5c4 89d3f12e 4dbd7aee ef8ed26e 7935047b 9f4b36bd
+    22bbd0ed 28f788f7 110ab18a f1819d27 aa83d319 2543e28d 6c0225b9 9083dc84
+    3d6eac01 dca5d619 436f35e3 9fff80bf 9d91a76f ffbd6726 b6c37aa4 6e455d3c
+    29fcc2c3 f56971b5 378377fe cb0568fb d436e6f8 4d0ecefd 0934de85 2fdfba13
+    d2f4915d 7433754e 3276e018 974b9498 bb7063ab bed2dbbb 0ab56429 986fe90c
+    5bdac972 f0cae242 ee7851ad e47d8168 ac292cfe 3beca3a6 2f3e32a4 da180f3a
+    8bf31d4b 72023230 404e4461 96bad639 cb680a0e 455a8f86 a82ad3ba 43b669c8
+    f54c6a91 d709e187 600b6412 8a90de73 e4f903fd f6250192 5220dac2 f4b3516c
+    4c72621a 4fc048ca e0a40e90 078e208f 31eeb722 5dbde4df b0a9f4dc 9e8dc59c
+    f8223026 59fe5ea1 c91bc521 fa76968b a4b2b943 45a65694 edbba329 03aafe8b
+    b62d185f 2505db21 bf676f63 19
+h = 1d20eb4b a67df424
+
+k = 70053406 a9f639e0 286a8d40 03e20e07
+m = d69fadbe db6b2591 21bf44d5 be89a634 52294efc 7d6250d0 62d1ff7b d2eb4fb6
+    a918a0be cb9001a4 87f66f8b 3d0d98fb 6402cef1 e187b3b3 c1660b86 68adceb6
+    75cf4e87 9fa5e90f 7bad6fcc 5251cd78 17dbd5dc 3f19606c 59e38d40 4533b420
+    b7f6b889 aad31b16 2a35171e b88785fc 5b9ef9a0 f0f8ceb9 9cb040d1 967bb8a5
+    4be9c5d2 af01ba0f 57349b2e 96ead84f a70147c4 ad55e161 98848c3d 855a7087
+    422c652d f781e524 c030e8df d285f0c5 acaf6628 1e4bb507 afbc97b0 33f4191a
+    49de41b0 614d36fa a002a605 681e8188 3b8b4a7f 42133d46 12d31635 985c2ffc
+    e8cfb6f8 5f4417de 88171e12 824949bd 6f364d3c 873a1cb5 52c14511 22b18564
+    3b2dd6e0 6e97d0e8 26acd569 47a90c07 c4a79624 2060da8f c099109d 635ea8a8
+    f6e3f3dc 44766746 27d06ac4 5d538c07 7ec1cbf1 70b6d33b 33860940 5335db4b
+    ffe23701 43203fc9 435803fd 231c3e06 09c28a74 0cc80269 406b5ca7 3b77fb3f
+    2ac84f5d 5c2ab602 30a4fc1f 37e2a041 4c304437 a87f57f5 2972e18c 4648b60b
+    cc3e5866 a481325a 9c50cbf3 fe27
+h = 23001166 4f21a13f
+
+k = 16fa5fe3 ac6ad670 06d08c74 170695d2
+m = 2c8dfe13 ab97dc73 042d58f6 077247de 2b9aca20 bb95c9ed 4917ac3e 9bd770a0
+    14c6f429 78459078 5cf0c0b2 792ab8c4 ea4579c7 df58408b f2e714a2 f1945509
+    098d2601 03f71618 9dc2377c 6aebc39d 972da9cf 91ead977 3d309bec 7b6ffa66
+    4c4454fb de907fde 4c40cd81 a962b5e5 e8bc02d5 a3b8ebc9 5670f137 bb6fc64f
+    1263c63c 7a23cd24 f4370381 fec51549 6812757b 58996916 d2843001 7857a199
+    0ea58c5d 9553ecb2 c6c33ec0 3cf6aa5d 403fa5c0 97834064 25effd1e 21b99fc8
+    eadb0fa4 175739e6 3cc972f8 7c7f6ec2 54194c37 d5e074cb efae6d23 08da8508
+    b4814939 7d65df22 a83de3a0 1e9bcaa7 db1ad4a4 3151006b 6f29b779 485391c5
+    480974ed 68156c70 c0d8259f ee236d29 c9eadc44 f2a61d10 e2ce4914 a2f8aa9d
+    4c58a0e6 207c3d73 62e20bbc f84d15e4 3c59e502 0aa28396 e21a47a8 55091091
+    ff51e6be c21bdf6e 0d6c12e5 28f49472 29ab27e3 61dd5d49 b152dd1f 7b92268f
+    f3be0012 53a7fa79 500f6898 52311e7c 3f885451 063068a4 9d18ca8d 2a247729
+    b84d42ff 82b2e0c0 ca9a8662 fdc272
+h = 318b4118 8cde2802
+
+k = fbfd51d4 3f696a05 cc9e26b1 95944ec8
+m = cc64ccb9 701704af ae33127e e73b961f 438d19c4 6a909914 eb311299 41af6581
+    86fc1ffe f091918f b15ec796 764729d5 49084405 5d9e05ed c1f78455 bfc2df69
+    8ca2df15 1a7c04bb 61a353f7 24e1d48f 6202df09 f3d2a16b 5bb88d75 c4d68412
+    1494f102 dfbd4808 5480d50d 67176627 59e1f57b 62aeed4b 641bc918 70a6439b
+    662e6805 e20a8302 b3382512 d4503163 8be69b0c f600083c bb703f6f 905b5df7
+    d8db2dee 1d92ad87 cc17de12 5f532b1a ca4c57ba ab1b7944 ef821b2b d1b7ed7e
+    a18c5b12 ad9636d3 9369d2c4 05d6d88c 63a91016 8ee7bf0e 348db69c 4e04a94a
+    2895ff30 e93f30c1 79fdeeb8 87638ca8 326acca0 1c50f595 f8694387 9be75e40
+    65e6df64 2aacb8dc 111fa20f 6a490897 32f861c7 752ed4d2 9ebe67ce 799c5e5a
+    7fe123a9 66b5f59f c9f162e3 e85bf125 b6250afc c24f7eaf 0dce1ced a379ed1d
+    fb2f5443 74565727 6df3dfe3 25d7474d f44237c6 b7b69e1f 56d617e2 b3ab3077
+    554b07fe cc1d5736 bb941d7e 0efb3044 3b5760e4 49799ed8 0d27ad73 0c20ac52
+    8107f0ec 204518c0 0037428e 9f4c86ff
+h = 03dc1015 011233d4
+
+k = 3b46d4f3 23d32333 e77afd1f f80192d0
+m = 451b523d d1480d92 9bec47fd 64c9f58e 72e95ab4 d4f53d0b 590fa499 e5e7c8dc
+    592cefdb 587a1492 6e3029ac 405e5fcc ca6c282c 23d6d7b3 47d54c13 6d9ebdcd
+    b483711c 7a184955 918bbd78 af61e0e5 6e266c18 46ee05ac 22727bd5 68356398
+    e9a3f57e bf0b151b 2965702c 0702ddd5 763e8357 560aaa9d bf1a9514 40d227f2
+    83389c84 f4cbdd46 742adc64 edf62533 02cb1529 363cce65 67e3f675 1aadf866
+    acad0f3b 7d6bd217 60410ea7 bcdd0f5e fdfcdc61 d7277b60 d4977497 27bffbef
+    e228ac90 112e3937 b9d5d689 ce57d7b7 534ea885 dba9e6a3 94f85de8 1d933184
+    362ba92e c480730a a42365c7 ee6aa8d9 d2c3dc29 b92dd462 c44dd955 c6d7537c
+    2c7c7d00 eef8ab06 f56d000a b4d02f6f 116641fd 9ddf133a 51f84ce9 64767c70
+    c68e2f58 3a66a621 78089cda 014d9bed c3ff12d3 3154c783 037b986c 36a3d742
+    60f5c250 27bdc6f8 32961d17 c4b1023f 9b6163fb 2eea7806 167edf01 ee131426
+    46db59d4 b0f12913 b90d4ab8 70f3ffdd 102a55ed f8c81da3 1725da90 136787c4
+    e1791e81 bc328813 25dca4ed 083f8ce8 47
+h = 16d668a8 adedc3a4
+
+k = 364c843a d273073a 8b1ed568 c3fe7afb
+m = 31a3fadc 75f5e219 da2ee124 6fe0970f 018225eb 292a3c2e 61320087 04942f72
+    a019658c 99d0e876 32e4cdb0 2772a0b3 ad409f98 f9cb38ce ff55caeb 3a7b87e1
+    94024967 8778cb3e 987c920f 816401f4 b6d3d0d7 3f5b4537 f3512fd1 5f20ee9d
+    c2415a51 9d23ee51 060ca23a 9e244eab a5a90f8f 5bd5a50b f0b0fdc7 484ea330
+    f8fe08dd 5ba21a87 abec5e76 0d9e78dd fad2f69c f4253470 36eddf59 8904ee2c
+    c808f8e5 0364ce19 af451b0e caff0d5b 23225b76 0a9a4a1e dbff9d7b e2c39c5d
+    29f83bb8 3243ae68 0cd34294 255c337b e3ddf766 cff2f5e3 8fc051f1 f9ab284f
+    63244cee f845ea9b f83156b5 d8a1a3b8 265de594 1794c5e2 77452974 cb263f5c
+    67113af4 1be00038 92fcd875 32c34b44 5ee7946b 244933e7 bd6729ee 91790f4b
+    08feb4b2 6cd3eab3 917abbe3 e4fcef3a da1699b3 5b619ccd c4a269c9 50edd9d9
+    25b1022d e2688c42 77e5af9d 1fa72191 84a4bed9 5b6c0b1d 774f2486 7408e72c
+    dc673aed 349f9cde dd101bec 39a3426d 781c77a5 52f3db18 10085158 1a2258f8
+    a672d9fa dd7baac8 61954bb7 2254e02c 675a
+h = 38e19b3a 1e76752c
+
+k = 7df4da74 2345102e 36b772a3 14f0f099
+m = 708c6397 7890c7e9 7fea5ee2 5582d222 2aa6174f ff582cb8 7d3f838f 18e6e407
+    be6f9aa5 c17d8b81 f47dd879 c5c565cf 1a41bcda f6270c65 031136ef 00b82822
+    e9e5290e d2a20353 a3d8f2af 0264628e 604c8cac c9cf137e 78ca95ec c86771c7
+    30a4b322 45700c1f b22ade93 635a74b4 7697d22f 66819c4a 20542f72 fed9539c
+    d68be15e 0e9997cc 2b971cc8 7dbf23a6 bda962c9 f9563b05 776fe74e bb60d3bc
+    7b961906 578253bd 94fd8f31 b7d2db92 5bedb8b2 a371ed57 154239e0 c93eb1bf
+    f803e968 2f24106e 3a6e9b5a 5de396d1 e0eb8511 577133d7 ee9eb3b3 98a7f282
+    6e490255 d3eca6ea d05b8a7c bf14f96a 6dfea3dc 2fb8d7ed e41da198 b14aab5a
+    3341918f 5d0eb15f 6ada58c2 44cebb8d 341f0867 7b0675fd 892e54fd 9b90e424
+    e9142975 033a763f 83e57bd3 6170c7fa df56bc09 17dd812f e066a46c ca79ac4a
+    bf0a059a 15edbf0e b277f5e1 fca5a682 c267e0cc 57289d4b 08dd966f a99ae57e
+    cb77a6c2 212532e3 010480e4 3763d8de b14d9083 239017ae 248258f3 1f0291f1
+    11431c34 c7ec9bf9 ef557709 b8b4396f cc9325
+h = 84dba6e8 cac5416d
+
+k = 616c7fd2 1e837de9 3f2eb46f 94213ca4
+m = bc0dbb1d a0bc3375 ff3a7b5a 1536cbf6 cec6cddd 9b9ade81 18638397 77167505
+    b85b92f8 9b3c288f 0102feb2 fd0ccd55 6fe426e4 7b781170 29294110 bcbb038b
+    036cd27a 4f74f570 8f931636 4b51bcac 228c1aaa f3883dd4 12707c13 0c25e8e5
+    79ec7ab8 7d6c05f3 06a3adb3 f43d53db 3ae02049 bb739d2f f75c46b4 f73cdc77
+    376ce337 4fd59e19 558736e6 9b36f304 ccae4aa9 dcbc19a8 b6167a85 b32da99b
+    d5596757 7ab3a1ef 2a1ae2fd c3222ee1 9cd725b6 3d7c708a ad10ea48 e4b9e90e
+    ecc4451d d653e632 a8ef9fc0 3cc09346 833db507 f61a6ecb f94c8ca3 889dc98b
+    bcf5e2df 4b4d0a13 e4dcbada 476e57aa 7e18db44 25a5f59b bfe32ef2 f7d2ee0f
+    4dd3bbe0 4c400daf 50ef3cf7 802f7891 68444948 c1aca5e9 c960ced8 e28d4671
+    30dbaab7 23c6ccd1 1ba80758 4585bdba 191e2382 03823145 888ec161 8acca506
+    673b4ecb b68ede1b e7da2dbe 873a8b07 55b144f3 a81d3af9 45068217 107f7f31
+    dc9ccbe0 3d17096c 9133d85c 2c5ce5b0 c01fee69 9c0ce7c6 83efcd77 56270f67
+    ee3fa59f a9e0022a 88eef8b6 4eaef95c 7b2fa276
+h = db878938 5d343c87
+
+k = 1690659f d05dabeb 1613f12e 407d30a3
+m = 65277683 9c07ab0c 649f68cc f7929c01 029f8918 fdb490ca f059873f cefff805
+    e8b21632 b26a7ba6 0b81b8a2 67ac0b08 7149791d 3599de19 109d81de d90b3c5a
+    47a86d49 0cb97f18 9652d66c 44a6b09e 8733d5ef a0fd2a42 fdf3050f 58d3fe27
+    d6daa669 a7293ebf 511fef32 40c03a8d 5e40247c aaf2015e e8598438 db06d4bd
+    35b4dc63 c7b77107 b00d708f 25aef4e8 324102a0 418bd072 05dd8c3a 0814a237
+    7336d942 f19ac1ee c1b3165c ee445a3d 4b71885f 5a0838d4 d8aafd91 c88f7df6
+    a0c11c1d 9906158d eb028c14 5ed4f077 c6a6429a 55561070 3bbad113 913cfff9
+    dcffbf15 a5146e33 00372e55 30600e7b 3a935205 241caaff 8c74cf21 e0e4f833
+    135a3404 a63970d6 7283a299 49a7c8f2 a3fbeb4b 965aff8a f2250eda 6432dec9
+    16b69ca2 77df5e79 21d758d0 d3f23a81 18dd07c8 a440f0c8 4ad8217e 1668a0b2
+    ec7fc709 c564e223 b6a35de9 bc750054 d6be6e00 39a1b739 cc3b3c33 cc602a28
+    f4e3b547 ccf49cf6 301eadd6 ac5f286b c52293cb d87c0c74 0ee6cce5 758b215e
+    fc8337bf 4886676c 77b5d512 50191a10 1ab8633d 73
+h = eb2aa446 b36fd66d
+
+k = 8875e72f a4ef30fc 8b66dcc2 f5c95265
+m = 7d86de7a aaf7e7df 412572cb 41ff7552 fc141a14 a20fd12a 80b89ef3 ab3edd12
+    0514346b 1405123e a7fd40ca 07cf60d0 caa29bee ae55de8d e0bbff5c 182e0998
+    6928b69b 6696e5c0 958418b0 facfaf92 242fdfec 2a79baab d4c7ef05 54160e6a
+    4271de83 a0f85d59 c99e7c97 dc009bc1 e405af98 c5901650 c7d09b63 90040038
+    67787788 3f2deedb 16ceaa3c 92a2f527 016be2a2 bd284c21 af42a1b9 56585bca
+    e2d72d67 ce2f27f5 d5b27610 876f2ddf b712aa15 b50612a7 a856a0bd 2603145f
+    d32295ee 8457551b 28ef655d 414b37ce b97a77b3 ea4eef28 551d9482 4e62a46e
+    83055ff3 120c1442 a87ecdad 49c33e14 bb9c4cf1 84fe660d b045dac8 f1ab7340
+    4ac5086d 67298ec1 c9b31895 21f7b60c c6c69cb9 37ee3ba8 cd94198c 2aeca1d4
+    3e9c4f87 b4f33007 1ff2b29d 30d1467e a0f5cd56 b5887d92 243cbdb0 29fa5775
+    86d616ff b6dd57b3 ab5aba60 80659eeb 98d7623b b658ae19 add46388 98cb9cfe
+    cd347143 908461c1 6ee879a2 18aaa12d 263afc06 02b5a8c2 b655ab72 cedb3662
+    1a11e47e 31b9c235 01361b7b d2d2cbff d78ad7ed a19f
+h = 328c45e1 ebe563a0
+
+k = 56f54cbf 1fe80af1 9df0a954 58974136
+m = 5d1f287a da266072 0d42214e 1d0396ba c16b159d ca46d470 ca4758f0 2172219f
+    770e0941 7528fc9e ff4205e5 4d96ac0d 3e023e49 b3be0e72 14950637 45cf0678
+    92977855 2ec79ee2 2a8de1cf be529366 5b8fbb0e 7852ed49 6bdf80fe f2c49e72
+    e0eeeccd 753594e9 fbea7e79 21e178cb c9aecb34 adff31dd 121e13f5 e10aa144
+    90e27024 cbd0d56e 1b3a63bf 1dfb35b6 d76d0c5a b978a2df ce0e44c8 7e7b76eb
+    9d569ded a060b9f2 bdc994cd 962488fa 0ebb4680 f6101801 37b63bfc 483f0b17
+    11b1fbe2 86fc2a35 a604b534 0e375b18 d840b511 e15441f6 108d5828 643dbfd9
+    5c005df3 07eae076 3240057b a36b3152 8ae105c7 e1159a85 f3e76911 83251594
+    cc508dc6 94eb8929 dcf49e95 b8f860ec 5a432cbf 65034ead 8cdc3b17 631cf2ea
+    af37cd6c b37ef456 f34e266b a5a9bd4f 1b3d9dc9 23712128 7332c057 5f6689f1
+    27345fd0 1df80b9c 67b7f4e7 1ed222c0 1afb9c00 99fbbc1a 22147c99 467d5430
+    01580731 d38da10b bfdfeb7c a650d996 bdc60e9b 740c140b 9e96e3c2 b7f0ddc1
+    a1ef4ed8 d0e65fec 3e04a9aa d8fce654 0e62ad9e 0bbeb6
+h = 57034db8 299fe49c
+
+k = 092900fd e943e98a d015403b b7cae9e4
+m = b173aa4f 434b6e77 7242160c a49c949b 66a2f7c3 0d9bd9c7 bc011dc9 ea819089
+    13796313 1546a646 24577ee4 c8661c5a e7860449 2d498b36 293e31d8 c190ec67
+    5e97b641 bcccfaac e233f5ba ad607159 eca4b7b2 3bcfbf97 6c65a8ac cfb2cdf9
+    651cadf8 9afacac1 9fc997b6 c9638842 6ef11250 265ec3f1 2b4ffa38 e7522471
+    4d1a13bf 41cbebc5 a23492b2 d3fe96cc d715e26c 29b89eb1 5a061dad 1d7cdd02
+    8e77a032 0631c73a ab76853e b196145b 274d18e3 2122ca95 a5e28f51 acf597e8
+    ad4953e3 dc68db78 a7cb4bc7 5dbb0358 7ac90acc 5682d2aa 81e28cea a54b2627
+    796b255c b30c3a5f 06dc144c db29a3eb 8f6939b8 80d1dca9 dd560a69 e70b12c1
+    fe49eacf 372ee1f7 ba4519b7 bf748079 891142ca 599864c7 2c14d07e 8ed51c3f
+    cd7ac63d 73b72834 1d692285 635f59a5 f6e1aef1 2441fd90 ad5937ca 735a7ca8
+    7b7754ce 71ddd8c1 2fa06dc4 4ae29dd6 4265f68c 47cbbcb2 0a700856 77b5a158
+    73db5006 35c2ea0b a0b68b36 cf49c2bb 13987cad 1a52ebd4 a3317741 ae0daa86
+    461460df 4cc3778c aefc045e d99dad88 c742a12b fe88e579
+h = 79730f50 f4951672
+
+k = 521ae745 2cbd0c4d 2df63458 861b1259
+m = 9a8c47c3 702f02b9 3cac6548 7566f3e8 d90874f1 cc82a3ab 9f8ade41 e10a2910
+    d453861c 2af5c71d 4a8d8335 7639ac78 d5d3cd40 af75180e 61793f57 f9162dab
+    0a90dffe 3147fdca acbbfcbc b971dfa1 e65d1e4f 7f88a4bc 3eefd1c3 5df99e04
+    15503f92 d549e217 e9b5af72 fa4c51f4 81504ee4 554f2ec7 e388c11c e571e3f3
+    040b037c f1eb0f34 022f8e0d 3803b670 8c6cb02a 60d30ef2 d6190b70 88b83737
+    e211a941 e3280e83 d9fe6410 4d05f305 1ae015fc cd40bb52 8bbb2a5e 24eb21fb
+    387d81f0 507cd4a5 33323514 b0adfffd 39f4769a 512546eb d2fe5f60 7f9aa992
+    f26efb72 e563a604 75b2f76e ab08292c 75ffe5ec e03a8c29 3567c2b2 60ee53e1
+    ff1f1d69 1ec6fd4d 4ab4a2ac 968ececf d62d99f6 c945e008 5441bda1 7d7b54ec
+    bef91374 cda9efbb 9ab77840 9d214c40 4cf625cd 3bb42211 2670a8bf b2838db2
+    4b3354e0 406ef5a1 e0445efa 5730b921 69bc4fb0 d09da535 0bbe31ca 3f1915aa
+    2fcacdf2 7bf46370 e50e65cc f8affb65 28e4c9e3 cf796d97 ee9f0ba6 701c39e8
+    bded7cb5 6ed3bb67 c756a95f 89b124f5 e40a091e b92fde05 5a
+h = dcc1816d 369fa2e6
+
+k = f520cc1c 10ad79a2 da17403e 562f8feb
+m = d9dd1e65 241dcbca 441bee7a 0f34c9a6 a7deeccf 1c9df741 4eed438e 66cbafd6
+    efe97769 2b9831c7 0825efa6 d2c0ec93 0ebd0c2b 3fdcdcfd 5ed08244 0805ae1d
+    dcb3e0ae a9b474b0 af6b8568 fc987998 2a5e2b60 735d223d 0c4e5f3b bb4b61f1
+    98ae7d38 2686c72c c002148e 4806279c bbbb8fe6 0ae30f67 ff9be1e4 e2d41e94
+    34610b00 a421a825 4687f351 8ee1431b 3f787d86 a2df14e0 29d4cd32 32039132
+    296e2c8d f18ff9ef 1a837b1b c1227a4c 1dc83ea1 d770b35e 9afa3f37 308d910a
+    756c0a1f 9c7a1f5b 1ad9b0fb 76a32f6b c5bf5c49 b62d8bad a022898a d1617535
+    1fe5f2c1 cc569371 ee35e8dc 36352d20 8012b7c5 91c72257 5a918c1c b0f27056
+    76f9cc4a 7f079cca 615bb67b 88a4ea5a 44e42640 38b39c5d 9308e63f a6162cc7
+    88129304 4b673c35 71865433 5a06d01f ae922c52 dbe9c41c ead24c58 b9a1f9cd
+    6bb5ef2f 68c11ee8 89b29047 089c3ab6 246d3e90 fbf9f784 9bc73c7b b60116a0
+    c021a87f 4233efd6 99a70c32 886f1562 ac08adc1 e1479efa 0181d22b a8c51514
+    ee69e96f 91710ecf b3403edb eb1cc884 e393b736 9beb6df6 3058
+h = 503aa2e1 e86017d3
+
+k = 446c9736 37e71be7 9ecc1c3a 036c62d3
+m = 17ff3d0d c76f078c e2e0cb3f 9af1a71e bd2962e8 15131bb3 076b00ba 9adeb2a1
+    afc3a3b5 8f45d079 c35337f1 78f1923a 39877879 70d84ac4 3ce049b2 95951f36
+    85c4132b 4c4fa75e 33a74a18 68e0e452 22df7c38 84c20f02 b7458b8e 5a57397e
+    499c9b8c e1d33ac5 ccc6ecdd 6cccd097 a7ece67f 64b23b4d 4456335f ef35e44f
+    b0298515 8601f9b8 4b63352b ce371095 e8fd4f50 122d258c 2af2bdc2 2f1dc67d
+    6d38c8e0 39e5207b 4a174d4e 0c3a1e43 a9384fa3 8b25ef78 f92fa9c5 745d9221
+    9b4a6cb5 df212620 0b3edd7e a5bb692b f75d2585 27ca343b 03faa718 24d00ebc
+    c49576ee b4ff9f29 9df12d99 2e2630b2 28d0ac7f 39adfad1 3f21f345 d4841d16
+    f446aef7 c0b47a7f 9942b57d 23c9b4b9 887cd9dd e1ba0ef4 81b29995 08aff718
+    479623bd 4f194785 f678dbd1 e0daf0c5 ea78dc95 13398b0f 178792cd 229604c7
+    8d07ac98 a294c21e 75639bb9 aef2f414 235a230d c82d5b1b 2667fc9b ddd2d7b0
+    defc7a52 8f10f1b0 3719ad4e 22c56990 2abb5516 eee9b284 9cfb4ea4 bfac3437
+    3ad377c9 959bf9a2 f41d5742 c3b746c9 9a5482a6 37900799 c151d1
+h = ab21d71e 4e5acf61
+
+k = 12a2ea1e c210e41e 8490c05d 6c71b005
+m = a9b4eb73 3501f3b2 55132c6f 093b66f5 459d67a3 07edc169 b69ad51a dda3675d
+    bbbcf870 252fef13 32b5d549 edf8bb21 4faf77fb 115e5f95 83956828 2d83e7b3
+    691e6bc3 4eef0824 8d1b57dd 0e7b2b96 1662d51f 6fcc7d53 0fb4ca0e 06bc22b5
+    4d732863 5e3365ee f9a2ce10 531bbf0c 3449add5 e20d399d 2f92e621 beeabfdd
+    301d85d8 97661382 625c640a 920321dd d15f37ac 43261cc6 f2112a35 e7d1c0d0
+    7c3bf988 d2a8d300 bed9a4a8 21357868 399e1242 1b308eb6 cb1c51aa c3b69fb4
+    97626dcc b38dc3c3 772d29e0 a8c4c4e2 7eb87885 b6084c86 b7e4fb76 419b1a65
+    e47c5635 a60de9fc e3f0f0f3 cfb911fe 4aaed2a3 5fa6a01c 656fc309 0b83781d
+    858e1fcd 509f0804 937b3a52 77a95432 d8743cc8 618f0d23 f0ee0019 93a7db00
+    5530d5b0 f4355ded d3b19569 c3fa17e0 bc3f79a0 bc2d71e9 a7894d76 2aa81cfc
+    ad0b5a2f f93f4ecb 4fea6e16 649e3df3 3ce9d105 03ccde2d c7b3375b 7ddd27b5
+    a9d03e71 f0c06b6c 0a3a923d 39eb3919 117ffb82 1e12f2a4 e88e5695 ed068ea2
+    6769ed26 c2ee2319 ccea33ae 34840df4 05aa6982 e7d560ad 42237ba5
+h = 3bb76d01 61fd01d1
+
+k = 4edd798b 84bfce72 bf165fec a574b1a2
+m = 37e26b44 6525e5b4 023c78d1 715f6697 873110a6 956774a2 02990089 8050f60c
+    095f770c fb990e88 a6874fa5 2988d2a1 83c84c87 e07128da d09172b0 b5da470d
+    50570aa0 7fa39e1b 9939cb08 4dbe27d5 a2ab63b8 20bdbf91 943d2144 e3711c87
+    787badc0 f349bae2 339f7c98 7bcbb239 11fb63f9 d0181c2a 2d4968fd 0d40aad1
+    0f9fa2fc 88fcb3b9 38704ec8 4fe05838 8a794c08 965350a9 2a9191e2 1ba4325c
+    8a172cbb 293506bd 573316e3 44ce3334 708d2b57 e8e89d64 25df989f a0524fa9
+    a23a4279 b9ce3196 2dc7eebf 20e64bbf dd9224d4 1d44efbf 1fe0016c a36289c5
+    8c535734 8f5205be 20e7e573 bef86436 8e595071 871efbd2 f8da6a1d ff8999e7
+    58c5cd84 ebc8d739 50878b9c 74ac288d 970ab700 bdb1edb3 0169bcce 905ccc01
+    04aac322 b2fe4b7c 8c7e6c8f 11f1cb1a f1bfe6b1 bf379b42 88eeda1e c61ad6ec
+    8cf7388e 8d69853e f501b6dd 625dfd88 bfe94d4c ffcc3059 75736e27 9c0b13d7
+    38efe1ac 8afd2b27 72b9c074 f258c7df f1f90a36 53cf0c10 d14f8c48 568f9f04
+    5fdb0398 c5501aa9 c239dfb9 6d5964a1 cf6715f3 cd5d140e b908e6ca 7c
+h = d5200f0c d3e5d3b0
+
+k = b9e72333 9cae8cbd 6f5970de 6e7e4267
+m = 54fc0dd4 9b02dd85 ca0fafc0 8ec663cd 959e7a11 3a2fbed8 c1da6bc2 4b1ef2ca
+    5c9583d7 c31059a2 0f695f45 2a026e2b 767d66d4 284ecb86 b55face5 5f6754a6
+    a8609b3f fd1a086b b0e4c5e2 08b5dab3 f5aa39f1 a652e33b a2e424b4 96526b60
+    560725a8 803a7d80 78371530 59397251 1d8edfbe 71692beb 672b850f 02a7ca9a
+    98cdebc6 cf2f5ee1 25f24538 cdf206b6 88ec7412 9322976d dcd8113e d1aed0ca
+    34c5bc85 d3a08f85 e7ed977e fd437f4b 76a4e294 37f49a29 b9c8c2dc 74fecfe4
+    41b0a407 181f09ff a27e535d 7c481ad1 d05d2835 822695b0 ba053a18 946273f6
+    0e96ccf6 65279bae bf086c06 76469b90 24771072 041b1974 f88e4358 bb72e673
+    ab2309c9 46793262 5cf43a5a f3b3e1f5 db78e7ee 6b76ac10 29b9c9b8 897d643c
+    47a194b7 7fa8cc94 68a1470b fd5e651d cbc29d86 2074358e 11f6674c e6d533de
+    a79298c8 50d91d43 cf45cea9 95a41511 cb47f424 ee16762c b4359ea7 27380749
+    28d1f739 f53d358c 89ff2929 da97a404 51bdd730 d042910f 207cb6c2 6bdb079f
+    93e894a4 7ee532e8 cc14eb38 3f515855 5d2a52e7 420cfadd 1607325b 1ed3
+h = 94faf65f cbcbaa89
+
+k = 2709e009 45f8d418 c5c46963 28178780
+m = 222b2ba0 f1a9f9f0 0db69706 54cc00ac 373a40af 4ca7474e d5ffc429 854212ff
+    99def12a 690a1f11 878c3162 ee4fd1c3 9a59a816 9673cb37 49d7ec6d a19d696d
+    84915353 c4a85dc2 a65637a2 bf70f996 979d3bf4 4be1a806 bb9a8cc9 11aeb16f
+    11fbcf7f 86553b91 b68e4d31 628816fb db11da08 eee62ad8 664d9913 749bc944
+    0c080f20 10f76d0a d7038771 bff278ac ecea4018 f860d6fa 4776e006 9a5dc1a9
+    99530d3f 561cd7be a5a589fd 814015a4 294cd543 215ca893 9f80b5bc 74977dfc
+    4f1cd28b b3a9435e a207530d afd8d478 a454016b 8df95feb e95ccf0f e89b9c90
+    5653666b f1fa4e2f c73c3ce2 ee120838 6550a79e 70c93daf e2d8cca8 5dcf6e1c
+    e7c65c7f 7797ada1 0ce030c9 4c3756b0 e020e5c1 25b76def 6cfd34c1 8778f5c8
+    1efa6fea e5444d83 f6f24ddb ab38b360 def4f99f f5b150bc 9b855b3b 249f9f45
+    003ebb3b ecad1b28 aedd285f 00932c52 c87098b7 4df8f958 d72b839e a8560c5c
+    7031ffb8 11bfd742 8bc97b77 4b37325f 1de11dc2 b2b1e4ee ced1995b f49a0875
+    0d72c800 5a36bc85 e77b8c2c 21690ba2 27b8b06d 53087595 e39d0238 962268
+h = 5d3d22bb 8dd91cc0
+
+k = ed0b52ad 2410d388 7c6547a6 64f946bc
+m = 81fc093a b41b98f6 448eea79 a6e31a7e 3585aedc b59faf36 0834b00b 010ebd49
+    09c8f8b6 40d8fee5 56587eb6 a5489616 171e690c 385fb4c7 669c2539 99d4f839
+    546f2e1f 01ddd918 8aad2e42 ce54ad59 416e48ed 6bc53dae 8821d4f9 74f928f6
+    a656ab76 68f292a5 9fb67541 07591961 be3a3e75 3b58359f 003e9391 e1f4db3f
+    ca98060d 3ffe3103 1d6844af 64322ec4 6e0064ab cc63adbd d4fa4108 48cc8a36
+    576e0e7b 170d8805 afe009ac 0e7558f8 786d36bc 1a98e1a1 c988f2a4 f364973c
+    26aaaac7 d80e7461 391c7dd2 0e685ecd cbf2c957 7565cd32 69aa7000 f24a9042
+    89f3ec68 6d0ed596 e811448d 3a1b7867 337238c6 0ca9118e bc9f2017 d2b20c83
+    6c0fd96d 43b95505 c4870c86 1695a738 6b270772 f617268c f08e7b0e 6fd1f301
+    f8561320 e3bd6465 c798e593 2e66cd68 ecb5e0df 7516be96 a31cb7e9 98d6085c
+    aec6740a 6b74018c 317f3814 8a6cce42 906c7bac 7552eb6f c4b9da9a 005e2edc
+    7e40064e 020b3a15 eeb6e34c 3c0eba94 432ba1f4 54030145 d771128f ab6478fa
+    0507e61f 4f81f642 64b1f985 9398126f 2dbc5aef 32397d53 4c39a75d 4f4cc283
+h = e948d38d 3dfbd717
+
+k = c979199b 9be7707c f2811937 5a09d229
+m = 19950330 a75acbd2 d8184a87 4e4d3051 1df7add7 1bbb9252 f1107f22 87a78139
+    15e7fa80 b0ff3ea0 e55a072f 4ca924c9 aacc5115 bdec9ca5 2a3a64d7 fb976abc
+    16e08204 6695ef9a 266e694a 01156751 21c52c31 760b7c85 c0e4138c 8ae91294
+    d17d1935 b4cda783 7cb70b35 c771e9e2 93ba4e48 63033b7e ac3317ac 0291498a
+    86e04b93 474b8bfc a8705204 5102f13a 7fe70953 1f904f81 94c5cc31 d26a5780
+    e46918ee 462c016b a1c1d015 e61864ec f7d44b9b bf0280ce f520b768 614679b2
+    0a8535f9 1a71e6bd a476c3de 0c657130 8f210436 53d59284 769c824f 8f39604d
+    12062b69 8e8dd3cc e3e25c4a 1f853c86 bf419606 be5e75e8 31f0569b 7e6f8903
+    5d059ca3 6811302c 9960528e e5ce32db 1c9bd32f 3000aec1 feb976b7 1c8ae3a7
+    01abc8db b20f1770 737aa3f2 bacb3194 dc22d8e2 e90a43f5 2995152a 9c3f34e1
+    f61a7a7d 6a649b8f 78260c73 30030bf0 560b34a7 5d747993 ebc25fe3 e112bc0e
+    b836db61 4a5c36d4 539c6abe a69bc14d f32e2e28 b54aa41d 05013aaa d4464210
+    96eabd61 c0415c96 35793793 d083d0a8 627881c2 20188805 178dccb2 e1764175
+    70
+h = e1edf43a 7d99e545
+
+k = 0b32cdb1 2d2108a3 de538672 d042357d
+m = eb25503b 93e76b32 fbe35682 ef8d4aef 1a8de01c 5bda05e2 16810caf 189b18cc
+    7de6303b 490166b3 166d8190 735c8418 f26bf7df a004de42 38593f83 035c2033
+    c9cbc1eb ff2dca0a c47fb464 c1b802f6 a5013cbe eeb9fadd 4aca1c1a 5baab515
+    5ecc3c62 53bbf687 4bd57b5e 8f53f171 f75e63e2 ab8428c6 551278ae 97122a07
+    4ce3a484 70f0fe8c 73c8776e c1ee9ca7 6d109047 000ea788 040cef20 c6f2ff36
+    5b0a1cd0 481606c3 e31e5e2a 62f2682c 98ae1f5d 8e7796e5 1d9c26e3 478fce77
+    32719636 ed6fefd1 cc14abd9 1f9bc42b 455ef0d9 2c92bb33 6e3c348a 82d10c30
+    07d1854c 6b407299 4c4b4fde b0951adb 8fbdbe62 662512f4 1ea13f17 67ae14dd
+    29769fe6 978b1d8f b041bef8 b4b4661f 03f64943 d37e74fc 4a6e5468 06cf4d6f
+    89674637 a77b37d8 e941b74f fde09466 6ecc22df f5b69533 f481c71c e34c2f54
+    e68bc8b0 e64ff14f c2e451ad 80c1b3d5 a25a1795 d2e984d0 9bc27b18 03b6adac
+    ce1365c8 9288b926 b08b2e75 936c71e5 5b4fb3dc ff8caf69 196c30c0 54d31979
+    dccce559 c1ae19f8 9585cc9d bd7cbb25 04c9f09b c575f745 c047ea48 9ba61af2
+    1cfe
+h = 1c5aae53 13ba431a
+
+k = 8339d67d 7ce11c70 1edc3a18 1463aa4f
+m = 83db97a5 739dfef9 e1ebedd4 e33c01fd 610334a8 ccee4b85 7f5e66f4 3455be63
+    ba58c898 2bb9d7eb ad1e25b6 cded08eb bd8263fc 0f6efcc4 6fe053ef 7a869141
+    17ff8c2f cac08431 7b8f5e6a e65bc576 2bc80161 e2c0487a 75fc1b27 a9c648d8
+    3afbe523 d0f5b8a3 336d9521 3dbb7063 f6bea904 2f78448c 7b7f2017 bc52bbe5
+    648e5a39 dec9e0d5 7ecf9b94 c324c14a cbd6730a a4a56584 6ed1b156 594557d9
+    d3b7fe27 cfde7fb5 31fe7379 bba1006f e9db83fd 7adb4798 bad1cd9a d32ad44e
+    1f0d03a6 6ed0e711 df342522 817d3138 6912593f 4ed9efe3 a1ebac48 d63066e2
+    ca2030ad c0c56aa1 b559af90 7e717076 f242ec79 d9e3bfc1 5c422e93 060e63d0
+    29cd145b 4cfe78a3 ae14d78d f3a1f263 0123ac3b 82d4f34e 77d9c1af d72d46bb
+    ea072808 56c7adf9 de9c45f3 d125ca36 9429fab8 31bdba21 4a3f3969 baea7222
+    e7990432 1fafdaab c24c04fd 1fa96ff6 213132a4 eb1fdb3e 894e4626 1f4e4263
+    dbcef16a 86bad2c7 d96019fb 55960370 7dd150e9 5e034415 daec8e69 8c5a96f0
+    e04fd363 1c0b4e1f c3545808 dbaccec1 c338dd69 c13387ca 9fca3a98 fc7cb203
+    1500f2
+h = bb68cb63 a96fc339
+
+k = 6c0d481c c523a2a1 211bedae df687a3b
+m = 101c2540 d33d8e3a 77ef6320 0cccaf5f 34376008 c36f3a06 4dee4c7a a9358808
+    09d26efb 7ac5fed8 3536d13f 7a9fa4c8 1f9373bf 3c97604f 9c20ee3f a910b6f2
+    ae96cf05 8824d9ed 6423e6f2 bae68c4e 01e40d18 c5bc685f 839cf8da 26c3c009
+    a3b90760 0d90081c d9f0ec00 8b884570 164526f6 60485616 d304d2f5 7c577afa
+    52072a35 b617a4f5 711096a1 a6912f5f 683ece32 322f3abd 5226dd7f 57b6241f
+    6b29169a 30cdc3bf aad302f0 f398fbef ecc7ab29 8e18a593 f3102f60 84f4f101
+    4290fcbc 64327dff 120c9fee a11ce8ca c9cff648 c6ea5d12 79cc0a97 a79e4cc6
+    a3829ef6 33a3d2f2 4af720f6 9726b71c 5f339834 528760b2 ff825b90 61c92781
+    7f27ddf9 6f6cb8ac b67e34cc f719e008 883d4a01 bfd39d99 043e15b0 c6b1044b
+    332e8664 a10c30a1 2156cfc4 15486cde da73a450 478a403b b6ddbc17 122849d4
+    dfb75b8b fd45b55c 66c31529 dcf42295 ff6b13de 7e4798b3 8c052239 fed448f5
+    a3832ab8 c4604525 de8b73d1 16787a04 1c5f7303 14bcfe06 18780e19 a163dc86
+    75960ace 954d7d1f 449255c6 a8708f4e f394c65e be3420c5 af817b89 17c062f4
+    edacfa97
+h = c0eda4f8 aaac1fc1
+
+k = 2602b0d0 35d0e104 f69eec3b a327762d
+m = 0a49ec08 b9743222 9fe178f0 67ffbb96 74f76d96 d3d4ed9d 28631d4d 08887adf
+    ee174c6a 9d051688 f4483e7e 8a4ae0d2 102b6dbf c970c14f 2db5da07 2870e6fb
+    0b55422d 6a1a88f9 b6d8b532 8051e90a 676e3b81 f14c3ff7 5512ec87 dd4c4343
+    67415452 c7ecf2cf 9700f0f7 a74b4b99 b10d9c2c ca52224a c227f0e4 b0f83e6b
+    a4bcb0a4 0f5d8210 1903f683 15af3af7 510393b4 fa363b46 51622df8 0578d0de
+    eb50ec46 9e921935 3d2ab60a c939a26a e558540d 2b4e40b1 1725b932 ee8df2f2
+    46321f41 a8c5988e 7d7c5d04 3701dc96 a5d57fb4 73c86616 8562c9d8 dafe9595
+    cbdaef42 ea5ce6c8 1b15838b a0be562b 83e9b138 848afabf 00792f5e 11438a93
+    957722fe 34206fef 4d39c3ec e4bb78d2 6a5d9161 d85c5cbe 44d15692 251eab15
+    5b87e5c8 a010a08e 74d9ed59 f32d4891 a9905515 66e7c02a ef207584 ea317aa4
+    f50745ad 3b60cf1b f5142dc6 bd587184 747ed125 bb83609b 39be8009 b08a1b07
+    e8f04638 6ef6a995 ef6de1d9 e2394c32 c81775a8 a2c12548 e2c5b4dc 48b7f773
+    74aeba72 5c78ef0c b9e9eec4 ad2910df 3c562683 1105e84c a74dc150 8173befd
+    60e156f4 87
+h = 39f7adcf 080568c8
+
+k = 841be215 d04ffd98 3b5a8b52 4437312d
+m = 576e1888 9cc98d91 f6540baa eaa0ed87 ae6336a7 9ec7ffaa ff903fc1 d5f5bf2b
+    0168c143 56f2328c f8791257 62d920a9 86fb37d9 bc947cd8 248827d0 199ab143
+    48a0d4ba 758dbd13 47574172 d07d3aae f0982797 b0e5876b 1dd041c2 576a26ed
+    6dae59a2 b9c79d6d b830d930 3e7561a2 81fcf934 cce0563e a6613130 82b30e52
+    8930ff4c 1ddc4332 d6a564f7 f9100991 74ce2e10 9bb63bfb 44f055ea 3ead3f7d
+    de37fc8e 0ec4b5e7 7c52538f 503409ef 892c8e47 ed0d8a10 3d3d2c09 58afe3cf
+    045b7c51 695e6231 700c3826 75ae1972 c1d966d5 37dfa5b0 c9c26608 ba8e05e9
+    73e5b329 75795552 38b9417a c49e47a8 b8ed33af e11e1ffd 250e9863 0afce659
+    6c28b198 549a8589 3e4dd4df 063f86e8 5cc3776e 3e8db609 b41b7fed e26f534d
+    8c50ff31 6d5746ee c5ebdb87 bccad9a0 5337eab3 30fea702 4820c9ba c2248fd9
+    7527b514 b82ce29f 6b6c6ced b8fbdc99 2b0d0ea8 f0639f69 516d3d8d bb94552d
+    b39ff7b3 f2bfe376 c35b836b 4c0941a4 5a418d2f 6243c9dc a3c58b73 42e5fd08
+    7bc8da64 0a48d54c dd6a60ea adfbf791 06337929 ef902277 1e1e5536 f7241049
+    a231f449 a34a
+h = c4256574 53795aa2
+
+k = 25154f5d 684fb5f4 7eede0a5 d22addd4
+m = 4e83b2d4 44505084 7ee0ed1f 2c76684e dde27e9c b9971672 da97a0b7 d3df4ef4
+    f4d9afbf 4b33f2d5 93c31a5e 0335ce2e e9420624 c60c392d 465394f3 0148eb4b
+    38c1b187 42683c8f 8f5cd4ea 1f60e398 3e625214 91b195a5 b11c2d74 77d01c2d
+    b68e31ad dcd6fdf9 25fe3d7f 684f17e6 2f68904f 8cab8fab e8193c95 e8a1c37e
+    26b3f36c 7ffe3c0c 178e5bae d0e34e9d 20bd8b4c 970e8bdb 54920fff 8ca79284
+    2a5eac5c 656e991c 9242956e d0ee0a17 36553d33 1cb35b0a e1ad7ab5 7efffc75
+    5a6422a1 58780480 6496ba28 c4b4245f cb3ba944 1c257e67 bb302afc a059f6b2
+    ea51dbf2 6476e683 8b3f65cc cd86ad81 76796f0c 979cf94b 87731962 b0ad0f5b
+    41dbc150 2a352708 39ea4801 c857c193 8eadc0d6 c4fd5059 ddd7da95 cef27f15
+    4a3b953f 9b2bbc5e 97e6728d 6b2efa77 07d9145e 18dd919f f6a3b583 08cf8a6e
+    2169b0d0 afd3accd 404682b9 1b71bad0 137e115d eda5f5ae b7b50ffa fd9f3c58
+    05c44e39 b7996caa e299df20 daf941e2 e08bcaba a8d1110e 867ec8b8 205f7ce0
+    5a378930 9cd1e0e5 7f162829 0b0b8079 62e6fbc4 f7e9c9b8 2cadfa19 5245fd46
+    7c4f61ed e0c445
+h = 201822a4 f110674c
+
+k = cf7aa32c 2624e389 5e025220 7cd22759
+m = 9fa1dd43 0f67f73b 7c433f37 4fec6250 17ebe7b5 402c5fb4 c19206b3 a95beb2e
+    fb9dd218 26351b19 0bd17da4 22a6ad77 eabb2823 c51b8b0a 7142e2ff f5222e59
+    7a12326d 15a57d0c 4be6ac71 784c0da8 1d8c1787 0ee6f53e 3c967703 6f5aeb3d
+    4058f1df e8733534 58e470ba af49141a 016fc9a5 8a2000d4 014aa5bc 04304c6a
+    bdea86c8 d2fed2eb eccbad52 8da9763b dadcf556 1bf14bee d2a93063 b7ea9c6c
+    bc5def24 7839d7f3 3a1251c1 a848aa9d bc68d89b 8ad96d4a c49d2d55 bb0cace0
+    9ccbba21 a3999818 ec52dd89 9ec085db 9a4e6f90 7c34a89a 19e035dd f6fe9c8a
+    8f5a2e8d 8e4038fb f4e0a6f1 a636f409 86a5944f 51294959 19bd60cd cf3b6511
+    9e40e2da 09576897 567b33a9 82c28ee7 6d3ac412 3d2ee967 dd63df61 6406c599
+    46163550 b14b2b07 c74f34e6 55253fc0 df6d1712 b0808171 50b5158d 46998f2f
+    2fc0910a a01935b4 a8a7e4ab 55e02d9b 9637ee20 8f0c8e7c c07c6ef8 feb69304
+    0da386d4 d7e101ce 86aa4212 8cbe3288 3d174bc4 a90acf75 af39967c d04227e3
+    e26cc99e f7dad55e f24124dc 8b225340 ff6fa7f1 d39c1b8f d27240a2 496524c0
+    d468341d 54624e11
+h = 5ad3bf88 d741c44c
+
+k = 0562b9fb fb33edfb e0669858 5405eed3
+m = 80bb169f d938384f 1502e798 d04758b0 4b52e237 22d6fd6d cbb4554d 380f732f
+    3be3de3d 6b85fcde d2f729e5 87b95c20 a803d314 fb89b9c1 acb4008d 71c7acbe
+    645eb662 2f80325f 521e6fb1 1f21035e 8cb984ab be63f4b6 ef824969 f8ffba09
+    364012fb 196e5ffa adc7dd9f 6ca614d0 a4f4b84a 8a55a745 cd0c700c cda3da06
+    39e38f57 3df666af 3fdcdd19 0b16eb92 2bafa99a fabe88bc 46eb61bf 4a29f96c
+    b2e175e1 380f5d23 ac05fe52 29aac696 707e2af0 77984874 1de3b499 2836ebcf
+    dbf40e62 bf3e0271 4bc1ffeb 3eb348f2 afe3745e d31ad86b e6633ef3 8b9aeda2
+    446efba4 8311675a e471dac8 d47f340b 88b648a3 937aac68 0829f21e 10804c4a
+    434a82df 29f7c258 2d12adde 906e5808 b3e6e307 b22e4a49 5e55b91e eff245a0
+    f7a79d9b ebb2358a c4e22f66 1c2cc8bd ba6a6bcf d2644669 22e6d0a2 f7606b9f
+    52aff47c 20920df7 0021887a 129fa416 b77ca233 271c1d2f b0d7290a aea2cabe
+    ce224cbe 0122310b 2d092b64 96c0ebe0 e5105cca ae1edd39 8374d418 26e84dbb
+    93e22265 49d52d97 1665ae49 5f606865 776411fe 81cbfb06 731d932b f7a2afaf
+    28b1923f 1f102894 07
+h = 9eded43a d8cd6916
+
+k = 4f214753 fe72adbc e6a6f542 e2681125
+m = f55f8718 5ff65f7e 244457c0 3bf75449 dd4b23d2 969e45b0 427a8ff9 1cf9b695
+    c158e176 e06f6c25 6d3417e7 1aaeeb09 c64f2355 12ecb3dd 4fd2dacc b6f6ebe8
+    4f6b7e11 b4d5044b 0b2a9aee a0304068 666b0929 ab98706b fda8979f 3bc250c8
+    e3fd006d 03bf7469 2d2800f3 80dd1395 efd12b9e 0da5faa4 059fbd04 312ba6ef
+    5983c1db f724b19c beb41eee c525c379 a8986c8d 585f3853 c0a3dc65 96727939
+    24589641 9370183f 27504ebc a3e34919 b4a7953a 9d407caf 6dd29e6e 06261b98
+    8066b51e ee70bc4c 295cab7a 1a17b2bc f60973c4 090cfe78 b7ee871d 0a88e314
+    dc8c562c 22a4ec27 84632d89 851534a1 b9e0fe99 7f9eaf31 1f622fb3 c393af32
+    371a14b1 848d88a1 f8ab17b2 295f16d9 3e0604ff c00bcebd e6e913a9 489bd2f1
+    d1c20ea2 cf21b9e2 01014eaa 932139d8 a4e943d9 0b517fbd d6e43b05 416dfcdc
+    87c7d467 7e805ee4 b4828238 62591217 f3d94bb5 6fa091a6 6d2f880d c56fd297
+    effc6976 faa9b02e 866c8a91 9e48e9c7 371ca4a6 b00f67ae e085d351 f3a88857
+    e6949158 2d84d68c fcc91478 964758ca 5d768cde 5f3c4a94 0d55f626 e6b7c2ec
+    1c88040c bc20baaf 3ac4
+h = 28fe13f3 083a853c
+
+k = f6cfc59f bd1df1f2 01145bfc 92200626
+m = c346f5e0 5ed9da29 672b6dfd f648ff68 14f687a0 72c2614a 26f7f01a b3d70d71
+    17dfd60f 05ee7e33 b8207b6f f20ad105 0a87161e dca82ec4 12eadace 5b96d3bf
+    0bfd8edd f58982d2 63d6d3ab 852ebae2 593049fb 8f2dbe8a 17c1690a 1092d5b7
+    c568c892 3a8c66f7 157a4d5c e266f62c d129797e 1804bf9f 255baed7 20816868
+    cc572dd5 9cef1f7e 3173d149 b219bcd9 1b7219fd 21ae4c5d 932ab6b7 f72b9a02
+    51df95ce 7e82d30d 3c49d1a2 94ea0f78 b289b938 bd047b44 030e5f15 4a9cb5b9
+    dd7ca6ec 3fd1ddb8 bf3f8b8e 775de334 c4b1a1b4 9fc9debb 211cd90b 9da85b72
+    bd62aad4 5f5ac944 78512cbe f1f42985 3aa2c33f 726d9b46 e346cdfb 62107994
+    a6097447 16d9a85e 564e2a6e e7e77378 e3358139 7bc54d07 b9b0a45e a0e6642a
+    9f5910fd ae2e96c7 9595023b dea7e350 3c09be67 80a6bb90 f3ec17ac fdc66327
+    ce720fce 0793509a b99dc4a1 df54a4a2 800591a9 472032d6 6daf9324 e8f243ab
+    a21bf58e 788bdfe9 b66a37e2 504c3486 bc3e13c3 a431dc5f f854dd76 06bc838d
+    51d517cc 4a977968 e321e63a eeb0cbf1 5ddf098c 0552f35f b84bdac3 bbe50e07
+    6f503ddc c775add1 469385
+h = df3d045f 255a6b1f
+
+k = d65f7ff5 31c78570 7c18d3f5 8a46012e
+m = b5acefb8 f807e625 0a851226 45f142f7 54b37cb6 36d02104 a48405df 880491d7
+    a21f1e50 b6b9a726 29bd20dc 5f895d29 8356c900 1d5fca4a 1d9d6211 c8f7864a
+    f69a3767 ec32c5ce 9f3c3f1e bb4320b1 039d4a1d cb7dba8c dafcd239 3f099460
+    3ee77fa2 fdc14976 9a5720dc 50930f12 c51dafb9 0f0d3c84 2d115d6f de342861
+    52a46142 e75cb27c 9dd3093c 5ca6003d 873d44e3 bf20797e 255574a9 cfcb6b6d
+    650c5d9d 7ff1d3b7 83cf248e 8c15ecad 9d96ed02 1b8b0f7e 95ea8aa9 25826911
+    52b8a8bc d2c60b63 c4b3a3b3 9c2fe0b1 014b9274 676a3a6d d373d608 af2df32a
+    5dca2e79 9daaefa8 7c4020c1 3a97134d 261e7374 850b32f2 3cfefb42 caf282fd
+    1c87f457 6b3a5e4e 26843092 6cd275c6 264b7171 acea028b 8008df92 d4305753
+    2ce6cd6a 322d14bd deeda523 85c51e13 2b7ee53e 6fd39ba9 ced3d9cc cf592920
+    37a94406 89ea5995 bcaded7d 9caba6b4 20e21b5e 9ba102fb d18aabe5 498b1021
+    34bbc5a0 285aa781 f070d644 12b98e32 b5966c80 7f8bd336 66495bef e2990c9d
+    7f5a9a2e 243901fb 3464beb0 71d45067 a820c846 776efcf0 57e3de7e a7e8da4c
+    8d6556d3 c93f06f1 42f6bfe6
+h = 8c5b31f8 9b0a5951
+
+k = e870ce98 c63da265 956e5a01 5635acc8
+m = 6c275743 08a842d1 8938c9fa e85c6c2b 75281904 4134c3bc fcbf9ff3 e3dcf97b
+    e5b257e8 f2dcf038 241c6a7a 756009f0 48db1050 c69f983c 1d16fcbe 33fc9819
+    2b9ac62f a45e89f1 3c4c9ea9 bc9e9dad ed4825fd 8a9bc944 e20861c3 d9dcf5d8
+    b02fbc50 a385f37f 88442057 59a1f3ab 0e6a9374 63fe2150 708973d1 334a3dbc
+    d3afb336 d68063d4 1751e58c a7b4ee20 7c27bbf6 eedfad7f 5587ccd0 6624c1a3
+    9677aa78 db619c82 44d0e9db 02caf654 3f19e924 487100a8 b5bdf62a 9180355f
+    335f4564 28494a79 787b552e 16355f19 195050ae 9bf5dd38 77a20378 fe982a13
+    640a4344 9c98bd99 316663a0 35c40a67 a52ea8f5 70686fb0 71d299fd f5e2a692
+    24f98e9e a580739a 5deba48c 97a5b682 d0fa79c8 303dd425 88325146 d17e6e1a
+    ecf5e03d 83272600 1bf8b7a0 76ba5301 25c21159 98bbf496 f08a71e6 9db4e6a9
+    abd87bcb db796995 98f04f0a 56ac19ab 51cbeaac 67616b25 6febc046 272305f1
+    75fc5ac4 dc39b0f3 81de76f5 271d5fec a517b15f 8c1bab63 f0410042 abe17401
+    ac4bef67 1992f221 cb003d7b 6823602d 55dc49d3 db6c980b 7283b9fc 888540d0
+    de6328a8 788aadca 2225f21d 53
+h = f2d79e89 1d47b4a4
+
+k = 61171d05 7ea15973 2d7d7d7f 5a92ceb9
+m = be2ac8fc 4449cfb5 ba2b4a72 ccf957f1 ad26cdc0 31213bce 2e79dcce 9a4129af
+    697a31cd 0072874c 1d507bf4 bfe212c0 44ad1a42 93c5021b e3e75302 176abedb
+    782acdd8 05014b97 20b083fc be8d11c7 b23312d2 db6d06c7 900fc52c 91c842b4
+    453ff82b 11e55f4d 51b3f126 584052d3 c79565bf 43305576 ebbae8c2 88a46d3b
+    52ac42f5 d44ebe5a 1fe27369 018c40da ccb7d4be 4d50d6dd 6c999a71 33311b6d
+    11968eb7 cabf291a c71b2ff0 885f9f11 164d2c92 0b473615 cfc38a6c b7ddf925
+    7c1dbe0f 2a7f147a f639f3d3 368e71af 7c38ef32 6f2ff862 569d85d7 4db4d107
+    b531074b c998d0af e6449b08 2f105f0d d91e4367 73b1cb84 5530de54 2406c022
+    d1c41dc3 ff39a371 56b49db4 794b3177 5b8699cf 33cf38bc b288abc9 99361a38
+    5f92016c e8a0790a d6f626f3 9c046bb1 ab3cbd78 ae9eb5e2 42af8f24 c1f62791
+    9681e118 bbd982aa d63aa2b5 444960a4 a1579c80 c42e2b7a 1d39fd6a b29c7d5c
+    0136624a bbd5d957 ae1765d4 85e263f3 fa5cfcfc 1f7efa48 f8da77f7 a44c4960
+    4369f1d8 8895c485 188e9ed0 f905b9b8 ebf13c6c cc39ee06 27984d39 1ad3c42c
+    a0190fc2 ac8f5077 7e82276c c627
+h = d4f37e86 7e1608d9
+
+k = 98e5f9ce 53dcc5f4 4b464680 0355b750
+m = 0d57de9a f05732e8 c316b98f 0a84a729 e76a7164 a39597ba 27007ff0 1cc70542
+    b06d4882 b48ca509 bf2994ac c5215489 d8b4ee62 8b1fe125 ed9c7bdf 4cce84c6
+    2fa65091 ed00af5c ce16ab6f 366bfa8d 4e99f5c1 c34b0e85 42af108b 5b33459c
+    94601f0a bad7bf22 06b2cd3e f42a6bb0 fad7f41e b602c970 4c4abe3a b036e55b
+    043c2c5a 944a5889 db2e0f19 98c80c3a 33957385 dcc51a4d 283f2533 e65afea2
+    57059c6f 92f74eba b816e4a5 e24e3800 bad6a58d bf580fbc e0f0fd85 2e36649f
+    06864038 f63caa76 9545397a 08bc99a3 5b2a01ad 68f4970c 243b54f1 c9e25441
+    58bbc3d4 7e153d60 628fa07d 58fba8e8 e89e1368 87084e98 86e902f9 6c1aa2a1
+    f5fa8762 928f09b3 a951ecab c128aff9 d760bf57 183b913d fb447303 7e4fcb4b
+    1e759b4a 5c015e1d 672b1829 806839b0 aad5276d d86da3c6 a597e35c 49a6519a
+    8efd13b6 0a2cd81c 6deb66bc c625c6ad d4a8dfb1 f74dc77e cb88b4e8 7bc1aa4c
+    6804180d 535d9013 6cc8144b ab124365 280531df 668c2b70 032e1e51 44c5eae6
+    885a5300 aa77b70c 9c6bb124 e4364e49 297ab38d 81a54fea a6e80015 79eeaed0
+    0c83a65d a5abb7b1 8585d611 b9d226
+h = d74c5c4a 189db24e
+
+k = 30f7f427 f76b9932 ea28501b be42ca43
+m = 3ff029da 13a55f9f 95031671 50aeca4c b9eec54b acce45d3 6357f1be cc9187b0
+    267c4f99 8d0566ce c5e2806f 9edc6d63 6a38dbaf aa3cc75b 13a6e0cb a9bea3a8
+    7ddb99f4 9a7b87e1 340200f0 cf4a5760 3a2096e3 6319ec29 e361d0c3 03ca3121
+    9034b7cb 16b6b690 62c8bfe2 acdc1b2b d3f9f542 6bbf002d a6ed1ccd 2d624892
+    3e9a640b 98c08905 d3382e50 64b0e772 a8a9f03a 4409c103 4b2b9fc5 1ab3c340
+    e297ec3d 94ec54f5 3fffc1ee 482e07f1 bed24191 47246a2c b6b3baff 874e8ffd
+    b0af9754 0f249109 96d018a4 4de8d272 0a0dec7d 3826f4c7 95cb500d 1e8272eb
+    40005b75 a1c5e599 c7069980 633d50f0 a896f85b 90b5c34d f48bd3f7 85e548b7
+    fb926b0b 19a702bb 0ffcb29b 22d5232c 126f60e8 301e6ed8 18741bc8 feb578f9
+    8283c642 0b65abcd 2d61b7df 22085faa 9fc02f7d cfff285a 99567633 7d369da4
+    cde8769e 419b204d e0620bbc a6cd23d4 85d27572 9791016f d646c936 add418af
+    e95cc12b ef0bc15d 932f0360 22a1ae1c e622c9b9 e75bfea0 e3845dac ab6d72b9
+    43ce665f 59dc0b88 4f6013a1 96d7d303 25638a77 3abc2f6b 1b28b34b 73245917
+    ae3213d3 9f8c10e3 73952b72 30f7c993
+h = 7cbbdf49 7d1aaffb
+
+k = 3ce348e0 f63a0b74 e5b1baa2 e707e07d
+m = 07458b73 6a65f044 35c3a72c e7322b35 92772f49 b1031f7b dce8a879 a7383d6b
+    ac4a86a8 4cee9069 c7776804 73de33ad 921de8a4 ffe1e2ab 4a9a388d 2271a821
+    fbd596a2 9ce11d46 abeaa6b5 846efde1 d98a2961 4027f150 570f7ca8 0e5a225e
+    887cbff2 cb99f980 a1a7d1bc 5282732d f94e240d 47981fd7 53cd2d71 0fce7a38
+    bba78a2c d9f9b878 fbf9aeac 62629832 9154b86d 50aaf0f2 cac6ebce f5d1b445
+    fd43ca98 f9511583 a11aab05 c8f2fd69 dd72a9bb ef1e188b 74744fa7 814b1d5e
+    6c3ce3c4 97302115 fc201998 7e2bf80a 28d44005 38150633 25cdc189 dfd3cc5c
+    00569ed7 c8522c42 f738d6d3 c53699a0 b71d41b0 a326d79b 3ba86799 d5a42257
+    c55a16eb 286272be c7067c6f dd3ddc9f c001db58 d56a89f0 c4cd56ae a1bc8fc3
+    216b6e5d 5b77c038 1b390974 1e0120de b30d30b8 ae161a66 5b846ade 1d73c40b
+    f8e69982 b5c539cc c4fe197e 03161ed3 4c7c802a bca549d7 b94f4724 d7e2a4f3
+    2e0799ed ff5ebeb0 c19e08c8 3704722d b1b500bd f9df0e80 0e0c751d 71bdd08a
+    3fde9adc ffbddebd 26127a1b d4862540 f3d71ead 0b83fdd9 8b430858 bea91211
+    f333270f 5473f3f7 a726e063 11ea1f97 de
+h = eca98f40 69e42699
+
+k = 2f4818a7 b37d9bb8 27a9c843 df6872ee
+m = 8dcdb295 5bfbc8f6 f305ad3b 828f6aaf c4e4d921 92058704 6ed28f9b e9398f98
+    1ff75b5d cb774549 057b5f3a 56536f31 398de59f 07140cc5 3a43e843 7e094eb1
+    8a28a5bd 71371776 1098326e 9692df33 96c6d565 0f2c28bd e80ba25a a15b1071
+    9bdab5ad 8ef9304b a037d7fa 20440653 3b345a46 f6f052fe f37fa9d7 e58489ff
+    97e1857b 9dbe3709 e3c198aa 290ae267 f5ffb123 d38d41a9 d6efff21 e2715037
+    de4c9845 f4848e6d 517043b2 3470f932 7456ff4e b9f29377 036ba769 78ad1dcc
+    405a062e 44d10d82 c4bcb998 a700780e 53f9c673 27bbefe9 063cdf43 93591255
+    1ae10779 e951bd67 e58877d0 71f14c40 87a60c3e abe951c0 050e849d 2487333f
+    254c15a9 74aa1a5a 62865cff fc0e4815 e3406b1a dd81c9d5 95ff53ac c27c94b3
+    314f9c22 a7275a9b e169bf47 3d7b4bac bdeb3f0b 6f1a8dd5 9c0dbf0f 02c280fd
+    ea2c245e eab64118 0931624f 32cd9209 fc5786ca b5e3b64e 580abede b29deb5d
+    7ee7fad1 b39b35ed 64ecaa59 30d77340 9a99e0c4 315b598e 63c5128b 82b25754
+    5d9b7873 7061bfae 5a1296a9 fe3e6d09 70df37fb 965809a2 0b8a0d16 304545d7
+    eb36c23d e82c5485 799e6b61 323e3a82 e2fc
+h = 98c4065d 75869bda
+
+k = ccaf5144 304349af 98c57c16 263fa702
+m = b979e492 596717f5 93dc7c3d 1bbecf9f d081f11c bcc6aacc 2612d372 55aa163f
+    c478f4e6 a0405001 677e82f3 fcac1fe8 91ca8508 6811beef 47ba8f8d fb1a7705
+    15eca34c 91d2f940 a57d4966 11dab4eb a16ef18e 1bf14676 98483f84 139a7002
+    1ee2fd5c 46b40d3c 217e8fec a05b363a 083d686f b7041dae d30315c2 0b8dbcb9
+    7cb6eb2a 83ca997c c436b32a 3bcf444f c4340629 afe0f520 69d68e1c 04669861
+    d04c9041 f7e87c90 8e69f306 6561d064 d54c95e6 dd344286 cc7a1471 1a145d92
+    fbfb27ae 6867d722 43e192ee 777dafc4 8086130b 5cadcd92 ecebe963 54dcb920
+    3aa51ead 9141b0bc 0a942623 f6bed944 8e485ef7 30d6722b e24d1053 819441f0
+    6ad7102f 4dc02e9c f8eeb3c0 4ebba63c df36332f 11f48b6d 8bdad30c 340461bf
+    46cee653 7d2f001d 117c6dab 7afc3e41 e9cd54c8 ac8d1695 df5b5724 1a8b8725
+    4809d30d eeaa211a d998f17b b3783493 662cb9d5 447a1e08 d788c74a abb69537
+    ba0397cd fb28d9dc a65bcce6 a3c365a3 40b81c38 aae0f873 de1e7148 258e3677
+    a8fa63bb 9cb9ce2b 8bb9f4e7 d04cdc97 c8f5a884 7aafd71a 15f53102 1f5e7136
+    8a68bfd2 13fdf7fb c450e04f a6c36a08 ef8e4f
+h = 38cc9b2f 78a3e364
+
+k = d8fb3286 25ad45f4 09c3fe63 02e84d24
+m = d7785ebe 578e385a 6da21c42 d7aef6fa 68530295 ed7f3acb 6ecd3f1f 83ff1167
+    3cb85b15 198dada0 9adf4f9e b0c1ec28 71ac2d83 bd57dd6b 8d4ca364 de7f1ef2
+    678896ca ff298331 5b7f0169 59a22ec8 9a0f07de 8aa99656 7c47ffe0 c1b5ba58
+    d49e2527 80f03e7b fa651bfd 9cea6c41 877b0105 d2693319 e0382cbc 67dd60f2
+    2c8808e4 134d8245 b875db2f 8a90bbf6 8320576c aea54547 041e88ee 3f62789f
+    1d36bd25 3d1fefcc 8cbfa213 d8e74cf4 87ba7164 44c531ab b06f3e2b 9443c728
+    82bd5b0d edfc2487 a2c6b8a0 213baaa7 4b377c0f 3aa4f7df 1dc3ccca 6f946152
+    84fdd24b 5c296289 6cf6d227 ace50e5f 30fcdb56 ed28175e 9e0279a5 fc7f0bcb
+    b306b405 2dfcd455 1aca9139 182f2050 1c6d452e f26e24ee 5f9cc46d 442b3f94
+    54400248 5ae69ee5 e8fb413a 79cca37f 263ebe66 4d8c25b2 474d23df 1082b20b
+    277385b5 c7621b3e 58913b36 15ac9f77 f9bcf647 50e3a0c0 ce25441f dd1fb4e7
+    8d4ce748 7c7189f5 70e9d63c 20c4e91c ec08c359 161d482b 52fd0201 b20b5f58
+    b90bc201 58377352 5370571e 95cc1fc3 2dea6148 6407d3bd e06c2ccb 7b073fa4
+    014d0283 c3fa5cfa 4c854aeb ffc729e6 74445f73
+h = b7ec32df 32c1eae6
+
+k = 760cca38 435f5fdb 4c2bb71c d8068ecf
+m = 2a93becc c2d5cc52 c9072df4 0afa1b1c 32c16e6d 02acdf18 86a8670c d0bbdea3
+    6d52951b 3a08ac7d f22dc8f8 e904bb98 4ee3eb88 30b6006c d6c96616 f5fb68c8
+    84140700 c1b563b8 f4b3d566 176c9245 9b519670 67f52993 51b052a5 6ade1aca
+    0bda558f f710d92b 0294ba12 e982edc1 65cb85a7 5193cfac a558576d 26c82c26
+    0de0d1ab e9d327c4 5fbae1bd 149454a5 41f60c64 568dfd90 ec3542be c8ff9e70
+    9425d4b1 3f20c070 359b8654 a7404c42 a617d257 da3d25a6 bf772c3d e9167fac
+    b32fecf2 39bfe26d 35b7bd7e 14e70422 56d0affd 1a5a7b99 85e22f86 c5458961
+    8077a87b 05377787 343891c2 41c5fd07 abba9d5d be74a54e 577ed752 aa81230c
+    464ba8c6 ec396827 44dd30cc 96656116 74b62b63 b238b8c6 cfff2509 d39ebb2f
+    809e5e04 45e5ce76 78be1e07 a67e9c92 b356c3b5 2825361f d2142498 9aad965f
+    9beb9ac7 8731a776 02c40bc6 8f1f9e96 7a36b7b8 1768c509 1220f747 6e72bf39
+    ff2e3825 92f1899a e28b2499 f4ef0cf1 c55353d5 1c19a870 b619ba4f e54c2d43
+    a84e01b5 497c2146 5db05891 43282944 26f2fa53 6c377821 57449031 568170a2
+    e6588f33 b89792f8 1850bcfa 74beb6b2 de889843 99
+h = 9af8661e 8880b8fe
+
+k = ba188432 e25a684c 61762277 0da8095f
+m = 84c8ce28 ee9da589 25f93540 b4bd612f 0f677ff7 38a75631 05bc9a34 231ba658
+    1da428fa 48ac5cc4 a885c5d3 f098f452 157aa201 d9d39f78 2a19fc6f e346da8a
+    bc38f4f5 6e5c05ac db70cbf2 0a52c19e 261aa00d 57b7ea88 b82fdd6e 8ea3b494
+    653c353d b46bc598 2f166087 665de7d5 4ffa8009 97ae442f 687dddaf aeed1391
+    b7e3f0e6 d0449593 ce8a547f f495f163 12c15be1 74d6dc6c 88b7ac59 5508422d
+    fbff151b 86716b87 8b2aa76e ebbbd9cf 71bc40bd da78934b d18f2802 870ae51a
+    0455f7fb e238ea75 369a4bca 92b81c95 c8e3733d b3a61c6a 6ec7f3a3 90c1b2d6
+    673a96ce eea9b03c 7265f670 f7ac811b 3d0c97be 1bc3965f 8d151149 363527cd
+    05c496d4 c2d35790 bd197c77 e526b30e 1f4d5ac6 6188b972 6b380a8b 8e8410d6
+    940b31d0 7840928e 1ef45afb 3122da50 2451d3b8 a73d99e5 3d89b15e a7c0c661
+    1653bd74 89e67348 302dc2b4 9ece4059 3651f36f 9561e6a9 be75bd0f f6e148ab
+    d7f8e0e0 e4b06aae bb060776 f02ccbd5 bb71f68b 8cf0d4ee baee0aef acb062b1
+    aeab3b25 20ba627b 772df418 0a12e2a4 0d13782c a24a8ba5 98107bd3 34fd2158
+    59bfc5ba 0aaa47f3 77d82bff 16119bc2 6e41c588 0bdd
+h = 6e35d969 13ff6614
+
+k = ef326b32 7a4eda40 138c002d 4ef6e883
+m = ba3d2f1f 5a12a100 b0186186 a6bbaaa5 e8af63c9 ed2d319e ce112452 fc2c5308
+    424cad1a 1e5beb94 04400723 5ddcf9a3 4bc77013 d9437b12 b02a4dbd d48aa1a9
+    3141b94f 62629079 0c4adc9d 582695aa 10919e5a 03ce5de2 48f022b2 fc506456
+    85810dbc f6ea44e0 10f2541d c405e61f 0db3ce36 f71863d7 31c4d92f 6422e755
+    c2d4ff46 28dde021 b2c1f604 d74b7652 8a768ac0 5a46d4e4 da0d4fbc 6c2b7bc8
+    1eef712c 345588fb a18770bf 3555036d 31e146a2 dfb220fa d6845b3a 7c531ebf
+    176e755c 269af526 5d46e113 4306bf61 8d16042a c6a48967 67946229 01babf81
+    6ce35929 62bb916f 1dedf06d 08d3d41e 131d77fe 7c8bff6e 420740dc 13ce02a9
+    bbc4ee58 50ebcaca 151013ec ac4d9528 51531cd2 1a8f3481 2a9a00da 5e874455
+    412860fb fccd23c5 af96d057 523f53bc d7adcf59 17d9b17d 16cd8687 2b633b11
+    a9b1e250 a7e23f77 c6f585e6 3ec8f6b6 385a5cda c8b56ad1 6d08ca6d c7dd35ac
+    6a8f76ff e2d184b0 230a33f8 b2cf4902 5fea691a 3bc008ad 542d5853 d7ec62cb
+    cff33b23 5c38b065 2c1568b9 669e4b4f 35d22c0b 5e5062bb 8dce13f5 715a6904
+    8fe6cdd4 39724ca8 d579aadc b23404ee 11cdc37d 133293
+h = 0193f2a8 82dc2929
+
+k = f743726b c680f4ac 805dc39b ebd17b77
+m = 586f6e58 8dc4e83b 2c7a9915 697efe85 dc1eaf75 f840083f d37d24ed 4deafb7b
+    494f33d4 84fdb09d f4cd0f1d e801da7f 68183818 c7dc3df4 da5463d5 4b30e602
+    36a5b626 e931d000 92ae8024 eec0e25e 158cfd4f 2a160942 e33d98ee 4c740432
+    097a5165 d02b765a c88b5cd7 1236b302 3dc24b81 7450c14f 53957c05 eeb3680b
+    6f28924c 22bdc59e 828a0f25 f9929632 19a6620f 92322df4 05b749d9 5eea6304
+    2723e383 8648d216 3e9f1538 36cc7e14 c36d3022 d33b75f2 b3f9ffce 8e8c31f6
+    bf05b354 7872bbf3 bb25114e 364a66f1 cf764c67 84b67bf6 f34c36d3 afc34c77
+    b46a6777 5338827e b2296027 0aa3df1e e1357414 e6b98d69 ec418dbc 04c6a488
+    d932e695 0f90cf8a ddf97cf9 e41888bb b3d28f9f 8cbb9fea 6461b105 a9097261
+    8bbf6bc7 265452ab 435dc078 cdc38d22 4abb7099 c94373f5 bd62ef9b a8849a51
+    be04f343 ecc36da7 9ad4ce81 e420749f dcddbdab dd42e8c8 7c996281 465b2962
+    fda3d51e dbc08aa8 750d7568 cf52c534 99a1ac7a ad13ea75 d2d9a0b1 6f9b6593
+    a9215b2a 461f8703 3277e038 ba4235bf 71c41c71 0a54842f bded22ba 58684162
+    0edb48e8 7cdfb91b e45fcf86 eb21feaa aa0b40e8 a2619e41
+h = ad6d382f aefc3e8d
+
+k = fd7f6762 85933761 74f9fc2e ccd3c398
+m = 69828c57 00390656 bf265b29 c19da7c4 1a889688 3a11401f dabc1fa2 7aff3f5d
+    8a45340b d5fc33d9 042cddf9 240f487f 56ec9c86 a9e7bd24 c383bdfc a3f2641d
+    dee3c284 7811555e 6e0e7346 9002097f c3025ac3 c4187d8a 3ca0424c b3720869
+    0d54cc36 cf2c4ddc 4f3919ec bbc9b1af 87ad8709 7af0a8cc 22ef6337 2112a920
+    be66d582 702afbb7 d6692a6c 5d10b502 f7d861fa 33c53c74 c5615531 7b1c97ef
+    9037d9d8 974e6f8f 4977ccdc a64ba1f7 c42eff45 771ab578 d80646cb 4ee5f369
+    d0af7dad 8300724f 92794b44 012df7d3 e10d32fd 54fa79a4 d4922be4 1e6a43ae
+    1b143fe8 ca49442f ad52f32d d0f2fcf2 d047d32a 422b4d77 bb6fac0f 273bfc6c
+    b6190a73 bdd8ce90 92c8ff1e fc4d0f01 cc8fcc91 c9990150 765dc9d7 481bea46
+    21dd45e2 7db82cb3 ae0ffedc ee8e9ec1 df410304 c16d70a9 c1c408bd a958f7fd
+    c397436e 36a8ffa0 b5726f49 24084080 8ae7f03f 2200b1d7 1f002cad 18e123da
+    c959c88a 5d296afd 683bff77 bcee61c2 9a3fb5a5 2c798fd6 d490063e dffa88fb
+    1a20f8eb f48bfb01 88927a4b 0637be01 aea2cddd 019e9387 efdf2d3b 15c9ed25
+    9703f3a0 dc28bbb3 e12f5315 d1bc0180 0f682702 3b8aa550 54
+h = ba9f45b2 794d73bd
+
+k = 86858f3a eb3a2df7 4a320d25 0d715e9d
+m = 3e020d59 7f7f6ecd ff4b7a56 7d6de6d8 0f2d8ded 5b6e81d1 308232ee de218ebe
+    46882c70 9b0b8489 f0e9b38c c74bd887 545c867d 0517a541 bfe78cda d137e34e
+    4a0f9a8f 5808059f 2108e6dc a4326385 c437065e 9925bfbb 6af0d053 8e8bd31c
+    8f5c7451 567f79bd 50362e75 cd6947db 54be6370 c1b4771d 4a5eb390 46ba5057
+    d85f8f15 d7526782 90ef90f8 167389a5 f1ea3160 a96125d1 1665fc5f 769b23b3
+    d22b4747 2e1bafb7 e05c85b0 1c9279e4 3f1a6459 ed698f2c 10fd7423 fbff7185
+    b44405a2 022f694b 9e99d0d0 d42ebd37 df4e1870 af0c53d7 42d68500 97b07a68
+    f1f8449c 59ee357a 34e6ab68 40d48034 69db69a2 162c36ec 3f70cda4 14958631
+    9cb9ca51 09eab466 1f4df66e 37526770 708f1e6b a5f8c52b 61b87b26 6c3a2b66
+    9fc3385c 274dd52c 92279fb9 82a11f8a 4b577eaa af411717 a2dbd2eb 3d16105a
+    65ef69c6 2bca0749 6393072f 433876fb d8acf72c 213e985c 889f6ee4 21f32de7
+    a9b2b43b 3a2e6e57 044f561a 96d4bc1d f1fc9813 d91f533c 4f5476f6 602a86be
+    ad055d5a b496a105 552b858c 8033d10c edae7337 2c567336 67bbaea2 33177e9c
+    611a6388 6c956643 cd6145a0 a21c7b22 e77c558c 40ab7843 3350
+h = dfcfa08c faa54a58
+
+k = 340a73c4 cda7858c 2d1fd2a0 d742d25e
+m = 82d84acc 7e7d9f15 50dde1a4 dfe2239d f01d3682 42ee2931 c9128bf9 1e26ca34
+    659acc4e ff4e32aa 9aefade5 277af103 279680c3 2b1eecde 2a195c99 aa3302ef
+    923b2cdc 93c617d8 133f6ae0 47a61484 e747c92b a916b39c 152db5a1 2d59ad0f
+    bef065f7 35107612 ebe599a5 b831496d dbe610f9 2f9b6ded 7469a3ca deec0b49
+    e67ca5a2 a1c0cdd1 90d3971d a6902596 c06339a1 32f2c2a4 8488491b 0ebc5336
+    71da05b6 cc327d7c 7a9868ec b8cd951b 491f4085 036fbba9 013452df 211e0f17
+    f47f2127 6efe349f 83e59e73 df02126b 45d400c5 4d1a2aeb 085dfe16 681032b4
+    acb7a9cd c6183c0f 7b75c2b9 389c27be cfd9cc3b 65d335a1 7a5bd33d 1cc9a7b0
+    631f98c8 ac6c7aa9 3ca8c05a 9cc689a1 dba553f8 82e5a8f1 5d49c2de 31ff232f
+    a7f8d914 5d6f90c9 0f279b61 25a394dc 36fa718b 1bbe9cf9 acf6d5cd a34807e9
+    dc689a82 d2eded0d 944a2b96 374b1011 40fa0002 4992f3d7 4ecf3a40 6ff45e98
+    daa8bc7e 945d4413 093847e4 b6245bf0 8b8f46cf 1ab6376d 423b7ee9 eae0204c
+    eba4f69e 819b5957 4925436d 5de7a92c 44f4b1f7 a2844568 fe65a1b1 252a599d
+    aaf0883f e2a170d1 c9946b5a f7952a88 812754d6 908197fb d68189
+h = 15104691 a76616ca
+
+k = 74d615c4 b9ba90b0 56e3b113 dc30f5a4
+m = b5dde236 8f04d327 558a2782 6b81786b fe87126b 4aa95281 c70d1508 7d6f688e
+    cadaba9c 95823d56 d14b3fdc 349daaef dd7c366a f7e32903 b0be1ffe fbe341ee
+    31feeeca 3971d8eb a9b9a047 7119e36b 13f6424a 936ef44a 4ed03026 d8bcd258
+    fbac4f6a 6f60dd08 48ce362e 0b43cf0b 088e8253 679590a8 4c4856ba 5f521a27
+    33d59c00 1145f847 40402f59 746dac1c fb55a0fe 6bc5be95 1caa8b25 57293caf
+    39156d44 dcf623d8 b11eefa9 8d4120dc fe554164 aac4ef1d 0c31d1e8 da772b34
+    bb9f5a9c 395e8baf 01618e6f e7759a31 285d2cc7 b831123f 3a7cef1a f8066ae2
+    e15fdcfd 4afb11ee dacd87bf 1252e398 f6e03621 5caf9e50 8b65ec83 42f1aeeb
+    ed45a4a1 b2413e5d 5fc69242 71c43b34 5599a4e5 541f4c42 b9c09142 e6a497b4
+    512ec685 d3c685af 833bd12c a8f6ff17 d2ab5b5a ccc4cbd2 289632a5 6c25e00e
+    84bb398d 7fe54ab4 69c4bf61 56e43c15 0e3ddc24 3b89a16b e00b05b2 ef79d7a5
+    13f90e46 031949f9 1d4475aa 52a2467b d479b40a 3d596a51 189d50b8 ac8b62ff
+    905fc965 e569f8de b6cc7f4e 16f408d5 d0c5fd04 22f7bab3 72554f76 814fb715
+    d7ca1fd7 332f9d8d 4d711703 96f83b53 05fa59dc 0dd5d577 d71edbef
+h = f54d2089 4b646926
+
+k = b86a3836 9c89251f d4b38572 0694ece4
+m = 266750ec 8bb22138 3748ff62 4d738bfc 5a0832df 5d8fd103 1b603e5e f83222c5
+    cdcce175 4a5696a5 ef05b044 e5550ff9 7e329e2a 5c642e1a 116992a2 970aa927
+    abf1528d 3b0aeb0e 9f449be2 8efcd7db 5c22ee49 7219f2c3 fc9209de 7e0ef25b
+    8c983793 fdfa0a0e c978497b 877ccf80 6d30d138 0e06c660 919086f4 bb6ad5f3
+    1472f488 050dc158 e5ae626d a05222eb 583b0757 e96c4412 07446d41 b4685489
+    84a5c0d4 d02dd869 ea043a27 692808ac 39508f18 011fa136 b73624b6 67285da7
+    41b146b9 44a37de4 6e446429 4d86d670 879c008a a7e09fc5 94101d2a b2ac6b9d
+    6cdb6909 ebb54b67 239c3235 fa17c39a e23e9e16 795616be 2d28946c ca411c56
+    ef760073 9b4a3e57 f620e61f ae6eca35 4d47ece0 b41ef78b fcbaec5b 55d31927
+    45fa0cbe ab4cbdde bebd5f54 7372272b 0fb81e29 f5bf19dd f1cbdf9d 91090fb1
+    18f3acef c4eeb9e4 d75c506c 5cb8eafb 74c41d0f a2df5b31 5b30991b 55c3e276
+    702a0fa3 2c71291d e98af95b 18a41e0b ae0b98a6 b32f3608 5430bb55 da840f04
+    63c98dee 81a7da39 a254dede 615e2e58 871b2d74 d01f9a50 2f22438c 2a148b31
+    3914619f eece490a 0eeee316 59a2433f 608112b6 a85d1064 a64ab95a 65
+h = f3e0618d 87501a8e
+
+k = c798cb93 b99f74e8 9c84cc9b c17f69b7
+m = 9e2eb59b f8f68183 a4730827 7fea01bc 367011b7 b2d702c9 dcb51c00 a2c96dbd
+    b1bae6ff a5ed7b99 f91d9125 95beb7a9 f264cb24 91d43272 e070e002 9989fb91
+    c6682cd2 7aba345a f6efa881 3c12376f d4e73731 5a5c0099 d87cc796 27554d9a
+    b4222b1f 74f25290 5afa2773 7c5c77fc c04aa363 c7e68663 41cb1839 97997ad1
+    49194825 f29ec9f5 80f8ee84 fc008281 1d7b2841 607383b8 d2443fc6 300e4077
+    12061823 42f82d83 bae312f0 94b514f9 b7975c6d e1d7793e d6cab7b9 7ee190cf
+    eaa34957 53c047bb 8eff8317 d973d7f7 002a22aa 0676ea0d c678cd7f db6572cf
+    5d3d0cd3 a8b9c912 90b1dfde 8d6ec121 160c8457 04c94c59 820785b9 fde98688
+    a4751fde cdd02188 b7422c3b 9dc130ba 9362ca25 51fa7f66 b31f0349 e44975ef
+    c760f50c 2dd9ce43 aff48529 22fa4dec 71be792e 88ea1c50 d22fa78e 302f803a
+    bdcf815f 3c6543cf a6f68dde f5911ff5 9214e174 f49be407 56aa6e04 53d7f51e
+    122f9b4a 6e2bc7f5 6bb7c94f 7954a127 a1511f31 3cafc24d c5cc9ed3 713acbc2
+    5369ded7 da1365b1 66e19074 b22b37c5 efca048f 8ac67bfd 7d6c304e 500df5ff
+    cbb9f725 dd9b3cf6 52eea538 9fafcfbd 8400229e 6caf4e81 d35fbacb e201
+h = cdc4ded7 4798b436
+
+k = 798c968c 86f7701b ca6ec9ab 04be5ceb
+m = c2e5243c db8f03c8 3dd59465 12ccaafd ed3c310e 7ed00de4 a30f2777 fb531667
+    c5f52440 89a1a373 6f74cf5a ab95c07a 11d3611f 5d18b0c4 ce29a364 e2e2800f
+    716cdb95 458cef87 f3f47f7f a3584cfa b18ae8f1 44d85b1d ac70cc0a faf66411
+    2898b9c9 e7201e21 42fa60a9 cb861d70 785e8938 c07d2089 f4aff541 8374c220
+    ad058ad4 938e0fad 87b23278 c7c34ad7 864f3f6d 5cf4a05d bef82088 2c87adbc
+    222b8ebc 6f6a6f8b fdb161a6 87da1436 ae5b3012 0c5c2915 06022c19 c2093308
+    fd1cc78e 77b90fdf a474e494 48c83f08 afdc4207 81debfe1 1657f076 94d846d5
+    a73d4db0 579f8180 4d0f9f90 401146a2 4ac23f70 681a8a07 9cbcec60 59d438a2
+    6d6d0e51 6bb3b809 fab7c6cf a22272c3 4bad1e46 16301f66 63a88b59 bba5c3cd
+    2ac2d09a 33381826 9f01d5fd 05763224 184902df 75b06c45 a8d3b461 0363b932
+    809b4576 dee42e48 4fc0d428 373def84 1610f704 ecafbe87 2b3943a5 0bbff68f
+    242c7704 c85f2cf3 43002b1b ab629f14 cf1f5602 5e88ab9f d59d2248 e0f8630c
+    0f1c000d 0376f938 678556ba b2a7395d 9d31bcf4 a9409660 55ed2d72 22a396a6
+    e1c58194 b5b690e6 63e4e0e6 b4163740 eb41308c d9f9e5d8 806fad96 a11694
+h = 75079f0a 3d2d817e
+
+k = 7782aee4 864c6b3b d9e81d63 d5fc2171
+m = 0d7ece7b 59876f2d ceb7561a be6cb14d b7817cb2 80d09406 4dcc72f2 4f0757d4
+    f88f0aad 7e717ff3 a0e37468 d4019d0d 9b168917 93378856 58d6e371 d7a55131
+    36cf9908 53e8d361 517c3f01 1340c612 ae3f5e64 416cc170 615aace4 31cfcee4
+    62b4e0c8 4651aef6 1ebeb866 43607446 45bdf9a8 b3ee4d3a 12386fd0 48b25d08
+    e2407a92 00756054 fa338171 d62e5615 547ff282 6bd1d55a 96a0617e 34a6682c
+    021a5203 73573873 6dfba4ca ba8ff64e 6b30320a 7cc8c917 990f4dbf 844f8bde
+    b49c3c64 22f16e49 740ee871 e2e564ad dbe41f21 6673ebb4 a9387f1c 0ac976f8
+    18083856 aa6bb384 1a6494be da5d91a7 e83fab33 f834f60a cbc1fa94 691af4ae
+    a3af0584 e4a68d21 ec6b9521 06ed21f6 46619359 3347dfbe 16f854ba 6779346f
+    7fd20528 bc352f2d e2439902 124153c1 05289b0e 70465034 5b7ea0c1 6855badc
+    4425763a 3ea533b0 2fd5d3db 5f24c7e5 eda117d4 b18fa298 bb5e853c b466d84b
+    c0af4f22 8a767b30 77ef1bda 30cf00e7 0561f790 ea8c2242 e7745971 b1c8b12a
+    503a16b5 48342bd6 59055179 bfd290f4 63e9660e 4357d9a0 e112aae5 337ead6b
+    8a2d9cc0 62040ed4 228ce692 94f19609 f73c3272 595870c6 a56b183b 84213d8d
+h = fd59acae 43f540ec
+
+k = 7978b45a 85f1c4b1 d789a47e 7b9727a1
+m = fcf932ec 7aaa5e65 5ed4af1e a51a2657 3f838fc2 e68975ee eff5d51f 7e133959
+    8ce78f52 8745e1b8 df3427d3 994b5eb9 595a7e7d b9535a70 88447e50 6f87e7e4
+    6c8496cb 05d05311 0649518d 07c4de8f 4d2ae7d0 5d12d386 c6501891 713ef032
+    754bfb38 8b1b128d afe6e17e 965cb95d 24ceac17 8a8e8c98 d23e43c2 6b0f8af5
+    f0b1a47c 9cf79a03 4c76e3ff b4dbc232 eaabe38f 711ffcf9 3c427d66 1afcb039
+    579feb51 78caf9cb 672c9ce0 9a0d902e 96d3bb06 7fb3ccfc 2d7fd3e0 0f2fc88d
+    b740c7de 3ff4d97d 1cbbab49 77f498ba e1561b2d bf193669 723311f6 564932c9
+    2add4ebd ce039ed0 a7b08fde ee9cecfa e0b92c7b a6f29708 16efba02 d500eeef
+    c3d804be 80b0351a dc18d2f8 7f2183c2 35827c8f 04b09da8 ec212a55 0fd1b93f
+    3dd3e340 108cac1b b3e35ceb e200b4f9 08cdf67c 84dbf4ff 4192327c 2a611e37
+    6ca806bf 2f0e31e4 71becbe6 c89fcad8 aa8d9f69 98130cf2 6cc2e4b7 2673c504
+    7e99ecf6 aa5b10a5 f8b0b817 770a4a8b 6ff06cb9 34f4060a c5fd8d88 e65944bc
+    bc47f0e0 531a6d29 e90b4c03 564171d9 a9c4ac2e ca3d899a 79e73c9f 1fca8159
+    f4024b12 ff158f37 3b6071f1 aa70742a 69826255 6ec2d4c3 95b60782 44e69ac0
+    64
+h = 1a371513 852d4e79
+
+k = cbc21327 fe067e0b 2414a4fc 6573c6e7
+m = d88bc34f 18bdbe26 b98729a9 94766fcc ea620850 118de7f3 f7a0522f 01126303
+    e2548c62 086927c4 d970a241 400969e7 fbb9b99b 4ab06d28 4a046569 aacb1f7a
+    dbb54ada c6a3abd8 ae31e459 1ec63afd 7cb7bc5b 508d1e4b 9e5aef64 2bd65dd5
+    d3e69def 7448c83d e8b7ae9d 2d6821c7 b3c8f757 d84be086 df01daab 17723ba6
+    052fff6e 03c3357c d169798e ee3ca163 1d5bd903 36ba2cfc 964fbbb3 97806872
+    1e5ab569 1f02c01b 75e9f318 9af7e56b e9e4e94a 06832842 818689f0 888169fe
+    f1286232 d4e7c5d4 3a05c9f0 215ca808 9f981c43 86b1bf66 fb267e18 a2684cf9
+    ce772dd7 d5d7ec65 1d00c0b4 5cc0935f e3e45b6b bc57a16e aa12fa95 21b46461
+    f64b4699 b2b9e4c0 208e0e65 49fba100 29a96139 c0182577 f417766a f316ebdb
+    9347599b f53f8706 d280d313 2b6d1062 6b6066b7 a416b694 f7ead725 0c9ba15c
+    19e71284 e8f2cd0b 7c3c9374 a6780f53 5aebee5c fd4ebe13 6e0ab2b1 4be6d574
+    11488e99 cfe60707 05385989 0cc1b1e4 9695ed86 4e7b72d3 af3d6808 d87b33d0
+    9cab4b21 03283882 22210717 8b261a61 60fb7adc 6001a424 866b8ba4 8afc5fba
+    7cc5966d 4eda584c 001077fd f3f342ba 29ebd5cb f777d870 9bf790ee 06a0695b
+    b90f
+h = 866db062 70f156c6
+
+k = 1228c78c 01752f77 11b73218 db8ec9d9
+m = 6ce77ab3 c8df52d5 0918f7e2 9594dab3 8613d547 420922aa 39fd394d e00aca91
+    69881e83 25c393be 74731025 a381b5f0 4531c608 15c2beee 3314813d 7dfea05e
+    f24f29db 43c743c5 dde10932 e1239013 fca6dc8d d07b4c43 a791aaa0 ffa2e7a2
+    5de3d869 c75ae0de f8a40017 581a704e d15d390f 5f922d13 67b1c1fa 2463427b
+    c7578c36 e3718245 b769898e a0c0f670 58f19a58 84c1342f d00ae825 51326d02
+    4ea36942 077d13d8 371b1cfe 3488413b a3c2e393 2e209bd2 dd794d38 dcff8a4c
+    f3512042 0d0a8743 d63afd04 27806d87 f9af486b a4df1659 675f112e 2ff03212
+    42843c14 77089838 844b8b13 c34bfce7 22e07426 508db28e c87a08ce 701af1da
+    b5d61488 b5a879cc dd5d8024 631b713e 7a482976 4a0ba875 b66ce0c4 1bd64c93
+    27ecf4f7 ed708acb 99c0b8e8 9ed0b833 cc78cea4 6c6b11b0 ddeba1ba c0e43f3b
+    059c5e5e 23637afe 1451e760 14d931aa 6406793a 0181e7eb fe80e924 a330b964
+    7d4b7050 4a023ecb 277fb36a 45fe1449 50ecf00c 50afd8dc 9d390470 8237b549
+    9ac7b5a3 3e5bea8e 71f98093 8f484c45 a010093b f502c06d 6fd21b87 3a315a88
+    35f37ec1 21e59cb1 55f87d7d d4f70b82 59a66dc9 80fe5502 18c7ba77 de9e74f5
+    1e4624
+h = 159da137 498e6640
+
+k = 28861792 b6daf729 a34f03a2 1f206430
+m = de5b0d54 37b467c9 7da99db4 13ee0491 5a948c5d ea7a1f55 bcdee151 a5e6a177
+    4c6257f8 849d56a1 8a3e60a6 ae70d542 11150404 4c982c5e fc0c0234 5db4d8d1
+    ed8011c5 7d1ea28f 8b09d87b 5549b64a dad20838 ab9059ff 4b922289 c153919a
+    996a0d6d 73d4e019 c28c5f06 e47250f9 be19b070 a86af4bc ea566ba3 7dd74988
+    ebeeaa9f ac86d25a 7cfe42dc 1af4f86e 04b13584 154e1004 08c17a26 dbb625eb
+    12fe6d7a 26f3ba28 6129ba10 9c9f80e2 bb8a725c f35f05d5 c8b24419 bb5af2a7
+    ad4b97bc bc540bbc 502bc1b7 dfe3a8f3 d407c8e4 11d05adc 3a3930a6 eed4257f
+    c9e653dd e04921ec 10315005 6a95bf9a bb053bef 58f8b187 0789cb1f c950a07f
+    b3b40a11 63e5b70c 67491988 430bae58 7dda50d1 867c39f7 16ced7b0 79c0fc1a
+    dc3143a0 5aa0c877 d93a797f 7b6a6f0a 093d5af2 b77b5a78 83314036 c0c43387
+    61625347 13e0904d 92fb82b7 c773cf48 82531e03 f92988cc dd956940 3683dc5e
+    cb033cc1 0b78fbbd 350efbbe 67e5e4dc 7ffc6924 ea80d109 4be2fa0e a4dcc389
+    6ec1f372 fc2ab7b2 c5d1c0ff 6ef924c8 d3491551 08b2b6e7 1bc2878b e456905e
+    4bc109cc dc7c25cc 329bc789 1d397bb1 f124996a e5c38715 2700d757 c838d1f7
+    bd656666
+h = 15f4a77c c79a3374
+
+k = f856328f 26f0cbe8 a3462833 9c4fef81
+m = de05c9cb a50dcd24 5a894dcb 6fba555c 7ed579d1 dac3660f acd8cf7c ce93b041
+    41c49e79 7b3e2cef 78f77eae 2363a68e e3eebc27 efb29d61 7422a616 27625854
+    d5643b5b 06dbfae7 f49c5073 cd3b45a4 3cb4c361 d59df4a6 927d3f77 55e2007f
+    57214118 3cee3449 fc0786bb dec7eb60 2c068118 6c1bc58d a720e3f3 30420005
+    5da521bc ed4c0976 7214943e 6274b89b f06829a2 4b410dc9 b25cacae a63cca5b
+    f512261c 01bb2799 1469ced3 440c4d65 d789854a bec221d3 6a013dd6 7cb9d01f
+    7da589ad 19712b3f bc194dfd a8b1e931 eedf1470 c51ccabe 458c45c4 3ffb0345
+    ded2e848 a650e342 b9bf36b1 dfb07bd9 2cd85896 494fed01 6bc798fa 0d6d9bc4
+    14878d58 cabb4c7f d7cf749a 09edd80a f1394062 ecbfa0a0 a0e97e96 a471b852
+    3ca41656 779eaf18 d73af39a b9cdcf90 648884ae 5d9d8a63 7cc17fee 988841a5
+    af0d0f2f 4158a650 8fd21663 906eb50d 90e4b1af 0bb841ba f2fe4652 865d2519
+    4e1da4ee 3c2bb941 2fff7827 48d6bf85 69adf930 a22b967c 63e0328e 33c3207a
+    a73443df 93ae465e 14926c74 31157f99 1dd21e98 2f285301 cee0a868 ebb4b2cb
+    be6c9f84 20491c77 1b7bac0b 6d4d2e30 800d8116 b87f2dd1 9d853d02 583732f9
+    2632b7af 1c
+h = 74bc56c8 c38f5dc0
+
+k = d2c95391 c75111b6 0d3b2583 4c66386e
+m = 1189335f ea6233eb 403b8224 bf36b4fa 6766226c c6f9650a ce73968e 2a983dc5
+    8ea41b98 3fd4bffb 4d397918 39be9b22 718fe7a4 8c6c091e f019362b 350b132f
+    c90ade7b 8b8e0f79 dfd86efc 89f08a8b 7160ba6e 39288cd6 b2ef872c dac5c0d0
+    13cf1b50 4fb3ea9c 97d8f5f9 198e6ba1 cf571272 e4204244 c76fc59d 03a5b58d
+    e99e34d8 416ac876 c5555a00 b8b3eff1 ff781c86 877faa88 3cd1c68a d5e3b083
+    a2d5bb98 c72afa96 7c812943 c5cc9f4d 24d8470c c230f72c a38259ec 056caeb9
+    a749715f ae4fe3b0 43482c4d 7c0070fc fd77a7fa 9214b673 0a7ec508 46b36947
+    523aaffb eada6fea 8a64af31 9be87474 df6c4913 aba523ea d3fcbacc 43c52482
+    b9f02303 40709dfc d252b069 4a90dbfa f3b20f00 98ad529c d232fab9 621beb36
+    ae514797 97f9b85f 25a67b25 57794c9e f3012a11 e3534e22 31876acf b19c2237
+    c9928476 a082d1f0 ea60d954 b7978af8 9323ed22 d5d68abd 1a0d5027 ef01d174
+    7710c0d4 5be0d1ee 6f24c84e 0f972e76 a01d8b6a 80a442bd 583b60d1 96e398f0
+    44ac86a7 690a78a4 f8cf3d7d c67e4215 3c452be5 f0a000a8 e774df6b f2dc6213
+    f43603ab d349419a bb87d52e c105f85e e6d9a263 a3702dcb c1167b1f d94d81b9
+    cf247bc6 baef
+h = 940246c1 8b58215d
+
+k = 385218c6 84f2756d 75f2427f d25c3d45
+m = 5bd9c82e 93627451 0e51d5af e78f330c a048cb86 9109be42 15e18589 2fde90ea
+    ea5368f2 6a787a06 4047464f 4d67257a feaa47b8 6328964e 0cd22db7 ea3ab26f
+    49b9c8c2 bc744e42 dcd8c419 ee2c94ad d689256f 6e124861 c55f06da 63d6d963
+    00bfbac1 7864c195 6e2cc56d 32369db3 8a364599 074ac0a5 353e5b67 c8e21b2a
+    b3826827 418ee7ea 11d2ff5a bf85e381 a5a61407 35d3e3d6 d8ded580 a2ca1070
+    6c062f7e 62241dea 0581e6cc cff29eb9 ef217c6a 0f0576e2 66f0f64b 281005a7
+    a24c7adc d9fe34c7 7c49316e bd6d34ba 3f19f85a 0c6739cc 296c3a7b 61ae677d
+    93198e5b 3b4efcaa c077472e 7e1fd06f b4f2a87a 671ff285 fd7ec693 b49d0b44
+    415f979c 1a30a355 88f77e98 53788db9 16f0f7e8 8d39a339 9409642f 8569dee9
+    dc959bb0 cf1cd28b 33a99ab2 0235e34f aa68de08 d63052a2 c9915fd6 ae3f72c0
+    ce4526af f8b1abb8 0623bd49 09ddf870 87d6be2f fb4cd23c 8ceedb07 f7eec51c
+    723080b6 fd9ed4e1 dc428f5f 9a520e7a 9d44f96d 14e18b83 b1d9342c ee1f582c
+    e09d936f a080d029 a45f23f2 ddface8c 92d4fb2c 7a9fd5f3 ebffde48 3fcf056a
+    d5a8ba93 09124571 20fa10ef 382c4260 a2d1ae51 76b843f0 2f40d584 eec65864
+    a4212921 cac45b
+h = f883cf51 6d87009a
+
+k = 2db6cdbe c09784b3 ab5141b0 f0caabb0
+m = 062d5386 e50b453d 320476fa cee551ac 010d126b 24d3e5aa 4b0c8f6b 318f0643
+    f086ee54 9e86ad04 0d77a8be b019b87d abcec574 753d2c15 d0a1a3f6 ee7af5e1
+    3490c220 44812b2d a5601268 d9cbe1c5 ffc113c2 1c1334aa 9466fc76 f268c06c
+    d81da1fe ad60447d ba0a5dbf 442fe274 817e39f3 c27eca7c 1c3fbd8b 67004e2f
+    88b64ee7 09b43636 37c5226f b7bfa726 dceb8fd1 ce7dd3ba 5fa9678f fcb68b20
+    b3c28dfd 099835d3 98c1a9c8 6e69b27f f0d3c5ae eff5135f 1d45a409 c295e64f
+    2a92fa19 4df2bee3 cdee4a8b b3749bfc e45afd7e 28c4da80 e80fb25d c76deb44
+    8f4e8940 e2d15687 d3d88e8b 4cff15a6 7963ffd8 30ed9f5d ff70e217 1654851d
+    d4593eac 1ab3b471 8c12af15 b15c6d64 a177b3d0 7debf74d cb54d404 d5c67cda
+    657249c4 7e8cdaf0 76266d06 4bd5c947 cf9b8d22 fda3e75e 421dfef8 243eee32
+    4e54a445 09a3a07a b9b8d506 babf1ca3 613778e5 623fab58 8254875c b83778d6
+    63f32e88 9666ee7f c926f024 fe98036f 3c0c1707 5bbfff76 3c5f95ba c7212454
+    4b06a800 9b2f706b 06573f91 afcbf098 1d0ab474 8aa46f46 785cc1c6 6628057a
+    74963b3f d8abef47 ece22606 3c5f844a 83e973c1 653b0bdf 73b1a77c fac11bf9
+    7cac72fe eb78056b
+h = 00cfceab af2b33b0
+
+k = aa026479 73a13b9b b01f223a 8af35d66
+m = cb2e2d63 808c77e1 9b416ba5 c812aaa0 4289f55c f2591f62 a91b80c7 6d29216e
+    2890bba3 11c6b6d8 bd851d28 e859c49e fb23ff77 74b6059a 25713e3f 66de4db9
+    591c45c7 72a65fd7 5a15a5c7 7396ea7b aaa31ef5 edbb8bd0 0e8f6359 20c5f3d4
+    559dcd87 5b9db97e e64a00c6 b5d9f9e6 39cd6520 28b2ebf5 401405e8 7d5a9938
+    5b84a890 fc557e93 4b3ad991 10934c91 e84944ee bffecda4 fa8be8c4 4a17e079
+    0f5761f0 c8c761b2 b6ef2a5f bd0a0cec ef156f44 c2ed0706 e80e57de 545ba933
+    862b62db ddedaf23 ab307345 c961c681 52037e24 722bdb0f 594e6588 924d4f48
+    12915693 550b275a aaedbd6b 9d0bd216 0d74d951 72b4fe98 c07f8831 3b21d2d2
+    75d58817 9471dead a66f3e8c 52c57272 1b8f080c 2d768b58 603ed613 76999647
+    46b34b00 dab54efd dd8b347f 5281420b 1b246b34 9f120803 0c01e167 bdaaa7dd
+    e12e60be 306c69e7 dc24e623 0394b6f7 6fa53903 e335f3aa c24b58ab 703ff600
+    5b27c7ec bfc2fd08 042729e0 063e8a0a 6eb238b5 f3851d09 369c7d0c e507e258
+    2d198d0e d89e4238 537f06d6 5ee98b4e e5a229b4 c9f03df5 a68df0e5 d6f73941
+    f2ef5a05 38ae6cbb c2a2ff03 548cf271 a13f6300 8d0c5847 80c67600 cdea1542
+    a7e5061a cee5c04c 9c
+h = 732d411e 42e6e60c
+
+k = 38781888 0a0fdfef ef14a2ba 5ca543a6
+m = dc4ee7cf 2e550dd8 c5ec72ae 7c09697f e7ec28a1 dac53f65 391329e4 12686e2f
+    7665113c 35b320b5 e16f4c63 64f5659e c59540d1 36a6f190 30ef19cd a70ae9a6
+    3b8b1bc1 260acecb 7d4b77f7 85c58c27 fb17be15 9011a158 bc1ffbc8 06d77d43
+    7b567488 b7a5019d 67f22389 951ebbec 7aaa8f65 e37e746c faa67d16 9ad97962
+    c77a012d bffd5c82 5176efcf 0ec355f1 54774f9b 977ee9e5 ec72fc5c 2089be16
+    50d26e5d fb16894a f34ce74f 12be7f9e d9de2425 1685ee22 1e160886 626be020
+    6ef22c4f 96d287aa cc03cb94 7323498f fe352daf 889969a5 82913d37 25956541
+    914fdbf7 e8af7a2b 3402aaca 032cf883 ac0a34a0 fa22be21 b55f778a 67da59db
+    243acc3b b1985fa1 55008b08 24a91f45 533447e3 05470ffe 185ff5fe 330e3f39
+    4a9e372d 07f37f61 f681b5e5 68f7dbc9 2dd130e3 3e0b61ff 13e9f67d 7bcaf371
+    49040ede 61097ea6 9c10420f 192f049b 9748cafe bb18ccb0 c68305d2 9b817947
+    db252e97 852380b4 e9bd5ce4 211cafdc a6f36a32 093aaf45 5985f21b 575bf938
+    1c9027b4 12f09baa 4615ab06 48b8128b 6577f15a e15a4bd2 17f46144 3116ac64
+    8efa2897 1a184c3b 2666d8ee e2310ad0 9c34aabb e13eb499 c753d066 bad66cbb
+    8e9ac070 63512d2f 5744
+h = 05238d6a b721e34c
+
+k = 3faf4d76 e5deb772 8f3c7f1f 0be01526
+m = c42d01c1 3e942877 258ffe95 e1e6f952 c4a02ac6 264da6eb e737e9ed 29fe3c12
+    919807ab d900a087 4881b0db 112b2bc3 ea54834c 925194e2 2e3e99ad da9f0f7d
+    2653a9ae aa6128b9 f7fc96bb 8849d0b9 950686d0 c23eb0d7 ce03084a f5e06475
+    de6ca1a7 c6f08c61 ace0da9e 005d59f5 26e22deb d6a4dea3 09c5a7e6 9718650a
+    cb0a41bd 2333ba84 86bf126e 7a068981 77f57ee7 3fb99df6 fc46d2f9 b63a9f43
+    eff9ec95 aec6299b 1036c9f5 2b9077e6 5cb21c04 6384b684 92d92dae bc804774
+    9f1472d9 44df243a 1e5f4136 bf17599d 12754dd5 827069fb da1678ea 67d4d3bc
+    fac29574 94fac06f 8472b945 7ffc3e65 14df6acd e99c9580 464ebb3d eac7ed27
+    62854777 0ba40e2c 84c92726 62a150fc d93595ce a2982487 1fc2aa9c 5a4706cd
+    07503785 ea792580 8e59ef17 8d91a89a 3dbd27aa 64f3bf95 c4616765 7b52097c
+    2b9f9865 c8ef6b52 a69ba001 16b10665 7ba2f004 67ec78de 6b5d5de0 a753024a
+    2ac5241a 88a568f6 a8dceca8 00d03580 d1351c7c 7bf7c423 550f0fe8 d05c6081
+    127da874 d29fff92 96944f75 325b9411 7bf1b5ec cdcf8649 03afae3c dd2ce3a0
+    a392d8d1 14f6a1c1 78303226 47477a2e 1cfdfd88 4649fd3a 115d1281 dfefd90a
+    b9266439 44c5834e f0c027
+h = f145892a f1205afb
+
+k = db35c2e6 6ebf48b3 e63a4792 4a2d40fb
+m = 554b82d2 c224cf71 55051c8f 797216ed 2110d692 56abc7bc ffdfb675 9d47ae27
+    dcc5f3df 894de212 e2062542 f94f803f a178d531 f83183ef e7c843a3 b6cc888b
+    a1676026 452880d7 f1236b93 c45b3f37 c4b46bc8 b96567a6 c98265ee 010b2b83
+    0154ccb5 63b8c1b3 83daf12c 74f42811 12c551a1 8667b0c6 42c67e18 a2884c90
+    afef8613 2a3b68e4 c95b8fbc a9b7955f a5b7b78d 81272b2b 630c1de7 09234d31
+    761d850e 811473cc 1f349b5d 1e06ba60 bf194d1c 038d3c99 6dca5404 09a40b6c
+    61b39279 15983733 bcb3e89d 54965e6b 9fcf8176 2e3df294 8c28820c 78001752
+    e6f5dc40 e7b3ac75 45e3b185 e762b9f5 29349f36 7a11b947 2a2fc3c3 babf9a9e
+    227c9150 06317868 a1fa47ef df06fb55 9394a720 3b324587 d9383017 8840287d
+    b33e597f 0675a4ed d7ce36ed 1cf73d66 4ac7c103 4d75059f e8cdd72b a1732015
+    8fe66cdd 2500b844 1846f5ed 6d93a269 434fb183 bff47974 d5e4f9a2 0bea7da6
+    1c6d3008 842e05c4 ca9fecd1 9252368a 4934174c 5e37064b 73e39421 46889867
+    41a861a0 45819980 7c7213b0 0b31e13c 94fb4cb2 6f3c1fbe 5b71fee9 f1b661a2
+    6a9740ed 8a0ac949 becbfbb0 c4df62e7 2467605c 380c8e6b 3fa2981b 6ecc2a1a
+    68769f32 4ee1cdca 21abdff5
+h = 78bb26fa 571ddfd0
+
+k = 4c44ce40 939c2dd0 899b8367 ecd69125
+m = 3a1dac95 35b4718b c460263e 23f1cf4e f17b9e7e eec672ee b1f32c6c ec96ee66
+    3f8f4cf4 cb124edf 026ceee3 480b9483 1af13a6e bf4d4f31 07f8438d b0ebeb06
+    30a06ef9 901f0913 ea081632 7fa0c874 0477ed8d 1679062d 8f171288 529d89ba
+    36d73567 765cbafd 89b19367 73919b14 1fb3dad3 c64c78b2 c552076b 82c35b40
+    7ff8b61a 274a51f5 8853abf3 8c01cffb aa842f2a 0325e4ab 61522e4a 1ebeabfa
+    1f1c89b6 82d1762c 233a99c5 98d654d0 80f2eadc 8b210d0d ff47ab89 59d115c4
+    ed752307 428ff2a9 51e1728b bc7bb101 59e17d0d 26977b25 3750fc4b 73451ef2
+    e1c2d5ef 47148cc3 a335049c 35edda23 f57a4809 d5da74e1 fcf1bf31 0798333d
+    9cc39ed9 5fb8a900 b2acb147 01c44bd9 04aae5ba b8bc2769 34dea24f 8030122a
+    6f23ce25 d454159e eebcf02a 9575e187 9b57cc18 bf1015ec 6c213a9d 9e2840db
+    3b264e07 e3cdbb2b 6d670a05 1c8dae6a 2a95530b 8d60308b b98f14a1 b17143ea
+    f945cfd2 26f85190 0036380b 963ef2f8 422c68da bd82c8d5 967987d9 832c9f54
+    53e177d5 59171bdb 9c227b53 ada6cd8b dd5163b4 de28595c a26e2247 157163bc
+    ad955ba0 5f1747ba e4359b8a 20b8fac4 398aaedd b6cdcfb0 63183007 3971b81e
+    199b3e48 eeaa58a7 b059969c ca
+h = 8ee56669 7e7c2ddb
+
+k = 4bd2a3e4 bb28955b d9227e7f c773e740
+m = 8f5b52e2 1db2c3bb 00a6b980 6be6ed26 2d6918c1 d7ee48f1 c14bf52e d81201de
+    4b606c50 0145f20a 55df5171 61e59177 5f2fbb39 8bbc7f92 83f309cd 29aba7d4
+    b87f5a23 f3b4529b 8f3cc0ae 014880ae 582a39ae dfb14e1b 571c65d7 7ccce5f0
+    612f0412 af59f963 bf439003 3fd7f5c5 de1722e6 9acc52d4 407632f9 a5eb2355
+    3928f305 41f5f489 851735b9 f7733330 550a1b04 193d5df1 e877c008 80b8f7e1
+    d37956a1 83baa83e 00350c78 a3e8566d 2fd57dbe 115609b5 c6ca62c7 d19ab4e8
+    9763dce5 936b423a d6ea134d cedb87d5 17a14c6d daacb871 611c20c7 6d7181c2
+    e449f30c 84c4194c 50c59fa9 0a62c6ac 0f72ca1a 70b9f3ea 0c47506c 2a4bd1b2
+    49c93006 49ed3440 c7641429 66b66652 7aae6249 b740f07a 71986162 13d03311
+    70c40a62 18f9e091 0eddbba9 253640cb 7739ecbb 6c9131da 442ff9e9 40b9a3d7
+    8de75e61 a323ea85 aa11605b 5a65674a 82f46db7 c3baaa0e 58af7400 03c0d9cf
+    912f2959 05660ef1 1b998eac 9f798abb 9830fd4d 0c92183c 4acf82b4 ceea3120
+    1e41444a 77fd49d9 9f50cfee d70b0368 0a784d61 6e9f626c 882e0259 a95c1bfb
+    c291368f b5882a93 da43f0a4 12dc99b5 bcc156f2 003e61c4 81f518ca 33827b2b
+    9d3ab282 769ace83 dce673c6 1df3
+h = a4495242 dc3ba67a
+
+k = 768a54fb 0cce8f74 bf3eeab7 bf2d5b80
+m = 197f862d 3dadd244 56ab48ba 74065437 4b04e3d3 70965bb9 0c65659f 1cd04dfb
+    d1baec64 400096f2 127da82f d27e4c1d cf5a6ea4 eeee7049 3c865b2d 7dbf97bb
+    678f7214 551fce86 e14ce2a5 6708600c f15ad4c9 1debb601 deb0a4c4 0fabfb92
+    e037100d 56a88fe6 74d8a9a4 7c07af82 0636cac5 a02733f5 56901642 7cd995db
+    07127d7b a2775c71 ed3962f5 58d8587d ddf61e14 e3aac06f d0a20ab1 596a2434
+    eb956c72 074008a3 a4aaa227 f7891f43 d38ef284 f5a27613 3ab20968 93ecb799
+    d407277e 2a53689c aacf8c75 29c43ece 9a3efb5c 2624eb79 c394e4c7 86549c3c
+    1dc298d4 f107052a 7f8080bc c22bf2dd 3106a534 db98f4de 56bcba8e c8bdc0f8
+    4ffaa01c 07136b21 04abd757 0cfbaa2e 44e601cc 7c7da40e 33228ac6 27685381
+    f079c28c 4266bfeb 992a8e24 11a65627 59ae4509 635a835e c1c66e1a 980dc3bf
+    d813bb02 bbf1c0cd 7b401f1d 2629b4ea 14e05399 e9bd68f1 224bf179 119b7e09
+    06293765 a0b1e107 bb2ab008 854dd014 d7619dd7 bd1bf1e0 6d4b7229 c2709bd1
+    fae4242b 8ec83949 a3c5d09e a375a759 c722f152 42eaa1e3 fa849319 947aafe3
+    8a16acd9 dde8eac6 06dff640 9ce7070e 536931bb e172c7a6 444a56d2 8c4ddc7d
+    998058ae 014b58e3 1b828ecf da77c6
+h = 386163d1 098f21a1
+
+k = db98719c 58322da0 3f04516b a442d7db
+m = 0e8cc777 dd19fcd5 5c9b2f47 17484eee 60928d23 99a7f8bf 7277a452 58f61885
+    045b6ceb 781e496b cf5bef57 4f83bfd2 977eacf4 1b9a461c cd7ea134 7bd7d93b
+    758a49c5 fc6136bd 6761272c 504c3cd8 21e6b03d ec771413 8e898144 bdb28ada
+    4876b589 7be793bf 36620515 a7cebc45 b03a68b3 0e3c9387 644d24df 54c3dfff
+    22698c6f 9aa64330 7cb7b3ae 028d96b6 386a3c5b 9e0460c2 4908895a ee5321b5
+    e6a21a91 ae6778e3 ce7591a5 89cf55d9 82d6a884 8d2460ae 0987bdeb ee48d2dd
+    96b603ba 6d8dae60 4310deb1 9998e94e 7f5d361a 33fb4212 07f73b54 23321260
+    7fb4dc05 7d9d4ddb 6a5f1f28 1de85935 d3d6988e 4547415d 7f2ff598 8cd4d4c7
+    b6f2ad09 82a99727 e19ed96c aa65d9c9 ade8db46 22cd21c5 798d907d 312f60cc
+    4d4c8911 0b87b1c7 c35e4615 3812cd6c 4da38b8a dd6358b4 7294dc15 33acf7eb
+    a2085792 8232b44c 95c0243e e54a9eb0 d11139de 30c3659c fb6bddf8 e4d59c91
+    8ed83e92 f12c697c 737c54c4 613b3c55 594ad420 e8dabbc2 d299a26e 817a111b
+    b87b8966 2196f532 0b79a033 f9fac0d9 d1b039f3 8a207752 6f58ad6c e194bdca
+    6db610c1 22572fc7 fafd8134 4e87afb6 68b5ec8a 8e698b6c 59aa0ea8 e40c0c61
+    02d0140a 263f0b3e efe93c41 dbbbff0e
+h = 3b65978d 517afed5
+
+k = cb07dc93 15547dcf 9abb3dcb f3287264
+m = f7d18f04 9e083f0a b3045744 12ec97d4 5d165460 a76abf83 1dabb69b 28bdc2f4
+    b7feee20 ef9d3e6c a4eef142 0a978180 46c74f2c 3fd976e5 c8c3f95d 942fb421
+    7a9f26c6 de63ef6e 4eb2cfca 64cb1ae9 526ae1f4 a62c2160 d16a89ff a09fcb7a
+    57f1b80d 0b479c02 037feaf7 f8d442c7 70ef8824 7af76016 07b95e17 30561312
+    eb240409 0dfbed4d 32ac0ede 8b61921f 93d09538 2367384a 5b029a11 e5f2e452
+    117db0b9 f55f56a4 e21b177f 49dc0835 9244a485 68ca5f62 245653f5 3f740ee7
+    d7b099b1 958f7909 c79c54dd 54023461 ac46224d 1e1c4664 b094b444 ecaba345
+    079568e3 c9aace5e 0df4fd00 8c5c835b 4a473d5f c6be22fe 96b13efe e7b2f68e
+    dc4cbf3f 999a7e48 63c58b1d 82520b7b 124ba2e5 dd110b6a 05e4cc2b 0d478518
+    8cb5c8a2 186808cc a6a098de 34d0deb7 bcc2c28d 7c60148c 424cb9fe 8d5a8c02
+    ed471408 f1f837fc b57895b0 2c4b6822 8fc84335 1e9e419d 88d75800 221a90f4
+    b2e1db39 766f2d7f 5e5b9cff 2a71fa0d 1a2aaa48 28054fca c0d85155 cd38cb9f
+    d4201777 919293b3 6670addb 25eb8dab f7424d46 388af342 5488852a b8eb3687
+    5a1fff92 3214844c 3350470d 9f2da131 c47b8935 7dea8605 124d8511 ee87a3fc
+    d789490b 583465e5 eebdc8ec a4873bba 38
+h = f3069f57 bd45eaa5
+
+k = ac3094f7 a001807d 549e9716 40350e66
+m = fbe5d7ac 0f8dc330 eb183485 f3c75781 7ea9780a 068a57ca b12cfd92 79144662
+    f1c6ade0 9cdc23ff 7f9b2bd0 1e38d253 f698ddbe 1bb42c31 016212ac 068236a1
+    ba2481d4 4aef4c0c 4b978585 1d67902b a19eaf36 d1ad904f 2296c175 a3071763
+    94eeaea3 d96fbfad 29c14c81 79ba4417 fc959f25 6d74ccc7 d4215d3a 19622fbc
+    95c1ab1b 43d7eb14 94b5237d f96b9f9a ee90fdc1 3df4b9f1 9ef07f62 8167edec
+    f60ccfc3 14ad7882 ebaa76c7 da10906c ff4e2eb8 94e2108f 1fc490ce 322b11e3
+    65d739bb 12323a4c 5baec411 dd17b6e4 7bd201bc 5a08be9f 9bda68d3 2c6c96b6
+    ca135cd5 bff6abea 3e85d170 25769eea 6eb9ad85 344c20d3 2b32d1c1 0384b334
+    25db4dcd e8c22f9b eb3e374c a9b6917a 0a1ee9e9 440db17a 9d36ced4 5114cae1
+    df27cc0e 8b6be7ca 105fd1c4 e906059c 0adb9071 6db6d792 14706669 ce6986d1
+    530c008b e2a54507 e83e08c6 d1a30338 2521e49c 6078dc0d 696c30d4 a4408bf4
+    3b8e39f4 f4c19033 ebe47949 fcbff37e 4c5b76e0 64a6f5c9 5061651f 176d71b1
+    92659ea4 3aa56a49 b2cdefb3 972edc3c d13e3e30 2bcb883a c5a57594 865d488f
+    b47611c1 6cba9190 ae5eb633 15e47037 dada3a60 dc0930b6 be758998 f577e110
+    e0628d59 e5f3a38f d3f1ed1b 09fd5802 b5d8
+h = bf143505 346d5184
+
+k = 8c176233 58052e49 d5ecb4ba 8fec20ff
+m = ef1d48e2 73cc1e12 ce7a761e 80606052 bdc40227 70e0a996 10e6fd28 aff3cbe5
+    44a73a1a f6e8c00e 503573a3 806f2305 7ffd2270 37844c0c db944db9 5fa6df76
+    96e57905 141968ce 875c26dd b7c9d21f d64e225b fa5f5cd9 6005885b 7e1e5d37
+    0a9fc710 125d9b6d 65b62d40 21892607 9c09e0ef 160ba5c6 80cdf2c9 4e23bc38
+    d404fe0a 3c9f851f cce2a965 97e12191 56b24ece b0881e10 24468126 52dd27a4
+    8e94d1e0 a5b736ba 0da853aa 30f9980c daa12cc2 9f3a1728 da9ba782 85649636
+    d502f323 83250216 124dca2a 9c8f63b9 02ac1a2c a8eb5c4c ff4e3998 4aaedb95
+    977e1f7b 0e2d58cb fdb9e87b 789fdcf7 11be0550 56c53df9 0ddff02f 6569c388
+    6759167d 8c9ba4a8 4e479af3 243e3251 b9b75417 993d6826 3eec3964 9f5b813b
+    28232a9b b01d2b22 598eda64 825e91c5 c63caad5 2541c0f9 ff73d59e 6e49e969
+    6acbca60 24fca50b bfc18f6a 8b2ff66c d5180d9d 946eba94 a64b1f7f 9be2302f
+    88f620c7 486bc677 be1b9876 be57fbd0 2cd31b17 fc60488a ec24e790 e6acad4b
+    bbdf334b b777a206 ff29d45d a5fa75d5 22ff58e7 ed541b49 08195b26 7778ca1b
+    bd166dc6 0e9c24c3 64045a13 c7a6b7b3 63a83ef4 34f6a667 97a23dce 983e4847
+    01d96a82 e8b899f8 ccafb520 db678e00 21c1db
+h = 6503c1cb dc8a2800
+
+k = fab6fbf8 44a7a3bf f6c44cdc 743cd105
+m = 5661381f 3ab24ec4 7c0d0d67 a2fea85c 38b986e4 f20aa0e6 fe9ed207 eddd00b8
+    e6a017bc ff3be69e ba119835 2fc0a660 ee8b158a 8c78b233 92e502cf 01add2e9
+    4aa86566 a495b7c9 78971a68 9c9ade0d d7a55d6d 297884d1 d41e242f 39c0d9fb
+    db2c1dc3 8a11d536 f5cf88eb 7c7c4fb4 a7dfbc38 00d8940d 23d41d12 2014b34a
+    df6d2268 e6188229 04f788b1 9db0ed34 0ce65bbe 405a1bec 1f1948a7 745f7d6b
+    bb13188d 74db23ea 1692943b e675b9a8 6c10b76d c621a5e6 5e876649 c9463272
+    92525981 abc6d935 9584a23d 27a39fbb d45dafd8 f0a8b6b0 cb564559 53d36979
+    b2dca247 4d9f4f57 d9b04d03 613fa6d8 6339626a 46429038 331fd4eb 43dee0ac
+    87f9f811 9577174c 62dc988d 19f05993 c45dbdad 69585e77 829fde52 833b2a69
+    00259476 6be0689a 4fce5e4d e9ddad75 8130534d 8387adb9 85fc52b0 31f43c01
+    3c3eaf60 63a6d708 17adaf17 6773047f 0bdf0b95 9b90508c 33bd69ee dd25700a
+    e548bb7c 8de449ef 4b8a2f95 f8b1e9f2 3e6bd046 933e4fd7 ad50828d 3fb43926
+    837b62dd 4ba791cd 68800a4f c1070fbf 4a6a0701 0d8ea8f3 8f5229b1 af574d6f
+    e7bff14d a78c2d65 c0843bdc 0a2d48d3 88a87d2d da1667ec 247c45fe 3a8fc776
+    3fe7a049 de507a25 8172a7a5 948ae807 993a6979
+h = 890789b4 11588cf2
+
+k = 2a6df7d5 54d7d196 cf677f8c f8d6674c
+m = 2cf54fa1 58c851d8 883b64cb 44006422 1672ef5a f6b89b7f daa2a1d4 3a42cd1f
+    149f54e7 99ad949e 285c8a35 46337c1b 78532571 22ae6847 2ab20a41 4e82066c
+    b3715704 58c1c44d 545e555f bb1c610b b24c614d 8826ff7d 75cea571 0b67b0ce
+    f75b1f02 4f99fe6b 8a5fe779 189e701d 0ac55c7e 9469a410 f1c074b8 d06298d7
+    93ea9b34 37b0ac2b 237e72a8 a0b1f2f2 e72e03f5 9b27157b 8f592e29 b820c305
+    37db7f62 d324c4f1 8c04b31e 4e4ea35d ae049a72 0459634c 310570f0 d295fcf3
+    2ebd8130 8c453932 c9012d0e 6651bd1b 6236e87e 2ccf3527 6f2495df 74d5e60f
+    baf2c498 567a90fb abd3adf9 71685e31 3c951b49 f64024a1 c2501f09 da2a3936
+    6de49134 dedbf7e9 262f1764 7cc91bbc 4493c298 82efac14 2a7af35e 0af6b759
+    fd946583 24375569 0536b470 ad3a47d7 69da31bc 9726bda6 da1b9345 6a4322a8
+    d25f9b97 be791c3e 7323b4d5 ccc96f1f 57f0abc5 7a11a79c 3c08195e 2ba068a4
+    f908f866 2af04cc0 19e62f6d 0e981982 d8474334 424c4206 259b596f 8d393076
+    113c8888 325ad301 b9ce46ae 438a6ea2 4524852c bf7d95c2 8c0f2ad5 96b65572
+    c6ee45da 82bf0e57 104ba572 2057c647 69865982 48bfcba0 04bcb690 35324135
+    c50f4b5f 624a4fe4 23088c54 a30e3412 8a060e21 11
+h = 9a024b08 886f6864
+
+k = 118c4d7f 169d4184 76a57906 0214d5de
+m = e7c60e8d 5e87f04a 9b166b98 e2c6edc1 87eff4cf 7bc7d039 20c1e536 a97916db
+    a968184a 1e7e4d03 f661a1de 9aac711c 103f7c72 67872818 0f56c95c 3171b743
+    834fab43 eb65ba35 89346761 3ffddc82 089a9611 1eb3e003 5bb7378f b6d3fe44
+    a827bb02 da252507 cc337a80 9827b340 f7f3dac8 18cdd2c8 060d0c2e fd3b67a7
+    0499fb18 7ee9c66b afa7d8bd 0414a4e1 45287fd8 db22a64f 809b76b3 121a9389
+    4f3ce616 cb9a6e49 900d032a e91684f3 1b68efb3 ab734238 ddaad887 72258c03
+    25e55d34 9dc1f6bd f0dbe0c1 46fe6dbc 9290163e d867d738 73757b28 60c8b601
+    563be0cf d119e8b4 6394a8a5 19937c86 3871c02a bc660963 b5086506 448553d9
+    ee0051e2 1a37a7f4 4b531446 ed2b4d83 1c95a130 0bd60f1a da3d02d3 e03beacb
+    326e41e9 f8849ef8 ecf2ea20 47468e2d cba2f886 cac3448d b479a6a1 5446ff9f
+    04df2bda 0c992e33 89747f17 45f5dc5c ecbd7896 cea9db5f 32cd6e99 9bfa5415
+    c9504285 c23325b0 6562b04f 532a150f 334f0ea5 455ba410 c54277e8 bed7ef87
+    534736fd d73789cd 29e32769 7909c82a 06b01cee 525af6ba 9e671646 c9e46d24
+    7dafb2fb bd1e34bb 1917dfd3 a7d260dd 434d3ecf 2fba59ce 219cdcdf a6180720
+    4a891132 d1f849cd 333e73a3 930c7f53 d16f1733 3577
+h = 6fbbdbfb 1aee6c2e
+
+k = d9c93c4a 464ba5d0 a6060931 5241b32c
+m = 2c6af65b 16eb1efb 6934525e 89921ab1 2f478f92 1b1c2c69 78a6fe1c bc86adec
+    1f832eea da3e47ee 21f7a99f 85712155 85d986bb 7a09207e 598c4b00 0402a16f
+    636ae6e9 4036345c c959175c e7730bb0 d9db494c b639bcc3 04c6327f 8b983496
+    7f1b3a38 b6fc8079 da593e2a 84f0fb39 b01d6eb0 aef2ba45 044ae46f 8c4e6035
+    e8052815 7faedc9c 15f7d2cc 20c57139 9449060f db2fc19a 4b5d2dbf 2620bab0
+    d08728a1 f0c62aa6 13cb7d74 1224ab00 370b8d77 3455e748 43b05a10 55bf51ab
+    ece870cf 6293edd4 36043e3c 179e8f0f 279f77a7 5fc08a52 91f097c6 72231040
+    9e36a9a8 856686f4 df4ce703 9e81d6d4 3d983d33 d146e80b a749765d 61169cce
+    dfd09e9e 1f6c3e13 05f4529b 5f7c2809 53015759 a84a635d 967a46dc 1967d1dd
+    b0a7a2e9 b742a7c2 94452403 cafc0e23 58837f9a 31d9a701 eb82fbe1 dcaaa8ab
+    4aba821d 8466c014 fcbf4d9b 136d8022 db31d899 8d40b939 d3c0e1a9 dd0d8f88
+    5a32314f 033b3d20 5e11c88d 9a6e1d86 be947a14 8c022699 3d250f54 f6c1f988
+    a1223f7a 8a7f0ee0 c21c1eef e018a90a 12890d6d c79f3a94 d54e738e 352663a8
+    a7193467 322f8190 da2e05f5 844b00e6 cad071b1 4960a62c 4f146646 87afbaa0
+    aa119186 7716670c b1153b4d 3f394275 aa7af44b 4571cd
+h = c9885ea5 bda0013f
+
+k = 7b33b6f1 81503b19 233750c2 1df58a74
+m = 5fb77ec7 3a5b31fd 2d4abb2f 9eaa4818 51ce9fe0 4be9866f c2d315c3 85884f99
+    0d11bfb1 8fa19bf6 2572a4be 1d7d176c dfb6f126 1cbdf060 fa490081 bf9dcb3e
+    db61ff94 b9e0e1d4 3cc61728 b447107a f23615f6 0ec3fa10 4f736525 06cb2698
+    9ee12617 c8b0cef3 fc9df33c 2c712b0a f14f9b59 a8170f26 e6fae386 9b9ed3b0
+    2567b66e d37ecce9 8f4c45cd 1ff350f2 6cd098be 1e904679 c5e3ebc5 d3dc667b
+    cf6c5589 35ec541b 06916b02 6ac42d31 2dbf04ec 323605aa df7025d3 00746cd8
+    c8f5c1c3 020e6d77 4ac9a10d 7f617e6f f18961a7 23f7f295 5647c205 d0594083
+    d8e3ef66 f4affca6 4b11d79c b418ad4d 2411c53d da820236 45b24f0a dede5d10
+    b000209a a036ed66 0919fc2c 682b13af 57f3fdb8 e7560773 e72b4f3b fe4b065d
+    5a343d78 70badaf5 6217a4c5 4591730c 0db08840 7b12cf81 be9b5989 fecad1d3
+    bc353f3e f382e625 dff82d10 9f661264 ff827296 39eb96da 0af3b16a 3dc91af9
+    c849313d e911da63 6c86be9c 13891a06 8023df67 77dcf509 8e9290ef bc689959
+    ffe3c3f6 9485b12e cfcdfbb8 c1145b5c 52696874 817143a1 49b5b983 d1900649
+    2294eb3b ad9cbe27 226b1cef 493c1a4c fa4bf815 41f70a01 e11feb96 f27cfe1f
+    b461060f 6ec74e3e 82fd7beb 8b3423b4 af43ed01 446b5a78
+h = b1af8b3b b0e383fd
+
+k = c5a1fa64 7a0254f9 a29eda62 0c542378
+m = 6dc58f2f 9ebc9c93 caf18779 fd2dae33 c4cc9590 388f8093 e2eeb6af f3036b20
+    8d6eebcf 03ec7b87 2292b6ff ba6ee83f 31a2b52d 2a181717 775aedba 8222ebb5
+    6b24b38a 1a241600 edb5e55a 3b42d22c ce617ef1 584613d6 decf3fa8 a85a1aa5
+    62dc0f3c 1ecd6eb0 17a22abd c60e0774 dbfc90ac 9efbd157 17473d2c 2352bae8
+    26e94f9e a627672a b33634fd 12459534 1195387b 3e9436bd 33ec94a3 a94e5478
+    36fe51cd fc1b8051 407be6ce 7b605f26 7dae2b9c 904a6368 ee2cc6c4 ff81d17b
+    0bc2d1aa df941138 15d8c7ca 32bf79cd 4e57287f f979e7a1 549d26a7 7bb4d17d
+    5315115e f8eb05e5 d667b489 10c36af8 89f69975 41e27ea7 05c66f56 691f188b
+    8fede783 f4610f45 e6a158ac a0ea5f77 57b0784d 29a42206 193ea78e 2326dc59
+    6b913449 5cf0cf9b 2bdd2e72 e72513a5 52e8dfd9 d7203457 e74f584d daa837d3
+    9d6a4c0b 62259cb2 a4756694 a4a6fb47 973da374 89077d74 7b48d3e1 2e052057
+    74782944 32226951 9a383ad1 e6d613b6 016f08a9 2608967b caa4f2b7 bab4d4da
+    ddc9e4a8 5753033e 0fcb9da8 47b2b39f 8ba44ce8 3c5ffd34 ea9c3897 eeb32629
+    48d47303 945f27ce ef134ccc 73b2830a de5d3184 c5759cd2 a0156933 1fefa212
+    086289e4 4f96b58f d59db1d8 6577a721 4a2c9c35 8f328b97 73
+h = 2420b988 e7eb4faa
+
+k = b13ff4af 1a27b890 95c3968f 93fd80f2
+m = 2ac972fd baa8576e 4df57a13 f7341685 a52beef0 90d84a74 dcb82a4f 0d04c971
+    734940a7 4e61b1fe 73a13bd4 b06d7bc4 78e6c2a9 d436cc1a 58f1a8c2 1d71322f
+    015603a1 d3acb4de 2f9e93d5 51f60209 c1f55dc9 846367f7 20b0829c eb10e314
+    3a54a554 c8ca253c a085eb85 afca2e39 df8a2195 8b339b15 2b74f4ed de3c2e4e
+    26c2c028 8ee58b38 2c3564cc 02519f13 eecbd2f1 4c128c8f ac5c39a7 b7dfa09e
+    9e0f9c2f f62d8a6d b5f6cce7 bb03c4b0 1e9eb8e0 380385a5 4083903f 528970d6
+    6cb3b407 2a290019 62a8f683 c96ccd5d 361931b6 6cc8e016 51e275f1 45b52bca
+    ad12af10 088ba777 7a5b1a3b 2d8a8e40 d23418df 7f1d83b3 4a6ab2ad 8288e026
+    d923d7ef 6b763189 ab7c9f20 d01284ae 8d776208 4c3483a4 e9c56a48 c4f8f900
+    0687bb7a 73b95abc 26b8b34e 87e3f957 a88adf3a cb566d23 5e622eca 4fd72344
+    5c702477 7e92b37d 11f57bda de280ea2 5c3b3c31 dc78200b 9293288c 68e8b0bb
+    7faa1120 d17acfae 87f1c4be e5db92ad 925ad14b 0170b2af c9fa0b83 48c60450
+    7cd0b1b1 d67afc66 8445665a 62e80048 dd95baa4 93d9afa3 e43dedd6 f5229128
+    7043bd95 224aa628 c24c82d6 5c69778c 5ca6640d b5463fdf 84e5c472 a4c96413
+    2f376da1 7a5acb68 bdc5d238 b5bde53a cd3abde0 f49d9ee9 1e77
+h = a8b7eb7a d1302e59
+
+k = 3ac05bd5 b14c63b5 3bd8ca86 c634d9a3
+m = 2794ff7b c3560b14 bccdced4 cc074878 90ebbef0 f673b00c 584e050e bb83f7d8
+    3ee350d8 48550466 3b70d4a9 a981e129 0c0ddea2 f761f5ca b0233aed 79bbf68e
+    911dd519 9fa16903 d53a3872 a2fb22e6 3e80990b c2e27813 b47049e7 ac6367dc
+    c8f0d570 cb0c942d 70701aa4 7453a9df 48956450 9126f286 fed2bd58 60703034
+    f1150cc3 31405480 6c85f79a cd8d88d7 e9902ff5 026b99f6 6753ae96 bc3c644b
+    d1169702 3fee1715 8a64c446 fbd39697 f0e10e1f 3bb8fd6c 051f86d5 8c28cdd5
+    0a79ad31 2a564b0c 2db760f4 ee8885b3 72ebf829 9ec9cfb3 fc319c2a c0d4cbaa
+    193a1800 5e396ea0 dca79e38 e580389a edc5df11 2f5125b9 26f81e93 7222f038
+    daf2156a 8bb01cf6 e7d60a74 41d0e8a7 aa5932f4 6b866902 fb8082cf 3edc8154
+    bc8e42f9 ca4331a3 2e241fe0 f11fdb72 e3711c61 7888a043 73b28c8d 8ce4b22b
+    7ad58599 d91befc4 7f4679a1 04d9996e 2004de07 b8ae4a65 485ad031 fe79e43e
+    d6319211 1d07c9ef d52d60e0 d2f1f151 9e5c6094 ccbb807f 674c4004 e0985e50
+    4900cde5 a2109f80 9597e4ac 369f911c a5451306 ad8c54b3 5325f481 a0da9ce3
+    05663c3b 8218e3a8 e5db8c6b 84262292 7bc60989 2d44a4bc 5f8334cc 0e5c50c0
+    5deeb171 0bad44b2 e25444cb 6c1c49b9 2099481a 2fcd220d 01dff3
+h = 841cbaa4 2dacf5a1
+
+k = a284cc0c ef78ce5e e796113c 76684d4d
+m = af802c94 c428f114 1caa0d3c 1470d957 c44a50d7 96f64460 74178ad9 1466adc1
+    16b92938 57c5877c 492e2efe 7f38334d 33c29544 057bbb0f bd13eee5 c066bc2d
+    667f7907 e0eb8917 4872b0fe dbb77626 4389dca7 3349e657 dde23e5d 99cdf1e4
+    c2cf1e2e 514f938a 955cbd7f 0d31f097 86d203af 074f5c94 b8ffbfba a10fd422
+    fc7f3384 af7c9b62 365dfea3 469ff50b 67612a4a 1ad24d22 9ca8c22e 24fe19cd
+    e3034bef 8dbe7ee0 9b5517af 9ceab0a3 70143088 9b56aa4a b8419c2b f471e53c
+    97cc65ca 3bc72332 55db908b ba4bf9ec 546a6a65 f985fdac a563d53c d988f21c
+    63a1bb9b f9f34a79 4eb14ed8 dea85849 1b05ec83 df912c9e 84a424de 1627ca60
+    80b06ed4 3d55c580 9ab49cde 40539944 1d6b9b6d e850beeb 1ce119bb a9af921c
+    19c3ffd6 c74aaaf8 c03db169 9fda7d82 8ecfec77 dd51bf68 29c10cbc 5987c622
+    4fb18446 3b882f6c 13336fab 09a0e049 af29ce71 e11d5f7e 33c78988 5164b73c
+    24d192ad 3ea087b8 afc8b0a4 0bc9002d ba4b121a ed31e96b bfebee1f e023252b
+    eaea923b 5e212aff 0d1dc398 a8dc2056 e62cd404 3efec57f 7e5d241e a3ff5f85
+    3bbd3051 ec8780a7 38254a20 fc4ea662 7b8d1109 8fcd41a1 5c324d52 ebe9bcfa
+    66dfbfd1 144f0e51 aaa11437 739dbfdb 94b822f0 18e0626a 9143b7ab
+h = 4641c43c c4f104e4
+
+k = de395f8f 88aed0cb b5901d3b e7683dde
+m = 871596a5 daeee641 ba06b0bc fe1bdc23 5c309ff8 008b05b1 e3b4fe24 49380a6d
+    9c7714d3 7e70e3c8 5ac30b22 d63b71a8 cc3af6ef 9de16a1e 5c17ab22 3998ea62
+    92e45cd3 1ad35936 2248833b 9e03da6d d523ac55 b663ffb6 f75aa66f f233b44c
+    4859860d 634b9f7e 7f5b7630 7f4eb328 96ef5cce a6eb371c 012a2e04 80a11094
+    2beed6b9 d2053f2a eba1807f e026569c 5ca6409d a7820332 d51d6904 fc692179
+    570e948c d75e26dc 7caed63b 3b8469b6 3068d6ad a140390f 86370dc9 3bfabd52
+    c81d114d 657f2c51 ad71c99e 997f62cf 56ca4cbc 5612d492 6a826b9b 0dffe0ed
+    0f35672c c40e36e6 3de72042 356c9b61 4180a6fb e6d321bb c2258a15 8f023636
+    87a37a4f ca9c2f7f 109b8972 28e5d7e9 f47ac71e c74726ba b245c92c 9febe9eb
+    0f985a79 2c2f7681 63d79a85 40157c4d 398e578e 71ea85cf f307fdc2 a86690a1
+    415bdf03 d0d6895e aa1ff46f 92fee672 af5aa64e eaf66ea8 3dfd4c08 f2b762b8
+    a1acaa14 fbfd18e2 d74705fb ff7df3ab e696679c d45d2d37 31646686 f9a6063a
+    409e6573 d4b5d124 d975e576 f50dce4a c7086b7c 81230640 cec75eee 338861ea
+    fc040afd 2ea325b8 58ef9546 c97646f4 57c6635d 94565e48 45d2a1d4 3db20226
+    8c13e35f a30f8b24 ad21eca2 b5104fd3 226c7e34 a05db638 bd9f7c5c 65
+h = 9cac74ca 81dabd59
+
+k = b0c9f3a6 dc88d7ac d9d8b13d 65749c71
+m = 2d885be2 f68a2b1e 7fcfaf1a 596b36a2 cfd8c152 028631ba 66c0fcd2 4b55b0aa
+    4aebf7e0 b4570463 fc95b8b1 320446d6 4f8c8f99 b96fa56a dd9f8733 ad769c03
+    3e030c82 07f394c6 4fbe7090 6e763624 993eea70 c91b3be8 853952d7 71b6d060
+    e7517b24 189313b2 435047f3 6f52a7d0 91dc75fb e11e1549 a0211143 b26489c8
+    e94f84d8 b3a99825 9a29b401 88593d62 2b7b5380 f71720e3 f3004281 e36197ab
+    ec50e60a d45829a6 e9732bb8 d73d80f5 14c6b504 0d44f072 cc619da4 4ef7e207
+    120a9acc 1a98fd51 c7f435e8 d25c329a 09cccecf 2c5f6446 7a97baf4 e7dae759
+    fb732f49 f767a5d3 edc7cf18 2536f362 6284e59f 7745adb1 90937a5d 73253984
+    33a3b630 78ecbc38 87c38261 a279431c 2c6f603c 1e740920 a1c736ac 79d3817a
+    9c1e2bf4 e357ecbd 17f52c76 7654cb69 930e6871 1409064b adcd7bb3 4a280a95
+    aa021d97 1a1c01b9 3b8101d3 4791c7d1 e56f1b10 fe331122 7a234d2a 2ddc21e2
+    cedb3d72 cad8f258 33d30b6d 7ad97e90 e85beb7e 22ac9958 1c12ca15 c68b9e12
+    6d19f242 6b1ecf31 b76f9b80 c517b11e ec6ec041 ba91c6bb f577eb9b 659e4d6b
+    04aca222 3b08a3b1 396465be 7c8cabe1 b05fd710 d300a721 7d13d241 9ed276da
+    29738cfe 9151cfd6 648e1e22 7c89d08a 9b0a5156 e2173f22 dd9e75ee e0aa
+h = d9989d9f 56c0fa0e
+
+k = 87d39452 b4d4def5 4b9e986c 85bec225
+m = 14e840c3 5b6a8ded 58e1cc6c b255383b 2f748424 1b1d295a 82a92e5c 7126b84b
+    bb625e59 f342d373 932f58de c34da988 a8652756 e00c81f8 f588a45a 441cf8a5
+    c5b05b45 d6746d75 9bdb079c e3a50375 cb1dc894 ee1b6056 8bd56e8d 8931b74e
+    8d451871 953a7a46 da15fda2 5f74aa75 7c80ae5d feee9ef5 c222c904 a349e22d
+    4fb16f41 82fe7d51 272edce4 e14bd638 25d44933 c5cdefe8 a8cfbcfa 9aa9d88f
+    cb13f219 68053175 2640693a f80ac7dd 7b034de0 cf80bf8c 21e3875e f8d043b4
+    524abf81 eb934f25 b6a5a425 60fa55ad 8fb88513 6d122c0b 5c907a59 290cfa26
+    15af5baa b4d80b52 ed69304f 1aa57db1 4cf4dd3c c5b934cc f716e05a 2713214c
+    81525a04 ddfeff28 31b0367b 38cb32b2 231e4e59 b3836329 bcc83486 6bda34ee
+    72558e93 2dc68317 f7924032 f54d124e c6d4b5c2 e9856d5e fd728ebf 90a67395
+    07cfbf07 70add7dc f4a47bbc 854b0eda 54cc5f50 54990fcc 540837ed 144c3900
+    d2c911ad ff22004e 1735aa54 2f9c84b7 94b0e5a1 c0175efd 2a841390 1d87112f
+    4c3de283 cf6ba3fe 96dd2751 2a3bbc96 a31285ee 837a0a80 4b26e6a4 c7b060c7
+    b58bb456 23358e9d e9a17a9b 2fc461dc aff3fcf1 0a938899 f9b94aee 4d0c3323
+    20a1c6ec f939de3a ebe0649a d0576893 57f91121 64546df0 e2f5d8a5 017a00
+h = cf7f82c9 31f38733
+
+k = 547cb9a2 adc4eeca 963bc376 ccc4f15e
+m = 2c438fc1 c7048680 3b3d6b75 e1a67592 f46c9d06 82938824 b1ab49fa 0e0b1fd8
+    052429d0 a9147797 75a279c4 e83a382f 2780f3c4 3631adfa 2ef70bc4 d31cab1b
+    66b2ac52 71258898 0c8ac81d d1d59c30 c3c4eee7 68e17370 08fed661 c4e0ddfd
+    67e152b5 ca86ce61 44ab5ce1 450dc79f 3ff402a4 24c4c0b3 d0ab1485 8c278457
+    4d8aa401 a7cf6fe4 380e6d8b 00ae61ad f09da2eb e410c084 e0d13238 d3282fc4
+    ac471c45 b57c1f53 07120533 9e34e2eb 6e17dc52 d568b312 db9d257f b1f76f67
+    f6e2494e b4c0bf5a 44d10b16 5e9aa462 01a2072e da445b6e ca20c081 b8b6c43f
+    e5d853f9 0875d9b9 a2d999cd d6009d1e 84d36130 b0da47d7 ad3a4ab8 238c8373
+    6a1a38b7 eef55db3 a347ddd5 1e83ae26 9a3464f1 49033d91 ec64af43 ad5164ac
+    e1e536fe 59e861b2 ebc851df 13f43d06 7bdc9869 d81be399 f9a449b5 297e19d3
+    3a9574f7 423d1199 643589ed a94185f4 2495e407 84349e57 bad979c0 e72b1da0
+    d72315bb 14c42cc2 16a70685 8a0dbc2e 89317445 39b97108 dcc1707a 6a6d2088
+    336aeead 0d7a1705 0e01022a ab972592 b42e6dc8 57e35f06 2b15fb33 2c854cf7
+    05a5867b 73acf2e3 35cf435c 9529060f cf4f52c0 b7ce6f75 850a233e 553109cb
+    2ec304ee 1072965a c96be993 6524917e 0cbe04a8 a60dced9 bc8d5d01 bf3fc2ef
+h = 45275432 20114634
+
+k = 9f8da6aa 9c824373 269ec783 b341c062
+m = b96bc6fb 57dd4c9b 131219d1 64415946 26cb1128 f01ee402 8400c4a9 9fec6a59
+    dacd5f40 67115ec8 2984e2eb 9b277375 a5bf8fca 73088481 eedf4b40 a6590642
+    c4d5c020 80276293 12fc1c5a c96c935c 00a549e2 25192c2a 0c361d58 7d63cb41
+    577c864d d5b6ab6a 521c92e4 36bd2f1c 9adf6e02 75409358 7eab9813 7400505c
+    a545bc46 b694c43a 1b1d7654 e16a86cd 42a94099 060768e2 3addd663 0b736dff
+    bf480c6f 30f30fb4 28ae778f 93e4f92b 1dfbd9c2 a1b61c8a 513e41ba 58288a42
+    d1c92ae9 05beafb4 6e4c6d64 6be7cff7 882d3e67 010eb785 8cdb8f30 f8f1848f
+    32f93eca 3b39904d 3efad4ec 4d0ca611 3f13951c 031ea41c 7fe033ea 5adc3b73
+    652e921b b415bd48 816e91fe 8bddfe78 af270b5f 4d54cd26 da108f15 bc150738
+    94308dff 01c2b3bb 8d46dab1 4269b53c b3ffa70a 4e24bd9c c02d147c 9c41aac1
+    ab17f4c8 e5b05e6b 21b9dec5 9f4a1446 87ea7857 e71ab4ab 9d8e99d8 4bd9d896
+    123a8cc4 77442f57 7c0eb391 cb3fee98 8401ba16 14eda80f f5fe68de de624263
+    6042797e e407d8b7 b0318b21 f2d8d52b 14059d7e 2c9e3843 63eb45e9 858e11d9
+    578eb3f5 648d0fe4 0ef1162b c4581e82 37c6b776 9ee64ca6 bc0a50e0 58f81d80
+    51482d7b 8b36d4bc 0351eace 0123d7ae f303bfb9 e79e588e 70d5d731 0abfd1d6
+    e2
+h = b4677e70 22ba142e
+
+k = ef534760 557ce4ef 4f71384a 66c45120
+m = 3f72e1d0 80662796 3e5e7414 e4ba953f 643296d4 abf52fd4 a733512e dbca889d
+    98bad867 52dc7d28 17558ed2 b0b3da7d 6102eb7d 5b60c6c6 5d759b3f b777ad92
+    adccfce7 71af0809 cc81ed5e 8efae2dd 6652cbad 6f23626a 8228eb60 9ee1c1af
+    6e55d64e bde1605c f9da222e db5dd39a 49199706 486b0e2e da160a47 dedca27d
+    819bba1c 6d8234c4 a158a5b2 2295c47d 426b3848 3bb63174 618eabea 0ebd508a
+    11328d53 67a69764 53f459a3 09b8e80d 413de925 2a6085e3 59f2d383 c3679578
+    b8b8d619 6ecaefb2 2ab4e356 83a8d888 2745c585 6df37171 6b123435 86652baa
+    41f254e1 8d626b89 4316419a 6f50bff9 06c59263 c6aafa71 09a77f2c 745f3688
+    4b1914bf ee213f11 fbb4aff7 75db6ccd fd9450f7 72a8d460 d12804c7 dea9d08b
+    727fdd1b df059a0c 40665370 ddcac9bf bbe9bc44 b680df9b 30b07fcd 493cb15e
+    630dbdbf 6d815a82 20464d73 d0b8bb19 3cf3938b 5395f3a1 653b06bf 39b5ba9d
+    6cb0a069 8fdf65c8 c8e40d17 54ee5a2d e33ac146 f4c739ab 06b334ba 69d753a3
+    8bc6d35c 30098852 377a7661 a1931ac6 eab0f05a 6878c375 e26250df 75838e89
+    0954f9a1 fd97a976 f4b07775 7017d4c3 461ba230 02fe6cd4 e39018ab b6fad558
+    50fb19db 2d75448a fdd00fda 9092bd0b 684cf03f bfc333a6 d768c71d caa85a9e
+    f739
+h = 5994e4c5 a4015f1c
+
+k = 6e7a2dca c1b9569d 3be412f0 cc7ab8d7
+m = 4cc901c1 60101ec5 eba1f798 8ed1fe0b cb671fde 2c721d95 dcf47909 1e0f741c
+    826e517c d906e082 04f69527 eb526e7f 441ee360 1fe985f3 3b32e67c dd319dbb
+    2c647883 4a6e479f 5ad3e52c 254fb8df 4119a555 19eab59f dad07e8d 8b513fe5
+    76beb73e b9630b1a 0a878e89 8930207f a738193d beedcc2e 9dc117d7 cca27f4d
+    1347e931 2df9a056 631d5a66 56116075 86f269ed 492f0c22 da36a17b 3c2d6f36
+    312c39a2 82f8ac80 f66f02f2 1c1cdb48 00de2b67 4512780a 07d9029b 93021e2c
+    b6a22ebb 7de387d3 8443a50d ba6c3465 dd3aa1aa 6a3c6ebc 5254445f 5c56ce8e
+    85c03e51 e1c054fc d0bb39d3 cbd3799c 7bff385e dc4966b8 e335f6f9 156ddf1c
+    ee733d33 93c5d072 13030724 c2f822a0 6891a85e 20c61156 128d0793 3571def3
+    9f599efc 70154a0a 92eb9f29 0105fa8b 3efd38b5 7ac20cc9 145ae6cf 998c03b3
+    790ffe1a 71ed7274 05fd72fc 0c29b81d d1ce6cf1 fe6762e8 8acd8182 58f54298
+    8635ae0e 245faef1 ceef114a d4f2602a 63da130c e51e1c81 0c86e2c3 5d188538
+    98f22087 af2f96b5 21b5d314 4cef2ea0 b557a60e 34e3772b ed5abf22 41072206
+    10356f9d ceed5c9e a5e811b7 960f10b0 f8c27fc3 4af97ed8 23c6dab6 9026041d
+    855a43a7 8e6ce3ae 2ed5c9f8 5291aa55 720dd26c 860635d6 ec98d0ab 3bc64e9e
+    822dec
+h = cc18ef88 75b9ccca
+
+k = a30be93d 720a5a0b 83b46663 7c4833ff
+m = 88720ccc 5cbd018c 97eeeb72 857e86d2 ac1e1c7a 1d2e82b4 9d934d14 086a022f
+    a8433233 31da86bd 1838e46a bb5b74a9 c355743b 791bc3c1 50736dde 0c8d4fc4
+    86976923 9e4cb347 f43fd6d7 2f7b023a f78c9631 98e5d808 96e92474 f69ec1cb
+    7990f2b8 b032fe6b b29cfbc5 42b66b12 743aa6c1 541d721e 24b8cfc7 0b7b4ca6
+    942f5d32 db612038 039e6581 3fd58f6f e10c9934 e01db9ee 59027bce eb04b265
+    b4120fe9 80ac7c0b 30550563 568aed90 bc67e3fc 749f0d21 00666393 1c088222
+    13b78e2e ae06a931 d3d69fea 8a34df00 51fc3321 e0c924e9 2b3ca68c ef21b827
+    7402e190 b3b61dee a6219540 bfb211a5 622c6c44 1f3a0e12 83c18cd4 da46b1fc
+    3d560725 4d808446 c2a19f0b d2373fb1 163b1b09 395e7942 61a5a94c b53611a7
+    03d092b1 fc376282 d328000e 6eef35aa 669705bc d1c2d3d7 6d64c794 99150900
+    4eae763a f046cd0c 59a79582 4885a7a4 b8604a90 d0ab230e c289e88e 29801e7f
+    8b6cb86c 32877527 595acef3 e187a881 00baa9c4 7ee53a88 514a2cab c5c1ed2f
+    294e59b8 fcb30288 f8c4d521 eabc176a 5775d9c6 752a01c9 d6c63219 e9b27d23
+    4b7b78d4 d707ef3d e5ca0bc2 2203eadf c88556ad 1579633b 434b98e3 9098476f
+    608d1d79 63f58bb5 6436812c 02a8e343 6f5269e0 6fc5b2ec 675a8534 3f9f3f07
+    ba912bad
+h = 1414ecb8 227aa487
+
+k = d6291226 b7fd220f 3f776e20 51a0e12f
+m = e22edcca dcdce4d3 094ffd4a 3aaa4265 10d0b4e8 cdd968a6 9cb18413 c06eb696
+    0dca318e 0e2f405e 6ae79c90 6d0f377b b4d16d53 048c8aca 4d49ff90 6a8a3334
+    4fa9f80c f6fcc35b f7116f4a ed8e47b1 54a41b7e 95277e1a 71e9f2f6 abb44bb3
+    4e6f380d e025a513 5f4c95c0 a73e7190 ffdb327b b1bf47be e3df2343 be77140d
+    6c9fefbb 29516d8f cdfba581 4f52ee69 5979c9f0 630090cb 03589f39 b48fe817
+    e3d6d07a 48a5088c d875c833 b6351a2b 4e65ee50 674f6a6e c3882196 ac4cf277
+    03655e6e 4ac3e449 7d955aaa 5abffcce e8acb087 7e103bcc a248015d dfdefc22
+    3523ea73 ecf34a96 238a7a57 b661e29c b754ad44 e0357d13 b7b5f9ff 1fd83130
+    2ad2dace 2bee7293 19f05c9d 1300e58e 85e57d16 ad32377c 269bfc53 b86a44aa
+    22d7ce1d 2a5c6205 803dd1da 6f4259b0 738267d7 d359ccd7 b5252588 abb846c2
+    9d8395a3 e00425e8 d0b1baa2 aa078a3f 4705dcd7 22c4b284 3fee4ac3 f1c9bb8b
+    b84aa2a2 aa67d28f 66b80ba3 0224da02 532ecdf8 31f533dc 43aa68f0 a4419fe5
+    85b9223b 3c50b29d 374389ef aeff51d8 0944e8f9 241b05ec d6df771d 405d3628
+    846228db 7fff44a6 062545dd 80d3572c cf5e560f 851b2770 67688011 1500f6ce
+    8f6e35aa de8ec081 5988f8f5 66f534c3 93a87df8 29298f58 429e3a3a 859957fc
+    310cae08 fe
+h = 75fd251a b97cc7ff
+
+k = 24afa4f9 b7f76cdd ed09dc78 e1733e98
+m = d96a91a9 e4473608 28980508 a01f5a1c 260724e4 252815a8 8efbcaae 46b295e4
+    18c27716 3728806c 33ab5885 f8484bd2 50568ea2 09b95ac1 2c5392c7 01272c7d
+    2ce6a7d4 070a50f0 0be9fc09 a61ccca4 14741f0d d0eccbc4 81f542ca 871c8b99
+    42086931 e4521116 b0d9a0ec 3de09377 61c90fae 7270ab94 4bf535f5 d39e4ef3
+    2fcfd6a4 e0e78f03 4b214140 00422f78 2f9a1ba1 62b3e1ba 520aaf3f 0c11f16a
+    31ed4572 0bc066e3 53051dc1 7a78b680 3687911c d61dff8c 0530d5f7 24da02de
+    2e5ea001 1e8c9b40 63a57865 3ac4ebf5 9eb2ea3e 73109219 1623f7ed 3c15f46c
+    2149c572 a2e867ba 6239f815 9235af51 8511efbb f64fd7b1 588c14ea fe2a1f71
+    231c772a e1788daa 14ac44e6 587e8595 84c70d40 f59b6cfe 8b18bb56 1821d830
+    7b510f1c 87e81565 068820b5 c4bc0be7 e7e2e57e eb4f36a5 c1538716 125db73b
+    eaff2d6d 9342a92a d73358d0 e376bb3c bfea2655 a9ebc6c0 2b0ccc7c 3c917bbe
+    311ecf73 9d576360 f2142614 a270cdd9 317e656c dc167e59 abad5fcd 83e2ed5e
+    72318591 0702eed0 ba3924e6 fd1e7be8 2b325c12 907932ba 5a81c9d8 dab59565
+    e581842a 87977c70 c1f7e070 8d7f635b f7adcf0d 376a3da7 cc4eb5cb 97a70815
+    94474584 34782549 6df11205 8db86b60 311d5af0 b4430c60 8bc228b5 efe883f7
+    fc45f12d 5db6
+h = aaa9f429 14fc9567
+
+k = 5d08f824 eec8dac3 e7ce20b5 27aa2f3b
+m = 4fdf6b30 0f83b78b 4a696e98 436b0c78 a1a64e51 e5e62681 1a2d23ab 78c1f891
+    ead6086f 6c0a45f6 ceb4d364 86d742a3 2876dea5 7b3d725e 78b81775 02520d3f
+    0885e157 42cf6b59 a76b2d37 e082dbdf 2f57d97d 2db07f52 eca6f1c9 9a167d9e
+    f0ad4e71 7415c0c8 aa13f836 1432a195 1527d475 3d69b527 443e55e8 a6eb716a
+    bb8b9941 6724e507 1db007be 602ef7b4 2ed9558d 1ca37bb5 ec4cb50a ac396ebd
+    9efc8f91 60026b1c 1b69c601 de125495 fba137d5 e7a10491 17d3e6f0 1d8e1187
+    8fb82fc9 a11de270 617e27f6 34b67c75 0c990994 d6c825fb b58176cf 37ce5d9e
+    9c4ec141 649cb0f4 b44c6156 dee71125 aad8e4ca d8f21e33 6991a6c8 be165d0b
+    24c92f5e 5f73ad66 f25214f8 a1edfa21 111998d0 02b64789 bbc028fa 44a843df
+    301242b8 0e8a9126 1a2c0a91 0de4ecd6 550e4130 dac452b9 ee444520 08185b42
+    5ad3ea49 77874156 e73f7875 5a3fc640 00e1607c fc4a8e9c 0103a3dc abfd8c81
+    4dbc871c f03f3313 f53b1fcc f0076c5f 9eb8c7e1 5c9f6d11 586a49b9 883f9cb0
+    d607c414 3c31d05f 3fcd472d f698a2d0 e8bce198 8785f07b 81f0342a e6f4a92d
+    bc9a79cb 7110978f f32ba90d f95df571 51b7d4b8 68cafde7 75d4130f a1cd880e
+    d3f06f57 e5acf372 267fda26 a48f761d bca0c87f 6fa75553 57228ed9 a15c4695
+    71f9c960 674863
+h = 0434fa64 960670bd
+
+k = 114a77de 640408b6 ee48c038 9f8e5278
+m = 50522d7a 7a09d427 a3fe0a31 f0cf497e 2d545912 f0157f98 4487ca4f f5d2cc11
+    f7a56b2a 121d8407 d0f14d65 ebcc1bc2 c1c85ea1 9bfdeca2 4decaaa6 41fdd41f
+    fbf6ae51 cd57cb19 f6041fd3 12f32f48 aab2f3aa 7e041f4a 5af32011 70e431f2
+    322f577d a8e66f4f 87e62819 4ffac465 358025f8 e6443c17 a9854105 32711af4
+    2bfba11f 7bea7ab3 23eaeb3a a6a74337 4de12601 333b9718 226f24da 2206be50
+    21ef00bd 77f5d0fb 71a2807f 3c8da11b 58ced088 689d7fa9 9e1b6cc3 6453d2ed
+    a9c436fa 87d3f982 4e05f111 a968d870 e7602e60 35296584 92fdd6bc 18e9194e
+    23c868f7 52dc3c38 629fbc74 cba7d2d0 851beb27 811535e8 8825866d 2aa7fa5d
+    f11d786f fcb97d92 fe15d09a c1a7785b b3709e2e 4494d575 1ddfbc9e ca0b13b1
+    bec5430f 83afd0c6 fb438edf 0d3f7c30 c2bf5bbb b60ca32a fb182d72 ba2ec3aa
+    875e1fc1 e5d01e8a 8c13d153 3aed904b 5754c0ba fa73c22f 4d984c30 d5363576
+    7161c57e e71f090d d51edafe df036e8b d6adb80b e0a1491e b21a4e8b 4d17807f
+    70409ec7 c985e4d8 cc1e0b0d a39cd343 466081c1 170df0cf 93624028 0da99fdd
+    fb8d8cd2 8d3023bb 8e75874b 425059ff e052bb3f 18e396e0 5d3f5cec 82334577
+    95d9f334 9cc89d58 ca61dc12 6dee80f5 6f3dc464 4eda791d c522a66d 8e131167
+    f1f4e884 96c0e100
+h = 8461d056 8f6cd9ce
+
+k = 608cc94b 2405adf8 1d3bdcc0 6c3449d7
+m = b5c658ac 1745c827 97163554 78c96d7b 1bd95cf6 9911ecd0 8719dd24 b3e07c11
+    442d4e52 cc4848dc c967a75a dbcdc9c6 ac4fb1ea 588c9159 f089596c a6d64645
+    a76b3c0b a4ac0fd5 989c8fe5 bb4134ba 8b9522e1 40b17e82 c1fa3578 060a29d1
+    fbff73c7 ac67567e 6b0e743c a267baef 836b905d b6090d4b ef15202b b056dbe2
+    0fa81ba9 bfacad02 3a378a6f b184551b d4140290 c6272039 3cdd9b3c 37524292
+    37df563f fc83a846 d2e8027e f5950fd7 f4653b73 924f2543 3c0b8344 501b9b8e
+    8d848e1d f0d14fe4 a87b858c aee3461d d38a9a48 af43e9dd c6ebe1aa 130347bc
+    e25b6d07 9b450c91 c0b90903 c1efcba7 bea32ae3 1aa1193f 09b440ae 0cec4ad1
+    f1f23d78 c52c55f7 390ad91f 34fd3034 1da07ab4 169ffc3f 7fa16614 674ba3c8
+    85e6f14d 5d0dd0e0 b9dba111 22cd01da e9b54a87 44d8b5bb c240fe72 7b87941c
+    744753b4 5f08650d 5e551f3a 3c1b1af4 cd61525f 7cea98b2 9dc54be9 95b29eda
+    339c30ad 72592a67 7f70e5b1 59c6c362 4312909b a5cb2797 c09e260a 391ccad1
+    996e90cc 8669d094 70fcf703 222c0144 a50386a4 28e03b38 d8c2aef0 d79fe52c
+    ffa3d5db e9ee53ff 2e09bf46 774ec360 ff42cc0b 7c210a2f 8f8ea5ba 770ecc9c
+    5bca6573 3b01ea30 128cf5f0 78f24dee b56e1999 1ba0b24d 24db5241 3236a03f
+    41a29c3d 82b12f7f 57
+h = 36ed6219 ec4dddec
+
+k = 8e66035b b2e1589e e2339a38 4f8390b5
+m = 55d5a6c3 23e20757 3e6d6381 ea62e625 7f1864ee b6cc25fe a232f2fb 0fcd340f
+    aa36b77e 470b8209 965c2362 6999651c e498727f a2202ceb 667b1f13 bdfd2eb7
+    da2b98cd 5c6f58e5 f25c43d4 ddd6b975 1eb93d82 0cf26d4b b18b760d a6d5c1f1
+    87b79ed3 cba916b8 7cc59c5f cbb651d7 a10793ea fd641d60 e49dc3f4 f5f34f87
+    3594bcb9 0c774a96 586e0b74 c7053218 cc8c171d c7ab4067 604a3c87 fdd383a2
+    607017be ae739957 1817e7b2 223fb6b1 99dc41ec 2a5134a6 9f0bb5f8 40d6ff3c
+    81cb84f4 80c2b619 434d556b 4f240a48 ce0c1c0f c9faa223 c9dbee6a a0e54fb3
+    e951da5d 9a403841 003da312 562d267f 43f1a41a f19d8139 a0ad7575 f5a9e82a
+    2d6b7c75 fefc6914 f301ee6b 981a7e08 16650b5e c1732695 75532bdb 10e00dc7
+    bb62e675 3629e7df f8ebe2fc 709e1603 8832b430 6f7e5034 c4063a23 cc98e15d
+    cfef0d6b 43330d0f 71fd6e08 96d742f2 b81250af 4fd29a0e 96e13abf 0e60e805
+    e738d4c1 4d246909 01c2a79d 1ea6bce9 b2c47edb c90e00ed 13bd896c 94858fc4
+    49450266 a58c4d3d 42a51ff6 fc8d60d0 34d0e429 b81ef983 57a5059f 059df4cf
+    c2054011 884fb479 cb53ae1f b02d5447 4ce63c13 7f95449b 7e742bc2 49d6aab5
+    36eb11fe 1b4cb694 5ec05664 fff556f8 7a6fb0bf 70673458 3f928281 1c597de4
+    7fce20c5 ff0b4abe 0a3f
+h = e7acbf33 dd873f5c
+
+k = b78824b8 ef819bba 3e6d0a54 92133682
+m = 9270c179 9eae451c 6c9c16ff af678e30 b54077c0 55e8c305 16d3baa9 aa85529d
+    c58f09ee b62a700d 4980acd9 abaed100 6b94a91f 846398f1 0a798c75 efa25d92
+    109d9e3d 9a1d915a 5e4d21a9 c9a2dc79 eae5c38b 953840d4 c5e49e9f e4edbb22
+    d98f13dd 1e8e1ea4 76cad5c4 769cfb0f e6ca4f76 2b587ba9 b75150de 88cd917f
+    7b5a478b e294cad3 a83e5f04 6f68426b 3c25b93b ad455c07 1780e3ca 97aba393
+    94e7061b ce82edaa 8aabebda 8c173701 bead0d12 c72885f4 94a4bcd9 d3777dde
+    4174b536 31df9397 8417d09a d0953c72 e52ba9b9 3f87eb3e a370e32e 3f306176
+    b42b5f9b 949f34ef a9bd9ba1 57b0374b 5b67b0ef 279ea112 003dbf69 5858d518
+    a2498f3c 2ccc7718 61b1a9f5 5f523460 a4c39234 3802afc4 7871f6ae e7b79589
+    7bc5b337 c64f5f7b acf249fd 03451484 940c25fd aabf592d 0645d48e 909392ea
+    873da07c 54ac9a16 f703ac36 dfbe3c91 414c356d e0aa1df8 d99697ae 1b380b67
+    2bdfefb6 505bb0ec 3bcf99d9 66552f06 c56365eb e1a51851 384a02e4 634ad99a
+    e8b37170 e007105e b0642176 0f699771 4ef5c5b2 568d8796 c84a3617 10ee2bac
+    338b81d5 a31dc057 db41d235 18135262 dae31904 2497a46f bfddec60 722d78b1
+    31e6cb91 0de9b59c 1836a9d4 53d87d1c f932719a 28f2e01f 6660f8c6 5e11f83b
+    1b4a4733 1fc11c85 ae53c4
+h = a830be28 fc2dc02e
+
+k = 141885c2 890f6d8f 84b54d93 de0add3b
+m = 99985b34 3f68f1b0 f92153ca 0b9844b7 5ece59e8 2f02cce4 da5a1742 eace5e18
+    b43be774 ccd0aeff a56ff358 4a01fb4e 3f9ab4da e9fa87f5 ae88a7dc ba69ac7b
+    d24e3428 15428717 9601c117 c770b3a5 0a52d381 2fdff877 ea2b05eb 6ea0f3c5
+    5c44b56d 728e4d80 c685faf8 dd913a16 3d1170d0 94f13d7b 6ecafae0 ec5a9dac
+    50b91af7 8dbe44b8 9fea5aca 37f88b78 64b02f9a cca945e8 cfa9991c 934dc011
+    002b7049 02bbdd82 42a1aa43 04361887 62835d4d f39e9270 f845d715 33bd94af
+    ef1877e5 fab7f983 71540fa5 27859569 462e193c 367ea530 ea2257ac 846e4a20
+    4e6de6ae 1416305f 84432f21 e6fa8249 7e95219c 806c88ff d0e4f31b 738f725e
+    a1ba3729 88358325 60d0bab8 3a6a2ade 27fb805c 12d17b47 79ee4d32 28a58589
+    2bfa128f 43878c51 805eb393 7cf76285 49270c17 34a8731a 41da46dc 11c74c7a
+    6d44f391 e173bb29 d7d1cc0a d3cf3ce0 d0d195da e58f211a 9b45c934 ee676e48
+    051d3189 007f0622 2513716f 82e48a7b f8ec57f7 bed1fd8a 36dd4752 3afbfb59
+    c6ced809 7bff2ab3 d5ecd930 758991eb bf343a25 a2803a88 7ad76c8a 63d728e6
+    00f9e506 8180fd4e c7ef07be 0ef9409c 8100247d 0be730bb c2418327 bd5c037f
+    bab9c998 32ed9706 507f82ce aefe6434 72172c01 91e83c31 98838222 c354668d
+    5dc61509 55994860 22e98da1
+h = a5e88328 c8ab47d4
+
+k = 23f5d2db dd299f58 47037de2 527e9604
+m = 22f1b929 5378a510 1be4013e b02fa5e6 7a19748a 77fae3d6 12afa99b 1beb998f
+    4abaa759 c3e57313 bc67b7d7 c7c30f70 7165e3aa 9a066444 b40e5f5e b56cb1b1
+    d4e6e4aa d26c1669 fd45ba8e 349ca758 bac63784 f26a8436 611a8bd2 98ae2ab3
+    d8a5936c d0b547c4 ef01d93f ea0ea424 536cb4b6 b573bdda f988c7d1 15ae6340
+    85a53368 7ca0c668 a8fb2179 892c7b01 42118630 8108bcec b02d3c9c 61bd110e
+    03b2c6e8 d98039b5 a42a7a38 6e23b5aa 3c1731fb 143c9e67 4490e0e6 3c827308
+    07097a41 28c1dce0 282e90e2 d9be4ac9 2c9ceca4 128fa5c9 7f7b775f 51a19f8d
+    697437d8 18469a51 8ff627e8 48e8ddc4 a56096d9 825dc38d d95a1345 c37623aa
+    ca2795ea 1f283a25 06bcf1f6 e8af8db2 83bf30d2 0f217e08 f7b637b7 97563364
+    146472dc b7f84b52 1dbf08c1 9d757dea 84450a76 cd7335e4 850c552d 0247fae1
+    78bafa5a 3a771057 0a5c3fc4 db4ee2dc 3653d70a 9c38bd0e a6c154c9 7274d4b9
+    cff4562e e784d9c5 948e0be5 ca7824ce d6caaec9 a71e6151 95caa01e 4bbb4fa8
+    83deaa5d e2d7f4b8 eed19ea6 1be9b412 8bc5dbb8 9ba7cfd7 0efd062f 4cebbdf1
+    47103b4f 43dce770 537d4346 b2bf310d 73b671d1 c9e6f2e3 fc757258 2faa8500
+    4bec8d58 48b88dc5 ff8edfb0 a36e5926 fd5ca410 7c8de78a a2c967c7 346bf7fe
+    36c1dac8 bc4f19e9 1cb86d70 22
+h = 4e14075b 58bce972
+
+k = 60cd202c 5e01f430 9993f287 664ac50b
+m = 1b2a2433 6f1a76ad 341586c2 500ce686 bae2eb58 09c7ceed f4b47184 9d3270b8
+    79577dd5 6084a87b 2fec6231 770ef77f 0ad085ea 730a05b9 79305d33 3ca3ab60
+    24f45c96 e1b45dd0 7f639112 d19eb2c7 7aa97d6b b5351f05 32a854d4 481ef93a
+    27356d26 a97ec384 d719d7fb e6af4805 33681e00 6eb7b998 2563b904 f680f42d
+    30d15a4e ae70106a 3f583b7f 63d59173 8b1da634 195dbef1 41400a12 aabcb087
+    918000ca 65fc888a bc821628 e04e3aae 908397db cd233340 747bce56 a2a00843
+    98235da9 eed5df2d 195f4128 7001edad fe4f8999 a668b097 cda5b3ef 2d5a8f9c
+    00be6fe3 6aa805e7 3494def4 3d8b8e4f 6fffa54f aac8c841 ca89af27 0eb69aaf
+    b5f95d47 891143e4 0c22e295 bd77eb3d ed4df23a f796e6a5 51d51f24 d78dbc11
+    8062f54d b99e5f73 f1a6dc59 e511eafe 41e21144 e7c02efd a20ba719 cc6cd7ed
+    5f292949 37210a73 aca08a1c c7b748f0 f99fc4d5 844522c1 c071dcb7 0ae03263
+    02e021b9 96262276 d92d4e38 e97d7731 7b4085c1 6b5a2ab8 88617a1f cc5fde77
+    47bc70cf bd275726 c1cfa4ea 27cb0f09 7fc43795 d41c3e13 b60447df fe69d851
+    d53ce10a eed5e226 d2dd3548 07649afb 7828f2e0 cd669064 dc751d6c ed8b9210
+    31986b0e d68af329 2ae8760b 6e84c937 5473858f 9c66e945 fc637a25 43694665
+    1fcc8249 d573b820 4e2fa496 c195
+h = 19809376 232c7ed8
+
+k = 756e0410 80982029 8ffb139a fff59516
+m = ce2de284 e0342086 e1ec9cec 56d2efbb 2124f017 cd661fdb 573c3687 7b803a5e
+    7ba5d218 ae4d5f27 1feeaeb3 3a7e062e 4295974c 5ee28674 7771df31 b89559d2
+    2ab50863 17deadf8 59087e8d c9c9075d 87ab06d1 9a12b144 6127cddb 70790b4a
+    f3dc5587 23db5d3a afe8ed86 0bbe8551 e57c85cc 9a0cb3f7 66270c01 1323ddef
+    d483c183 4288bb82 f85b4141 7e1da410 8c549f56 aac1dc48 9afaa9f1 62f3884a
+    dc7cbc1a 325b6d76 cbb10069 84d11517 88d0f5b5 60796d29 49c005bd dc88b45f
+    24568270 82d063ef c8d061fb 6a58e8c7 eba1caaa 451aaf62 cefacf37 fc7107ee
+    2e46bb3d ac0f57d9 5d0d2094 c1048ac1 72d1f4ef 92790ae4 74bfcfe9 9a2328e8
+    aaeaaba6 5786c69f fc3a2f76 0da5118c bc2b3bff 6e573786 9afbb2fa 8effd5ce
+    72548ce6 1832ad5c a68fb40c 6fe52f30 9e480efe 91757dc4 28d2a5c1 ea038680
+    6ff2d8c2 f5ca3628 79bd1a29 8b35db13 674ee7d0 7d16437f 59f5adf0 24d67b0e
+    dec9feaa 6823a1e4 f9da9fd6 c906cd45 4e0f7e9b d78de026 aedeb98c abc18dcf
+    67aa7fc7 3ed32ace 8a8b1e4e 58dbd663 3525eb30 d5e55ad3 22261391 59409e01
+    b8e6668e df89e227 09f420d6 4a1d6e5e 249c0595 7bf9a795 2ae85197 3169ad6c
+    64bdb324 af2b8c3c c2a8b2c9 cb48f2ee db019974 1e083016 61a5a4f8 ff58fc47
+    95927474 a466385e 3908d8f6 7a432c
+h = 5f954350 126525ed
+
+k = ae45476e 7dbd6b48 1beddaee 4bc9b961
+m = 6abdf493 de0bbc6e 5147f757 49cc7dcc 792e2f28 9a67ff13 0ca0c3eb 8f355996
+    c2b77dd0 52b36b35 be98e090 58713d61 eede4bf5 8b4f8ccb 7c1b50eb 282164d3
+    8ce6737d cd7b4c1a 02689c5c 866e0d4b 93ba9eb9 8ba94ed4 90efe67e 2d4cfe9e
+    055dcaaf 5e11340a fd1d13e9 30af184c 04ebb522 525b8483 0abcbb99 e14edd2a
+    aff8f007 cd8b8268 0039d1e1 9877d088 61fcb78f 0b1c6c51 c84cee82 09ce418f
+    bc0edd13 bcf18985 5cc849eb 60841855 77710788 cd6c7e49 47b6b464 3329628c
+    0b21f731 82d0b536 ba1b9ad8 c2026281 4128e6cf bf4e0945 8beaf465 8df65027
+    1412790c 1b6ef95e 4cf7f796 e650517a b9b23c83 eee9a869 08b0bb87 4af45bb6
+    d0653d86 4c8c3a7f 9dcc77d4 c857ab3e bbd62f8e 7a0c6de4 697e3b6c f2ffa701
+    97f44553 a3c4e4a1 8daead2f a3df453c d465a88b 37ed1267 a32c6a81 dc78ac3b
+    546781b0 f436e9a0 3f0df5a3 ac977a02 18229dc9 bae6219d 02626496 96fa4ba6
+    bf77d23d 966862b5 8db19198 0fa0443e 32a7d955 74cd13f9 66ee2eae 42c993e2
+    2ea756ad c36b11d9 7a936961 3510c754 e678e085 215793d5 1667ed23 29a7c0b5
+    5efaa6d9 9451f863 d7a624de 76157a74 45ab9aa1 bf5b5a7d 30c60f40 9419bb9f
+    a289dc8a 4a9340fc dd2a87fa fd8a749e 7fd294c1 21c8866b 0ee88475 4ac50b20
+    2a750dd8 dacc310c fdb88221 60ca5448
+h = 31edba8e f52431ce
+
+k = 3c9b32ef 2cb5c38a 68bd5f0b 7511796d
+m = d420f235 2f913c04 e574d57c 45f7d347 a5e1d27e e143cc4f 5f1a5617 14b3c9a0
+    f90bb64f 3b776e17 35ee748d 8d8a5fb1 cfb35b09 1ae0e450 e0c78687 f8999e5d
+    c5c97f94 17642f9a 679ddca4 9df09e79 16ead6bc 20b60525 917b41f0 34302660
+    3817e7b6 02bd516f e8a19ff4 081d01a1 b494f90e e24cd2db 4d4857cc 93441989
+    e36bcae6 621f9f63 fab45118 939ebfd0 42c38809 1aa11f25 934c33a5 18a25a7f
+    60ff2550 746795c8 47e0f6d6 0c02d287 47b8203d fb48da1c 66f48427 e6d02d0a
+    eb1a59d7 12e54ea7 beef57dc 9e3ace0b 63027bc0 a1039537 10ce5b1c e9e316ba
+    6d67c38c 2d45c414 c243af98 29866023 41865813 f50f1ccf 2ca806f1 6f296593
+    b8231f82 f678821e 19d97470 a6c7573d 53ee31b6 4c777067 1c50329a ce60f8c2
+    3693a2fd f005a26e 7bc6ec55 9388f82e 5ccd6fff 30fdb5a3 7711021e 97042abc
+    bdad5b21 c7e3d3c6 fd99bfde fd0b0056 9dc88527 dfe1fdfb 299939ab 8afdf2e8
+    5256e4f3 0ea549c7 bb5ec2eb 5bf6aad2 efb4fd76 a827ed80 71e3cd99 8de5d4a7
+    e46b0919 1919d646 ed90bf0b ae65a111 f5632652 3cf59832 ef8b1e45 c50b8c2d
+    23cc3ebe 8e57783e 0867c1bf a892289e 0f78491d 11567cbe b0508c95 9dba85f5
+    d4d3b1d8 88a9841b 47ab4edd e7154b83 18d7757f e8264672 85551392 10564014
+    b7e33d9b 6301d19d 5bb1ed9b b764eb0a bc
+h = cafad340 3ac299f1
+
+k = 38317540 c543d56d c2cc75b2 0766d369
+m = 8bffbc2f f726ff90 82edc7c4 51f5064d 758b6236 916e450d 7118fd84 284bd381
+    631ec7b4 e28f03a5 dc2f9181 b5f7c7fe 469bcb6c 961ee5c7 e703e062 7062d7ea
+    41787efd 8198aad1 4a075505 1d292c8c 925529a0 4bdc1679 b664d7f5 bb6db1a5
+    67ec1be7 96af8129 f23ec110 8a089814 c1c49eb8 fb92c20c 983c3ead 217bc8b2
+    1527df9a ed8af063 b47b11c7 d81527a0 001e78b6 233283b2 e2184bf4 518ccc94
+    dae507b8 5e991d11 a72c9350 08fa4dc3 ab7cc09a b30b5106 27bf7a66 6ef85cdc
+    c2bd83ef d8e49065 46927dd7 97a104b3 e75bfe5a e3795414 2b2e1ec0 ac584262
+    b15de90e d7401478 fa96f763 2006942a 06456041 4a451e2d 0078c129 5257c8ff
+    acc10dd5 71d21c60 fbd61936 21438edd a727abec ccd6ddbd 25279c7b 3076f54e
+    6327043a 739c9bbb ab9d389e 1ae21f97 53e7db24 6362c257 bcad9f8f 25c0135f
+    9b08e7e3 3bcc2993 0851ab31 17d2d605 b15e51ec 247ea3e6 d23cf6b4 ff5671ac
+    84ed3cb4 af707acd 93a62161 854517b8 0fa4e99c 46b1e32b 15be2edb 726f58da
+    4c8f554e 4991b176 4095f54f c439af63 9a24515d 8279577b 9ffa4db0 74905c9f
+    cb788be9 54adf2ae f73ce01d a92648fb 5bc64dc3 af6042e3 12a92c4c 792c8ab0
+    1fcd33b1 f5289302 9db72260 e62f6caf cd284704 8fdd7385 584d4192 2f7e7150
+    416277a3 21075b92 19ac002a cf1925b6 de22
+h = 9868c46c b507a968
+
+k = 54eb1db7 563d4533 23e5b0e8 e8e34b83
+m = 8ff17245 ef1555b5 c6d31e1e 31f2c5a5 e09c99eb 08b765fa e4d57fa3 aa169ae2
+    e6336313 9bfc78f5 2a8d8b90 8b499bcc ce5e0ec2 b02dc722 c9c65ea8 d1ab8a5b
+    da3ba490 5ffbd67c 81460327 ce7f6f84 038eb10c c8265452 ac439281 1c0ded57
+    ab1e6646 f6554e60 30e9d227 e272292c 81f51fe2 fcce8a49 18afc379 d4e2d220
+    bede4647 11bbe5b7 65ff3102 1aa4a691 59a25370 716e9f7a fc0495ed b46ce207
+    3179476d 15ec70e4 34b7e582 21052f33 21e532f3 1bd589a1 3f9eb8bf 8160d146
+    29700b0f b17ac104 e0bf470f aad2ec95 b0853fe9 5595f39f 33bdc9d5 94e3068f
+    b9ac8518 6136ebe3 ca7ba8d5 26d5bf85 a1069d5d d7e8ddd7 b23ce310 595a2f8c
+    dd38f003 15c9805d 6d06a546 a7214105 4cb5bc1d fb051d56 127fabf3 848d52d3
+    95604c60 5fbf02ae 6a6212ee 05ba96f9 50674835 a1e128cb 78c51673 f320d501
+    9fa81a93 fa85d0bc d4bda97e 0bf7b301 cbd69f29 d2805f34 ed4765ee 0536a93f
+    f6615ac2 3286b24c 42f855e4 866278ac 7cfa8878 11b4f252 149aa145 6ca73a2f
+    1ebe8867 c2d3650b 24fc5708 df6b4b80 f2f4af9d d2ae92f7 a7e3194d e17fbfca
+    cc2e3e2e 134d8b7f 70b2fda7 d3cc3638 63fa133e 9ea7905b 90ff6be8 23d65117
+    049e17e7 49f497e0 9d4d3c4f f978f544 703cadaa 8cf3311a 3284d8cc 6c6bb418
+    43f24af8 a9a42927 4923a307 58e5e6f4 d0ead5
+h = e00a1abd 63427811
+
+k = 7ffb34ba d05fc32e 206c026a 2ce2c509
+m = d85a8b8c 0fd8c4f6 1517f23f d16bb67d 5e8ef4f2 daf59e9f c3e4e4d0 967a5169
+    c7343169 4a67c24d 97c4b73e 2569dc77 64419fb0 455feaff 95695624 082417b8
+    1a5d2feb 7788f096 45e69a19 fdeb8630 bf823ad4 c4cbc170 ca353549 d019904f
+    c6c22ad0 82949ced 63bf9464 24039c45 a5b48eaa fef603c6 337311aa 792702d6
+    83864d9f c10e0727 148066dc 3296b153 921d244a 190c9efb 97f7ad94 61d676a6
+    29a905cf f2002820 4f05e1ae 21ffa942 6b1b7ce6 f889b4b5 4d236e52 8fad05a2
+    739e9d7b 2a3af819 2c8169af 354c5f24 413aae9b 8447cc07 b5c3a22b b0a769cf
+    9e8a4b68 67793f0d afa2185c a7cf2c01 55704709 d28fbc46 66ae2cb9 ac4c1350
+    3f7683a2 5f2dc48c 63be2cc8 cc289e86 365815f0 a5a70f3b d991190a 84526f48
+    767d441f a0075fcf 82a0a379 21681dda 81ec5b1d 00a49a6e adf7e66a db87f6d3
+    7c7a2956 e1194a13 829ed003 a944e75d d67f82fd 7832c622 a67c2557 3883eb83
+    1b0698f4 ca332f37 28818d66 ba6b89a9 8ead5b9c dcf1ac8f 7b6c3ee0 01c11a61
+    3ad4ce80 44751077 7ffe32ff 1039c0a3 4cff5e4e 89b92b61 58274f23 506b3b80
+    d4e4559b c4adff1d ad9d5d04 2b78d2fb 4d0c2c4e 6369051d 5230fd54 364b42ce
+    f0309223 4607d5de 68fd859f ee69cd8c 8359140f 10394ad3 10471a89 b3f6500f
+    3a1f7b57 09a171c0 1ffd30c0 5e5a9c9d 0740b644
+h = ae3784b1 84d00fdf
+
+k = fb844f5b fa5c0994 b0f50fd1 c49fd63e
+m = 087affe4 07b2ae85 901940d5 6e082a3f 059544f2 740ce03a 64c9c181 712a6c31
+    481abaa5 3d0bccdf bb5acc31 2b7de761 4100fa22 2481f892 60db6297 97a265be
+    341a16ab 3702c77c 52d7af0b 3f77ac44 b093d5ab 48ff5ff1 b89ec3c2 bf43603a
+    47629c55 ce5c739b 4042d2bd 5dfca7bd 06184be5 d5c827a4 06f99518 7686a567
+    b8645479 b1716a72 a1a88dac d3661e97 0c2e21d1 9055db5e 194403b2 0d52f09f
+    3d84651e 7925eb9a 39294e97 7e024855 c8ccdd3f 298c74c9 277a128f 0307ac7e
+    bc67d982 702a57b7 80678d6c df581b48 13e0b74a cd0e4f13 059b3b79 0524d7e9
+    d6234f87 39c4a311 8841ff7e b92c7528 f5cb3767 017be6f3 a2ab2dce 07f2427f
+    105cdc44 95c062f6 5fb4a138 b6f2f37e b42e9384 28a22d20 becd311b d4ff0629
+    fd43dc54 72465905 a169c73f 41b933fc dcd689b0 067141a8 1e66b65d 2d2b636a
+    4bcd4307 e0fac353 5dda4dc9 fdd99ef9 ce424f81 c1a72aa8 9a35eeba 38739d2e
+    dc092b68 7fdfd3ad 7ae5fcce 5686ef1a 3d8c44fe 52d2736e 92f384a1 b35c4b2b
+    991280f8 1eab843e 1ade14a9 fca5c70a 2783a554 ab55d81d 871fa74b fbb1e90a
+    958e5b0f 62ffb4bb db82becd 9b89184d d0c8f296 c4bd2439 0840fc2f 59e7f129
+    8ca697d7 d0e1f124 31ba3152 022841f4 d2c9a2b9 ea8db766 d5d42181 98ee2de8
+    e145a693 06c32b63 3a35fc8e 91f62fa0 dbbb8877 a5
+h = 32a54151 5aac6b95
+
+k = 3f872102 df01184f f698e382 9d4e3e50
+m = d78b621f 03362dba fbf44214 a06ad156 659ba949 b5cf4bea 8805f3cf 279c312a
+    d36202c3 75fd6813 687a2e7c da4d5a44 5c49853e 4721f65c 3b07858d 9ceaf2b1
+    48f0d8c9 012814b1 9f0f4925 507501c0 cfd92855 8e7207fa da7eab5e a117362a
+    fec0175d 2a679514 0917cfe9 264b6f56 baaabdb5 ba6b8852 db2800b0 a6b0d993
+    dcf1b188 208a3b6f 68a6dcd7 a4cff1d4 5c7c3778 bbc709dc c03bb6b7 3c22b308
+    69b30d93 47aa9dc0 6f66ddc8 246183e1 701fc62a a1f4049a 302e619b ac0606e7
+    fa9c8bf1 6ba55222 e7a524ac f007323f a8e11ff2 672b0fce 5e12a9be 49a9911a
+    d839944a f742c03f abbb1070 006f8012 fb82ae47 aa484550 b5155946 f37f2e2f
+    f3cc5f0b 3b785e61 1b342fbf a00acb25 7c7f3ca7 7d0e21cc 822efb0c e385aef5
+    b3c78d87 53416467 925c18eb 5cb6cfb3 b1c6f6df 3dbcc542 38e4cc91 889a74c6
+    efeed936 2421992f 12c99c90 acb19b13 335c14c5 7ab8901d 26d23342 268afc39
+    085664a4 fdb7d61b 7cd5fd45 b312fc88 7a83fa39 2d6b754e 366e62e3 414c70af
+    17e716dd f47c0f50 cfc2c784 f0f2ec78 e1868e37 27f6e6a7 8cada619 dcb75f48
+    d486a53b 2a4a76f8 e223c51f b18802f4 b3a9aca9 997e58e5 7f55d044 2e084640
+    ea720c6d 0ea192cb f47a1a0c 657d9490 730be9e6 2232344f ec61fb5a 44692fd3
+    a84042a2 a6fc2d0e 49147f38 08576268 4aa49460 1072
+h = 98458f2d 0697c2d5
+
+k = e8446fef 4b3d5902 8835de66 1b62eedb
+m = 0b89f1fa 61fd0518 6693a43c bac566cd a06fd180 3f14f65a bfd0b267 f03eb6d5
+    d677c928 66eb2eb0 182238cb 2433a863 409ff3a7 ab5b94c1 3a194793 fbf360aa
+    699a7a59 91f63f3f cabc821f 6828adf9 3e7b2c34 69726523 5dc8ab30 88c661d1
+    db8b6b9f 672ca254 1cb380a5 d9e96db8 594d483a 7e693da0 eb2aab0c 948a10f6
+    7c05be78 5949a978 357959ed 672a2b0c 61663f26 cb7589c2 f8c33554 c264b087
+    5018aca8 f582da0f 1792db0b 0dada1d4 0a454c36 69c91e99 fe8ec3e1 340e24ef
+    44a928e7 7dc2236a 198a2a98 cda1f66a ad9c5d6e 06d470f8 07c12d55 2270acec
+    54884714 596c9cf3 42114e72 e5c46b82 1030e5ae c8c56ce4 e7c27c45 908c380a
+    79a1e435 f07940d8 8322bdca 59d0137a 5adf6a2e 37b82ddc 41c07ede 65bd0c0b
+    3c4cea23 9fa5cdcb 69da4f80 312a7f5e 5453ad2e eacf8081 76a77ae3 54aeee19
+    cf048bf6 b9b2e3af 544ec09c 391361c5 afb5a28a a61d58da 734d86e6 5a066fb2
+    a434bde1 4756a665 5b1ac0ba 22adb7a9 a65f7869 0e5171d7 2c532001 415578a4
+    d418b2b8 078c297f e267bff2 146a439d e1d8121c 19107f73 afc3cad7 f7a34b26
+    ee2f5a57 1e4716ef 324591ed b3c24908 725a4677 e6deb4dd 69111f6f c2d95446
+    05a7f9ca 9b2cd61c e3692613 0f7a8fb0 6911f53a 2eab092a 39159639 743940cf
+    91bc68dc 3708f8c6 74b9ed61 7e51d30f 8daac793 e18474
+h = c484f7f8 18ddfefb
+
+k = acc1d536 049fa50b 240a97ea b6268976
+m = 60621d83 adef7c33 e5a23271 089b229f e9896da4 642387e3 5f027b97 bdfdb153
+    401ed49b 35e6cb3c 69eaa4be 6ea5fb3f 9baa42d2 2947b635 04bf5830 6d330445
+    079b07e4 a9d958f0 19fc3d49 6f665219 af9fa763 ff3cfe06 77f8ece2 5b31d7b5
+    5f60acb9 0cfeda87 bf8a0db6 640c6183 78981f80 e433905a 9cde592d 40bc6ea4
+    64582c92 0e2ae1b5 2c19a6f6 01d8337e 3cee177f 215125c5 b8465863 ce6e5de4
+    2acae676 c60ca9cf 8e539ad5 0ec030d6 05548cef 27fabd20 f4a48460 afef7263
+    d0119108 7dc88c08 f7e0751c a8a4dd8e 2a291ec8 740ad9ea 4152e0e8 c077965c
+    c30c004f f2de394f 0e99bfc5 26ca7d56 72357bdb 0fbd9e8e 7628db6f 0b55c159
+    fee38edb 671d3ea4 000ace41 0b1755df 59d4fc95 164e7c3b 0c067dd0 2b1a0267
+    330e3278 005f7c5b 7abfcb5c 86db12c4 80ce16b6 936d25db c54cac4c 04dde139
+    6b603c04 109d7a7b 71b136a3 5527a165 0b323edc 1811bccb afb3458e 6ce97cab
+    d0a1fb58 42b1aef8 1b59ed04 78d69ee8 1c010f79 435fb902 bf06700d fa0cb923
+    83b8b894 0a567b2a 8c5bdb4e a7cbc121 01515af0 6bafb63e f947b2fe d6e10e39
+    4db2d1e3 d98cbec9 2b95372d 2690baca da9348cd 5010178f 93c799f6 e05fb824
+    e121c8cd 4bfe56a4 f62284dc 1d7ea173 2b385fe4 2857ccef 24a7b06d ca9f7520
+    92cda6f9 5fbeaaba 931120c9 9b43e155 8f41c31b e834da7f
+h = 10907bd4 f4fa6894
+
+k = d4557fe1 f6ae59a7 ca102b91 e7aeb9e7
+m = aa518d29 8f4986da f1fc891c 9dfd57cb 9346585e 8da56288 d08fb844 d6c10b63
+    e17ce439 1b0360e9 7587b4ed 7a11a574 24e7283e 693cf4fe b4e8b067 835d680e
+    d9810a56 45470ac5 8f5431cd 4fccf54a 6b6fee0d 4fceb892 1a6a067f 8805ad22
+    1156b109 0369271f ba4800d5 d2b72da6 f3e3db18 b4989a70 86fdb942 0eb48b2a
+    ea758138 dcd0e68e 88839c88 458749f2 f81a13c4 8cba900c 1ba44822 ae54a6b4
+    f195a69a 115b36bb a1b128e4 13d7a208 ac8e2a18 771cc707 0da804af ce04a2bd
+    78fa1006 208d6cbe d7fe6317 1c8b1952 d1940c02 d0f55f1a 95dda0e3 97d6f009
+    4c328ca7 d771dd5d 0021ba20 8bd6b866 cdc8aafc cd0d8c38 875c32fb 2429b447
+    26e3e9bc 80aefb3e 3d9cbcab 2ab6c68f df9b6fb7 1cc62298 c2a36cdd fcbd9812
+    37931080 29ff2412 307243fd d630d12f 5dd8668d a6eabda2 70f5282d 5bc2c647
+    d16b9c45 4b1ce09d 4edf02eb eef5e5cf 661d827d deb9f950 b76fdd79 7f3d45d5
+    52164956 fb58be0e c9971d40 fad6ae3b 2f42c23f 2ba0fb5d 7cff7246 b6c69a13
+    5d4e3ac3 95797929 572ae74e 37dd15db 8a9a6e67 499adad7 f8bf8987 0c0e63d1
+    d398c42d 1f6f28c5 b8dc6d2e 1c52a293 1deb8e2b c2ad5c41 ff128d83 626ec70a
+    6b209a3f 3577f565 b3fe4fde 97584552 ad9dce43 aed0d016 515cc5ae 957237ac
+    a833a5b9 26469ecc 2303d06c 5583a269 a6df0f70 8c59d17c 39
+h = 1f28b69e 950f5a2c
+
+k = 95096602 04a8af91 06cd6156 1dfea5d0
+m = 45cb2dd5 a553561c ab721bca 09fbd451 1f87316d ee7e7e10 4aed56b0 c48af701
+    0a9217bc 4eb9eb78 aee433c6 e43786ce 6001fe86 32a4f7e0 d510e12c 0c538469
+    aa986606 efa3619c a37c15a3 449f6e10 4d09091a 7e069f62 9820d45d c9abdaa5
+    b32f72a3 f6288196 3f7bd77e 58f3a1de ce8ec288 d15b4d03 10bc5271 2a18ca6b
+    d5d750f9 5a445b1d 4acc3f40 ea05ad03 4393ceee 524d9464 ea4162e5 69f1117e
+    a4ff50a4 a6d7e318 1444ab10 ec7a284c a4a04c45 6c38efb5 ff399dd7 d0030b55
+    b6959054 852f02c0 b1c525c9 ae2d4a5e 5420e0c2 a6a03240 f87d91b9 8109cc68
+    3cff91fd d2193100 e80add0a 7f4c637a 65734931 53baa6a9 57b05c83 3b56f7be
+    6364ca27 4db46a77 3d420055 68941c04 a0f20293 5fdc1688 4249fc4d 201e0e18
+    3800f150 55e06488 7e5ea0ec ceafa6cf b5f7cc20 96ac456b bfc0e25f 5cd93805
+    24de301e c03e5692 0ff9be3d 676283e1 adb46480 da77859c f55e3a2c 60d218f1
+    703c2867 82f6e5ba 9cc035db f0446a6d c4a6d8eb 2a263407 ce286b5a ab0904ad
+    82258625 d01a1fce 7ba67e45 ce933ca0 878d9d9e 95bfc9af 79f5c0db feafe056
+    bf6dedd9 2da04b87 72983711 133b93f3 80a1a82b ee00a5a0 e084a39a 7f087cc8
+    a7252e99 d9242c17 82789194 d12e3249 a9ab36dc a5be666e fff81348 39ae6ae3
+    c16261d4 2a981cef 4be7026f 1bd6d150 a59d3c9f 06c05882 e084
+h = 32e656a1 6078fe44
+
+k = 86883820 c8d0673c f002a8f8 bfae7053
+m = 83523988 1283ea5a 940bcefc 529c127b 034b2755 daffb375 ec3da73e 98d55e8e
+    339aec83 e98637ca 7f0d63cf be252108 4a16f240 2b01f4b6 94d03888 ef1c4188
+    96a38951 f64075f9 a6bae107 35496e9b cf06fc5c cc1dc8a4 219a2ddf e79f9bed
+    e99d07f5 bbcbe176 add406ef ff63b249 8c32f1fd fc61c6c5 1fa19513 324edfe1
+    4cca246a 11037867 032ab98c b5d59b43 08692e7d 11235ea8 72b68ea1 7a14804f
+    396a9057 51155e9f b81e55e5 018143bc 359e2eef 294c2860 13c939fa ab49712d
+    02f6beec fdd86471 1e962f24 d1809637 77d38f8b 05b164b4 e8898dca 94f51093
+    c3956388 bd12dbff bbd7e882 61d13aaf 57c18c21 eee914fb 4ff3a27f dca4da22
+    713e3ea9 8bcb73ec cdf310d7 2e61c183 b25ac38e 28d808fe 1c09b822 3a3d9cca
+    cf11f8cb 9232aa50 13d16dc6 6b934346 29c12902 1ef97c9d 8f2a1273 00b08403
+    51e6b61e 86c63aed a4a654e6 8c197f1a 81ea1347 d15e3113 f4d97890 6c37e64a
+    98d7e002 77e69590 2d554639 9efefc6d 9771e291 938e0b10 05d729ed 630459ec
+    45ba8e3d 9c6f9b8f 864573f0 96e3f549 be05e74e 52fa7253 52fdb639 686a6eb7
+    6702ca2b c89dfd35 ff3bd34f ec10d4ae bb2ea97b 2b9b7928 83ada031 41d61e80
+    24c0f075 264a30bf f456ef17 28963698 ee99173b 12cc68b3 0c1a8b96 cd0c4df7
+    0659522a d7e44bf7 791df737 3f56cb9d 99c666f4 1d8de6ae 0ef6a4
+h = 11e969f9 ae1dae85
+
+k = 5ec5f003 768c7d11 38cc69e7 838485ae
+m = be1c37b8 e45e70d8 cc2b7f5b 3c1dda97 58d036b2 849aacd4 368ee760 2e8e3547
+    864db965 04db34d2 38525443 bb93fcbc 7399a3ba ed3dd7d4 a02926fb 12ce5b6b
+    db8ddecf 841b209d 310a316b 0851e189 b2141653 637966a9 32c1fba0 1d34df8a
+    8ea0905d 41aabaf2 66c5078d b9ef0747 6049c8ea 31094819 57902823 6358589c
+    e24a8163 5d86d957 456cdc1c 5edcce22 aeec7071 67a8b271 968d6de7 e42a9e2c
+    c5a6421f fe583f45 b8a6de8a ecafa199 681da679 52370c9f 5a7cc637 c064c857
+    5e0e14f1 5f5946d4 c571c880 6444d6d8 f7bad8f8 3546dcbe 2057e42b e1491be7
+    8df24017 726a2561 fd5e4f87 de01051f 3480ccdf deb9abc2 9ecf0daa 71bfa36d
+    c86c560e b7cc9333 f9e7db82 39b18d9a 55bcd79c 998d779d 7766945e 9406d7d2
+    3f60d09b d2ff09c5 f99aa14f b922f006 797475a6 b00daeb6 cae224f8 523b7f99
+    2f6c873a 25651b0c cbc74358 956371ce a208a04f 352daf21 99e8f1ff e3d39e85
+    35066e5b 96b81f6b e1aafe83 64b00689 944d33bd fab7589b 6d624be2 330d9548
+    b0a3ad86 926bc5dc 59b4da8e 91f859a7 6296ffab 658c5fd2 8b1842da a8d8d4a6
+    6bbbaf2b ca2b78ec a5cb5ea8 a99eb6f3 c0dd5563 15a9508d 08091593 cd139949
+    5e61421d d64f293c 0761c1b8 c30b0904 7b225724 0d2a59e5 42cc8216 3010c231
+    cc45df5d 7aeeac6e bfc7096d a436a3ae 4a09bbf5 f12cd8d3 7e408f49
+h = fea29087 9e719306
+
+k = 13ebee03 ec2d3e89 0560d63b 02da20a5
+m = d04f05a8 dec96b5c 77ea9fc1 3168f4bf b029e965 29b43eff 8a1a21fa d7c197e0
+    af00a5d8 39b87d78 ee60556b 1531be10 f9b083f7 bf5d9c61 3fe8cf44 933fc3b0
+    46c3db1e 0222349d 51017536 12c88e04 88e42d8d 84d8165b 0688ef9b 6f9eac9e
+    c24f1efd bd6a54ce ce78d2fa 50595a18 cc93bf5e 21281b15 ed6b17d8 5eaa00bd
+    2c48315a 40f7976b faef7731 2a62e10f 704c7728 f1b08761 f5784063 5333875a
+    bd02c38c aad8d23b c355e819 ae7b38a5 ea05591e b9430eaa a6a52f3f f95ade3c
+    50b1807a 2e61f216 7e95154b 83dad794 7e263fec aa4983c6 fba8f566 c5e4429d
+    13ebeb37 3b747562 c2767a68 aa6ea57d cbd8d072 22a6d371 4cb3f913 60f83a53
+    76d72c20 efedcccd d4e5a8bb dbec827a 0a9fd265 d4ecdf1b 76a52911 33a10dc5
+    eba3cc80 c451fb89 4a7c996c 33419969 c013f677 89c5663e bb5ada48 a0e5fba1
+    332565ae 5d44f343 51837f39 60dd62ce fb0d6230 0f22e697 9418cc55 e13d61aa
+    cee96563 9b9b3e7a 5c33e534 1223858f e1b60209 07b53e9f 19332985 49ad2f4b
+    f0b171d2 a364f1f1 dcf8cf12 4504b68c 08c48eb9 7b5aa61d de8a30fc 56fb7e73
+    046dcad6 21c81434 dee18aed de4340bd 2e0f69ae 69075cbf 5e37ef90 d27966e5
+    9bfe15cb cb008661 e0651fff 7485e71e 844b6b65 aa1118bb 66f2a0d2 982569ba
+    814e422c 55bc76fa 851da167 48604807 b8b70cbc ac216957 220993b7 54
+h = ec846113 032dab48
+
+k = 81436f18 3b454591 888ca54d a38b1bdd
+m = fe04bf99 93c100aa 8c95a430 cc8cc4f5 62eeaa75 7d6afb9c 15693d03 e82e47b3
+    3e1c35f1 7cad2263 f7081eeb 476e5883 2cef4df2 28c59ff9 3253b1a0 d215cefa
+    5b08b6a4 9f651c7d ce7266e4 7fc8d35f a6daec41 f227f761 cfb7b4db 56baa0e9
+    30fc8330 4187b87d b14051c2 3be7196a 2a44acb6 0de82026 2a592201 fab4c24a
+    16f07a33 1e59ccfd 40300432 245e8bb8 a4bfcc12 87bdfc1d 963ba7e9 fea4b204
+    4e5752ee dd01a318 4cb447ed 7ec0fcbe 13fa08f8 af81c10c ca31bc97 b6bd6eab
+    6f935364 5cd4af9c 97db48b4 3df13e2b d2cd7d6c 27fe8e89 4f914315 768f179a
+    3b168a5f 7ebc1802 71f7b7b8 433176ec 1b239fd4 243ff5eb a2a865db 8c870450
+    0309422e 502bba95 aea3affc 845499f4 f8fc2f61 1fedc4e8 394c6232 26e3a5b1
+    bf8b7005 a224fb63 369db3c3 36adace2 93eaf379 1ab99c59 74703747 cab8b4a5
+    041b1beb e00f23b0 92125153 c098ed34 7c0efa5a 2323c9ba f78fd9fc dca49309
+    994b7813 5381efea 813bff8a 0ddc2439 39b92854 2547b37a 7f978db2 54c71728
+    31de1ecc 3a378931 fc847d17 ac9e4f9e 8d18275a 99d671ea 5ed7cbd4 a1374fc0
+    ecdf2b82 2435a6e8 2b4239b3 e7427b83 b32e5c80 4c95aff0 dcadac6d 8961249f
+    636f674e 968c8905 22d403f7 afb50d08 bde4c99d 22dfdcff cd631c24 40dd1010
+    62e9a5a7 6efa3c9d 6977a105 7c52dd5d 8eaa6447 4e4f9489 cd50e84e 6a78
+h = 161a489b 161ed776
+
+k = 699a1c3b bbbf8a0b aafe6e7e 9347e9c6
+m = ad4ec492 9a63835b c5f0b68b 031f1f96 daf7e783 b10bf8dc 9486ecb9 82be44c9
+    981ea818 13fb475b f04544b8 7ef966da 7bad3561 e6cc1e12 237a55cb 8812aba8
+    5739440b 98b0a9a4 53af6d82 b95f3218 3ca66ff4 052e3bd9 55a07179 4ef49d2f
+    d713d6bd 46c2027e 0f4ff2b3 3eb5f870 9b7eb0ff b94ef399 2014f9a9 7a4a51b1
+    6df194bd cefd34af 15cf2acb cd60abbd e13d4182 5e9f18c1 1cc86139 2de10612
+    c31c6480 5d1f931c 52de96a3 b5d7687c 26422b73 db3d5dcf 1af1c482 c045aa5f
+    a0bcd707 14954d3a b5abe983 23f5b6c9 efda8432 cea8e7ce 81b63b5d 2e239bc1
+    eb8efd3e dfd09bee c897f48d c2c7ad82 aaedaef3 c1f55843 5365a4d1 67c011fc
+    f11741d3 402148c8 abc5e569 3d7e98c5 42dfa06a 13f5849e c6d974d8 f113d015
+    aa7a5b2b 5ef9261a 7ba26ff3 fd859f9d 6921aaae ab95d66e 9ab14477 6f4697a7
+    faa0f42f e7e966a6 a7834bb4 45dfa942 143b8fc9 41a12b56 2331991f 40d85314
+    5556776e 446092cf 79a1fe08 64da325f ef347d1a 9de42f44 f1f28b95 076907d4
+    4e1a18d4 3a73accb 3a7cca0e bfb4b2e1 0a79cbe5 00dd98bf 66f057ae 3414093c
+    f6a9cc0d 9438922f acd0a0c1 c26b7638 9c63796d 6ee22f2b 46463e63 0a8f10b5
+    a89514ab d09e538b dfdaf5a6 8adf2a55 473f0449 4428f39d 84a045f7 84bb5bac
+    d7b69a08 b47fde46 0448d6dc 0e941f34 db453e7c 19677e7d abd653f8 54beda
+h = beac524d 7c59bf03
+
+k = fb5174ea 76c23b87 f6da9cb2 830239c0
+m = 79ee927d 92ff5685 da7e5da9 4330dcb0 faf60bdb cac640bf 6c6a4a16 11120f7f
+    ddfe1abb 8f0e3317 c990f64e 02a74a43 41010f65 a6510302 fd678205 488f556e
+    2d01f864 ddb9e0a7 c586186c 310a9882 89a43e56 b70bbe1d 78b0bb03 baafb84f
+    3731ef34 8fe4fd7c a372c844 6494bb94 8aec091b 4a4eb1d7 c3dedb5c 56bf6a71
+    16bb2c10 9ba00970 2cc2cef3 735f789e a3e6cfdc adf4da25 7321673e 72f37210
+    b1c1521b b7e8304c f1f1f210 581f7356 c61a3f64 2d11978f a2b2cd4b 305c5aeb
+    f65b71f2 61ee6b8c 7aed52ea f6499462 59bf1bf0 e50ab1ce e5238fb8 db0d5bed
+    66a54caa c4fef548 75f5e36d 8f20f986 4c5c9e97 d1880331 86aa2365 69702472
+    334583e5 23d9cd70 7c0e5b7e 3f8bf22e e3939f6c 96ca51ad cd7fd9c8 6ad7c057
+    a57b74a3 b6f0f715 2d0ba272 9c564e81 9c7ec857 4a64872e 563e1d3f b9d47c14
+    2f2e74b7 fd4eed90 12c3ad22 8dc066b3 8534042e 6e342ab2 7a1aef73 5948384e
+    85a702ee b31ac4d6 88750b72 d26c98f1 237ed402 7386c357 6f04a3bf 14cf3d76
+    8aaea5f1 f1dea1d7 f053871f 3b952cb6 77cd8484 ca35035d cb005d27 d880aa5f
+    b8815bbf d8a06317 f2c57796 6c3e8dd4 3b1c1404 44542156 fd498c26 b66ef9a7
+    d947d7c4 91326f61 96459513 f5cae9e1 c3a4499e 633e1fb3 ec09ddab 2dfbf0a4
+    492478e3 219eaad2 861c85ec dcfc7235 2081eeba 8f270ad6 38680d23 51c11c61
+h = cf212b8e 7f74184c
+
+k = 70b83d2c df25dde3 d4ca58c7 77892d4f
+m = ca6c3007 afe5ea49 70618ee4 8e7cd654 e504a40d a1ce6c71 0ebef6b4 f4e4a134
+    1e3dbe00 030de37c 3bdc9395 48a42d3e b28d31ac 8e28f96f 3b35520f 466ff77f
+    83299475 d9011e1c 3a880e6b 4faab996 b5c1f3ba cf4e8f58 38311ec4 a54dfd03
+    2d70a9c5 848aeafa 11135766 5c3bd095 aa4bb77f e39b64b8 d04c0840 a2226f44
+    1092f769 4de79bd5 4db9c47f c7ff2d86 86fbd6fe 8087a114 31660715 07b1c721
+    de37b6f2 ab791864 9ce07585 aba422f9 ab14b4fd f3bb2907 5124549b f640ffc3
+    faa7a6e4 8f7f6b34 58a13e4d 24377e37 45a33ed7 9a48a5a6 6c9609b0 19dd82cc
+    3374fd9f 4e46bcd9 03a595a9 79f7d095 f4278139 a2676d12 a49f18d8 961163c1
+    0b1e2c97 f3eb89ac 73fa33d7 9e7d1287 2355d2e4 4a5ad133 994c1996 f7e06b92
+    be6536cd 62a4e0a8 db71a1c3 12671c92 607be6de 5b715289 a7084b9a 71ab534e
+    5ab9bbd0 6b5bb4e4 6a2577bb d504d20c 2ae7ee84 9497afe5 5f59ff20 5542ea29
+    2cbe2dcc de87797f 0a6f9be0 c0a7eb7c af681149 80f0e585 c2454a8b fbb72650
+    52d93480 a549a6a5 bb74b3ac 21fe5025 f6c213ac 7b0f4496 9ed4f6df 9c1ed9a9
+    83cbc102 458cb558 47d0a747 8e690699 ca5d98d5 b0455d50 e753288c 7f286e9e
+    d528325e a1237729 1a8213d8 c16cfe00 32b277bd fd41b338 8bf99afc 91c21261
+    81918ea5 9b79cb9d 89e17736 f33380e0 d29e11b3 d52b0a06 8b2c9fed 9b71da88
+    23
+h = 7d4529ec 71df6bda
+
+k = 5f756639 b7a58434 69c50db4 3b531916
+m = 57aecea2 f4f728ae a46436ec 25f85988 36549871 afdffeeb f0902fb7 c353d8af
+    4309cdaf 9be4d5e5 5ae72225 8208f2b7 3cb89745 ff3f593d c7d4e5b4 41d515b0
+    c23286a8 4cd69075 cf01f1ed c76b0aee df98a303 cc34db2b c5cbbe2a a03e69cb
+    bc49b4d8 7319d167 b814c0d8 eb9b1039 3ba7e459 ee8042bb aae56c8f ce8271de
+    5d6017a1 b6a02716 ae115097 bf65ea1d 0c522c15 53c63753 434d4fd1 db91d50b
+    50844453 e919d800 9aa8d550 ac849085 5f9bc5a1 502fb690 c6897477 9ad888ce
+    c764e637 06478bfc e8dc72a4 8f3ca919 7991c68f 9e741a57 7d02aba3 47798dd5
+    cfc6c37b 05cb74e0 1cadfbe7 b717a4ba e862cfed 15c4d469 6a2c4fc6 0ab6b4a1
+    4607546c e47c4b64 fd40eb6c 0a561292 f4d03241 0ad8dc59 647f6688 9152a93d
+    787d9f90 06d3fcd9 80be41b2 7d3523f0 a478bcac 7dfd799a e4dbcec4 25d0746d
+    79cdc435 74ce3bd4 5d0a586e bcc85009 59abea60 22e71fa6 71ce9835 a497afaa
+    ef2bfed4 3b574ff4 8bbcc567 5ea3c742 d968c21b 83682304 9567e330 05797a83
+    0ad05536 9b7abf6b 9ccfb540 86b77857 a1ff0e8f 6d7e2718 98d8c9b2 800159bb
+    54b9e0df 14ba5b60 eac9d2c5 3323ee30 38e98419 81f33635 c8073e76 cf90f9db
+    0617e481 61c5a097 f0ade820 a78ad5aa 496b270f 1b6b8122 2a4a6c39 76e7d23b
+    76e267de a3f1ae42 94c4990f 194437fb 0e2b5cd1 130c8a7d fe5ea18d 1b67a08f
+    76b3
+h = 39a93895 f2b28372
+
+k = d8eeef9c 40672f35 4e2dbce3 56a2601d
+m = ba4494f8 01c733a3 0edbbdb1 d38087c1 01812df8 8233c683 01f919b6 7fbd54cb
+    fa308b2b 65c427ef afa53a41 6e3b2687 cad2a750 208594a5 dce54efd e05bffc5
+    79ce5e10 0fa681ec 70414029 0b7728c7 3f9c6091 efac0711 260975d6 c3695252
+    0c688d56 5c5b9c95 18441b3c 18ff0045 0b807cbc 314e1b70 9c3a341c acd5860d
+    9267b220 ae2e37a2 8948e200 b8f21784 c1c568fd 346ce37b e4ea6869 3d012d36
+    724d2687 8a748775 0b4fd5a7 051cac3b af632916 44f822a2 be89c10b 2d365bb7
+    7ec25e8c 59ddc226 536e999c 749b8ac3 61deb324 e9e0368f cbe18c79 2965a77e
+    20ed6d36 0ff78dfe 29989303 6bd2ed0e bcb01055 874bb770 f6c90d51 b541fc6c
+    71133cad 5c471188 8f7b807a 965b37f6 bbf66716 bc6119b0 e5ff7521 38f84754
+    85bc9d45 6cae26e7 d38ff315 8d8b8f3c 0a3e7d6f 75689100 f3f4bc30 1706a4f6
+    f854b187 a9858515 490d5212 8c4ca2e8 129414e4 3775ac55 63e5c028 090a9dae
+    26713add 4fd80b49 fea829bb cf58084a df5371ee fe28f50d d4045347 3fd61fb4
+    1feea908 f5b7b0f9 9e45c025 dbe0d9eb 721d01d3 be2d77a9 0fc53970 0eb9f6e2
+    b580d35b 84d013c0 3f02f291 cc48f8b7 910d6ee9 8a9b00b0 d32bafc1 43d7fdbe
+    1f888ed8 4b5387ca 68aa8d95 591d671e d77f973b 2796bebb ad467fca fcd57f60
+    f2a21ad6 5a8835dc 7e03f523 f7d077de 56ee91a7 f8a4bab6 85f9a260 131d4390
+    7fad69
+h = 71fa53c9 d181c1f7
+
+k = acac8d69 912c66e2 411c3907 94d6eabb
+m = 731a24e1 215acd9b 949c16a2 171c9440 111ac664 022e7488 e89d6245 454409b3
+    f4f29770 f4d335de f3a87dd0 4924aa77 d148b628 13e3af67 770c05e1 71ca4538
+    718a4119 057850a7 32d59fad c5701a74 b9bb9dd5 31a92ce7 f2b5cc47 f4a12118
+    6be3aa29 9871b71a 72b62ea3 339bd3c3 1776098c eba39d91 a0533062 7c35988d
+    b5410f90 44bed4ce c6a0cf61 aaf0abe3 3f1b47c3 1df0f83a bc66ecf3 0bfb56ab
+    ec8dbfa8 1ec4580c cf3e2a9f b63ac675 164a5759 3b69e6c7 6e0a5a85 bf6a96ed
+    1da4c837 217e6a8f 1e9dcf1a 60041f65 5431f355 4a054ff9 9214a8d8 1cf80f79
+    7c7e6a8e fbc85c5e c9cca471 d978d911 df380b3d 8f6bbaa6 0f2f639b 2e84f5d1
+    8aff7bfa 58423637 eeb62f5e da84a367 353a9117 c3c8e117 a39aa1b3 9345802b
+    ce11dd9f 4ca08431 20efbf69 e43a9223 47fd800e 1eae14cf 887f0536 20b6e75f
+    e02582f1 00076326 bc7e9b43 16aa38d6 b8205672 289e8098 c237fe97 2a06cbcb
+    9fbdfb6f 01c364fe 87ee6c2d 03b04e7b 86355545 8c8b47c1 f7f80f01 ff4200f2
+    9a12aacf a06ba630 26791ace 313726db 84507299 36db6bf3 d953e9e3 fdfdd431
+    67618000 d615f22d a150919e cf43d156 baea1395 02ae08b8 ba15f1c1 20104e33
+    9a284392 12f88841 f4cf69f9 d9392e2c b39749b7 437d37d4 0108da84 1ae1a5b0
+    b8ec92a2 d077467b bbd4562b 0873b841 2bca6306 511bc3d1 b8620485 ec2ba4c5
+    248d96a2
+h = f97ed2fc 768afcd2
+
+k = 4ef9ed56 c25f33e4 faecf0fb 0a18d16a
+m = 34c7b23d cfd5fb0f b2dbfc2e 3ac12101 b85a51c9 025d88f1 a9ca18c1 92e5bf8d
+    132b335e 54a541cc 0c604545 d63b6307 c5a7a409 204797c5 909157d1 b21ef5ce
+    b25655e4 e35c1ffd fa7c22f2 8b5cfc58 76b562eb 5ee2dd1b 9620727e 848d0b66
+    6c472dcd a1f3a77a 7529fc18 d2985f91 9e8144f6 ed7a97d7 371d5763 a872700b
+    c202c97a d8cf01c8 788e5128 325545f3 44b4d580 66506b50 3db4a358 fc59e984
+    d5781505 952828db 7545c18e 0d547d19 c2c97af1 0f5989bf bea42b74 0e4423b4
+    c2b31740 1067b8a2 991a74b4 0ad76c86 93c8c9f5 7e7e91b9 61a2a590 eb9795ae
+    acbaaeed bdfcf90c d0fc504c 04883ddf ada0ae3d 4c7e534c 020c0ce8 b4c1f9f9
+    d3d6bbe2 98a57cd3 ab717440 dd2ec0e4 654fb121 c9a5cefe a2ba71bf 99fdccb7
+    ef511c55 afab168c 63f44e6d 679a98d4 7e1f8ee5 8247e405 ee4eb039 529d3c13
+    b9062768 5241a5ad a717f89d 56cfd689 413d5cc1 a5dbd5ac 3db8689b 4c833e88
+    b00b7492 cbd4d78a 74aea553 1f8f43c2 b9a67ae8 bee7da06 e3c7e237 613b908e
+    0f7c2c0f 01ec765c 5a1ee0f4 5c9545f9 a0f1cb9b 5833a63a 1be424e4 f763e5c4
+    ba8bad52 fde9d70b c0a7beff 49cd15f1 791fd579 ac232872 4ca7dc2b cd31ec39
+    4898d4ac 7d7ed10e eac3a7be b0e2bfd5 4048cae6 249425f0 052df6f0 d0fd32c5
+    81964eae 237c16cd 891e79cc a73ba4eb 9a8a305b 727dba53 bb461f13 8a78601e
+    34a37c9b cb
+h = 6b747124 b033d6ab
+
+k = 9adcfcd0 9371dee3 6948e1b8 15015b6a
+m = a11fd763 2cacab7f 1bb0bdea eb62280b 1817bcce c332b0eb ce3177cf fbd32246
+    2a219d5d 0e07fda8 ed531fc1 cbe58925 8975e184 a71a64a6 3543a927 0ce0d41f
+    a753803d eb5c6b12 1120c182 ded641c5 50f3a863 ce5f2d30 4099d346 574a9f99
+    8664e6f3 df3cc66d 4b905fb3 31c13ffc cd77611c 4191887a c1af0126 34808d3e
+    ab5e4857 97a8a5fb 380d6551 ab864245 7bccaf93 0bd130de 48c0082f 0fec4efe
+    d847d568 107fdfc6 95bc3efa f805c24f 038ee6af 360895b0 17bb3964 c44460cb
+    9580bd51 135a1f56 e6b3639e 77ef56e4 5a0b24ca e013c207 aaf57f02 0f2abe88
+    d616de28 18ced765 e7ffee97 129347dc 0afb14a1 4de524c5 5c3f2a1c 20374e09
+    a0c35472 3fce6c75 803c5f7f 9c2bbf5f 1585351e 8dd7c171 df5cde6f 4a9b497c
+    fbf8309d 80dcac3e c8740cf9 70bd3223 d725e80a 4ad778de 408e1de6 75c4de87
+    8fb7e89b 38689d56 99c62257 bf083227 406a982c 6d8ac0e9 b5c1ed4d d9e6b7c2
+    9b1ce655 84d7dc91 d51c9f5a 33564551 eb4e42d7 cf141fb9 6e56e9c5 580a5d3d
+    96eee5f6 1ba74ce5 1abe432a 8f7beee8 21843425 21323012 c56d1818 88aa6f96
+    c82a1ea7 90431073 c19a1a21 4947d463 cc826989 e3ed3aa5 9a58ca75 13812c2a
+    75ee74fe cd66596a edabdad6 f7c3f60f 71a97dbb d6dd651a 5226dc10 027979e2
+    88039f9d e4f73984 70c1db58 ffaa9c87 c2a4f085 6a36f31e 253a832b 5ad03c35
+    33796cf4 674f
+h = 79898ebb 06c216d8
+
+k = 38aaea83 f65a220f 30183c6d 5ddd5e28
+m = e081b205 61dfbde7 c34f9171 afefaf6a 72ea667d 7c102c5d 4e097459 3ecfba4e
+    461f0407 a62ff6f6 c0554fda 8319a1a9 69fa1542 fe75ff7a 8e7a4c40 c44561da
+    ed70a8de 11662954 b03d3575 344f04ee 0f5ed5e7 d13530d3 f40efb77 3ed4c431
+    a58df177 280ab52f 9268c960 70c1bddc d5102430 221d2a8b 2e227992 b7115c2d
+    61215670 041f14c4 c506b77e c6bb0e90 43198209 74fe5249 c3766306 ea874bd4
+    470b3c53 c9607012 bd796475 e42da5c1 d57455a7 2c237450 e2dd8e08 3f9623d3
+    77ae54e4 99c9a207 c9d2e2e6 7ceb6186 00607966 e499ab20 af9ea3d7 5008fc69
+    59d56ba6 3c2b66c9 9593f03f d294c961 5548d775 1238dc97 5d61b7e5 d20c349e
+    f8f2c2fc be24c846 c60af1e5 4e95f576 5a704599 cd5cbcc1 40438bc2 893ef35b
+    8005b188 d79e8c41 aa8e3b65 654763a5 d7aa2157 38f28f77 146f4537 2185df27
+    b50ae23a 49842924 d24e8dff 85ace897 87840e29 d33e8346 0b4e61e9 f2df3bec
+    3b1f7a31 c5a6efba fde52a3c 6b0dc503 99380b05 99773921 59df4eab 8eba4f70
+    9332d22e b68959c9 b0480026 28821a22 8b52030f de86eb41 f71aeff0 ecdc6d7f
+    a8363e95 649d3795 8f9ddf2c f882505f 7ebab298 d18e20ac 37336067 1fe9ef3c
+    0ee19fa2 48f62668 121c1c20 a8a8938d 94bca9f4 6632506c fa46397f 59c0a7a6
+    1dc5cff1 4ea53103 c7db29c8 08ef18dd 8a363767 be3eeca1 bccab1d6 7e6fe476
+    a74a7ed5 ca17cf
+h = cee037f3 0d210b31
+
+k = 9c4d3d45 35d07fe9 394e1cb3 9bcf1899
+m = 4ab44f98 b5585724 b620d1b2 a0ca91e9 d2c7db1b 01912343 18a9c719 3a73553e
+    8aec1541 44fe1427 c95bffd7 08c72c47 1c023593 710bfe56 ceb617dc e64db29b
+    b47c71b0 29393bc1 057333ef 17b00b63 8515d6bb c80eb0a0 d2dd579e af80f76f
+    fcdffab8 099ba623 2b55fbce daf7e69b e4aaf4a9 1c504ec4 70df120e d1d69d46
+    a079f6e8 91c5345a ca183649 523afa65 0c244216 9822d6d1 ca44d084 53f8b75c
+    fedd72a0 64276705 41f480dc 8b0f979a 4b7aabe0 5f2cc1ab 992216f9 aa53353f
+    51146062 13d1aa44 5d09a033 6f0a92bc 42d78956 a51b488a a5b70f20 44c0de58
+    d169f6ca 65ddae4f e0020e3e fc369d50 d4122429 a0f6b504 bff4b03b e44fe5b7
+    63ebabfd ebfe3283 64876ac7 9c0116b2 1a284367 9257f73b bff38b43 f482d9a1
+    c3ea0ff9 ad053bd5 9efcc139 47a29307 861ab9db 2e9ba9d2 96d73f58 537a4e61
+    b99bee28 a69d3891 2fb0e605 deea0314 17bf9f22 6061c77a f68608d9 3b18ddb3
+    027e4126 d5bff1a1 25fa14e5 47de2045 1a4218ed 0b225d85 78c36f37 f6072220
+    ef3f523d 870ca637 051986fc e026dab7 9a93acfe fbcadab6 918a5166 f4165236
+    ccad8e66 91d162d7 8b789d97 9ffa8ffc 95aefdb9 cae6f07d 4fa1a680 2e1b8db8
+    686e7c2c 19f86737 ac3a5e75 29d55c8a 8203a4c0 4fb2acd9 002c488e 5f4a857f
+    daffafaf e254ee6e a0e03800 dde8dac7 876ce70d fda6a9ae 3fec3701 01be07eb
+    de56992d c9eebfa2
+h = f9bab7a1 d772c29e
+
+k = 788a8730 3756e7bc dee153a5 febac9fe
+m = 206c7f3a c777d27f ae5093d3 d032e2e5 dc461eb9 70996671 685426b9 be33e025
+    173d1fca 4ecb5f67 7f18e89c 700061ac 15f63129 29b5c946 10ae1ac5 11786eb1
+    403af95b e394b6ae 8f5cf853 90122d03 4c201c54 99972001 e1f131f8 7cc78507
+    0976f437 d7639444 6e6f42c9 e4bb400f 76f7d4cc 71a943d0 50d95d1b ef1f9b7e
+    cd985295 43b7a4ba 6bc25b7e e3e7059f bcef64bf 60171164 f8dd16b4 004ebb73
+    fce01257 b4985237 e2e634f6 dcc5b316 a98aebce 513d7fd3 e89fb2ee b6682335
+    d8b34231 9ca26e90 8755995b 7e7e5487 4f646b24 dd43ad1a a65c2ebf 938f9efb
+    37dce443 8a8718e4 5bd7af10 6eb68d5d 0b45baca 123e2c3a 49c8771b 8b987392
+    902ef9c4 59fab5f1 07f7d31f d74dee3b b3c755d9 261e6300 94b58189 a81de2f3
+    30ea99d1 2415f903 331fdb38 11d47fa2 0adafe0a f751ac23 af9a5afe 970b530e
+    7b39881f f2a01a39 41813ab6 1cc82206 40f25ec0 9152c9b5 c8b4a5e3 ebbdb3e0
+    2850f744 34cf3d1e aa8356f8 2bc9d42a f074c205 f6424a55 6e973c25 50e70c10
+    efa70ad8 b4ef49de 723dad0e 93a192c5 d17ddf7c d753f9e6 72b7952a 96c1316b
+    a5f2e2ae cb76eec7 b17328c4 82b544dc 40bb1a82 06fa0723 90164a71 4431253c
+    a8967637 4e742628 b38ef60a 170b0df6 cd3516de c25322b3 270e71a6 997092e5
+    812495ce 0a91f036 de6e1554 078abea9 8973eb32 4e7b5987 ef2d175b f6280e2e
+    b4fdbdf1 0ed6d319 d0
+h = 0d601c6d f6ccbd76
+
+k = 6e4df135 91f2c871 0a42b0a4 4fb3a288
+m = 2a5385ba 891093f4 c92d0117 0be69574 71be7ef6 47de117e ced86583 50db7678
+    b47382a9 b32df317 6101e2aa a52f2e55 1e38992e 065d22a9 0104135e b2f992ef
+    ed70cf93 6ec0374d aa0df15d c39f8253 749ccccb 9a16e3ac 3fc79673 befe3fac
+    03f1f417 80bc11f4 57d67c4c 4ab096b7 e2ba7c58 93ef5c64 5b2767e8 f6d7c29f
+    010479b8 877253ec 38e99fe5 40d10c56 f5fb0488 2b20267b 324627d4 4746f039
+    6da3afdc efc48249 4bbb77b7 9f95ee3e 5288331a 2c0cfc97 72ce552a bc7ae46d
+    92e66dcc d569e9c9 42a2502d cf23b47d 501dc1f5 553d1977 a6b5434b cbfdecd3
+    9d187fb2 a5a77849 b7799a33 61e9df1a e10d036c 80ac6676 a4d68134 a3c48c0e
+    a0d6e77b ed57c4b8 84b71bf4 6e40cf3b a3a4fdb9 d91cac2b 5372d3a7 d5f5121d
+    0250938f dc1c0f97 aa94fbf7 f4e75492 87e3c8ab 7c26f940 fb697f1c ae80bdf0
+    c04600d0 5afe33b1 983369fa 70a8994e 89fd24c3 8bfd616d 4e1fe762 4a1f1c12
+    869af96f e2377253 cc087965 eb7ccf9a a1a45f9b ba18a300 bdf9190e e37867f5
+    ca5b7583 ff6dfd82 7cdc0ccc 5d835427 8c6848b7 f227a347 7ca1021a feb625d6
+    cf359de5 f936ae39 e5baa507 7cc8a222 f90c4232 80d8561b 425efb28 33674a47
+    7243b4e9 d8378396 abf7afbe 65d8480c 499ff903 7f65e473 cb678be6 6668c47a
+    2ee1d6cf 80396a62 9031c4f7 a0f3501d 5beb18af 86eb239e b20138ca 33ed5bc9
+    2f57a8bb d9ee9a79 af93
+h = 9dd89da9 25c543dc
+
+k = 221c68d5 3b602423 4cb136e9 d082acf7
+m = f10b9cbe e6d4c7c9 705e77b7 77881aea a9cc7fa8 81070266 40fef3bf 0b2eae78
+    d497aacf c8168bb8 f0377f4a 2465e6d1 602dac9e f9d44fdb a3551c74 340a5880
+    8da6670b 31eaa344 b9191a34 abaa6257 0932b045 f47f66c5 8138fae0 ec189d94
+    bdd731ed 17772267 86209dbf 2fef42d8 d17fa6c1 a5a05fdd a9c66552 e06884ae
+    d87d84bc 67190889 6c3e4843 155b8ecd 006eb042 57cc23be 417e76d3 70b7b67c
+    792786d0 d887242f 2781cf91 853195eb a9bbd55f 1ced67f0 96610188 b3908ebc
+    34398e44 2f2d5d2a 93dfee27 fdeb761e c7e98ff4 2608069e 026bbdf5 7512d5ce
+    b481efaf aecc9154 2083055b 2d9094b4 2ecc9e4b f26fc026 9977d7aa 3735b3ab
+    d6e8a6dc 5a245c70 0817f1c0 3977ba8b 6dc904eb 0e5fda62 370d72bf 7234de3f
+    bc02c03c 7eb6194c d1071389 d4757e57 d8613193 ecb718d4 8be6a1f3 f2399375
+    e2d0809f 8c269868 6ec40cdc 8cca74f5 e0f25b8c e637356f 47218015 009347e8
+    a8f8d4b4 10925819 567eed60 370b1617 2c4c9582 fc067d4d 5b986693 06bceb90
+    7ced4cba b667d1d3 17a0a66e 1bec38cd 17f7089e 7f9ec8fe 6005c6b4 59511298
+    ce9ac30d 6e8c68fc a6281e2a 75e2f6e1 957e75f4 09de4e38 73a63a8d a476d96e
+    98555b87 088883e5 5e2c267b a6ea6d84 98789b47 3e7e424d 84e96b4f 26965002
+    5a357ffa 650f990f 32e7775c cc502bce 478d347a d4005bfa d54e8570 d7c94a07
+    e35ddfe3 2ee99713 1bddb5
+h = 524689d4 f3593d9d
+
+k = dc4fc2a1 445aea0c 56a128b7 313b7765
+m = 79e581f0 16a46e4a 916e6051 36173d1d f15681df 62fd99f3 1ac21f52 28e9ead6
+    a6572203 5432972e 4e25018d aa630d2a ab6a22a0 33b34965 cfc96d19 e471e023
+    d0d54533 7acd494d 4caa6cd6 213ce2ce b798dd40 c2cb7268 8985b089 3f66ccb2
+    b0f525a7 d12ab6d0 8554ef55 5a9c6264 6a189df0 6be5b99b a8cc1cec e51e7a61
+    260ea0e9 bda810db 6dcd35b9 add98762 c704ef8b 43a3be27 15dc52df 5a367ed2
+    06846855 e061f0a9 388438a2 ffbdded3 26a57572 cdaeb522 6fe64fc3 185be7f9
+    4d237abe 1c318c7e 31fa6a58 155ed9e9 a4ab68c8 a6c48f88 10a394d1 7bb0af59
+    82f1ce5b 9d906fbe b66d2d32 8503e679 b8cfa0ee 043ec18f ac924c59 59b4bdf3
+    eedfa182 4a2c6b3e 385f7b45 cde88ce7 bcfb4b14 48ae74a2 be084787 af69390f
+    a046072a f542ee44 0e33f86a ab3c594b 4544582d 907b1f15 9b6748bb 023f429b
+    4342b68b c41d29d5 d52293f8 48b014f8 113fa2db 110389ce 2e7ade83 b49bce4e
+    03cc670e 57a7d332 6c47a979 fab2dfe8 21de1d91 e77a5f8d a95d0e9a 292a4247
+    c7d8f3a1 534e1d43 549ad6ba 42dcc1d0 c0232797 d2b62f81 c63e85e9 fc39b89d
+    3c87a34c b5d1eb01 de2541db 9a3ecb31 a738eee3 09bfe182 c8baea9b 1b46728c
+    d0db5f93 6c723f16 1400d52c cb526667 f97c4a2e 0dc8096e 097c9683 8ad5c00d
+    5efd42ee 3ec61779 8623cffc 305923c3 c5788917 d2c9fdf2 89b9b3fd 0d6f9913
+    178934f6 73a2a851 038f63f4
+h = 0c882934 b3fced66
+
+k = 15c686b0 584e7092 cd1e299a b2fbb553
+m = a93f11fc fc600b09 81702c31 86c604ca 229d03d8 9a668f36 806ed4bd e51c3430
+    1a2ca657 5b893dbd 5791c5b2 6d89d62a 082f15f6 da02904c 797c1681 a321037d
+    10641e6a 7c2ec884 c1113f97 3a478323 69881e81 25db8800 c6312ba2 1ddb9483
+    b0a1f63d 6862594e c7ddc327 88161566 7f2b7fc9 a7cda8f4 157625e8 5673f9c3
+    10d01c1e 1942fa68 d15654a9 7d1b0b94 506154fa c318092a d08e3783 702d04e1
+    bd5e3af1 e8706fc7 dae45196 d89021e7 2ce016a4 66da0c48 5b8e55e5 3b9147be
+    6061b7c6 57d17701 dbcd2a75 880dd445 9632ca39 c72429a8 5b28e9d6 87384cb7
+    78809bd8 cc5cfc35 f94fd000 90c09888 5f1bb94d 02503b5f 088d8aaa cc60fe69
+    9e666fe8 8de07b19 a5f15321 f07155b1 ab559300 776ad564 78756b8c 129e7f65
+    a25671ba 61667340 f430574a 0c3f03f0 a8f983b9 c36b562d 95de56d1 4374412a
+    f95ae751 196eb0a0 96bdf5af 57b84b48 0b6beb30 8f3beea2 d761d5b1 00298af1
+    e4454008 08d63354 ef653c1d aeb97b20 8639abe9 6a0f549b 86035ebe d61db41e
+    f5cee456 fee3fcdc ded92dd9 50ee6004 8371834a 8216e9c6 e207b623 51744fee
+    5ca38a88 8156f422 e4859f0a a8263689 64edfb08 796c94b4 ff102316 375634ca
+    7b6b4a92 63d02d71 966b7a14 3775ae25 7b5f6e76 e0e3ebe3 0ed6d3bb d03fc107
+    b54f97ed 93548f21 2c325ec2 478aa019 df3444ea 64b98270 0c37bd27 199ee67e
+    c125881e 3cc9c940 f4689de6 f5
+h = 583dccb2 1c6115a0
+
+k = 9e87df68 994a34bf 41210429 0d969697
+m = 7a5c5214 d19fb5c4 983cf5a5 0824dda1 666bf5b8 cc608fcb 6a0a705e cedce721
+    e6198a6d b42299a0 34e9d590 49a434ee f23b57c8 829d2a7d 6240d673 d647525f
+    989c739f dc007209 45c3f649 7313ff6b da084fec 36e7a460 0d7f0327 c79ea77b
+    7a29832e 263cd837 7c3b81a7 ee94a1c6 64ad7d6f ccd30141 88a306df 73dd92d3
+    b8aa56d3 31f8e3d5 1fd0d577 2fe33ecf f684790c d4285251 88fce02c 4432a094
+    905f6e66 63f2e2ed 5d1b7ccb 1e5388c0 17808cc5 75db1a4f c6295069 1f62ddab
+    a3f82e87 8e57cddf 870bcb2a beb47288 6a1bf5f1 7078fdc5 3c5e9b74 edc4373a
+    f6078e15 b96749db 45a2b9ce a1a5e57a 4a425d31 2c79a1a2 434ad8f7 9d64a748
+    596f8ec2 7de8f4a2 b0f2c0f8 2ebd4553 f7d557f9 9c37f787 acd4442b 5ef5b105
+    e57d4d2d d35d1fdf 676dc061 6faa8217 c47315de 4473caa3 7eb03dc1 afcea99f
+    be907057 7efe7cf2 ae07f598 d03cfac1 d2b94d55 c1c5e834 edb19a0c bf327990
+    a399d4b1 d3bcb65f aa996eb5 5fc1cda5 53694478 978cddce 08e1608c 34321624
+    a2619b2d 2a8aa9c7 4218926e d185905a b7b819a4 c26dc03f 329c109d 7ba324e9
+    20a67619 e05391dc 20d0076f 68f3c031 9b151346 e87c5527 4732f8c1 973c88f7
+    e4a91e28 c6e3f8ba 2484559d 3957a1fe d7da6045 5dd0b78a f5474933 d27631bc
+    ca2ac666 d78650b3 2ea87bb6 b66237a8 be215925 0156f55b 31c1ead4 f2a78a55
+    c8902f11 bb801f02 fcaaeb9b 07fb
+h = da1be30c 80a3163b
+
+k = e59a5565 7fbc0965 ac38d08f ec74655c
+m = 4c6d50e9 e49f993d 5a6ea7ac a37e650b fe693a65 a445568a c3e62ba5 268b8443
+    1915fd73 34c960fb bdb45677 d33d7245 10797f49 b0f69af9 ed12f6fd b1006362
+    5413ee12 71d10c22 dcd83b79 c4cf7b67 6070ef83 4baacdc9 f2c54c58 3dfea235
+    aa34e22c ba21edb6 bfaeb98d b2647996 91852114 fab8ae38 20f1a62e 228587d0
+    b238885d 4e01b0c4 abe8c41f 3706d8aa 66f3d08e 1482ad35 00c7297b 03c6f4c6
+    277e3d0a b6b9b20c ef6fa080 8c298aad c86b3d01 9604fa06 ccf70062 d1172b26
+    55f6b2a5 fda9fd94 23f39e0c 8e37c98c 8860a09e 8c3895e7 3bf59cbe a23a6526
+    e697797c efb213d2 aa596bf9 9264ec79 ae95d1ab a8de5255 44587100 55258f76
+    87a5ed95 a197e250 78948564 30f0069a d651a065 09b9bfce 923a7f30 c274f092
+    edb83932 784420de 29b07d2e 9003f482 dce11490 235b58bc 9471c16e e5e9e864
+    4b0c2235 329a37fd 487f8aae 6ba00f22 c6870472 b981ff87 8a5c8678 cbc00103
+    eca0d91a fb70c1ef affc8cb8 046c4a20 d55ffe9e 16669655 75cd01d4 f6b28be4
+    3edd7342 f17b9bd2 39caa63b dd906a28 2165cad9 125277ae bcfd6d9f 2ee61c1d
+    bde907ba 682d1d73 3cd01dcc c09fdfec a4496444 c34931e0 8ab314ec d507335e
+    2029626d 301deae8 75c5e34c 69555c44 2e7d6a36 2fa6d2e1 2c56a130 97bdd892
+    14bc618f 82b77be7 8891f7b0 a36cb13e 126dc452 e011bdc7 4281666e 994f393e
+    51e4e183 635c5ebe 0fca947d a2d781
+h = f71e1dc5 b3d8fd65
+
+k = 6ed8e963 36c71177 f9d1e8bd 7f546509
+m = 8cab98bd 364e7da8 79aed5f5 8b4c0286 94b4f80a ecc33bb6 319761aa fcb3fc2a
+    87eb44ce 54fc0f25 8334b204 fa478882 794cd65e bc31a809 83983fde 677ecda4
+    8e0bcb7a ef857dca baa5f75b b00154ec aef3026c ec6f50d6 5f7e5864 e9d94386
+    98823e88 a992adcc 98e74355 9509c5ce 00efa565 504dbb9c 1a702f75 b852a8c0
+    5c625c9a c4ed83a4 e5c47584 06b50c07 199b3489 6bf39bb1 d17fe9f0 d72d6a6c
+    65c2e9fa 3dad73db 4a8ba139 9210cc9a 595e1174 2cdde1d4 83431d83 b056278a
+    68e0db70 f11e0e37 f1c2144f 7b6adcba 1c590d37 de7b7d0b ede73e10 735a5f02
+    a6f61f2b 255473d1 2d2f2bc4 81ffa24f 1b890a13 5978a8af ab5ac95c 6cddccca
+    199a5a29 f12cbf2f 01ebb6b3 e2f02b99 6ed346eb f5d80050 e4a98047 09f2ff2c
+    9c9e42ab 77fa536f 4a35fc32 61b1c42f a506ee70 5f140da7 77c68d5d dab50718
+    3500eae4 a17f10cd 97d939e5 d29a2acc f3826c67 83d99455 25e10230 89e3c5bb
+    a8833bbe e34a7f5c bb2b8dee 6375abb3 18577316 9eb26575 f8a3321b 80371e51
+    31049c00 898cade9 a7aeb129 77417f55 17801828 3ffe1ede df1eb1f0 4551a2b8
+    aa00ba9a 87b25807 f2483995 13b29606 788516a6 055feacf d5e890ee ea371fa4
+    fe8608f9 f388c2af 3852d686 7a4aa296 586423f1 3f648992 5cfb9578 4704fc0d
+    9f4bf21b 5905fe8c a445503b 5987176d f26906ca 9621ebe2 a9717872 f02e4ba9
+    79111e66 073c20e9 20c612a9 5f9195a8
+h = 15af75ea ea162e95
+
+k = 9476de55 e74559fa 7ae8ac9b d33e0044
+m = 9f8c1b3c a3f7880a f238dd01 e81ebc00 709d3d92 fea790da f0731aba c2ee74a5
+    3287c0b6 d697d48a 5c730364 175f8fbb 101c44c0 364425e8 20f1c27e 104e71d4
+    108988b8 fb160457 604ffee0 4650354b 2b9c2357 760f9a31 44578356 9a6e61b5
+    00d1a970 2b3ca1cd 20150748 2891da80 d922664c 4bcca924 212a3807 2b1d7937
+    03384b55 53b06e28 c6320807 f6a36b5b e7bf1699 01c6210f 2a920359 fded31ea
+    44f21ffb 80d86a8a dcbc7423 4c26e6ee 0815c856 6b326f4a 1c056a69 53fda85e
+    e70a27eb 8579585c 020af2e2 a76cbeab 24ddf36d 4255da5e 2e69d4cf 9a6acc76
+    74223349 382a320c 6f38f992 df97f10d 4a44f894 de7c51cf 23b12187 69e96ca0
+    3cecc5a9 ca8d158d a4e1fe69 f77f177f ded80f87 f521052c 0c6c00ba b8113a6a
+    4c2f0d37 72dd2bd6 b1b4a5fb 4a31dcc4 864cd21b 49b1cfcb 9d358730 8f612216
+    af12f8f7 c4077e1d 43062aff 92f2597d 3c01bbef b9700d8f 3bcf2712 39f4207d
+    fa847997 7830ada0 dddaa0fe 5e42e83f 572e9f0a 7ce55ccd 495c3aee e7010f0b
+    50e6eefb b3fd4f1d a14772f0 37fc70b0 bb9472a8 ecabcd09 b0a56ec5 4a7c1b80
+    f2c07f9e abb09d99 4bf567c0 fab8480c d3ffb437 72444ad6 e655a2ed d68235ff
+    a72498b3 36ceffef 54360ae0 bb7a1316 ea2a2647 9e220ef4 e96ab483 1373d26c
+    ed685534 509a8df2 c7d264e9 a139ba42 c1268b4f 47305571 8f759b5c d58abefd
+    ebc05f05 fad37051 9a8ffb46 0119dce2 30
+h = 44406d02 1da8f226
+
+k = ae077a6a 5b1f936a 04e54153 2aba9128
+m = b89bd914 71a41f02 caeef0b3 a1975026 38bedb21 c834014e ccde0bb2 b956e260
+    174c8183 bcb98428 0ef776dd 186119f3 2192ce5d 2dc15b86 c3a9877b 292ddff1
+    0410048f 7b6c56e0 2ca26853 2d8d2f27 8f3e962a b126c5f7 90814842 6c39ca2f
+    95ccf1ea 435110be bc8b5f34 cb246f04 4de47acd 47d24bb2 e30c164a 59f83cf7
+    0d70ebaa 9c8536bc 11b03174 d7d86927 8e89d590 0ec4dbe9 cb5ab8c7 f8f846f8
+    10c71513 0d948cc5 f52fc359 edf2e034 5b2090f7 00e6ad4c 0eaafda2 ce433767
+    d0335be4 61434049 19f5ace0 31eab9c7 2de5e07e 47da9db4 7fb5ab64 3eb0bf38
+    2e89a890 4560ee0c 5e9cd192 1bc66204 2d82ff6a c8d46b04 98e321df 4aa734d2
+    6f0eaa47 2913b56b 550b7ee2 53806856 ba4872c4 6bf8cf14 ba9ef0c4 410968b7
+    37a5adc6 b11deeea eeaa8435 4797b7fd 28a6ba03 ce440291 c7a25883 2f83006b
+    fd4b67bb 1467eec6 562fa353 56fafd81 bd4e9680 231a7759 8dc20438 369977f2
+    3a70dcf0 ad960301 c525a89e c86bff1a 77c47140 a6b94c2b 004e4f64 06b527e7
+    595136e3 dce746f3 6680f6e3 38346d40 13cdff58 bf0af838 27f4efb8 5f1f607f
+    55e93967 c6eb4e60 0847ce61 81f27258 47e5a811 60206814 36d05996 98aac915
+    8b455fae 2c374d92 41ed6ada 39c0a176 e741e3f3 d0bb69d4 fa773c53 453cb649
+    009253c1 16d3c70d 41eace02 b39a5043 2eec8764 50d384ca 3a1c0f27 1ccc330d
+    73f643f1 a6cbe93b 955090c9 4e90ee2d c129
+h = f1ddc67e 7640a61f
+
+k = 1d7aba7c 9d4bc169 a76c9148 e62d625f
+m = d1e02b14 e8d05d93 d40ac8ce a5f00eeb a64bf488 22ec9e5e 2589207e 620c1ae7
+    5f622943 198768a3 41287cdd f2c30f36 3cdf1323 68215b2d 1fd03fcf c3b2b6ab
+    b8fdec15 c67be86a aa299ca0 35d07df4 210e8b45 325dd63b 2f5ffa64 1eec666d
+    dc57f8b5 338224dc fe49256a 9c0572a5 5f686cb4 1b66703b b377db81 f2ec9288
+    6a621598 cac08ece fe50f911 35abc72c 3417eec3 66087817 e4e80fbd 599540b2
+    8a5b0dfa 83faa8ad f6f0a97d 5bcfb4dd dc1890f7 479e42c7 44558b68 1c348eaf
+    73a1ca9d 9d547d53 d26c6848 5b125132 517dd02f 058053a4 6d166176 415df006
+    7e83ba50 69e5d920 2ac96f9f e1298503 cf8ae042 b7239ae4 ffe4d63c 13f1259a
+    ad855ac7 97d57600 39d1ef98 7052d9e1 a09a04a3 a69916f0 cfc891a1 ae487d91
+    cdb12a2a c7326218 5a989593 aa7666e2 0c365350 5a8aa412 f893a735 793bbacf
+    4287473c 306671d0 a5e370b9 abcba007 48fb5c7f 82120209 2c717e47 171407c0
+    7a4cf11a 48a93cf3 42bbeebe ceef080d 0d4336ec ee177071 03bb80d7 a0980f5d
+    6d0c22c3 44789cd6 0da21de3 e29f83ab 985431ef 1044f6d8 f3c17afe c8c310ae
+    35b8d347 0ca653c5 2b857b90 847db960 d0bc04a0 41a2862a 1607d3e4 229565fb
+    5e928f2a af7412c1 c9bea4df d2f41c31 e7c45172 265b4834 78a825fe 06363999
+    95c34cde feeb9609 055652a0 d3bfd01b b671d761 7c4a81d5 d34461be 9fdbeb48
+    f137b617 8cc77c1c c98869a1 eb1a3214 7204d1
+h = 56cb470c 526dc1df
+
+k = 7d0825f0 6c918ef9 4e5706ab 6eeaae20
+m = 249f57b6 64ff4bb6 a79bc3a8 728bab6a 6f9959b8 2c2cea95 8207f0d5 8b0ca486
+    b10f49a3 ee36def3 1bd6c5ec 3630de47 ef5a42f5 4168a17b a6632295 c5b41777
+    9ee6c13f 2f52d24a a7dbe754 96a061e0 34699b09 82507197 2dea83fc 15a7889d
+    ffefa74d 3f5bfedd 7b6fac4f e71bf3a6 5fea43de 2e357961 6b7b61dd 2e915d01
+    9903c866 1375b5eb fee40b16 28d79f74 b462aa41 0e4586ac 716b2c51 b385df7b
+    972498b1 86d6bc5b 7a740b75 bd3a3bb7 47e3776c b6b5e925 972897e0 4db1d4af
+    38421097 84e8fbb0 c354adaf 748c8e06 3fd8a16a c217a045 673f73a2 0ac0529e
+    c97f20a4 be479fa3 83552237 92036558 73d0f4d6 26a9f590 8d9f6fd2 89c5ea63
+    7d544adc 7c401a55 3eceddb7 14fabde8 efc0b11f f0a4e3a0 b4da06b0 bc9e1b6c
+    ae64a9eb 45e9bf8e 15ca9fa5 187a560a 1688f84f 2128241c 3eeac6b4 d9b6cbd2
+    4e5418a5 4e59b2d0 36789ee6 d738a46c 5c37fe70 a4a03559 05e53265 5f87364f
+    61b75a70 06c0a065 0530a046 529d13e4 7b655c2b 6a2feaf9 a20374e0 87a5e3d3
+    a6af291b 96de6601 697a63f3 29845938 1350d5e2 6f7c354e b8c7fc0c c4753eb7
+    68fe48e3 6bd2bfee 95a9cbd4 90599bbc a06fa9e9 03921e57 d7c3036d fea7edad
+    1bb93740 74e6aad4 55be4c5a 9a753fd8 7331326a 09e13265 84e30e22 b441241a
+    9d41aeda b0a114bc 1994be88 98b8f912 8cce6129 51a625e4 f53c64bc c0a16e9a
+    cd7bc935 0c1c32da 31ac2437 354eb5e4 b6651985
+h = fcf376b6 5b1233e0
+
+k = 68cd5aad b26849a9 891c54d0 66c819d5
+m = 1b69dd90 1fca575e 8626b5c4 4e5d87ab 17d1dea2 1a9dd678 ddf25a6b 36bc64ce
+    479873bc fcb9af69 0e21ee76 a661d1b8 eb969413 d41cb5c5 bf4287a0 cc963e71
+    f7d6a4a6 9f35a57e 352699d8 5ab19c0b da91098c 3e8ca28e 0a7e794d 01d7b67f
+    9d0a5bb7 31de2cdb a314d701 c667d190 e7cd1e83 977ed3bd e8cdb139 8b9b85cd
+    4476714f ace966e8 84a4e278 75825ab3 4e3931a6 2ff91092 096c324e dc16014b
+    581b1b67 9cc9e876 9125c9bd 99162f3c 728ce1d1 8bddda5f bd747c4a dcb8a861
+    cc642e48 0140f385 5a84d9b8 916578c3 62d7bcda d3614bfe aba8c475 c17342d6
+    47c476ca d9a469b5 990561a8 fe89ff07 eb4d8f1c 4a382623 b8b2fe2f 96be6865
+    e3aa5b06 c873bb4e a6aef46b 19d59862 499aa62a 4604c2c2 80842a45 0e9d71bd
+    af0accb8 b4bc52c2 ee0d8d5b 598cffdd deddabc2 64cbf021 be9a797c 4387458a
+    b1bfa957 8d9d48c5 cd137bcf 2f58e4bf 4904c980 57648398 718b40ec 7d635315
+    0250a447 92dfa35f 0e95c84a d1bcb657 98041902 7622e1c6 fa3df254 b8d19bed
+    4a4303bb 37553712 0083f936 6a0f9ecc fa12f06c 74f14786 aa1dc3ef c7b293fc
+    9b22c6fd 70567ffe 04460b23 2e13b92e 8565966f f86281dd a2317b3d 282acc05
+    808eefcf d57b6d6b 9fca9aa1 b5a2df38 fba6f78f 5fc09fba 57c31654 b8291f08
+    03de3411 ad1b67eb af860df8 6d87dd97 5a7be130 de5e7083 86ca69d7 41538238
+    45904d1c a65ca2e9 5551d6e4 1949c932 c55142a6 43
+h = 35d9ad3a 2b639cc5
+
+k = 77e45851 85655098 9ba35775 2c57da11
+m = cb293393 d7247b6f e26ec0aa 2428b05b 890392d1 377cc6d0 95c20e9a eb3da398
+    d571abf1 090bdafa e4ec48ea c1b8b0e8 e5060189 246aa4e8 f78efc4b b68b304c
+    d33a7a59 cc5644a9 c986416b 646dbe03 629030f5 a25947f8 d5d3a2c0 4d8ee25c
+    6a4a15a1 5f61b418 ad0824e6 693731b6 427677b0 60af85a6 56c22d10 5d2cf3c0
+    32bf5837 8bfcb62c 4435265b 92bb1551 36f030bb 9b1e7aec 489d4fd6 3f0e7f48
+    c69c8c29 b8915108 c0525efb 86a32997 2fb483d1 ce337f9d 7d26d98b f23b5555
+    9a04512b f9625ad4 03a697d1 577b8b92 de776649 b5368c5a 81273eb4 a551cdfd
+    a8d56903 cdaeb44b 3ab37e25 d04ea77d a2e39a6d 88359701 f328c75e 7885dabe
+    e35006c8 bad87f82 50e6312a 09686f34 d0891e42 69f69bde b960e6b7 1ffabe30
+    c183e413 686102bd 10f09de0 eedc2af4 7588271a 50e6b6f2 1fb0c228 7c3cd9ff
+    03721ff8 e315a129 908f498b bbbbadb9 82e09dff 510f1263 ef7c22bb e6b43384
+    07df4f1f 954d6ad6 9a7f3c71 cb7c0815 b7749805 cddc31a4 3ffc1aea 4658442c
+    311612cc d1a69c15 e5d8c523 5a05c4c2 0b7175de 28cc05bd bc240484 1268f64f
+    234aa2af d92d8a39 92458f7c 0540d926 2b0e56d2 6a692f62 164d3ac9 80574a83
+    0f8832c0 9c4c4f17 a16b8785 7aa0ddd1 3f2e1c17 4064c09b 43060429 05790b42
+    fe41f179 1861b637 3ad1c5d1 ce346952 b7b3d6bc b13798f5 5b4f9f4c 70a6d92f
+    2b709525 4c9cf365 3111d812 ec696822 2fda0aab d0c6
+h = 312dd0d9 ca6473ce
+
+k = 5d275d16 a4bbdfae ac351466 238dc8e8
+m = b7b510ec be2637ce f72f5021 5a893236 9c37df40 a177bd94 7acb27b8 975c0ce6
+    321638c0 6f3780ac 19c5577c 7fa96562 c48e70e1 6b32dcb5 09136452 c8e810e2
+    96c4b8b4 ee9aebfa 43aee704 589cf436 0a2c1b9c d91e3bee 4f5e4211 96e790b2
+    ae1e4f01 530216dc eb346146 f7ced455 4d486fd2 8f5a7095 b8251e4e cfe5d1d5
+    41886132 3e718212 d297c439 29fbd9f1 757aa687 3be70ad7 76fd07d1 21b9a00f
+    39a446e9 bbff3c49 9ee0e68b 1ce48c0c eceec33a 1b56b9a4 6484b365 8abf108e
+    ce7400a5 390a84fd 4f53de60 f5ceec38 63bab91e a415b528 8c309e1c 054d5d0c
+    c4b5074e 3babea79 703e6837 b9039ffb cddd801f 1fcaf1d9 55cb4b19 1f543e40
+    0df0928c 19dc8e85 019cfd87 43e285fe 9f1b99f1 526cb936 661ec111 857de754
+    7f56c0a0 09d59f5c 165d6ef6 ae0820ae 40fd15fa ce7f9ae1 ac4ff005 2d6cf09d
+    79b2dcb6 47de753e fc020e53 c0cc3a87 47690880 5c060ae8 95576afd f255b244
+    339e4f3b 9a863414 69d446d0 7b46e022 60ff30b5 b21ea0ca 54e5fc98 e82db78d
+    70cd0616 c412dca2 d5ed4f6c 0a23d6e4 c58b3ecd 8f340bb5 c683502f 7d82ef42
+    0944c213 31798d99 69f97fbf fd946035 f3afe99c 42d261a1 0bde930e e38e1d17
+    7ee9df6c 763678ab 108166d2 7b08db37 45d963f3 048f8327 b30204cb 026cbe17
+    799a1bc1 e4032f02 70679d5d be11a529 809c3c4a f666fd00 f57eea00 f3fa2f37
+    101091f3 90f98b1a 268181f1 3bf59978 7503c93f 0aa15d
+h = af5b2516 a6251ebc
+
+k = 5e3bd05d 982fdab8 6190ab90 1197f6a7
+m = dbc9c801 8e30fb76 50af5ed6 de3c4a9d 149dec4d 47b7e155 f855add9 8a2e8d8f
+    106de7e0 0f1c1c41 0d4dad07 7499f7a8 91285b39 fd12a4a0 080bce9e ee34c36e
+    5b4f853f e422df29 5e62d930 f89702a5 905a3798 c0d819b7 70512b8b f6e39557
+    6e9e70df ac248e4b dedadf4b 0672e3f6 7977b29b b036f362 8f84c64a 7f37664b
+    7a6e3c71 9b7539b6 70ea269a 6e4045c5 ffc2d78f 51bfb8cb 29fa62e6 d0efb70a
+    0929c261 0895cf08 48c594fe 8244cbbb 1a6ee58c db03503e 3446b705 d98a85e5
+    1672cd55 7e8a62e3 dfc8bf07 a962f733 d0238741 0b53447d 9c115769 f25b3137
+    2536c945 66c81738 1cc85918 312c261c c195de14 9d7ba640 3e488699 75081296
+    ea1c53dc 6296cd38 fcf49ae7 1a365e5c d621ce52 ae08606a 6070a8b6 a44bc576
+    c4583a67 2574c1ad 16a0f12d 7cab9805 468b386e 3e5cf1b4 f177b9eb 284fd564
+    8ea889be 7618625e 7df8500f e6818c86 b12fa133 61510cdf a06acdf5 6b9b33c0
+    665a2b95 e8969c30 e22f2b08 4619178b 9614396d e52b662e 943585ee c695fd17
+    8f7b126d 46ef21f4 1d4b69cd f3deaad0 1244d474 49f7bb16 24e6b039 11f551fe
+    cbb41ef6 c8a9fa53 a184cb9a 8b6b2ebe 21a5f366 41bd4fff 1576d28b e1336a63
+    9c9ef6ec ad68dd42 54a33b6a 4400091b ec026213 fff8d38d c09a5ae2 f00528f9
+    27d8886e c22da625 eea9b9bf ba321951 eeb8e96f 3bb8c29c d62e68c0 d224424e
+    568ead07 ebf26d16 9ef06b4d 124f4881 46d3f326 923b1c4d
+h = 1a1e7cd3 070b19d1
+
+k = 12bd77e1 7268ca5f dd245cf6 47540322
+m = de0a2492 29267690 5dc2ac2e b26bb5cf d8f80d4b c0fce25e d4905176 216df00a
+    f82c6067 ea7e409d a81a51c8 64488f4f 97b9d9e7 36833a31 38ec9d57 0277176a
+    bdd63556 b8118f26 c340247a 8f682a64 f1140d46 49fa47de f7d23d83 e8a4ab6f
+    51698559 097e1de4 98ace64d 256bb334 9d3c888f 1e951d87 7ed2ae2d bcadb685
+    7dfd3beb dcc29d7c 7f895ff2 bb75b8e6 dc1a023c 8cef8b52 ebfa2aa6 9fd7bb0f
+    591f05ec 64bb373e 98724e08 f42bca03 cbe12555 a8be380b fc76c73d 96360f83
+    9edd127a b4c79d41 8dbf6d8b ea078db8 c8523525 2e19fbfd 48d7e67a bdb64176
+    16862e14 d1bce919 fbe74743 dcf5b85a 9fddfc56 43abb6df 661f64f5 36c2b9e6
+    77c80283 d3874d8c 3ccb9e7a 11742f99 ac40c36f 4e8e6ecd 07a29fe5 d9f20c39
+    f992390e 02007b85 43c648de 20611d50 dbe1f6b3 9dfc9839 150a3ba3 c9c0432b
+    e640bb6e c825384d 35bf6cc3 47970fdb ed487b5b bca1673c 596b29d4 8cd147fc
+    6919924b bf5b0667 1ea08cf9 5f657082 a14c1b37 97e753e9 83d34dce f047954d
+    d8cedae2 6d5d2a90 9fa331ca 62bc6eeb 762a7cea 96bf9a0d aef91090 1074f0ae
+    8f26ee77 fefb50e9 fbd9dab5 3afcfeb9 50321693 a6f652a2 4f071c04 0849d662
+    8f521b38 36bbe07a 5d167e5e b262c7f7 a2bee36c 3e56d903 098fffe3 38f03c3b
+    1a5eb68d 41bb4be6 fb8e864c 3ea13f94 473a5ec7 aa95d972 51106e95 6380288f
+    2a9ebec6 7665e38d 5559f57d 2acc3cad c71009df 5ae9cd68 3b
+h = 84f3f83f 92a0ea84
+
+k = 32c70f18 8b2c7de3 ea0c7ec0 25c733d7
+m = 4af87879 942fa165 bcfaa9f3 14eba888 99be6aa5 fc483085 4560f161 1d541263
+    b0cf416a f029d93e e8b391b4 891de520 460edcbd 6392bf6e ab30a130 398b969c
+    8729b849 327d5407 9516ea6f f0b040c3 5a72d84c 549444ba 1028ca5a 79b3cdec
+    2e439ad8 331a4fdc 01c40caa ebf177ce 3c46399b cf2be386 4057ebde d3492397
+    135be795 2e8c93d2 4e9b000e 7774ecec 2e1a2321 0be20d10 5377d4a3 40cbb5d4
+    0d997780 e9c97213 d1c6d4f2 d506ec05 b77981df a0da78ad ee577588 2211876c
+    b40b8161 0047b916 27cdcf4f ea32724a 5e2cf7dc 1bc660da 3576442d 93fd6e60
+    44fad11c 902e05da 3e8909df c9a8485a 55c4f060 38e8e19c cbb3b86b 5a1f19de
+    c12668f3 63209ff0 2a86febd 25ba17f9 fca60797 e8b00b08 f275ed59 2b213de7
+    de4d4a40 29561453 e5101751 5e282fad 193fdd18 2a08034b 790eecf7 55d11733
+    59d97693 fef89e20 33db39c8 0d725f05 5dd1f69f adc3fb80 1196bb62 9c3c1224
+    ca88d2ef c8efc828 a21ecc72 6b340794 5ddfb211 8d022149 6b8cec82 0015bb74
+    4f9c461a 15b2b8ed b9c5bd32 331a34c6 709803d3 224b926b ec2901a3 a158241d
+    ae4f23c2 baeb57b4 8d73f1e0 bee3d74c deb21fa9 9cb11414 08d083f2 dbeaf4f1
+    5dbcbe71 29e0cbb8 39e70e7b c6dc3512 de49244f e96fbc07 d43bb76e 9d2f72f9
+    489c40ee 4024839a d8d3da26 44831f63 bde43e9e 952fc267 d8594b3f c07c9313
+    cc47f657 39e14506 5a4f65ba 144df14a 9b01f246 3ec45e09 7585
+h = 7803b831 0ea10425
+
+k = fb15139f 885ca13b a697d42f acedb60a
+m = 1b3652a4 505d33d4 c35f5f7b cc62f9b8 4aa8602f 7327585e cd5c42ce 3f6f39f5
+    dcedb0b0 7187ce1b 3a161f6b f894275b e1af60e4 f1c15bf9 3f5a5fdc 4a196c26
+    4bdf2be2 4b85c9f2 a4c4bdd9 bb3ac9d7 71b4a378 10c9e494 a2cdd34b 99b4d54b
+    0379ce7c 868794ca 31354fa7 e792379f 0b1f718c a56c824e 881c82d2 8d3bbd6b
+    990d50fb c4f68f9c bfb26559 412c40d5 1b455c1f 710cbab5 2ddc40f5 2ba5a6b0
+    5dfe8790 8d8bad41 82b58fa1 699245a7 ac083dfc 29fdb856 fc0a9866 7c4f87cd
+    1359bda7 81b95f3e b323a6cf 05db94a5 e8ab4d4b 0d711163 4c248db6 73de3faf
+    8d9c1c28 53b5d53a 14142d33 c4f7bec1 469b23db 62067c3f 800ccc44 ff8dc7e4
+    1905c00d 62addca0 86c228c1 dacbb202 28aa146b 19d078b5 7a214ced 63f5c4c1
+    164c1897 25982fab 8095b130 a64b9cbb 0f433c91 5909b9e9 d2393364 8b03e87d
+    21cf4938 e4eef200 07998d41 ee6c0095 6ad31e30 3d652385 8fdeb6d1 4015ecf9
+    f1255eb7 fea37a85 6be0dc41 958b38fb c543723e 44660485 474f3db8 1dd03a39
+    260a6573 e4c150e1 820e5d89 4b503ace 4c3dedfa 9dad5e4c 3043a067 390325c7
+    90bc4e39 a4a1301d ff84b3ad f9db0892 e30d863f bc66d80e 085887dc 5b42b077
+    0616fbd8 0f972830 3acb0a8a 0d0aa94b 415eaace fcd2a5cb de8670e5 ef78f0ef
+    61ff5b6d 4b3e7afd 63f9bf4e fea33ca4 d1bf4164 19defab5 39489355 7c2934fc
+    e78717ea 5c7fe51b 7d0db31d 64528076 ad35ffd3 03bb8b45 7090ee
+h = 18e5e997 d2ea816a
+
+k = 65ef9492 1931c7a8 3ca6e8c4 13021917
+m = f9b2ad20 33b122fd b4fb8090 a937700a f7eab2ab 6b922d46 b3579ad4 fcf17d7c
+    e6f3bf64 764cf647 2b93d1a9 b9900df0 5adc7d19 df812165 532812cd e7ddaa77
+    d069e3c0 3a9f5549 72cea1e4 460f954c a613514b 398d2e95 2e530268 fb4df9e6
+    e1b9106a a1c9f411 1a5e3057 025682af f46a7019 cd531d13 f30e3bf6 0842def0
+    ca0f4ecd b2c0301d 997d99fc e5109af6 cdf6c96a 54ca5afa ef5918bd c3e05240
+    23b0c955 b00ff875 7a63d615 c3e675b2 10bc0dd8 495db4d6 14ea2c00 eff8b72b
+    62b3f4c0 94e94467 744fcbba e458b770 96f2bd8d b36f486b 041f5f37 351d2698
+    6ee75e71 e832877f c3dc442c d7f2e12a 441b559a 878fbfcc 06c42e7b ac2c2012
+    7efe004f 109c480d c5ee121b d739c07c 4345246b 55d1f78f 30ff7d4b 08237610
+    bee664eb 91f52070 bf573aab 1995dc82 1d325002 69f1b351 f5b172e2 13d3e4dc
+    611a7fc8 62b1ab93 ec63f2be 9773cd72 4a4c5bfe 3420ceef 5183f435 69f6d0e1
+    499df4ce 2e501b96 14c77d9a 44e6e398 0db49eb6 8765feac e7b546a3 c5539937
+    608756e4 66a3ba61 4a11cfbe a1e35330 12979431 d80dca0a 505ffef2 6bc96926
+    a2d577c5 21d2ba9b f885866f 4d1f9e66 884e2b13 7c215677 a1d0cb6d 97689d48
+    3ed0bb04 2100e132 85d58a0b fc64c534 084731d5 ab7b6d93 f12f3fa8 eebaa056
+    c8f6c390 2cc29513 9285965f c603e1ec 9c915639 4bc753f9 04e2c627 7dfb47e3
+    0e80df10 c8b9aef4 8f8e3e89 6f6be393 16d187f7 7ad3d6ff c93a64aa
+h = 117fe2c5 d738b440
+
+k = b07c3eee 3f561e9c a64e3560 d4d2aa60
+m = 64b0e5c2 b0ea4414 06085405 0b033e68 d3e2e868 75703d43 d6cf37ab fdf9023b
+    626ba425 cca40395 c1ed2cf9 0387fe01 7964aa78 975aa3bc 45cc6fd6 dc3c7b86
+    f2977336 9ee21e64 e2ff8554 8f72ea4e 6071dea7 b2ea5892 3a4f7643 28566bd5
+    8fec5598 9928b267 948684ea afa16b3e 7dea8c66 9745caf1 0f7fb9b5 28b13c55
+    513049ea 47696ad5 f476bd1d 7a43082d 57dff985 876681fa 220a986f b287ba60
+    7200fe6b bd1ea9ab 9bc3a6de 8c7f3548 c5f67b2a dcfbea6c 34280d50 0b6d8ef2
+    845ba238 062300c9 1bba1809 80714249 856c4908 8164733b 0f733790 6f34ec31
+    80f85e20 a4c1fe6c 8c883cfd b0050c98 75314546 313ff30e 557abf8b c2a6e231
+    7858257b fa48e827 665838a2 af41efdf 47ad20e3 3ccae948 522580bf 1a3bb10e
+    59f3d203 bb0adcfc 5183fd0e a164db16 fbd06a0a a1ad7343 f6de7994 4a570289
+    88155915 76037d5c 7b214671 7fd7d8f1 44dbeb50 c2bb0959 e8690d76 2cbec61b
+    6719ace6 a73c87fe 06ceab7c 57afb46d fd205f8d 5d77f404 4e36440b f6b71e64
+    7bd2853c 014a5794 64da2be3 362d0f1b 7b7b334a 97e61f79 91edd9de 7c7ebae1
+    13addad1 755a7637 a818d58a 24d9a656 d3515453 0e29eea1 488e79ff 8fe77992
+    ce2c3535 ea661df3 a02a2659 2434cc8e 3389cedf caf30a8d 75bdd4ed d9d6c1e3
+    4615b417 0bce5879 57b235cb 58972321 f55772e1 1e28986b ce177345 6e8e406c
+    b0470c29 984e41c9 d93420d6 00ddcba4 1a6cd703 594750ec 0792e7dd 03
+h = 4f912cf9 d3052b20
+
+k = a0511a58 728d5680 316bbe2b 23cbd027
+m = a17b7624 cafdd699 00aeb40f cf1150f6 4680fa65 07ee92b2 fc5454d4 73c2a8f3
+    8ebe7cea 28cbc5a6 04304400 2031b4af 314fb81e b5b568d1 b0135a9f 2f3f3610
+    752c0d55 a5de9a0f 1518834c 8abd18e7 48d0c5df 21aad0cd 336e3292 8dd37bdf
+    7589cd0c 9160f140 29914765 c259b965 ca2fcab0 9290e092 3aa18e2d 2e8d467f
+    5cdc87f2 74318bf1 5630996f 60e0d383 a4c5eae5 68170ca0 6b8f5b7e a1923d04
+    98f2a79b b98c567c bf9505e6 cb44d9d6 0212f214 d4d6c276 3e3c085c ccdcdc08
+    857f1c8d cc608286 20d4a2c7 818e4510 80a3f978 910842f9 5f952efa 6be9d77e
+    86d14e53 5bc16264 2cfd27d4 9b15075b 7bcd0dc8 7725af1e 05f36f61 d51cf82a
+    4c3b09e4 1afbd344 eb00c39d 37aee0cc 03b92eca f5e4fe77 e4945463 3195db1f
+    3af105a9 4c329607 43506a3e b52e71e9 c0223223 39328637 5f4c1284 b1313417
+    6166edd5 3bdc5964 346678bf 09c25515 b60528dc 319f22ad 7f74c209 715dc517
+    987bb4b1 cae30f62 3f4c4224 e0131779 958e9354 06ea3d34 094bdce7 889b9835
+    b4babeed f46181bb 38b0d703 55bb4f12 8d0352b7 aa4c65a2 526a38d7 86b5fd90
+    b44dee07 785903c8 ddd3fd9e e67c453d c83b8b20 3f774b07 16dee9d1 62d1b3e2
+    ed84c25c afcb1b6d a41c01bb 95995478 ec613c25 72c1847a aee64fec 4199ca97
+    17a9d482 61c026eb e96e6e96 09a32b81 b024da01 5163e322 d614596a 15693f25
+    f03feef2 5734676b f178d7ee 3090fd50 f3691b62 54dcd6b9 d887ba1e e8a6
+h = b68b038c b62dff03
+
+k = 21521689 4202d124 d48aafe8 36b63360
+m = 4c06a995 011d8f9b 3bfe7f32 5ec83c0f 2425a14c 79583f93 f7d4476c a02cd2d4
+    b27ad201 17c391f1 ee1a369e 0d2f5ff8 820604d5 5c1e9749 64d6d899 9a6f6727
+    b7f4025e 6c397413 cada43b9 25fa65bd b34f364b d93de8ac a75ca0f4 d41141a0
+    f19b6369 bdb097d7 0827842e a9e39cce 715dd018 5eee15df 6b03254f 72f83da9
+    1b6b10d4 b7f4f785 c3a7bdd7 aff6d845 42b80c95 897e9664 1141f8c1 3767c181
+    1f14dbb8 456e20e3 22a1ff37 8224119a fab97073 e29da7a3 91f753e0 488ba7f1
+    3a18ba76 e49c5d67 171cf77d ec6a6d08 ce3e45d6 cdf0e5d0 b7a30d1f 14fc941a
+    db4e2412 55db24ab 60a6bb9d 13a6ca5d bc62a2de 5b3176a9 43d49f5b 810b28a2
+    cca78297 7b9ff38d 784ebf6c 46d4993c e618cd9d 76740b7a 1168c297 8baecba5
+    df62d4dd ab009e2a 0ce61fb0 e2dcecbd ba162f71 f9e6aaa5 e04afe99 9cc48bd2
+    d8600abb 901de079 50ad02c9 ebbf5222 0fcfd016 5acb1571 2e90c758 f9e73a81
+    05b05c1b d90319fa ee08a6f4 43c910e5 23b27610 a16f27c8 4439b9c0 91d1e621
+    d001086b e017f4bc c693e46f 3a4fa206 4251c6df 57854073 8967770b 732e0bd2
+    7296463b 658d4f97 b7ebe02d 2f38eddd 0c0ff9ae b3762139 22b91411 48cff9ba
+    8d254dd5 fea0d79a 5e2b2d43 37e19b70 2b7123a7 a3a2599f 7ea0f9cc 49794a30
+    672323a1 3fdae21d b48b21d1 a5088d99 209097f2 56409365 f560c38b b4458569
+    f673d14d bd9b99d3 ac64a6c7 25c9ea1f e846dca2 455987c7 031a59ad 3ac1a6
+h = b92dde02 3b7f8625
+
+k = 2aaeb736 586ed9d4 37d0bf7b f2849f2f
+m = 43f8ae02 b7b5b2f6 ef3ea96e 02cde656 6f5353d8 4653a87e 9fa4607b 47384738
+    68d3aabe d5c6ed10 f852adab cb58f3ad 13d1a483 5abdaaa7 58e120d6 c470b0ca
+    ec86a981 4d0e5a5c 432eb52b 9daeecc8 46a202c3 823ddf57 5a53c9fd 46906317
+    9a755aad 14909ab7 c803c546 1051b6ef 14143b9e 4f055200 348de102 b0e13a04
+    78e8016e e2b2e7c4 6559258a 72fc7d16 4cf30b9c f6d46946 aec0e5fa 9a065994
+    7fb47411 a977a533 3e3e0bf9 9a46111f 34e538b8 f3d0a9da dd6921e1 ee5b9b7b
+    d56b842e a30f194d 7d33681d 38239d70 b7efa280 60b2ce4d 8ff0974e 7c671528
+    56655388 2d84a3dc 8ab249a5 83a94806 c27305bb 03896274 2c64ba44 ab59d292
+    9bcd1038 cc747ed8 ad730457 31d29a24 f8f403ac 7e7403bd 44b0b7dc b98c71f3
+    e024caa8 907f8bea a62fa423 e91a28bd d4ed3cd6 7fd804cc 1c09e9a0 5eba1094
+    a01ddfb8 33487f95 f028a41c 2e06575f 2c1f5476 0db0824a fe62ce6c 8665092b
+    c91ec38c 3ae41ad4 c886fe83 f73c8308 545b7635 3c998432 f543b649 8f65d835
+    25a2633d ace2cffa dd9a6cf4 4e0460e2 1998c3d9 ead4c3ff 5e320e07 b4cf0519
+    3644b8e9 a2610bd8 e2547b51 bf18df60 fec0a5e7 6aab48ce 68253d7a 42ab587e
+    91e0175b 36ddf79b 62c0be1c 1746745a e6c5f909 46ca58b7 5528b5c3 370cafd3
+    fd312467 9c5a5ff3 41db6838 ab4c3908 e554b140 0cb340cc b08b9b6f 1ca85fb7
+    263b96b9 1a5e1b3f 42d8822f daad0b56 59e69ddd 0ed1115a 70cd3689 456e3eca
+h = b9934359 f88ae6fe
+
+k = 34e6c258 381b6bd1 5d1bd2d7 50489549
+m = d74bff27 9b2f5584 414dc355 2fbf98f3 d79d359f 0c038cc3 5c6a2eac 9335351d
+    51aa002f 2b9894d1 96638c29 3be6c5bc f0b1d66d 25b878b1 050bc823 414a30f5
+    5bf3f70b ceb69939 389d786b 81bbe14a f7bacdda f309b2a8 5894d7a7 39340049
+    703c949f c580848e 8ac5d629 488e03b7 abbf79ba 0f390c2c 3df78569 3671284f
+    d68ec372 dc8b97d5 cfeca96e beafa16d 8ae75cea 7431cba9 766accb8 38dc9407
+    2c35ba7b edc321f2 3c5dc046 3a455ef2 d03441c6 b46c7544 362497bc ed336f85
+    e7377713 e672678f c2850d88 0e8d3059 47aaf7fa 5a1a0280 5aa86aca 666c5f74
+    412bc50f 5451217f 37ec4826 3a5e9b53 bb9ba6b1 2985891f d6119138 2b49c133
+    daeae485 d5020db8 fc43b6f0 def575da 1eaa6979 147d71a0 a4b1354d b57f80d6
+    ab69f231 ed02aae4 02bb5417 5391149f b4f9f0da 13b05e59 07202950 eca96ca9
+    b7640f88 57effb59 793ad256 427d5d80 adc30a17 3c40b800 2fa43a1f c394ccf1
+    8bdab4b0 4b8fae95 2e8d8287 275440c6 d32193e2 288fcccc 4de2855f 0107ec35
+    ae61bebd c163bccf a5f3b73f 0043b6da 02e00cd8 4c0cfae8 8851414e 7bb5dc99
+    34d34d75 0fcf6d09 48362b52 426c0ba0 b65d36bd a27d0962 feaeb862 3e72e88f
+    d1c6d64e cd5ac1c4 c76602d5 f6120d34 ea154886 6036b840 2f22cc1c a19f741c
+    c47eebf7 8f60b54c 850fac08 8494b919 726486f8 7b61b595 bcb6a1bc e69b5989
+    e6ca5da0 22acfa96 e157abf4 caaa3437 5b8592c2 d5f61ccd 33915eb8 71a55e5b
+    92
+h = d793210c b94a743e
+
+k = 552d3fc9 316dbaa0 cde3ee2a ccbd164b
+m = 59041109 b21c8a4e 5a02ba58 ec613905 a50b25e0 c22b5da1 2a804a6e 933430ba
+    abefd6be 7f537d6d 412589c9 e9c3a987 1c295213 ad5d4a63 ef1b3ac4 a69bf447
+    a5173d9c 4adac8d2 acaec222 f8b77797 9da98d9b e2b16d04 0f1270c2 205361f5
+    98740a31 3ab535b5 4cfe22dd 1a2cb582 071df5a8 49d71c7a d9bff944 14aa3302
+    5a92b47c 9ae190e4 6ee3b1af a4775a29 21f95797 780c133e fd816dea 7ecc676e
+    9217704a 5fea9092 8bbb739e ddba0a60 1f8f34d9 d736b7dc 825a20bf bc5bc245
+    ce45a0d2 bbdab4dd fb75cf37 f2f6007a d202158e bf2b09fb 5c285bec 082dd678
+    75c28e93 d219a9fe bdea9dbc 1398ea62 48e431a1 4a533646 fc4b1b83 33f2e59b
+    42618c7b 14fd774b d2e4e154 487bd8dd 3558fd75 fa26f20e fd96f284 38fac511
+    5f8eee13 d7a1f2e1 45e2f9a4 7726af9f 33d4b5ad 6467dc10 3fa0b290 6079c3f4
+    07772f3b 5cba37fc cd0aa9f7 8119c0a7 be5d499c 9907f9c1 b05c4e7d e5e3c4da
+    314b0291 1fa52d25 80d5ed0e 7e7ff1ff fc0cdd0d e7d5772a 9ce96693 34d57215
+    b0605dd7 c69840bc 29698b5c 362b0ab6 c074655f c020a05d f2cc1fe4 82b540fc
+    c25cc4f3 7b241f01 dc234d5a db7dd39e 32bb91fb cda71e3b 352166aa 319480db
+    f6a03dea 7a1e35e9 4313822d 8116f15f c57403b4 177808b4 3c0c2b34 c50cfc8b
+    c3c05c36 5f29957a 707ea9bc e37d4620 55cf8bba 912e8101 fc2a53e9 2e264e42
+    8e3aed18 2e1331fd c1c2cd93 ebd90b22 1751ddaa bbb68f4a be80dbeb 7a66ae4c
+    a51c
+h = 39f5684d 8000a9b0
+
+k = cf2ff24b 73308084 640729d1 1dca809c
+m = 9301edae b5024f76 a450f077 d74206c1 e8b29596 267bfa20 430a9c65 c9755a32
+    6f0a3525 c40117e5 57fb9a9f 760d0f21 405f712c 70652afb 32bb6766 2fb58c6d
+    b142184a c8a43f85 3b8350d7 38670ae8 31aea1ad 20878af8 d1b3d507 ca899031
+    dd747939 6b0ee4b3 6a9d8d61 cc98f32f c6d06cb9 bed45a83 ea3e1c39 7063b80c
+    8e30bf43 f2789730 bb89b173 711a7bf2 70c2d5b3 ce3a6f07 afa73d71 bac965a7
+    74c068f1 a38e7d96 8ee806dc 0bb39831 0ad09634 2f4e1527 9546487e caa86655
+    696f7f81 e0545fcb 9f598f84 34991f75 25059afb cad1b241 d0ad315d a7257074
+    efeeac34 5273b448 1e9b5a8f 13663506 8c10e732 17290c06 f87225fd f4d16f73
+    5c076f66 dfc73c28 927d5969 7f153c48 aeaf4a86 a3e73ed1 adf68708 1316fde8
+    f87a2f1e 9fc8a2b4 b25eaf73 f09af9ea 443917d2 dfcd79f9 90965602 a6594e30
+    79745140 a2f2eeac 1bf7b1fe 43e7ba88 169443f3 ad812274 dc5a823e a35bd26e
+    4898d0b3 ff4a466d cedad1a0 9149c314 08ae1c54 d3898514 daf4fa7c dca3f446
+    a73a08c4 e1df9952 51cc5542 2c654ff7 2973a2eb 066eb158 54759f72 646a2e0d
+    eb29b3d4 2e27fc92 e35a92c1 05ecc275 e43b534a c62b1b8c f4c07c5e b07fedb7
+    acb5c87e 389f86fc e5f00d9f ab5e726e 93f248d9 e17af069 e48ed5f9 d573ad10
+    88694cea 39b2317f 243a84ff 0cfba846 5cd0dc0c 0c517a51 cec8b2b5 ea96be0b
+    581edaf0 6a04638a 1083c373 feeb329c cea994a5 406999d3 0e26f773 3e271f60
+    576de4
+h = 347b7ad2 06bc4561
+
+k = b0cd1b3d 5f7bc230 fe136b92 25be2e5c
+m = c279ad14 2211f7d0 155cfeb9 e0924ed0 adbe5a2c a9bf49d2 bcf2ca91 0730a949
+    a80c1077 e05fa83d f065421e 9f66f7fa 4176c36a 11bf5720 528d4dc3 d043b181
+    9d40eafc 3fb3ac80 dd4c428c 32c79ee7 165a256a 1f3ee62e 00b44f64 0f3fef78
+    75456f85 4391bc20 f08a9f80 f37dcea1 8141688d ef29cb23 766ed540 96030910
+    b879091d e3395cbb 409b8ebd 370feef0 be9cdd2f e44d5a5b 720a203d a74af4f6
+    96d3d69e 85dffb82 fdb2d6ba 2634f3de d2f12e7f 24e313df 4f5a61ba 3c57984b
+    63700b39 0b6196dc 9113c5fc 0c1c474b 477b4ee5 60595569 2ec8f4ac b0d54239
+    d50968f4 43c84eb0 3824c82a 10a597d9 5a4d2ff5 aa0e4de8 b228ba34 4a14fe44
+    2f28adfd b1f9d0d2 7e566a5b 5c1f0702 81ce580d 2d917667 728ad3f8 7e2e4fbd
+    e5f54791 54a76013 d2be3bf8 bb75491c f13638f6 7f0c1b86 afaa6822 e8b13c90
+    911ef05a ee468073 3d166d82 8e3e7c5a c413b91b 9f33bee1 98afb7fd 77ded9fb
+    1a22b1f3 0700ac9a 99438835 c5bfda07 f58a4435 36ad83c4 513422e1 50886f56
+    30c1e1cc bbf3728b 20d966b8 4e25f5cb 50527ee1 064cb82a fc1d11e4 b1fe12dc
+    de9f5363 6cb76f48 656018ef 9c284102 5c2bec80 a962217c a2ba610d 882009a7
+    fb652f2c 06c65f83 43c66088 2d5fb8e4 14d87d1b 76fdbbbd 6685c7ea b6ca5900
+    709220c0 0aa0bf7c 67bbc118 d1e89706 4182c64c 4dfb9306 d4cebd58 be4cdfaf
+    7bdf1ed5 ad77d0e0 2cd1bebf 794b6214 2726e7c4 5e2d7497 a275f525 77ecc2fa
+    26b0f1c5
+h = 44ddbbaa 7ab8dfa2
+
+k = 51cfcdd0 4f810085 8617f523 a5245e54
+m = 671e2d6e 6a762fbd 24608bb9 c0c4d300 08156628 2581e445 f7f89fe5 37d862cf
+    bea5b8d1 a60481b0 0dfd59b6 842fbc3f 7767bb99 7b7d9062 ff1cac0f 2560e496
+    bb241186 1bb74804 05652859 27f11f96 7d8961f3 0f4461d6 63f6ef5f 608b9353
+    d1d85ba4 41e02676 b2cc4a51 240bee95 f29f3590 ca634002 a12547cf f7c18dd6
+    1b739faf 4f9e5d31 cf858592 7f1be45c 59cb8ffd c8d2ab41 0d5852c1 99c4d590
+    13b180b6 c587c830 f43a143f 9473f75d e59dde5c 370e72dc 44627ed5 14ff206d
+    37f65710 111dc67b 43a23302 ab5a99c9 5da9e3cf 950de1a6 65aae5ed 4142bd36
+    26d785d6 be5bc96f 2c883cc1 109b3adc 3d979fa9 2f8081fc 47269361 1dd440ba
+    751fc9c3 0efaba14 4ae68504 b9829a6c db99c693 e2b2a081 8a193dd9 efb3fada
+    26fff297 45978574 834a8eeb f66d45e9 e858eb92 14717a3c ed1256c0 f85c79fc
+    23c819f5 a6f9b4c6 133f7eee d44be77e bca5fa63 aca96744 279f7184 c571dc50
+    f74620d7 b54a696a b6c18b50 585c247b f80169d4 edbde2f3 1a4a8c16 af44c65c
+    457c936e b1acb98f 374e6c07 a40546f8 24821675 38359053 0c4052c2 73d10f69
+    a31e4d86 7e0f5316 bdd198c5 fa786508 13722fda f27b353c dcb1c50f f5bb3d29
+    9459778e b20e1108 c4b39cb0 4f2bc429 9f768694 286cdd4e 5ed82742 789a3ec1
+    3a221dc2 71da50a2 2a9049d4 434f8c86 74718f45 22dda37f 2537f398 4fe036e8
+    3d9ea2b5 278d9d64 35428980 b18430fc b365c087 b591e282 e0324c4a 22486767
+    753b15b4 f5
+h = 1a51e82a 483bfea6
+
+k = cebf0c1f e4ed75a2 27cede56 98f09c61
+m = f37d29d8 2708473f eeaca802 a46db828 38bc71a7 1f27fc02 ca92bb0d d8ba9281
+    b72c74dd 3e4921e9 dee6f447 39d2ea5a 9142194e bd0ba7b0 5bed84a0 3d07b83d
+    01e0ffc1 d21fb086 08de2dd7 17260d49 022a181f 30eaeb9d 9d21c425 089318b6
+    030a73d5 b2e3c698 3668127f 8cdddb20 27aa17d6 53f4c8a1 94fcf858 f462c73b
+    b458eb02 68b9b5c1 ee9d9438 f13f517a c4d5d758 5ec72cc7 9adb9ab3 f8a233d8
+    f83797c4 18343ed4 4fdaac00 63a4f170 06b46346 d655231b eaa1227b 2828d70b
+    5afef382 61e5c9ac f392aa16 7dcb404b 27a53187 f6806606 e0fb339f 08595800
+    cc04fe01 644ff111 70d2f8e9 89d10b23 abccb722 d7afb8cf 62e8e5a5 638d2d75
+    490cb727 1fb88618 30f42444 29ba9d41 0c7ae164 7574f56d c5c89a71 84788cce
+    dcb34355 adbdd91c 0b4fd596 05c86778 76f86aa1 81dcac0f 51a0c708 e866156d
+    0f0b062a 451a2fe2 17cf83a5 7e83405b 943cb92b 9b95daf5 35305ab0 1f766339
+    165465a3 bd672eca 5e2a67c6 bf75d345 d84b2224 3e519844 3d749255 32188a5c
+    ad6f8bbd be4102f8 6d27dade 0272b76c ae26a5d3 b71e7ba6 9115f56c e164a5b2
+    1d89173a 5409ff9e 5dcdffe2 61d7e855 cbf6300d b28a4478 b9c74ac7 9f3a7bd5
+    75bd38f5 afa2c5e4 0539fc97 bf83e6ee 1e4843dc 7bbf843e 6d2a7a02 ff273b3e
+    1c57b9d4 86bcd2f3 b53527dd 2ed54ba3 9387075a d9ba71b3 0ae2d01f 68164f7f
+    2b6cb8fb 92800ca0 d150863b e101d4ca 3e155d98 92e7aa14 cede4e83 7c2eba35
+    78174a6d 41a6
+h = 1b9cebb2 01c01ceb
+
+k = f65dc01d 00a4e96e 41d1cb98 5a5e8870
+m = 87ed4e7e bd075e1f 7265c5fb 3b75485b 24f42945 975bda6c 016eeb56 2fec4624
+    65c47de8 1bf48b97 712727bd 0cc74eaa d0b7544a a8466379 0fc44a75 cfd15b05
+    8cad2f8b cd48a0f0 a46797ef 0fa44383 8a906dfa f1d47131 eddd815e 6a92c5e6
+    de91df2e 2836a330 66c6c732 7654c94d 8b07da8e cf636f56 9e42af4d 7820d91b
+    63a5b9d6 96e6d8e8 3e2b910c 10000131 c5f97cd9 bc885fd6 fdfe0e31 3cb8cb93
+    d1bf591b 955edbee 3c7f4ef2 84e362fd 1befdb3b 05e9da28 32cea6eb c91c7e54
+    331dbe3f 6dfe1df1 70ead515 5b018b8b 97a4d018 d7cf0435 a8e60cc7 7a19d333
+    f1bc068d e0636729 245f051e 579b1c3c b8e98659 19c8a7bb b356a8c4 4884b8e7
+    d6a6aa17 314a5231 031e6409 863c844f f2f5dd0f 46ec70eb 4fe53b64 2d11f38f
+    9048504b 3913b75a ddc4c362 bc20ba51 3abb88d2 dca12360 9bc41eb2 08fb8244
+    2d46e951 2ed06058 8971f4c3 1656b331 d46e3a6e 3f5a9603 7b7a0147 23c8f3a6
+    4a1185b1 04b2d89e 00a46b45 8066767b 5a3bda5c 798f3124 365e3ef8 89cf2d3c
+    be9635c6 e59985ad a1f442d5 8ac6f3d7 397b54cb 9aa63bf4 4032787b 810d7c18
+    13307372 312f84cb a695f547 72a4834f b66cb08e 2a184b1c 5978dea8 90e97fb8
+    41cb660a 31c71707 ac1c48cf b58fb21c ce98f8f1 24e77b43 158a9570 6bf09ddd
+    7d17fd1f 2b543787 11059628 01ed86e6 0fa689ca eda51d71 4380f570 a887499f
+    2de015b1 b22a0aad 092c11d9 f71cfab2 467521ee 99355a9a 499e4610 580527c2
+    1d26b5d1 3d9bac
+h = 2f388cb2 92977552
+
+k = 837ae9f2 6fc8b404 49f7cbe6 858ea0de
+m = 5a66117a 8fa26718 74d2ffcf 229a4aea 3305e21d 30dc7ab4 8ac32bf9 1678f7ec
+    8ff3cc3a ab5ce62b c231f496 c3f0bd12 85c78d22 b5df5af8 512c5c71 858a4f83
+    16b7164d 06641e2b ba5b705d d8d85af9 45b6e24f aa6e4792 ba9938dd 64eb7926
+    d45adc32 5dad7a5e e246928e 98a219d0 8d24d51a 860d86a0 21fc8491 87daae49
+    7357e7c9 d70ed150 a005eb90 438c9f16 047964d8 852e63b9 79956bad eabbcc89
+    2ec1d484 e3f28bd3 a5d3cc93 0afdae7c fceed057 d7075d16 a59b8a13 a8360559
+    354503ca acf71283 b8adbdcc c9cdb706 a824473d 8b38d4ad 818b9b5d 3531fa8d
+    7bb3a368 ab17f139 32c7552a 3f2b70d3 b5f6ce49 a3566f1b ee654c77 969ceff5
+    95dd5e04 e80ecdec 1946d4a8 3132993a d43438b9 b94c2197 cbbda00f 54c0bce2
+    e92247f8 3e401bfc 19624f2a 251e8eed 1c43c5bc d2ec5e76 ac9e6467 cd0b7bd1
+    5c1617b0 53422955 ce2cbe3a e300991d 4be9982a d43b3c7b 94dd9e37 88d86d08
+    db3c8309 d80e9d3f 9888396c 93c2706a 1bd749f8 dd4fa1f9 204d9630 30e921f7
+    d7502348 2920cba0 23abe974 6542b17b 7d248a25 951a4462 2743ed05 0ce990c5
+    c6ee3325 b9e9aab5 0f5c584c 59c68e27 29a77cd1 195b2f76 b05c0382 8f8bd7f8
+    94c0c747 58741429 ec263a83 5ff1f3c2 33c216c3 91b777a0 ace7fe08 53cc7c73
+    4609c009 2c838c27 9001decb d2b5fcb0 55f03079 50ff52e0 aa6e4f35 27f1a45a
+    f5bdf59e 9c6ca9c9 29a970a8 8435d2a5 a84f7b56 4024b462 969190d2 d2087c63
+    32bc7e71 b7fac4df
+h = b79d1205 e6740cd4
+
+k = 8d5d1f74 29f4a8d6 2e1f14bc 1f3a24aa
+m = 968a741b 7cdc6f8d a04d7648 d9b49e16 b32c6a75 4c82efa3 2078d64c acec3f94
+    274fee3c d83a7471 a8d97d30 c72415f9 c5337cad 53910355 6a59afac 29eff18f
+    92bd7aff b8ca9cef c0e98b5c 6bab71b0 b8a6a607 d0c25fa9 32b71a9b 5d8fb827
+    633c3fca 672927ae 480547f1 3d6795c4 56ff2b89 95c573d4 4171de1b 0bad5b28
+    a12b3a12 9e5903a8 6b63b2c0 f823fd0f c791dcc1 a43b00e8 fa27727e 09429895
+    e9f2522f 7ff0c5e0 25591b38 b4d82170 f86f4c00 a5087250 0af22c45 9257f029
+    70bb69e9 5abc2768 e68b7fac 710a0db4 d6943af5 04c86e9e 27c852d0 3290fc65
+    94124192 87a9a50e 853bd179 fe1065ce 14b99624 6f6ea8d1 bc3a855e 81ca18f3
+    7a7cb680 41e3ff7f a4eb03ae 30fb3f70 47fb48ef 1630cd97 93194041 c542b5a1
+    5f3e147b 20b5ac67 26bccaff 9959693c 9151d324 6aeac2d0 eff34eab 0a36142d
+    e3d61f30 e3b55568 fdd17c5d 513be7f2 d193756d f80bd197 ddce5b12 1ce43b4d
+    7bd0e055 7dd73aae 07c2909e 064c79dd 509da38c 11423aa4 e0aac369 360e3ebc
+    e2bdccf4 8a7cbbb3 7b9b1e4b 2c9caf16 7f0fa52b c68a9d69 0dc721b3 ab4c1ceb
+    a251d46b bed93eab 6cfcceb0 571caa14 d7cd9781 3649057b 043ab7e0 e068f7ac
+    3443b2f0 54824dad 29f30e18 bcd5aaf4 8d35421a 3134cea2 461d6853 12bafc20
+    3a3fa3e0 077fa552 ee13435d b880f1d8 3924c9af dc865efa 4ac2e268 caa5cdd9
+    44d31325 c9172bda 0d917b83 18d5c567 ab926830 84c015d2 38f7eddd e6c8150c
+    84d0afdf 78d2b359 b1
+h = 62e314d8 592374f9
+
+k = a73e20f9 9be50736 874753a4 8419c086
+m = 43982d43 ae7a9bda c3ceb578 7c328d28 32d7b932 d4cff6d9 63779fd4 008be73d
+    9208ad72 cf52355e e168982f 4ff57ed1 47a22b2f 43f3fad2 dc22e1f4 a0a4bb48
+    c8ab2fe5 85a9122a 2062bc09 f1097248 93e75f69 f8937ca6 41e1d211 65a1b5c2
+    a88818cf e6901e02 d117a846 c19c5ef6 87b7c81c 6005bc66 7d449630 16b82b84
+    62007072 f3a9ce89 717885d0 9966fac8 5d5b0536 81f2fb47 56890f99 fb7e1dc3
+    daf3e42c 8b426f80 ec89fd69 51e16f4b e7abef9a 5b408279 84de3ad5 e5e229e7
+    3fcc8280 f542f11e 4db59cc3 f291f011 6631ea3c 11232171 812908f0 3ce7aaa9
+    f0cc76eb c8a97bf6 2ddbd9d1 6aca9ecd ba7afd2e 1dd5e7a8 de59b994 f60285fc
+    33e3d428 26b6ab3d 89e280db 720666a2 84e6e1fa d5074f98 9ec3179f 7c2d3f44
+    40fe16ad b51c6acb fc6d3f3c 3682d357 b4fd0b50 ccacee05 0c383b78 f57a82ba
+    a920cc0e 6ca44141 596afb44 511cf66c af0329b9 c983892c 5a8b871b 088f9796
+    8ce5048d 95f9232e 0ffb20b9 b3f8fcb8 ee185697 a6586588 148b0cab dfe359cf
+    f9488445 62e4e0c0 2d1c2001 81128151 1307032d 37232a6f 27e7a7fb 4951a342
+    53d09ac7 b1e2bc59 94b87e42 365298d1 c3c0c61c 12b89b7f 5ea2fa4f 3fe900af
+    15aafeac 707241a5 8e87ca25 cfe7b0ce bfdba2c3 390bf79e 8e1192a4 7ea86482
+    2553b4ef 5a3d2eb2 ef3c9452 d233f4b2 48d0b8f2 cad463c7 37b9de38 59783fec
+    ac07198d 9402d3ab ca1ac8b8 365bf793 e28b89c8 f7a89261 16e709ae 2ea2d396
+    9771e182 dee4615c 3d0a
+h = 5d126763 b71c9f6d
+
+k = c0ab8979 9e85cd5c 8bfd0e7a ace32d20
+m = 8114e272 8237187b 997d90ca 2dc82591 a6b452a8 a2f0ca9c 1248db87 82c15f14
+    e60ecefe ca795c68 c77e2955 c5306eec 6cc9a969 94bdf525 65e4cbe1 a27abed1
+    283f098f 69ff6ae3 572b3321 7056ec02 8166dbd9 c0498ef3 2b4a94dd 0a1ec286
+    044cf09e 73df6f12 917c7c40 bef5f567 a754c7ca 45931713 243be666 89f446e3
+    e0aa28e6 8f3c6e6b 4f73d9b6 41dd121f e3a0b489 06cce15b e9c16bbd e61e4e1e
+    8e6c1fcf 4955ca14 5c51fe62 459f8f64 e86689a1 d8051e87 d4f4c945 8e3ae3d7
+    293ad523 5d4a9bf1 fe3edd11 2859d865 358f19aa d715845a 03423724 08c7ee9c
+    fd3ba4a5 b0ad5154 77603b55 e3b8c6bf cc84d5ef c802070b dca3e079 3403307d
+    63a6e9ad 91570f37 f1fe8dd1 040b9d6e 3e11acde c8e86dce 7def26c1 015c145a
+    f8228fb0 5309f1a5 951e3b60 a3805a18 539225d5 563cab34 6050e268 7a87955b
+    b8859b59 562d705c e82bf6b3 69c662b6 efc20f49 b4b5e8e3 f066079d 5ef53c63
+    760f9ce5 de51687c a594bfdb 51e90cd4 f442a687 2a9f4e5b 2382b03f 246b6bdb
+    716ea8b9 b217e1ae e25d1d3f 561f47f3 5b15a4ae bfc3db2f 23f63a88 1f710b8e
+    7a6f2919 70068e4b 42c808aa 1b2a6b0a 1d0aad56 5372ee62 1e89fe5c 5e812a19
+    9a4ec962 afaf1c71 91579ccb 74de5d2b ea51aab3 903eae6c 3a942e95 db92ad62
+    5aa9b74d e9d01c3f 388769a9 ad80660b 53b19233 8c0f343c 8008726d d739dcda
+    4d92e438 f42876fe baeb05a8 a40d4fc2 028d5e7a 5c7885c4 8cf5d67e f8c07185
+    56f3744f 6fce2f9b 3d9245
+h = 142786a5 3cf4546a
+
+k = f118a3e0 9e90a5db 61e5e72d 64e7d249
+m = d45b3d00 4ce1ba53 7dfa7c22 728b8510 f8440520 eeeee8ad 69f273bb 3aec8d36
+    210ffae2 eb7f4998 d497e42f ef0b6b39 5f7f45d6 9f29cc80 492b68f5 9f8f94d8
+    1ef40b7d 552721ab d22006cf 83e777bb 65f68a66 5115ffb6 a4fcdae1 cc92002a
+    063714f8 62704e8f 650ffa02 cf163a0c 32ca4a2d c8e311c5 1bd58847 6a40cad7
+    1088ed46 b127426e abb5e43e 785ddcab 1062a2f6 573cfc92 07a979e2 f253bb49
+    97416154 e1cad984 b62558c5 eb76e1bf c3e06872 273afcfc 9b48a1c8 7756a3f2
+    3c4772d2 127457c7 3b881575 17f9f961 d0fb69d6 0c2fc55d 561c49ec 6a7fdcc7
+    d2df5729 b4257d4b 9e8924c1 b3716691 8c15ac3a bd670d8b 83129530 b2084b3c
+    1c785224 eb5a5749 e3e80eb2 c3ea3bc2 aec59cc9 a9e4e42e 0c0562f0 5e1398c5
+    b08ac06b d0007d84 bbffd61c 7292bbe7 2056e3ff 03fb55e9 6983f76b 5cf6c413
+    971708d5 9e8eda80 8db5d557 daeeea03 a5a7b2e0 cb174afc da3bb2ff d4e83b73
+    eafa1932 ca4d4007 584cad75 74b9fcfa 3af9d129 c8d31520 7face5c9 47062bbc
+    a3b2d47d 7019310c 7a15948f 87e02143 ebdbc06a 251cffb5 f3e0126e b3d1b87f
+    f4debd93 03f50f22 5faa041a 37b9425d 8ef7733c 4f07568a ad949c13 44c0b543
+    b1fd00fe e13a42a6 5274a0a5 cc9d8b5c a03f5838 452ee743 e2f39ea4 d7e34926
+    2074962e 151e796f 1b3f42f1 82776270 4b08b243 8db45169 ac6a510a 1059ad9e
+    3b6d374a a457b7a4 799f768d 44f85cd1 18f75a0d 516bfa13 e1561ddc 2558fc71
+    3f893231 01f81ce1 85807e16
+h = ed9f11b5 2b98526e
+
+k = 3799d161 700ec8ee 1604600d 01a3811c
+m = b4c4c73a 0ffb4e4d 040d1e48 c69775f9 d025dae1 1c93e8f8 8fd1b146 2054a3de
+    38fa123b 785da056 aed9e9b3 dbb6b506 daaccc72 42365f34 9b215eb8 1395f64c
+    f2422933 f706163c 583915d0 fbce428a b3ef7e7d f39effc0 022475c9 483f695a
+    b94d3f89 f02de0f7 d6c32fe0 e8d6b21d 834cbf40 4e69e64c 6303241a ef331768
+    e9ea9de6 a72caeef c3a2449a 455e5770 aac5c3bc ae56b622 fb68ae1b 3e7cfd29
+    954ce265 f3f1307a 8b2b5c7e 6e1759bf dbfd1c5a 75f5d4cf c1d62d82 6808cf4c
+    ed428b01 31131a0e 165463dc 27f88a23 a17c2b8f f0747858 2bc6fdd8 07abe340
+    a4b4767a 820c82e2 ea2a2453 86aa5a37 008a8d23 8affa4b8 e25251ab c63d657e
+    a3f40b35 509aee6b 3a692f68 c6c827ba 3defdba3 73bc7e6a 6e3ba1c4 dc12a3b3
+    7e169182 025b6648 abefb7fc 9acbd771 0f91f05b 23941eb4 9bb16bf0 3484fcba
+    285c2e71 8d7110c5 99dad0e2 db5c12a3 c8fe6780 09fb8beb 7c9ee4c5 44b6667e
+    682189c8 eff21ea6 168e7ed9 0eac2dd5 4afc6dc9 25d4cbda 049b53c5 b100361a
+    b21ece6d e36c43ad 320f513a 4945b288 fde832f4 532f758b d9641995 2245627a
+    160f3ca9 f7f9fffc aa15de78 72548980 cf42960d 7825ce8c e7838d98 66260033
+    21ba1590 80c5c5d2 ee8dcf12 8d09d232 8654dcb1 3da7107d 42190cf1 3375b14f
+    5c58de19 16c41b4b 6a11e81f dec5f5bc 21dcdb3d 9f68fb76 dcb7982f e2a27d0c
+    b529d3a4 d00bf393 bd2c8e8a 39be4e00 4edaf919 1c4c71fa a72ce6d3 7e24a17b
+    7e8f578a d3f1a3e6 2ebb91c7 f1
+h = 9d9e0ba5 57c9c76e
+
+k = 39ff97e6 b5b45d3c cb15b318 71dd1cc7
+m = 5457d4ed f4cc1bb8 56ecbc89 39cefa0a 84d22491 6af32dc4 8a6f245f 4a082549
+    1301b4ef ccdf7cde fa31a413 8a95333d 9df6cba2 9cb5f8f5 0970d6ef 332004a7
+    e2d1c3a8 cc31f43f 5d71269c d2a96ea1 81e2c889 0737e8de 9c1ffa65 73f9b10b
+    69d6095f 12a69c82 8edf9566 29565425 c5ddbb3f 86645905 d57be451 8ee11c1b
+    5cbc5746 110cc1b9 3c0b0ece c31fb231 1952105e a0493031 1423e81e 4d125d45
+    888a0de3 1beaa3e2 63ca8c15 e2899a06 b0cfdef7 6a7546b1 6a9a049c 9c4a5bf1
+    5e245412 f1511f17 eca53d39 4a460558 f7e0cfcc 75b33233 a8aa86ae 49942b41
+    57a266a2 b9222ad3 1439f858 345f3eea 965fe864 766ae94d 7f5200e3 87c64185
+    4c43507f 1d733432 8053f012 a58e68b1 1e709917 1e9c8b97 ef8fe89a 50459d76
+    fe4326b5 2473342d 6110fea4 1b25cfc6 790bd895 0c15acb2 3d23d68d baf3837f
+    94f2de91 7cda2c6d a1b2a9af a94d4899 0e6d3d39 6c4e0fd2 ea81777a b56c55f5
+    3f5258ed 6b44ad22 818f7958 33f8e82d fdedd57e afae2418 a0be7e90 8ef4c184
+    39788bfd 163e2032 32cc4499 a3ed92c3 0e0b0939 8ee9aa2e 7044020c 6920d372
+    ef28cb01 5b7f6fd9 eef54d4d b2a577fa a1f12a1d fd3cc173 96c72d70 c761334e
+    630e9262 995cb4ce 69ffb43a b80e82a9 bbe86ed7 6b0058ca aff9ecb2 ee9933e1
+    00ad577a dd9b5821 6033fef8 cf8057d4 d5c0d010 5f56aeff 9eb9a214 167ef3a3
+    61a09fe2 f40f970b bce74056 9c7290d7 7f94256a b660674c 94938a6f 6f40ba65
+    4cd82287 0deef595 79c7cf08 5127
+h = fe9f272a 7be099e4
+
+k = 4dd11910 0686c6bf b5aabcab e850277d
+m = 1c014594 e67f488a b4b34b12 98bcf07a 33445978 63b082db 00ffed19 707b2aa0
+    2d5497dc 0e73c692 dbfdc44f 005afdf3 ac57d92b 061b38ee 0f95c9ce 1dca520b
+    639ac795 79ae4d70 dedd8a57 a1824c64 f1ef3bee 76b70b95 3d3883a3 19a65386
+    46e841b8 ec364b1b 36097db1 cef81cd4 42d6f4ab 6314a6eb f2b62fa6 e6612f1e
+    d43b52af 23b8072f a07b52c1 414fa0f0 c9a86d7d 12baf89e b8178eb4 faeb9ee4
+    fc9bfff9 5f902b2d e6697f60 0b3eaa3e cbca1790 922efeed a4e3f011 ebf37985
+    2006879c 5a2c13ad 94245281 51b8479a 4202331f a5a1b746 70c8c462 7fcdc15e
+    f5f41f12 452fe6cc 9acc780e 55955cb0 28477b4a 2ee20732 0b0ae2df e73a5c73
+    1254536e c25e95c9 0454b655 ba348ad1 07701f29 9c9af8d4 dd92ead7 e391f855
+    f27de921 47a2085f 9e1fc367 08c43a3a a1b345e5 f289e6eb 9e65c017 a0595531
+    ee6488f8 c0e3a386 93a90e10 e862f7b7 09783c00 3147c824 fa69f935 7458be86
+    4ed30907 a7f796ae 80ec8aa4 249e8807 f3433c68 85b9718e 40822729 e8d0a316
+    ab7a63ad dbb2d08a cad935b5 283210c1 04b3253b 1feba058 67b85a11 ff22b0d2
+    4fe8decf 278624be 7d852704 2cc517a8 12352fb8 dc5c34c8 0d896aad 2faa7b8d
+    3401c871 9d99b7ac 005cf122 df25337d bae662c9 6f1169f7 aff097ff 5c6aa2b0
+    554e7e26 ff46539f 91d138f6 3f233bb2 abf55be2 844f923b 6d7ce654 2fe26811
+    70f5b9b6 c6866453 24504b46 df44039c 9bc55b3b d2df7df5 a15c7f19 381ab55d
+    9f41884e 88fc78bb 11aaae2f 258dad
+h = bb33586b 90726188
+
+k = 958689fd 7ccb27e5 c1277875 5f6711b6
+m = 5fdd0c00 fbfc0443 f4c65e03 5432cb2e 60d7ea14 4a9855a2 c3b8157b 494e4d81
+    0f10e6a7 691b18e0 f8e9dc53 edd3820b a5dcf459 b98e2c96 80ae48e4 28cd93a2
+    c3e3839a a8dc7b64 0706a6df 70177f99 dfe0ff00 1cb37911 690c6958 d04e5cb8
+    0ae91dac 03cee6c4 c02822b3 dd9d8c2a 664588cc de592490 74451680 b3953fa3
+    63a0ebf9 e5a9029b 51f2ff55 84f71d01 02c39036 d601e858 dfba17ed 7635b1ff
+    1740248b bb45f8c6 1acc5a18 5d7e2221 ffcb6ec3 0218cafc 3dd09466 487c2890
+    0c0186dc c2ee2993 4943dee3 3eca1f53 82740baf 05578c03 11275e44 05a418b5
+    9138958d 9ec07abf b02ff7ff 53b09072 b9f88bee 7ae224ea 62327815 93ba7af7
+    60980767 30e682ba 7c9cf394 813c512b 021af2cc 3a6bc51f 3100db5c 11718538
+    3ac371df 92ec914b 47e048fd 53cabc64 d39bc3ad e65cbbb6 cc6cd34a ddd85afc
+    b8618add 0442cb2a a0a564d3 5f02d627 be866324 d37f6206 ecfb4806 d591db16
+    c95df364 7b1d5097 8bc9e9da 9b5edb35 a247de2e ca1d4b0a e30ef2aa a9b5a181
+    bdfbea0f cdd50696 b2930bd2 9593e0cc c33cd7de 33355648 0cf781a6 9dad6030
+    b69944d6 76b2f43a 4d8d6d9b d794dbff a1017c98 aa450f4d a4788ea9 e4d7a1c0
+    5edc15de 96d43ab9 b2b7c3e7 fd757911 669a3ba5 e34a3aaf 4cb24d88 970470fa
+    09893158 aab660b8 8c2e421a edc73989 c73bf8db d4f98d73 9895c6db 90a30146
+    e49ce8d7 9814bb93 baa3c940 5af2d3be 68ac5e9b 90fd2f30 9a108c25 b1a200ab
+    250b0832 9814608e 82a7cf6f cf384ece
+h = 6b2b6f25 3a52d81d
+
+k = e8f2b2b1 8f5eaedc 20acb0d1 76bba13d
+m = 6822466e 723fa026 c22a5662 d77537e2 9bdb1d43 77770bd4 be8dcc2f 10f4a940
+    9a604a74 c2403cb5 9ab00111 b559a6a0 b633a30a b23fbe38 1423354f ef452f7e
+    89cfa4ea afcb4b0b 955de433 d93f748c 6b1681f2 7e6758af 0e3127f1 0a3ebb9a
+    16b15c16 cfd0269b 4a5f7a13 5a6e1512 e330cf74 06263af2 45055a39 532a73a9
+    197dd644 178c593e d3024087 c0d214a5 cf169263 e6516aa2 c5603862 acc0b8a5
+    d3ba9031 cc6f3d48 8588937a fa2ba343 2d8f11af 122c38ae 5cca43b0 fea29e1f
+    ad22bf3c ff296217 6739f1da a75d1d07 eb035d3b ce25250c 38e35880 83176084
+    47891442 3303d5ef 124d6a0b d5dd7d1c 75cfb7dd 2f2e0e26 d936a929 0aeacc68
+    88b44b70 c5db1d88 395eee5b 664ce76d ff363c1d 63c2c8ff ae2c15ed 1a682c90
+    8682be51 7e5e4eed a019429b c634b806 c2aa759b e60857e3 a6c69bd3 989a9729
+    5b828603 077f2f19 b2fa392d 4275168e b322bdaa e960c648 5fabedd5 bb298027
+    32c223f3 5e8a776e 399c790c 60708880 342ba751 f1f104b5 ba11e976 db90f531
+    ed626554 243693a3 4ba5eabb 0241d03d 019557b7 4c506ba1 e7991f19 deaa2608
+    a6d04bdb 8146f048 fb57c052 c02c4977 cad73cf7 625709d7 b0fbcf3d bf6d9fda
+    94e62f5f bb016b50 1efd7efd e0e54f9a a9094276 0a878b45 5e8c7992 522fe290
+    47954cb8 9b4710be d54d2719 b096e999 8ce4c5df 147e861b 252fd410 63c65448
+    0e37ab44 a0920b63 1a074c6c 140f6b74 3b71355e b8e3618e 4a35324b 9f4036dd
+    fa682841 e448d872 e95832cc ad030202 bb
+h = 58ab6232 2c6a6dcb
+
+k = a8a13436 d1b3e359 d1355e7d 434f8777
+m = a484d584 606286c1 b57e6eaf e87a320c 54e8a844 eff3d2df ddfde856 d9610f27
+    f30908ed 859c13b4 c9cd773e 51223fe0 fa322b70 37801d8e c877af84 425c0427
+    02544647 94c1eb25 faa75f52 3f82746a 63e01148 eeed7f48 58d7432a b34a7043
+    39c779f8 d3391640 5530d6f0 b9236a64 19c1b9f6 6672db7e 053b7665 f8c894eb
+    06b75778 e3e9c5ce c70f9357 25bed661 27a0f98a c8c35c3a 0a9dea3d d37aed10
+    3dce833c 891a45a7 4e404c3b 177e0ca9 d2760856 83e35b78 9dc4cf86 e35263a8
+    c68dd18d 738c7d55 c56edada 5fe1bb52 13827f88 3f4926e9 88a79035 564807f7
+    517e165f 50fc33db 79342de3 ea3fae0c 1dbdfc97 7c675229 b987caae b0ee775a
+    bd9bb38c b9897ef4 e8b9110b a5014ffb 02687b25 202722f9 923ffd98 59aa23bc
+    3e509ec9 8a120b81 2cf62d19 c6302836 7d3e89c4 b07ae48a 3e401b3e 19834ee4
+    3cb45621 ca96ac04 71ca8f25 0d3eecef 27edddfe 98994e71 4dc18987 536000a2
+    f6316ed6 5a54a12b 2a4e8fea 257154cf 53de7d75 951c9028 2140409e 6f7951c5
+    d0c9e18b b5d4c2d9 dc1541d9 4e96ba27 1ee6e603 f0f6f8b5 05bb3f1f fc59e20b
+    052bdd79 fc19d11d 3f30336d 9d9aa0dd e8df6750 7faa37a3 dbf9e6e4 ffc78ae1
+    702a977c 79543f3c 6e637fee b61ad68c 7c47cd4a 58845a64 37489e1e a86d458d
+    a66a367b 9561315d 9949f6bf 968bd123 cf942f74 03830d36 3b84ee83 2693aeb9
+    7f3e0458 11f5a507 318fc88f 0ef84ce0 b3be9883 46a5b82f 1e7b3a49 c2689e3d
+    5e90eaa4 d34f5f07 c14c3ac7 32c988c3 1f27
+h = c308a90b 1a2c6a44
+
+k = 2706f24f e3c33fa4 b4e98d18 6565a1e8
+m = 56d31d8a 6c8e13b0 feed4e6d 1c5be9b0 2e492c21 043658d5 425cfd6e b2830a7b
+    5daf4957 356c6d0c a3eac8e1 fbd2ecad f999dfaa 29a56d7c 46da66ab 4ed25e47
+    7464dada 031b955d f1a31f30 0bb8a1ad 9b410249 b02a5f0e dd19f774 8c5f1e82
+    fe098604 6e531617 28541779 2a01997a f70f13e5 4c123f7b b99aef17 defad4a7
+    adfce12b ccd03c28 7522ff2a 475416de 18aa4f71 48f7c7c6 038734b6 051c6532
+    9e72afc8 9e9e9c34 aa65e1d1 b16cde41 52bc3cee ef8dc423 c4059231 2e437ebd
+    d86ba50c 53d1b84c 1412040f f087b3ed c8502a10 764f7c9e 4101da00 99ebaa0b
+    34318126 93e28b40 c8c671d7 8a8cf340 3ac62930 64afa551 a20e4ac2 b57c341c
+    47c33f3f 70f15f8a 4271f663 ad049e6a 2da22c04 16f270f5 80fd8f53 437ab79f
+    99db219d dbe744dc b1593722 4fae6d05 a8d0db6c d7a00043 08cd5db6 1de8d8bb
+    5fc929a6 56fa210c 4ac3851b 981c6d62 26adc946 64f6390e dd04c12f be91d232
+    028c875f 51e2efe0 08751b78 437460db 3c21a189 5612bddf 12a62402 4be2af6d
+    4210a6a9 3cea3c62 16cd0110 3dc9cff3 f711ba22 d27e5a28 44fd1d5b 378d5887
+    8b26bc71 b311b411 f130c959 3e90bf2d 556f1ec6 191ba109 9881af42 021952b0
+    45e91f3d 5c48ebca dd4dce63 d910c59e b21f8edc ee0e6e18 4b1d7d2d e1db3661
+    3d5c8d85 e42ae87e fef3c525 0adc99df e4f482bb ce6b9eab c469bad6 37bc6fe6
+    0e4d6d5e 267ab67d 5187a695 37ab93d3 b521856e 95b86d10 f3d0fdb2 6e58e3a1
+    5f539281 5a9d5705 11d80138 35a9c745 2f5d61
+h = 61901a27 1df5a536
+
+k = 121d4c24 b4d83a4c 39b46c13 331cabe5
+m = 86cdbb2e f0b0d21a 8a38566f d99d84a1 9fa2c4b6 e03dabcc 2b2c0040 a1aceaac
+    dbce2cad 24bfbd93 f30c776e 2c4abfb9 858ff05c 46553800 3b252979 aa0c6edc
+    7454c328 3c956088 872474f7 60949978 66fa9524 20b3712a e8b31340 48107049
+    b4681f41 74ef6f85 b8cb14b0 a9117f20 b226cc3b f3a467d2 44f89106 ab7e7cbf
+    efedc2da d3b9258b 75499f41 a2ba9d88 ef4b1c76 c71c76f3 3075ed4b d928db6a
+    ac821d55 a07ddd51 a692f062 e4760d7f b2e1cada 32fbd1ff 1b935bb7 559f1e54
+    e5bbac07 99924dad 416323b3 bf93bdbb 628d7f56 f9a140a5 bb5105eb c2aaa54e
+    0eb02e04 034b84a2 dee98736 7a07e1cc 7765945a a22fbb64 cec757aa fbe9d5df
+    8ed65b4b 14450e3e 5fb9997a 1ef7b2a2 f3ffbb72 001c58cc a85f4f76 deb5d42c
+    f4b22c47 8a0f67c4 aab00e9e 577d934f 3ef0645b e06bdeb2 5a466b26 d049fc19
+    02ad9ad9 5c318027 6e9a0dad 305d9708 68481c16 be079281 3f293008 8e0a8023
+    32cb545f f3dc45ea 32bcb0a0 49df4f2f 4bcc63ef 5dec7e4e bbf992bc bc0cf610
+    e72d1d6a bb095580 76b9fa6c 92c74e90 5eb399ec 725f0024 06c59606 44ba880a
+    9f4d274e 0a681e06 8f2de9cf e91ca56b 2b91483d a25a8bbd 050c8a40 38959057
+    9b62221e 6d24f725 eebef061 8eb70e00 527db79b d196eb8b 6df64d38 af78667c
+    73675305 eb259803 f70f5944 e90da1cc 1969634a 722f7173 e2f63ec3 c4f679e4
+    5d1ecc4d 1ce720d7 8c732006 9aba010f 40b5167e 9b9a4c8a c8d991ae d11321c8
+    a709cb16 85185cfc 20cd8914 9f49a1c2 3e4abe33
+h = 146c6249 0cddb423
+
+k = 72fec76f 8a577180 a4fb4ec8 c7031c1e
+m = 37b96d39 4c114fca 2e2c3f4c 8ffa5352 f2fe6b7a 5c9fc862 c64bfdd4 8a01e978
+    f607ad67 64936bd0 23065987 1ee83aa4 85f0a40a 4a15943f 37b873d5 77e1e8c0
+    870f243f f2d86d25 d1e6c984 f534a541 826c4781 49f7a69b 7f5cace2 53030ac2
+    c8bf9f0c 37f6c0e9 169de9c2 a266e154 4fc917dc 40ba61d7 5a4d8b6b 61215366
+    d3ce3f79 b07e3c0d 3c5b36ab b4a073f7 2f3124bf fe2f9e8b f5dd15e7 78047153
+    bb25bcee 35202952 6eb1b6e0 1ba6c676 6bbb8a7b 8d3b219a 4ec81afa be9d3c80
+    f5835fb2 34afc588 c2a3de4d bc64cbd4 4fac213b 8c0b4176 818329f3 9ba6a3a1
+    8c4b77bc 6c3503de 3d9465d6 e4d19dad ac0f50c9 925dd980 dd784f8f e9eaa5c9
+    bbe60cb0 4177d385 2d80976b fed0f595 c6e9c53a 1af5ba8d 11e1d639 37db6d7e
+    daacaa4a 68cb74f0 49bc8002 5b687aac f41bfe46 2e37e3a1 3d343a68 10ea38d9
+    1832b0eb fd31bb1f 06b8fb3e 1a5ae3f2 d01d449e dbebef68 b160893f 359ccedc
+    5bd3a1ea 1eadbb06 a5dda139 7296a5b8 414ecc04 4bdfebf0 b2963f33 ccc3812c
+    cc251d48 16493691 e8064e9c 63f5cba8 449b78f1 b1a0e487 d5a016db b169946c
+    ad9863ba f7be8328 a379ba20 05ce6684 4fe4df56 eb07e9f0 6315b00d 542d37f3
+    3587e371 c4ec0d72 1641b546 923387b0 e4eeae48 29d67e42 3cac1d5b 49c4fefd
+    03e8eb87 9d87ac9c de960beb 032797ea 963319cb 4f6c7155 a717de25 5c1dc174
+    f9b18ea6 d814900c ba9a541e fde0992f 249087e3 2399c506 179b8f92 7de006ef
+    3eb71e14 7373083e e033c583 1ecff19f 968c65cc 54
+h = 320aa7d6 cc222fd5
+
+k = 1dad2b9e c6f9d348 0c2dfccb 04599c2d
+m = 1bb3b245 8f7d2515 6422281f 69c4a2a2 0d79544f 55cf0bdd 48bded6f 15323139
+    4400ae60 6aa58686 149ec5f3 29fbafcb 4e0242cf fd74f5ac 8d641066 5eb347ca
+    9d50e2ce 3f5499a4 abcd3838 71e18479 7e8b913a c7bbac99 8b5db70e aba9e450
+    7cd6512b d3004ff2 8939b124 f9d41511 17b70342 59f1bff7 5afb3e89 886645f9
+    5e2ab4dd 1a05f3da 055a7e44 c51ac1f0 f9251508 c687e0a8 52fab0e5 b33e1ea7
+    e9b7795a 9398ba38 f93b7216 a653e041 c26fda3a bd11abb0 2c1e46c4 29ef2327
+    62f519d6 2da1f0d5 d7fa8a96 cac11b05 cccb4f57 dc049a83 c674537e 8d6f7ad4
+    b3e8effc 2f814084 c6b4b848 2e0d773b 6435337f 746e8727 8d0ce6a8 df757536
+    6b5ce79d 57de14e0 894d84a5 c8704d08 722f2201 9e12f063 70a36adf 64c9809c
+    04aaea07 ea01b70e a0d53436 7e27f82b b1bd1676 9ccf6de5 f3405bf7 cc44e89e
+    196402e2 236e9528 9bd86034 aa163d3d 605f676b db7bc22d 1a48a9c0 f325de4d
+    15b24af2 d9617de3 4a793721 27c37637 f859e494 fbdd2af2 358b6bf7 190167b4
+    938f5798 06f81a51 d0b4c414 56aae53f 5ab2e069 521b8780 b187aeb1 4a57bc54
+    d73fa7a1 507de4b9 9f43d7d2 f0dd7b3c 3233752d 248bd010 98759879 c7fb3d52
+    e0689cae 540e1a25 a2b11a5c 21ef5d11 0c7c4a2e 80c89a36 399729c4 891c0d85
+    9f8619e0 4ee187a8 84006df3 1e0c89db 86bbcd3b b7ac5cce df005e76 61d2d7f6
+    42463771 a6459165 c7866885 a2bb4f79 32630da1 736363e2 1d01eaae 64433da9
+    0f388342 9b9ade96 18bd5f27 859ee396 aa8b9a2d 23bd
+h = 900c1b83 94018f23
+
+k = f84ad0b2 537d3db4 144d6bd4 d64a817a
+m = 895fed46 36b85459 b11d11fd c4273a77 9a92566b 2b459357 6a04a4e5 263af50e
+    caeb73c8 6fc14d86 3a58f169 e2b1d646 87f88a5e 0197c664 ca9b10f3 82db9b14
+    f509369a 55968489 6bccab62 198b8c05 3341ba58 1d8a146d 2f6a0fb4 0def30db
+    7a39cb9f 06b9e7eb 39f8df43 49fd7fec aa8cc3e8 9bf4fc7b 9f008e4d c9046d2e
+    1ccaa2c6 82d5255e 28ba3906 5e75bbc9 8cee4c8a f04d8dec a15b5117 ee2bfbfc
+    75000096 0d5257db bbf0c899 cb8493d8 bdd6c054 17af0273 7f50e7d5 3acff615
+    1d91bad9 24569ca6 94bd0de2 80c096c7 c8eb7942 d8683936 b2962ba5 5f7bede8
+    3cb2c417 76b1432e ecfe6439 005d219a 1afea9fd 9588a62a 3ca6e676 14c059b5
+    17e70fb7 2d1796ee 9b2cbd58 839e140d 4b2eb08c 82728462 e2f10305 4e08d614
+    42b0d441 12b5e6d0 01286470 3eb39281 c27d02f3 4eebdf16 dd200465 9c3064f4
+    68b0a22f f37e734b a5b8eb2b 00012016 bd69c300 ff1d4108 2be3774f 7a68428f
+    51ce553f 37bc2a57 f9ec4056 f911f7fd 2686fd11 c4da8e09 080c40a0 711323c1
+    1fdaff06 cf63b01e 24d73d25 498a4cb4 37cfdf58 70437365 dcaa7b4f efe0f1e0
+    ab581103 02e5270e 5620c609 9e9e9a6d 30f052cb 6529472c ca49118b 4ba8cd19
+    e91f0a20 06f21b2c 7088b0d8 aa3795b4 e28ee1f0 802a5c89 2039c3e3 b1e931cd
+    dfc93dec 45b58a6f b136555b c536b0e8 ef18846a cff637cd 19320832 a1f52997
+    c732771d 9c88c109 12b79340 6c98e201 22f7774e c1c9e7d8 26c44cf4 243175cc
+    f9853e5d 1162b5fd 10309459 3c4f428c 7d6cec27 a76bf0
+h = 18fa4fc9 0fa3960c
+
+k = 594206e0 f677d51e 48f40fec 51cd9bb9
+m = ffcc90d4 3c777e25 ebeaf688 f5ce8b10 1c7b70e5 553d2de7 a5ecab94 3c495be3
+    c88680fc 515d81e1 1a18c19d b5ed1356 44d59e38 36429dca 89cbdb3c 2b620c17
+    ca150c76 e2cfa177 7b1319ab e1fcb2e8 5c39a393 5dc5374a eb3fc5d0 e41f5105
+    d206e3fb 2aa97a1c aa1ac2ca d317b855 e25db82c c88e7ea6 c05f6c8f ab481675
+    500fbd34 6dba6e30 1d44433b 49b53d69 8ae7978e 5dc1ca6d ae4c4d7f 3b5d9bb2
+    140cf1f7 40ca7435 8c0beee8 9a74bc8f ca8ca3ae 4bc3eea4 61437b09 48ebedf0
+    122e2061 cb20a9ab 59ed4748 bbdf1fe0 380ceaf7 0d8fed80 558bdfb8 a30eb75e
+    1ee30075 593db36e c60ef78f a3a8f8f2 971a58e6 1b1cd4fd 9dfefeff 24baafa6
+    a02115a4 30b50cad ff57a538 c3cee1aa cfdeb000 9ac47dff 6c2a3976 0bc44d05
+    64311dd3 94a55e63 8f497e60 14337046 85b164ad 68500ac7 46131bc9 7c4f946a
+    4f747ee0 866f4c82 cbc93241 e3197d57 fe9b9079 8f6b4882 6fda9dfd 975d6a0e
+    359a4e6f ee7c923a 27326ee9 a52cc2f3 5eb80ef7 adcd202f ab4c6d57 562bd458
+    4f1fc302 c1a3dc01 0f408316 6511bd55 3f51e700 5769d152 ecb2cf5a f603bbf7
+    98cebbde c86332c7 2a00cc81 3c0f3334 7fd47901 6eb23bd6 be4e67a9 a59365b9
+    7dfcbfa2 aa2877fd a18b6bf6 6d5469ac 31aceb91 9e281077 0a1b440b 1da2a71b
+    af8531c5 c5984728 4d627002 425ad36b 49fb469e 8f466e77 aa776333 f648f936
+    8eac75de 66a922ae eadfeb10 8bff178e 6e758667 f7f2ad72 5bd87f04 29a5d842
+    c90c44b4 aaf79581 f818c987 fa97c141 169d09aa cb2a1a8d
+h = 1254d8aa 6f1c2a9e
+
+k = b921a2b9 66a5711e 0f76249a 69e7b802
+m = d4d38967 94ab5730 c568d7dd 79ccc550 0c1d4912 6d996d9b 1d60a7ea ae5ab5bb
+    2ff2dde7 62d7ed9e b785b1cb 4473c9ce 337cc530 bc9d9ca1 8ed1d8ea c14ca012
+    7f72d5a4 c3d4f982 2bca966d fedd0089 dd748dc1 91601fb5 47dd28d8 b1858cb1
+    d9052b3a 1b5a91bb f0fe23d0 d34ba911 5433f2d9 04dc8481 21ebe0f6 69000868
+    acc3fd12 122aca31 50e1c07e 65c53597 8b8674a8 4065cdf9 2483d8b9 ebd2e828
+    ebe00438 608bdcfc a39a9d30 0dae894a 31b406ab cea1e747 42f6a080 ab68d5e2
+    9f044d8e 0af89e0e 274c539b fca9b597 07a6324d ad61c3b3 81c0dba3 3b9bc32d
+    ce855a83 5c77deb7 c2ad64fd e35d6869 b9fe7687 24841918 0636282f d1b18180
+    62b15d1b 0eb7a7e6 53da1e86 1ff6cd06 b4124322 bfea815b 2f3a6863 19d4caff
+    4df10318 e9537986 85eb2fd9 0677f903 b74d808a 64c5abae dd3c7493 39fe9ae1
+    d256564e cea60c95 ba705ab3 6e7ba1e5 2a971794 34495a0d 55c5782a 51d6d2ee
+    52f4a8f4 bd97f1ad 180d46ac 56f9b3bb ac951f42 64e7482e 99a07145 226a4de8
+    002cfaa7 1f031f10 e2887bae a1ce9a7a ecfe798d 5bae1848 2af0557e c0e746d2
+    5a453e0b 0009f6ab 2158ac39 6a5f1cfa 502e0476 abf28189 a892e278 7364c02c
+    58918e94 9aad55f3 2f912592 3c782961 ba650c61 02e114de ed7cd2a5 ac5ef965
+    55161027 cd0419c3 5b8e0c06 c21d210c 1eec36c5 ede8851c 5490cae8 b90b2531
+    fe966905 8bdf6273 632d893a 153e040b 8b89b546 433b3a87 d1d65a97 969f4858
+    25a34a3d d9c3c875 49e9aa99 7fd31b5b 875f567d 203bb2ef 5e
+h = c142a1ee 456623c2
+
+k = f9fabe8c 77c4b506 dd6e03d2 27386844
+m = cab9555b 15b15879 e645385b 0654516c 2e5dca4e 1d2d152d ac08f486 180018a5
+    d4edff8e cb583070 a75f2645 a137c649 fde19165 944214a3 0a9cd029 fa631585
+    f7026cd8 0b53753c 48afcf1f 1b5134b6 b61a7094 af30edcd 62d6d311 1cf34538
+    016be035 a534c283 2d41f291 aea35098 ae35019b d7781789 bff57adb b550da52
+    cb8bf329 a2713209 365c5af5 a04dc570 cc94cb39 43ffeb0b 011e0e58 81209749
+    65f88d23 1c3df644 8cb761c6 823c4eff ea4261db 12eaaf59 2ddbd576 75d5a7d3
+    56de7513 f5d809e8 2caf51d1 d05c0b60 721457f8 d63b7f02 cb74c5d3 ea71609b
+    97fcce24 4456f06e 5bcd9efe d279001b b1604864 994a7213 fbedc13c 6a7c13da
+    4f9a3bbe 928b8bcd 1f640ef5 6a290dad 68c63b95 8fb77339 2090ee52 3fdaddc6
+    67fa6ca7 0918d220 d254e90f df44a48d 1d57c762 b9ec09ed 51ace0c5 2e4337a9
+    30cdaaa4 d25c4a76 354490b8 04907647 2e8386e2 27daf385 a86eb9b3 f722eaae
+    33c8c38a 5b7893f5 c8d07991 e61e0e92 ae5cba19 115ad0c5 7f83e316 09f772b2
+    55f435c9 f099ec6d b443af45 8f2480ec 52de51d3 832d6cfb 4ba918bc fbc56396
+    aed49839 9be2e539 b7a0afe3 73bc1c2a c68dd13f 73cc6c77 7716f3e5 fbb24879
+    bf7351e8 75e9b0c3 f70fab84 89134997 9209f17d cc6bab26 a0469d5b b83253ce
+    79218a48 ab1dfb9c 4256c3fa c157ce43 8dea0d5f 6bcd9131 307dc324 a0fb2e7b
+    139b2a20 876db777 e17092d2 b96a2e9e 8eac93b6 9589c25c 23fedd4e 57faef09
+    2d8cfe58 1ffe2855 e49d32b9 d8483eb5 0663e45c 06f3ec25 ea64
+h = ac48f992 f955a7ca
+
+k = 817b6cb4 7e5d17bd 6f2b0367 890a7605
+m = 1f51bfab db7540ea 59172d6c 873f17b2 d82b3b2b 6a3d45f0 3f51925d 2158381f
+    2053da90 10c1ca21 db73540a a6c292e0 27f11cf7 305a00ed 2e0942e4 455793d6
+    122a5995 d56d95ca 8b020b16 28619fb6 d2e58144 d57ea75f b9db3b26 6f07269b
+    2cc05068 a786353d b9a18f50 504bdd4b 5ce065b8 7af25d7d 967613e3 662946f2
+    348bf2da 8069e93e 6f1537ca eeb6fe1b 67d9d41f 81b28a16 54903812 d911dea2
+    5e5d7400 b282d4d0 9faa2942 2dda46d0 ddd83316 c0c31368 b0ed0081 e5597fdb
+    46061233 731c9e33 90039627 74e95f29 552d899a f377604e 3a9510d2 7080adab
+    1f3a99f5 8457bce8 8978023b 377242cd 4c9ce34d 20819982 e16a8acb 5daac3b0
+    332ead77 e1f3f846 567389fd b14694d8 7965742c 557590cb af55c97d a71fb350
+    489a4d85 66a6e94f 6c264759 3438240c ce6b2354 d6fde56d f0845cf2 c576b539
+    cebf1673 702a415e 0b37e0d8 ad6b8adb 9c22f253 bc8958f9 1fe464f8 b39b039c
+    7f92b0d3 c58daf28 7e8094a3 c882b13e f213ad95 ea0752b6 727d3d86 add4069f
+    ffc2a2a5 27e0000e 8ee75c56 10766a20 d94ec143 d984b9f4 0ad76fc6 dedefe7c
+    b40ebd26 c42a690e 52939a6b e85f4bef 1cc2e302 19bd897e 6e8cf4a7 71213697
+    2434c4d0 ae516d21 82b5c2c1 036088df 62d8c8b4 5fb61652 3abeb2ae 82f1d6e4
+    11e95495 18b213de 1546f8b3 12118d59 81a89194 fd7ebd9a c59daf28 e31016ae
+    5d2fa823 e5839b24 df90c5a4 089b4032 411cc857 b936b2cd ab443518 1414ad21
+    1d129899 763d51f6 90211192 02d97b19 07100291 4a16cb01 625126
+h = 3003f1ad 1998396e
+
+k = 6b1e3e35 9a3cdf57 2fcabfb7 c2089d63
+m = 9ef05140 1616343a 3453c4a7 f2901240 3ab65091 1d90d768 f3fbc9ca ceb68060
+    e13a3128 be8ce3a6 ffa89a71 4318ba25 45e01c18 d268bfe9 0bac453f 9a73b9df
+    5c2867a8 96f0840d e1a16c65 6c4ab42c 154870f6 d47a0af2 549faec4 247941c1
+    e2d69f51 a3bc55af 7eb6b3f7 1ded7db5 9bfe8d1b 9e773f6e 0cc1a7cb 1da6f659
+    bc9fc988 738a7f32 b15c078b 9434b1e6 e8005039 19222c37 2ebebcd9 711d2c67
+    cf38eb06 765bd4cb 7f6a0529 5898e9a1 26660104 c2990f65 1289d90a ad10f7c8
+    bf494145 773d1b27 ac9f9f7b 48b8624e c4495d5b ea2fbae5 1366ad9c d9c25d19
+    7bf4caf3 64cec2df 7de5314d 2abc7ebc ef49c6ba b1ba6430 64b1d047 cbc1cee1
+    6afd2733 8db3ac56 df3eb128 3e04ba0e 849c13d2 50e796af a2292f73 e849f53c
+    b229b255 fa86ce67 f43168f0 f232340e bc14119e 328b637a 4b7cde9a 4514bdd5
+    45752f77 35b72014 96179837 cf8ed414 c37d6a33 fa71b7e6 20d16270 22fecaef
+    103ae57e 3dd7441b e1df5d05 2a5faa10 d2a437c7 cc55c26a bc19cdd0 7187867b
+    87be0861 5aa5dcf9 10f3d289 aa568118 d1cbd7db 2c5d4faa 2170e0ad c0923a5f
+    ae52c0eb b741eebd 4a28650b 48eff840 a3d54ade 7341539d fc06d9da 907fbb28
+    272899df 7ae04ddb 019a7f53 ee29c4c0 bde5acc0 68ea3b4f 6d5670d5 f3a918e6
+    03711874 1a39abb5 d621e1e3 6cd181e2 ea798f2f 42206b5a 69c1e5c8 b8062c76
+    1b8f3168 646178b7 989026a8 a3d30b6c 6a8c4272 d7785e38 57cdb8e1 742d97c4
+    5c5e9c60 42160906 4b9fcde2 4ec8a8c2 fe901644 1443d4a3 5e1fa3a1
+h = a303700e a8d6e963
+
+k = 782a8dd2 25726efa 613012ab 16af6629
+m = d41ee497 c01f4d86 9896a01b 8c102397 6cda14a6 2d93d5bc 6d21c460 786415ac
+    0495e164 73936fa7 fe1fce52 2226a688 d6c98692 9cc16b66 eb265b85 75cb731e
+    239399c6 cc6ad120 a9a0333d aabb856f 86071c28 99c6a939 b68b168e d9cc88bc
+    c629b8b2 ebd55084 6f9da944 23d3adcc 393e5fcf e64191bf f08f5440 80bb9b24
+    4ae8dab3 584f3a6c 45fba9c8 182389a6 0477a8ef e17d9a40 9061d4d4 da63a9bb
+    9017ebfc 7581901a 04fcfa7a fcf10842 903fedd0 7a8a76e9 28a709a2 f6fd3f30
+    bd8d439d 30f7af74 16a44bae d6a4441e 445399f3 79fce26f b5447f95 bf84d613
+    de534242 abae0673 4cbe4f6b 169799f5 f6c205fc f0cfe08b acaf82f6 f5b28dc0
+    0fa3fd6b 94235ad8 8d60d070 d046a8cd 1edcd01d f8209c27 14971502 02006e29
+    85574839 ea4e4152 1b2c6828 3ce2a3e6 6280aef9 f025799a 3843398f f1458fa1
+    cee2c3d0 901624aa f306130a eb78777f 139adc11 48b0f149 af09c7e1 52366a12
+    5d97677a aa378626 bef59e51 c71afe86 1857e25b 03842cde bfe983ca 011791c9
+    d8322561 2246f523 276d9f4b 4c7b063d be345b0e de60de2b ac253b0a 7c669859
+    e850843f 18982191 0213fdce ab8d4482 39f59a38 0a15674b 4251b9aa a44cc885
+    cf161543 f06cd5b8 5bd4a821 978839cd 94de051c a69a2a8a 6738bcaa e0279764
+    dded8714 a6eb76b6 743de3ca e2aed50e f8e4ca67 d21406a0 12d1c89b 6c250e20
+    eacf091f 67471cb4 1651cac1 fc0a6ab9 1c125d6c c1d25d0b be6d6211 3f873156
+    ce2fd0dc 6257e694 8b58b9ec f6a77b5a 811381b7 3e6dd461 7d407f7d c0
+h = fe383b7a 66272a44
+
+k = 14aa4ce6 a9c66081 3797efb9 74810d8a
+m = 1ff16f65 a4ac7b2b bb84b8ca 0d7c5d30 c70235f3 42bbbfbe aaa9734d e2bd681d
+    413df4b5 7181b07c f0adc1a3 ffa6d28b 7c63e897 13434419 59b3837c 29ffface
+    df80a8af 6fe2b2f4 5d39f282 a0c7fc13 9c36a0c8 7f15a771 b64f907d f7dd03da
+    c13e751b 4ba5b843 2bd47822 8f42d369 cfbb1e0c 0353dae6 9bfabfe2 705eecf4
+    6f4c2509 4f056cdf b253a43a 949f9dd6 28a0c3da cbe13054 6e2c1b34 ddcac09b
+    73388549 5d2633c4 3eddf062 65318151 da8c32fd 46e370fb e0f3bd47 388aaedb
+    2f57a319 09679d7d 1f81c27b b769ada0 b25b4250 896f081d 6ed2565a c9d1294e
+    6356f8ce 296a78d3 35c1dfeb c0c817fd eae6fb22 bf1a7923 3664f733 ab75f622
+    6b152681 cef64963 26eea0b2 dca9469d 12e9da02 6ddb4b33 fad10eaf 2750f9ac
+    34b92c0d 92c9e86e 0fa975d0 2553cd0d 339f8d7f 56bca1b7 09b1ba31 ab8298a7
+    61abeb56 0fd1d694 df68ba71 e9a356cf bba7bb93 0d385e13 0bcd3550 9b783e45
+    0bab52fc 05d450ec 3c29b66b 6677198c bea7eb22 c15e4f13 c24b0dca 96eb889e
+    bb4e337b eb7f6ad9 09af16d9 e276f340 9b4c35d6 4a22038d 97b7f412 6e7d2546
+    1d5e1c09 4282c77d b302bee1 df865812 7b5aefde 360bf994 8e16f991 5f641e7f
+    3be8e03d 3582e4f8 5141f28b f237164a 6e2b72f5 e4e78f3d 2fa717d7 2f945b01
+    c0926753 d592cd76 74b7aa56 13360136 e4d0f818 e6ce38ab 32cfae95 79cd7c8d
+    b1ef09a9 afa51e57 7cbc9ad1 82a581a0 f3d5bb55 8e99bc43 ebbfe558 98a0cdce
+    fcf00a43 a5e8a4d2 19388120 452995d4 1a3089dd 9d3d606b c7680375 21e8
+h = 4dbe766d bce47d7a
+
+k = 24af243f 6e78ba84 dd9cf300 b8761edf
+m = 9203f670 f69ad42d c8c09f18 8892208a b20579bc 3169e62f 94fe285e 074dce65
+    738a65e7 250bfade f8856ad2 3bf557f3 8b92dc3f 7eef131e fc5a43df 2f5001b2
+    19bd514e 1b64fca9 6ee03f97 4caeb8fe 3ca5180f 5d7c8c66 aa030119 395f8e87
+    fbaf1b70 ea430f09 888c8095 e4df4041 8cd45dc6 a7881504 ab0d8361 e30aaf2b
+    a5829a4f e74415c5 68cd00ed 06d64fcb cf762e2d 2c85fef9 45b32698 8bd9e0cc
+    ce869db7 5c844056 c7b9714d 3236b293 4872f81a 6644fa29 4a759704 f7bf1fd3
+    59a0df1a ac1c696a 7047e865 b367eade bbd49776 a43f6895 a0cbca53 1e3071e5
+    1c335cd5 c2d640de 391f0ca8 ccda3386 d2396b03 27f96a21 e59c7255 4c51cc26
+    4cc044e0 5428f6f1 c3554323 3730e8ad 6d3cf132 0754db70 eb4a9aec cd48a15f
+    f151d062 476629cf 3625df0a 7d7049ff 3def891e 5ade7a7f 0bd8655a 6dfbf9bb
+    c1a45faf da1b8214 2e97cf0a 25ef75e0 65c40b4c 20439cfa 37fefb52 a9e3e292
+    d7e19fd8 49d2965d df04234f fd5be0ee 9fbc99e7 84883af0 e223c7d7 a9f7487c
+    f1192c54 38908c74 cf46e09b 346f4a00 5364c66f e290c5d5 8d6f7317 7b9ff60d
+    afcd89be 1885d5d3 d105a186 8f043217 694726fe 8ce7ce3d f27c6cdc 64bfe00c
+    c8491db0 66608561 b5335265 340c3613 567ae618 908b0d20 6ec7f919 15e9b9a7
+    5ffed4d4 c374703b add5cdcf fba8e837 9ea9400d fa4d0956 001d56dd 82007492
+    91b763e9 3fe5ba46 515834fc cfee1a07 b0d973e5 98993582 3c3c2453 716cede9
+    5eb8419d dfa1a611 3e86c02e 575bc775 9a9e0846 84da09e0 5e000609 d4a4ff
+h = 4bd444b7 b55677f5
+
+k = 6afea270 b5c30d14 ab4c4684 162d06cf
+m = 93d26670 0d226ccc fae0b20c abee028d 38f6765f d339c72f e8782f94 14a6b24d
+    4f8d32bf 8642648f 09038f09 ec203239 ae94e9be 9989390d 27be0a50 e26ae09f
+    c3618ade 970f78ac 4caf0978 1c58a190 a56ad6e8 5785770c c733903b 173bf05e
+    191940c9 bf0693ae de5f4158 7fa0afee 7bf63554 5529b7dd 0298d42b c768a135
+    704424ff 6302ead4 3ccc74ad bc08f09b 0a2c5c09 36b6a419 4b5f6a8c d2691fc8
+    6f678155 27887753 8365f6c6 1e6e463e bbe2fa8d d448b8f8 e9894b0b 6e2f4cae
+    15063f63 d2e2fc26 7fbd38db 5535c154 3dc98ed7 82d8191d 029df03c 8f4784b0
+    6b4c8e5a b236c020 716c4fb2 0fd50492 580aa222 bcfeb5fe 6dc1497b 8a1d85d1
+    5daeac58 a69c5a34 aa217773 6204b14f 2831fd06 11fb6d4e d70d0652 b1702b64
+    f96109de 49d5bcc4 8b45f867 aad0b825 18f3559b 74f2a774 f5b7a7a5 40b7823c
+    ca96b1a1 2a7d065c e4874f7c 5ba82f3b 08ed841e 46584138 e6df22cf 169c2ce1
+    a162dc6b 582c0509 2d1ee488 e15cba2a 5696ef8f a003ed5d b5058562 99e3ebc4
+    af89f58d 27e48a64 a5af1ed2 73487ef9 e5aaefd6 44e6ae74 67802681 491b5fed
+    37144ce1 aaa76c9d 23f9d4d8 dea4b256 6e7eb22f 2cbd59d7 cb8a6e01 0d2099bd
+    4e80d8a8 473d0e14 da9419cc 75cc34c0 8d045d1a b92f1d61 eeeb6ba3 a7d2242d
+    e1b4b783 938ba065 c61314b7 ae46f150 89f6931d c43ae9cc 160eb99a d41a8f8e
+    d7f7ce6f dcc58b57 b5f746f8 cac078ae 1c70239b f1a50f3c 766c43cf dfa7e469
+    6a01ff1c 9dc4f182 65b479bf 898d158b 4f7b2bcb cf192acf 8ce4a959 bb29d10b
+h = 5c6d2f4e a7e70267
+
+k = 560bbab4 83462334 6c58b56c c6e7ba1c
+m = 6bdeae86 4898039b 5af6b60f 7812f5f0 117c357e d646ad3f 9fe6469a a061db98
+    38f3b0e5 ea6fe76b 9e27b5af 3ba4a452 f80d51ba 68ae9be7 a531cd36 259c3810
+    29a5bdb6 ae212db6 b2b433ad b3872dbf ec8ac693 3689ca20 b5aece3e 262030a9
+    8c47226b 138f1b23 b91f2e01 c43be8a5 6ec252b3 d697ac77 60bfedb8 e627c2aa
+    6d226aeb 00d32326 6cbc3325 930bbf4a 69634c09 b56ca0ae 90157d89 3cd874db
+    56c76002 6d9a8146 5d91f854 5c288a4b b501db26 d8cc51f9 7f9a85d3 7df927ef
+    a520bfba 2c584784 e6f4e713 9b689cbf c74a2fc9 ce5f006a 9ae2356f c68c0cd7
+    fc920d2a fc83dc2b f17572e4 1aed40cf 9f886f5d f7110f1c 5da87837 a0d8d69d
+    bbf14bda 72aae86d 542fa28b 31a27279 1cf01fdd 83e030d6 cb7472e7 7d3909c2
+    28c35dd3 bf115e1a b1742b6e 8e809249 22029f69 9394dc3c 4af426e5 3bbd1c31
+    63d50aad 935b5c33 268da69f fdd41a35 210a139e 109ed9dc 433d72f7 00397ff6
+    d6bc158a 530708e8 a7d5c1c1 1e36785d b86322fc cbcc5ef8 1660d7f9 6c160fbe
+    6f366d97 17d8bb76 be7170da 32141bc4 a9ca1f8c 5dce990d 7da61e42 28d1ee5a
+    2c9e6f07 9d63a4f7 559c9f59 5f9bdc5d 89163241 b94ec937 2449249b 6305101f
+    80237ba6 bc902fad 2fc7c677 1f1784d3 10614483 92ec2e37 4dfb7395 bd2a6246
+    23f615b9 dd7106a6 c2d64c85 26675015 8b021e41 ee58bb96 7398a235 9502317e
+    225f336d 1afdb60f e071a092 942e80b3 54470f68 510d00a4 fdfed2f3 cb4781f6
+    98acdcef 2129f7e9 b66ddf2d e5a726a8 c1aca309 5365b46b 76803aa6 4e4096a2
+    7a
+h = 08ebb5b1 d5c053f7
+
+k = 0cee68fd 622f4811 3b7b6946 636756d2
+m = ac584cc0 b68e3478 0bb3faf5 a23d7dca 2b5d6ae2 a9ec61f0 ec9473c2 a6b3891c
+    dbbaedbe ef406640 3b8191f2 8f25e546 185c0b4b 7a546975 6e8cccc4 6dd4fbf7
+    0da7e48d 08ea41b7 2956caec 0a1f47fa 27ddd912 fc28e0ca 20f59fee 1c3dfab1
+    93812862 77241011 229da8eb 03e59c0b 47258b93 a76c22c2 f34d2652 934b8355
+    011f4f43 d9a3a7ab 26442a76 e291d741 a93ac589 cc1bf493 d3fdf638 51c94a0f
+    35c04342 3a38027d 5a88221f a06b6960 8dfd2f0a 3f140120 08497f26 0ea4e73f
+    d8371390 631cb7a5 58e99e79 752b2bab ee796249 05dfb0f1 8d707210 1cea5178
+    cc60510b 85f69f37 77b6deec b615f4ec 5b900d37 88ead691 ae6c1433 b9eab43e
+    2fe1f2c6 0bfde47c c0edf465 ef39f81a 27678f2f a82e87c9 872280b4 f6241fd6
+    690404ca c46ff0b5 fe145f20 67a0d3a5 9d8fb413 bca6b87b a26361e2 cc1a65c5
+    63932003 1c8d183c e858d33f 087a2f7d ef35b85d 9ed2e8e6 e61ed6ad dbe61d39
+    65d6e744 d08446f8 719bf09d b80d708b ed2ce7b9 913c7ba3 87d0244e da7b5ddd
+    19ee0f55 70379773 50a3c834 15fc5f74 6b3bd090 d59c1e1a 53371a79 487e041f
+    985a03bc 0b5be8a5 24a2f700 7f2f4c7d 1ca346c5 27bf090d 82be249d 28208c20
+    55c5b13f 60c9500b 882a4c74 f9963bf9 6dc8167c 2a475a3d d9da58ac df79ac4d
+    d2c5bec7 7d831e3f 09e78fd2 fa9ce6bc 91f6b822 dc4a6fa9 1d196801 d6f7f7c5
+    0c2ce02b 27ad1c7a c2b53884 be9ebca3 1a19a9ba b5488127 5916dacc 1d52726c
+    6c467962 3f6de4e1 657faf5d 39b4311a 480bfca2 37571ecb 4329a13b 4f9a75c7
+    b596
+h = 93059db4 4d8ff56c
+
+k = d90df048 cd74db05 aa1ca591 c06cf83c
+m = 314013f7 835c124b d00a6421 97c555a7 798a92e0 68796eea cc428ca1 471b794f
+    a352fccf 1c2c674c a17fdca5 7177c50e 16783453 3bd5d87a 7be00cab ede0c07f
+    4d09157d 707d683e 7920a56d 4417c60a 9bac7b05 0c13d638 75cc78d4 b2f888c0
+    5443e1b1 48aae37d cee611ae 1748c25f a6eae5c0 dcd8f0ab edfd1c24 9353b57f
+    69d80acc dd8bdb56 69174c16 d2bbedd2 9376cc1e 2133b694 ab37f975 d43601e6
+    eb382d13 51ebdac4 9d8a453d cb1dc61c e9dd333c 4e2b4328 108e6fab 1ca52659
+    fbb376b0 14bf3fd0 8296f1f5 82388e66 643ccd52 c89be10e 9d387947 4444b4ac
+    7f0fa9e1 d96f9ddf a1181161 0e0dae31 64f4c729 b9172766 e24f7f3e 787eaf76
+    b16dd67b e2cfbf42 6d5a20ff 5b7b92b5 ab76ebb9 068fd086 fd43e2f3 f4a4e29b
+    85a67516 f0378474 8cc745d7 8084a228 4a65a28c 3cd77974 b36fd34a 1c73f652
+    f8e2b381 d7627d77 e298e510 f3f2b53a b316cbfd 4336869e 22a9ad6f 4530404a
+    7be33256 5d1dfe02 b3c3e0ba ded7f0e8 70975e3f f6e5e599 a326abea 85d55993
+    59803fca beb5073d 314749a1 76a69096 95d51252 39029bdf e2212ae8 91c3c8c0
+    c166bedd e71c3b4b 7af2d9a6 cdd54967 c0e72413 f27f8f2f 76766860 f77592ab
+    25fe2a9d b6e2dd32 be78c736 6678af3b d3513c06 23acad4d 86459402 30a3eed0
+    7f000aef 72ce8d12 c90f0229 264480c4 2eb37a48 a6c3c1c7 766a3946 97057cf1
+    3b59dc2e 8c08c356 764f5788 0129483d 9ca20d3c 7ab86e3c 596978cc f3298efe
+    bd6072e0 31027733 5cafc1f2 e8f04ab5 71fc1e97 1ac4aacc cb20f03e a05a5d0d
+    45bfa6
+h = 0061dcc0 82865cfc
+
+k = 93cb4998 91c31330 f9416dfa 001d5cd1
+m = 07ea1964 8276fac8 33cbb2f1 999fd3c1 3a0ac8cf dba58506 f071695e 35118eb6
+    23a5a5b5 d81f78e7 96cf4a99 56c4a33d efce62b5 d74725e4 6f452951 9361b2eb
+    5b515a54 4164435d 4ebf139b 2784cd12 c7434594 380da736 4af84000 884e0425
+    beee1a3b d9477478 95d47579 6b17be2a 80c2f9d7 31ea33b8 710f0b97 16d8d85b
+    da1046d0 8de20279 d7a0c62e 6b410f9e 8ab9a807 67d75624 c28a6b19 8bf65417
+    c0e491ae 4b966c42 916abc1b b6c81bf1 53605e04 c00bc0ae e137e93c 7f433dce
+    fc477ad4 4f00886d 03f83c86 2784c3b7 c05fd986 24d09332 468efcc6 1f18e928
+    45f7d3f3 a53baf47 78042cf3 c0b3bfd4 f6542517 7d4bea0b 07670d5d 49600260
+    84cbe4d2 cd45ab3b c0a304cd e3cfee09 90ec7556 9eadc576 83eed512 f7aa9cd3
+    0a1788d0 62b56749 7de97114 931f06f0 1383f64f 03c93240 eb4ccdc6 5f21e097
+    e8df24ea 12b7d90b c96be8da 30e1db70 c487588b a5c3b29a 3137526f a7ed4692
+    009f7cb8 605b0894 4e17e9de a312b066 d582ee2a 3444f3e9 604fc94e 08b978a0
+    3dd66480 5c25c635 3efdac1b 308ac849 cd668e95 ca4749ed 6599a302 2bf85074
+    60f00761 53d413ce d761847d 6489722e 924debbe d9932b6f 06fafbf6 f74c34a4
+    d3b691b7 00adc2fc c2f376e8 03536462 c429e967 bdac6f47 e9c17181 72e811e6
+    096bcc15 e246daad 2567cecb ef1ea77b 7ea90180 6f059775 3abb9196 055d4367
+    4f5a5542 3f2313e6 a6d3e5e8 f9342214 3827e4a3 a9fda46d 725f443d a49dbde7
+    133d794f 0024f855 e9b028d7 b682ec38 e756e2f3 59c9e142 64e5a636 ecfd0a2c
+    813f949e
+h = 61d87339 994bf40b
+
+k = 1a7e1340 a4e5061e 65672ea6 c685268e
+m = 2ab40d4a ed451598 bf2ff8bf 063f8788 095e85bd b6ea018f a7bc5c16 d2e57de4
+    b25293bc f7e29f50 5f3d1fdf c60ddc6b d54b962e d1a90295 85f517f4 05ab03d7
+    ffd2473c 044b729b f3305e38 0b459657 9d5eeeec a2dbd7f8 ea10613d 62fb03bb
+    3bad286e fdb7d521 31e72fd4 cb91fe6b 809762e8 18bd5149 82abbd7f ef8e81e7
+    0579ee1c 404c5af5 9bdd9486 0a2071b3 7508234c 3eba6255 79ba0a23 dbe28fa5
+    c20fab0e c44f3a81 f9d83b53 19da5748 4d3d6d01 dde9da0b aa13be5d aec83f94
+    190b68fa 34fda229 cd919942 a9032d6b 1d041ba8 13f5d66c efc92933 66e58b44
+    048be05a 39363714 25d2d225 b1b94e6a 472049bd 1c07a1ce 618b44f7 6fd57ba2
+    cb343653 2922e34b 35b53310 d10c3b25 01d5a7cf c2d03b2e 24f93802 67311c2a
+    6a3887be 848a9c69 2aeae753 e846864e f1b18f02 45f26bfe 3a6879d0 40930623
+    9d0a99cb d0616bc1 9000fc28 77682794 03d8a437 0936aba7 422f2d40 7cc85dad
+    d3d4634e f6a85d9a 24fa731b a16d02b3 185b8209 2a8c6419 9d0fd856 ffc5b5fb
+    b8c52cd9 37ff868c 6f3141da d99f8b74 d600f67f e463721c 86ce8542 40d0b06c
+    9ff5bebd ee177e38 04d1e4b2 259fd2b9 f31b9e6a 5135928a 257b7c2a ab0f4bc7
+    9c1fafa4 956458dd bb23a36a 1a1fe7b1 feba770a 7f1e3953 a157a03f 5a5b5dc8
+    e20860ef 8c7e6834 930ebc94 7e473c09 473830fa 0663231b 30474ffa 752b3880
+    b292d441 02a7f744 537042d8 536867e8 67905f2c bd5b27d3 e92cffd6 79adf5d6
+    2d41bcbc 890d1ef9 739add4a 7d7c8da0 df4d98e2 409b823c 281ac01d 792b8036
+    dbb43263 d7
+h = 5df49f81 ef0bb8c1
+
+k = 541ebe95 f4997f66 55d4f06d a532d701
+m = 8711a470 3448d7dc ebb938d5 56560e01 8651f07d e85e207c 518bcd13 ce11a0e7
+    a73806e5 fdaa5f99 449ec70f e1879c5d 03dc2e24 22173afa cab13f68 cecd2a83
+    e5efbe2b 8c2fcbf4 d11f95fd e48e4e8d cdf935ab 9c04d5a9 f4380366 51642e42
+    24c54150 71d746ca 15793f94 6da24b1c 29b27fc4 93c61f80 8e7da505 24df154b
+    aa608ff1 5c0e781c c26edd8a 5f911f23 c866be55 b6585de7 98619055 b06e7990
+    56e57ba9 cc5421c1 b54e012e ec641674 3dd66ab4 5ba4062c c927850a a5dc16c0
+    c8f4b8ce 460edac3 f95836f8 bf77fe73 19ad1106 a6bfb6a7 91d72d14 95c3e06b
+    a86a614f f5480f5c c709c3ef 784699a3 a2a0b1ce 0879acd9 4d8f22c8 be83b914
+    e4716016 096f59e7 8a69fd4e 065eab84 265a5247 c1b5f937 b9bc16f1 79407e1a
+    f1462b01 33e0a220 2bfca9e4 a76361af 317015cd ff84e9fd 4d749324 97c1b0d8
+    b0260198 720ebfd4 4a516253 54a3bc63 52650edc 32e819f5 d4d90d5d 3aceee08
+    bc20d7cb c0cfa412 be2e1dbd 0c850492 98da5bd0 4bf1c453 89f8e8b1 373a410a
+    1914f537 841c71ea 14ed6ed3 967f1d15 a218336d 2d72f823 fb0d5de5 dc5429b0
+    b854be67 bb43ea10 7f6e7498 dbcc3361 7c590589 23ca0fe0 36fc7d0d 68325ccf
+    7bdbb837 099997bc e436a791 88ad7788 0580eacb fd3dea20 fb81c988 e384b744
+    470d91d9 a6491e12 d507b7b0 7bdc840f d63539ba f3b52b8f cbe529fb c00dac43
+    22564420 b797c86c ab8485d8 5627bfc0 b6b3efb3 61403e1b 89e57a62 ce5062fb
+    9deef4b8 3c306e06 4d25f853 b1b3e849 61fcf8d6 79bc3a92 365f3bcb 73c0fd7c
+    73362061 4178
+h = 693c4286 c4e5f696
+
+k = f51e8888 d648381e 02967f47 dc16b71a
+m = 9a19da37 d9fd2d09 9342532e 2ab897f5 396730d7 ac6e2026 938fb2ba b84b38de
+    cac4015a 023d1ffa 234a4362 e5d2c399 354e8fda b2f0b5c3 7194151c a9bde87a
+    bbae4596 b1c0ad98 b0b65210 7f078ce0 70d3ec55 37e53334 88cece28 2ecb5c38
+    524d5d62 db024b15 d8da9169 778ea9be d01591ef 0a0ac297 eefcac5b 4d33d53d
+    9a0db24b 1ed43a56 fa8cb049 a7ce8339 63cdf3e9 509e4815 9e5080af 3c272687
+    2cee54c3 dcd66f07 f5eb89d0 254411d3 1831345c 9096ee5f 63c6470f 5273099b
+    0c80e733 e66c0cb9 bdc577f1 2b41ae3f d61f051f e38eeb1e 9cb14beb 6b3efa50
+    9a16acdf 4d724eac 59e029cd b8eb1aa8 d53f2c66 6b7f0d90 f68ba689 c109752e
+    ec8c8280 f802bb8a 2bbc0a9e 55a6ef6c ed97d01e 0d4e059d 96066aa2 1f7f5553
+    ceba8e3e 7f228919 86e4ccaa 26cb0464 36e6857d e5eb6747 dba02099 34db91e8
+    169b8dc1 fc87e52a cf61388a 7bad10b1 a105abc4 fac9539c 2f1b51a9 0634879e
+    d1b601e6 fab8697a 16925f2b cfa6df25 8699355d 32860b5b d2ef2014 3c0f54d9
+    003bf050 461ea15c 159a0df6 a3bca1c0 84df78e1 f0950c9a 44398a22 5d70616c
+    10fffc7b a463df8e c53d1795 b1467970 5a64055c 0770c09c 263d2260 ac55c988
+    0cb08c89 6054b3ef 69b32dbc d713a106 281b5802 016e56a8 3d2d34e0 49ed5df6
+    bfe87f77 4bf956a1 b73aab76 753ec96a 58c245fe ee21adc8 2bfe21d4 f8d2acd6
+    721e5e1b eb26b240 d4479e5f 4c1f75fb a875fd1c 104b5051 8f2c1d85 3eab9580
+    7e31a7c6 239cc40c 18ceb121 cdbc4c50 59c27e99 2660d6e6 89781aa5 bbce2f71
+    097ed20c 33ed37
+h = e54d74ed 2e711346
+
+k = 5f801162 7f986cb8 c7091e6b da2e36e6
+m = 48c75698 785d255d a0bf4b78 f52572d9 15f64024 ddc2ee96 0a43e6de c90982df
+    931c1f1e fc18efe7 94308da8 013c99db e696ed6c 883c8550 399b5fed 2b94423c
+    7d07e677 77ac8938 203f49d0 816a1aa4 f539252b ef804554 fc9fc64b 61915d1e
+    de40152b fec7b10b b8f8b462 306d434e e4b27488 b62154eb 831c9957 2f70a96a
+    b6914b61 ca42ff2e fdb6bc34 64f63fcc 4789dbca 98f289c5 2e4306a9 e406e97d
+    491ffdb3 11ca3d57 2d967582 7ecd5c93 ee825599 6f837df7 5638d3a4 2b025b7f
+    b9729c87 bd3c036f 37c8c7a4 bd98fd2f a8524577 ef20d761 bb03b766 f2ca7ead
+    0bab9dd4 ae6c9b8e 32bb846b 0ba8610f ff9a7c19 4dba685e a79fc702 8754022c
+    4b202032 c8c2b997 993c51f3 5a6f37a7 4646134f d0cf8a6b b9bebf95 e3143829
+    bda4d204 15dad3ce bae5be1f aed6d2f0 25e2d920 87066c17 8c9cd6fd b6658c44
+    774ac3d0 887ea8f4 0eede4b5 a04c9d65 4d4e98f8 54a4796f 3df5489a 9ed8c36c
+    531b0350 73f42c0c 5fe976c9 4efc5882 1798313b 14428401 42bcf133 cc81df14
+    17a26379 2e408f78 c33fcdc7 912f3391 916adae0 9c811c84 73464b78 31040971
+    96533e08 9d8242cc eab91d68 886582cd 5ed92a3c 1f11e66a d431a4be 34964f6d
+    bbe5f639 8ac45f83 74f42eb6 882f9ca6 4b1cb7d6 b0054cdb 55aa55ce a9953415
+    d9ba33f4 32e00980 2bfafdde 782d7cea 4970208e 9155d3a4 1d574013 afb5f08c
+    8ff78ed8 e4a49c45 b3db05b9 13f9687a 29661598 56a45914 9ffff100 69a6919d
+    5728b202 cae165e1 11929519 7cd00da0 91ad3fff 79f68d46 a2c47ee1 590adb54
+    4c161050 0c6ae47c
+h = c79d4f0c 53d307c4
+
+k = 3f32de8c a5412594 c1b27703 261e03aa
+m = 24f4dbac f71d8aea ca5092c4 81c1c3c9 9a44ffb7 41e0494d 50bf6214 dd321a5e
+    0cdc9c20 6584a0ac 4f25dc12 91cae782 c0db2190 5aad7c8d b78f9375 39b6b8ea
+    426e5440 cec2bc39 1828359f 9bce8b40 e24a649f e3dafe2d 460e9b88 8c73b7d1
+    9dadd70f 2101f504 3bbdab48 f4f721b4 6c336b8c 7c88c8e1 3a8040b3 86633fe6
+    be71e5ca 2d2e2862 e183428a 9b9a739e 1b036986 bda6a3bb fadf24e0 b0327d73
+    26cae930 38194b61 d60af197 de2c3655 37e099e3 1e76006f 72449bce 5b730a01
+    10fbc6ac d733bf06 4524ace8 e7be2557 e0719e8a 12c69e9f 1bff9178 3d17bcb4
+    1e16f7c0 48821819 f3183387 649e847a ac3157d0 39ebd1cc e5cff4fc 522b58ec
+    edb0c3c1 6bb03c54 97fc07e3 75b9ee91 aa1feea8 06a09d4d 430f0ae7 c15476ab
+    7e514f35 5a464f69 c237e87e a156a67f ed8e6afc 8e0121e7 f6697bc7 19cf11fa
+    308a8130 253ab895 0bb10338 09836b2f ebbc6ed9 a7b33cc2 cd05ae8b e1e13693
+    2e763679 d9451512 6b738b1b 2cae295f c1e5195e bb75a0ea 5076054a 7b598f8b
+    b0cbebc0 4be369ca 0c79c1ca d3ea1367 33ce3b81 d2ece2f3 eb03a12f a9d36cd6
+    ef9d1c4a 2c84b003 4fa374f6 c58e2ab8 46558484 7cedc14e 25c56ad1 a8f8e455
+    914828cc 9cfbbc2c df0fc4f6 8388a0b8 601af4e1 f2dd383c 6df3fd10 ad82db72
+    5a548cef f0fa9ae6 34fde415 77952d23 ceffa639 dec53cca 103ee221 85918a92
+    7d40fba6 9bb7f0c8 4067a481 47c3ea1a 4f6b0053 127f540e aeec78fd fa808d95
+    f5c7317d 022f951c f902591b c35b703e 7925fdba b248fa66 e7abcd8f d3e613c5
+    aa33b793 1dd5e3ad 5c
+h = 7e5277e6 9fe9c1a6
+
+k = f946d7f9 9c607779 5f588fc9 d96a7ee0
+m = df61b52d 78733e07 98f03a28 206e4f24 5db53014 34b859a0 c91927a0 90b2b091
+    5995953e b540065e a11aa360 557b6020 558efdcf 71fd04c8 a3569402 4698d5fd
+    b637276d 9ebf19ac f23faf38 1093be60 888367f6 ed051c24 81ebbc3c e78e45e2
+    b6c30500 9d317f11 1dd21cd0 378ef529 bee06a90 fa501628 6a2c661f 522e2d70
+    c1d0a92f 5fc64680 1bd53bfa 7f6e2982 a087cf33 a636c4fb 07234f8f f0597c82
+    66c98162 63f8720c 60aceb77 d7dbf5c1 6f395832 eefd8b53 3f0d6d78 f9301b86
+    06b6e978 91f8d281 6ba8c398 ce110a04 6b7eed97 b2bca589 0f40205e 610d2ca4
+    c21c8dcb 654d101e cefe71e9 d472a1f8 239df677 acdb2109 96ad284f 68729c9d
+    74a85a96 59a4ce25 9f1be5c2 ec296a52 c1204645 984def48 a106e3a8 71d5c66a
+    d7eec932 4d3e0646 8bf8c5c7 dfcedcd9 3860a4b9 3e108b14 ba37d445 077857c0
+    cfebaecc 30703c2b 3ecf398c d22464a2 5cefa65b 61fda021 f8171375 38826dc4
+    75f04e96 d656b106 0c3bda9e ff6e736a 94ed69bf d991b4ee 879aa19e d79fedd2
+    6232e16d 9334c511 04d00f96 b1ad1762 54e17a72 dc25f69b 3f555cdc a828b688
+    3fcab77d cf9af03d 3bdd7319 0c9a1a15 bc44ea5c f19ec562 3466a8e9 e1eef693
+    786b5d25 169b4f34 1d298da5 8eb7a6a4 86cf55ef 85cdede2 f051d74a 112ad81f
+    f2f0ca08 c20235d1 bf33eda0 c48739db 40529eec ff675c60 95edee68 561bb66e
+    01223c5b 678cd0b9 323b00cd bc60e9d6 b0b00254 2298a681 5eaf01eb 2333fd02
+    694b268c 15f2c58b a40bc2d3 fdc77185 ea3c3377 a9a2cb3a 545403e5 e53c2eb8
+    f520f5ce 5978ecca 09bc
+h = 8eebcc96 d9b5ddb8
+
+k = 6bbea296 da70e295 cb95d030 60eb0684
+m = 43b4a0fe dfbc6481 f6ea2765 ed471ba7 a34c21f1 a1977454 2a0b9dea 804a6853
+    aea5bbf0 7bf7de0f c1e8cdc4 65fdff41 ff638677 8f250c3b b91502dc be8173f8
+    83dadd0f fbcb620a 79b0ce71 555c8576 d1f1bc21 5fbfa977 f30d95bf 7014e9b4
+    bb8c4440 848d8948 ad27caf4 d3fa1458 61cc945e 305c1c86 4c3b83e8 46fd1e80
+    48835f0c 31f09a1f 98b78d9f 003d6bdc 3227845e e3422921 fe0f5895 ed9d10ba
+    01653a80 4a57037d ddc2ad17 670f36c1 1b2110d9 b4040efe 2499f2e2 96d76ae8
+    b5139a24 2bada6e4 b385f5b6 82192a48 f9f272d7 7f6ef797 4f44fd24 f47eb369
+    932a5063 044ce983 aadaa724 ae6e2de6 ebc2a1ee 9e261587 5fa7a30d 05846834
+    4b84c9a1 89213ad3 830f6f73 66c96b8b 8fcdbc13 6e3a8030 3427657e 899e1e8e
+    344f63fd 70ce22ab e0a73424 35ec8e8e 6bfc102c 77ce1c23 a987f0c9 2482bb5c
+    3b4ef065 df451d42 a0ac01b3 fb340dbc c827c237 d3a0f087 144a4e00 d0ce3679
+    d3bd9002 8d6c98c5 f47d625d 1828019b 98dd654e 8c952fb4 c5e37430 49ad9a86
+    7f529940 8770a14c 43753b5a f08735c0 8b0a5e71 20e7e3b4 24a22409 da56ea88
+    41566d38 24a34f70 97f350f5 241f64c2 448ca7b5 d775187d 59950572 7d0e1d61
+    1c520bd4 9c5044ed 75728726 1065498c af6e7fa3 5b45b74f 8884e21e a2889cc6
+    47c32595 e4551d1d ee5fe225 cbeadaf3 5a5dd43e 9f93ca75 2c22ff67 c63ed85f
+    87244a68 e66a2a90 dbdc93b8 a87e8b27 f305ecf2 f7651c98 66cc89df a4f93207
+    62136b05 99b959df 71735d86 34c76671 a51a9530 2ac01ec7 d6e92745 fb7ceb27
+    23ba647f 46c301d9 6f663f
+h = faf3f67b 961dd580
+
+k = 0955b792 f7b6225d 517da948 6c2c4613
+m = 944af798 c052d9eb 901f70b1 838a432f 5f785cdf 07709bb7 c7ce0e5a 9068c876
+    1767aa05 5f1a63ad 42d2d088 06a1c838 88d144c7 407e5f5f b1c91ec1 66221330
+    0a385859 5e0486ea 7a086662 ce815e46 a94a55e7 142d9e1f f4a54682 63061c93
+    a9d7fac8 caf20287 c54fb17d 698b7582 736816b9 b3c91a6c d6560c8c 1ed9cf13
+    e1e85083 c7d73c57 571ec823 6427772e 5029f78d df5f5dfe e8776f0f 9b4fd0dc
+    c237afb3 4e52bcc6 e9124b3d c7474731 57ecba75 3ac58430 512766a9 598f9bd2
+    dade82ff 6e135624 fe2ef5ad b81b6bb0 ddfeab7c 821f8be8 89577df9 100beb6c
+    f175ba6b 7e923941 4d725022 4f21c28e f066e4c8 7a44544f 384af1ea 5687d60b
+    597427e8 b95af055 87305701 57cfcc18 4cc82053 880f392b ae620cfe b7b4457f
+    750b746d f6fe4fba 2a6aad71 a14db4b9 a198818e 2ac762a6 294af1eb 5fd233b7
+    87254615 d481bb11 7d8f0826 1b631ece 5e2aa0a2 891c3db3 1e7baff5 dd04a33c
+    165bff0c 5fff8d42 17178670 c07e3f4c 811854a1 d9582ed1 135c484c 745bc46a
+    5cebf2d1 a5d97624 226f22c6 b864a140 1e9ed990 dd02d23b 8eff8297 8c8744bc
+    23896ac0 91501dad b9fa16a1 e3675811 2b6ee81d b82ac454 0d04f282 22423dea
+    34cc126d 5e10adad d0b05e4a 6c7ce210 34374c4f 4c628a80 26929c47 cb25220a
+    0a386213 5ab24de5 51fe2a24 22725e9d 2fa94970 9b65193e 7d454e7d 4e225d39
+    c584eefa c8fa1383 5db59a7b f838c79d 86a189b9 7d86f386 705ffaa5 c94076a4
+    5cf76881 ec501fd0 640a222f 7958af58 3f8cf197 effae2ec 9f86b0d1 cf613199
+    b3328ee4 b807cdaf 0a7a4876
+h = 07bd4dda 8a0e1f05
+
+k = a229a572 b4058c68 c8a52bc2 851f4c07
+m = 70370c91 487b4de0 2ab801ab 6b4cb6a9 ae0b7c34 58e961f0 5f6966cc b336a04b
+    5881222a 516cf833 b812adf6 7d63ee7f 10dbd052 279d7f5a d92e49f9 103b3fed
+    7db989e1 1d72c6e9 cd1587d9 24e01964 fc8c5ca7 8758bc6e 8d3c0038 ca007497
+    19607d31 a71088ee b6fc697f 7b61ffda 19c7dcc2 6df007b3 6624d968 1a2df61a
+    4711a199 23b35619 1c45d632 e2cf8a53 3ba27614 647d7ee5 06e9cfd0 5fec23e2
+    f2709194 cfe62432 d823cc36 33132a6a a5803c8e 2f21b00f 29e1c783 0bb60531
+    d2e8c641 8e2b93f7 38b31aa2 d0a20e44 dbb2273b 7d693a0f 8f706ee5 20415513
+    1db4ddc8 7a03b5a0 b3b24fdc f8acbcb8 f15a559d 91997579 4d62b44b 39df33bc
+    05c05f3f 84d7c50b 0c0ffaa8 feda8c7b 5aae5043 0e381775 48d2a8e5 c0a5aa99
+    c13f44a5 b2a8a998 fa6993a9 41f79a9d 29b9770d d67af9fa 53c854b3 3c0116b1
+    ba653c31 833643e8 ccd2825b 3174d55b 71a8ea5a fc48e3f2 e0bfc529 6b2fe5e6
+    69ef68c3 d2307476 a7ec6e06 20d9020d 7c50388d 2b4b60e6 dd5dcffe 112ffd9c
+    efb896b7 51726900 3a8c35d5 69afe8f8 fdcd0843 767633ac 16209e6d 72290e06
+    7d69198a 5233f1c6 1fa9dc25 34a8de98 42386929 026e91dd a000f3f2 95aa23a5
+    52896f3c 2f6dda32 73bebbfb 5bd496ca 1155ed6c 1b570077 d971718f c8df4ec9
+    0712c8d9 2d7696f5 3b14b120 3443d1dc a9b6566a 3c546056 b0923f5c 894554a4
+    ce6aaa69 ea80f87c 132c6d78 23897664 9f9fc640 aa41ac57 d7290181 72d0e1fa
+    79e11965 3440152c e4086407 58fde978 f1db62d1 1e18ee5a 130fbcd3 d331889e
+    74e49802 d703e4b9 422d7556 cb
+h = eaa44f36 6421e392
+
+k = f423bef5 06ac92b7 88f12dd0 43ceff6e
+m = 59ba818b f2024d1c 337ebd4a 9b751e65 2f751b3f ac9beca1 d397538f b709af04
+    27eb8fe7 dd660536 53770bd5 fad843d1 8ee59f19 bf1a43f0 32d28e7d c0e74379
+    8d86abba ac446a66 b876bee9 db8f3465 7371ef4f 5dd5c5a7 166b60fe 23f1c38e
+    ee1b6b3c 5b389db3 39a8506a a93629d5 23617105 df138989 ed05ddd3 2d6b0e54
+    47326d9a 88f6950a c7882ee5 9a0fc8cb 21da0f98 9950985b 7fae9842 b799a239
+    1c84b9be 3772a7b0 f24c05e8 fa428f19 ece8afcd d8a37c98 87d7d552 b66b1fe4
+    70da20f9 12611642 89303adc 3354989f 52b12f6a 07489066 1fd3b2a1 66f6923a
+    76480a8b 3b749ffe 2e35fe41 7d46dec7 b025cd42 a24b490e 541120c6 94111cd4
+    ca67b0a4 ae6e9e66 fe271017 c5ac6249 9b727f01 8b28d3a0 d310c900 57496fc2
+    c8d202f6 8c9b644b b779bd01 3e4aae58 630346ee 475f1aaa df73b29e 3185254b
+    d8ac861c d582ed20 79f7c744 2a469b10 58ae425b 35329796 b7e05564 78e3ebde
+    d61df47e d588b9f7 3f360fed 6f6a30c2 9e9d7e83 ed239723 9f66087f 6b2b17e2
+    7eee832e 19330b2c c14c2d84 ec78f820 57ba3dd7 2bbf0336 ab1ab83d 6e451d7d
+    097fc9f5 df818d29 0519daf2 ced3b37f fa34d9fd 3ba2182a d3f47391 9cafd07a
+    6c041a9c 2fdb4050 58f487af 85a27940 9861023a 60e69134 f0e96089 622de79d
+    3bb7bb8c 10eb3708 67b9ee94 08c8e5fe 824ca226 8c6a4336 394128b6 378ec01f
+    e84706f7 05543c56 7f60e889 8efed9c0 40533b4a 4ce0efbc b669b682 ea967d74
+    ecc1d4c0 11506a41 57ddbf51 26a47b95 e7131e91 92b98273 2a7a81f1 b3e6dd26
+    348f716c 631580b1 d58c98b2 8df3
+h = e99c4329 87ea8d4c
+
+k = 5a6fcba7 2123b0e4 ac6a70bf d5806a33
+m = 7434697f 7d69652b eca64868 0ac36ee9 61c5b93f 29277050 eace77ba ecd2b6c2
+    12e56eca 2e6e8674 f25dd108 20d2b743 2b447fea 3177b7bf ef7e615f 90adf5a5
+    9cad97b6 9867ec86 621464d3 8aabe97b 94103384 251bc704 ae2a3664 ab6285e3
+    5bc0cb01 8057578b 543c9861 9e66b720 f8ed6111 88310ddf c9272cd1 24b0349d
+    4d237bba 499e8430 b9949233 b7d265a0 04fc88b0 4586b5df b23ca5d8 e3a41004
+    badb3aa3 91247645 becf559e fd39ec8f 169284a6 f76aa87e 1345a632 44dfa9b9
+    8d93abbc 6bb330dc be8af128 9aa631bf c537a239 cbba9efe 93467513 57005811
+    b3c1bd99 bee7e86f 7a422eba 7056e071 9e1312c6 2cde5b9b 68653777 3154fa47
+    c8525952 81637dde 49802822 f09df06c cd76d759 ae997994 e5d8193a adc2d188
+    291c93fe f004bd90 1512b2de ab5c9eaf fe94c993 d928f6f2 7618fab2 281196d3
+    0ab17203 64efc66a a9a46f05 f33108e3 8de30c37 fd9c39e0 e4f06b8e 18fbe1c5
+    4071193f a4e443bc bf037274 b88360e4 924da684 b3d578e7 7af53c65 3295527f
+    806e84ac d4338030 3d76add9 faa52c96 c8edf591 72ee68ec 0c6b4fb5 8bd51ec6
+    28d175be 34dc86c8 891833ab 6e11e388 6a1a7ca4 4c2883a6 ede1f31f acf0bfe1
+    fae986d1 6b8c1c5a 789c9e03 1f02fb81 249ac058 395c0c13 0cb91832 e98b0429
+    07cc13d6 10b5c114 6c691c98 8c60651d c6ecd7a5 4914bafb 26a3e400 3c1d1a24
+    a1df7a44 3510dd89 72b2f39a e685ace9 56d20546 cd82d479 682bca82 776da319
+    022d4d00 975772ce 4cea65dd 1f6fedb5 963dd71b 338216e2 6732c387 e6b83587
+    04526211 bc30a51b e4bcf3a2 2207df
+h = c775a9aa 43c3c5ea
+
+k = 3de92ca4 a898b8e8 32c8eeb1 18e6d529
+m = 6a3320c5 da4e0d68 94471c41 cdfe5408 386f4622 e0751f05 e9e86cab 91a51e01
+    52170a37 bbe4d546 7ae313d7 01c7a884 162d78cf 3540db5b 83fe1416 c68f663b
+    ff3722ce 58e126e7 5ec860a2 0ad4690d 72303cbf bac564e6 b834cc51 8f33a1c6
+    4bc2bf59 28ae925a 2de0668c 5ec775f3 63703ac1 df4fc703 385125c7 795eefea
+    736c9f93 d5976f61 7f1834ca 87b52d18 c58e48c6 ee659012 61e573bc 2e7c5fdb
+    54a03b66 72b48be7 b6c6012a 45aee038 c1434422 3be2155d 6f6e5070 5934395b
+    5910ab0a 855a38f8 ffc740dd 0c5b6c1d b0fcbdc8 47061e25 f50e807c d6cc7b51
+    f4c02f3b cc45ffa7 ea684dd6 1398c2f8 453c178a 1c9c48a9 6925a4f8 dbd8ee92
+    34ab172a 450a26f3 42d88443 406e04aa cd45b503 d6a08909 8047cb52 1e64c5cf
+    daefe58e da021e74 a70eef45 d6a739d0 99a266b3 e766ac91 98a50588 c2431e24
+    24e610bb 58a3eed2 d718c528 c215492f dd9a6759 9edfc8c8 c2c71d3f f2f58cff
+    22d2f7e7 3979d663 40b79daa 89f65697 ea265a41 b99d6192 4155e61f 1b63452f
+    bfa5631c 07e80089 40390f6e 37f946e9 fa1a492c 0ad07691 46b1401e 11491b56
+    fdffc6e4 75eaf622 7b0237c2 c6741da7 aa3bbf5c 6e5872df c2a90bd7 760e9ee4
+    eb86217e c6264812 3c6790a2 188f106a 0a2f6dad d41d1c3e 132704da 83f582df
+    4cc0a5c1 68a14726 fd84aa65 12e18427 b5bd51ad 1740b469 7345f6e0 15448185
+    60eb1f49 9a59ef6c 79e09a76 8d5f059d a60feb8c e0789f71 841271fb 96371f40
+    a26d3036 2aa82fbc 61fb5194 b91fdffe e9c088b5 ef4d2369 7840f9ef 7e4449d7
+    073618c5 c9bb296c 1b44a42b b984f7d1
+h = 6b24aec3 78e391f3
+
+k = 4de47f60 908bb218 647e4304 fb2c34cf
+m = f2b601e2 713a17eb a42f2da1 caf4d32c 142a8a73 262f568e 09fe20a2 bfc4a64c
+    89608873 188ee2f6 4786add2 0c05162c 7d83cfbc b4d98ec1 cec3d775 55db3304
+    be613309 c2e1396c f7f34244 4d94992c 73494f42 1c70a4d7 e737a4f1 43b27869
+    c684151c cb2d4024 4cf17306 d1558a1a a4a0d9c3 7350c17c 9c59074d dbaab5e6
+    def92f03 33b8ddbe 5d94963b b13875e8 d7c6a58d 77c86b80 ab847694 63d25d3f
+    2c6e23e2 5ec2c7da 79c41402 5f568c5d 16887850 f887b6d4 d743b19f 52565ecc
+    d38968cc f9549be0 257455e2 5cd4794a e5421cb9 fee68aec bfd988c9 3732dfaf
+    38b173a2 b3dec241 7fbadabb 65301f05 3855d113 f4db9888 1ee8cca3 67afb2dc
+    d7413b4f 15954c9f 79185b48 335667f3 637f9893 21ed5ace d8b5c7b8 fe5394fa
+    f980cd6c 7e8147d2 405e33a2 65cff0ee 5055a2f3 b094009b 366cb256 b27645ac
+    895ca20d 72ba9fe3 a730c61c eac87ecc 487c50ca 304bbe2c c124e0a9 3ca42a45
+    e9bdd70d 288926b1 cdcbe22e 464e9103 ffcf9553 dd901280 1d4f15db 3ab836e5
+    b5cc52ab 6785d201 e9b4eee1 a28b63fc 5b3f4fbc 88a9901f d4c348d3 a5d6a744
+    30726f7b 599156a6 765d46f1 c35273ec f7b214b1 3de51845 32996d40 ca58df03
+    057db61a 9b37168d 5f1dfd2a ccf82dbc a4304dfd 48c080a4 4be7904c cb6156cb
+    a8d790fd 66dc7253 918b022e a56f5591 99cb7112 779781f4 83e40625 a7aff110
+    7a67500a f7419232 b42a05ea 0d6c2301 fcd4c196 80519dce 44721f66 6cdad94f
+    9e9c9763 6171819f 48327a96 51357356 19c08521 d5b31471 0285d17c 39690901
+    67a703d3 34fc190d 68c85832 f0149ded 18
+h = aae47ff5 1e7a8182
+
+k = 127caf60 30d4abec d90d1b42 74483da8
+m = 470e13d8 514036fe a4b55381 e81c4e98 0b1d915b d7181df9 b7c10dc6 828e82bf
+    1de34c3a cd204c74 b16c861c fe42ad7a 0075707c eba3c0e1 db2db4fc 260f3b99
+    8839250a 2a453d83 bd7b4de4 a73ae556 c2dafbea 28628a27 2214c81c 9c0edbd3
+    066418a5 20e90587 55fdb64c a71c8f34 e07c7f0b 9a33622b 92cd219a 49eed5b1
+    cdae3949 a9f35570 dd4b9f33 d1317a65 26abd713 1e5922dd 2e43b6f1 bca0f033
+    73904cf5 15d08ca2 2c742f53 293c225d 86078eaa 496d9495 624cf744 8af36208
+    18d03053 5ecadbee 990bd01c 71eaa0ed b4aeafe6 5af51e87 9a84ee90 1fcf4c89
+    1db99868 39d3f228 3011564a abab1c6c 8268e916 7081e15a 0de1ada2 7a0b3da7
+    19b78aa6 d635f34b 8f777e0e 70aa4d42 f8207df0 28fc3482 8e8cfd1a 59f0d4ba
+    175d156d 46d8eeba 11a6c5a9 dc379ea1 94907ef7 a335d748 90364fe2 e8cec9a3
+    8183bc5e 848e2e0b 1d373d04 c9afc3a6 1d58cb73 09364d83 b130a28d 1eafdcb1
+    c1b47744 4aa71ba1 ad364a01 bab04a3e 65b5b976 5d3f66aa 869a1797 8c31a97e
+    66db49b7 8191d6a3 3766e986 3fd7e2b8 00203668 60873533 9b3f8561 34e4de83
+    2d15ce22 2c7db11b 2523ab0f 0996a496 87f4cf11 6fe59595 4329ab75 ca48f55f
+    8d4ddae5 9ab9dc09 d4b75536 99d5a76b 1a1baeaa 612ab9ef e72809ca 725707cf
+    27f52552 0e85aa6e e4a8be3c a27e8036 d9992aa2 a69e85a6 0beb5697 71834276
+    8bfd07a0 644d6a30 738c9050 e66c8872 e677b0a1 bf2980c4 56e64650 311da940
+    81d18b3c ba63411e 040644e3 aaf3bf1c 9a707e19 5cbb1ebb b8c419cc 4c1c7d0d
+    03d23cf3 a9285782 9a03a57b 4217ada0 ad35
+h = 3af80303 6d78130d
+
+k = 01d57c5f fa476531 5a8ce271 2ea278c1
+m = 0ec00822 19a6719f ce5149eb f0c5d051 d8de63cf 60decea5 9bc88b90 8ef44c84
+    aa20bb16 a97923fb ff4485e2 f8e3e2e4 9eda0b1a 2ce6847b da5c41cf 2d0cb617
+    4e149db8 b6f40364 a0101882 b122a21d 98c5ee14 f64d760e 5f0e475d ba528d33
+    29763d98 c6a179b2 45aa4762 30459843 494ff0ac 30edffc9 4fb7dc5f fb829032
+    2c5a62d4 bad67fb9 d229cea5 2477813f 992d50df bfc4f289 3a5269eb 4215b0a8
+    edb36aa8 dc371438 c889989d 72cca4c8 8ae86ce5 5a824342 b04a5edd 05f1aa12
+    e082b502 98fa8350 4561b799 8ab21118 2f3eb80a 864f4e08 a8aee4ff 96028572
+    533d0a54 acc3b00e 78668e4a 07fdd2c9 77e8d534 8ff6b775 801b6c20 6a778236
+    0ad3bdb6 59879ad8 61be6667 5b301b9d 94777c4d 9bdc062b f7d04216 003683dd
+    1e9e0eb5 fa833350 9ccaa744 d54ed1de 649bfe2c d282fcd1 f26a161b b1aa8e18
+    15b8ab5a 10034cfa 9939e571 da2e4d8c 393a490d 1a35310b 0256e9d3 94814a71
+    10ee969a 212e072b 8fbfe70a 849281b1 02ee26dc db9e506c f14ae9b8 4bdda574
+    8e8be4f3 c1c0e215 327c8c2e cdbe664f 573d91a6 d00a9af4 e88495c0 ac36a1d5
+    9a63a9d4 d0f5e91c 57214bd3 b93202ab 84002658 eebb9d73 2e7a9486 114fb014
+    08de47f5 22d6a19f e5265926 f3d4a3d6 2fe72274 8f6cfe78 ec8e661e 08e9b441
+    b0b9d743 decab092 79e03398 0c659b26 633e994b af6c74b4 907121d1 e882e787
+    7984ebc7 836b4cb5 41e3c932 bf0b66f7 c535a5a9 1f014a96 1fc8e410 880f5dc0
+    9c2128ed e70f9ba7 9828f0fd 35266ef3 ed4c1731 64e4a638 c16352b2 cbfbda68
+    ea4c2503 3280728f d700a641 4c8e1268 8bb5c8
+h = 33f7d892 07f0ee22
+
+k = 13d76584 9a134b3c b18b5132 f93c0423
+m = dcb6de57 759d92d7 186868c1 166714d7 99623285 4ea11315 3854e0d6 0da74134
+    96b71a5e 99a183e0 6f8aa89e aacc570a 27c3b574 4c189577 801d6588 ce3661cb
+    316fef8a 30f57f33 e5fe995f 633f78bf be43c2d2 8f1ae5b5 51de2964 1444184c
+    f96887fe 547a82d6 908f91fc cebc1203 c457ef38 b5cd609b d3606c72 d9cde735
+    09835b1a 6a0cee0d 6d0530db 8e233180 8799d32d 582a9885 c34bdaa1 284d1dc6
+    f13ffe94 df8352c8 a43fdd3b 2fd59938 fa03b43c 66480140 7b851e86 332142c3
+    75e02848 61c8154c cbf02b56 1f780788 a63d1e78 b2a6b0fa a1012565 53df767a
+    680f6e3b b0599820 cd8e1050 8ab2a789 edc5632a 6893683c c24636a7 731adcdd
+    c4d6b47a 955fae42 67faac43 f0e9b4b6 080eaf8f 512d801b 5f38a62b 0cc34a6e
+    25dff265 95d78a91 771b4819 c732e003 9baece4c 98996473 58578e20 ece113e4
+    5c39033f 140471df 77e32f22 aa178bae 8f257d3a 4d7dbce3 967299ef 4d4be555
+    e5fe9269 b3fc796a 973adeae 23010626 3cffdf23 f582b5ec f5949aa0 c6b91e46
+    49c47c58 c2813895 2f0e913e 3844f184 d4ae185a adf9c5b9 84f1afd7 2ef6f684
+    cced5b44 58c49eda ba3a2151 1c78f171 ef1deffc f50c2d65 ce043c87 b70d264e
+    410577d2 ed5c8099 fe904df7 f5e567a7 c9574848 06ba0a39 2c765038 c1d174f2
+    d0ce9b3b d0a6a587 352da629 51b62af5 3a477871 c185a950 6e182d53 57ebb6e8
+    6411db96 8c04e8b1 afe61462 39f42b8d 2a240e29 d19e9b14 22b4114e 2bc33dc9
+    a40897ec 2d8efd5d 492d720a 679b482e bbfcf90b 8633ba2f db262672 2ed8ea4e
+    3b2b3fa0 a343246c d9487035 b8ce8957 718f0fa9
+h = 97a76843 f48dec12
+
+k = 78a96f8e 8e0dd73a 8df71fa5 4b13aa2f
+m = 449b2cbe 02ce1c4b a4aad90f 864cedb8 9afc7c1b 3194cd72 9c6329d7 5f54d4e8
+    a1b0a7ca b59a0f27 1b1afc3e fc89df5a 494d2175 9655a1f6 6b75c905 7803f74e
+    b9315bc3 4b2e6fd2 386ce7c5 cac21333 679594c8 ce8f7e1b bbd4a34b a765a392
+    bcec26c7 6e6d9afa 8a2cbf1c 9227e309 3c70168f 878a9376 d306628d 3f53d980
+    cae6919c aa3dad15 0b608205 2f402a09 c40662a6 60131927 123af26d d157c601
+    803c62eb 57331565 09bb72d6 3a2a2d00 1e1503d9 847bb4eb f6570fed 5e93e4b9
+    e23d3cd0 1e128d46 1b40ee73 6b4f387c 46f14beb 377ed482 875fd57c b4b4fefb
+    568261d5 942d6e71 0ceedc9e b8afca71 bcbc40bd 2f783ced 47642650 7f22eee7
+    f957eeee 6592fa79 0a42dc6c e0c38119 407367db 19af2976 a124110e 71f37f96
+    5036db36 62a21121 9ae7129b c3b1bf52 4625fd3f 0546db57 5fb77a4c b825a04f
+    9038312a cca6418a e271b1f4 e2b453b4 d3d3a340 4e7ada10 56699cef 1fe231a4
+    39d28011 a4cafb95 8301ac62 503fabea 00145789 14cfa390 45ae8df2 3b0603e6
+    f293c6d4 66a74c53 df7c0bed 0ea7b1d1 45f5f4ca e17ac752 aa78b3bc b14305d6
+    bec3493a 6a5a3786 4ace5a2b 9680db87 92c94e14 dc76c3d1 3437c216 92f5d303
+    21710809 194fd27d 6830eb27 f7560ef9 bfb4ab5e d32d8f25 bf11ac3c d199ceb6
+    851b3611 233d8b8f d03a4804 fed080f2 b0dc3fbf fdbf2075 703acb19 ca51814a
+    f02d629c 175464d3 71eb417f a5abf8a3 f7d5ae89 2ca99eb2 174241e6 c75ae259
+    e0a91361 e8bf6f7c 6fab0ce7 37fcc2ef fbe69430 54312178 ba439aaa 47a367e9
+    516669dd d0daea8f ceb5a790 88d35ab7 4df20bdd 42
+h = 3fa18b62 a5f9dbbf
+
+k = 38689457 51503a68 26ee23d1 488e9c0f
+m = 31a4c707 ff5064ad 2e29b034 5e789701 b75d65a9 47b32653 b9f0bbca 15de7a12
+    4c22b345 99d9372f 4b645b3b 38e69128 e8e7e8c1 fc0c7823 798f1cd3 ec26fb09
+    f39ae5d6 e1a3ca4e a4c3858a e68197fb 70815a8f 850c672e 9bf74ea0 e982e8c3
+    b289446b 8f30fac1 9c156a77 4e7bec3a 606fef25 79eeaf60 59f6d32a b482af66
+    b8a0839b fb622aff 90f641e4 f51660a9 cccad20e 73a10ca4 fe6b33da 77be07a4
+    78241328 68e283fa 46f598bf e518c380 daadeaf1 652cacb1 298f739a deec3099
+    b7aa95c6 82125a68 80119000 f878f52e e909d5d4 4de63785 361fd2b4 24d10de5
+    a4c3c549 c6c36bd3 da9bdf91 b9c69b23 0fe26c55 d2200d21 53511f80 7ea2dd43
+    40cc85fb cd72ea04 12d46488 608ab699 bb1c5c9d 794cd0c9 265a8332 7c696873
+    3fbe5d4d 441b0535 b6ff8301 a1f81ac6 bfb31626 8060082a 909b8eb3 67085dca
+    3a6b0e49 1869271a 499f6fc5 2d1bfd33 62773de3 c849b657 ff89665d 724b501e
+    dd5e6d0b 76a7b699 b2099498 8b02e2f4 89b2487b 7d6bab57 09b2219c 85835f9e
+    c4205f73 bc08b655 b0480f9a 7a6aa73a f448867c 4fb62dc7 fb9fe6b1 3e171713
+    2cdf7b63 d56217be e5d16928 cf8a0f01 8c80ec35 b62e32bc 06048b72 28e9e5f6
+    f4687780 19200a4e 3ff25df7 2b2a1809 4161ee6f 17f8825e 8c799d52 7d4dbe2c
+    d872395c dac97e3f d5d01882 a6e27c38 3247cd6a 8614ce89 c27d903b 9ee5e19e
+    899e9b6e 3a907825 07a9d61d e9418e72 b40ecfb8 7deec832 4213cd33 6a59109a
+    2351c9c3 fc24da1c bd38bc9e 4a24ca9f ca31982c a439f125 cc772e30 aa47943d
+    a742a06b cb85dccf e2c838d9 3a203882 2de955dc 5177
+h = 4697b2a5 b323d3ee
+
+k = 57d4e67f 1cca078f 1cf082fb 012fc3fc
+m = f96cbe4c 6a7bf4e5 a8a6fbb7 3b450936 b7654cca 178edd38 9331e8eb 841fca5b
+    aa9945d1 1f5054ca 4fb0293b 15d98934 382d5c06 997d100f f40ac509 cf72555d
+    2a88e72f 7eaa5d79 77ec5886 6b8af8df ffd2baf4 36675ae1 9e0da9c0 bb986347
+    318ca882 8894dbfa 76d60184 18708e36 9685c6f5 93a4b501 d4c18ac5 5f6e594e
+    2171307c 0531eed2 583a4ee3 2c1a063d 7ecda2a4 91b2efd8 a3b98aa9 9ef9e1b2
+    8d2dfb80 d2e80fe8 bf738261 d049fa96 984ac27c 3a057f98 e3174c51 a8547e83
+    d2b244f7 d1342416 4a5310b9 f676bbca d2084c3b b3f6c70d 3d377029 8337dce5
+    7bdfb66f 79d32d11 ca70d947 0a5b339b 857bbcb4 f2da81de bc845b06 e6cd2ce8
+    97e3043c 0aa29eb8 b9a4fafa 7c303d82 71238652 6722d9a6 ef85c136 fd51e1ca
+    3f79451a 9399502d 38f00365 c9214d81 ad77b754 53c79fdf ba6be2c8 ee1d48b0
+    eae56e1a 9686c434 bdb827af bed9880f ae51a976 f9263d93 fda1f0ef 87fea835
+    e5c16ada 1f4caba7 6125f088 a0653bb8 26663dc5 5c4aeb6a c63698f7 49ce8d74
+    1a2546bb f1cfe929 fd3d3bf2 46db8ee0 973478d3 728f307b 00107882 a1afd313
+    a44a9b7e dfb55bc9 e64f99ee ef9b99a8 4e151fda 5a3251ad b3c77f9f 332ae5d2
+    2b11c185 5f308c38 f7d993e5 7ef8266a 769a35ab 74cf210f e4c3fda5 9abdc5cb
+    7a6cdbe9 26329b3f 93f8bf15 a3dbf4f4 ae42d139 6e915b73 43d6f8e9 e5b5a405
+    86fadd80 7d606294 e0bc3d52 b8e730a0 5980ded1 8238a522 243d2fd5 d46e90ea
+    f363b12d 6d369c37 084086b1 7dcd1abe ffc2c81c 12080527 9bcddff5 67728ef8
+    7a4928b5 320b21e0 9f5c4210 dd804d7a e3e6b4ae 9c8596
+h = 6c9dcf89 d998821e
+
+k = d8581583 db4b8f84 963b4ea8 5f73c440
+m = 8a160ed2 8cb4c4cd 2a8a1f27 801774dd 7f9a5497 c0f17de8 fab9b7b1 d427b206
+    4e644910 cc206a83 22ccc8ad f59b842b 7fa8b428 54187278 7e6f9a48 015ea793
+    f61dca70 73ebc66f 81173878 d96ba61c 87f6e473 34dca13d d68d19fd 87d99fc8
+    91bb7edc fd3642af f710fd0b 10088c63 b840520f 27621295 70cb28d4 3f5ccb53
+    6cc2518e a96aa67f 5a92fdb9 72fa3597 9d31ffce c4849468 75cf6149 5d8fb745
+    313b8727 01212007 5f0d0241 7b5b98f0 75545289 38d5d1e6 18f4483f 6edf7602
+    ed339e2b caa85178 2712e80b 9dfd7294 d404ae06 0deb185b 0011ebf7 0907f6b3
+    f24a7ad9 657f2925 7a0874a5 c7316fd2 26fbf1dd 7f60296a 22ed81d9 4b34ad2c
+    b1787a97 73dad694 5b0be117 57f15b58 2ff6f42e 4d3a87f8 7002fcb0 8c0f1017
+    92449c97 74cbaf91 4d069151 846e9465 a19fbfbd eda0aa99 8ec236ce 0486fc6a
+    83863003 2a7d93ce fb7c8bc4 93130bbf c0e93f8c b13ecf8d 6608b5c9 57a9ea3a
+    a7618f79 44d3f685 7765fe4b 9713c74f 42126ea3 43a9324a 26a98b2c 2b4a418a
+    353d960d 4dd29887 bceb3265 bc1912d7 cb604ded 44010201 11d75b0e 2e2ba627
+    cee732d1 e76f8e0b d3d963f2 42da14c2 93a170a9 a0a8edb2 fafd3939 8b29cd8d
+    e84c5905 be9384f0 b25858cd 2b2ef6c1 5882bd1d fd571e13 795cccc6 b59c9511
+    3ad359bf 02593cd5 04c14376 3ea21193 e6a7bd30 72505a8a 1d12685a 0e7531de
+    00292c96 37c1df4d f21b7553 71c5a468 e2f0d6aa 5c574a56 f3b788db d4c57ded
+    9fba8ad6 b4a14b67 1e68f99d dd1546d0 181f1d60 310efcac ccad348c 4cc29ea2
+    22508ac3 257d11a1 3d697813 f7932403 eafa9ec2 dc9878b9
+h = 396fd42b a11a94c5
+
+k = 5fb69267 61730be3 0fa76662 fb26087c
+m = 992641e4 23461273 187c0896 4ce0ea40 61540953 2d0bd664 bfbaf67c 2ae4ba39
+    1132abc8 6da9cdb0 b207bfee 49043cc9 f82a2096 a6f3ee88 527c5586 8d2e3e19
+    ca030c63 13cf4bcb 7ec047c8 9b1363fd 25b2c424 b77d3fe4 8867e5f9 3a242620
+    4cc332fb 593e5f3d 8621c6c0 e336a88c 1559db12 fdd787cd 9581fe52 534ee298
+    7ef1eb67 062fd501 bdaf923c ed537eb5 2e66a91e de740128 fcb46b57 c1ff8502
+    04d9e465 cb707afe 976a73eb 4b05127a 705fe679 c7b353ef 4ffdc78c 39d8337c
+    44f6303f 3513af57 fdfdbf65 07872fca a0e7810b 0c3ede7c 27951879 48f7360e
+    2e32f3fe 76379edc ce7b6e15 215afc8f 40c4bf0a 27849d9b f6396eaa b42246af
+    8e93f04c 2178da86 2a093f90 cad0ba17 6071a626 8e983f4d 52fbdcad 310e0b59
+    7bbfba43 eba5b3cc 5b87f9c9 ae41b6f1 2792e803 71e0eaff e45ea257 3c3c26fe
+    69747083 f7109d87 a043c1b5 cc53ef32 0a2c9ff8 82b7c4d8 82e70cc9 8d87e6df
+    ebf8270b ce52c9d2 1fcb4e79 72beb4f5 907c3a42 9d7725d9 333e5557 99e10791
+    c2a57216 86dd70e4 449e44ca 7573bd9c 3932a400 d762e36e 2db29e71 cb059a7c
+    b4c7b917 9f18270d 3b280a06 c387226c 4e802161 f733ae88 214af9bb 0a0d76ec
+    753f28d5 491dddc3 9a220467 081a35d5 f6e9729c 3d6de114 808a4a44 3cdba563
+    dd0344b5 f1a55982 dd34d482 9ee50cff aaae335b 830f3c3b 1a29b6e3 1033201a
+    d0f4a017 925dac4e abcce177 7c4e9691 7a5e3e5a 659ed732 49d18a0a e755293c
+    460bb456 14b5c0e3 5df3eca1 593f0f42 9a20a766 17dc501d 70cc5853 df95ff4c
+    5681b367 525a7e6b dad85604 681ddc5c 7695351f db1247c1 5a
+h = c075a608 62e73e93
+
+k = b90c57fc 06e1e08c 73de79e5 37a3d4be
+m = b4a46618 9ea98a2a 86fdb768 092354b6 af55c9b8 a731f3fa 911e4fc0 e4aeb698
+    530d85cf c12864fd fe2033ab 5969ad13 cc4ed89f 6d2dbcf4 dd7cb599 630c82e5
+    93e50ce4 9f6f20b8 a5d95a15 ad59eeb7 53f5490d 35f2f3e9 9f29e337 8b68e566
+    3eb97ac2 c365bfb9 b6a83cd3 81b2217a cd70ef05 dee95259 4538bd31 a71248f6
+    5458ab96 a8050ae8 b7fce204 eb241ccf 81eb05bf 77d336c3 95c5d56e 9257726a
+    b121b778 68ce2ca5 bf224b70 a79db5a4 25be6aba 600bd597 87b98be2 8f241283
+    8256b977 252177db e5d0dee0 753cd934 525bb945 c18d6119 e4cc4c31 38d73b06
+    ef3b84c9 8279fc0f 0696e939 eaad7876 055093cd 1324494c df4ec4e3 58975fc9
+    4b2afeaa d2687ceb bf98ef73 93fa44e1 103779aa 5e60f503 6c8b14b6 6bcbf21a
+    a1d03638 a5c670d6 8af447e5 1e1da259 76d00115 74bb7d82 ad36318a cb71194c
+    470841c6 14703cdd 7a2d0b5a 15793b84 efc47351 66e6375b 75f0ba81 2c0384b6
+    e1f2be4a c16f016f 2ea82c4a 482f3260 c56a2115 800aa704 f3ae2de0 1498e75f
+    cd9b5861 f013c059 22d8e094 12b3efe7 a5f359d7 6e54f023 9a957010 60ecdd6b
+    3a1f3453 7b7af897 931f0ddb c31bdede c1196720 789de85c 098412e4 c38900b9
+    44416b95 9f93b2b6 106875d6 8590e878 f8a3332e d54cdd5c 60f127dc ee249f0d
+    e8d05752 51530bd8 c4d67187 bb2d4c47 a3955f31 43fd71db 5740c839 8dfdbe8b
+    a2c4cb14 d6f53bb0 f1ebf458 aaa45db1 c1166e15 1f0f7a0d 1ca8b0e5 1ddc50c3
+    8a23a0af 7e073efa a956a675 250bfbfc ad20756f 98887abc feeae60e 891025a0
+    0bf89a9d 3cbeb105 995ef379 9ded8a47 ac239b5c 590c78cb 247b
+h = 740164df c4defce3
+
+k = e8de78f3 1105b6bc 91dc6837 bad1d23d
+m = 909ef83b 06cd1c0c f6ee4752 2ae0ea05 57a3bed3 e12623bd b3292061 b3ef95fe
+    4ab336f8 9df47687 957e14c2 ec65836d 0fbd40e8 9907cf55 ab9c6fb5 c9110650
+    bb54b5b1 c0e91312 3e133b9a d4483da7 e75cf561 723f9421 c1748ead e0f95444
+    6c9f9aaa 5f5febfd aa5c0709 67f57332 e5321820 6c618cd1 aa314a7f 34d90646
+    0ad749c4 d4d116e9 1599a276 8ef6302a 0fd56c4a 751cb9fe 998a1f00 1b4856f8
+    406ab47b e296edbb ec1b716a fdfb237a bc7a29bd 21a00a1a abc10b89 24905e15
+    033fc488 999ea635 6123af30 af325a11 ee58f446 0129db63 19d35130 143c3cc4
+    1518b7ef 892820c5 d4bd0adf 0f4a805d dd2dfd0c 9842890b 248d1bfc dd9734e8
+    56baf0f2 0156c2c4 7ffc6c7c 3d768e35 279efdb8 2e03364c 931e0cbd bb859ad9
+    a8d97a58 0848124b d9feac18 296c274f 3a84b20f 91a730dd de2b6c20 c2c75617
+    02d64236 e1f0c4d2 feed473f d4b1ac4a 4502f80e 43275701 2f90f085 2ee251f5
+    a03ba64b 4dd8b214 5c1ac692 77cc9295 6c19a620 41aaf837 5e06290c 7af1cc64
+    3d585dfa 7b3a9d46 0235a75b 087a4179 58b8a6e1 2f3f787e 52ef8325 b87acf1d
+    b6e42c28 ff6b33db eeeb2a69 d27564db 1acfcff0 740a1892 ed59110e 3936c2a0
+    8aae39f7 26ac56fe d3745d7c e7f5cad3 f5c7246b c4636a93 2a36c82e 3485f221
+    025f0cc1 e9e23a8a cf9df84d e75d5c2e de806a62 1750d2bf c446bce0 79ec9445
+    13bd8404 de1c7c6f 74575dfe c5bfb5a4 17acf34e 64e19d18 ca302a36 c9256178
+    5541e17c ca2b8cf3 5f038552 ef34362f 6d9cc8c9 d979f1bc ff375081 e1982d00
+    3c178ba1 c977688e ed82e50a 9c0c3f0d f6afe1be 22b47914 0614d1
+h = b609f2b0 87f259c2
+
+k = 0b018e44 905557b3 df1299ba d1cd03d3
+m = 2a660f5f 69fabb64 b06af13b 651ab090 ada842e7 d4233802 659b04fd b636ee38
+    8219b756 7b21898b d49f8f89 61454d86 3fbc26d8 2efe881e 84fa0c68 f23eafc9
+    3d27b59c 3068a477 18261946 969209db e4d9e505 7eede14c 87a60092 b426b055
+    1b9ac025 8eb73f24 86a4f80f d384b2ed 20d647dc 2446834a 4a698dc1 67c5fdbb
+    ddfd3552 7bd04cc2 2bdeadbe 45b2ea42 40aed7ca 7284c96a 6808c464 3d979551
+    aa9067e3 54f84bb2 56d69977 6ddaea6b cb5e66f7 60183bbe 4239630a aadff222
+    12382b88 ea9fad46 c78e3993 28beab71 f9154e90 c1d1039a beb27022 1e9a8640
+    c94a113c d69404bd 82111bb6 c38e2194 c0024676 61938f83 356c0b38 89087aca
+    1b51241b a784877e e2efac2f 4a2b7d64 f2d55fdc fc9eae56 6130dca7 e828deed
+    52ce325b e34215dc 6042c349 39b617f6 59583622 1f1ac5b4 d1f0fd86 077b0ae6
+    8295365e 8251cedd 0a73e87c 286aacfc c6f30a9f d9b40489 fe323436 10084fe6
+    0c625587 dc757727 d80370cb 0f9260dc dd58dc63 17fb99bf 7bab9566 c3c2b8fb
+    afbec774 19d6b1b8 27e41229 f05a6239 46f5cdd4 034948ea 23e5c1e9 1c8bf5bc
+    a7029852 21846def d8e6ee7d fbbe72be 22fac233 fa47dffd 879509f7 ac99bab1
+    63b31007 e6c922f3 e7c47e80 e4ef69ad 32aa8ba4 e9a5a2f8 2d345a74 3069cc0a
+    183715c7 398e7ff4 7c5bc27c 0e0c7cc1 b989fb81 e679217d a01c545c 170e98a7
+    88874a7b 403d52ae 3bbba688 d2ec04a2 186a64d4 120afd37 65fc85cf f6c12afb
+    047f7c97 65790b61 9e9c0cdd 7987f6a0 ee96df11 d92ac758 b92d1a0b 3aadb673
+    ab1fd957 d12d966f 54ead797 07db60a6 206d0b77 c9e303c2 8b9ca311
+h = 2bd16479 afc45222
+
+k = 0f59e95f 0e407275 d13d356c cd96ea30
+m = 04537ebb 9f612668 bdc307a2 e67bb0ee 26f7d9de eb14bde4 7ba16250 819eb5de
+    6531afcd 4da263e6 04da44ac b47df09a 8874b0cb 77b79c65 a3706f9d f950122b
+    43166c08 b54fadea 9788066e 4793b6cc 0a3b60c8 743ab76b 1061bb7b b85a5ec3
+    5077536e fdd54689 2226b1bb 08d9e69d 7f8e8044 405021e3 eea280f9 2bceff7c
+    f1b3d398 707fc53b 61e6e680 07629569 460119fe e2b8ce51 c8047c3f c13eb906
+    ad7d0e9e 36887640 df14eafb 51c85a31 094229d2 e43a0670 0d870c52 87ffca65
+    60ff5d3a 48ac4b04 76a06f51 d3e6840b adfd3f72 0eb5bbcf 46b45c87 45b026bb
+    bdafb6f6 ff23dca8 cd4136b3 35468c9d 11e1ada9 46db7b53 3887d265 25b4f266
+    c0995a2c c650abcb 64b6339b aeaefc28 4c56762c d075ac7d 4ce8975e 642e0423
+    7f14daa7 7000dd7f 52c0f37e cdacfa96 06570dd4 36c1de12 3e55ce20 e125192b
+    81c3ee36 5b9315d0 329473e7 68f456b6 88d1a4d9 2909d871 c7cc93d4 09418382
+    1ec2ca4c 7322b942 abe31519 52551a57 47bbaf20 46fb6612 18fb3c79 e205be0c
+    d76a105f f664b675 1e143a81 e06be218 c4f5da9a 6fb2cc88 90c5a617 8318be09
+    0718a29c ed035924 1a111968 037aefba 75196e59 e437bdd9 31e195f6 7ab0599b
+    f9809895 9800a672 0b422d22 5435c658 6b97734a df5ce2bc d4412b19 afa306fd
+    9c55c94b bc04f832 0eef423b 685b6151 fe77c059 46dcd2ec f8167fd5 ba46f7e8
+    e75f966b b9aa8306 971a40f2 97fca015 f38d5234 aac6bfd5 260ce0a5 86536ea1
+    3c68da6b 12baf658 bff6a95f 26113f84 151beae2 c4161b34 9480280b 95c52f66
+    6fc324a0 592e2a9f 6daafee2 4855292c e11aaf54 0ae13e7d 30f60bc1 f0
+h = dc77b925 b39e9c11
+
+k = 522c8c8f c6720c48 82e6758c c93a49f1
+m = 6a52f5b8 45819ed8 b39ff23e 25766134 4405ca82 02d3d50c bc397376 55fcc1f0
+    e4934ee3 e4eb62e4 95fe5bd0 72b58dd4 01ff1033 db26784e 18afc0b6 997fa627
+    2d53165c c3a4809b 52300082 04717531 2ff7044a 186deb33 d82026e2 e946adca
+    28497747 b3af9da8 21b699fc dfb39ee1 a454092a 1062ceef f8f175d8 1fd627d8
+    23495b3d 5f698239 588f3bef 0a8298d3 5888c53a 340c2dc4 97187f18 5f6be7fc
+    24445872 69186b00 220d8b2a af147671 767ca0ab 6652c50b 6872c8b9 c7a6f7e9
+    43ea709d de88da64 a1084c23 e87a5520 2bab161a 87a6b814 7181e645 5be3fb2a
+    4c7aa291 581b62cd f5d65321 1a9eb91e 0951b6a9 d5ae0d62 f222c33d 96f56b37
+    80967dc1 764ec902 e31fae26 37886795 029b9cee 4cf560be fa5f15c4 886b44c6
+    bfe1580f d7ae908f 42c46b11 7fb54039 877273f5 a84b2904 1e1910a2 410d6903
+    1536c177 4bbff81b 63e400a3 dd8003e1 c48a9c48 6a2f9132 d3e2d142 3c40ba2d
+    37654bd5 588c52ee 4432a366 dd0948cd 1bfae74d 5cc0437e 0ba6a965 19c5ffed
+    ab4d3bf0 d033c73b b611f3f1 e3ee2ed0 3f6feafb 795b5721 ec5c3f6f 6dd76f79
+    71d440f6 b920407f 3a25fba3 c3fd0615 b9ef019f fa50ba2f 3ced807b 104859b3
+    713549f0 3d002622 8f9f9dcb dbfbdf54 ad8848d3 2af52cda f302cb78 e9ccfc7c
+    55b7b3fa 733e7e2a 99a9e0e9 7c31fcec f03a5cb4 4d626bbe 83581fd8 ed5fdd2e
+    b373896e acc38844 64cbfbf7 6e301931 c13aa61a 99259e9f afb44bf5 2ad5903c
+    cf42c491 51829c0e 695d46ab 54e6ea2c 55ad1ebe 18d50ae2 0029808a 61c17c76
+    70eb810f c5109856 f5a470eb cc6daffa 4e908936 be24047c 208d7db4 93cb
+h = 6c64dcf5 bad00863
+
+k = 3d3ab2f5 d6f4d69c ff28c4e2 99f4de9a
+m = 255c0de5 657669f1 99c5e075 682a877b 300606ef 46012228 b3f4922e c0e92205
+    ea06a4f3 bd831cf1 d102505b e3b84721 408af913 e9192b40 af42ae40 04474ad8
+    76f9e854 6d1dced6 824f7483 c8b42a05 600d303a 55d7455c 1c1d4123 60a32402
+    d31ffac0 3467932e 9d7fc088 63a93f72 4c0183f8 55a6df5a 6c6a660b 9eab2109
+    045df85d 5e8c51ca 5f16c575 08f0ea9b d8fcc67d 9e41fd43 67fcfa40 37f53248
+    40cdbacd 33b9a8b5 0697a2a6 37802788 ccfe0bb4 c2ecff23 20c2aa11 edd4c9b6
+    142f644e 12fa79a5 c2c78d6a 3a62c921 ed4ee44b 4a380f3c e0491195 91bebfee
+    0b6504c1 36464869 c1766a3d 1015d9de 77c66afc 7c894144 06a8c29c cebee47b
+    3dc987f0 4a4416d1 b06834ee 505706eb 60ca5f72 ec47aad5 37d2c9fa d24668ac
+    d523990c e026b1c7 fa670f79 14694733 554ab98f bef87dea 57f0af48 f8f55a35
+    aa455ad8 42567bde 04a114a5 4d4d5375 4b5ec115 66bfb486 49093c2b 4c6e809b
+    3a0a2de5 658b49c3 41624818 f2c69bdc 2cc8e27a 0956ff62 7c7d5f30 9b8029c0
+    c7c15d37 43c82fdb dde4daeb 1e4f05ee 8073c77e 90a655cc 0d21e41d 88f4e95d
+    62cdc6c0 9f7a163a 79ffbcb3 b5f12fe6 decec54d 787443a8 32800b4c be67531b
+    1e332820 d31e3687 ff9261cc f8649f4c d8e50d3b e9f8aa94 6f90be9e 4957b545
+    b4b8bb05 38fd15c7 f6b4d445 31534c0a 4b91e949 dec36ba0 82775539 0547df54
+    f01433db 561cef3a b9f66461 c339109c 5fab1be1 59ba460c c44ff4b3 07d9e7fa
+    2ddcfcb2 6cd96236 208c485b e8d5cf03 5e55c7a4 49bd07e3 60602876 e0cefd39
+    4a5fc581 501bcdb3 2648c331 da70cdfa 09a3344d f3f0a3c7 23e78de4 389cbf
+h = 7acccdb3 13ebf555
+
+k = 5b9af8c9 d2c9913c 2653fc77 4c70b2f1
+m = bccc949c 55bd7a9f b77a4378 77f67b8b dee74840 531702c3 bff014b6 58583e4f
+    1b0eb605 b32f2903 17d29987 c3c65800 b113157b c48dde6d 134aab5b a1146c9a
+    7cadf660 9db5292a 2d6025a5 dfdfaacf b39efa34 958404a4 f4587ee3 37ae77a2
+    043e3163 d418f8b7 a2dda2d1 f0544086 4c01ffec ebbc36b2 0b562771 3b4883ea
+    5fbedc81 a83ce9fe b6c10d24 1bfff82b 4525eca8 eaf1d9d1 eb101261 17f3dc10
+    62d4c96c 934200b3 566797e3 4dbbe281 d6a5616c 2e527a1c ea09e260 a89b8b01
+    c812aa64 42f29889 c0cc0e2d 4434f397 801932ea 47d0f945 b898480c dadf7c64
+    3cec380d f80e2920 62b6a274 65c99272 944263fc 64ae9c68 c6fbbc76 f5bb4f88
+    2d4e9fa0 fb49286c 2b2bbc2f a712cef8 17df92de a7d2a1e8 ef2c8d69 96aca97a
+    c97c256d 5f878787 6cf44da1 2d4a1553 d001d8a9 087151eb 91966d8d 6eecbacc
+    db5571d5 f62f56ff 590a2c5a fbacba58 c05fb661 c654a53c 14e7b150 d939e2dd
+    5539071d c7fbd056 c33fe379 068902dc 613dc997 9a5becba 2f96714c ce44f8d6
+    3a4457b7 35990243 e7375485 3b6d53b9 9698e029 b0e10047 7c960954 89365c80
+    75cde679 50915457 3f6b4d36 885abb50 5ec90e08 908eb867 bb85bc73 a202ebcf
+    3020b7b1 5c66f671 7f52e8ff 734797be ebe0ee7e 8ca52a85 f4dd9654 75cb2cd7
+    40666a43 94231030 28977b22 a99f72dc 96eb8e58 21415e3b 5461c32a a0c0acb4
+    ec14073f 6966fed3 afed44e0 d03dadac 01f0ce59 9b11ee6c ad456918 417f3770
+    28f16248 91c2d735 af6238dd 2df8914f 9a969d91 751e0fd5 409efa94 4ecdabb3
+    e9af5e22 bfc624d4 53f0c811 e3c09ca7 86ae29a1 9b9ad3dd 52f9e1a5 e1f38824
+h = 6138fc91 d8fa1fec
+
+k = f7cbf3d0 4881e1c4 752e6279 5c41af26
+m = bcebf75c 92109d07 3d9aafd0 1a3ab43c a3a92f3c 9dbbda51 9a45a13a 5a039e99
+    d358995c 7e8415b5 33acf14b 382ddbf1 8f6769d5 33de2092 8e65942b 83db43a1
+    19ef885c 4bcb4a7b 44d1d0af 665542a0 3f8936f8 83be603d 13e86eda 034ac139
+    04c4feed 76f90019 99f85e96 650334dc a8cd1e36 d0f16c4c 2ec234f4 bc991887
+    a224a4d1 55198821 37065084 2266c3ae 4754913a 0eec9dbe e4d646ca d5e0c68e
+    af48e39b 9bc7faec d5704d30 d733b4ba 95bbb469 e556a4a1 d17ac3b7 98b1756d
+    891925a3 c8e41814 926462ac 70c4fd67 af939212 30d82531 9e6dd920 97817d9c
+    f56a822f 34af65ad 8b73b74d 527a9421 4dc948ca 11f52325 728713c0 331ded4b
+    1180bf4a ef800fad 592cddb2 c1ffd81f 7f5d5953 d1316105 e75e05eb 11ad0030
+    2a14f3ad 053d2f04 6dd3aaf8 287c4593 9675a8d0 d89c9aee 3d56c287 6391a269
+    c67dbfac 3836251f b584609c e6be7bee 4f0802ba b10ec0ea d268a4ab cad1f791
+    27e9bc12 0a2b9f17 c3437f1e 584244b3 57e6e642 e18367aa dc2b3a04 5bd2dc27
+    d823b35b c056d102 7a34f6d4 792ebf70 52ba0e5d 1a33d541 85b3787a 7d4136db
+    056b6e09 1fc47e18 5cba3377 4f743845 3c6b4aa2 ec51400e 2ab8d7d5 19019ba6
+    f4e37259 fab99718 44dd0e7b 1096475c 62dfd550 45bb31f4 bb622a6e d06b3d19
+    ce88251d 1b323579 585732da ab8f696e f87edb4a 12943976 ed6abe46 f2a85425
+    8833d113 25ed2539 4fbd8aaa a5d0867f 99236998 74908d77 7626df49 0bb6b20b
+    45a72d49 b1482d8b 6b4e4191 02989dc7 2f2bbc9b c3c8813b 13987b2d d5ca63b4
+    bf5bbc10 c331b568 2f546ccf 940b3311 60f71b33 1c362d04 6cabcde9 30ccd6b1
+    41
+h = d5626c90 ff7ebc9c
+
+k = 8a542e73 f1a1b596 dc3b2709 9d21ae51
+m = 3dc8b37f 64c7163b d4af9238 dcd1dddb f4c2c059 ec111e3d eaddb0b3 717af882
+    69d937dc 3b5130a6 147cd8a2 0864894e 230c788c 2e94da9f d59c4b1d b5c985c4
+    1a5c84e2 c3962aac 639e2978 600a3f30 4632ebb3 522e967c 491d2732 67066dd4
+    3905ecc6 cd668912 051080e9 b9ddb2da 121979f5 95bd18b4 dfac9f2a c3c72dc0
+    ea39e31d 1beda3c3 22c0aff2 13981cbc aa9b63e6 0e3bc165 0c839190 ebbf41a3
+    53e804a2 760ed3e9 818ed5ae 488d05b5 0760623c ea68c1a5 d501abd5 19e9c752
+    55c39967 01a6d851 17fb003d 7bd82338 27c9dc73 c1637691 d92adad8 e2ddb240
+    a154e849 d1d3a01e 317a6be1 ac63198a 6ec96f44 c511c820 e96dd278 78f5a069
+    d762c95f 38e8492b 1f5df10a 65b17b20 cbf1c1cf de7503b4 c9e1e7b1 7b5479d2
+    e697ce68 786a0163 154ae4a9 852dde9d 5d92702a 2e27e97c 25f37f48 e4d904be
+    4229d41b a0403844 4aea5ccb 00c1be0f 68832cf0 fdb14235 5a127ada 882a3cbd
+    58b70e17 54a3f147 383542d1 fc1dbff7 ffb7a07b 75191e00 45def943 089c7cd2
+    9ec50fbf 9c98758a 55cef2b5 d5362d0b fdf9ff9b 506aef2d 938ead8c d6fb926f
+    f29b6098 5bab1ef2 eabc0591 5e5b9781 fa0fe342 0168f372 cfdb7b4f e9896bf4
+    fe7ef7cc cb3515f8 d96f5f1e 40b5e877 e42c92a6 b6351bc6 1b6b44b3 04979aeb
+    19e28aac e79dd2ae 1af7e3e1 f3d432d9 b2e986b1 e33cd560 0b71f04c 26aa1537
+    d2d33a46 d752f7f9 58ef2c9f 599fab25 c61f81e8 28a29bec 7c4d35af 48d2c84f
+    70e4f0bc 9e3f2cbc 4812a28d 5fbda963 e8acbe12 798d41e2 8c1f65e4 79abe2ce
+    9f47d06f 48eacf93 b72a17e5 afb87fe0 b02ece7d 37cdb4d1 0b352e47 485bb476
+    e1f5
+h = 6e128bea b3bc7126
+
+k = 14454c90 671ae248 b6ad08ed d8586810
+m = 306ab443 128a9d31 396ba76c 327ae215 16b69e5e 6fa38568 c8907a94 5dbf77a1
+    2e7a12e4 52679d8b ac634710 586dbeef 7ee6c686 00831642 51e24f45 417c9ed8
+    9fda7d2b 8e4eb80a afbf16c8 89a22376 80e42ea1 016151f1 5d92e3e6 ab86dfba
+    f9231828 e0f5a426 8d674051 593dff2a f9c34951 e53ae976 afd3d63b 64410a5c
+    5a02bcfa 765caed8 1a1cc3fe da6f787e b43f70c0 bc5ead65 760a7964 3a1b5fd6
+    6c4593e5 e5443e84 1a1b214d eacf174a 71bea8d8 35a25775 3fce86ba 6c038693
+    b9ae013c 218d23d9 3cd8510b 110ed5d4 b4298711 fa980255 0d2549de fc077364
+    71db5501 d057e8e0 8ef9973e 2697b13e 4b7e3da6 7aef5a28 70741edb 81b3dde7
+    870e5385 b1cdc0e9 fe4e1de8 c1038652 2c022918 cf06a977 2a6cb51e 418aa789
+    46bdfa59 55f5c41f f0a3ee6f bf0a5647 691249c8 5ff386f9 5eebdf71 4d5f0048
+    b16a159a 17103727 8c6883b7 dbe5581e a48ecc30 4c1cb5d1 67d118b8 897fad24
+    6dc6631e de3b3b5a a1595169 f5bfa89d fccccaa6 23501c8a ee884bdd 8cc4d66b
+    332f9f11 55bd412a e6cba4fe bf3cb0d5 1029fc68 4f39cdb8 d18aac0e 8673cdf2
+    43957f9d 33d0fe1d e375e384 25019790 f7611948 c61aba6a 23a06f9e fe4deb9a
+    1581c1a1 0032e3a0 d99cfc33 8e15d2b3 29e406c8 fd8c9086 f81e75d2 d1b42c12
+    3bbf5b96 97d6a904 b5d009dc 82648e39 96236921 73008b9f 52ae1429 648c7e4d
+    d7d40bd9 bfcc2d42 6e9b4f65 254dd7d6 b8c1b14e c2593c26 c4f470e1 8e38620b
+    be3ed56d f5093b3b 1f3eae67 bd44e0b3 ed50ff7f 94708250 a5364706 38cbff77
+    909eee81 8de12c7d 76701318 ead7a4eb 17c6a33c 2da9ae52 0fcd1cfe a78ec4e6
+    7a808d
+h = 2741b783 afa3f788
+
+k = 8a7584da 6bfbf657 c57d22b4 117f2b17
+m = f68a7d93 d45be8aa 73f0a604 7409a2cb 06f4ca35 a1ad9af4 57eb9f87 3c4b24c0
+    20d6cec9 35afd136 c8162799 a6fc8edd 4d104736 073cca39 ccbaf9bf 23ff5950
+    21ee2fe8 985efd81 038ac973 834f23f3 af3f5a30 5aa878fa 6f6bd3c8 97d6084a
+    a94d4a84 162daacf c5dcc170 8f6ac286 1ed864bc 552571ea f80c1817 ad018729
+    ae6cb9cb ba2c7ed3 8ebb011d 9925b050 38e6472b 9a4161b2 d43982bb d09e881b
+    e74dabb9 f4aaf026 0eac60a2 20d07c01 198ca801 6000f514 cf35cc17 9d10328b
+    21647387 af34ed74 152274db 2e4d5ca0 d2ce1bc2 3bfaa331 deff2f06 5f3928db
+    ff4c9d5f 9a4aacf6 bf569628 62967b2c 3e01f7bd b436db63 e6447b64 46ded371
+    b68b0406 d00ee0d6 bb8d8347 9f800688 61a8b13c 8dd145f9 e8d57691 ce4c042e
+    b30c889d 462c3730 baaa4483 0a4f7bac d2d96db0 dc60a89e a5d60531 6188d3cd
+    5e4a63b9 b0915af6 d8f5cfe0 9551b9af 3b9b0881 e711af7d 84da5833 3ae3cc2c
+    fb472647 ae778ff4 e486e741 a283a5c1 d64a1817 891795ae 123af1bc 9cdcad83
+    a14b5361 6b9bbbb4 227ba645 099f92e4 5f965712 34659a54 4eaad10c 01ef05ba
+    8060db96 356d7800 48ab8581 c9f98d70 3dd86ed7 5bb0d974 995766d8 418b2a4a
+    f8c83ccc d2916f6d dc51a92f 3bdf74a3 d8344061 29c7b877 ef8592ff 813dfd7d
+    7926881c f27a2cff 28c2d203 19238d28 1fde6335 6f2395b2 35e0aad7 e0a5f560
+    824bc167 306b1429 76b17700 eff8042b 778fa999 fdd371ac 009067c4 0ea7c5a0
+    6666806b 0ebad25c 91780d1c 3d82faaf 8fa039ad 59863b7e 504e7022 054647f2
+    88c12cec f0cd0c03 c1213659 14cadd17 b9d729b1 ff2a7cef 47687d7d 07e7ae22
+    a1b242e8
+h = 5db0984d dc0410b6
+
+k = 101bec74 a3282f38 5c20011a 5299d81a
+m = 25bcb70c d9c8468c 4f5411c6 1f673cdb c5e86d87 48074598 3e36a4a7 6f80f094
+    f33643a5 3cb8b8e7 3dba13a0 2628a6ba 30ce88d2 6cac7b20 b354fdaf b5e7f251
+    8dac9747 bcd32fb9 efbfd5a5 7d748bda abcd0856 f0b0b722 edf3bcf2 5828d7ca
+    aa52bc71 6d855b5e 02f842b0 180df409 16765c9b 944c9f4a 8197987c 7cfeefaa
+    19ec5c72 1707a9d1 9f26c11d ac1a263f 6eae88f6 afdec3f1 16cf31b3 a7199394
+    b4cc67ef a89bb586 4e606a12 66113607 9d4c2535 0d9b2be1 dcecf811 e11a34d1
+    124677f5 56e8327e 9073d8f3 43073fd4 79ec2e91 ce281c1c c5e2160d cc6994ce
+    68c9c10c ddb9620f 04a57fee 5a8ca026 16b13c8a 7f8af699 0cea8b34 312da6c5
+    35c0e078 3e9d98de be5582a0 5e9313cc 55f65ebf 8bc5e22d d29ded0b 84205668
+    340ae6bc d2b0d558 5741d647 b6dd734b b9b3e5ff e38a6a7c 67bc6cd7 93af8fc3
+    085036b4 b8805e69 22118815 e6cd7cd3 a6d93e20 34f5561e d99cb99d 79f7cd41
+    af6435d3 0b1d2c78 c57b5c09 dba9878f 71d7f89d 4a0fd874 604d4f73 50c050c9
+    fb9aa1f8 8bb52203 3be075fc c4cd1302 56468b8f 15a966c1 13bc5db5 d3cc109a
+    69bc6ce3 0dacd1a9 8627de2e 037d7a63 2bddf1ca 5dc87d81 fa20f980 41c6b838
+    6a6ec5b7 bb29fe75 9479ee62 c9ead967 25218a4b d75073d4 189c2790 ef4ea5f9
+    0da32891 9903b476 aded2ba6 00a5b868 0894060c 54077c7f 4bb51356 2fcdfee1
+    f6b7407e 4dafb837 880d1b37 3d3e9fab 7b692973 8565598a 5369e45f de44af70
+    54bd04fe 880d5ea6 ca0fc94b a42e7454 1e6a9e9e b9a6ed94 b96943c5 42df936a
+    df2579f5 1fa144a3 8fbc0e0f 134c6d93 ae505c9f 7bb8d31a d2dd6354 ac6d8140
+    b9b47f53 ef
+h = eade3ae7 44384350
+
+k = 9791b24a c33db55d b6aed0cd 9b0ae6d9
+m = 75d7846c 90ab3824 43d919a4 76941af2 347c8e6d 83c8b3eb ca8d5eff 5476ae50
+    86821691 aade5604 f44b0b1f eab8bdc6 ec250529 badf9834 b7cbdeb6 d26458c8
+    34e5ef27 d48cb7d9 d647c905 8081129d 481dda66 ccfdad87 277067d4 80568673
+    c4ea8bda 3943d8e2 54f351fb 1a35f92d 66a8c420 3495dcae 08bd74c2 55837357
+    1bf3b06f 6133f70b 9e76a8ab 26462d6e 366e01c3 bc67f287 305e6e9f eedb4ecc
+    06a1c71c da6c66e1 9411303b 45be7920 5cedf4f1 5373b958 cd3e5730 6f851b9c
+    10ef0a1a db86aa76 7f8fd592 8b8ace4a 0447df22 692f4f9e 97b1b3b3 ed808497
+    621c7c47 e85a1fb4 f5c24513 7b0267eb f747a1d1 14880067 f6372e71 16720821
+    50e9af73 6965f972 561b8104 4fb01c65 43538621 f53e2f99 2bfad51f 7514e94e
+    46717fb0 d88e8887 b20aa5db 690f7a2f ba200348 fcabd474 f910e3ba 981ae1c1
+    8c8a8870 71d9aced 7b2ca892 a5259ca8 abe15c1b a14a25ec 7dedcecb ee64f272
+    e45aa260 4b16efc5 e9260695 3c05e345 625d4f50 ff8d0610 b5c844a4 9b42dc55
+    698ab53f a7f902d1 488725c7 62582e35 40b7222c 83106447 8485e81a a66693bb
+    92f9b989 8df9dd39 285b4d95 31ee8a48 96da30f8 b5a92d69 4346364b 6a6cfdf4
+    bc7e8921 1f84c4d0 77614de4 f550cc13 000fc769 99244191 38029999 63800e23
+    20df434a 65328ff4 eb3bb5fc 32e431ca 4033e600 63164b30 ca69b927 e4a7b07f
+    0a960a50 62823987 ec813a3b 895b651d 053f632c 4983c12d 67c6e9ba 78e97295
+    23a5343e 454a4727 5152d180 84917e86 1e58f865 6e6dd868 b211bbfd 3ae91ff7
+    ab34b3f3 47ddbece e3131255 e95b326e 9bf995e7 53acb124 783999f3 1d66d0d8
+    acc46fed 83a5
+h = 3fc21011 f7bc5804
+
+k = 2691ecd7 5c56a4c6 b005ea4b 869977a3
+m = 0a141b6d d14b770f 892081b8 2624f7fd cdcb44c2 95c33a6d c5825dd4 b10718dc
+    644b74f6 09a6cc36 4c6ed93e c33cd19c a961a00d 18249854 016891b4 672e8b0f
+    5fd82fb6 7c8eff31 1899305a 6b134e23 8f921818 61ddce5a 3449c353 5541d03f
+    1e8d0f3b 044bbb54 c242ae8d 51f40209 dac79c15 262171bf d48ea619 893cb970
+    3e74f7b7 febe8bde 6f75049a af37fb9c a88c2f03 dfb5ab0c 9e9d95dd 54ac6d2f
+    40f7a166 e12fe4b8 46f4da98 f0334de8 caad86c4 5a6e0f8d 77c23105 eaee9f07
+    636fab96 707a7f72 e60c0fd0 7deb6b4d 1cbc4f36 ddde6f3a 82e8b549 b290b8c8
+    b690cea6 e95b04b5 804bedd1 8d4bec61 ed3ecfaa 1a5731cc 9432e0f3 e0d643c8
+    66a235b8 ecebdfb9 4f3bec69 0f5350e2 6b61ca62 dfbe1625 5418544d 742ed585
+    526d32f7 421f0711 8f92f49a 17e44edd 6e525a43 3a11eebc 94ada799 d1436086
+    b9257058 e16149b1 31c1e2ce 6fdda8de 80f3b417 90784012 cec7380c 1918387e
+    aef6a499 65c611f5 af89b4a4 52679dcb ac43b1c0 c1351fa1 a663fe3f 32663e60
+    e5e21d2a 3ceeb5cb 7007ae7c ff649d3d 0f0a25af b5c06a0e e2bf69ee 0f17800f
+    02e13720 304e85e1 ca544d25 4cb16bbf abf63f9a 8022ea8e 0c586b2b 490d483c
+    18b37b7a 1577b0a3 6431a325 cbcf03b4 5b2b37a7 5e629f2e 421bd692 45c89bea
+    514d8336 9fb43be2 3b1bf82d 733b9b62 7dd20e06 5e7ac49b d07fe507 510338c4
+    63d8e86a 5622fb15 4ef0f361 175fa546 05a01005 7beabbd9 8fe89cb6 df026056
+    fc140070 36550b9c 07224475 0de52407 1cde0b24 e904ce64 38ceb8f2 25da580e
+    0328d7a5 19b08b5b c2e5b10c c4254b86 75b0d5c4 3896dcfe 922752db 31a7697e
+    8787b5d5 6d20ea
+h = 8347a988 4df7dd04
+
+k = 04c2368c 7ebe35e1 b02e59e4 30fd1650
+m = 738541f8 98439e4a d7bdaa6e edd076c3 6998f270 ce9eaca7 fb0672d1 c6e00bd6
+    274ad799 cb7c043d a8e0e295 7885c51d a0665d18 3a65922c 4d78aaf2 473a52f1
+    b517bc67 56b3fbbd 12ada480 4aac8dd5 276b37f7 f4133868 a31e1f1f 577f5b4e
+    4163b2f8 223f980b 0ef80704 437bd5d5 1c717e5d a78037ea cdcb589d 9ba4c547
+    bd6b9851 05f849f6 076f4e85 ca1d14c9 807ef4db e8ddbf1e 11d66ccc 4df425d4
+    b95fbd9e b7a66116 e1dd3428 49f9a96d af8fd3e6 41c58343 0d8aa103 308d8ede
+    36340047 773bd98f 211c87df ab2bfe58 1f9128b7 c68bc080 5b20cda3 7b8a259f
+    cdc1b015 9a95baf6 1cf0545a 73d8c679 518721f1 2134adbc 2bb04667 f3d5ef5a
+    3dd7b25f 03ed8bc2 77008ca3 f9713dc0 d7c2b8e7 5bb039c4 f06ef4ef 854ed476
+    6315b5db 8305063e eb178b49 56837d82 b74ea5de 15fc9e6e c798b7f0 07ebcc88
+    9044a69b 42c767a8 56177db1 b1f6ef6c 0247eb38 3c2a1512 5414582d f2abb76b
+    9ae8e773 c3e4bd9c 6fed0fbd e068d049 6bc70572 8fec7df7 945f32da 2947a8fd
+    12c429b8 97d992e8 4b9f5d9c 861f4e7f c310d5ca c9317337 b6413e6c 3b126bfb
+    355f71cc 7d0c01d7 09a6978f ad4d9fce 4d55e5fa faebe93a 92257267 baa9d3d1
+    3bfd00c5 9b6b58f4 8a7ccfb3 58fc5779 839f58e1 59aead9f 97874c31 4df44d91
+    94cb63a6 4bcbc0f1 18949dd0 dc5955b7 b22726b1 32f5c8fb 40d10c58 f5fc86d9
+    ab7c0bf0 9afcd293 7fc5d62a c5c3a62e c207ee70 dd8dcc50 db073f40 a1a65d29
+    b971cd4c eff8a1c7 e934c3ae 94b634fa 110a99bf fc42836a a59dcdd5 2bb468d4
+    135d04e4 6679580c 493b69c8 57f93b92 71cf4db4 b65fca51 de5c9362 b993bd1e
+    341319c3 a6d13e2d
+h = b984afa0 04ffde6e
+
+k = da778c09 3d8224c2 605ff51c 0b7f5917
+m = 25811af2 8811c904 c952d794 c66efab5 6478e80b 0e67f79e e5ddf217 4e5cb905
+    bc627cc6 b4b8f02e c893edcf 6cc5cffd 27bad0a2 f81c398e f5c7208e 46aaf448
+    8e6cd249 fab8aadd a23838f5 86df9db7 7c05d0a1 ee6684f0 c4d56322 849ef046
+    6fc80850 0ed7a475 93090b82 a8484076 50450d3a 360d3d8a 993b9c99 a83bda69
+    3bd9b52f 189395d1 002d4713 20feb43f 8440460c a8c55bfb c926a6c0 55740ad2
+    cf91cd4a 2882fbee b7f867d0 929cf8ed 2f8daf92 645dffa3 f1b2fb9a 506ba6e1
+    56c41105 afc34871 3687aef5 05f54f78 29e8e174 c247ff7a 6ff870cd d41b34c4
+    72190076 9cfaabb3 2cd07091 aadd6049 d9007555 77ac522a 1869e0d1 7fedb955
+    b2fa10c1 1abb33b9 7413f15a 125e7e9a ed91c9a2 b801d823 a02d9cc6 b89e0fbd
+    59334061 71081459 14dbcf53 00fa9a86 444dc83d 024a423b 0906848a 6691d706
+    4dd5992b a85f3659 b7a4d901 3fd5ffef 40c5993f 005c0899 6f9298b3 58a848ca
+    dc0c903b ad8c2d36 3af89b10 4000ce66 beb2e0fe d61cec0b 7414b797 e9b86eb8
+    e2326b1b 4f163421 b5920d39 eddf338e 3159a12c 9db45993 a179da68 87fedf7a
+    8be2bb4f 11724e4e 2591ed62 a2f41224 1080bf00 76250c3b 9815c78a 296a4ef7
+    2e59f4bf ec00c7cf 7af09e5a 39375941 bfa2502d 8a2343d1 5af6f5b5 150f1b58
+    03ee3b40 1960fcae 2b4b896d 7cf6563e 67a79d64 fb987775 e2ff045d 037bf6a2
+    8152267a 63d16e0c d6d91567 84b9faa4 d0a38247 30138435 40f67859 ec21e6bc
+    e9f3840b 2090acd0 07f644f3 fd92dc43 d85149e6 368f07b7 6a51b1e3 d14a4344
+    a7d8ec87 70764064 ac62eca2 ecfbb6c2 aa94abda c5569f41 a02d8594 61e99e75
+    94348e08 3b27a1a9 f5
+h = 71cb7865 03d7cfbb
+
+k = d4c23d9c fe7712ac b6ef6e51 1f8cfbbd
+m = 4a1a0892 4f54d0c8 b357b1ca bc44010b 48d9fc5b ab85f6f2 978dc6e1 e4ff3145
+    034bc87b e1a6fc0c e58cfb51 c06cacfc 82a5a8b5 ababa11b 90b8b447 2e6a7443
+    e590ea18 8008b029 369a93b6 e76f7ba4 7c64cd7f 15598cc9 03c5b889 2ec8404c
+    6ac11a38 392d2b87 6ea05909 90c08ad9 56f995b6 a6c858f9 ae3d69ff 14e1f1a1
+    95b44cc8 af5f0353 2e9d6100 9e8536fd 23c57326 27111308 033f982d b7f2803e
+    c1284814 71639634 80d50e07 5ae06b38 2ba94b5a e76b1b6a bb7303a4 38a6571f
+    7d9fc6a9 78e0fe66 26b405fb dca62ede 90e073d6 9db43219 c1707057 e81e2e86
+    a0b4779b b31d8314 26eccb95 a7910ea6 34d86612 9770b733 587783f0 dd9d75c1
+    d6c34806 97e9e3c7 59d0e94f a7806e48 3432e580 9760f600 b0f07e72 6a5b505b
+    1839ef89 463e72cd cb964565 498d823b 8813c88d 875c4636 07fd5395 fb07f806
+    b74743f2 252f4ba1 f91529c0 be2c34c7 4f2bfd16 d680c6f4 890c0c24 57275e31
+    13d2d972 879f1cf5 9fbc0014 840fb13d 46eb41a6 da8b4f8d ec296915 8cf930a8
+    9213195e 50531959 54dcda6a c7bbe449 36adaa98 09a20d4a 9783311e d1f68b46
+    50a848a9 14f14f36 57ab3355 9cf5fd6a 28f03077 95f8fef1 80ebe6bc cac95942
+    1a01f84f a2f9b07b f55a5781 ed8cfd0a 92e160ac dea28158 ceff62aa a52dae4d
+    dc6a8b5e 8d989943 2a0794aa d105ab27 0aed7c39 9115e47b a50ad2db 585e9180
+    6ccbcabd 725e3d38 e000e419 0bcf0ab2 537297e6 7701bcb2 554a6b96 4ebd3920
+    29b0c2c0 9ac8a520 8055ff2a 9b6be113 1a13460f 7bf3c8fa 3dd2ca28 6580c8e6
+    1587c367 741c84c6 cbc4bb2f 46b43d67 a0790051 73c5aa41 d72aa60a c2a4e230
+    633fc9d8 b31bed65 fd41
+h = 4156c0ea ae6ed221
+
+k = 30a01f76 64a9d9dd 701793ab a981751b
+m = 4692f2b9 1c558583 030fea4f e8e1b7f4 f3c841ba 5a0e9253 788843c1 57242261
+    9bc1aafc 885c7bf0 cbcc4654 9a4547c7 a93c55c5 68034013 be01b4e6 5917a0c0
+    143129fe 67ee704c ed51bc5d d4a12909 d649c052 ca22cc85 bc9f9d74 c0f1bba3
+    993ff26a 6865179e a18eb0ea 0ff8f650 f719fab4 1c12f959 0a640c46 1f27757b
+    dbd4fda6 f1af933c 547e77a6 48ec7998 19cae7fa 88e7622e c02e5233 1002239e
+    56b0d3d1 293c09ef c6e4fc7a e7c59f04 f561cf27 8613be33 227ff688 4f2356cc
+    a16a19e3 98e0c3bd 0dde9f5e aa263226 d481ff0a dfcf3879 fea6d40c 7f195eca
+    9f543b57 5a744da2 2787a6be 91ebe34b 1424f6db 1aeced2d b143175f b7540c2f
+    fcef1f79 51bc20a0 4aae12ed a69ba436 948804a4 f4f47eb5 39097720 4c907b87
+    ecce4849 69aec511 0a3a08f8 7441f9aa ff2a691c 819ab9b0 0d7b21f5 386a03b0
+    4df4cb88 d792865e b694fd62 5294fa68 195030c7 2b00abac da19a0a7 bdd06439
+    b0e379cf 0e331389 12a11d4b 43e0e68a 79b1c6a4 e514c86c 93af9990 83dda468
+    d3a802cd 9ac0d188 4d2ea19d 90863417 93998d18 9a958bc3 c86dab65 a87dc00f
+    358d3928 5c9d5a98 0deeff02 fc350b01 b0c0166a a104a2a2 1fb95d30 253f4442
+    360ed2ff 94287b7c 909ed2e2 13634484 221137c0 ec5713c6 3ad749a2 64fbafc0
+    3bd2ec0e 399d8739 32c1f3b0 80cb08f5 dfe2d4d4 47482b3e d7ad00eb bc2cfe9f
+    01686517 9da1c386 2b56abde dd2664f7 403b9918 7eed94e9 f172fbd9 4ac6f261
+    ac94b4bd d01b0243 0d85b851 46fd04e1 dc0edf60 c406a197 d4eb6396 706a7763
+    e63677dd 521525d3 62e9c4cc 8b3a2e5c 679d3332 a66c35d6 b4027c63 f146caa0
+    0fb0ff57 279d02a7 32b87d
+h = b33c9fea a9037215
+
+k = 578da27c 168790bb a3b6c630 0e9177af
+m = acc3511d 4476c21f b9e450b5 46603ae7 9fd5f0ce b2afa854 ee6d1aad d33eeca2
+    e9876126 f9e55ef7 2c437c30 f2e3da73 78d5b09a bdeaa6b8 42242a07 6b05fb4d
+    f1b37cb1 6b1f1bbf f0d82ebe 8e3ee846 8e1b6cb9 f477ff84 6f370e88 c7b9aa83
+    0a9705d9 1da5e2b6 19e56d86 0067d5a9 f3f3cc0e f75f5940 825fb6d4 b4db4c71
+    34a8d22c 5d7bfb22 853f7d77 df7d2efc 645be9c7 162761a1 19539a1b d13e12df
+    a41241be 37261f03 2b09e1c0 bce424b8 984df50d 35996f89 1d721341 f21c8030
+    9f51fc0a 36a932f1 2b21138f 499990b2 6b7061f6 f6b28bf6 3ed4f528 719fec4f
+    c19db9f2 0c8c991d d9c548cf fc8e5a7c 063e39b6 7bc9f69f a89b2c76 4eaad71e
+    9b8a98fb 3f4d2f30 37208f87 8f75a17a d1936125 6b5cb8a6 344b0097 fa24cdc4
+    3591ce85 ef1fd3f0 705ea656 ca1e8d7f b6a5c80f cffb0c1a fc1ea319 c77663a1
+    8e01af02 28b9b137 2c088100 ee09772b d34039d2 4495dffc b5a2bddd 538e4ae6
+    b0eeefd2 e8408fcd 55b0cf9c 8c52e9e0 fd29e2f0 8c73e8e9 fe75f5b9 0b3b94e8
+    17212531 4e4c3162 658fd80e abe98370 f5ca942a 2829f717 e712c576 87d9572b
+    f56b1385 84a6d635 6d4b4084 5b8e3a89 d91c459b f28874d0 63c7eedd fe4e323c
+    03bdb038 4d135266 f761b46e c5337572 9be81e9f eaad3c80 a733769a 842a7964
+    033b1663 1edf6b6e 46b5b6eb 84128411 397d1dc7 1edae87d 88cec839 b4e3f7b8
+    b4338149 0832b166 388f54b5 8814a05c eb4debaf 78d7877e e89429ab 76550559
+    408e75a9 58d5f54b 6afb96f3 ec3bfa72 8f630a7c b980e34c a9e8a54c e0da5be0
+    73703e67 cdeb51b8 2800a06d a16d8515 0e25bda8 adb77fdc 2db733a4 92e42b45
+    74d0cc32 f54a3e81 085272de
+h = dcb8e57e ac92da8a
+
+k = 01069279 2555b666 2e61102a 0f714c81
+m = 058afa1f 19306148 c2ad008a d1c9a4e1 db4db04c 29400774 48221504 2e578d63
+    07bac157 9c03a4ba 41964e43 e35f3adf 8b7e6bc5 1115074b 01dcb4f9 5d31102a
+    3fa1cd8f be1ce901 0bcb4c68 9ee14067 e2f0fdad 1c3b68c0 2f4970fc b36680ca
+    a3a66b48 901ed3ef aa84f9de 7134d0f0 102bbdad 21fee3bc e3fefcb4 52518840
+    e06bd741 92b094eb 628f659e 769f5568 9e0b818b daab4008 c5a8805c 9daaf075
+    3fd0e9ac 91a4229b e1bc8778 fc0dd617 1a004e37 4d3a1339 3aa81a26 a70afb25
+    3299ab20 a99e39bb 4b23c3a0 daee91bc d465700b 425d10f5 bcd77139 aeeb024d
+    9ff2eacb 1cffd68d 1d0f05ce dda3c769 f22821db 1286eff6 19faae85 8691cb60
+    a3fb2a69 3ae5909c b9bb68fd 9e022fae 57a8ccc0 8012af25 1ddddd56 34fd6125
+    79a2b15f 20d6fdde f9a1f0ed e3e68171 ca835812 4ca7a14b 26251d73 0c189c4e
+    08975537 1ea09c29 4e102314 9e4eae20 b45b9fbc 7d2a6f2d a92229c9 c99b9950
+    38f036a0 9fb3eb6b 92420651 557af65c 2ab4c128 0b6e1c87 62ec39af e372fd49
+    7262c9b2 65cbe7fc f9e4fa08 ca101836 2bf892a0 819b3979 f93f824d a92a7134
+    8be4f10b d8854404 8c7e95b7 a1d2bab5 7812a63a 6d5d1f08 c94a48b4 2f7837bc
+    97d8ebd9 0f0195fb 351a9f3b bfe523c8 d134c2a1 b9c9d8c1 cd541c44 e7121b0d
+    68ad6a55 be0bf475 8c9e98b7 8a86cfa5 51fd6e29 b612841e bb2f731e 6b172485
+    cd5d41a8 5feac340 f7162a76 5b7347f9 7a5c94ea b296a059 5628a38b 1740e11f
+    954f54ce 07a5e381 2686804d 2f500090 4c184ef3 b819d1e6 1b9805a6 bb518e40
+    cb07c14d 4e923cd1 2ae0a32e bfd6f869 396cbfbb ffe1cf3c 90527044 c150dd22
+    906bcd03 f6e02152 829f088f f1
+h = f3220a93 15756f5a
+
+k = 72a6ef31 02ec3444 c97f640e 1c0a881f
+m = 8dbbe947 c61e65ef eee23d75 cff6645a 6568fdd0 cc08244e 90e3f88b a250dd5e
+    5bd56dc2 94751e82 28d3f482 a3b1e71e 8a9f6c8d 0b9044a5 b00fb105 92f72320
+    4262c865 80c106dd 2d97bfad 2f79d628 8647d087 891eec76 b8cdf5f1 f97eec70
+    c53772fe 230b6173 b62f1dff e92457c7 43582963 365dd13a 844b8121 4627f57c
+    83f79031 5e1aed54 050c1ef1 729e662d 1bb538df bf7f5a01 3c3c9978 63924253
+    99b32fdc bfb8339c 1fffb0a4 9cb607ee 1549ea51 b4e18608 5b64d949 69a84c8b
+    770eb6b5 7f77c51c 88717dca 9eb1e5c4 17e9aed9 b3846f66 e2ecf73a 9df52e20
+    14e45621 49463836 9705f501 2a0eb510 d7df77ec d970e7a9 b751ecde cf5ee24d
+    5f5ef387 0b92a647 da362ce6 aff79a39 57723172 c0b0db80 f2b6bfa5 2e5d6ddf
+    9b6665d4 f58bc29b 58faf70b a6e7b43e 0cd42fdd 9e42dbae 5b63c770 3e319940
+    e5bb09f3 07a55404 b1c3cef7 7b4492d5 c2711e58 d9daab31 ea31e469 3a47cecd
+    03a4bd08 59e712c6 a8ca0093 87bf511c 8e7f93a1 24ac1363 165a0b8e 882c4993
+    423c6ec8 ba77d799 bcf96a62 96f15e62 a1a8c43c 3b9b8a3a 266e63ea 84a90400
+    3286fdbe 30c14ce4 b8dd3fc2 18cd3a32 f27fd796 da63efc9 2a342b1c 0b79978d
+    b70210e6 f55c323e e60715ec 317e4121 ce707180 ba1458ec 8c0726f6 673a99ee
+    bc96e5bf 3f776b10 867bdd61 bc45829d f1c85a90 a95eda72 7585d786 9cf8c8db
+    ca742bff 1d1d4b05 7c5cc75a 9893c430 e457a958 2fe7b66a c57c3064 35881cfc
+    412b2c47 f54e940e b3dfe318 978c3fae 792bcbad 2b82c0f7 4d1f17be 9914d78f
+    8cb91a62 71a10873 4e3bc97e d1acbe92 9854910e 59eff20d 2f4a3444 27890a0f
+    4576a290 90e22b10 2a60cbae 7eec
+h = ee3df318 6030422b
+
+k = 10da87bc f4402637 e8192529 31b8b17f
+m = c02cef62 19eaa8e0 810a85a4 e287eca8 0963fd56 d82837e2 433e6894 a207ff37
+    f9d260b0 0db72013 eed8e5ad a9a0bf88 6c419a29 5a05e638 83ec2ad4 c6a84996
+    070fc355 d4cd306e 1ba47e70 b5f7f117 5db04ed8 c831d3b8 665d3562 bff1d1da
+    5b2e5a8e fefe3b1f c1934d25 74be77e5 7241bd63 0b9a6e5e 50d32680 6b35fa83
+    42d0682e d8a4241c 6ac67527 9a837aff 14e4ca76 9e508964 f4cdd13c 07c179f1
+    91a7ed33 7c76bba9 a8f5d327 6b63a147 a49e45a0 c06bd3da 30df08f6 055b8f9d
+    c5726cdc 9921d28b e72cf04c b54f90ce 5cc8a6c8 5b97e3bc a7cf5ee1 ec127488
+    e9813766 3e941818 a48be0b1 998fc790 34147d12 d5597c86 bb4b54f4 cec5c1a2
+    b25b9562 ae3035c6 8e6fe51a 82c8b4f9 9cc5bce7 bb083460 bee90649 9635315a
+    2e32204a d35c8625 4abb5256 41889019 13e01203 532be8b6 2c0ec183 a23dd26c
+    30b6f7e8 612fd54a 125fa75f e062c21e 9745eac9 9f1859c3 9d442f0c 66ef9476
+    b2da48da cddf49be 353dcfd9 b410596d 30c23952 f8fe748f e50269a4 7eb777c1
+    4b02f86f ddc238b5 78751445 e11064e0 d6031746 eecdab46 4900b123 1cfaea72
+    d9a73100 03a464fd 790c2589 7f9c01b9 4a01f537 38713683 5e770aac 9a9cb95f
+    92167536 a597192c b40ef9f6 66439baa ee8e7f67 e3de1f17 0d220163 00c2222a
+    89878de3 ef33d949 17b7ea5a f8df6182 753678e3 bb3ce707 8af332e3 29028deb
+    f9d3bc19 d7b1e50a 06177248 33e916f9 32f060a4 ce367e47 729b609c db29b0bb
+    d3f347d7 de4ba66a 33ed4269 f640de81 3fc9dc61 996a5c7e 17ce304c 46876560
+    dc28e773 cf24a2fc 9aafba43 0f355812 17c140d2 485f6119 a9ae26db ee114794
+    21f44cd8 0d0ecf2b 1c6b6a27 5c248e
+h = f50398dc 1a5bc7a9
+
+k = 0fae78ff 2eeafc62 4dd72037 23aa5afe
+m = 5dbb2fb9 f5174119 245d95b6 840cd0e2 955a354d 25fc4833 05088fdc 987cccdd
+    b77dc8c5 3f1f9b37 9d70561b 9e360c1b 1bbe28e9 769a7180 d60ef76c 338c67da
+    118d9989 51160a1c 3d3d35a5 81a70c1a d0622c45 4947c867 c204252c c2cadef1
+    f2127f07 37d2f898 0625bdf3 6556a8a7 4e799972 0daa00ba 578701f6 e780afdf
+    d802fa26 7e313b30 f496cf69 a28bd8b4 d35040d4 b04ce801 ab369ccd 9ebddd14
+    92a55f00 8c991175 da872e69 90ce38be 9409ba60 6a1e720e 3c02def9 e88705b8
+    52d03060 e406d6ec 9acbb3e1 3da31c2f 2acdfd1a 462997a8 a9952723 850aacb8
+    de310729 ca300b1f 0c2b4e4e 2810a75a f3f2c480 47f6a7d5 99cfb2b4 b40ca536
+    537aab9f 07dfd2ec 17bd4482 4345be85 183b945f 2cb63ff7 399843cf 13b30279
+    1fe9a232 64a45db3 9f0e4342 f866e34a 7dc4a365 ac628a3b c61a2731 a18438c8
+    be88d3c4 09825ea6 90887dc3 f95859f8 5d55e881 202e79f5 b0c25f66 521c1f48
+    a5b31150 251a2565 f22c6af5 955b2347 8311a811 4f34aa53 1aca936f 009f99fd
+    de97e647 0d3d4bf0 97d3d8e5 1b2c62d7 b93d049d b170aca3 effa9638 bc8b09e2
+    60519b3b 3eb1cbba 20b6cc73 a0090304 2ee54b23 75ee18af 6216c8ba c7efc1aa
+    6d1cc16d fdf15230 bd181682 fd6803d7 6bb90d5a 80617223 992f8ffb 1eccb5ea
+    02d041e9 c02a82be 8f72b154 815639de 574c1adb e4bcde62 f831bd94 61dde676
+    395383ff 288b75eb aa1078f0 fb166cdf 4d688e38 c8da72e1 c39d3ad7 aa1140b9
+    ca6ff56c b76e0e30 f7fdcf3f 5c23a098 784903ce 40d91388 58ee95a3 e451a779
+    44f61ec2 a2d85e0b cda125d1 08a5eab9 e959723a a08e9803 9bccf6e4 121739dc
+    378db1c8 2af64864 f70cc5a6 083f5bcb
+h = fa646d47 f419385a
+
+k = 602dc1f4 03d89f57 58b8915f 61c7a841
+m = 760388e8 d45dada3 e8c2c065 d08fff91 39496244 7c256dea 8708d72a 861b529b
+    ba9b9694 312494ad 6f41b5c2 3368000f 78fa9304 b44f166b 86d6d0f1 d5acbe62
+    fc2c5fb8 5d8d48b4 0077f53a fe9de1b6 17abc123 bc295340 580c21da 4497692c
+    6c1e7c8e 6d59c8de 999a0d31 8f8a7536 e82b7329 673d9c76 2a56d583 e2cf06fa
+    fd566d69 b8c7dee3 4c2ea6b3 c650a9dc 7c735199 1e1ded05 04a70d0c f8c449c5
+    3dbf9a65 6dd4c7ce 93911284 ee5457b4 9c44b51e b26292b7 44afcb65 35022239
+    de1bd825 feddc601 be46e4ab df9971eb 11c5941d 03601023 372093bc 8120a4cd
+    a973eb4d 6e88763e c7b2f435 e4df43e1 c1ab0bd7 c63cc677 8a049ba4 15065599
+    e767391e aa9c32bb 2bc910c1 8ba0ae24 3aa736d1 87585ac8 7ee278eb 28958c09
+    0550383a 8adc37a4 2a908a82 f7c83a6b 4f7b6d2b 75ea80e5 40489b56 408a542c
+    eae9bab9 65de6459 aacd6050 4449a9b9 90d5f02f b5932bf2 ca78d891 b1ccc948
+    1b084850 a0e1aa7b 206a02dd 4023214e c8faa9d7 80f9eec3 d176effa 8e9530fb
+    b4a34e6a d24a56a3 cab95b74 12f1dd3f d10991d5 97325304 5e5d3af6 9514c59e
+    297b9647 eb6148d3 9e44f6aa ed7867b3 54e120bb 688adf6c 0bfd9326 ae08e2fe
+    a1cdb0e7 cf59bb63 e7ae4ea5 1dd4481e e83a6385 c6ff1e21 d3adfd0b ea0d71bd
+    5a1a630f bf836e36 5a3fc0ab 9a34c244 9a773ece 3da57d92 a329abdb 2a068927
+    a7266d33 82834478 ca96a685 f4b3bae3 f54032cd e20e5d88 2b05a73c 9fb58a4d
+    1bbef96f cb732a49 903d27ab 1d26fbe0 1a3be6d9 a7fe74a8 325d74ee 7eecd19a
+    2bab0dd0 469f0850 55c84585 2eaa9c48 0b0f7402 ef78b4c0 c3bcfaab 050c1286
+    6d69d897 6e5f1fb3 79f0c230 bcf0535b 1c
+h = 31fef669 697c23cd
+
+k = ccc651dc 7e27f131 79ea4b16 c5bffc8c
+m = ff948335 e5f82993 5785c89f cd1365e5 3952ef11 aa689b46 21bb2cc8 e4d59321
+    dc2f1a65 bc28fa03 f4ac4676 a0ad2332 5e41401e b539d017 00b88c9a 22c02073
+    9857533a 8e46b69e 46bf2f1e 71f5cc9c 29d9dc24 c20d110f 02d7be3b ab460926
+    91dfdb90 99c0425b 63cc3cee d67d8d7e 313bf3f4 22e3d850 3013726a a205ebc1
+    71e84090 c61652ed 4e9510be e42ff37a 65c959ec bd4f6b80 3ccb71d6 2aec97fe
+    2503e682 1867cdbe 275e22a2 8e7f400f 815363ba b91da458 83e9d563 b691d430
+    50f8e33e e669dc5b 0fce1de2 c406a425 03f1a8c6 aef350b6 c572989f 63c7fb9a
+    38668bc8 9066df53 4b62fafd 48697f25 35c98050 4d4c81ad 962e681f 929e4a32
+    74146476 4c35479f bf605b02 5bcb49a8 994268e2 81605ea3 a28dbe14 95ae5b91
+    191036c6 47797f48 afa3f4b4 fc5a0e85 45a6df02 fcc62b34 ea363e5b 166316bf
+    f6308126 4c7b3168 f0753222 a378e68f 06be6fb4 3c568480 40c4280d 207bcc3f
+    0ec32281 3a87d71c c0876230 c5589a5c f5b2b79a 0b04abb0 8d735a84 279eee11
+    7229775a 1494328a 6bd5fb10 7698b5b9 b618c68b 762799c0 9ca48ce3 9a9536d0
+    da8f0ca9 f69f1afb 6cd7e120 364319c7 ff83b0c8 f5456b59 4111de1e 861a921a
+    6e94fd2f cafeedb7 67ace165 9d272c07 90c2055f c6cb5a88 e0794140 465a956e
+    97b6e50c 07424bd5 d2630ecc deaff272 96f91b6f b88614c0 ebc55757 3de9feec
+    58b9ba59 0c677d67 8b7400b8 8451bf07 a823a26b 7467e41b b378d4f3 0ffdac46
+    19f14f65 62d7382c 8818de02 d445bf35 924e5b00 b76d24b1 d45409ea e09bac63
+    1f80f420 819be3f9 94943e6d f4eaed32 a3562c88 83201a02 c4500a6e 4a92502d
+    e19323dc e301b1fe 6bc1b717 a3cc2718 d7da
+h = 7a0280e1 36fe7bc1
+
+k = bbf3654d fe66a021 46644c11 d32ff97a
+m = 9f3c5e4a 5e507b62 54b0b616 7cdd29ed 37feea0d ed308d61 a00d5c24 3ad57468
+    b4e72d73 ae0c7d51 4c6cbc89 bf4eb953 d36b99aa ae7d6da4 60370507 10eaadbe
+    0766d2c5 de84cd63 e6b7bd51 ef2578c0 fadadfa4 42498fc1 ccfe56a5 b977dbfa
+    089da7e6 8b006b82 83946022 9d718223 d943dfa2 7b92aa8a 351c15c8 8f9f12d1
+    502c392d 7b735f31 d64b6e32 9fb599d3 47da1f21 be5d9e4a beb3d227 6258f0d5
+    afdbb6ad 3a56412d 38870a0b 506a133d f4fa93f3 98f824a1 d8a88b84 e8078ca4
+    af71d708 bd3263ef 0502d2a5 1630242d 326612c2 6a5196ee 8e3a7b14 7c11c739
+    da1b4752 006dff18 138a58af 8ee4fe22 7772e0fa 5d5e9263 dcd96ef5 0fa10a3e
+    384a8283 bad9b5f4 01ab13a0 8a21f07c 54fb4ae8 35e4637f a6cca7ea f356ce7b
+    226f1e11 263cb480 d3b81df4 442b8cd5 410984be 4195196a 2b86f97a 73cd289f
+    f8fad3f8 14de7abd d5398b91 814833f5 cdf70e94 4f77ea43 fac62781 a3202a28
+    65a3283b 31cf02b3 84c95531 db74de55 bb777791 6cf3cca8 e08c7ccf 2b0ea963
+    40376a73 d2eb4c7e e44a95dd 98338b36 01343cc8 96cfbabe 2e67d528 4d7f5259
+    e37e6e70 6ec05906 1df2b61f 80678d04 df75783a 21f7eeab 6ac50495 5855e38e
+    0da46f61 37038913 58d8d6cb 035a8921 24c0954c 41d4f75d 9ef2af76 724162d8
+    b13a36bb a1482854 2cae7b18 e87a14f3 5ed5080d 0e097b7f 2c6aa320 f0ab0845
+    a2da355c b6387d06 8546a75a 617414a9 0dffea6f 8a01642b 6523c049 2979adc0
+    a17b930b 74044086 c3d17447 e2415280 20709e5a ffb73aee 3882b5b7 00758689
+    099c31c5 6d5993fd 78f4cf41 18d490c0 60bcba0a 2ee6a8f0 67b7eb2b 5d065b06
+    687ff2c6 77735a2b ad858a6e 7fd386e4 059017
+h = a3ee79c5 834c0757
+
+k = 16524787 5943db8a 79e8435d 439359a0
+m = 555af025 cb917882 c3b67b5c 7c80df2c 0a273026 4103d2e0 1f5e40e4 5e536011
+    a3b2d4e8 70061aa2 086f7b9e 9b607897 c299e9de e10c889d a42c464a 9cb3c247
+    6175a059 fa63f575 9e1b083f 56ce2a4e 0bf77eb1 782075c7 355c009d bffecfff
+    e271e5f9 51e24616 89c3f65d 1f80ba0e a6789b59 1068ca31 8f937aef e4652f96
+    911ba7db 4a1d956b 8cee7e18 696065a6 db645e9b fff5cd8f 62a81ec5 3d598596
+    2365bd6c 4e8c367e b0002c64 bfd07c49 0e316e47 e2c938c4 17e2cb09 0cd87fbd
+    363552d9 731d4a7c d7181416 7f39f630 30f0412e 393c6905 e68598fe 559d405d
+    c8a8fbc5 d96273d1 7bc98030 93fce390 fa43c774 7c93d698 6905e141 57c45c88
+    5c1250b3 cbdcc5ae 93f2ad19 5fb8a8c0 e778d4dc bb3fa2fd 4b092aa3 f5dbd495
+    b8dcdafe 8bf1ddf7 906d1034 38cb1df5 e1253f86 8bd73ec5 a3d56aa3 e3d11fe1
+    a2c78ac3 95a24911 89e3b002 de59c4ce 1d12677e 5cc813f8 d44643f2 c3b6b8ac
+    c8d49292 288e4569 71ca0770 49da37a8 2dd9dc87 a609827c f418c15b cb8ec3af
+    79293a2c 1dedf386 455cac54 19c1c946 c73a3d49 d7f097af 645bd5bc 88297ac6
+    d4f716d1 02f374e7 db1a8ce4 9df4b8bb 6b784a3a 583f051c 86e3ba98 5ce17b16
+    413a1719 144f9259 7dd4614f d0e64833 e06231d2 a269e496 3775d797 12cca6bf
+    f29d3352 4bdc9b3b 25040a70 2f3028a5 ccbbc356 0ad4e919 ab4f76fc a15cdf48
+    71e9bb14 43f0d44c 7dbfb042 3805c1ad 8ec9a4ca 0c0d34e9 1b05b723 3e6b348f
+    7819aba0 ffc77ec5 8ab37231 ff4423d8 2b1ca235 16e6a54f 5509e2be 9f74c053
+    89f28c34 f034c52b cfd4359c 615f407f 1dd2a42e f2155d9f fe284464 d95bfea1
+    cdd1e72a f9fc1182 00adfeb1 5ce6e7a8 d7427196
+h = d3a8ff8a 77c62a68
+
+k = 861d379d b180b7db d2f3509a 99fd546a
+m = ba6c11ca 9a00abbe 7310a799 4046fd0d e8140529 15f68354 694f4f88 1a5ad194
+    49ca273d a1cba116 e7926e36 f236141a 5b987d8c c7ba86aa b386a125 072bd7dc
+    4b72716b dc9fcb87 0bc3de23 a0b3ca09 e0bc9077 bb83c979 b89b875d 47a57fcc
+    b10479c9 b786ef99 4418f74c e0dab9e0 020a187e 4b2f3a82 f3f588d7 39a8c76e
+    ae844eb0 82c815a3 80cb15ce 849aae88 2ebbab39 f55549a1 540418a7 4f91fcab
+    7c752d3c cc5c8cb1 5804a7ae e9fcdbfb ec2b61ab 0a7a3312 d3d338b6 5631b5b5
+    c2f67c2e dc3852bc dd4fd3dd 9954c864 3972bb98 624564b9 ccd72bc5 ea12efa0
+    a725f631 ac99bb27 36cc7283 dcf3ef00 0d15ad72 f1f7b3a4 41480ea2 c65b7105
+    d1598eae bfa10187 d802413e f66f5f5c 678d5a23 43f60aa9 fe52d1a6 239befa3
+    19b99fc5 929187ca 68588df5 beef4c3e 5f0eebed ec0420af ab04816a 38907d5a
+    e2002a50 c7bf8781 bc16c901 5c4a92ce af2ea1f1 4229d05c 22d82a69 6e6e2389
+    2ca22b62 4099f5a4 5d2c1694 8c37064f 11614b12 59de5ce5 aa828bbe a4d9a06e
+    c9219ee2 083b696d 8e67d644 a0e6ce40 530ed41a 93fad9d0 92265630 9ef0af3b
+    6919e144 532f84bb f434ccdb 636fce6a 17caf83a 552c4df4 a53460da 7c34ac20
+    9b4a6f2c 92175538 1872a9b2 d2d610ec 98ed3df0 c6ff1a2c 5190ec02 4ef0703e
+    83e60007 26794bb1 5582e259 ab31e31a 2ceaac64 4e26d17a 74f80f88 d4536fc4
+    8b220318 cea82614 2dec464d 57bcaa18 40720917 83df193f dadae5a8 66454e7e
+    bd6f5e32 1117f7ec 6294ef90 6f72748b 4facd2ec b9e60a76 e9782738 101ef6f3
+    6dab167b 914393a2 ccfdd123 993284a0 e750d5b1 7b00fb61 3bc1e26b 95439845
+    788348d7 5f142dc8 e75f474b 0490239c c88a0714 de
+h = 9e9a99cb 345a0e45
+
+k = a8ca25cb c032e620 ce1f33fb a0ef76bf
+m = 5591e59b cfaa1f0a e6ed91d4 fee3066e 2390847b a1fa30d4 b1064d89 af05413e
+    88a0f965 6ff8145a e6e699d4 bb6e3951 15bf6184 2dccb8cd 533b2af9 50edd469
+    6f5d9868 ed579883 aa14ceda 4e010b8b 23488a13 cfcd7a3d 4ddb32ff b3e4c4a0
+    f6a0d179 0c6305c5 c0bf442d c76cdde1 b9c3b904 dd20b4c7 c46b7402 d27c7f10
+    18f2e683 4cdb537c cfd05901 b9ad3c53 dc96b637 236e1c85 8af4d69e 833061d5
+    282f29fa 64624ad8 37249d2d f15bc725 6caf81d2 7896b9ce b57176fa cbe886bc
+    6fefa785 2f3f1b7a afd60d40 069259fc c5edcabf 9430d5b0 ad35a445 e25a1973
+    9598f825 978d9e7e 48e0a11f f519a4e8 18d5c764 b3c4e043 9fa8bae1 b3ab93dc
+    5173c156 c3c7ea9c dc4c059d 44349aa7 f8d6d90f 73104230 fefceba9 32e44ee7
+    b356ebb8 25fa2024 44e38ee1 ad195183 af13884f 484bacaf f0364c40 c5a93481
+    6aec2017 f2e99c19 3780acbf c584872c b0c6f5e5 e98e1761 0127aa8b 6f848c9a
+    3adcac0e 02f5962a c685aba2 b963dfa6 60301cfa 88497160 899cf598 964f40b7
+    3f26d8bc d55834ed 2baa41ba 545c95f8 59b20650 0a5fb846 fb89ca23 40e35759
+    e9981676 a5122462 c906e311 d945dbba 953fd332 019f5335 3b1c967d 85caec0f
+    e49008d9 68dea18d b1e76c34 263857df 80e8ee4f 61b9c277 d10e1e92 5d511f99
+    e07b4c51 179874c0 e346aa2d 1daece72 4e1f72f5 55338270 3c4d3ce5 c0b4dedd
+    52f3d420 42bb7745 cef56d8a 02e85495 0e2b982f 681e2152 7271701d 5e22efc4
+    15a74ce5 84be8cd9 aafba4cb b5da899e ae4a6c3e 92287849 8bfe045a 1f2db9c2
+    c83d04cd d841bfe9 49dd7d26 c9cbe386 77b7a510 ea232cd9 d849bd80 bf76e31e
+    6fe7b68a 8515710a 4ed5bbb1 8b727d24 03748451 976b
+h = 22fb2edf 942c7ce7
+
+k = a5191417 90f5e081 df609b81 c24553ef
+m = 22db3dbf 866b63d7 7e9fab97 295fab04 2c1a3b12 b55dda89 7f86762d 4c7056db
+    57cf27b2 f5bd51b6 5781d1c0 634a2ede 5facd85c ac4b3c82 bc9daca3 0f2fff66
+    f95e263f c28adeea 0493d8e8 5626bc25 d6a2cf67 2158ce55 c2668e06 cdc2c119
+    581cab4a 85d6ce7e 6838e111 9c701e40 bacf2514 38752b8a 72f2e311 0151ae40
+    917c55a2 e63c5201 e039a6b1 16175a86 ae82e402 22bc1715 5f86fbea ff1ead5f
+    6b4e31a5 a38be0f5 562ded50 6af18b85 42d36d35 3994a022 ae6b8e67 b5125df6
+    309ff45a 9428c021 18371a84 6b4c918e f16eca78 9a2d8966 341033b6 85827311
+    66d0c100 1d670256 711fc1f8 f745fcf2 74b818e0 fce25ef4 90c10dc9 6ddc165f
+    c06efb7a 67fe89b9 c051e11f ba4696d2 02fbc2d1 f7afef6f bc8b82fd 69268201
+    e7d439d3 96b4023c 23d190ec e9ce4910 c17a2083 2ce57577 c139f041 04682983
+    5f84c8b4 28ca78bd 3bd6d749 1f28e92e a3dd4cbd 07189dc8 3ef957dc effc3a55
+    862938f5 72d667f4 56308f92 eb235446 7d2dc568 24784c98 85027d76 8dad2afd
+    832906c7 092bc58c dcc5bf1c b696f108 560aac4a 255148ff 267bd111 037d34d4
+    0c3e3b2b 995070c0 8b39e3bd e2a484b4 6985e114 bba21b77 1eb9b4b0 1d4405bb
+    f3f61a7b df3f1868 92e9eb63 39f57141 b3c5a7cb 5dc2d69d 969b9120 72bf4b21
+    97dc727e 78516cf4 d1a7fa38 e27af326 02cad411 b78e139c cd6260ba d3023a63
+    e4dc1a2a 0e81e3d4 7b24caee e3c5fd07 39ba4d37 74c6f17b cf368a3d 11346c36
+    37db0879 bdb409c5 b0b949a7 11d2832f 017aaa2e b0fffb9e cb9cc99b 7a7d1c7d
+    a02ad147 939ffb52 cd1ad0d8 75984f87 e0978329 445d318b 2f27df68 a7eab292
+    bbdbe0c8 653673c4 fbbb9e08 0e3d6781 b3c57b0b aa2587
+h = 6cf3e66e b35dd7bb
+
+k = 466dca2f 53789246 55e85ed3 9464b5cf
+m = 01ff2dc0 10411e28 5dcbe01e 4ed4d810 5b4ce41c 37f4ce61 0a697b74 c5dadab9
+    2248ebbc b376059b 30e4d57e 99ff3ff6 c1dc8be6 4e3bc993 d18f6b9a ea9f6be4
+    a4a9dee5 7f4a0607 6e19a019 e98f5fe8 91b7c5e3 ec9b1cab ebeeca14 1c02dee8
+    c8c32568 6367436c 6ac0ca4d fc451fe7 33297ba7 d23fb520 a4777dae 7ed57693
+    8854a50a cafcd472 35956961 1e46875c 82957c94 272e05d9 c1c4154d f2094f5a
+    f3bceca7 3ee21c7a 5af26df4 3781903f 76bb6243 dca86521 e27abae7 ea5306c7
+    dd21aff9 28319560 3cb2fe5f 721f939f 754a13f8 52f40032 698d855f 6760c6ab
+    418fac93 cc0cad27 f6d04d97 cb156cdb cb41ba84 a57dcfc2 5291ef1f 8504dba3
+    323f0b25 1b288395 f22d60d0 3d702ca3 1a16b9e8 0bfb3e58 c1db0717 c9ac22d0
+    17844bd7 34ede62d f20219ea 80808c2f aa37340b fe3e739b 6610d883 de6dadd4
+    f41c9fb1 8aef6c8b 1bfa395b b34e47a8 00bdf67a 5cb1edf5 78d34fd6 fbd004ca
+    165b002a 75a6f843 13892451 06b998b5 ca71f4d6 fd90cd86 87fd6349 fa160393
+    3675f747 1b5fc9a9 068f5f16 76c81dde 09ce68f3 e4088950 7bd6cb6a 51f1bff1
+    92613666 9959077d 262b6192 30331208 69003486 32d2cddb adf4a9ea 9facff92
+    338fd179 e544a438 57d83227 ef3a8325 60d7ba77 7b0eeaf0 fd72d481 24bee74a
+    6a2b1982 e0dc5f24 9d2a5994 5238ae18 a4e18684 cba26477 1d060e8c ce1215bd
+    1e77c574 715cae87 d57fac61 441c0e76 2785bd92 4b139f50 12d4753c 24e06079
+    9504ac08 ccf704fc 53af7d9a a84e95b4 032fdda0 dd5d50e8 8b7a5638 ad118d1f
+    b61245f8 17eb71dd 121c53ed da42c39f f3c480a6 6f9b99cc ce273cab fa09ae02
+    075cea5d d19378ca b2399762 2079d940 d3c552df 92f71a8a
+h = f25edda2 5d0f9887
+
+k = 0b8ba3ab 53db38a6 38e89f0a 6d73182f
+m = ffeaa698 30b4e8e4 39307720 69713c9a 925b4861 2c4ea73c 7e96b6dc b1d775fc
+    19b2b1c2 ddc40aba 8d8c9654 92828a1f 89e8594c a7bf6830 e7d5e8af 06398a82
+    2f394f2f 707a3213 8cabefd7 582a8d0f 05d0cdb5 c97194e0 e606e677 2935bfd1
+    c755ab74 a7412237 3cf72bb7 e18b34ba 4eaf0ca5 f9a0d12b 0b4aba3e bdc3bc24
+    6eea27a7 35a66f00 54d4d476 2effdf75 5729e37f 83d56012 46295c60 80332840
+    5dae65d1 9754304a 42f78be0 c6e2e1e7 d038b1b4 5585326b 02e0cf71 f8a11f67
+    41742e57 2993cc22 d0b0e4cd b19527cd dd64e3f4 bba94847 ba06e2ea d7c06125
+    6027680f 77de69b9 4210c09d 16088e49 f64ec9a6 63d49727 3c5b7b71 de8f41e7
+    f8fa1cc0 bf772c0b e90df58b aa9a75cc a8465aaf 4693a8b8 85078281 fdb4418b
+    4d8687e2 e30a1100 fa4af4ac 7367f655 75d96147 ac4e18a6 f47e59db 7ffe2df3
+    5314a315 9593d3c3 0fbe859b 810058b2 b5c5867c ce03a189 740035b6 c27ecac1
+    1c2d0387 be355991 eb78640c 4fddef57 4f55bfa0 7cc11e85 7d485364 a1e79d18
+    9b664edb b57a0e47 2f67eb24 5204a6b6 465d2a87 dc7d80ba 81f4f3f1 a7f38c0a
+    632b2401 7a1a4de8 08dc6731 a9e4e596 59edf9cd e459641a 1eef7a4e e425958f
+    ba7d7393 8266dd66 f12fa925 bc34974d 0a8e185e 185b3ddc 20160b0c 0101afd4
+    afcb4c25 5a8b794a 7795ccf4 f29487b9 5249aff9 cc997ea2 7882dead 20b47d34
+    b6f39687 fed094d9 2376ed77 d41dee94 730c944d 88c0728e eb151561 824f0c7c
+    f460df67 233746ac 96b34a04 df1a77d8 514e32f9 a4937644 b865e2a7 5e613263
+    77f9572a fe1eeeb2 9fadf5df 9b89bdef 4e54ec20 b4dcedaa 69e5cfaa a164b9d2
+    533d81f4 a5be0c86 ca74501a 6c6b171e 47c9af88 4dedcf29 0b
+h = bd83706f d0afa93f
+
+k = 38afb570 cf5676ee fb94ed10 36b05342
+m = 90555ee5 177aabe5 23fb25f8 e8d73b10 bfb0446d 9f4b877b 2fff456d 8321104a
+    6c813c22 93eef93b e810eb4d 0c43de81 83629b6b a59bb8d6 31e5c773 24aa3b9b
+    777c149c 25615b78 9c769aeb 8d9bc0c3 e5dd52f2 0775ca75 f994c078 de52d114
+    03db6efa 43c19ae6 912e7a7d 54b01d81 e595da3d 5b541985 76e44cea 8f07f396
+    f357f372 c46cab00 29839b2c b30d84fa 7453ce91 377e4c88 d2451e23 d87f3611
+    3c39c83f 5dc63a0b 975595b5 f189900d 0eeaa35b 0e5abf85 0a810404 b9ec83db
+    0dae3ec9 a66b240a b18abc81 f765eac3 84bd6de2 a04d662f c8568678 4c3a1753
+    21eac7c1 1bedf93f 96393ae3 67d662f5 ec3f82a6 c493321e 7a50b9da f1743e58
+    085c36d8 21834a5a c69c478b 910226a7 98a3f5f4 d6577401 0f2debec 71da8f1c
+    90e74beb c0b8635c d96d19c2 e1eafc52 8a56f050 054bcc7a 3584dfed 6cef2dfa
+    d8d569dc 3d14e43d 84298d46 cf938426 db2acb3c 94869659 a6323de3 c0f42bab
+    0b2edc8c 6d66733f 58c3be86 6ba04eca b3a824d2 f094a0d4 3f89836c 0ca4209e
+    dc702431 fe28f05a 03a0a355 38e72683 52ac850d e2f0b837 ebdae6ab 023ee15e
+    6a54a585 18776760 76431971 bf41f6b9 0ed9e8c3 2e3a9396 285fabb0 b5c04699
+    6d5a5ecc fd25ff63 4e73eb53 419eab6f b323f486 2c431b59 8d57c827 fbb49a11
+    2394870e 9bded5d8 49662c87 7fc2d211 062a4870 6563ffda 0cf51a9c 9e324dd6
+    19b24718 3f392f58 50999373 e7ea3b97 ea230f96 0576cd27 325756ec 036e33cd
+    689d9814 38292ea4 5743a083 96e828c2 c45c92b1 861b46e8 299dc112 181b5310
+    61bf033a 1105fc2d 344210bc 28a80edd 9648ffc5 74f514f5 a1c84e53 ea006fef
+    f8194c2c d9212e0d c00af3aa 00fcb93d f5de9ccc 5fc05c51 e356
+h = 1864db27 b30f4c9b
+
+k = 1eb55a16 ead83727 3d608e0d d644d87c
+m = f2f3718e 7c38b98b c4b82e4b d7f1b7c8 d9c62b2f 37f7d937 e2b5d78a a5571849
+    fb84c56e a613e159 618e34ff 94a5cdef 0ac8be76 51bbb668 5918fc8c 95fbb6af
+    0b6e8ec8 b2f4aae3 4552face 3015937e f28c494f df6bf20f 62b64553 c3b65495
+    be65c002 809f0244 46ae09f0 cb8584bc 4ea150f4 55a8bdf1 46fb6edb 8524af97
+    6a7ba2d6 036d34ca 91b8a6a3 be07084c 721e1ef1 cb3cf6b5 3e03f0e4 60bcd64e
+    8150fe2e 0d395d43 6b5345c2 a9363dbd b0a663dc 36baceab e7cbb7ca 7a943495
+    0ffaadbf 0da37a87 b0f8ffa0 08a27d1f af75ecd9 9bd51097 bf37aa34 5c1ee530
+    ddb45959 e105151a e5aebb1f 80afb860 7df39ef1 c005a624 491412e2 f203b878
+    b1730bf3 5fb6cadd cd2bba8b 8bb5f758 04dcb898 bf4d6d17 8f9202cc f5df1e70
+    b3e90b6d e993fb72 5e262e21 ce4a1684 d6102f1e 5952c18f 5d5e616e e95957a5
+    e735742b b06a6f7c aa0622a4 befdad7e e5c0b9ac 975f685f 36d7777a 4eeafd92
+    7882131d 934297da 512fc92e ac693ec8 c431a1b1 739ef240 c849d05c d5b89d64
+    cb0ff694 eedd4e35 6a4757da d3c8c87f 6b0fd7f0 8bb96ad4 1f7329ea e90f44ea
+    bc6af7bc 53605071 c7ffdb18 64a47269 5db7f779 192bb5bf ed194b3b 7bbe6c44
+    b41897d5 20579228 da78daa6 399918d3 df9753d4 1be84a85 d9252c7e af990556
+    c2b01bdf 39cf92d9 848d3d09 772f28c2 e6531a83 7f874382 374e5232 223797ac
+    b21991c4 c1e64860 e91ea4d4 658453b8 7a7cbba3 0b8a228f f29131fd ca701d0b
+    71098996 bb2c441b 13cc3dbe 7361e16d c74f767c 6d85d56b dcc00fe4 b484cba2
+    e677dcf1 100c3c6b 97b34e26 c4e5b2a5 df9275a5 4bf63091 325d750f 2bfde296
+    7a6deb59 8a15775e d30a737a e2f8cf95 6b128cb1 43da6604 b3c954
+h = d8437778 3e7c1325
+
+k = 69f1f5d7 4f6839eb 6d34a2b9 95c8442e
+m = bb1e557a aa1b04a9 9d05b2e3 3fc88666 00a23767 c24a520b d81a4f9e 82fc751e
+    a1800e6d d2f8572c 8e1d23b9 ea78aec9 aa1c2bfd 1ead1d59 7645360a 11b2570a
+    e6ad19f4 4c3175af 517851dd d3dcdf23 5f097987 7d94e7a1 6548f253 e513a11c
+    aa8ff1d5 34693744 d43494d7 eff589fe 50dd9e27 2cc93b3c 04312ebf 38da0752
+    c5c29143 a1c355e5 f3e4233c 1057e57f 04d720a7 32626f3a f67496f9 133925c3
+    597408e0 7b13d874 4d719522 57ca7344 1cbed47f dead64f1 df426ff9 58e0f4cd
+    83d82e5a d5d51fc8 33fbaf70 248aa5a0 c3fe7ef3 b349b10f a3640294 e9559530
+    9f879178 272f28c0 364be9ba 695c36aa d83af137 a6d59dbb a9e0766e ab2b30f1
+    e1885de1 00aba9e0 cefe6e07 972eb868 e377bf91 10077adb f512fa9c f67c8092
+    7660d1ee 96a478a8 9aee0c82 1626d049 39192ced 3000d833 c5a566c5 da921b9f
+    01fd7808 ed26f517 6d0eab61 4e34448e ed8b69c2 994c307f aff9147f 0b389b33
+    731d4f66 00d6a644 385f6b4f dcf0ad21 03968edd 688a005a b1ce93f3 b42cab29
+    2f9bb9bd 1ea8c9ce 464fb3b6 5ab94968 0b79a219 e1f4f077 8a867d65 111556eb
+    65d358f1 80531079 cc8fa5a9 b1cb04ff e9fe96aa 9d3fa64c bf7393a5 94823c9a
+    1d80c31a fd38313e 99354dca 97739de6 7b6d5984 53a6666a aa228270 fb440a76
+    17ea5896 67cd7a39 25596839 58ab21fd 92a721a9 31b839ff 84f7e95b f8fce7c6
+    7b9f28c4 40f9a5e2 e19d1b1c 7d6e1c2f c4389356 2994e474 9c413409 64802572
+    af18cd76 67cdf6d9 e34546a1 5d3bd7b7 fc82b35b 3e6fae35 4224bab2 a3fbdf0b
+    95eb90f1 9cdf16bb 1f2e57f6 9076476c 83be0f49 f1e91f61 0866aa3d e59fb624
+    01633f94 f1c89cc1 ca4cf789 e240e18b 1805c147 ae25a0dd 56e83896
+h = 4a1ac64e 33d13a64
+
+k = 1572a338 627fab1d 74e3c9e6 f261fcb4
+m = 8546af58 fc8245bc dc59d97b 74b4ea2e 0557341a d41ad60e 2e861324 626f9f30
+    ea381d38 494d4527 a4864c4c 7b86f267 734e62ae 87065109 47d86593 81ca5606
+    5da7910f ae6168f7 b32d0059 54ec1beb 8db0d983 9fe0419c 03ec7cfc eda21a58
+    cd565c1d dc2fa279 79c22893 ade2ace9 b97d3e93 43240469 654b4d16 d9eaa46e
+    5e4dfd7d 3ed667d3 ba6fc3e6 5cb84881 256c0e97 ce4950af 5a615cdc a4fca97b
+    20f9a958 9ed9bbcb 42faa9b3 facb30bb c9cd5339 43e1331d 6bf25290 cdfa2043
+    6c9c4f28 56e8791b 603a547a c072a8a9 1f3a7fc7 77c3c2ea f28606be 58e57295
+    9a09a4a1 e2ad0f40 a31af575 ccba2153 56e04f15 957f9fb5 c8a623ea 2e57881d
+    d0468998 db6c7628 1cbd3dfe 492813d6 d831a5bb cd6c3c52 7f9a9f10 e9252b75
+    d008e117 825a641c 1ede16cc 80d99ca0 13a07742 c2c93342 e779503b cd9b5d65
+    27cb6d8e d7441c7a 1004c815 83565b1c cd3b04c3 4910a04f c575d771 503f93d1
+    1c4d1fa7 3dc18a91 eedd48c8 f019042d ac6cfdb4 2a5e2dec e9f74c59 33298809
+    e7bb2df9 272c7594 7b8c7a7a c2ed0e28 205a9b27 a6dc9ae3 a55c23a8 72e54bdd
+    0991d83b 78b19a20 52bdb842 99d915e0 c3afb8d7 96646cb0 13489a26 6e064ae3
+    3771a318 4644c260 76954403 2f21d0ba 99e3af5c 0d5d1fb3 a9c22a2e e5eb9d3c
+    26d8507e 2e55d571 b004c8e1 23ac9962 8516d96f ac6075d9 f70afe39 35cd9dee
+    615e23e8 cdf7b731 df208e91 f2d322cb 7bb2a12b 9ef85555 7a6f382a 347af56f
+    9e4e60b3 4a46f922 90a1897f bbe5e69b 9b080747 526651d5 674feb13 4fa25a33
+    7fc0095d 2578c9f8 12048abc 893af8b7 27cfac6e 0c7e1cc1 30c68adc 9a782944
+    4c22cfc3 2713b40d 9e0c2fd9 d5585c70 064bf66c 9a1c7f46 1d393676 9b
+h = fa9ab640 2128ce69
+
+k = 50823ed9 a1f67659 92a3deef 6c35afa5
+m = 6beb0ab1 3f7b0e91 788cfeb1 325f5037 77f2194e 013be0a2 cee3922e d9b6fb38
+    cf5eb0fb 76ec2f19 9c41ae5c 29e294b5 415b51f7 0e42f305 466f3b85 65570254
+    afb7351b ba82d5cd 02dc1b19 ed608ea4 86c5bd6a 84b626c3 88c51e47 1ecdaf23
+    bb106248 66bb60e1 54e29f14 549f4e72 4ddabfed 0d2ca8ee 039bc650 61341873
+    e44b95bd b51adcc1 52d8e25c faccdd93 abdabb99 3978a858 cbedc4f9 0d08d108
+    66ff0d03 2f8ec1a1 e5355d54 da219403 b6f280ad 58ad0f13 6966d45f baa52db6
+    dd50d164 b3482685 8991d1cf 3088fd65 80674b0e bc86e64e effcf977 328de951
+    7b73866d f6210d00 3a0d3159 2a0794c0 d130d3eb 8ab81e5f 88848e8e 0d543a19
+    2d7ecea8 79224e33 e6aafdda e67fc454 722901e7 2ffa7b06 5fd89ce7 69d6e413
+    314cfbcf ee63c8d9 a11f50f8 3a19c672 770ef394 881e9960 570c3255 1fb7f088
+    a447b947 e3a9f259 7fef1905 e06ef22b 8f596af9 1a4931a1 8bc69a6e d8a59009
+    9de4517f 57310809 490fe336 9a4b8c92 02865e7a 841bf050 d93e3b12 341956ea
+    212ad759 10e526a2 a15be6c9 798f06c9 78dab302 5f8ee328 9d445c8f 8a5d63e5
+    58e05cf1 573f5310 2afbf3b6 cb1b9465 ac92f543 c9e97c93 8dbd88f1 4f2aeba5
+    70fdef7f 8378cc11 33ff10f3 59dfa3c9 adc7d184 73febebd 7a7434c3 6eb14f69
+    ab88903a 093dcb42 2a7f5b0f 84164717 faafae4d fcd81b65 74ba0727 a4d43e65
+    b237b9c2 355736b0 7ccd520a db002fa5 f14ac729 dcb940ff 15bdd5a2 ec89577b
+    9d8a550a daceb576 bd35a34e bdcb6d49 3d72abfa 177014f7 dcadbea2 804cfb41
+    47bd277c 6e81d1df 82092068 e1077f2b cb307d00 ae148b86 dd83c171 13e83836
+    a83b26ce 5c3ac0a8 9684eb2e 64ca4838 563e2bf9 a23d2d66 1a6060ee 5783
+h = be9a1388 b7ebcb4b
+
+k = 7dc02e76 48027fa6 605ebc4d ceb7207a
+m = 85a0cbf5 c3cdb112 c8db4b6e a7aaaae4 c1d3e016 81119d43 2ba1a554 67473e97
+    9eecd15a cb527ec1 75dc2fe4 d1c38c9a 235375db a0091b6c a2bbb6c8 8251539b
+    880c966e 8306ddbe e53a5391 728a9ede 1466180e 9942da14 c193ec46 68f9fbc5
+    3f2b8034 cdaca22c aa0fbcbc b2d34f28 c1af7ec4 c74e35d8 2d17fe89 b6300336
+    cd9d92ca e033a497 fbfc5c9c 58f93889 3b3806f3 4121e9c5 2e356692 287c5109
+    05d25dfb 1a1555bd 4b4e630c aa7a9eea 7015bbcc bf59da30 f2722cee c64e0c2f
+    fd854a61 569bb1e6 22a72c50 4bbc17b9 6ed02186 bc457eb2 966f2dfd be9a0280
+    32284770 f8fe7a9d e289be4e a27e8bf4 09a0a09e 8ff8d828 e0dc647e cca070a4
+    5a7ba42b 29333f37 721ca97a 474cfb82 48095962 b2515727 ba3cf88e 50d0e79d
+    f1f2c794 38531500 e3bc4910 30b80db3 1e591f7d e5588d52 0b691542 ebce3935
+    522d74e7 0ed4b3c7 7b3eb141 fa7c8f6e 88a8cc28 d7e6dedd 7d111685 fef60fe1
+    2cb5c414 a733c8ee db81d3ad 57ab2626 5aded507 10dcfda5 bc2acfdb b9570804
+    d673cd63 9308cb11 7c4eada7 2b7b03bd c6b776e4 e66843a4 b8a3ce24 a781d41e
+    c4ff5049 c6f4869d 5e162547 f8088f00 dd8b253a 16c645d8 474f3b5d 87021a50
+    c06bf8aa 70dd7be8 b2595cc0 848a3d07 36e7dfe3 7c23be1f 4e40bbc3 a02636f6
+    ac1e203e 83f3d0c1 09f0afe2 b6391ffd 00e1df79 f638662d 04437b0f d571032e
+    ddc8f0e9 e95573f5 6ca45252 059d453a cf8d056c 484054f4 cda68c69 c8fb066d
+    b685ad3d d395622b 783bcdec b50b82cc d4725b25 de367dc3 aff6f2b1 57cc9b65
+    84a2ff57 423f6521 5ca5e5d5 0f5992fb 7f43f5c1 98e1effa af4af517 0bc28166
+    ee19960c 72c36613 c4d6e624 bc19fd0e f08ebfbc 14fc3711 df3f75f2 689dc7
+h = 3d83d4f4 5ce1bafb
+
+k = a35b7a4f 9c2484bd ebcde30f 09f02cbc
+m = 22d597c3 c82997c7 b777132a f281d5b1 bcc9cd0b f6efcfc8 43365ed3 57aa011d
+    282cbdbf 18382c58 df36b32b c89a5cfa a2e524b8 bbd42840 ae8150d9 ce526ab0
+    1bc25194 96fe1d16 634ca942 25805b8a d06f421f 4ac9e5a5 dd34726d 4d259150
+    c9b0d351 3ee53b93 44a636e9 c4dd3f7e 448a87b3 2bc233d9 8e028177 899d5992
+    ed5dc88c 6ed7ca04 44f2ef85 f882b4ae 95815e99 1af06851 bb7766f5 28719dec
+    57da230b b0370b27 47f8b6bd 5fccbb27 dce19ecd 7f39d303 771da3a1 1218b833
+    1470bb50 6c139798 605ef063 f14fe668 4367b817 e295553a 1fd87d0d 1576b7c9
+    86dc65e6 afd88bfb c704f1ca 55c9e03a 9df47175 5a5f97f0 e99f8248 ae5de4e6
+    0a000c43 e5f4d22a 669dc6b9 90c397a4 3b906e32 1586c506 c30ce565 4cf0f58a
+    bf8a9e83 e11d683c 7d583c14 def4190b 9c9acec6 c6114ba4 d6ecb159 f392349b
+    b2ab3dfb 8639e2da 82f661bf c78c6aaa 4f988a56 846a2628 9680b12c a728cd57
+    49b837ef bb643907 e0eec9c0 325e120b 6218d279 d1ad0c08 f591edf3 f2697f44
+    ff2c5cf8 bb9be672 09c77537 7c0b1426 17833d3e 4effc670 eea0e85a 1d9bed1b
+    2f675258 c27386f5 9774779e d60abee0 ac1b992f 49837d86 20ccd54b 9c4154be
+    d49a5613 1bb1ec73 a2bd3bc5 7d15785f 3ef07acb f6bc2a74 a031f4d7 91854fcd
+    4d9783b0 d15d9ce1 c1315c9a bc96bf2b 8ba39d73 c022fac9 5d2a285b 66ae711c
+    d70d4ab0 8e6e6ee9 a6508f7b 16e2c413 c7e33944 11cc2472 98d91a7d 088253ea
+    43038297 1c5b8c3a 49c2d79e 37fb2281 d3ff7682 93cad489 3edb9d8d f3654818
+    b109f6b7 88562956 1795a845 a0638dd7 88b43747 7b1cb949 071d9b0b fedcd4ea
+    9ae0edf7 a882bc07 d8eea8c8 af6387cd 0ad5643f 15848b2b ff906ad8 331d3f13
+h = d944686a bb28c7f9
+
+k = e1b0202f e389d061 8cb33699 0b1184dd
+m = 883093e6 2b04f697 d6f36401 fe7456c4 22e86330 60129d34 6464861c bd8ac0de
+    e58f7b7e 2fe9c31b 315cfa16 26fe71ae fc9d1bd9 d840c248 8ffc61ac 072a3858
+    5d7e8661 340b75b8 7aeccd6b 4182d519 11b6b7b3 f8382695 ba7080b3 0309f165
+    45e7c997 acf1f7fc 6a33ef68 71f87070 da098d4a faac4be5 749c3bad 2d812ad6
+    c1e59d8f e0530f9a ef99b824 90b73ca2 c5d1be6f c8a3e897 5d836394 c2da2c18
+    0fc4ad8c 69419817 bf980eaf af41bdea 6e8b261c c0fa8bdb c086456a b74f52a3
+    8f33c884 33b45fee 05fee35b a7587ec9 4cbb8876 7a6a1076 633c1183 f038abcb
+    e11e3df9 adecb974 fda6340f bd3569ef c13853cc 2dc32217 b1d5c347 c06e2522
+    8857f9ee d24e32c5 8f0d4934 db03b8c6 c02c7703 4c90360c 86853c22 fe8a0330
+    bacd90fc ace323f6 86e4584d 6c6bf501 36f0bb6b 92c2d688 515d6075 261e200c
+    f96a09a6 918a37f6 de3f00f0 87cfea76 1668ed7a 86597373 924badc1 0facf0a0
+    71b9130d fc80e889 c41e7caa 054be9f0 72f9f4cb 07831976 cc4e5b02 f975187b
+    e70f36e1 9bb1b2dd 141aa21b cd276402 fd0d2d30 2b7bb362 9e07c26e 2e796a6e
+    586e39cc 5e3d544e afbedbb9 17612458 ed59e234 0cf85ca8 909ecdd6 50522f44
+    62940ef8 5313f0b9 a8576de6 b8d59d6d a7929a53 48da0a0e 7f588b8d 7bbfca77
+    4ab6cefe 2281a802 0778bc4f 76d9fe1b 9dbe2969 f56e9020 4a1fce60 76bfe816
+    f7336eb7 d883c002 bb2953b8 97e99869 28569b0f f77d6b51 7bf4347b 1bf4dd2c
+    daa8ea2a 3fe94732 fa9f8f11 df108d30 5949aaf0 780b9a5e add100d0 3f2154dc
+    525283a5 06a67ce2 130e7a7e 9ddd1a09 82c56888 df1a10f4 2e0d8ca7 ccc61c8f
+    1419ecb4 dce3c66e c88afd56 23999fcb a3b6d1c0 d0353b11 bd3771f9 56f2fd46
+    53
+h = 770fca7e 5f94d80c
+
+k = b0a31375 cdd6c2d1 ffba7247 312ea1d3
+m = cca16e64 6104e126 b2222eef f5d0dfa9 b0f95b4b ee62f368 ddb51a14 a1369c55
+    64e8bf23 8150f67b 90312636 d125410b 9dd683d4 5ab66f68 ae694ac5 d51cc5ee
+    8712c8da ad3b79d8 c27529ef e08ed658 fc59e484 9fcc85dc 9a2d2ea2 b2bd7291
+    05934956 52253fb1 10998134 ae83c655 87bbb108 90e98f18 397ebddb 61e8bf67
+    7cf24546 4c5418ca 7cbb093b 46c1d5e5 1e3a8006 c43c97a5 dcb2e503 537457d5
+    e281b35b 06c4b2a4 7b7e93aa 84e5827f 1e191b31 9150a544 7cbf62a7 5127e076
+    1ab50841 a75695a4 776663bf 2387b36c 33dc43eb 68857fee edac37fd 9599286e
+    5263ce73 a7bffe87 b55fcc7c efeade7e 9cb98b16 7cdeaca0 0f89c91e 191e5746
+    209e15a2 151827d9 4142dee2 db068c17 99fdf0df 7103ac27 09fafed1 27491b1b
+    1b9577a9 b63da95c b5ff8c06 5898ec86 f163e1fa 6e7ac7a1 2d4d6f9c b5800035
+    21d67969 3badbe0c af022c8c 33163577 bc145b3f 9794fdcd eb8f52c7 e9c11801
+    0a7ff09f 3d9165d8 be2bab50 943de21d 57a40544 283c712f 63e340b8 bc78e357
+    4691db18 725af9e7 ecb377c2 1e2b28ad a0d5823d bc91a78b 4656e1d2 2d3a3fa9
+    d582dced ad8f2a7d c3e2ca98 6d685fcc 558ab201 743e0c78 ef8b69ff ab87fb2e
+    c6fc89af e2e89829 08effda4 3464a667 fd80083e 34e8af4b 40e0a9bc a0f32b3e
+    2afe32df 3da96184 340a61f0 c4227e95 629fede1 affe823e 189f5ac7 32bfe8f8
+    d35d9f72 be82438b 347bdc03 ebc073eb 755f94aa 831d82db c36a592a ea27e311
+    04fc7919 68d6d2d0 b372f0d5 e8015977 fc5fb739 8fd5519d 3e690a39 e58d6149
+    a0fd85b4 e629f301 3beea7c9 b69974f7 f7919e9f 2ce0df9c 571f41d5 5873a8c4
+    ea59e9c9 13123433 beff5bb9 1c5474d6 03a1322c 884b247e 7489f518 14fb6d1a
+    2abe
+h = ed6caa01 c9ea6271
+
+k = 28bb5fb3 598212f2 7f54b64e 29f54ac9
+m = 72bfda90 0a8d5e76 946778df 84eb4b75 addb6a16 ffc0416c 18b44165 50e83f02
+    8c796a2e ca4e1f76 0dd7a135 ef73be6f 9e314340 28c910e4 20e71659 8b2767ea
+    a6cfe84a b7edbcd2 6db6fa99 ce6fc63b 1f40ebc1 d855c1d6 05686571 f98b105f
+    041dd6fb 3fe6f1a9 97e6ba32 0fd065c5 e7a97b9c 0aeefe27 665ffe6d 8d534471
+    4a0ebc6d 7ff7565d e1c3651d 32e72dfe 789f578a 18618aec a49649fe 310cbb3a
+    387a5c66 b3d288fa 439d2cc8 a1a364b6 aa33aec8 c46ab150 d18c7fbc 4fd416af
+    3cde6037 a90d4661 ff4a9c0f a30017a6 d50f9b79 1ac734ff 32b41e50 e97ac456
+    2fcc61b4 4116f104 05954921 3e1dc186 abd14024 492da4ab 156c4dab 131766b6
+    cd7ce376 58309ba2 e6480c22 b199c135 b7207296 3d79147d c5a07ecc 0cd4f29f
+    3c490280 31d30aee 1d6042e7 102b43f2 5ee33a8f 1dd3520b 3d5bf1d0 1b8aaf49
+    f1aabf0c 81e02204 f0021d80 30c2c887 d5109a83 7d80db56 11747015 cf429ce0
+    fdf3ef9d b497f85f 81aef058 746ed6c8 e971535e f002eaaa 876a6ec2 8074263d
+    ed4807ed 02ea0222 be890d8b cb6c288e ba875bf7 864b4dcf 92ca10d1 dc1acd43
+    27a96a50 8eb82f7b 385df3e0 92466a30 8defefd3 408c76cb 0e796348 b0a78b04
+    efd9af8a b8657bf9 5ee59a76 38a28aff a8a1fd12 e078aaff d270f94a c26ac38e
+    3e688357 d98c219d b1f871e7 4f233bab 5b2c7dff ba024b90 21d4972c 4e8b1af1
+    7ea61da8 ce0b2220 0e936e27 6eeb7359 ab5c6ae0 046d796d 347c9b7a 45d1611b
+    f2a8dcc0 cc8f00c8 2fe336f8 6b2494ff 4568d0f6 36cddb1f 70e9a026 1b2c76bc
+    2ab72085 018ac30c 3449f1d5 ccffd204 cf69bea9 d6388806 4ae0813c 57bf983c
+    ef369cc9 ba3fb8bd 4641fcea aa508449 6aa3e46d d0e75574 963d1842 98cee013
+    296313
+h = add7f8ad fb94231e
+
+k = 7e96c6fb 1098a3db 0b41849e e38d334a
+m = dfc0a26b 1c2cc988 ef11a8c2 8391fdb5 454ee246 b81e8de4 74bd80f1 f3c46458
+    84f2dae3 6e144ad7 b1d07150 da5c6f8c ba98cf86 fe2e383f 0b65e108 884cd3f5
+    82f29c1a 823e151b 10283963 4c306525 6d204674 94993b92 97afbe09 b8e7a813
+    0c0adc27 aebb8872 a8e8974f e06aef13 a3084807 581f6509 4d883457 7427dd27
+    0c8340e2 56ac9183 15c49597 1f889ea9 5a3a6e6b 8e25752a 49826b2e 8670b99f
+    56a31414 b472c430 242e502b 8c95b529 88e531cd a7650144 ed123bf8 0279d9ca
+    c199420d d3e66377 0b634a1a 7d5c39e0 7e3026f3 82927dfc 33e16c30 f8eccfd4
+    eb938e08 1a48641d 40290d0b b215adb4 c6948b68 996d80e0 a1d0fdb2 8c5892db
+    794a1445 31a78cf0 396299fd 77d267e4 dc454e6d 773389c8 fe505a47 31a14958
+    7ba0e599 ba9b72a6 daab541d 568436f9 06de43a2 3e5fe195 d684205d 0de4b5ba
+    ac09640c fdb4af3e 23ea1e8f 098e859a 31e52d9f c848af5e 0b869ed5 2c1adcdb
+    134cffa7 7e3907b4 847ae9eb a0114150 65e3d523 f54b4fdd d1d8c9ba 919cf341
+    5403b388 97d39edd a1aaa113 47bc7dcb f711b05a 57b75097 6593878d cc85f138
+    f7b0569d 1eb555b5 b873b8c5 1b9179e5 c6e4f980 30624cce 19c3adb4 ee928667
+    57dde427 c72c883b a9dff73d 6e215a4f 1c557da5 e617fb8e c2a59c81 e83989df
+    1c74f770 ec88d94c 6e33d92f 0e9dd227 abe6c153 62fdacdf 4cf11b15 fc6a533d
+    d80c5cf3 2f6b746f 5186d262 39e2bd06 89f6789b 7dc07a2e fbb25bda e3dce50a
+    eb42517b 0a450491 d4575287 37790181 f900e826 d58500a5 1be30c3c bb4c5bf1
+    dd72c063 97257cbc 4013ef36 d0ee850f bd9ac0f4 780a776f a349192e e7d89eeb
+    89d2265c 475b6b2a 5cf3a31d b2216271 fcdb0834 1ede4f24 79852299 9f1d3ac4
+    3acd2304
+h = 42505045 3371cd73
+
+k = 393ab545 7ded8a3a 4cc85641 b37a48c1
+m = c3be0b2a 336321f7 652a637d ee8a017a 3273e51b 1aa1cc87 36acda93 85fbe3a5
+    7dda6d94 4dd93916 78af2c23 8f984a9d bd596d62 57103d69 49ba23d9 33a70357
+    80a75875 fa9cafd3 79217fed 0425a0e5 0cf4847e 7c29c8bf 808f7450 e0d1960c
+    18cb53f6 e61c1825 3e08ff24 ea8997c1 324d71ce 34b6f20d d2cb0680 3a16be18
+    e4c236af 9e6311a9 71faa931 e10a06e0 16ffbc3b d2b552c0 1b443927 3b5e8ae7
+    66f170e3 46dd1d73 7ea02580 be586ea4 9cdcc9db 931d4b2f 62495f59 042cfd79
+    b4ad4cdf 4840796f 17715d4f 19c46562 cbdb22a8 74874819 848e8d84 191df7e1
+    5f2490af 132e749b e1c10193 1bf11fd3 617ec3fd df7099cc 47a42d10 b51a0754
+    6a98e699 f6d5e6ee 08cec86e 341d0434 7fd106d6 c7d78b7a c08fff9b a9cc5fc1
+    1104a46b b5e41eb8 cd5e5960 e556b2f0 5aef4ad5 41db124e 8f925d4d 9697f56f
+    d99b8f3b 2361647b 19721574 0c261507 7d7ec7cd 61864416 dbdced6e 0e9eddb3
+    cfa8f2fa de72a436 0e39492d 530ea24f a8601f8e a68c2a23 967fc565 d7d0cdb3
+    abeb506d 4b121972 7c4574bc d39da2af 6fb248c5 cb34e1fc 0eff1b74 0c118b49
+    15d510e9 a1912e96 f222c329 96668146 2b4dc3df b5e3cc23 7c159fc4 01c82fed
+    afffe9c7 55e30c1a 6546a307 037807c5 9a57c247 21f180f4 b1ff0619 60c2b8ad
+    a41510b3 12e5a5a3 07d43320 f37455c9 5a944045 0c75f352 d3ee0e3d 1f378ff9
+    bb8c3035 a79c8a4c db9a2dfe 6d5a9163 568b99c5 b27f41df c89695f1 0a40b93c
+    9c17c92a 51937b19 7faa3eb2 137e630f 5487d70d 3ec3ade5 01f6fbd2 a1f293b8
+    5bc0beb2 f6085d0f b3455fcc 549fe7ea ccdb5da1 48f0e259 05f3adee 349675bd
+    bf1eb9b6 b805c255 431aae79 cd165e84 32744c3a daff9212 2914fc89 fc80946d
+    7a7c690e fb
+h = bb728b9d 8308cb93
+
+k = 151b7c15 96bcc937 e40bddb9 fec0d3e6
+m = 51829231 6e0c5e39 510c0fb8 82c6226c 4c59395a 0d10358f fea7717f cca13068
+    57f22de2 22fce7d5 d1c34fb3 97277cf4 5b9c3670 4097d601 02613367 5e56e1ed
+    75e9da3e c2452fd8 9c1c997e b8281687 e60f9810 4c897aee e75a4fea c39f67ac
+    ca8ddd70 c0278cb5 3c15e274 aa3479f5 a2a856d5 40507b6a 5a2d5fde 863e91c8
+    2f16bf57 dc9dea83 d525ffb1 a68383c6 b89298a2 c7ec62bf 5fd0941b 1a97a59c
+    c4c5ceff 1a8f9994 297f1f3f 8d164d64 2eb6183f 54c6a2c8 937ee3e9 0d98a350
+    ae482e78 b14d4d75 8141b3b9 d77575d1 a3faa395 0634ba82 1aeaa936 7f5588bf
+    82252c87 1c292f13 46f93611 32efcfcf e7f9d457 7a2f3a38 da282f07 fdf354b2
+    3c873b6b e011ef26 6bcd9090 654c06f8 686569bc 07946d97 334aa9aa 99229360
+    a4e5fd3e cdd39225 94d649a9 77b22be0 6ec8958b 152a1f31 a03c1520 194bcf8e
+    44480b22 ecd8759f 5348aff7 7807268e 7306f4a2 cd8c2bfa c072b329 dea6cca7
+    d3f31feb 725097b9 ae7058d5 824a04ff 33e7fb01 935ebbe8 da68b177 c4e1836e
+    7c149ae4 fb9b54b8 09aa98f7 66724fe7 4f3d15bd d3507685 aba28963 5e405c02
+    96aa35e3 72c2a3a1 c74f8710 40fbf2ce 040a58ac 3d29dd06 9fd893fd fbed5b42
+    275e017e 53c5771d 5537f0da f2ee6223 0935d71e ca9dfc63 98bd3246 ff42327d
+    03646bc1 31fde0a0 086deab4 1d1b3cbc 7ecb2927 f444b1c6 98608ab9 09e97b03
+    8234645f 114d840d 10a44163 05e2b5e0 08eb31b7 a5dffc88 1276d7f5 f9cf8919
+    853181a3 3aecbc6e f5683c75 70a1f701 fdd1a06c a6f1671a 58b16be2 5f8d1a85
+    1bd31d9d 1950b94a 3abc66ee f313e0e8 19aeb638 1644e52b f95f0e1f e216dd66
+    81df084d acd3dcde 4a0a5c48 61b581a7 258a8812 807117ba 63685d5c d359b234
+    1393cffa d7f3
+h = d903f393 ef3b0fa0
+
+k = e979f410 983bdc5e 11fb5156 49fea6cc
+m = bcf332ca cf5ac63b 3a0dac8a a867c17c 08264db8 b5f11e85 0af83d6d 23106109
+    f3f80f7e 9bb18dca c78d6cf2 f8c1cefc 71a6cf32 39da73ca 7ff047fd e4f52cfc
+    ad08ea62 97f48b98 5d750771 60b84221 bcd063c2 e60a397a 0afb8157 522c1ae0
+    948d4175 59186a29 c7781416 6259ada9 f9237113 98ea9748 4b9737a1 5d64bed4
+    40e67e31 ebf01ce8 718047cc 6ad139a9 796ddcd8 6f3e773c 6de1ba19 c45fefcf
+    5bb2b334 b73d9d54 2ff3fb55 4519d558 dcb0df5e 4c2e81b6 99bd7fc6 0cd99e2f
+    2730059c de3dfa72 61356434 77b4fb5f ea133b1f e046884c 3e2ba1c8 919d50d6
+    7d3cd03c 520506bb 22190cea 53b4449d a4572a3b fbc04c0e 36a875c0 e9dbb65a
+    2ce177f4 aed2faf1 5f463897 51192c40 98032f92 2cafc2db 559e4bcd 2e131a50
+    81628db9 1c9a7228 01ec02b3 79426770 331f7363 c54cceb4 acae7514 6fe70570
+    90d425eb a7ace203 103bf567 010a1407 ffdf9f26 c5832ea2 70839316 afe75158
+    e3c5e861 ff57a254 0c2091bd 4a6e92b1 6599627e 8771d637 00cca199 9fd611ed
+    b895192e 0a24bd59 e40346da 085cf96a 8a7605b8 d139a41b 27c0de30 1a44bc7a
+    ac932f81 89e3f712 31ffed43 59cfece8 42cbfbec 18f16712 f62ccbbd ed5c3efe
+    a1674c2b ca803375 1a26c56f 53d46350 76be9bf3 3632a2c8 4a6ac33e 763034d3
+    43840860 edba6668 00065532 8afe8ce4 c270db24 dabd5224 3d672569 0ef69451
+    4444906a 6d609213 0856147e 5cca48e0 2e4b7ee9 3610d72a 5c433f45 6f55f979
+    e67b01dd 2b1ceac8 abcc77a1 2e211205 e1e8c445 8db29ba5 bc35f998 902776f6
+    11717262 8dcac776 6c5adc06 a5ae0ed5 4f833160 49504c64 458de13b d9a86743
+    07c9a09b 5f1e6aa1 fd6a1244 34be20ea cc3952d0 6079d5b4 8ca616f2 5c670fcf
+    e2abc324 29fd3f
+h = 294429d6 b96fd063
+
+k = ceeaf2c3 aa49a2e1 3ea15801 38e92930
+m = 82885603 1b0271f6 1cedf701 5e3da4bb d7ed31b6 9edc8062 49b8fea2 8ad73eac
+    3aad241c 7b9731f3 77218d4f fa9311cb 8922da04 dce22a0b 938c87e2 d8f040c3
+    4432ce73 27f62783 2088a514 bc16f0ec 154c4eb4 2542e44d db0efe2d ce3adf89
+    f773cf80 3237b233 65a2b59d 9e40c7f6 4ef9b8e2 24b49004 f1a74a33 9aa027d6
+    22e88c92 5b8da702 6d7b8e7a 43d996ea fdf0e02a d00486df 645ecc9b 0bd51594
+    7820571a bd9e651b 919845fa e18988d7 12f487e3 3f9dcb80 5b3eaeb5 99b46ea5
+    8bc53a47 a7c17bf5 293e6db3 ef02524d d5289fa5 a2a88b05 e28bc88e 82c9a7d8
+    ed3225d4 6fc9cf27 157b3b59 f45481b9 84e58b44 d68b10c6 231d3b80 f3420a72
+    b33ee478 1404e950 22f75207 8600e04f bf13b3be 8958022d 4cd9c25a 49b484c5
+    37e1eaa6 df3e5b58 d231c650 ca6e8188 b97b8bf0 a0df565d 232b84e8 732c8781
+    afad9522 9b3695a0 e68489f6 3c29df01 1e0c6c99 38b8628c 34a82469 bf1c009a
+    337148ce 9b8f087c add74258 6bde97a2 01af06a4 3b00e7fa 75dd5062 0fa6142e
+    6f8bef95 6832e117 6910dd00 0ea36286 97ded509 e5dbd052 aa9dec02 e9c5f6be
+    13f2f265 bcc2d2ef 6d555638 cf3625d6 0ab5b37c bf4f188b e23d1d52 db85edb3
+    a6bd3a72 4caf7eb6 72f7b1da 72f5620e cc1c3613 73eaa1f1 d38d4dcb c9de8695
+    d751da4f b44929d2 3959a4be 823e8ddf 45cc6a1d 0b4f630f c7ae5212 3347a89d
+    787491f8 c22d7a63 190d68df 58ec2ca4 6f658e81 6e7f68e5 6c2a3c1c dcabefbb
+    8885715f 0a2328ff ba34668b 713cf640 f4ac2a9d 0f004d8a 6d1e9655 18f5fbf1
+    568469b5 6525065d 26ca838e 0d3e0f2c 030ea8bd fdf5e4e2 08ea63d0 a1495002
+    3d6200c8 1336a8b8 655aeb9b ba8bf785 4950e179 46f51094 a15a8a7a fb1737f0
+    81800f68 a702e266
+h = 861b9a8f a9a26763
+
+k = 0562e4c4 803f309b 4849a483 76652530
+m = 363d20f1 24d3e340 d18c002c bca3a51b a3071c9d 44495b4c f09da492 7e150876
+    34b8b7f2 a7d39e31 11dc016e 4266ae39 dd6ab9e7 8df5d2d8 e3642ffd 73e28312
+    b50122a7 687fe9ff b67f20e2 49fdb2d5 196b0693 0eea16d5 81d49706 ee9edd7a
+    2f9942de ad437480 7655431a fa797e0a ffb6b16b 1c21f2c2 0abfc60d 3c0bbc9a
+    83bd8c22 53f830aa e8922605 48e29194 6fc46d2d f047e206 b66f7cd2 fa1e3d7d
+    5eb717bb dbabb595 f38cd3e1 0ba167bd a6e7c258 3782397e c131df8d 289202f0
+    9a418381 a58f745f 3d839b11 47c62cdd 76d6846b 16fd3ac0 8aaf0cc2 5ddfd697
+    bfbb3cf2 7b4c8ab5 a07a637e b8179c54 f30495fc b3289ded 8c0e36a7 b592bfef
+    adbcfa83 fb01f85a db3f1ea6 6c7b5a93 b08835f5 645bd996 97a51be8 d3ecd9ef
+    23331266 52b76ad1 9c3ae725 092dc6c4 fd18c960 0731d3f5 a1374179 ebcdb3ab
+    3850c8fa 77d96ffb 998b43a8 18f71eac f3f63524 1d881a29 33781e9d f3a5fe71
+    69d7ab00 6ed074e7 5a91002c 7606d96a ea279551 3fa07849 1cb603d7 1777b32d
+    1bd99570 a88b2980 04821f36 d09bf579 56bcf5e1 ba061c1c a85cec6b ece46f10
+    b8b73fe3 60925016 3bc27019 733b42b6 5dfc6fde 6211ca1c 9ee8f13b 2ca858e5
+    5953dac9 b1387eaa 0726c311 6c1e740b f0b9340f baa2a6a9 95e8bd2e 70015dfb
+    a6ee1286 1cbb2c5a 6105f75d 143bf35e ff2f18df 2feeb2ed 844c8c71 4d6d7bd1
+    3d20f20b 9e17554e b449834b f53baad4 7fdb59b3 518ed903 0717f834 f64ecb63
+    7be1693f a7e4fe8a 06a66dc5 57e1eb2b ea80cc0e 1004ff81 cdbb053f f0dacc26
+    e42390bd 01e8fbdc befb52dc a394f817 e8b89015 044f5568 db5b7616 bb44dfb6
+    68ce1cfb 3ef29e17 066fc8d1 102eb3c3 7c3609f9 1e957821 19d6b795 bd52c67a
+    16b0f8a3 292641b9 13
+h = 1aae1dd4 b1440abd
+
+k = 3d4c0156 bf6a9416 05175242 08179242
+m = c40db455 caae198c f6a6566f 76139f47 970aa73a ac282a49 8c8e29ba 1a7b1ad3
+    365ec047 f6bb9597 eb7f6495 0e122866 151dcfaa efdc9e63 36f22e21 967eba02
+    098919e0 a7e626c5 688f1bd5 2afd3b11 c33fd7f6 0593d8f9 cf620c3c 4e55f48e
+    1578bce5 d415cd2b 40837621 a192ecd3 257fba29 bf5078e5 6090b358 04809cb6
+    5faab96e 252429cd 894fcea8 760b1cc4 701cf0ba 8c1d49e4 ed7b2420 0f0f6ddd
+    529c4fc2 78047a8e 6b5f0428 45ad0647 04166373 6891c0a5 0d0d47a3 6e869947
+    7e8b5014 6b1b5a60 f2ddc725 4779c103 f0db176f f10d50fc 6c391a81 7d05406a
+    bf3e32b9 ca4337e3 b468f21b 578ef907 c1eecc96 5caf5faf 2778b0a1 492e629b
+    4030db04 9e6d8b6d be9b85c5 09ebf547 47cad544 5f454f17 093a5398 3e426284
+    6bbfa9bb 27eb7cd0 e8e22fae 9048faf2 f5e1c2d8 200d0ba9 446c95df 2f5d07f8
+    3741936a 21ab0655 6c49c8d1 9d5820a0 302a3653 252cfcd5 58d6ad5a f091734b
+    c05f8c5a c21653a0 7fd21fef 286b5412 0e1635ab 39e34bc2 46849833 d8b77de5
+    38e5e2ab 32fe0441 7eec193d 4fd9e1fc 3f2acf80 92b6fb28 ec4ff062 6d131c37
+    f071e377 69506240 f266c48d d8c889b8 7de2de2d 500d3034 e5d09f07 004156ba
+    7003d897 b3c5bdcd c9309aad 3a37cdc8 5eb5376e 50dd4137 96f02c1a 3506b24c
+    61788870 439b3528 14c24be3 05f8a3f4 ebe33989 9d7f4ce7 a53e5264 106c0936
+    4c14e41a ed76cf84 02484442 88318da4 10ba4484 cd100c5b 77e87116 449e3a88
+    d3d9edd9 9cf44613 8dd22e93 be1ea625 62b27f0b b06d7793 678107fb a1f0f7d1
+    7270ac63 8403ec1d a408aed8 64a865b6 1a7d6fe5 2c59d306 81aa1b5b bafe9d33
+    36e7ee37 a8820dc7 d5305153 2f8ad6f3 4ca4f37f 39fd2de0 73e398e2 59a55be4
+    ad05a670 1ca7e872 1e59
+h = 973171b5 9be9367b
+
+k = 3524f02f 397aed26 27d59d73 b0845b0a
+m = 4ad2e309 02fd9078 b208aeb4 a2071217 da97132a c661d649 44fa916d b02ce8d0
+    26eba5fe 5131477c 6d20fcf5 49ea9254 55c3d831 74d6703c de88605d 7cbe0133
+    814fc5a8 6ed3f3c2 7ad0feff f204dd12 975ee4a4 dd93c672 4174e83a 4a1f9e0a
+    47e19471 898b584f 4914a9e1 7a9c994b e2fe1e26 bafbc421 95bbed1a 1c12b367
+    afe14cab d48fc9b8 469bcf7a 14e2b191 8368617e adae6803 ad109d99 8a55cbbe
+    62b08360 cc5a4057 d2229a0b 4f464080 fd399e81 af9e54ee e7fcf139 6744b38f
+    3b93893c 850aa02f c1afd80b 141ed39f 4e250224 e7d4980e 8aac06d1 eedd9288
+    9d4ba27d 5a4482f9 6a63b8a4 e4e4f339 a70778f8 12d42354 8fca1c8b 6637224c
+    1920a422 71485092 40339a18 dd133b37 9f4bee51 57a4c6a8 9c6638aa 41f26fe1
+    dc5cdc49 f98a7972 5110ce95 2a1760bd b6c01c9a 728901f0 b884a0cf 2ad8003c
+    b3066aba c2f384fe 633f6786 fd381d82 1690d98b 975d32a8 99ccfb3c 6ad65916
+    88253483 6ad83b26 a2ac95ac 83717722 78b063b4 cf511d85 da6e7eb8 03a9c74f
+    c9d867eb 87ed000d 9a9ff92b 8468d9f5 a7432136 6aa6064d fbf0bc29 a8bbf080
+    c2767dba 65df5da7 ce0ecdf0 6f48ebef c60a2e14 f490aeb7 2b92358c 7f58cb3f
+    5b090bcc a06fa919 03eae21b 4ea1b09b 3c2b074c 703d0137 f7e68931 a34d1ee2
+    5f1b17d7 4c08a66d d1c972ce a964db38 3347f747 1bddc968 f191dfe4 0f4a138e
+    58cff930 1d799cf0 a1315c1e dccd94a3 18f759cf 1cbc3a84 abd448c1 8e8061ee
+    174ec485 50bd2304 b3cae924 d58a82c5 75a38473 f77c7558 40baa833 6b7fd8bd
+    c98c171a 3a64334b 7c248bb8 59b5fedf ae09888a b90fc1e1 620cbdf0 d96ad901
+    598bd538 8a22f9e9 aa8c4f15 5db3fba7 7139311b 98eb39d5 28993138 8e96ff44
+    29b7ae0b 743ac500 a90abc
+h = 2934e50d ba3135b5
+
+k = d143d45b 63fa7af5 e6c05f79 cf6dafee
+m = e503fa08 d63f16f0 c43e419b b5edff00 3286eebe 6c6a598f 4db9a855 68fe7431
+    f55df0f4 2ae3eebe e3f7d24e 06048c30 e7906c58 f1a8641d a2c97c18 f59480b4
+    5242d41c 658c572d 16dc5b13 39135142 2e45337c ded37dfc 9438eac6 908fa46c
+    98c88537 22f05267 c77f1807 3c4b8740 24aeab02 c869bcbe 01fd41b1 a49335cc
+    d5e1f18d cc3b5767 ac8685e2 8211c661 619ad314 d8c864f9 5e420df0 e9be688d
+    145e6369 e08decc3 cef99e43 aebf00f4 9bcd930e 58b59594 57ac1508 d756a4a5
+    53f875e5 1f4c7510 8eb74e69 72f3290f 5031efb8 2022930b c5854d2d e1e586e7
+    013ba353 a30e52dd a04c98cd 9ac03b88 a1bacd2f 75a657be 08830ad4 97b40dde
+    e80fc413 fc366845 7b7275cc ee6ee038 1883649f b04b82ed dff7dd4a 4829dbfa
+    08d3a7c1 ff817286 0f51101d 508f8845 d772c3c2 200ffadb 72366c23 e72f2769
+    a4656ab6 2627f62e aee8915f 2c17c2eb b1e74602 33adc1e1 949e5fb0 e412362f
+    19eaeb95 ecbcde52 30b03f5c 69573dcc d0abee72 719981ff 57aab491 a7ba8e82
+    4e65cea1 f719535d 9de72686 0f7ba408 04eea8d1 53babe49 dbaaa382 553a1a87
+    aa340b2e 1b9b5be3 bbe46c72 ea292b0e e2d5b0db 579f9183 5cdf7d63 bf0e7469
+    968188a0 c3526ba5 7b29bfcd 21675cdc 5baa8383 45140614 cd0b0f8a 7f90ed0d
+    a58fff73 343852d6 f57aa684 bbaae5fa 8f9c9f1e f574a78b 6c4bf407 1867d9c3
+    b45ff775 271caa39 27172005 a3f37e69 67315f29 07b5a0bf d65077ed 03a2a7b2
+    a104623a e6f6b2a5 66a9e53d dc01b8ce 1483f320 1b716191 2b54e599 e18f9386
+    bf8331e7 394640b0 5bb8ab46 ce0da7c4 6c98ade5 50459f81 e6ef252f 3f04daec
+    ad6051df 7c9cdf09 0e5c93fd e909522f 5be3d7b0 c3d52123 732618a7 c08377e1
+    744650a4 3fb6e34f f543bd8c
+h = a2a2e3f8 d669d938
+
+k = 5f93136d cceae43a 1308cb7c fcb44de3
+m = cb320b10 8e4b200e a05feb6a dd5b5948 2fa65b8f 3dce3b2b 4c204fbc e53e6a21
+    4c93f353 9e0d49c2 d2e1e052 47317f81 b71aa1c6 8bb346b7 65963a7a 8471f465
+    23851ede 2b8d4bfe ebe4e4bc 7ed5b131 be5e3d97 8c1b736b 85b5003a 2dc9c9b4
+    fd92decc c0c1b4da 2d49fc8d 47e76ba4 cfb1487c 5d0f7ad1 6e5f17a5 e4957954
+    c68dde51 21d44d75 2300e240 fa5ad9fd 345c4afa 83822791 83152795 b348d16c
+    3e8d5b3b 97578a1d a95dd28a de259438 a5c7e283 77e16646 59225536 073868bb
+    ea939642 0f9ef912 44b805e6 17512e0e 8eb7e267 24fa0c5e 52256c79 6ca0b0fc
+    03cd1859 897fe15d 52c08f6c 732c7f65 4a54852d a8d86619 2ba0282b d9756b71
+    2bac7e9c eb493fed 657b0573 82251aeb 070c1cdd 580aa365 e93c7da1 25a438d3
+    21690cd5 e8978525 162ed7bb 18f0c158 08eb414f 042a0225 f2867379 2e991f58
+    4fdf60fb df72fe82 237dc414 543bfdb9 b80b4955 c8b04481 a03dac45 a47c6be3
+    2d2d8e5e 044d7553 5043617d f5a0f22a 7a52e816 8ee6075b dc168b26 04f876e4
+    4d2fda04 ccd73bc0 fb586148 73050d79 4b20161f d39251f6 f58676c3 361e91f7
+    64e506fb a5d9ecfe 6f86d08f 0fda4145 008675fe f6e3915a eca361d6 08d98fc8
+    0726bc43 9f88c671 76ca9069 8133d23c 391954e0 0cb4caa3 adbf9822 6520df55
+    5cee48b1 226b27a9 18b83747 f2b0a830 9cc8593c b13ef3bd f8f680f5 f1650b3b
+    ee1433a3 5820161e e8c72db7 a957df55 61d18330 c792fb3b cd579e83 1078458a
+    99c8a4ac 7ebe6cc1 491613e7 bccb5c95 704ef6da 66237e96 dd4bd185 f6879dfb
+    0922c958 00671467 5f3a5b6f 251bd687 ea0e47dc 77deff42 10a58b71 549d6df7
+    8babe112 90863790 deb9e185 3b239e9e 51b7195f dbc23d69 f9d87b7b 39211273
+    bed3db76 279f1006 20106c3c 12
+h = d342ebf7 980e7e19
+
+k = 1aba0e17 92969267 ef53d51d 85fd8a21
+m = 699954f7 30ea88b5 6097a847 844984fc 8aeddde6 0d1522c4 7a765b7a 973151ee
+    70010b3b 0d101776 767718b4 7b9654ce 3da4e7c7 c3d2c0d3 0edd76db 9621abeb
+    894f6bde e8fdf273 004e647c 469a378b dc44bc5f 3ad45cae 9488237c abbb9b9b
+    09e212c1 22f81ddc 5b665a65 e6cf0e3b 04142237 06da2f7e e6d84616 65898000
+    6b3de09e 382b0fc6 898f6032 22931567 930324a5 9f3913ca 6e36632e 89ca23ed
+    e3547a31 73852d01 37e77698 64060bb8 b84b42ec eeb8e46a 71db089f ab478fb7
+    ff5be64d 37d4bab8 520e078f af54970c bc9b0127 60011337 117cd871 f5c10a63
+    3f5192e6 21d0ea08 d25904ad 48f5fa22 d30c4fbc 10b2c541 af37fdaf 322ce4d5
+    8ba55007 1ff9d24d 58d78cd7 18cd665f dc7705a7 7ae30fae 0faa405d 45d7686e
+    564b0c09 b772f8a3 11d45dd1 82568e95 6bf7550f 58dc2e75 917369bd d707a80c
+    0aa974d8 8de36ee4 55af0eae 126b82d8 3681c09e deccdc6d ba8818ee 44551919
+    ccaa798e 6757b02c dd9a70f2 409a37f9 8afd1c0a 3cc457fe 8ff1ea80 baa42bb4
+    6abd0b3e f45bfd44 9559dbf6 7d3c481c 070a43f8 57df0728 f81bbf3b f707bea1
+    a15b0862 17f58021 20a44609 7a96f1e6 3a64e097 d962f033 ef629b7d 6910af9a
+    b7e5b41f 1e237055 e27db0bc 2e883421 bf1c8812 7737a0bd d1faa352 c4020097
+    bf353a2c 8fd12372 f03df8f5 c73828ca 0a918252 6757bdd0 97498588 e4e3947a
+    996991c0 929443e0 49dd6277 8a9d5fa4 dc2ac0cf 8b6b7c93 080f8607 2448857e
+    5298c64b 1e5eae0a a9de4a41 51b8055a 7a164744 14d39d6b c75e466e 5c6337f1
+    8941bfb3 00690be3 9ecdfb0b 88018f34 eed97817 06217ef6 a6c92dec f52842e7
+    20a3c250 603b290c 067472e3 88bbd1c1 2755a185 c2996e7c f7f0c099 ba6aaf8b
+    a9ab122e b7d2cc05 85363850 ebdf
+h = 4819bf6a 389ce280
+
+k = aad36790 94ff943c 6deff11e b62034f8
+m = 1e54d014 faa047b4 f2cd9200 3c9fbce5 853aa9af ef05f2be dd45686a e4eb3b35
+    6cebc0e0 8cf067ed af9f6177 9cd97ff7 0b099aaf edcef18c 60492c49 da1bd4a2
+    8552b60d cfce797e 362b28a4 481db587 2ee3f792 5e26e3c1 7d8d976e 9a329de3
+    95636d9d ac70c68a 7fda7ca8 3bf774e1 4de4b2d0 237d58f6 83a21cad a9959ede
+    15f14d24 d6b90b3f 1f6a69b0 978c3cc6 34306986 4abd14c7 97d9a81f 4f3b289f
+    74dc1587 4c2dfffa 09bbb6c1 41992482 798cdaa7 b9d8ecd3 7ec55b47 cf61afdf
+    7c7b31af 4043313c 54bee55f 82f618c2 aeb4173d 9d438f2d 6e72ffa3 df956c3c
+    d36716d2 bcae1dbf d21df0f0 33214065 6d286da9 3a5005d3 f62faea9 bcb32d77
+    7a3a60de a928e497 8ff93f2c 6be7357f 7560840d dbb16867 39b52d05 6bd52f97
+    1c7e197d 77db0bac b0bd3514 d82ad288 e602935d 280e6977 12be69e6 5213159a
+    8fb162a4 08f42fd0 81282c9c 03dd2928 c0d01d1a 1cedc34d 5d93522f 8b093fdb
+    f320dd69 026b334a ab7681ce 33994d8e c3ddaf90 4395bbcf 48945b95 6fd87aba
+    2aa0e00d 248b4630 caf88cba ee10bd38 f1322030 84789d17 9823ac1d c3de9166
+    f3b85d39 446e62d7 834f0037 72091ebc 17094388 f1d5c4a6 4f132df3 36c1c4fd
+    aa0620bd a63f4d2d d52f850a 7714e638 26e5b4d1 97ddf95b 5cbbbcc9 e9f1e41e
+    8be9929b 91c3169b 2e82f84b ac50c01c 9ec40bb4 33a6d257 109459c8 6fb897ef
+    84f34a49 8b3086a4 46fb8cf6 f48446f6 359cd04d 4d517853 0fcb37fd 8b363e6a
+    efb76dc3 5672d2d5 7d6154ec d6933e22 c75778b7 1976aa9a 71892ac6 533cd055
+    ec7d173e 369f203e a8ea90bb 34e3c1e6 2f8f96e9 363bff6a f2b56ff2 f08ff835
+    d6c37612 111e6404 24766153 dd7a066c 1ac9d695 c16581bd 024ebf39 4c322d17
+    cb93e018 8d5600ab b21f0f91 62a5f3
+h = cf36d65d 12fb7991
+
+k = 81aa1bd6 ba6dc503 dd58a934 614f8506
+m = ae6b5f23 081a07f1 6f06fc51 6c5735a3 b0a7b487 3c0467b2 14e82d1c a1e90d27
+    d15ab2f1 17160dbe e42d5662 e0ba79ee 7677796c 9e437a52 6a274fc5 d298f7f4
+    4a9f918d f9d861ff ad12a95d 928dfe1c 05c53d48 76d2a604 e91b2007 644753da
+    cfbfa215 337d9956 bfdc4cd4 16f99775 fe67ea0c ce247d26 b9ea4253 cd8b9cdc
+    16fc296a fb51a1da 499ea350 e61e93cb 2c60f6f1 e3ddd31c ddda5d62 6cdddce4
+    089077a2 d7109445 48616540 4f0e191e 1cd6d078 3fbd7d63 e25c0f9f 724960f4
+    47660489 ec503d18 ec0e80a7 17f48849 90feb51f e1fdc3e9 85c8c763 bfaebe20
+    7d263e8e 54ccf3e4 024dd5f5 4f07791b 6fdd0673 cee58e7d bb983242 551d8918
+    15066405 337b925c 03d79d6d efa027d2 2f6ab183 52295a03 eea27219 4b406ccf
+    7aff5d08 223583fe 3ae85109 a1a69638 90f786be ee6030fd 72b44194 cac5a3b5
+    7e13fd03 f73ec490 a08b9c8e 43d5bfe1 3c34e505 33388b31 1a98bc14 b2d83690
+    70da366d 99dadf8a 89de5fba b7d7bfa6 33e90087 b9a73d00 7c3d3b42 5f835d22
+    767cbed0 703c88de cbf16421 40d6723d 12c69960 d494a6da e1e2b897 c631ab7d
+    c48d1c3b f2e0625d 8b0d849b 0cb65228 e31b537e 720850f8 1d46992b 3fe431e1
+    757313df 774a7da3 d71a4359 9a530e79 b0901563 872ac073 382cfadc 6772eb89
+    1d6af7cd 6a9424c7 8e4ec146 c653a01c 82e265ba afd87987 a75d8ae2 ec8d76b9
+    2f59ad4c 8c9d3c1b 779b37ba d809f56b f497228f ac34078a 52c9ff3b 11930de6
+    04fcbaa6 dcf0c690 63ce1a55 c7d06d9e 72a61f56 7a6fb481 f296f5ac f0b6fb32
+    bedbb132 fc8d3374 4846c136 be3a8c6a 7b0a25d7 21fcdeae 339717e9 f5a25246
+    2858752f 1b9018aa 0eaf3dc3 6d415327 f2db2130 d8e42a32 9b933fae e7bc0459
+    3e124aec 0dd708df 6ecb5771 c27dc383
+h = 5dcde944 73fd724b
+
+k = e27dc0ba 8f02b491 46d2b2e3 ca57295a
+m = 4813526e 0afc686c b210fccc f813ba22 ce4c54b5 827f25c9 4ae7a134 8696eb06
+    7265563a be9eca0d 212b4b23 eab08247 d128b828 99016d0f 96f2a87a 751ffb03
+    97fe22e4 29655c5b 888e8b6f 2fc803d7 9e19a2b5 81c24eed 3fa5d802 0f2cd112
+    582fe3e5 e8ce846c eb6a4940 138fbb60 f0e5a622 986ec33a 63d68583 2e2430c0
+    335b66f1 827f26ed 07c36c20 4cef8874 66c60516 97470b19 b88ef8fb 73a470fe
+    1aab1a1f b1e85544 c0bb55b6 f4a0b1a4 8e4c9795 76c3cf25 2199238b d605cddf
+    efe9e638 b6a07c57 4fd70461 030d8985 0e14606c c4d60fd3 1d0cedcd 1fca38bb
+    64ba9874 ae76f1ba 6faaf424 ffc332a3 c292c2da 794ee95e 744a7b8c e6b415fb
+    0d3b03f6 46078173 dbe20775 86e5c633 8ea798f3 9dc59030 adcdf520 94c3bc92
+    1f28b51d 8de377d9 8c3abd70 2d55cfd9 8fb80887 fe001a31 7abc858b 97234e0e
+    b5f8d32b 7a497c4e 81bfa415 77116d78 750cdd6d 366547b8 deef84c6 5b1f7366
+    6d9b4017 dc5b6ba0 2faf566f b4427e22 1f684d0d 9ea00e8f 1ea9cb19 73ea110b
+    8b7ad873 738f52f6 3115a62b 3dd69e63 a10829ec 8f060295 f3522c0e 24071c5d
+    0bb03365 a5875246 d985585c 1bd62b4b 5855c140 853aa1f2 72906781 cc5088ab
+    434b6af3 f06e2890 72a3201f f3332791 54bc00d2 276cc3f7 4f57a418 a673644f
+    e2d32c98 ec4c651f 44780d2a 909973ab 4efe33c8 6c5a40a8 720880fe f55b51a9
+    5a74a94c ccff7845 037ed92d 19f01733 e360abfc 5f48c5a5 e156ccba 98d8c620
+    d27e1d1a abd35480 c13ef431 c771e986 9388b4d5 630a7493 1d18881e 924c875b
+    5ba01d49 7f61634b aab22901 13ef0009 f52f6c35 f66592ba 212a1889 bbb8ffc6
+    9dc88337 459c7b04 24f6f68a 36ea241c 6018f03d 6b6f4232 19135680 c1e5c609
+    01a30078 3837e27e aea30e7f 987a744c 1e
+h = 3d666008 91be1912
+
+k = 52edda5d 5adcc18c 980d79f9 055649d0
+m = 125b9f37 8b23b996 3e10fa33 4e557d89 049868f3 d68e10ee 79ed1a8e e0636d82
+    a133bec4 b6e80136 bc1e5463 30ef8e16 a002a649 6821eeb7 90cdfd3d 8c76d1cb
+    ed252831 f99c93c1 4c57b3c8 d347ca56 30cbbc49 35d8ffd8 0ebe1945 cf07c6c7
+    e58f73bf b2abbebf 124102c4 61b9ba94 edd4efcb 1ed33319 73f2a987 3d00971d
+    826b3732 a93d031d eee8ecb2 87904b67 ce411142 c1514821 a2948f7f 1fc47bbe
+    8b331256 3a36a18e dc82a0c1 4289afa5 4677d0a9 af391f80 c10ad732 8ba56b28
+    4e05b14b 892a9619 0d1e5263 03831469 e2b9cbdb 329b65d6 4cd6491b eff26f5d
+    e21bc95e a61cabbb 6bfb71ae d360d93f 56f7e307 1f2749a2 458b6a37 bcd57ad3
+    65eddc0f bf9959a2 7cb8b3de ad2b9dad b485dce6 159037b9 52279f4e 42165bb8
+    62b0ff36 727844d1 9e0441b8 8c7afba9 61afa24a 908e5915 87705061 6e7ec750
+    5a04d0cc b5055ceb b9b65588 e1131358 8e3c60e8 d16552e5 375397c6 2528eeba
+    26d68baf 942991f9 519dd2e5 7c07e75b bb0e1466 425e2ded 41a2b55f daa164b9
+    2253457d b83cdcbf 7008f8ba fb07ef21 69c4c98c 6dbb1e9d 91ce5687 ba4ff6c2
+    7136d3d4 463db165 49c59686 03638b1d 19a41330 7dee367a 3dd0c8b0 66fc28b6
+    5e8bb886 bf4472d1 0f923ab6 69f3541d 489c206a f0f22006 07a38313 fa8d7da1
+    390d3656 4e14c661 5767c8ac b70d910d d6234f03 399f3814 238c4f7f 8c863ec1
+    2a1e0cc1 da3bf67a 7667f809 8f75f064 b5c305e0 365887c6 75d64fae 9411187c
+    48c46c3f 4a632049 915888e1 4826b96b 0fdf6616 053d1057 bee6e564 1dbfbc27
+    47fb49f0 435e8086 dbe138b5 63fed509 8afb32e0 c787d5ad 9d910ccd 66a32810
+    9a8f389f b5152981 52599990 4afb95bb 81b0b3ca 0670eef7 28a4cee1 f660f059
+    d3657d57 c7c7d972 74f229c5 2bd471f4 47f3
+h = 0d28a911 214d8aa5
+
+k = 0d960f3d 7a2271e8 9edb29e3 89af377f
+m = a7f34614 1fd2bf36 01dce83c 73edbb19 06de9742 54c6810d 4e1d8a1a ab288b28
+    5fd11591 bb93b9de 849d3fd7 f24b1188 28d706fa b40e85f0 d850f428 09564980
+    be6aa23d 87ddd68a 0ed21808 8e8c6860 46ff9fd0 df412a0d 991d6edc df5d5aaf
+    3c608c68 5738b19e 1a90ce2e e51f19c6 f6aa55ca a2179368 cb35f13c 32020ff9
+    cb2d1139 28ec2102 d5029df7 34409b0e 3aeef5e3 06fc4040 130aea6e 22d99dbe
+    d49bc746 ab920c89 b6aa417b 71f0e5d6 2b39b6ec a4f15581 f354d960 e7402a60
+    cc7eb145 f3be3028 d245d583 f1f45a00 d68a58b7 b36846ee 425ccdbd 33c0872c
+    17e27321 c9313cb4 c48c1aff 456ece6c 4cc97592 430b0a32 b60fc5b6 e785fd48
+    ab88c483 bab1a3d9 e928eeae 4a45ceca e859454c 7712bcb4 feeb9e93 98f59c8b
+    a96c0918 2d83f803 2a749b06 a5a7811d 07f5ff4b 432e3474 110cf73b 2740dec9
+    f674f522 eeba832c 159f0fd1 e1059152 be88a62e 7f24fc13 9c7da038 514ecc19
+    db840ac5 2d3f6021 ecff406b 3fe1c676 9834bf3a 437549fc 495f9c8a 0263bd9c
+    9ba2f544 50963d1d 064f36bb 1445a74e de4cf4e4 5b8ce3f1 e256eb38 6c2324b1
+    938ae6b2 5137c30a 5ad62a16 d403417b 77017f97 e121fb56 87360230 dd7c763d
+    d7ebd3fa 83cf66fb b48ec8b0 5eb23499 5c934836 86b841a3 472797e3 b2fbc8f2
+    4287d7b9 f819b3aa f331cc44 f6080f29 9a3ff226 c35ae1ee c908ab3a e68323d3
+    b1c33768 cbe13556 b96edaf8 0369f5f6 4a75b853 3595f3d8 5352ceec f50c09f5
+    dcc0006a e6f58b38 19a532b8 956579b4 5394a043 348e63a4 476ec4c4 fbe86174
+    79abf7de 599143fb b0e19725 7b0e8f12 9ad44c4c 2564c4ff 5c43d9e8 9c5b5921
+    f6de35c6 75114d98 d71ecd08 333dd7d3 6ee69907 f3cb352c 4f90dd1d 9478069f
+    10ce9974 08cfbbd1 f5a856bb 5fe73731 b95c24
+h = 9a367ed2 5488444e
+
+k = ce818e50 414600b1 431b4aa8 0b2413a2
+m = 33be7b1d e23dcb14 a9d4c8ca 65bc80aa d7bcc5db 22e4eab8 e8d50a48 70e54326
+    a6d72faa f28725ab a8f7460d 6f6f40f5 653e81dc 7518713a 8a6126b6 d02cf86e
+    5729498c 4f8216b4 3b99ea6a 8de0f1ab f9a81628 d394f613 1fb8cecc 8d864e77
+    12cc865f 628fbaca cc04c33b af194e32 de2ccc08 ca92fef7 2feb91d2 032f5896
+    d3f0a08f 4e6cc45c b18f5bd0 0bdce47f 96196933 604351fb c40516a9 758de428
+    beae4e2e 9cddf0f4 f7634c54 3b17a154 135679b4 558f3aee 6afa9cfb 44ca3aee
+    cf470224 68861364 744fe211 bc7925f3 08b58aba c409fe6f 18cd40a7 d685e48a
+    5b377c87 aae03d44 f0107cc9 5328f9c1 5e7b20c1 16449c0a 90498163 a92d2345
+    e3af03f1 3ebcfcca da855e46 2a2ec10f 8fdb7d7c 332980d4 7af75466 0489d750
+    6c265bce 3a3b2f1c b609e192 99cd1323 b3836323 bc4dc172 72fbeb61 5f4f404f
+    aec357e6 ecb2640e 6fff6496 06df8390 ea45b673 74376372 ce7d3eb1 7cacb776
+    c57cad58 b7d387f6 58b47379 891b994f 9433528d 8df82908 ff9db519 3dac58c5
+    27a70781 f6a2ecd8 dc1fd2c5 3e25a41e c42ba023 4e09ca37 61f078a7 3908a7d7
+    8939b8f9 31b51365 2501abe9 69771991 b9fc0d27 4e3728d5 74d516f5 c2f381b9
+    b48a0a40 c8af68af 1ddfcb34 a496f966 6953b804 a91d0e6b df4771c4 14c9977f
+    2a527550 dc9991ce d3e3b4cb 761fad9c 97637a71 40da17f2 ec16ce31 438af8b5
+    17e736b7 64329f9c 638b020e e7ff1694 f7cc772f 52ffc27d 509d672c 6a6678de
+    4727d226 457982b3 af4395ce 783e4926 b411dc4f 1365f98b 5cab3b88 62b9794e
+    f295b526 e6b729ec a5311755 4813d369 86f2f6d1 d36f299a 819279fb 1a591182
+    86f0bd4a 386b1ad2 b99b66b3 e2877bf7 0e3029bc 204f7295 c053108b 8cef62ad
+    4a72d42f dbf0d800 ba194526 636757b2 f9c5be13
+h = 4423413b f34712f2
+
+k = 3ee983fe 1814d90e 92b75363 155f066f
+m = 3359b84e 7642b79a dc748cd7 5dc69123 0e17c3d7 f6544fbc 48aa6948 92a9f963
+    c633f971 f6d0fe11 de6ab139 bbf404c9 5a520926 922b965c d370116c afef06cf
+    f320d69d d2493351 9ba5457e 4957c7a5 0dda8884 03f39ee7 ae8ee0e4 3994bfeb
+    ed68ad7b b5fad23e 34900577 72241526 0889e789 41e07563 ce5748ad c9049ace
+    ab1eeb07 6578a524 fde763aa 9858fc69 3a0596f5 424fd812 5e272814 79e96b86
+    63a77eeb bb445ff3 b1d510c3 6584dbe7 3e1d9510 189ffc79 e11b332c f0ac8126
+    f2c76ea7 ae866639 947e5941 1fb319fe 72ba0638 a7bad873 e54f0012 444e2404
+    42500bb8 c9cdb692 fd433e07 034022d9 d50069dc d5b910b1 75f1c1ce 702060de
+    3b4234c8 3d87eb4c 91c97181 a4206369 42e3bdf8 3710590e 1b3fc208 5b2bfd3b
+    225af307 b92f0ac4 30a916c3 6fb40893 873f99c5 062b9b11 edaee092 a98f0bfd
+    626d8329 ffd7b905 2181fe27 07381bb2 067d7885 ce3570b3 4348a1e6 efc10fd4
+    829c3614 41a579b1 7d836d99 e5125973 62e60f3e 0d9f2900 b3af6427 9102a3ab
+    960a165b 38ea6957 94aa51d5 72232d7b 55353bf4 c089a11f f3283e50 c8bd2136
+    7348df7d f94b430a 6266b646 71ea08c7 60c22363 bc427760 1f93f1d7 fd4d1dbd
+    5c4e35d0 5e8afce5 30a166e7 207e86f2 f18e1c4d 89706ffb 237a9e7a a1dd7712
+    643d8b93 5f34c77c 70312798 64464298 a6ae3e6d 65a070cb ab99abec e878cfff
+    7da77f55 e036af57 712079b2 7bb3c1df 03163cea c455f391 a07ace3a bb96c5ca
+    607a6293 2d19cfad e0778d9a 222ab99f 0c89a09f cadc020f 3cb503f7 014c43ad
+    9b2fd0fe 4fdf5c0d 41efbdd5 05660fdd 4e3b1340 bc588a7f 45f2323b c3ee0891
+    150d5204 f0c7edae 08945d9a b5e6ee49 aebd0516 57d4f286 8f90495d 1e5ed8cc
+    92c1cbaa 3c575fdb 55e36e26 cd4e5aff 356a2ffe f7
+h = 0832433a 4f856ff1
+
+k = 31ee871a dc47d09b a310fdc3 a46ca224
+m = 815212ac 60321c18 930aca9a 325827bb 58aa911a e792479a aad8c7fd 05f19032
+    e40106c1 3359ad70 b003ddb7 a40fe54d d5566003 1a46c279 117e65b7 fc2eb10d
+    28d31005 48b177e8 c10c1c00 cea8c24c c656fe31 ee2c4b45 6c55204f 6d24836c
+    cd318cb6 f89eafbb 503e44be 16f02727 6515b2fe 1a03e8cb a80d3e90 5a99eb8e
+    21262842 a3db01eb 01a77528 3928d1c0 c9bbe291 32b417ae 21c68f0b 4405fd35
+    4ce3c606 d8a78fb9 c5bc6066 1e3b9778 37df6f25 b532c914 01c82ebd fae3fd28
+    ef0eeb21 dce222d6 0ec0fe7d fb55e207 5398efc7 df2006b7 b6dbdfa1 8307792c
+    03930e3f ebea6ee2 a064cd77 e9c405e6 0b0d2024 475cc3dd c9f269dc 0efb28d6
+    b7f494b7 3e85b995 08abd79a a04852c0 910165c9 c37ff04e ac2c525f c79f1016
+    c0019889 b81732eb bd1b29fc 182c9820 ef83987a 689010a1 c8914e50 73cc5910
+    21d5d9f9 44599c59 5b90f5fa 6d4b7e43 dddc0c2f 64a74a5b 778d6771 188d1e89
+    16bbaaa8 d8e556bf 0810bec8 0a7cdf43 c919a6eb 1c834113 93acf72a 02a4290a
+    8af9d853 3034449e 839a4319 c2f354f5 8b681b94 41a78029 d6db4aa2 fc615112
+    18b64313 53fa3c9b ecedc3a8 2d2dc87d be0af3c8 6e5498b4 b7f13232 b78de85a
+    538ecaa9 6970161e aa1715b2 40d85c81 07e672ab 7b24fc19 f8f86736 d56f1ad9
+    1b2fef86 1caa691e 26022401 7f6b9a46 ef3d4b13 45f77f20 f390b922 3a510565
+    db7412e1 5d2e9531 03416b6a 10b96a97 6c1e05dd 04f64cf0 cb313966 2126c56a
+    80039c3b 6112677a 004a4aaf a6a2510d 1e9eebe5 44891a8d 9f2aa87e 4d0590fb
+    e7249221 f3eb41ca 1724e8f4 a7312516 e3830805 0c128d6d b9001c9c 6fd3363b
+    cd206bed ee56b89d bce07adf d9bf0219 bcf52bfd 7a1c2fae cca6d46e fdb109bb
+    aae24f40 52ab98a9 f8dd6941 f35edf25 8821321a 87d0
+h = 4870ca79 04517bb6
+
+k = fc2faff7 13a846c0 f80be902 c1d90625
+m = 872a6165 241d3cca f3a6c623 435db630 f6026238 95b84596 fe06dfa2 382fc758
+    9ad0c774 5b28892a 37d2118d a741d716 9394ebcb 04e4c33f c67b41b0 2b109382
+    5b16ad8a 41b9f931 a08aa3e2 bdaa63a0 9aa811f0 d7a0d2ff f816d4ee 23580a9f
+    8b772d4d 689a7a5b 08ee2433 39bedd61 cb78ec07 2b0f4d3e 86c3521a d38f2f50
+    7a62689d b1b36017 25c8fb1a 81b8f76e 4af2159d 9b07b043 6aa8c547 cdc73917
+    e7f49b85 bcb382fb 61c473c8 78e69305 b026b9fd b78dbe9d f8bf8e3d c392f879
+    e459804e f54a5bdd 6fab62de 80ba8eff a18e5113 33042e69 fbe558ab 84010c0d
+    d64a6a7b 30b3d360 299a2e95 620c3d64 00cc7fe2 70a22c93 f3f5fede 021cf3db
+    03cec9fb 022fadca e578c43d 989ea3d5 2f101468 2957cfee f0c45cf9 33e68f02
+    9ded1ed4 e6a00d70 6bb5452a a474f819 465f5c38 fc391354 a5f9b9c9 f2d9d856
+    73c37314 9bdea9b2 f7da57d2 33704f13 79f58547 09d40226 b925b5f8 cf687420
+    875ff9ee 3b869303 d6dcffb7 3238a51e 14a3d1e0 e8c85c0b f22ac491 b72a6fd7
+    93df2462 81f35ea6 e5e10bf1 818c3eee ea2621e0 c849bcfc 7ae5dd87 93384d14
+    d9a9bf31 5f809f34 a15d9a15 aba7b4a4 cfd91f51 c05728ad e7896da4 fa234810
+    7a8231b4 29a30ce8 cf6688b7 62a3ab6d 6abecf72 b9a25c5a c3d4566c 309c13fd
+    0425f175 687a8e4a 93c19851 d9a2be5c d234ace3 a5fec5f9 0d1e4883 978255da
+    ceeea15c a1ead72a 8ac94df2 c9b3a38e a9e4e4a1 0c8e217e 07eee441 c71d69d9
+    5ecb43c1 e1cfe0be a5f9f6d3 80144e84 4ddb2f9e e828200c 2d8c63a5 9d098450
+    bdfb9dc6 a3b557b8 a52265bd 5ad797bc ebe8f5d1 a33323a4 069df12a bee1386e
+    fec608e3 055c483f b2b78131 c5eafc85 ce719411 292b9cf1 0586baf0 a0517f83
+    1562eb44 42493a21 43c7714f 444092e6 02d9378d 38353b
+h = e08474ba 5f7ee515
+
+k = eb95ca75 d4741ade c71359c9 5da2231f
+m = b49c633d 41ccecb8 2c51277e 95d5627a 981fe2d6 9b9f2135 681728f0 79b27de3
+    5b827339 a8ddaa3a 97034e37 ce91877a 140039e0 bd4c9261 ba635ffb 12a7fa13
+    893a3010 43bd4042 75cbdb11 f7b83471 589d456e 2a3ea7f6 381ae3ba 34e0b732
+    22328a7b b3eaa743 89a1bed8 34c4c472 c2704e62 c52c669d f5ef5cb8 6dd06229
+    7a9ece5b 07f72245 fa2843b9 72b89baf 3e4acd66 9e3edb43 d21c0379 2b6338ff
+    e4e9c0c0 df5260c1 97c350dd c2a20235 66dfa416 d53c0a85 57e7b2f1 7f13200a
+    ccc53357 e0135822 e736de29 4abbd3fa cd1f4167 b2335572 349325d6 d4e85c02
+    95c278f8 d0e9c29e 137f5dd6 ff5a24e1 fb1aa0c9 32cce08a 6851d47d 8452cb77
+    bd4ee0a6 186c972a 4be9a155 9ded8acb ace5ee13 59a22cc2 82914c98 d1b3ce67
+    0b7c42c9 d2805bd4 6f59a1ef d3005256 d2db1522 fb7ca588 04d5dd00 1b9ea48a
+    cb32f421 a4cc89bf 5649dfd8 094cf664 dc4e2b3d c8b675b3 1839bda1 6f435d76
+    dc0f6eea e4e481e7 1ee32f14 9b0cd542 d5497f47 6b4120af 48b9a52f df6e33b8
+    94ebb547 423c42fc 35964132 25046321 571a6307 8a1ed6c0 171cc212 ba34a95e
+    dab675fe ba53ae6d d994275b 58aff02d 5881131c 85bc31cd 3ae4830d c814fb52
+    4af9c651 e6332388 bb120193 800a07d2 ba4b8e6d 3ab723d1 dc0fd685 21e2755a
+    b52c1cf5 21275f84 e0702524 b7c346bb 6979bc74 a511651d 8a85e8b2 38b2254a
+    2e864900 d6e363cf ac5b2828 b22b3db9 6a817995 32d5132f 03c4a26a 971dedf1
+    d55d3b4f 23a9578b 21d2ee45 4b7622a8 d7124ca7 264b3088 d9819280 10aadfd1
+    48cf407a 1d15fee5 1dad8e37 58b51575 8e7cf9dd 27c14df3 b22eff5d d196151d
+    12da4d4e bacfdc8a 8885a176 e2fc34bb b4c5dc00 e323d88a 73be6d03 29da3b7e
+    52326887 32f79c05 e88012ab cd9f5ef7 1d49a87e 44ce5811
+h = 5868abc5 15462fef
+
+k = 109fb90e ded90cbb 95106169 9548a8a7
+m = 21777b57 9909b965 12ffbf31 fb065497 cc4d6236 86f89b83 dc855e3b 7cc5ce74
+    e28648ad efcd90e8 81701348 55e6c54a 0e533944 8afc3c5a 81170e35 c28bc345
+    72387eaa 6c26a344 df75307a 9ccf8249 c8d8e390 4507cd73 4f8da191 0392286f
+    cc552c02 d2d76789 db42b8b6 1b545f90 8cb860a0 783ccbc0 6e270e90 c3a55ba2
+    47bfd02f c272659f 9e8f8c6f 0b10deae 11db9fb6 cc2f9727 bf48eff7 14f1c978
+    140cfccd 0a7af724 a8a567a3 da956366 7c7c9401 9f0fc315 0cedb3d7 6ccef275
+    34cf0b37 b151c93c de0e011e 19a55fce 6f67ad03 a8c1777e 31ae79eb 5554fe01
+    4e9fe477 eb6f6c64 0e4131f3 91277ed8 1508c1c2 2f1e9a30 750b7a2a f193a98e
+    2f315d1e 97e0fd57 8c56a9c1 aa7e0a9d 4d1955be cdaf161b 4697396e 6f4d0cb6
+    3a2ecee2 4d574e6e 78dcedf7 059ebf2a 043e3b2b 51501434 b13968ba a15f4b13
+    0da5c211 19189bdb aac9e060 ea4081d4 60eb5900 202b113b c7a201d9 d69faf70
+    c38e0302 48300dab 249d684d ac2cbcf4 a9e596fe 987f6d82 9d0f2025 1a3b95e4
+    4b130bf6 58015ff6 56bfec2b 558f09f9 a6f4bd20 6f3a9c06 a338d4eb 6931f519
+    5556355b 7cdb4002 23dd86dd fb474dae ce839e32 4b4183d9 6c23c0c8 78f50859
+    039a2dfa f5d8b359 f15d1e2b 20ba3de5 14262dfd 398b1469 4671005f 2b0a84f1
+    ed4c1603 31502451 50b833e7 f88edee3 393fd0bd 4022ce7b defb793e 8346514e
+    d577026d e4dee0ac e8f91a33 83852ecf 0a2f8ef0 f0319a58 f6018ddd 9863d307
+    c6b5d936 e692783b e08d6f21 5a52850e 54534cfe d66be065 3a053359 dcd444f5
+    ae1acc0c b0f6ad44 a3a71003 ccbf4022 e9498158 087c0148 14cc1284 7eb19f7b
+    d3067ab8 b376fbff 4fa832fa a7680d71 46e8b207 d9f66369 6ce52a9b e28b0200
+    fef84d9b 96e28e1f e2ff5dc7 fa9e43c9 147fa188 5709c5aa f2
+h = 2b2c9bc6 a26454ee
+
+k = dd3f1fa2 6fd4f9da 27660cba 117217c3
+m = dcaa84b9 c5510345 36881c73 eaa0f686 6f734418 e35673a4 a06bf233 95288d3d
+    eb7b5e4d 7d10e7c0 fe494a56 7eb91b84 667f42f6 b1f8efe4 809d28ea 485cc12c
+    d6c4c91c 5a73214e c92afc12 78b6669e 7448e654 7f365910 845f4768 cf4d4777
+    6aaceb11 2df1e9eb 65f26f34 9863a3b6 67a8127e df488afb 133902f1 06d779a2
+    f91d9df6 8a82e9fe 2c6f40ee 8eff7d3a a6d70596 e7974661 a5a0287d c7de7a71
+    2edfa02a dfd594cd c0182363 6ee88730 6704d6fe aaf0b4f4 7cf7612a 040af528
+    3e519ee8 a74e87d9 0d5341c9 1d915b25 187d1e45 ea2d4ef3 f254748f 7d583c8f
+    deecb0f4 6ebc0c5c 722be737 c72dbefe 9fe24a41 c8a405e6 3f6d2305 53cfad0b
+    cd34fece 1b54b7a8 782bbad6 46ce9b62 965fb72c 1513db17 feba90fc d9dc556f
+    f92fbf9a ffcf9912 c27c261d 7110ab89 6dce1616 46248d4e 893bd0a0 071d08ba
+    7b964650 34ed7e62 a7ef7ebf 077f0485 f28eb244 6cad2c33 60bbec1e c4bd2871
+    17640b87 75cab879 27b7740c 87871b17 23d4f278 1bef7d46 d6f92d4d e3847379
+    3cab1647 d8dd0444 29b0bdc4 69f51045 86e77f9b 0588896d ee9d8634 f8a6a215
+    12bc5cac 1f383122 4b3bb96d 8de0cb64 fd106b5d b8be195e a9c6a979 06abb854
+    dc9413e0 a6b689d9 816919b8 8eaafb5a d4cae7a6 7dc93f63 cf25a739 6042fa54
+    70c837c0 4a56c068 44b10124 56963e11 1d66c50a 6af3fdb7 6204a6eb f626ad19
+    328c52fa dea10493 f6cbc102 488cffec d709a842 8810c161 79429012 840acdbc
+    a213374c 77a37eb9 3809bba1 339f2573 82da3ac1 c41506f2 f9610198 d4816ca4
+    5ac69839 09403502 f1e47b08 8ed1a31b b0a91678 ef3c0368 d507f7ba 5bafa162
+    97b5a8ed 5b975c61 adc8dfbe db7fe702 2acf2117 aa4fa94f 82616955 6a513531
+    8a21daf5 41647964 4ae5feb9 fef3582a 884bd228 96b2a5b5 c940
+h = 38f73aa0 da49d75d
+
+k = 3c34f93c 3d759538 d03a0dfb 0956d97b
+m = 76b3f2fa fa81b60f 892dd8f2 6b1c1f19 44d76b67 82b50ed7 e568e689 8db40a53
+    4dddcd9b f5d3f370 099003fb 6d8e75f4 4daeec18 164ab40c 1fd88eeb 204f378a
+    37bc289a e1445004 c9cd960e 6def3e9c 1d549d26 3b7b6339 e6611d09 4d180c9f
+    195baba8 eb2803dc 5b295417 b8b3adae c7f6b687 5d56b03b baddd38e 5c0abb69
+    0150482d 4f123545 97e9e62c 8e338a2e 929553cb 7599cfe9 1455f6bd 27afc724
+    e1ee3f66 491dbe58 67815458 dda993aa b47a0303 fc71fa3a 1c64977c c18afa37
+    bd3d3f0a 84491989 085e7309 cda02bb6 22c1adaa 26b6fd8f 22a58e79 015a9838
+    52a9f989 06df9407 349e3691 3c9924f6 bcaf93ae 21ae6b26 cc61f210 ac0f89cc
+    b2ce1283 934cfd53 e6d8eb03 666c9fe5 b8ace9af 57b57702 2184e13f 1e7b26d9
+    cca4d449 e6dcf2eb c8a29f26 1e4616d3 1f4234f1 79ce6cc4 9631f36d b8192768
+    f9d63ce5 54c79437 a5474d5d 80b673cb 0a691c2e baa21810 caf0b907 56768bf3
+    f3a71c97 036c4146 caad3ffa ca21c2a0 8df1f6d5 8646b897 89f5d95f 57aa3b31
+    2cb09793 81851474 3cb40d31 2b34be89 8d4d12e3 fed78a12 748fdf4e 6d88d9a3
+    7708cec7 2f66c7f1 f040a635 55edac5f aeb88607 99b797ea 0d230173 2d4a6531
+    71b9a284 f1b624f7 9ddd7bd8 67d88521 c8eb4ff4 c32078a8 2c0ace0f 8730e72b
+    0fd0de04 6fd75b61 40c9333e 55c79929 76e5c2b3 7c0970da 3e2c0441 4e8e9873
+    e56d409a 04ee46f3 3dd11734 f116e38e 3c4fbb13 cdc94ba4 dc7434f9 98b5be31
+    d7914272 fbddd144 9d6dca1b 607bcf0f 03742512 8bbc52d1 5951b105 cab98f82
+    78e34c68 5009be0b 4c0949c4 c71f4abc 98d37ca6 d7a1802c fc5a055d 950b3d1e
+    fe27e52f 6a16fcd4 0cc9339c b9966327 81a27d7f 7ec5dc4b d9d3f2c2 d0fdab47
+    81e5f8f0 c7777245 e7c3c829 67c7cf8b 5fb39032 23733023 2c6072
+h = 1fed5de4 78209d80
+
+k = d9b84b43 15bb25a4 f8b9d846 04b28021
+m = ac2b80f7 7618064f 4f467da4 36793e27 b39a019e 4a08cf10 ff6c706c c2730521
+    03c4e6f4 35536bd4 70445286 5817ce8d 3a540215 4e69d261 604872c9 c1b2b7e6
+    dfba4843 15bf8e26 165382fb 5a24229f aebe825d 7722033c 12badd47 ff16f857
+    632a6fb1 a7f5c6d0 aa13dd6e 53bf16a9 5547742f b92ad0fb 07f5bbfd e16d27f3
+    1f5a665d 23b034f0 82d9e9a7 57259902 3e77dc38 883db0b1 42822f85 47687ee7
+    4a9cebfb ebad1ea9 b60b9847 eb13d66a 5ae5caba 6d2f3f31 52ba5584 fba01e89
+    92aef1f5 1a40dbc5 a431b809 ca054769 8f324aeb df38b9b7 cf268140 5c97c1b5
+    e06760d3 9c870605 8bf40533 bf82277f 9f7bca58 a3d0bb51 04e697cd 6e35c6ac
+    216d5da0 fbc3da30 52986595 1a102294 7fbae716 ae619036 56933164 154215fb
+    461df3d2 0a9fc20d c55c685b e2fe6ab6 9954fc67 3aae14f2 ccb4f51b be3397b7
+    79bcfd6b 00b410d9 6ce97bb4 1fa3ad62 35805537 47ff65e2 bbd16fbd 1bf918f0
+    402a8493 95c4bceb c78e1306 3d2f9cc6 86ac8940 c90316d4 2c30b957 fa87b600
+    e529d863 d0e5cbf2 42bf7ca5 6920e983 eb16d219 8283fda2 5a327d95 3c3970db
+    98c9fa9d fc1a28d4 b99588e2 0e9e359f 3ba8c2fd 4b5b4a8a 35ecf5b0 1ab21318
+    27251725 10466ffa e8c99a34 bc163ccc f35faac5 d39bbf94 589c9d26 72738b91
+    edf29c3c e5347d24 6762b620 fba4b5cf 7c3fc69d 76436834 4b8bc9f3 260f519e
+    bd8ea8ee bf098113 78cc8e23 65df34e6 b6351b86 1b4bb263 9dcf3ba5 c167b215
+    d578fa8c aef7b18e 8e4619ca 5d3455e6 9216f057 abc4c32b 1ac85c4f b0887d09
+    d9242607 079cf859 c257f17e f568d4e5 84e65475 5adc4a64 91cdddeb 857fd2c6
+    32088df6 ff720fcc 2e8b139c d69fa1cd c41eec8e cd2891bd fda6059e 6963763d
+    b17cf91c 906dedb7 0a171bd4 e770a5b5 a1b21137 6cfc010c fcee67a7
+h = b7ffa470 ac9ccac6
+
+k = 4034599a 283108ab be5ed87d 32cca5de
+m = 9f4ec237 82919415 a4497865 cd885c77 d9d40d11 bbc40da0 7459813e b0c62547
+    01583f0e cf569e80 0fac3079 88832737 cd5ffbb2 99b302a5 651e989c d74617c0
+    db337d53 08c30521 33f46793 ef5dd30e 9d53fb27 d000c168 fc1a5d59 cf4ce60b
+    5b318f04 f3e8c55a 7adc8738 024d5f09 13794893 553c2914 0a371e4f 4b12a760
+    23c43f56 3546e680 24c2486d f8105456 9627e1c4 40d83427 2a56fbca 75de8a9f
+    544d1761 284cf253 e777b935 eea0b3e7 fc3adc4e 3873943a 1459f459 a6f36f4f
+    de8bd14b 47b90804 db0d8771 916cef9a a64fb063 f7b03c2e 2bd8a568 b478e4e9
+    418f53e1 e6e6c487 c0cdf0e6 16faf6ba 2dc70333 03f53682 16c69a20 fd82a3a9
+    b6929d47 8e084c7c cf19ce30 67d8c709 f00bb47d 72f54961 8c5d77f7 9d030037
+    13e5fb6a a80cbffc fb6efa4f e185ef05 f4644744 01115b4d c8d09569 90036b0d
+    46b40d75 2196ba09 79716076 2cdf93fe 216f005a 9bd38626 81714d43 4e469225
+    943b498a a2ba592b 942268cd 39c24f31 927f5cb0 b35d6377 b9300a77 022bb364
+    844d3af5 a2c9bd30 59ae1a56 00fd6db4 b2a66896 d4c7df80 d5fe8422 88fdc022
+    f9d7100a f687877c 9d5c44b7 756a1980 ac1d7bd5 5452fd98 f6ff3862 69d7963b
+    a5d3e6bb 1f7e27c7 5a620039 bc1b62b3 71709a07 34bba8d6 d2587336 0b250179
+    1799947d a7ac5645 cafc5635 f48dc055 b5497e95 5e9c73d3 4a3f4f2b 81ae68cc
+    21bbeeb2 05f0b820 c404f8cf 36dd16ef 5eaf3e15 f0059146 b71b849c e1bf30fa
+    5d2cc2da e6e073ce 3b38927c 0bac7bd2 1c340165 f89eab40 d2e1c5e0 00505cd1
+    459f21ff a66b39ec ea50f5e9 ded7c093 f100aa6a 25576545 903ff91f e9cbb21c
+    33bccaab f4ea8fa4 0b92b7cc 9e8fb314 d8280490 8f579ead 62ef0538 4ba1054a
+    4ec6d9ad 88d1662a c83ddce5 ad25c479 cfd9dc34 741c4ebd b75af7fa d6
+h = 1a690e6c 2e8f417b
+
+k = 6ac45405 446f4c9e 39c7569d 118a07c9
+m = df0aac3c f46a89a2 7de4b6dd 114011f5 bb5f273c c873f404 d45209bd 8c3329bc
+    a4e42997 8a3b1d97 1ffdd6df ad142de7 a59dab60 01da1b20 2a7f9d5d e7495c2d
+    3439b0cd a9581f0d 37606d22 08d1a841 b6c57191 d29dc597 89621c58 49fa51d0
+    7c2470cb f17d1f99 0ef72274 abfcecbc d06337e6 a59fece1 f5d3af7a 27e71d96
+    9454f2f3 0866151f efb26419 c4212169 3797b991 df8b87a8 759a406f a9fee34c
+    ab86bde0 510100f3 64acf877 ef70d250 075dc6ea 737feecf 8abf97d4 d86d5aa7
+    154d3ac2 2b870b47 3e7852d7 f96f9442 495971be 4de38bc8 2b1b576a f8ec82fe
+    81c44054 54e1ef94 c3fd556a c5417baf 970aac12 7cfd3419 170d5457 58d732bd
+    4770d313 3a1d5473 d0557a3a 45ccee00 508f4fe0 e1b71a3b a6c6874b 96cb3317
+    48ad7a44 8fd20097 1b65f1fd 097e6920 bbb0c2aa b8fd558c 56b2f36b a2a8df5b
+    51a180e9 2a74371c f33d4e3d ae3ac294 cc0112a2 484e93ad 799af10b 08ebac34
+    278ec230 609ea4f2 580e8fc0 1124d962 25a8d0a7 4c69b978 32c406be 7597a8e3
+    e9829e28 894c0af8 3bfcb9e1 26292736 9150f88b 07cb438b 606a6f5b fa592943
+    7a5495bd 098d9b55 11fa0660 9a56964f bfe91543 531bd177 83370cab 937f6677
+    2e78f0fa 383965cb 3a1f5bf3 9911792d 98003b8a 8962dbfd 7f3f8829 faed0d5b
+    158040ad a1757f59 804b869d ed213035 0209149e 6274af3b 2efd0e18 f14bc079
+    3e5095f4 5a01d2df f7bffde0 281629fe 41017a60 d0cc6f01 311b9e93 a385cd14
+    0e401856 e498b4c5 c18bb803 a84a1a77 ffbc112b a06ce37b 90ea4b0e 74338235
+    85ba0026 82c0d678 da179594 693e93bc d02ec08c 506284ef 1df271ae b631be8c
+    f267bbb4 06a7b4be 5a4d685a 45a2c1d7 9d821d9b 89831dc8 50666049 8153d9ac
+    64693d8e 81bd67cd d87a74b8 5ea846c5 8ddcc592 856c593b 903577f4 c2e6
+h = 53ea9d97 926ea232
+
+k = 55e61974 f9cb1682 68931c54 e10c1ce7
+m = ee0e72cb 45bcf748 999ca7ed 2f4978e9 2e4e0d6f 8088cecf 7c7b553f 7271dd48
+    5de706f1 5f6ee49a 33a5cca4 30150de4 3d32e84f 8c7fb7c1 04104a3f 5c40dd65
+    2814bf9b 08490375 b051b963 e67d292d 4aa71b90 ade28142 632b0989 a09137db
+    b21660a9 43ca594d fdf8f1d8 7a1ca473 c530cc9a 3d7e231e ca35e8b7 7255da12
+    9e56e3fa ad2c4126 025dd616 9f856d16 5bcf45de f1849544 6d6d96e7 3eeee025
+    a4580a91 c470dd45 1634424f 6f4bc995 78e586ad 409ed5ac 8c0565ae 1164ccbc
+    15c039a2 3eb4eb2c ea628db0 1f52fc2b 80c7a699 08f4d955 63b6cd54 1e7bffda
+    ecad7351 83d789b4 fc6acb04 8dda4751 2879c4b5 4043d456 eab0df4a aabd98ca
+    b1e63aee a0cbe0c0 0b3b2a49 48b55286 f1fe4f78 e58b070a e627c9a8 bde2faa7
+    825d9de3 ef044907 789e6cfe 64e580aa e63d119c a0e2a85a 0e1ff1eb 81ffdc68
+    bd448db4 17a6165b 2fe6b794 bdb7eb5d f73deb93 54b97737 137ec472 d2ba5f83
+    fe9a7218 d36d1413 51e33b59 4f8c091e faf9b3b7 a08a9934 b9cb4034 835645a5
+    dbb448d8 f339d41b 94d03b1d a235ab7f b7f1eb91 97cdd80a 0419ef54 01bcaede
+    44669965 c5e3b8f9 af1fdc5a 623dca77 7c04d534 14baafe3 10d6e1a4 478176ff
+    754f834f c0ef8b66 07f9cdc7 43b9c35f 962efd5d 8d8d092e 25e1efa3 aab38a7c
+    3a3cf7d1 821cd430 dc4d25c4 f92f0059 f5de07c8 47ebd406 5ce97605 e51a4252
+    4dae68ee 4d3321f0 6035f5ab 73722e5c c7157ae1 ecb4305b b0535bc5 8ce635bb
+    7782f1c3 e5d77b77 aa390e14 78f04872 79d1eaac e70bb2fc b715f051 40f51610
+    6d6da153 7093c5ee 9995ded3 854d7127 cb177af3 5b8f21e3 35f5b858 2ec5eacf
+    1202a659 6a306b78 1cd9f31c 4dc5b550 ba5c7b01 49e15690 f6b61542 8699c3f2
+    d00d648f d64435ce d16668de 05ba7a49 26c73530 7b32dae1 03ccaba9 b1a29a
+h = 5c0e6eeb f905927b
+
+k = 8768006a 2c9df7fa fe65c993 08c14bf9
+m = 0fc74eb8 7bbe4b6f eb62b876 d08d6cb2 a7e15be8 c23eddaf 34065eac 8ee99ec3
+    73f64eaf ec4990b7 b1f7566f bf5aae76 e704e404 b3f0e620 94ed8705 b7af82ad
+    06530b85 dbaded21 33854f67 df5b3166 305249f9 286723cb f9cbf9b5 53130dcc
+    9a69fb90 0cdd7d2b 748145a8 a2619501 2d871a40 2c07136d 919e9fc6 e033083b
+    ada4f53b da33de6d 95e4e895 0f1451d1 890ff2b4 1e3a294f 4580df32 eb3113ef
+    14b9669d 17022de1 9ec19626 eb4ee8e8 03a5ea80 8a10aa88 2bb61829 a94d614f
+    56a70bc6 80d4cc10 96a6a35e b9617262 785a6818 8bc5d242 5399f32f fc4968aa
+    c4beb168 21a40f35 0b3d6b5e 51e68efb 9a707736 94baff3d a1523916 004c10f9
+    7ec1091f 91d9feeb b2c617f1 aa6742f4 aeb8b7c4 4dc8f882 64db7d70 b0368de1
+    2982a100 9a087419 277695c0 8c743196 9f0daed2 edd0815f def232b2 b0ffcb22
+    4a3d66da c209a563 af61fd16 353ae27e 2f9682e8 fb4595fb a03e8002 1ddac076
+    2e8b2b56 caeb38d0 9f636573 cbf092e1 8f26e530 2ecc6caf 92632430 8b46ab3e
+    e0dfcef5 3660e3b7 4fa072ef 69907461 6392c992 902b3313 7fcf432f 2fc5fddd
+    55d79073 2302eb0e 298c59e0 fdedd28b 6040e64e 656aa53c 7bc953e5 36725b2e
+    0ce655d4 47ed32a0 c361a169 d73b50a6 906be3e7 61f28eef c0172923 443a9e0e
+    f8bee9d3 91a99d26 5f3e5134 d76bff72 e0e91502 846e2d1e 3127de9a fca72d09
+    d0683efb b5648571 394609f6 b337d454 563c832d 6d1c1e22 47ab813c 4c9c59a4
+    fddf5336 1111b512 36505019 bc62c9fa 3b76c98f 9ef41d8e 5ee3fdd3 2ba6b48b
+    6282c8b4 c19cd9b4 9122e180 d587aa4b ccdd9202 8f17b2af 1b55fb04 6a8b5115
+    ca63f27f e1dfc101 fd354687 43c1d623 ae6f057c cb835d0a 02710815 9241df72
+    434831bf 2749d3e5 7f1e33b4 240474da 106ef780 289a5e58 5aaf7f9d e19a0e24
+h = ae30162f 628830b7
+
+k = fa7a6f69 8d50ba58 038302ba 69edb5a7
+m = 6b037b77 440d60f4 20427b57 bc44fe2e 62cdbf9b f6487c5e 80376cec 881d7015
+    c073ce9b 18db7b38 76e7a0a2 cfe98786 735f2393 421ff415 bada0eff bf02c7ca
+    1a157494 8e404c3a d72bd8cc 49ccf3bf a7acf8b7 8489a875 1fde61d0 77861042
+    ae73338b d48245d2 34ee229d bf9cdd57 7d71a44f 33fb513f 5b86e147 0f759c56
+    9a4ef625 7c09b99c 0f4fdb61 66fdb92a ee998139 40c91c26 979f2cdc 8e024c8a
+    3a01f13c 4ad6336d 9d2ca01f 8e584c55 a4911650 1349f193 23457301 cbce5fa5
+    5804b65a adb6fbcb 5b6b3070 6744df9e 94c3ee3c 36161a1d 83f5d7d0 aaa3d436
+    91e023d3 35086cda 0cb1a13e 97955a01 40262765 082ba533 f5422285 e81c50fc
+    1d30ee74 2d70c3fa b1216f68 1db65f43 a0cf5ed7 2309551a aef40b85 65c2b24b
+    dc13db61 6f817157 52da6a02 a5ca1f83 f19c602d b1eba28b 4106d3a2 10b666cd
+    dc346fe8 8f026373 6165089c b3a4354b 2d88b9a8 87550e23 7972bae1 7701e87d
+    e6fd7ffa 0d07b4f1 ae9fcb66 c9ff73c5 2e7f8c37 c7ccbdc2 9e33cbcd 776a6391
+    babc4a31 fc4b16bc 79953c50 14a3e43e be9bbfbe 0d89f50b b5a7dab5 7692c161
+    60f0490c 745aab7f 9396f9e2 1608d0be c01021a5 9858216e 98f9e3d1 c3cb55cc
+    4f74dc16 d7012a55 a7f16dd6 44a21cd6 a6e40416 62783d6c 67c5ee2e 81490b97
+    fcce3444 476dba69 6bd2e494 743ea195 ec8b641c 4a17a5e1 f8aef425 57f2cb97
+    d1872e63 f34b30f1 74e8427a 23e14a7b 620bdad5 e72ed11a 6b80c1e6 434439d4
+    236bcc19 38592e30 47f9b7b7 27fdebf7 1e4b2850 2d875909 412f3748 433d0a83
+    3ce4bebf 5506ed9c 62549599 519f3b9d c6ab75ca aff5f9ad b1b10fbf dc0c5536
+    8386337f 67f5db94 3198e1ea 8a78b13f 89ccf17e 7f1b8810 f6e03769 093ff921
+    a84da3aa 2e18fe2f b2e47add 30c3b837 59c1a67b 65d359e1 d56ff246 ef3ae3dc
+    d0
+h = 21a32cdf 03338bd4
+
+k = eabd97d6 a3473048 3dd463b0 88d78515
+m = 80ef63ba b381217a 9f6bc6b4 21af2e19 16876b26 0b10c4bf 85f70f36 920b5d5c
+    81929b6d 6b712af4 2b1d11ec 2e636648 2f97ec5b 61c61a70 1b5fbbd6 bf77b2cd
+    269da660 606ecb5a 468887f4 021fdc4c f7b62493 cbef2a42 78510be8 ae65a25a
+    b8a5c950 04b57828 083e3080 2d11860b e659fd97 2ccefac3 e9e307ed 29294235
+    f1cae3e0 2204a202 34f08adb 74510630 48a40d63 228d0638 d0c5b6d1 d2e63ca6
+    f11acab3 fd90341b 3740df74 334bfcb4 529c88f3 4e8ba5a6 74fd85a3 d2f72c20
+    50cdc6f8 1d66dfbb fe96fa7f 0ebc3232 94f83561 30e16c23 53b0fd8e 43a6460d
+    aa266e5d fa02dcf4 66d65d87 a6cf9b1f 5b2da0fe 35fd8860 41f7b00c 3caa371f
+    30becc2e deba7a66 15052d26 ed3821bf 18249056 9c9ec0a1 b688b81b a16da1b3
+    1cfa0b62 e5fa4b94 e4eece0c 99f9c7ae 4834a725 9f45d4f4 d1b70229 9abcc7b2
+    4f876c4d 4531790d 1fb0565f 365459ee 03722ff1 623b5e2e 5aad0323 447e44ac
+    14b9b976 ad931e00 c4a475a6 325d6f70 bf667d7f 3d61b140 28fe52aa bf528ad6
+    1b895052 ed9383b2 0621a0ab 49b70761 955b7033 ff6f0aaa d05e70eb 18e7c556
+    56c491fa 7605bb21 74ea2632 0a940e3d fb3d646a 734a9019 901286b9 d5b220fc
+    2c1eca28 efec9450 557bf990 5564b613 153e0b7a d9d2a6be 4ec659b9 51ae2c69
+    d3a4674b 64f8b33c 031aa9be 426141a6 a7f1a40d 75430612 578e2e56 e64c4ab4
+    7c35798b 899784cb ba6dfba6 5ba20914 f7c20ca8 a1bfc9d8 ad9bfba3 9453f871
+    cc9d6368 54b31ba1 49c2a1ed 0c6bf32c cc46dfb5 4cb138af d7ba67bc 1f417fdb
+    bf5ea2a0 8f8b8eea 6d6170c6 548a35d6 fbb40ef8 6933f43a 1b94c645 96f5680f
+    cdbcb4ee bc8ff066 a7511784 f7ce73a7 cbfea4d2 16fed3ec 1d29583d b13f4771
+    0ff4e03c e5eb219e 611aafba 8a8f0458 bb5c69e4 d9d907e0 8a29f2a1 a28aa9e9
+    0a8f
+h = 7bce69fd 9fcaf16c
+
+k = d6cfcbc7 9a33b547 b5a4f514 82f1a62e
+m = b08557ba 788adc68 d649edab 105d8b25 46967815 377eb16c e0e6d45e 8770cb42
+    760a758b 25b97e52 b2da5e9e 468c07d2 ac9d05ee 1e110825 23a034d9 1f11d377
+    82d66bba 398eb531 009a0664 1eb4bac1 ae07b383 6a67742c 75470029 bad765a9
+    6bc9a995 5bda3b33 9058cbc6 bcb99295 851407c8 58d19730 b578b6dc f1a955ac
+    5b96c2ed 4f6455be 5b6a4428 6916c92d f1c573ea 45f73801 1ce25bec a717cd44
+    00537458 7eb0b7d2 f38b56a1 44f89e5d f930e15b fb1d62cc 92d50139 aac970b2
+    22c169ce 5de9d220 b7bd8e79 9f025767 f267b337 9bdd2474 524a0a41 643a1327
+    4bbef19e 86b05956 2533c16b a14c1086 4732fff8 5834c93e b88b30c3 4db1f624
+    b02b720e 2a4f5562 65dedc6a 6fe56606 76666100 a296a8de 5bd08c95 f23a670e
+    2e81baeb a25f226c de18e945 1c0d13f3 d4ab9bb2 632a9fac df52a30d 230962b0
+    e09f31cb eaf50798 7399bcfe aeadacf8 4b7eee30 df0c2287 46da05b8 b3350c92
+    3804daa8 62c27b1f 2279299e 99d6824e 6bd6a6f9 3b4d9875 c49ce9b7 ed89d93b
+    dac452da eeb9fed9 c83fce26 bf254394 7b579c42 6ecfe6d6 b8b89827 49380ac6
+    9cee5b10 bedc71ef 44fa059b fac8a91e ff4ac4f8 0f32e48e 114aae0b 447f4411
+    3932ddb5 be3e6ac3 ffe29c49 dad2e493 ddf161a5 51d7503c be6af0a1 ae7a8408
+    800cd33b bc4c827f 32e894fe 4751e53d 77b92144 3395f4eb cadfd1d6 af8f39b5
+    ad2db234 1a070773 e46202e5 0af78c5f 81a96497 7f0cc77f 58041cf0 6118255c
+    cd579c2c 0878c35e 82224331 bf062a16 4e530cce 9c1ce3b8 9cae785e 95f6ce87
+    83a86741 2dd1aeab f1455ce5 6bf12765 8db4ab1f 5158957d d3d8ec01 e4358ad9
+    64740cd8 7c787b2d d32af9b1 c5e8281d bfe6cbf3 13413505 b6b2d5db 48e74f8d
+    dae57279 287f1cc7 59c59e89 0edfa6e9 650d332c e56a4782 8aec24dd 90e2bf65
+    601050
+h = d514ab63 7e1eaa25
+
+k = 01ccae1b 54b8c82a 34198592 84a74c3f
+m = 0dd3efa6 bfe616a0 b10e5c80 05b54755 429c8617 d9e22a6a 6e6915ed 76d58396
+    ef250dcf 8cc24653 97144cd8 0aee0003 1933ef39 2a9cd7b8 15bfbd35 dadfd485
+    e8a97673 47616f09 cd1317a3 80e327c3 88c58747 1e7fee63 dfe97f42 06368005
+    05dd0d05 840634fc 8ba0b8a1 b1584fb2 5e0160be d34b4def bf5ab1f6 a4eff2fd
+    6a323fa4 b4008db9 c7c84a5e 5e3d656c 7bfdf836 3e4cb4bd 9b83f238 c9d07b49
+    6770d97c 9f0a1207 ebb35a63 0bf841f6 0481cbdd 8c795679 54cfe616 f2412754
+    c65090f3 35948c2d 8ddb7075 4b554ac5 b7006d76 0502fee4 99a7f8b0 72250b7c
+    33bb2604 c3c6b52b 9286be6a fd6be4b2 fb553dc0 e9863e21 b777ef9c 9526109d
+    eb69ece4 bb22d2de c361d307 6e870dd6 19890749 21783f7b 94003595 22a3ee89
+    ddf9f352 6fc24921 8e0299cf 052b23dd 83ac2ce9 aa4fe2a1 7221d1f7 29a42ccc
+    1ec0198a cdc26b35 94f1f566 0a65e9a4 8cf4974b a0d4b8de 953fe236 d5d66749
+    3922d3bc 24e47a7b 7610f9fe 8bd05632 cfced0c9 b7e81e2e 66a0dd16 0318d97c
+    f8a26d1f cee899fb d132d820 417b968a 43d2324a ee3aef5d 56ff93c8 50547ed0
+    6acedcd6 f532b839 b52f5273 30bb4535 95a91ee7 af4835aa e9f88e1d 7d8ddc92
+    6a7ba32b 567203fd c0c61a3c 22609dcc 1d43fd28 57ae2e8c 9d0149bc e0ebeb44
+    e0986b10 1f9cdd75 ddf98d8e c9a7ea41 ab8e5848 012655af 685c38ea 469856d5
+    22e0d3a4 d69a6962 fa0c5a44 a7902d3a c4db7d1f 10d4e660 9389be36 cb420d1c
+    04c8b32f 85f64173 9811aa80 a4b27d20 3e36385f b88d79a0 c92f07bb 8aee4124
+    ecb7a32b 031ee563 0ac8235a d3f1b0b6 7221efa8 afa38554 080efc5d 2d80d9f3
+    d9f1ebb2 6910ea5d 407fe5e0 41a509a5 dc006b43 9c38141f 27d19910 456a2b09
+    85f18eca 72fb4899 5b0bdb22 53b42f95 c49f771a 14d2c470 13aee815 da778271
+    3a3c8be4
+h = ed162e28 0dc1a9b4
+
+k = 3cc36b4f 504c6b13 dfe512ad 6598e617
+m = f10b475e dee2893a a5f95c37 4c9de492 c2e30f07 f72bf132 310bc099 0879efc6
+    200c01f2 ece10886 9dd4ca79 a9b268b5 cdee4b0d e61a64ac ecc67c97 841837c8
+    d99bab54 318f0bf4 baa53575 5197634c 845bff96 7db281a2 589239c7 3b31ebe5
+    a12ea430 0bdff2d2 2b409ee1 7a8fe617 ba54b713 41a321e4 bdb6bdf8 713de34e
+    1ff57c43 8f6917d0 1705065b 9f707fcc f4a98e66 9eb5304a 5f8ed0a0 51d0a30e
+    caf6f593 05051d36 fccf4828 d4d277e8 c6c7d368 6893b54e 60cc09b5 2b2041fe
+    4d84cdf7 5dfd3352 61bc8e05 b4259ec7 ba18087c 240853cd d626a714 97338208
+    ce71a2a4 322eebae c24977d7 a96778b4 018b1070 bcdfc7d9 822c8a79 0cfcb65f
+    0bd9722f 9ec8d9b0 5a14bf3d ca9a1927 67eb849a 4d550a4e c1ff22c3 82a3ff98
+    390da1b7 49189a46 2f66b2e8 86d3ce0d 9929eadf 155ff4f3 5369a2fe 64c2def5
+    ea5884b5 c40ccfbf 96133076 6ce66341 3c788e9a 3c1b0454 db3740a5 b41757fe
+    760a5a17 e7ba50a2 e1f060a6 352ecddd 07b20964 16f320c0 9c59edd1 37e931cf
+    09d154b9 4845c08e dd790c44 a99aac3d 232f830a cb78f704 ea07243f 4910e593
+    322ec3d1 cf2f6abe 260018b9 fae36c4c 72601a57 dbf678a2 9f892e5d af537aa1
+    de825ffd 5a442b79 ebee2976 38fd119c 7422c253 156f695e 371f96aa 1f4667d2
+    722a8a7c 107de22a 45aaabba 46c88634 a18b5b67 ec2f0995 50fb4b2e 04aa5805
+    aa088e02 6abe3015 938ef2f4 b5034609 41f9a03a afb2a832 62e23d65 e3e7766c
+    50fc83c0 21fff4bc 10bb9689 105f782f 68ebc1fd bd8603b8 c8252b4b 698e15b3
+    99cc51cf a6812fb0 f5958289 670be2cd 06aae655 c7b1b17b 25ff2698 8435b215
+    189a4953 34a34fee 073c6ba1 d0555158 05c71b74 6769eb20 58185429 d81c7916
+    f564ff52 5d7e7c9b c9ffc480 b9c3d8fd 3830cccc 78d5d3ad 401ff820 9715c4d6
+    6372b204 80
+h = bf2b08d5 50f06316
+
+k = 51acec90 313ce945 f749aae8 46876fa4
+m = 59a67ebf dc6e3c9e 6d4e1590 e7d1ba8d 58a53eae 5377470d c5c21594 fa7f968e
+    673457d1 c0434cbe 3fdbb7df 7fc22409 e4366c5c a1dc2231 af48c2ac 5edfca5f
+    1adb6a87 005d3734 914173fd becd4c7e 3f3cadb9 cbaf75b8 ed28ca20 3c97df58
+    965b80e4 2cb419bc 284d5f63 c94c5d2d 85e92402 cda5ec02 4ebd7054 c1a64050
+    8231eaf3 9588cfb4 4427188a 92c091e9 a53db5b7 80425f2b 0ef67323 e2dd6753
+    9ed53db7 98689b4d a36b35b4 0865addd 1c1ca86f eca73c19 04c9c087 449dcf4c
+    4aaf0df4 c8e9da41 c7b64740 86f13aed 03d9d2c3 1f290d01 65907f86 1fec3492
+    6c0d117c 3c3b1e72 34750625 0426f5a0 dc99edbe 6dcba7be 112aa30b 83ab4720
+    8be4fdff c7e620df 9277d853 062a5f02 bb06447a 9df343fa 82e6238e 62254dcf
+    1934199a 89c754f3 392637f4 b82b31b0 8fd0a89b d431ab57 6698c3ab 1d6d7f10
+    6ffb881a 0785ef25 42f4feca 86164231 1ffffa31 39aa08c0 1e4dc4b5 3797ba6d
+    92da2352 8dce6844 009f29be 86f0ba56 f7247a29 97f9b5f1 6f5cfee5 eabc39ce
+    c04780ab aefa812b bb0b3241 12eb50e6 2a1bc8f9 fbb79f92 c2f19c0e f406c48f
+    03b0aae9 6df302bd 87d29a58 9e4aa04e c40aaf36 4ad988c5 ba2dd518 3a44dae9
+    a6f7dbfd 73d29793 c0d76186 e37c5d3f b9503c4f 94dd0fe3 15ee96e2 dc12cbc5
+    534e9f47 95efbf9f 29d8b1da 15d21d9d aac9ac76 d5a44fb0 3fc59e57 3830b896
+    5b06046f 5dc33d0c 022604bd a7135c8f ea42d32b 528371a7 cc905924 e4aa669e
+    cc74232e d64e0072 7267b2b6 4e7c43ac 3acae163 998bc270 9443a89b 608a71a2
+    8d167641 7fcf8ecd 9c1a6789 abb71909 5169666f 2d32ce31 16ce1e26 484ba49e
+    6d0ccda8 7fd67fa5 ef2701cc 88245e7c 72137e0b cf791dbf 4f8272af 09a23235
+    44399c85 d6077859 7bc8e12d 5b9e5769 bedc0e4e b7597d6c bc8a9603 d72a5778
+    efccda10 090f
+h = b2b89f04 5e4d3b90
+
+k = ff01d401 303c98e1 9abfd9f7 6fc45ee6
+m = 3cbedd96 36cf6367 ae0349f7 e029c586 76728613 ee1e13ce 3d5b68ed 1bf3bca5
+    7ed6f7bd 32a99879 83079fb4 f0cb1281 bba9eb4a beeddf11 c1b94bae 600186e6
+    0eeadcd8 fd71a724 fead1c39 c3d8adb8 017e2473 198ebbdb 27f453f3 187c3d16
+    1a85e0a0 b555f816 19b49042 741dde4e 528793b8 cacd23a4 4973831d a3da0669
+    e3be3c39 5d98426b 42551f08 00827909 9ea9ad23 d90ff89d 4b978d0c 8098f515
+    b0b812a2 dd2f8c63 77aff981 b71477c1 7b097959 397b40d5 095a55da 29760729
+    c2bf967a 050e7457 5c079022 f536dfaf bdd57d26 33031eeb 3b0de6f7 948f4132
+    42c51c41 3c4c7999 1a3f87fa 35e71090 7c7a5fbd dadc0480 36529323 1378aa1c
+    0954964c 1f966a8c bff8e56c 9b2c11ea d5d0a22f 7b1e37f9 c219a1f9 b0cb5e02
+    c4522e76 4320aff6 8bfa3eef 6cd54fcc 631239de 04686694 2d03eaf6 cfdd2131
+    31e7a644 da761a6d 42346bbb 83094541 1f8825af d2721582 afc481f1 464872ce
+    b77dcdfe e8147ff2 312bc4c9 f11f5003 eab10a32 b8c5c248 598113ac 1ce43be3
+    7b9ef54c cf174987 f37c893b 4322829b 4afdbe42 adf540fe 130462c7 e4c4e262
+    987611f6 e0f4f0bd 13fa9253 e29c0ed6 3d4cbe6b b50474d1 99be3e24 4fd85068
+    1fdef075 ea44d63b e99e99be 4263f1be e4458a4f 74d60052 7f2f839f b7676223
+    9be407c9 aaf4da09 bcae2e8c 1e01dd66 8180082e 68f91c6d 99df055d be767d56
+    39a98b22 bc4dc4eb a5a18352 73cab7b8 23b4c66f 95c0abb5 6e0024c2 eced3329
+    555d453b 05185405 3d93252a 858f5de7 45fe32fc 5a745361 312c0fbd 9931b963
+    1a1d4ef8 6434fe41 eadfd9f7 12a4b5f2 cdf49916 7e2d168e 2a3abd94 dbbe3b74
+    eab35815 8ad88301 871710ea 822ec57a 65dabfb0 e55783f5 a36a8919 626c27f8
+    191324ba 78ea87d8 bac2fb86 63956e72 575b0b09 7ca31edc ebe3a961 55fab735
+    b3975676 00e3fa
+h = 44eca1f9 f9554e62
+
+k = 82aa83b1 448daebb 322875a3 61a64978
+m = eaff0386 0402a9b9 fef647fd 91a35a1d 9cced4b3 4ebb2f67 cef815d2 8a8fadf0
+    3adc6d94 ae8f1dea 26423b35 ca1a1336 0edab609 2e04322a 508c3d77 6e106321
+    9eee5224 441c4ccb 1f7a6db5 88bc4188 ae039510 1791aed1 4d21fe4e 5ce0b445
+    c76aced3 89a7fe52 7838a200 61f4775a 1cf1af03 f69c73ec 22ec2b5a aa5b11a9
+    ad825e13 540756e8 5e3c3f5f e23602b6 403f7443 2abd4177 11b0ccd7 e59414ee
+    88f05304 c8af688b 1dcdc779 3dc717c5 00fd1f0f 0b25e898 b6077571 517154db
+    c74ddd02 ef5e45ca f99ee2ca a38839df 40d7e986 277e6e4a cac4812e dbf2d881
+    a1a74525 188410f5 d2d6c663 ea8dc1cc ee64b4bd 5e6bdc8c ecdbffec 3916c6e2
+    73c10058 6cf52aa3 7f07887b f2bce033 b831f52b 9ccff900 b9f8b12c 7e10ed0f
+    d017925e 5c03e5f1 f4bd3670 b12efb40 f8ba008f 4741ac45 0220b836 8cdfb429
+    de7203cd 88474118 8ad8f634 f10b9ad5 7cd88951 24d385e0 fb24b4d6 c54b91b6
+    8ebd311a 745a62b9 a22cca62 0ccbb3e2 7bee9074 b82cb2ff 5ab7e57e df6235ee
+    9780a997 b2d3816b 3f5a9ffe b38b7cdb 115247aa 9699bf47 fe0bff21 1cf52f12
+    58500d16 39ef8dd8 bcca9b77 6bfd4258 73041bbc ed664363 590ba9b3 d822b87a
+    3dd2d6a8 6b5d1f46 9f6d9732 29fc7a5d 3042543b ee3fe4e3 dc85245b 58905bfe
+    88dc891b 47127b4d 7800ed8b 1bdc2051 7de38dc9 01223934 b03428dd ace38d4f
+    c8618856 ec50394f 6e870f5e 01d6bb11 fa901ec8 ed6bd9bd a055f674 739ead7d
+    ab46a830 8dee1d86 0d146ff1 3dfb7d13 4aebcb81 2acd7724 1ab6a7ee 8aded088
+    970d5532 8d9d4358 1d4935d9 c68d6ae4 fb2624aa 16b6ad69 a33ddf5b e34cc0db
+    ddce3dfe 3673e088 a97e63ba 9e08fba4 c827976f 353dab10 86db1d28 d217c0aa
+    47894dfc caf46cc9 1e31035a 88ab71b1 f3f37b56 60b824ce 960a8ec6 6df79218
+    38594da9 ba42fc36
+h = 0c0ff114 6490968b
+
+k = 400c760f e28278bc 190b7212 a0610dd0
+m = 4aa517cd a9327038 ad8efb85 5334d923 ca4d300e f99482eb e63af88a 4004810e
+    bba2131d 836286d7 fef56f4e aa88dff8 e28534cc 670a2825 572837fa c4b20da7
+    ff30c9bd a07b66e3 4256590d 8c64f372 e377f4fb e01c597c 1d2a5360 57370804
+    2513f819 93f063fe bab468cb 9a1e2731 aae0e822 cfe7e301 c32dd26f 546bf31b
+    d408f49e 208c7733 3bb1be28 ab2ca228 700da6b2 978ee0ec d8096ded a14b9c9f
+    c0519b69 9e98f297 713886fe 22872098 2f617de9 6cfcc8c2 cdc9ba6d f194dece
+    008f56d5 e8bfaf28 960260ed ed9c96d7 6f8662fe 4f3f5e64 386ca8a3 b8b10ce2
+    c0412fbd d91fb902 a3467e29 37dc9821 34a68dfb bc06d61a 8229afc5 1167a3f2
+    c16e40c2 76e97a2f 20964e0e 1a35c8a0 b2f0dfc9 44692c68 e5fe51ec 07de7ee2
+    6c2dbb1c 8bc95e39 0c3174ac 44183801 4b05a560 e7807699 f8fcf134 f00e002f
+    f25cb4ee 6a6f82e4 797bcd26 da378f4a 8699c73a 521e352c ab3d3608 8a925401
+    a36b9d58 dc6a5733 7a7ceb40 3ac5717d feebb202 178ac7b2 7061bff7 5aeb3e98
+    15b2775f 1230f2d0 24bfd756 c65afb44 a0acdbe5 96ed5a23 279638e3 ee6a419d
+    73c3f0b7 0f006950 7f7fa99c c9742846 fbbbdaba acfc03a3 24ee1869 2b7556e4
+    a2e1c134 724d71b5 74c71a9c 5bb06357 447543e8 03392957 d6a72972 886e3e77
+    c1f4d3f2 77c5723d c6fdf3c1 eb23553d 287172e4 6c897b81 9295826c c8b5c2b7
+    b95b29d7 8a2ceb09 21fd8535 ffa5eb80 033d227d 710e42ff d359843f 08c93068
+    905a1b6d 4f95b813 a955d289 30a0cc7e c1855257 c6f3ab5c c5ba1fe1 81c457c3
+    8a3a6f76 8b5312ee b793d6b0 ca087042 75e06b51 0cd15a6d b2ad5347 5d27b70f
+    48f6edfd 3bc1ccd7 02fdb2b6 3a966027 e794fc85 4e1f4d4a 8670359b 90542cb1
+    835b3f92 4b2a2d19 77cc2576 fb7609b9 a7f51e18 df1ec766 7e7f4857 6c110d4f
+    36cf7766 3dbc1523 d0
+h = 50cf7e36 1707c898
+
+k = 86c84fb4 508b0b36 3420eae7 431257e6
+m = 937b9780 747a10c3 60230c3b 32430b43 925e73b7 27ff4fef ce1577b9 f7ac418a
+    c48bbb1e 1827c022 9b7db850 12109a47 72fbe42c 0d8a2c64 a3aa7269 d02964ee
+    dae58ab2 cd44d80e 014a4f16 e8684264 7377644c 38fa7719 1f0222eb 04eb294d
+    85513da7 f09d2b11 f5c25c4e a227590d 510d5139 993a6c57 fda0d41e b846ee50
+    0cc40a32 44c8a567 4ebab606 e3362e1a 568b7d64 5975c6da a8163058 188cb9ad
+    bde650d8 39a8f069 e0ec5726 e66cfbd4 0a826600 27536946 ca8fd772 5ef8a2ce
+    0dca4096 fa9ea080 30c0cd9f 19f4f2b3 2ae66be6 b71099ec 62541169 0a7cc27a
+    9279c709 c732fa93 0f0e9f13 1f1cff07 b9a0a64f 2529e83e 9178d14e cab5c1be
+    c6a5b246 1bf659b1 9a83ebb9 89025b56 2b2af430 37d0bcff bfe9c573 bb1d93d2
+    ff120d38 bb0ab52f 296841b2 6733b702 e8481000 21155590 989409c5 16999acc
+    39232094 3cbab8d6 265c193f 5df1f345 01d422fa e1a92747 7224e196 f25a0415
+    5e9b959c f88fe025 92a111ab dc10b1cc 6c51851c 84f1228a bdd519fb 015bb0df
+    7203a111 e8557d60 f23928ce 6a8a457a 74f27b0d 02c03fd7 fbaed9f5 26d5ada5
+    a8108c35 33b35c88 092db651 5c170e65 a7bacf96 3b2d8ba2 1570a9f4 fc5e1d47
+    6e88a5c4 62fe984d 791bf367 d146aabf 9f7e654f e2cbb514 9f60bd9a 8893c56d
+    2101c156 38054259 1ae94e48 ef78fd7a 2b54e01a 36419395 b8815585 df26215f
+    8543730c 51d2a61a 060d044c 607dbb8a 4c4b75e5 b4d7ec47 e48810dd 9777a43b
+    458e0da1 99b68f49 accde4ac 49b562b6 e99995c4 1c118ee4 528c2132 52e36dd6
+    4f00cc5f a1e0b404 821fe2d0 f1057856 8fa8b411 2451f661 e03cef06 a448400b
+    fcaeff48 e3d04b37 3c301a81 6e541ca5 ec2e8732 a38ab67f d0ef314b 4adca2d7
+    f557fbc7 0f0d1aea 27b1a12d d4c99cd4 3a13487b 5c526e48 bb506e6b 8fbf204a
+    b2e9630a 5d8f45ae 5165
+h = e4d961cc d1540f07
+
+k = cc1f785d 62124f7a a6df714b 2a9a52e0
+m = 77f3ed84 d6553ce9 a9f33fd0 e87ac4fb b6cf42de ebc5ce59 3d5c3dfd bc1c8ad8
+    c45068c4 e2c8b4ba fca8cc7b 439ac91e 5e25b8a0 aa70a363 4eac97e9 d79d5af5
+    ee14e2fd e5bc2439 9cd9b629 3a3fdab1 6ec83ac2 0efa4c8d a87660f7 a49c1688
+    a7094256 94173f5e 7b202f16 2a7fc3bb d1530485 16025994 24d09590 dcb36b1b
+    a00f0f36 5db3f62c 3b8495e9 576eb12c 1d56100e b31c07ac 502bf027 0be09a5e
+    4f52713e c359b9fb 53e03927 539aa7ff 7916552f b6353b17 8bad0668 5ad4815c
+    56db4043 f9a83000 d98e909a a72212b4 064e451f d531b09e 3eec459c 213790a4
+    d6c58201 879f89ae 80761de9 a72e81f0 1a0771d7 dfd51588 4c2e50b0 248dc8af
+    785a0ced b990e9d4 b1d84c66 ffdd27c7 1b697532 cbe2d931 f9427a2e e8000731
+    e795a216 55ea851b b76daf42 dd55e8a7 a024b7ea 3be33a00 80589340 807f945f
+    7592c64d 043e5684 ab728412 9350e7d4 769ae405 c92bef64 09bfd5cd cb592ace
+    1ef1546c 6c5a0f6c 002a13d9 d2518ff9 afbaa3c4 5c104847 5c671102 f407e876
+    a17b486d 4c718ece 0ff9d441 52a4c662 611ae566 2f7b3e93 6972114c 7e4dc014
+    d5fc154e 0e3c1ec2 f7e2b83e 00b09c76 dde362b1 9ad038c5 7176cc3b f374673a
+    c35c0848 042f523d 999cb0e0 f1df7c8b 7fd79b7b 2947e3c4 e2a357da 8d4cfecd
+    a521defd e48e6d8d 10b41cf2 e330ff94 87a96758 6491187f d4098dcf 64a2326c
+    11c0d285 e352f003 43532b17 f6067d55 a114e804 27f900ee d04f0b8b d99677f5
+    72b82043 b6ee22e3 0d3a0ffb 744d001e d6636d18 477ec949 2c5f2b90 08bcafb9
+    40344e94 f6ea3a08 b69466e4 4a7e8521 261d21f5 9a5c5227 31530c58 6b4e496a
+    9fdef3ab 279dcb7b 039626f7 bce68cdf 5779fa14 313bb46e cd19e889 5f5f6476
+    2116bd7b 5a0979c5 80ac3887 9212052c 7377f3c4 3f8e6533 be051244 fdd9114c
+    458e919e 4e8d5d69 fd1299
+h = f8f225e7 f13bdb8d
+
+k = 70c3b1e5 d1f22fd7 ecb1976a 6cac08d8
+m = 5f97c25b 063fdb0c 27f7f521 fddce906 fac42024 77cd42a6 a9cb088b ae44b254
+    ff8634a4 f48cce89 9fa5eb91 6379225b 90206952 13471da6 d7757946 bc647cb7
+    d81a6202 58e4e55c b091b7eb fb7beed6 b5021a4e 427d26d8 dca7e800 dee0c76c
+    99141bed 6a92137d ac62c963 ab76b3bf aa90f29d 4b75777d 07b75413 37bf5196
+    be230b13 330f04b9 36e0b682 454766f1 204377ff 8e90b2d1 2fbc6a5a 815088da
+    36bf212a 86747479 929a9786 a199436c e62e0c56 508c9a2b e8e8bd38 b58a8274
+    15ae131d 24ce0057 dca0dd48 c92e4cc6 57b264fc 3c9fff39 e80da624 4fdc88ea
+    1d12873a 350b0a26 109cfc3c 1f47e0c1 49423f54 2f886924 5d144608 b5f377ad
+    698964ca 2c576426 94ef594b 43bfc2e9 af974b8e 672f3210 e2cb6ec3 a7185431
+    af9064d9 e4caab6b f215f622 677539a8 acfcce01 971174ed 4c4d7ed0 080f74ec
+    4416ce46 2be4845e 0e290a94 a3cef82b 760c2020 af4740f7 30ce7ca7 9651d816
+    75ab1f15 0137050e e922deb4 3ecd3583 d6dde562 8bf68284 b28a69a9 63b598c5
+    ce7c661b fd7c4105 b9501305 56accaac f4b5ce08 bac86d53 c44d737c 0aed578a
+    d1a3bbd4 e0b3ca40 a0548564 b230c794 d2a1f9f4 68fc8710 db60ea7f 52078c48
+    65075390 a05a4333 5326474c 83fe7449 76619a88 4b39182f 8a50d00f f9054fef
+    099f41be fa93ac22 9b3d7470 02439c86 25407bd7 5aafe11a 2e7f8660 42c763bb
+    d43c733d a7f18f7e 350c43cd b9dfd586 76c9169b f47895c4 f5682f2f 2cbe7c9a
+    ba6a0520 6550e1c6 caff7353 852d0817 2f25d6cc 74d0a6e3 c08f58da 2f6fa89c
+    d1c93d27 db9c8767 cd6e30b6 7bdaa7c3 67c83cc3 c5c31e9f 07ee1f38 6f507d6b
+    e71436b0 de26033f 9493a834 e7c15f58 7b312304 85e6f221 1094056e 41998725
+    7dab85e0 841c4775 0ffd9790 48bd131a 6a3a6616 a320c3f7 c4bbad5a 75c47d1b
+    8bc1896b c516aac8 00c0aef1
+h = d1d1caf6 b924a214
+
+k = 54f85c10 885ba573 65921c5c f9087ede
+m = 69b5130f 3d345f56 77bbbe5f b2b82a03 f33bd930 c516c97b fd6e6b6c 2a0402c0
+    b586a7d3 cba5f7a7 d9664901 0856a1dc d3cb8264 f866ad3c 5a8b5e8b 2803773b
+    b0ab5940 864b3430 fb339a58 8e33b1ba c3e1e2da 566e0b1a 59b2f282 f024cd5c
+    cfc4acb2 fcea7a8b 6cf69115 c1bce21d bbbd7365 0144d912 38699bd2 2e6878b6
+    e1946260 d752f88f 0a7b7e03 944c1292 12bac179 f194a73a 69a604d7 48a61f54
+    30770a3c 6454b755 8f1945b7 2efa61fb 5282f4a2 ef68a371 80fdefb7 f31c993b
+    dfdfc541 51628237 1eeb03d9 fa951217 a8b5aaa9 f42ef4ed 17161f82 ed354331
+    0459a2a7 9d8bc6a3 72918e9d 4065fbb4 3f63bde0 1e1c72f1 b31a0641 6973f57b
+    b88c80b1 54cd1406 89858977 763cbbdd 516c048c df7dabef 6ab13892 a1710e6c
+    0344c758 1cd384b9 d6f05ff2 99d4309a 309fb596 e115eccc c873ab74 b7373391
+    94320d16 c3bd70f8 74f0c1a7 c4c1f4ae 699c79a7 b0e92fc4 501e7bd9 bee6887a
+    e7900be2 8eb9c72c e1b5d14f 9415da87 de09e882 f91f6fce f14bd27f 374c936f
+    954986a4 9b5a2ed9 7af3ded1 2f63a6e0 4f59e540 519a8f4b 46591340 e20abcbf
+    60638947 ca0b1ab0 76535b30 1a49c130 f3a78afc 51117bde 882ed25b 41c3a4dc
+    3e7c5c26 89a47a92 15f1a6c8 6f76e011 7283e996 b9db3cb7 a0db1e50 e91dc429
+    e39038ee 26769152 97d3fe77 11ebfb36 18bc15d2 0dabbb4f f2636a5d ccc8a302
+    9cb1c7d7 add5ca83 34d6e3c8 1b357e1b e91e8a47 f2f8ad8d 5308b175 9899b692
+    a8f7d8ec a0a02992 6fc8f964 2305069e 4b5e5596 2c2dbf7e 49164dd0 8a6caee6
+    202aa3d8 aa0eaefd 96b924c8 9d093205 7f7b2b33 7ffc60c3 22e5c4b5 52ffdd97
+    13430919 33f1c33c 7e5bb26f 9d40a282 820da40f cd87d8bf 2d2ce777 51c21a98
+    dccf026d 51266f19 bc8d7ec1 628bf1c6 4b516fdc 879c6f86 45dd10d8 9f8d63d5
+    b2315668 62034d73 0e05540e 77
+h = 23f22b3d 3aca3874
+
+k = e6583c9e ada8ec79 9af9d295 25a20e9d
+m = 5692f0f2 94bedd1b 5e5c1634 378e19ad c843860c 8b7446bb 3e864274 96184705
+    da38b893 6719c0ae 089548cf 5e5e0b18 771a7e9d f17a86d0 4f6223a1 0c032eed
+    0d712195 cd2021d3 4bd3f870 7748c61c 44f030c5 59b80950 ad0a3976 29e4c5f5
+    496b73d8 a850e6d0 f03549fa 24850a88 77cc96ff ee5b7b75 bc0d9ed4 e7acd842
+    545dc615 0855cc65 1fc9f89e ab4cd2fe 5c0f324e 4add537f f5cb6b78 2fca3f90
+    1bbb07dd eeb092de a4b5eca1 e229871b 7c1db421 af1d19da 57964dd2 68f4c4fb
+    58d12c2b 3d6be471 3be1e86b 6b961d04 45ed25eb 2f4da63d b6456614 e0cfb53e
+    da11c418 61e8320c efca201e 98576a6f c7858e32 678a9c12 619bdf1a eacfd355
+    0a904f10 f9586a03 912d312d 920436fd 4edc89c6 d1b01a64 576a6e1b d05453c7
+    30dfa153 84913f7d 6b2b73d0 4c8de3ac 90b48da7 fe8a1c4d f914ced9 354c4c82
+    1d4240a3 6880ccb1 a20e1a22 847e512f 12ea944d 7c7688c7 64922125 ab33015e
+    4600cad4 6a85ff42 06160095 a7d9ad1b 28e3dd42 1d40d37b f680d1da 7747d514
+    b7c1d013 20826b81 b76b5532 4cabef74 982ed59c 1eb45379 0f60fabe 77366ce4
+    1a194e35 13e33ec2 eacec398 3627ef0d e76bf575 d5d3f875 f99f42a8 c72e3da4
+    3d27aec9 f1cbca69 57348a18 d241f9b1 09ebced3 16be6455 7cb28be4 44dd57a7
+    e9c968fc 45953a6f 921cb803 e395eae3 8c5d8b45 fa26b2be dd382881 60619971
+    c0bf8579 6be8ce00 72b0e753 6e6cc5db c4b41984 00515a80 f20ea660 13d527f4
+    b96df427 a2817fef a09d70f2 c4556cc9 3a08111f e03b52a7 f7258395 0a188594
+    87a46d12 55f43569 f0d07b25 86dff1e7 d3206c0e 2f338c86 312d78c7 dadd0edf
+    9e5d79df 388c9599 12075608 4855d536 86eb64df 5dc3573c 37df2e01 c0fb6a2b
+    d12b84a9 315964c3 b3cf3dfc e5f25e87 ccbd05de 05b02fcc 3502f2c8 36b1ad8f
+    c20137d3 919b53bf 5c24f0d7 089f
+h = 3dc24950 5431761c
+
+k = 2beb560d 51ce568d 7acafa2c 18bce4b8
+m = 204ff0f1 0196f496 7e9faf4e ab084a0c 88d467c4 c783f46b 2fc0832e a98d5379
+    d58197f0 6b514341 28fc3d2b 46ce9c27 59e97fe6 d0fd1203 118ed0c5 8fb79be9
+    d4f7bbf6 018f9680 8843eeef e6334326 0bd12c13 46779dcf c551bee3 24e5ebf9
+    c614dfc4 c6a75954 b9740d5e 4c16e3aa 395d6004 8eeac9e6 bb3014e5 26e4c5e1
+    4ef856e8 674b7614 bacc91ed d4133679 84d86e4f 3ae5a3ea 7550e961 c79727a5
+    607b92a1 78e5a479 c894731f e21118a9 eefb62ba f258cd81 743a177a 59b243e2
+    fdb3a38f 7db1a32e e69f0129 3d62ea8b ffcf041b 407101f1 28694504 511fae61
+    3567c83a e55fa512 47133449 2742be13 5da67e37 b82a0c8e 699dbad2 292a0ecf
+    f8f3cee0 8c2af980 123cc498 a624e831 0e1fe4e8 4775e4e9 2ebab195 4cf2bde2
+    198da61f 4a0d61de eb7a4553 91da7d4a 10abd7be f85af208 46501663 f6dc9fac
+    a27448a3 48889457 c0b0a75d 4c9d8f08 a2fb38ec aa6d4cd4 5c5032f7 8e9ae19c
+    a67142b3 f3917bcc f6a7f27a 90ac6f2d fcf4cf8a fcfdb92d 04562cc9 ec55238f
+    a0eb81a9 95c3526e e8ac1927 ff0dd1f6 7e7dff5f e0f5da19 2b26b468 8e26e9cc
+    a832e68c 6649e925 a2f4c1ab b5ba994e 325fac40 10f9eb6d 1662310c 8486eb74
+    dd4c4698 b023d10f c0739ff1 7ca878b4 194c9c35 795269b7 a93bfbfa 670a65c3
+    3d997a39 13ed7369 028b0d23 4c8a47b8 1a08ff0d aed18d9d 0713bf38 6e8288b6
+    4d72449d dcc11697 40afd632 0ad57e48 8182fa88 13ffd4c9 02b6f548 fb7d3d47
+    7c788c3a 64490d58 7b09c118 fcea4dd1 22e55717 d7e9e438 d6bbfe1b abec32ca
+    a2cd3c05 a25d170a 93bc2ffa eab5c291 ab5137a2 cbbfda5a 6bf15452 61dc21b5
+    222561ea d6911f6c 19145a01 9f3f9d94 dc38d476 9eb38740 a416722b 8c8da7a5
+    f2fdc288 eb0049f1 6b18a030 394e0fb2 c731208d 54c1cb05 aa4c35a0 631927c2
+    ca1a9289 8211cc62 e42211cc a044c3
+h = 37f84863 7a67622a
+
+k = 5995f1dc 87cbe178 b1d38aba 443f2798
+m = 32d8e950 4a0b7f03 91915c6a fb4eac99 31d06a62 9b801422 0ce28bfa df1b5063
+    2365b6e1 9ec7e5bc 6b73ee25 4bffafd9 6b6f83b6 b57fc2c5 93d8370f 9c6d0715
+    4ad2ad9e 258e2171 76bcbf52 3f1094ba 604b3bb7 1f8adb91 b6b8ad2a 81ce97e5
+    86d0a775 d7f002b3 7b7e7ff5 f27e31cc 04432876 a9451505 9bad2f57 92bfdd7f
+    25f79d61 e29ff419 f645a8a6 5e17a5c1 0c3e7546 bedec871 cfce9e22 90252624
+    3bd82b0f fa691176 80baac97 29c364d3 6f3457da 0893f0c1 f7ebf05d 7e0409f5
+    d1084aba 821684b6 189f0e8f 811e5150 62798a2f dd7a0c30 9f12d067 795af5c8
+    90e8b18d 929c2108 0f770509 81adb293 7a01610b c2e9c0c3 a91f6d7c 39109568
+    63967341 3a15840c d6e90fe6 f6ede805 078dbd2f 85c9dfa0 1ef0d6c7 80ad84e0
+    f867608d c4b143d5 ee5658e5 d5bd1cd2 1df1fb66 dce7058e 0bab435f 41605abc
+    e0b9d06d c11cc56c 73d3c54f c4c91f1b 3e62543f 0b9d2ded 7cc97e6d 23f98aa8
+    e8ecf791 676c9cea 6cc8876a 2e90a0ab 861eac55 9fe6a700 9c60b858 f428879e
+    978abbe2 4ed90e86 9dc09cea e8c4dcee b2d45f05 912710fe a20dbf28 2c9d2d88
+    93ae9241 7e215f8e 5ba358a9 be0f132b 5dece3ea 39f79688 0ee64339 fe3fb14c
+    aaaf0a95 e74d77a7 03a2a408 ecef5c0b acc5f243 2cb70d9e 8d84558d c84611fb
+    d60e5fff e77022f6 b77215d4 326f042b 22504f12 0b8011a3 cb3481ca be69a9ca
+    6119fb43 0f888100 8989083e 63b95105 66f03964 83678fa1 6cf09255 e0fc7a2b
+    a179b590 6539db8e 80608442 56c3a2c1 fb4b0d8d 77040366 05789d50 81ccc2f7
+    7bda3e1a 675a3912 78065bc6 b5864a85 e8dbf8ca 925d872b eb085567 8b86e8d8
+    972c4627 87493aaa 7ece8e36 282b9933 4b3d61fe 945acd5c 59aafe18 9ca84a64
+    6059f070 b0dc380d 32be5597 ec986b72 b3341dfd 51cf89a8 ed3c8b23 a3f5aa85
+    61e109e1 7d86f69e a7895349 3c64d05c
+h = 0f686a73 0803a859
+
+k = 0eada5fd 236ac83d 97a55d2b 69c23eec
+m = b6e01443 94677e92 1eed121e d2454d65 a4986928 239b79bd 4bb2ef6b 09ac7a96
+    7bbb6606 6b283a0e 92fc1893 cb2a366c 36ffe96c 147a3602 0a987892 59f6ab68
+    8844e408 22afe2b3 5bc80f4c 1598ae7e bc6beb9d 7038e729 5e00a198 52ef8f93
+    a72146a8 83f7fb05 3e4ccfa6 ea8ad03e eb7b8de6 d838cdc3 2362048e 9ffb9068
+    fb4fdbfe 7267f49a f4696a19 6f90262b 1c47dba8 b3045fd6 8fd2b7b5 8ca6696b
+    afd87f4e 3d00488c 38dee1cb 41abcee1 68673f65 b781f75a 89103014 cde5e9e4
+    6f544515 8cdebcf7 6eea965c 3829a82c 14871970 80b00844 177c9746 d1d6f8ce
+    c7ea16e9 104a7589 e5e19cd6 86e314a2 12f0716c aae2b1df 2d4f5bea ad1824b5
+    f4dbee7e 2576ab74 38cab8e0 52b7b007 f13a5c1a d42c7e15 70d80808 04eba406
+    16f92317 24b24513 a2f247d7 9ad204eb f4ac275e 4500f1e2 90a05bea 66ff0dd1
+    2f7e5dbb ce39c982 4af9c301 315892fe 7c0de22d 99951db8 31019566 1b98cd26
+    df7c58e0 72b0c0b3 313f2883 6db6c8d0 577a715e 0e018799 a534638f 31e45ca7
+    11f0eea7 9b15b000 ec674687 3a23bf81 0da2bcfc fe668688 4cf2eb47 b214740d
+    cbd909d7 2fe555f5 fa837610 6b465b7f 785630a2 be3163ce 986c066e 5617f227
+    3ae77c5a d412a8d3 667ef3bc 91e3d5e4 e17d8723 cbb52bc6 b30d20e0 bf274b1a
+    fd5579c4 1d859783 14d996e1 e2207b93 d86da128 bde2be27 20050443 f8e7415f
+    ed973e05 636c89e9 ce428d11 206e95c5 30fb2c73 1b1d6b45 ba07728d 325703b6
+    e5eb73e4 484ef0bb 84aaf904 36e74d48 acd03b6e dad9b1ac e37083fa cfd78918
+    103cb35b fac1d516 820f9d63 9f3f04c6 dca3e58c e3f64c99 e449b5bf 3e4beea3
+    6ec4687f be34487c 8272c012 40d166e9 c0896dba 15356c5b 7eb8d9e4 aa57db18
+    48ccfda6 39f7f764 eb30fc3c 024bbbf7 9446a403 25bbb502 801b0f1f 971f32e4
+    7481b76f c2b03c3e 66c952fe c69eff57 4f
+h = 06362fc3 ac83c0db
+
+k = 232f9bc8 47ea6853 3605ee26 d2149979
+m = 882fd661 ee29c842 a2bdb4ec f60e4edb 83d21519 717cc742 d63f904a 876305ea
+    237db4bc f5ff6810 f305008d 816ed4c3 7cbaa63f 70e21ed6 9cbf32e4 80214dad
+    bcf811e3 ca2c222b 50ac807e 0746dd95 f73af954 1cc633d3 86e3e95f 208ae5f0
+    8739f794 dd161bcc 5565963a a8848168 7f08898a 08bb551c fc6c4ef6 ef5a755c
+    0f4eadf4 7007bfcb bb437d1c 7841fdb7 d106b3cf b0c17661 3cc0987f 53ac1bfc
+    b42e4c36 92cab6f0 0f24c8cd 6f03449a f367955f 08e7b49f 32c8138e 2a7d407b
+    5e42be42 fcc224f6 cf1c7f9d 3001b396 88f7c2f3 148bab38 59b03288 128989df
+    9c442e1d aa865b84 3b3e795c ded3bcdc 389f9e6e 6953f9cc dca25523 967e3230
+    4d120efb f48840dc 3649459e 24725c3b 6161a796 df7dc885 973fb99e 06b108ef
+    ec7c70a1 645078f2 534ea338 0b63d35d 7d01cf14 43bf403e 6e4793ce cc36c5c6
+    c8c52f4c 8ad61487 02fa41a9 4ed0aa6d 95c87c1a a715b27a e8581329 f1ebae19
+    1e4f76ac 6c6d07e2 3a65b1a6 90699aff 139fe546 5b9666f7 8410d035 91417164
+    a6d6408d 3d63d31a 9bee8bad 9949c0cf 8da0e6d6 d1dfe016 88bd55d6 1046d721
+    2d1513b0 8e9eef91 d6ddc9c0 04450940 005ea776 6fa3f180 eb03bc74 f21b9bb2
+    1f1a21a4 3af75d60 8cd0aefd e577c810 28da9868 cf181091 a55852e8 f19c402e
+    21dd7c4a 34495cc3 cf57fb20 45ab9f15 68dbfd36 c560e116 8ca74e35 dd4dc014
+    defcc596 85ce2e0e 72a085dc 5be18273 3e621297 b1d39f5d 825e0924 939fd899
+    107e3b7a 53744a74 b9b44d87 7600e333 829b5af4 af17baf2 a6c0fe40 939e9dc8
+    ca2fad25 ed439765 12bc015c 649f591c 23b1587c 0092918c f7b84b54 ab65a69c
+    c7b128ea 25d03bd3 0bcbb20a e137cbf8 f75806a9 a0f54bc9 f69218d1 c0ec0ba5
+    e80a5a57 699a781c 891a2d87 63b345e1 000bf1a9 f533129b 5485b861 c77c6e1c
+    315d2e8c 61da2ee1 1c6ffc9f 79986b91 5e10
+h = 30696dca 83c3251b
+
+k = 6971ab2a 9533523d 14a02326 bee7c358
+m = 3aafea10 9e2248eb 53b34dcb 2df06d14 13dae332 6d644c89 907a0b84 2589bfd4
+    f81e2230 2fef365f f20e4237 f83d30a6 6bb02bfb 493b8f77 a4fe1da0 e18e0e32
+    100572c8 7392dafe 5c2ffade 55c16953 626bc48d 7cfd420e 2caf7f67 4767d467
+    2920a087 43a16093 e1311b23 73b152a0 55909359 d9ae338b d8e75a2c 0c3ed793
+    ef6de38f fa89f59f 0aedd6c1 5d924a56 2a8aa854 17b0aa30 99d3bca7 b7eedd4a
+    bee839c6 686eba42 7a3903de 62380644 c0b62efc 31f80ff2 69779862 35081873
+    2f57bc71 4a780456 c6e4001b 80459ce8 fba19b10 b181e33b 4c1f4aff 7bbe98e0
+    4e589e38 94f7ccc9 2f0d770f fd36a254 9ed94167 bfa51f94 b92501fa 150d5607
+    72fd7ef6 2c357192 c4a07806 0fc40682 f009d986 9356043a 3ef5f181 a5d0b63c
+    18a895bb 3ecbb91e 7c7cc039 2c0f6a51 161b5779 7db0275d 9071f860 c8cb51bd
+    aef7b9a7 13f0ebbc 7e8eb6d0 c2900099 8310268a bcdb28d1 ce1bbc90 5ca8c336
+    b15feca2 1b7e0171 34b7a76f 19cb9410 49b4017f 398a6f8e 1a869d35 6845b4d9
+    dee0ff6d 8549400b 6837b54e 800860af de5eb794 b04fa10c 75e2d697 053ee103
+    a52fd1a4 34462aef 5ba3f550 bd9cf4b9 17a7033b c408ee23 24f62165 11172af3
+    c0e4e92a 77335147 8bb2f7fb 45176c61 ceae922f 9b96eedc 005260d5 c0504486
+    09126c1c 78b8f407 26bc5f9f 86c24a76 72ca7fd1 de38b2d0 8681c65c 7441476e
+    a0d9c949 d5309b4d 53734dc4 376256ab 42ccf1c8 dcd9ea36 548e2324 07414870
+    a9601914 a5adb53a f1c1f337 ebddc564 9e170829 cfe9db65 5d899f53 50737bfc
+    87f4e08b ad7cd77e 3b3c5cce 821025b8 687414b8 5cbb3e82 28f6d4c5 12f87d5e
+    5b2acde8 8e80a49f 39fa53cf 947c847f a634880f 23843a11 14b369f6 b037f962
+    27e8e89c 94708a1b 382823f6 30479a2f 4ac99b15 7bfec5da c3c3fb32 efd6d53e
+    335d0585 13b117db c24de158 8c953a72 03470c
+h = a917b19a 4ca3d3d6
+
+k = 1b03d7a4 e2a60e6d 2e8e3072 5141dff1
+m = 28dc8b8b ffc1fd1c 721ff874 15a61980 4f715f2d 1977c125 3c4fe6d0 b6a2f367
+    df27add8 6eb94b07 c780544d 50f6c7fc 761a5134 aa2f1474 1deec8d3 222f3159
+    121588c1 21c3babb 481ca545 1206f8a1 2b584236 feee87f6 1b311eb7 2ea1d21a
+    f431f035 a7834a0f 107a04be f7225b9b 3eb99c87 309f9033 a6aa132c c87ebdde
+    883f441f a3751240 48abe9c1 66cdac0b ce2b2abb e845fc2b e3985b41 351e3e73
+    d48662e8 1cb4d3f6 e40780ff 1c09ddbb 5deacc60 9729e608 94e112f2 319f9113
+    6a17179d 9801cfef 5e173fd0 41fe45f4 50b807ba fb6498dc bc6c81c0 04f4814d
+    63bfa6c4 bdb7898d 5f43ea1c fb71b6ec ec79e8dd 6b8c7bf6 0706ccfd 45e7d34f
+    38ecbe39 df8d315a dbca8f09 57b1ba76 e56d0867 b9c4941d 46f9e78f 8f8ae798
+    380fac82 81c87717 83877793 e89b8c2c 4789212a 659250dd c6eb80aa f6a300ce
+    87f58e5c 37cda268 805428f7 9196c8b1 f0bf575f 2b7e9bd2 c937def5 d9d548f6
+    6157fd78 e16b8714 3a3da12c 04b059a3 979c27ec 68f03a57 509d51f6 71812d97
+    72d19c69 bf59f86d 7a69a5c8 da98c42f 4e77573d 71deb957 fcf92cca 6cbfcc24
+    8fa6ebd4 c5255d33 67ce4a29 9205d2cc 8887a578 7bbed2af eb29e346 1f9c92f3
+    afe3f3c7 c5b7aed8 389f4b0a 56bc7dba fee5450a 2234c099 7ace565a 39ed512c
+    501c9ae9 991948da a2b4abfc 767c9d1e ad8f39a6 9f7180dc f372ab8f 49066828
+    50380c9f c77b443d 65d91172 9d08809a 12690d14 a6160c84 1804bb15 a770121a
+    76e2f167 f17c08c0 fd4be078 027e0685 3a0ce471 384ea546 92a917fd a81fc37f
+    ee48baa9 bbf616c1 487b4c30 7f7df9e4 e3111397 a7a58d97 3102510c 566b7bcb
+    a2e2005e e8e41d2a 65b84cc8 46f3a2a7 8dd1d78a 38539a0e 68f84518 4d98a44f
+    214a58b4 16e5ee1b 933fbe67 ad4061ac 86b6b44e 6a3c1538 23c7b803 15a608bf
+    0b12bde6 f7efbf30 7bc3a0cc f61ac168 e2704b73
+h = 242d562e 572c7ad0
+
+k = 32329c3f a8b9215e 640162e1 81339274
+m = 19529ce3 662ec13d 6342f606 c4783107 8e3cb63f a3a92b97 1f55300b 271b3798
+    e4010b9b 7959a359 0dd9e915 d0659e8d 48fd6b9f a08a94dc f38b5f3f 8cf45838
+    0b8dc033 c263f1e7 64bcfb92 3f68aa46 18704cc4 77e4ef1e 125cf1a6 7d7ef9f4
+    e7ab0cad 7f597cd3 e1add1b4 e7e512ca 1de716b5 0e51912b 4555dd09 2ed631da
+    81a0d722 a9ee7e28 b4e121a9 ddae4f8c 02a12a2b 9df7fb31 304f59bd 10fd2eaa
+    4f70aea2 19b46b16 dc8a0584 327bff68 60eda406 7eaf0edf 519fd28b 678229ee
+    0064924c 2a515806 3056f51b 18e144bc b6bf75f0 b5057ef7 31d80701 8f8c691c
+    8a6c698a 16dea364 c75dc724 e6acf01f c0b3bb98 741cefb1 abff59cc 69397a6b
+    3064ded7 a5269658 18c74f5d 712d6c02 09191f28 4cfe3df8 59596ee9 9e2f9380
+    dfb9ed38 bda8cf12 d7d4660e 45d243c2 4c43d5f0 134e0dfc 050d87cc 5f7eaf0e
+    5e511313 54be2378 e1df49ce b99c1940 50c206ca 4be24965 b180cb63 6cbfb7d5
+    fe435dbe 556b8bff 711d4411 e260e5c3 e1ef0d1c fd5d030f d781234d 833e5d29
+    34a95e61 b6fd2cad a1a4b3e4 cc136b5b a78f36ee 37634b24 34f72c62 e6f5e9f0
+    b15740a9 a368107d 79de5df9 dfa16015 5d72dc0b 190cfd22 6a6c10c5 9f7f4a10
+    0de56d9a f4692b19 1a4b8959 55f59f1f 11106136 712b879b dcf6118f 281d4749
+    2efa2d15 6d8328c0 824733d8 c92a4354 72a94e3e b103b744 0842e3f2 0145f998
+    85d7b049 e37d21ad 2a908fd3 20f6a662 63759d9f 0352b608 1919514f fbf5b8cc
+    708fdaf7 de42f882 c6a12cd8 a3aee177 221ca051 5fcf8526 6c7bc513 2a8f833e
+    0ddb05a2 bd386330 f0425574 7b603bec 4f285918 2bccb21d 8026f243 f7fc3531
+    8cb44086 71e134d7 26cf1823 4f6967aa 7631f6f2 8fd94a21 66c7c66e 0ece9e82
+    c96c48c4 38aff9b7 f00f1251 d6e5961c 6f0ea019 acd0a827 5f763110 7f7c4791
+    91764eee d2bccda5 42ac00e6 7cffb315 1a8dc896 56
+h = 0d7cde24 66d6c9a8
+
+k = 13be1d72 e83e5acb f8990db1 40f832ba
+m = cb98545d 8fbfe0ac 4b001e22 359738a9 6156c9fa cfa2336e 87f502fc f1f17a20
+    1c9c7ff3 273662fa cd8de8b7 59ad9a54 efa2cd2b d87c2394 cc5b6b16 bf6df899
+    eb47b317 216d82f3 41970d07 a3a470a5 4a4a98fb ec8d8a78 489039e8 b0c1368e
+    1c0d8650 cb849449 720af89f d2729632 3b46ea06 a518e817 da0999e5 695d0228
+    f6f3454d 1b1d3e6b 5ca155ed 202b68ee ae4e054c 9dbb10a1 e6d2d9c4 0a5de92a
+    84526468 a635b405 90e7c62a 534c64b8 26d3ea4a 2bca5965 55f5b003 d3caa366
+    10b1fba6 1f5eabf2 e7618287 4e1838b7 b1c73eee 7405eece a0e0afa0 da915d4f
+    8d242f0d 7bdae290 90186bed 032e9b74 4a34b194 26b9a5f3 2199528d 22a23284
+    0734d6a6 2cec7262 cdefe7c7 9df1f6e7 16df8d64 7d3da46b 5c05bf26 2c52afbd
+    e7c8bf41 d1d85106 c4445e99 13cda059 dc9bff87 7f3629eb 25e78f04 76eecb76
+    6c8770a4 c094e994 679cc86f 23aaf7e6 5e1484cc ff894d2e 320415c1 330f96db
+    e622eab6 3a4478d7 f7fd4910 1f61cf47 9ca3a763 9b20ccf2 eec3e515 ec96acc7
+    077e98e8 0805ca11 ee56e441 92e58f0d 9214e3cc ec45be63 bfc81f0a 80bfbb1c
+    adeb54a6 9f4cd517 47ef9ed3 8eb1e198 05b031da 239686b5 d549b9f8 083dee9d
+    f4e44145 77a81b38 8731ed01 a7a97ece 9d9d7419 c39b7ef5 644efa50 8de6727b
+    01cc5f58 79043b49 87b2f0fc 26991fcb 875a43ba bc375317 47fc488f 574f35df
+    104174bf 68b41c8e db8e6a9f 68fc6913 b5ce1595 9386c3e9 8f5b4213 0c02c6ba
+    d499033a cb739164 1835ff21 cedbdf19 bbc281f2 de53113b d79a1058 0adb90d5
+    6d7d377f bf91cacf 17cd51a8 95672f3c e3e57cf5 ce3b0444 e20694c4 f42be36f
+    93f6ecc2 5d3f36fe b7420f9d 405fe2b0 f5f57739 4595ed52 b5112af6 68656722
+    00d9cf32 ef2d0196 7d6a6fd7 5f9fc2c1 e8ba310b 03d1bce8 46aea9fc 820d5561
+    e0e1e4a4 47a48bb8 66352d4f 50f07d54 c767ef90 f8a9
+h = e9089a38 a2b7eb85
+
+k = 73830043 81464c90 bcb1da8e d605b622
+m = 9e13c9bd 14f0bc97 4fe4de6d be7ba8ac b2bc265a 9b3ff050 427a2319 4a9e700d
+    e8d4b0d0 80d66ece dcf791f7 dc54c312 54915e23 debdec9c 062a3ec5 5e90581c
+    939b9963 123cf3d3 e8739e98 c1fdbddd 03597baa 7285485f c9067d94 16b84840
+    9fc0e467 e6a9bb23 6afe2b8c a48bfdc5 c285e432 aff262da e8b9d4b5 8b1e6def
+    060c0194 9acbd2d9 d81f532b d68aaaf4 d3e274d4 a2df3502 ecf320ff 168af8da
+    3a05ce6e eed23fed 3108b683 053a6b75 8e69971b 57c06420 37aa314b c961361f
+    2a30c198 90d20e59 8b193f6c 6e27149c 57d2e266 f2325348 c362d70c da8b6bd7
+    fe91ba7c 6fc8a11a 8f26da23 fdd9d5e3 3ef87cca 824d72a7 49f8fcbf 64d74bea
+    325d2e9c cacb2a7a ed091c17 188b6c25 c3b059a9 981980b7 5fbaa8e6 fc4002f3
+    326e6191 68c3885e c05f5837 a81c6b08 0cf4f2ab 476ae241 86954a46 58548c20
+    c251b645 76d8f1b4 e293e5ab 2b1912b9 14d7f8ac d7db91f2 5d0f15cf 8c6b1ed2
+    6fec7036 3e47fc6d fe109a3a 3e107f3f 40fc9e26 ea2575a5 4d09aad7 7a14b8e9
+    25b11d9d a1027c87 9cad26a4 95498907 c9f1a13b 5c022939 3fc3871c 8dc8d800
+    34619b74 6c73bb6c 6226ef50 7e892a53 542334ba fac7d6f5 a34ba4dc ee34b41c
+    35a70606 01996f7b c9129e43 d83c3b1c b62c15d5 42748863 516b97ed 1b10cb81
+    47de8d41 19e3b7a3 01040ba4 3e7705ce a89bb13f cc870622 5babd738 db19affe
+    7686e2d1 571186a7 ec0f76c5 d85593b2 2c2a25f5 45548c92 671139aa 56e02834
+    ea76957b 79fc4c27 fbec7ebd 4dccbaa1 2b8f3011 81258c8f fe231024 b204dcd7
+    825dfb13 c59d96f9 aa88b507 d7d7ab2e c047c34b c353f173 1b460ea4 6e5fc9a8
+    0bda38dd 0d0001d1 6090838c 850c5085 d5c95991 8da44e1a 72240f73 9c07f67c
+    1fe1ec52 ada83f15 3fe7a382 934f7987 8b8205ba c335b6b0 1573aa1b 87f809bb
+    95f39c4d f0598670 9ba0de10 0bb48392 8a5e1d0d c82d75
+h = 7dd707fa c07fdb21
+
+k = 1bb19e45 1bade3fb f46a95ad 73b222f3
+m = c2573924 91287015 bd3e2555 26e9e69b 27a44082 2ff37553 9bed48f1 1be098c5
+    c751ae02 0744ead1 a20de10f 1a2b422f f16c8b59 f401b15f 34dd6ee4 5081d963
+    31a06e49 0947033d ab726073 78a37aa1 bdf2a2e7 b368a73e 7ef8ad59 7f62ce96
+    9f98d9cd a82f7b4e cdc85414 b2871ef3 b9655475 05f729e0 186e9c24 8004692a
+    8f3f344a cd836480 1d08b334 5ef73c8a 6d9cff94 97a576da 294c8c2d d8439611
+    0ab273bc 07630720 bb1a3c66 a53f6328 e901ff1f b68987e0 5f154de2 7a5e2b01
+    a3b86afd dab2bf77 b1c96b29 109caa3b b48fbe25 48483278 0949b413 be30a032
+    01be08f0 8c38f219 4446befa e1639b3b da33206d ea9af58c 318a2cbb bf1054e7
+    192a4d64 25aac8e9 db0f92bc 4c2a8ee6 bc4754ca 98ef0e9e 11aa29f2 33825a53
+    5850dbcf 4b2476fb 14901131 c1746e3d 8950bd9b a8767831 288cfe7a e2767a4b
+    8ab3782f 7aa7c844 b8394c89 e29fb231 4cd2f6b6 9230908d 0c525705 221fcdde
+    93d675fb 26e423ef bdf25739 1c213420 69b8d7ab f2a7b0a2 cc345a12 494344fa
+    7397c1ab c771206c a2bd6552 4bfb1d64 5c08716b 669516fd 962edccf 480bf40f
+    aaba77b8 cb5ef20c 2ab6cee0 4297070a 8d1ba963 715abe42 a89a9746 eb60fc1f
+    69469663 f9f64d16 dbefbca2 ba25cd2a 5866d775 de863a4b 4a35c176 aa41e9b1
+    207606e9 c66b97a7 c4b5728d 4d55f011 3c955e69 017c55a2 f63c439c 340b00fd
+    0c5157b8 14a668c1 22391770 e99cee85 375186be 7a967a19 337a9835 abc3fdb6
+    dde18169 a5c0c905 76cef07f 46517509 26cbc46f cf2c2d5d ff38e0aa 16d50994
+    d324f2d7 978483f4 d0c448e8 8048de79 77e4731b c563304e 070a0b1a eab6e73c
+    dad83d1b 080b5dcd 6b0f2bf2 ecc4d2c1 d194e8b9 3b6bb03f deda96df ee0d00fe
+    ca4a02a4 216a17a7 1fc0caa4 f1e4f7fe 48467c4c aca065ab fceeb5c8 b04a61a7
+    d69c5d53 951fa713 591d3dc8 63938c36 4ad503da 2af6ccc6
+h = bb1b56e5 c4950389
+
+k = acc64cfb 45513fdb 2838e5ba 5e9ed4ec
+m = d708eb17 c8af3bb0 61c13c3c 50b852b2 1dc8a84f 85033fbc 98a5719d e1e29018
+    cb2f4a58 d288cfc0 cb04f480 2e366f62 d66c8316 869d99c4 13ec7079 62358b61
+    e79ce50e 7980f694 af5a3bf8 68f1ecf6 0ff38ebc 13f2d157 61160634 92a9173f
+    a8fec2b1 f7e26265 6d237f79 eb5d9d63 dedd716c 09f7b5b8 632ad456 2f81f1de
+    cb27c553 b7d3f795 f959242b 9bcdff59 f75f685f 56d7c7f7 7673892f 91b698b9
+    ba69cce6 6241c955 b8e6653a 92655e47 c39b4dbb a8b973ba 4d9acec5 0f5c4cbc
+    ca5403c0 6b7bd1e4 76d2e408 d1e9d7c3 4cc38cb0 0646bce6 8b7698b9 caa96d0f
+    949ab04c a8df8b2f 49a1df0e 111691a5 65042308 37b42bb5 42782b1c cc95a1a0
+    5b1e4f05 de80f221 42a22c05 71a72246 37b5c63e 4c3dcd8a 0d77a6a0 b78df678
+    45192f4d 217fa0d0 4f88554d a3136b88 c02af847 ab27969f ab680175 f5f37c9e
+    f99d1f33 a7dbc1f5 9cab28fc fe31f276 45f5c9a5 2aca49af dd148b07 860fe11d
+    4510a718 a6cacfdf b235af10 a564a46f 6c0649e9 48c20e48 8ecd5855 1c96277b
+    7e0d814b 56049ca6 265f4d82 d854f768 3324106a 06ec7280 179ef093 d4f75dfc
+    f207e0f4 6a545edf b0e73efb 96e3582a bddb845c 01864312 741f4e86 81a0d25e
+    7e0a2d59 41ccc8bc 3edf1d42 5d463317 b318d2ef 18ff20be 9b53b07b 7600c3ef
+    1217acbf 285ba443 903ecc1c 92a3b852 46c6321b f9aa7700 2d0be51f 731bc370
+    aa7eb734 5f260d1a 8a5601d8 28defde2 dff7854d e463d49e 55f42145 63b5e889
+    6f53e58f 84cb0535 f1af6c87 7ea5c743 956bd0a0 50cdf678 9c590f29 467605d0
+    bd14687d c27ced7a 58ad9c8c ecbbbf5c 94d88f0f 96897a0b 4de4b8ca a61cc4cf
+    89fa0015 d84cb23b b7acabce 68bd762f 2dbba860 139ab986 2f6023b2 776df4a9
+    fc5f27f7 475abdbc 03d3db0f 22f61485 11c2062c 921164a2 a0a2c154 80169cd3
+    a68bde09 2d2ed709 cbb075cb df5375f7 7c860e75 db22ecda 25
+h = 3244b2ca 9d85ccf3
+
+k = 87799d19 1ebd6dcc 4ada7302 24945274
+m = 6b27e59e 871bf8e2 ef90f9d4 2645dbd4 e288b20a 90dc3f7c dd0b9cbf 6a812cc3
+    d44fcae9 1109dcc9 3d7eee65 79eac0a2 cc51aa75 e65de37b 4dc3e965 f8ae83c1
+    394855c1 1f1559ad a9c623a2 5a8ab350 2677faa9 dab7b314 f4508b4e 76c3ac16
+    dcee0ab6 9a49d10a 623e94ea 7cc45ee8 07b90ef9 0153f470 3e5182f0 a9c6cf47
+    2cccff8b 253604d9 d5b11fd1 c9260c1a 997bc4a9 f27f90e5 35387dbd aece35ee
+    f08cd644 7765e912 4936df8c 2108e7e7 f14e22d9 159e9009 56377818 1d0d103b
+    00f9ae63 71c971c7 449a90c3 682f11ca 38ebfa8b 3c832008 56cd657c 4f9c66d2
+    85ada4d7 95521d9d c64903bb eeaf17ab 98e2452d 55a494ef 87f9acfa 26d20f6d
+    b837fbff f771f73e 35528dbb ae3229df 9b804127 ea040ff9 3f7beb19 c6f3be82
+    03921454 527bc1b5 862b4a0d d00ae637 56b9bae8 926a9577 45df4b29 6521fc63
+    ac213100 8e72f7d7 a25828bf 1a87d949 e7e39215 a8e731b2 9ca4ef21 67cfcede
+    e4b0b080 d6e3ae4f 1f2c24fa 677d32ad 923b71ae e8a088f8 fb47f273 c4841f6d
+    7c2c1053 af6dd6b9 ec2eb90e 2570a41e 060641f8 4f68b9cc b4873807 e58887b0
+    09bd8de1 7c614715 13881482 aa63cf2d 4aa4addd 59455f3a 4e7de3d5 5eada047
+    24ed05a0 46c6d059 88e8bc77 80d514ec ce31f200 f5ceed58 36274bcd 2c7202ae
+    9f97bde7 35c773a5 fab76bc3 a11e33c7 eae8ac6f c3c49a30 4ba1fc82 fe9d544e
+    981e9557 d8dbb24e 870560a4 a5bb1e81 99c0cf52 f05ccf30 294879b5 00d4f1a7
+    dd639da1 5c12b1c2 f7641f7d 06dda90b e4e1c249 29909f61 9a2bfa3d b4810274
+    8d21c609 80078c72 0703e8ce 0ddafa87 bab5fa3f 6717bca5 345252e5 8d2c4aca
+    f2f335e8 de932da8 53a0107c fd832b80 df5115cc d768c987 cd678f9e b2233442
+    4c220695 1661f6f9 84d9429a 98a1a369 66e06fb9 b5522118 7838f6ba d2352900
+    86f5322f e9b2f7c5 1791217c c66153cf 4a0f6b96 7500680c 207c
+h = 9eb1ac63 da46f7a3
+
+k = a169b59e f8aedbd2 9591b0d4 e9e96137
+m = f65fbc8c a5827720 c4733fa1 510e6978 b3ecda72 0e87a656 e01f98a4 87c32edd
+    f430776f 9c03cac2 f6a5d9fc cb7e4db8 5be970ea b04d3c7a ec2e8f65 3e9ad6b4
+    d8db0e05 c0663dcd ead7c746 ea7e7924 e1af9113 dca7d5a3 15b6ca0e 778ed611
+    23b16b49 cc14d001 6e26ca9c 954ecdb0 2a28eab3 a3692242 cd694ca4 84955740
+    31e73d2d c2a7ab92 bdf0bbe4 7149b151 51528b26 30dc7567 d8c9b4f7 9b5bf1f7
+    edd57755 661a2458 4ccafe0b 7c9488a0 1e3fc96c 76c1be1c cedf541e c55d8535
+    ec05b762 811ee585 b83b6ec8 71b8fef0 f2fe72e8 851143da a0a4d0f6 a8a11443
+    41be416f 2497e96c d5d29ae1 7cda189d a25bcc48 c78d4240 6f78665e b3efca49
+    29e057c0 ee336bef ce753309 d815adfe 5c31c5c8 990dc9f0 c4941657 297bb4d6
+    639c426a 1b64cbed 20e5e610 e801df4a bf145e8c ebdb82ad 1dc7ca8a 82bce2ca
+    509a0c1c 4b7d58f9 2bf067fa c0415fe5 78a3d0e7 712a8407 bc8ee282 83a5b1f6
+    eb9880ca c54841c7 5065b303 12eca45b 914dea85 27eff37c 1493c133 1f40ca09
+    1d67a207 38eccfb1 2bf4a0f0 81fbd019 d54d3176 3b850496 e758dfca 104ca998
+    7eedc869 df59fce0 988de8ec 744cf314 ceb5cfe3 a55c0ea8 a82a3304 2a8879ae
+    b1d5b926 e46e9dd7 091c2b52 15b6f5e7 a46666e5 0f695fca 2a892da5 2f801a50
+    5fd96234 3b9492a0 05576204 7f0bd60b 5d58a510 fec4bf95 891e0dd4 84d09e47
+    ac4c6fbe 819163f2 b852e98f 29cbaa16 7f4a58dc 58c8aa1d 2031e30a cffb15e7
+    25720ab7 53a0cdeb 5fb72fd0 5ec3960d 303c734d 2350c409 9b757f8e ca6ce55e
+    90c13c93 b9a3cb76 e9f27e64 f0e2ec89 7c3bdd09 c0285f46 369656ce 50bf2f3f
+    b730f97d a96404a3 8977d44a ea6adb1b 5a04c2ef bc5e7b42 04befc5a 8b7f4bed
+    acfaa026 4c1788c7 746b3008 40787e02 18b2f901 f968bc8b 05327f20 f3adb9e9
+    68fdeee0 8ecfc125 07b7b70b 13647bfa b031c254 1a9b7ac4 e7edc1
+h = 04f65d22 2990b670
+
+k = a7566424 5a6ebc6d 62970dc4 28105520
+m = 9331d3b3 d58df8d5 10987465 2cd8cc0a 039ed403 32339b9a 4aff52c3 c0b33764
+    b20ec512 aed7f590 57f10217 d62c9c3b 33354e55 80df367b b3ac3bf9 c482978d
+    541134ed 07bbce1c e3c57e45 ad58c132 bcb6e3d3 de9415b4 0e6917ae 0ea34db8
+    558c770f 362f8b4f 3b61eb9c ca971754 d4b0291c 66865f9e d5dd1bf1 5f0d4167
+    16919ec3 55ce44a4 17141a8b 21959baa 8a884d07 12c53d67 29101106 a8bab1f2
+    9a8d0355 ff65b019 f84e8bf4 c5104645 1afd2ee7 b51a11eb e1638c32 042753aa
+    227e919c 1de53a2b 9a4ea4e0 5557432f 6a1d0a04 36d2961e 286954e3 15092544
+    e9d2fd76 1f117ad0 0304c0e4 259591ba 6b6c1630 9cbcf71f 9862d8a0 3b725e27
+    ee741a2f 8d3e2df9 0b51fa9d d8c23aad 9de2eb21 e6ae26fa a9d4feb4 7e90350e
+    49ab2732 0160471f fb9415f9 d303f7dd 7ab4a85a a399f28b d9af56bc 92e7c550
+    2c5ed904 4588818c 334fa08e 0b0e1ec1 f72d8e3e aefd3409 751c6115 ec5a4821
+    6ff73c2c 444f5c7f 5346bf10 eba21378 5305b9b2 b1747d06 25aaeebb d131112d
+    46437ce2 68130bed d3c0139d bde9ec3a d14de28a fa53360f cca3af80 d6ea3987
+    db297448 a8ab5868 8b6b72fc 0f6ff591 8a5c8dbe 1b7bfc9a 5cbb7690 95e7c89d
+    a9594c88 66aac465 2f50b178 41cb22ca 93bf7877 22a7e1d9 f803d85e fbf4d990
+    b898b5a1 e89483fc bac99312 96df6f05 8ca2fbd9 0896cabd a9bb05d9 f42943d2
+    c141db20 ba169554 245ee38e 89c73407 89518484 cc899976 435850ca 5f0f5cac
+    56a3d90f 071d611d 035e9da5 c0151181 4351a5bd 33962f87 c484f179 125c3309
+    9c640f8b 14a2a058 31a9f152 5009a841 c75d85f9 dee3ad00 9a68d8a9 fc40abb4
+    b3d5ab57 df1c5339 2f289c38 651cd3a1 3c91dfdb fa99f53a 97e3995e 88cfece7
+    8b99651b 3657c387 7825faf6 e436f12b 23779760 ddbff059 b8321dfc 5eccf6d3
+    2f5955d6 69c2bea9 6ffb187b cf113b62 269f4fdf daf402df 39b553fd
+h = ae14dcad 2e0dd8f7
+
+k = cda280ba a0a33659 1a78dad5 f975c7e4
+m = 5dbd6249 f37b52aa 3a2f848b c5b5fe2c 123c0594 0a0c7e9e c5f1b3e3 f9f17c59
+    4e99d3f5 c95f6c37 fa8d96e5 8016a47a ba02fced b674cb90 289edf4a a103484d
+    b2d98a44 1aba6f91 777555ae 9372bdc0 a2854e42 03317e90 c6737c8a 0e8e4226
+    c8f90132 6295cc0b 9fbe2ee2 08265936 26c501df 63aa4c20 96a5c5a3 a519021f
+    1b99c1d2 ed86e6f4 a621ee2a ce4f0e30 00447812 bdd3acb9 e265b47c df5e6742
+    c1baee98 c87c8592 8f3a9c65 43c50673 31bda482 5c241d52 2b4495e3 dd2b1838
+    4a2cf5f4 f7d0b141 3502247d 44d5427b c1311670 19790fc7 40387ce5 f64f85ff
+    71dbda72 5bf84094 8104ca37 12c594d7 a81c66e8 462903ea e3ab1bd4 c5ec2d02
+    1f9b4d18 54bdb556 85fec44f 78f1c194 4594a892 6fdde0a2 3d55a726 32f1e1a6
+    6f7660ef ab1037b9 10a7a77a c09d7392 e9d39025 c8cd559a 4089890d 7eb4c37d
+    a7934996 c0dcf5ab 71c3364a 5e44d3f1 6ab81f54 3d79408f 76dc380c a4eb2af5
+    68a251bf 40decc2e a3da9172 e44f69a6 a5da5456 9c1d6435 a7093e53 2a49661d
+    c5ab317c a6b67365 7c27324b ffe28601 4e07dc22 6859b188 0de2e18d 730dcdd9
+    5cbb9f7b 34fcdc65 46a59199 4601818e b786e016 163c9aa9 f41944a3 e8447126
+    5d1305f5 99ce5bc1 38419824 f6543667 2141ef8c 59d16b39 4bd5d6f0 8c3e3c83
+    d6c5b4ee 9c2e6001 f566e215 1d8a4e18 9b82b530 0b63fb95 70f09985 0ccce802
+    dbfb0bc5 c7e515d8 f2af6464 486f43fe c7d8a3c0 62c0b9af d8122cc7 91764a68
+    5088e887 26d18fe5 57344234 b63a21b6 b0de8783 23f748d1 8b1a2b69 cbb124fe
+    96da689e 1906824a 6c041e2c adf4ef55 253c9192 3f9030a3 47f2fedc 17cb2e09
+    0a92f874 7513a982 27ae59c6 03f5ba0f d0208d10 b869ed0c 95fb532f b58c20b1
+    285a0a88 f39bcd9a c190dd15 8ae5feca 3e1f871d 0a61e3b5 7e21bd9a 2a4a94c1
+    9310c60f 45b4ce71 3e38e511 9807f859 7c24ae1a 1ec5405b 6e2a44a9 d2
+h = f6472e76 bb71ab84
+
+k = da8000c9 46b16306 cc884191 1b0e44cb
+m = d3364309 1cee263b d5387712 cb2090f0 1029fdb5 1ab68167 80d80c36 f61ac4e2
+    35768855 75420f5f b2be8399 1e748f7d e23c5221 84a9efa3 8b3b4f6e af3d530d
+    8992deca 545b92c7 d7ef5ef2 676ed639 d25cd353 35b1f0ca 122996e4 4887ed8a
+    06c65675 8be7c59f edf5c06d 8a6da5b6 dd5a99e1 fba4a596 6d5bba9e 3b836824
+    245ab6fc 182b8fef 703be8a6 3a8fd76e 2ef607e5 e1d9c871 5901cc94 4a50cf46
+    7adf7949 4b6c6490 05fea235 d234ded2 1c215ca3 444f7ff8 8e1d3b8d 6608a1c9
+    c4439b91 7cdf91ba e9d6d71a 7d541c7d d75bbfe2 266747ba 55c596d5 3f1f48a7
+    380942af 83a7defb 12c2e374 87863a7a cbe186f4 ac030b57 ea8da518 dcf4d9bc
+    57176c68 6c660096 2d64c7bb d9d7fd30 f5560cbd 950d0d64 13b393ba 82018568
+    910283ec 069e49ef 4d80b57c 166ecf1a 62df0746 b5acda10 ae6f7967 75cb1bcc
+    0e0077ee f03fa451 f233e262 e3c96034 221f79f7 49f3f4bf 215a74d5 0472cb63
+    46fda263 0f347b67 e763f972 244d38a4 1ab60c6e 1348ffe8 092f3029 04998a06
+    8ac24aae debf4031 4b157bc1 9509bbba a65e7f07 ec3ec0b1 d1395a4a 58da8552
+    64353f4e 6b23a356 4a81a909 fa85cf56 9763c74b 526008e3 f2aaff60 0ab97f05
+    c009542f b08f38a6 6f5c61fa 7021515f c29c6c01 b5fd6efb 32e2439f 95882a78
+    fafad9cc a32886c0 dd916e6e 8e312f44 175f789b a7311771 7a0146d9 9d23d019
+    80d5d712 7a623def 573bb59c ae546b1a 427553f1 447d0883 1dbf4908 e89f0bdd
+    266d5a88 fb8f80e7 89cdb1b3 72c72ca6 163efc81 c5c7336f aa3df5ce a7dd932a
+    d93715d0 60505aec bf38d8f5 4abe9bd1 2abacc9a c3045c44 323464da 2143b391
+    6c4a6838 e2c5d12c 2f18e9d4 f590ee5a 924730af 14721bf4 3e7dfe9b f5a3e8d1
+    d839f7e9 0afd9876 e7e102ba 7bbfbc08 713986bc 0f261739 cee3845d 52ab120c
+    a45af0f8 2233ea14 2e1c6703 c5bdb7f9 14fe53b4 f669e4bc 836083f6 3258
+h = 1e54402a 8cd3f673
+
+k = 22778f16 c8f71285 bc3753a0 476b0377
+m = 975bfdee 5e959088 add8111e b83ed36c 3930a668 d466ff72 ffdc5666 c2d1868a
+    1b150ef9 335f6d92 253e7885 85de8024 a130907f 173271b2 56ffd32f 70048eb5
+    5985b76b a056e33f 83029675 6259a462 31c986a8 b3c5ba7a 06e6b595 d4f98cad
+    cd57bcc5 98a289f3 4588ec33 c97cad7c 1bc1ddb5 66e51f92 4effda7c e0bb4ab5
+    97dfed47 d46d0885 90b5b683 823f7d0f 10417bef 3a2a59e1 3d4e060c 6badaffa
+    3b50ff85 928d1184 3e5e14b6 54662150 90511ac5 c20fcb6e 74728f20 14116f8e
+    a6f5da4a 3d5a625c b392b590 7eba1a5f 05c17921 a34ff36a 67b8dc93 bc63fcd5
+    409121c6 d9bcef95 a94d4dd3 d992e46f 80d67ff9 98099d76 99af590f 805df790
+    e8903a57 5dfd1bf2 6c60bbe6 c9416f1a a86fdbf1 72155b24 e4cc54b4 b4aa13e5
+    6a4f3517 95258e33 127fc76e 2b1b409c 26d2a25b bb0fa933 7d9fca25 67bf641b
+    380c5de4 9a98be55 2ab68a61 e09ab3d5 71e9b231 8b74c03e 7d084f17 594f6285
+    70df45d7 2fdcb9bc a9727371 1610ed89 7854c69c 471591cd d58218e9 d66088ea
+    cf8e7771 c7bb34ba de1fc48c 873cc71f 0604a779 a7db3a4f 345210ff b5554cc1
+    c3ee6f1b 6a9d1709 81311044 c316a583 049f05c6 6d2e7138 589fcd67 75c64f86
+    098c0fd3 76268d8d 22bd65c7 cbe4ef26 8e402e38 7fa54559 cd08a6b2 c873831a
+    ba159e53 c2e2320b 11ff1ef9 4cd80e3b 824b61d4 79e96046 b386ef69 206039fa
+    e4b80359 2d37d900 923bd13b a128eb64 1563bf3e dce8a4c4 b8b36c55 6b699d00
+    cff48e4f 920897b0 cba0fcbb 534d7264 804ce1d7 d3871a38 c23b8328 580412ef
+    66d94626 c891651f 331d631c cf106498 683fb668 23fcd882 9b747738 7ad913bd
+    12b88c46 80376fb4 c5873402 93c64a16 681e66b3 9dfa88a3 688cc4ae a60f6297
+    f1964f5c 8631f628 ffb49961 0a036441 fe24a0b5 ab5c69ac 4964d70b cc12a1e9
+    f6b979b1 86bfc523 5daa0b98 57d702d5 c1bb4312 e69a9ee2 fd68c6b7 45492a
+h = d5f41488 e8f29506
+
+k = bb9d178a 48a5fbfc ed1e551f 2c7c90cb
+m = cd04618f 674fc539 d84e6daf 16fce631 50054c95 b58d482e 283a7c2f 45017fde
+    63c90f44 409ca605 7b90ddfd 40110df7 ba0a55c5 d9e54dc7 50691f1c dd0d3145
+    0509522f 17e3e8df fc7e6794 31e87d4b 4d7c81df 70279018 02127b4a c5cfbe51
+    d72bcfcf 975d758c 76694328 85fc7039 b9854526 20db3a35 7b7687be f9547722
+    536d23b5 9f974114 52971a83 46230a6c ded10174 31c72a69 67f9eb4d 29f299ad
+    96f330bd 0d2f4473 434a6f3e 0a1e86cd a63dabc5 3de44884 2ec7842b bed418a1
+    d25b1244 d897564a 037dc867 6b4ea4dd bc9cb021 2c73e9b7 0b6e2a90 79b8c206
+    a463554b 990a0314 f95ff1a8 c8d2f46c 6e46b779 f3341968 93a72769 322d3816
+    5196edd2 776327ce db0f4f53 ee227410 3d64c2f0 9e7dc168 86df7992 9754cca1
+    252b9158 e3b3285a 7aba5212 dcb393a9 455d1826 ee9c2142 53d228df ea4d2ca9
+    d716ffbc 44d246ed 02dbdbf6 558e45c9 b483be78 d19fed08 345f383a 0cdb74eb
+    d0edc527 abca9edc e33eb42d f58934a2 a111446c 2b277030 d87e637f f726c340
+    1c7a9360 5cfd18a0 b87f0ab7 c29550e1 e8ba682b fae9f6eb ca98e339 81c6e243
+    1e810478 4d52f053 7d62c677 304a467c 099e5750 5c955a3d e3b85c17 81d42cf4
+    662c2d7a 0e67f7f7 e5a5bc1a 975af3ee 748e1bc7 3b6df9cb 5a435750 14f0e742
+    ae688c4a 9b78372f c35d1f70 f7763076 427bf43a 401c27b2 1b463ffd ba6d2240
+    7b15954e 4b616915 fb715ebd 18927ca6 8c7861bf 37921240 1c845a1f 13394475
+    bc162915 35b8e014 c00af36b 00508e32 b5276c8d 5868381d 67fb2ec1 1c4687e7
+    b01d377e 57a4138f a3e47ccd a3bef60b 61ee1bad db38e8d6 cf8568bd 5c0c38e8
+    f9504726 a56d0641 fe4cf298 e15ee1a2 ac53a3e0 55b38cc4 d795667d 9ee75d90
+    d538abd1 3c8af7ea b22b6b4b c1e681e7 d8d14cfb 0d0e82a0 76201e4c cb00482e
+    1e8f672a 325eb811 aeee0672 47abb2ec 80a4236b bde9cc1c 413c1d79 fd5c44c7
+h = a6d64868 5cb66451
+
+k = 15cbb9e1 3f56fe9b cfe0ecaf d0039c6d
+m = b1b988e2 241220d7 52fecf90 3793f832 dd30e730 25118ed5 b358d63d 6c38fb8d
+    6ccfe40a 9254a123 22d3fc4e c4b9d323 c80dd235 4cffe108 83a603c1 9d6c1e33
+    271f8162 51feeb6b 8e370823 244c97b8 2c19b4c3 0808e518 987f3b34 36ca5922
+    f01a997a 18fc281e 305f768b 4fa2e0eb a24a08aa 0c98b596 bcda97b8 e95f9a39
+    381ad37d b530d014 c3a40e13 8c1af3da 71cd5d24 bc38aecb da449173 b6946d77
+    9a234966 4f948225 80c44a4a 480204ba 1198df2f 2c320c5c 6e35e925 e3a8b45e
+    e823491c 8db0863c fc2eceee db48859c 25e9d23c 8fb3964a e923e4c5 17b31af4
+    f7095661 d7b3012a f6a3f54e 288af417 0b2f1845 3ba3a587 ecd0865f 88b356c0
+    df65268f 8a0169cb 2ffe3108 8db85455 e202f44f 33cb81be 553d7754 1167677b
+    ba12ba65 913a80c5 4388adb9 eafbb05d 6662c5ac 8e44edc0 bc0888ce 3634cbd7
+    5e3153a2 f92547ea ef862097 f7aaa7ae 5bc29b6c aaf4ab54 48e86258 af12cc29
+    c779e243 adb6110a b7536bcd c29d4c76 08710dbc bf9aac74 e5c7d599 79d27662
+    06b6aafc fc635844 cbecb090 038e0cf8 da62d362 994b6d10 950bd76b 12c5c3ab
+    56888f80 0fd239df d2fd39f9 63d02372 91a41d55 320b0d00 10d724ba 444e196c
+    892fc421 7e8f54a0 9ed2eca3 649edf3e 4d2059fc f7ef535a 0d0eaf99 aca6439c
+    9ae14e04 818f252e 1d317f43 9dfbb586 8e0093b8 9b824790 6bcd9ef6 62e4b65b
+    8603967e b210946e d52144e6 59cbd037 ab6a6e05 0c42bb5c c98e907b 371e9622
+    329bbff7 21614f0c 6bbfbef3 f98ad4b8 524ff9fa 0b85f85c 3041cbef 4220559a
+    ef5c920a c593f93f ca5714a6 83269b26 24d57645 a2265b3b 6494bf63 082c11aa
+    6ef0dc2d f5b49c69 27c4ad70 8126093b c6e40c4e 9f3a4204 3c259b5c 255ac6e9
+    20fda4f8 a340d239 0d950d4a 54fc85c1 dfc6f012 59630ff7 68d39779 1ea21aef
+    16c12fba 3350142b e37a7330 42ad855e 5f15f74c a7ef5601 0ab52ee3 3d102208
+    90
+h = 26dc7c6c 26fce85a
+
+k = 6d34432a a901e4db 37b79503 2b999b08
+m = e9753c1c 657c7f55 e70560da c51d3cb1 8ad76797 c3542b40 3737fba9 70dae68c
+    716137f4 87a4e272 de073608 94d842bb 25fde740 33451567 71055545 d53bbe31
+    cc8f8321 bb98f53e 63f81470 4af341c6 05637831 7ae1d7f0 61c786e6 e17ce744
+    56de05cc 5472cdc9 0c5d3373 bfd937de 3d49b174 bd15dcec 35055227 3ed25e7b
+    84faddf5 4f16b15f bb82e5c4 1af2e4ac 6602a0f5 640a34f2 f20b5375 e648c2bd
+    4f9b3e44 68b582c8 395e0f1b 5a20f6fd b3827bb8 1dbf2cdb 8fed5853 fe2c3a8a
+    08c3ce20 1a63b1b5 dc630e2e 40de47a7 aaff9527 16035c53 de25ce39 110c3f4e
+    43c2aeff a4cda624 b91c6a83 50d071a8 a3b91459 5172387e 5e6cdc28 addf6a71
+    88dbe353 3318da27 057547c3 580e0fe9 c890c18d d5b43eb2 567094a4 dc3d6311
+    537a0770 51eabb5a 557c2ba5 e46165ae 4360e54e d87c1c09 1f90bcab a11acfed
+    fafcefbb d49a5fee d34091ef 90278fc9 a19d42a9 c4495d74 eaed6e23 78078fba
+    f2511849 88d229e3 8cfee041 3bfa6a1a ef66c98e 3731b16d b9f40066 ea3e0d24
+    34883a91 d2c6e676 e7a06ccf 171fa758 ebed5382 2a4999d4 efc98acb 62a11029
+    f9fc9829 111b2400 5eff72c3 a4c825ef 77127dbf 520c4958 93351109 4335a7c7
+    d1ad89a6 fb6982aa 9c0a0737 86f52b50 301fa975 03b5f6b4 1987821c adb6b5dd
+    7c9440a6 7a519f77 d6f93464 3a822ad6 a84ee558 a249c97c 96764a7a 9f81c558
+    f8f55da5 65cc4f6c 6c9afc95 2f9035f1 00819c65 1696e03e b2a1c423 c3895db6
+    3fcc50c9 0536ded0 980b1c1f 0e240907 5a48a4ec f91e8c65 f81c1e81 aaaf0360
+    2f21e471 9a5bf40c a3278952 20e93138 56668a55 3bc91a22 9e71c515 9def7893
+    d79c58aa dbf542aa adac132f c765d91b f818a16d d718271f b321c86e a9fa8657
+    bbf47437 fb3d9b90 59e4fb53 3fdc9dc5 2b172540 d85e5e1f 47e493cb 1cea774b
+    c6bb72dd fdfac3d0 f84e0965 047a04ce 0383b1fc 7c6b7235 b05e2671 d3adeedb
+    b64e
+h = 5f3f5198 c987bdd8
+
+k = e3723630 5bc9e132 56442f27 c5af33b4
+m = c9ad578e 4c614e94 6bc7b817 9d35a6cc 4a50d05e 3961f08e 39db5703 405409ee
+    9419f8a1 cfcfa927 f3ccfec3 27a69d82 96f280cf 780509ee aa507e2d 9798a670
+    93826376 b132ba18 89f1a85a d4249cc8 efc873a2 ff7ffd32 fa264581 6a5649ca
+    75cf88db fcfd7064 35675cc7 af6b3c57 6c8299ca 3b7cffba 70d2292a 34cffce0
+    06cb27a5 cb070b50 32269127 08752e77 159a29b5 b1dd2c48 153a524b 57ca3275
+    69b1b04e 4e8463f1 b872dfb4 4930c2e0 16d81864 23d97f69 3cc6272d 35767692
+    0a0a4952 e7e6c731 1439578a 2f97c4a9 6c335f29 7f879cd8 8dd24630 9379759e
+    1e24e883 f65f10d8 f33fcc81 74b88ebb ae1e8250 e0c8b0d5 4c3dd209 4ed18698
+    371c0771 b4892805 76938904 f016de13 6e9fd2ae d0c59f97 8ae47b2d 1d96076e
+    77b0aef7 7b92f2a7 994394b0 cbb5577d 0d0cf16e 81ca6a43 c32fee05 d113990b
+    6259310c 2e5527b3 d0023b04 1a8e30d2 85082249 1b40e674 f66e33b3 e53b99f1
+    234c4d9b 8eb602df 60c7aaec f71b1530 3cb51540 8a2ac74c c2be81b2 f62fea50
+    1e82670e 86796e77 b2c0efd7 2329fc8a 544876db 97ccfee5 23ac0806 18782819
+    ab742fad 66432e19 61cb0548 ec4493d2 48939aff 82157846 49294a7b 0c036d47
+    607d52e9 ed1463f7 c2f8975b e769caeb 1d67d8d5 1cf94b19 f3d64879 8d77c897
+    80cce1d5 3f1f77a7 eb4050f6 44c9e296 8cb909a3 2da62a17 fba6aea8 a63794dd
+    1bdb8618 ef3f9e45 61b3c708 f35dd479 6e7c5010 4626f700 b6cb7d4f 4f75ee68
+    63c3e0a7 8e8ce8c7 9f95e9ce 9db1ab96 9bb4c635 6d74d057 daed174e a12e37f3
+    8e2c6b3a 9cddc700 b93e9f4f 9f82d458 8aeeed6f ba492a70 ea3e26e2 74482f08
+    4ec1ee10 87abf5a4 afae76b2 8902a635 199f9389 9a41d920 110d3eda 3b3c0d0a
+    e62d332d b51f5b06 1ebec916 b7fcf7ea 2d8df146 60dec374 d1c1b192 f3aef6a6
+    2c7d52ff 019fe4c0 acf8c82b 7a0c8fb9 187fc2e1 06ca2469 ab4e9359 32608acc
+    539f85
+h = 600f06c8 ea4a1206
+
+k = abab38ab 9052ff9b 4aa97bf1 9f14d8a4
+m = 88563c6d d10398b2 aa740543 eaa3d17b 06d09b17 c9279ed9 643cf865 9e69a016
+    892d4033 3e2f16bd 71c48c43 c2bc0dad 2b2b5676 4b7f0a7b 1973eb21 5e27e30f
+    50ead580 7b1e305e 0dde1315 6ca3537d 11bd9b67 afd3a432 dd829b70 8aba3f34
+    56808d0a f95df0be 8646bb94 c48e2ec7 5dd19e6d 80c06e40 2defd2b4 2ba15feb
+    9a4423a5 b6f7848c 80e248b1 47c74028 f4f42f99 5dc0ee67 915c2fdd b90a8429
+    cf39f78d 55cf012f cd28fe84 1fcd3665 2218b971 f16571df ca1a3d2c 99b767a9
+    75b28dfb 8ff21a30 f4ab76a2 60ee9a71 ce0e29f6 84c4bac6 54380f96 ee8574ab
+    eb8362ee f1d39c0a 8f96c2eb 7bfe3a34 e9fe7a09 ebc3705c 0e550518 78fbb20e
+    5c05aebb 6860c180 898ea471 740ada8b 0c8181f6 e13ab56e e5ad7cc6 807ff389
+    0a2c71ab ec285036 e898ae3c f953f15f 51c949a0 78edba7d 30c1ef8f bc1ce31a
+    bcff64d3 fd2887be c61aa44c 35b5fddf 2f3faf50 75bebac5 587f264b ad105b11
+    e967a2d4 2c49ed3e 9a42fc92 60c70699 a163f806 6743abf7 f6139c73 5a3f2e16
+    f4c5b563 db904e5c 654a4b0e 6e931614 32d9b529 49099d8c 5052616e 45f501fd
+    4e92f6e1 568ec1a0 44606c91 06e90a44 71e68fea ef19280d b41e865e 08b8a265
+    7d13ae65 2049790e 7cc59d39 9eb1cf1f 025fedef d5392473 9a012f8a 0511e964
+    ec993dfc 3574b643 e89f52fe df18264a 2eeae2af 5b7b0b65 ab2c2d5d fb3862dd
+    b34c7466 d7a152ec 0c3f0506 327708c5 4effaf63 96b24e96 70246244 54706099
+    147d4140 253e68e7 94ebc290 2c4a0c57 90dd4ecc 04f7dfac 63c1a41b 3778cf68
+    2aa0b16f 4065abf6 0e305425 cbebbca6 5dc31c9d c7edcf5d 711bec19 5ad2a6af
+    6582a9b1 ebeb6fa9 d8204608 5927013f ee11be10 9190ae04 b6878b14 c2e8e801
+    89f214d6 a5da81a6 a3b8e692 1c25d261 eda4e1e7 092e917b 359317aa d4ab5733
+    8525c1ea f006b57c 93b8c1de f3206994 d824420f acfb8ba1 213b9c3e 50bde957
+    cf593053
+h = 38e9d9d4 c388cce4
+
+k = ee1b8359 afd09851 75abe89a b6016ed9
+m = fcb6dda6 188612c6 d13369f0 612d280a 3b054c13 b6ce85a3 f0eca481 43206849
+    bdab8f36 c19ba1c9 ecf8968c 0c632c48 9894c15d 72383ff2 19518978 965a7d91
+    33135505 56dddc58 42d741d2 c1b4e98f 857dfcda becdf191 2db96fd6 3e310ab6
+    601e2cfd f0debc56 32f60299 0a3d057f 7f2cb1c7 189d7efe 3bc841b4 52098dec
+    b27f0dae f70d97c9 0c34190b e45af2c1 7a615159 ce461fa3 87202036 a4406126
+    d7eac95c 3aed674c e026a987 76346730 4899f4a8 c01e9464 953a912b 6356d753
+    eb3c7b5c 8dfaf2d9 dc4df175 93d226ba 2da853d1 1088c010 6b433da8 086d617c
+    144be346 feceae96 38193f97 f58f28f2 c372bbd7 e837615e 6ae92597 7f971e67
+    d1bf7f0f 9fdac2b4 8471d43b b3c81f8b 2c332ccd d34a87e1 ee2b6dda 2717784e
+    0f861e32 91506eef 55e4d63d 49a4bc7b b62696ff 2341c84f 345f52b5 3928fbe5
+    dc72dfba 4d37c2c6 331d481d 8fe62a15 9ffe87cc 7fa53f4d e97e5471 9086415b
+    e5ecd4fe 8fc3c119 0785c88e 1d573dc9 447cfeae d26c0b0d a65e04f8 9ddcf48a
+    c12ba10d e6b37e2d 2cd32e52 aa2b02c0 e1a11490 501bb4ba 4f53d9ef 3a04cb76
+    149d4cce 0eb47306 0fe8650d efb51274 be689a31 80f8f820 773aad75 2f1f1d9a
+    4ef306ab 8e2ec73a d1e1a1dc 9934274d 8f84266d 1609c46c 7e9316db a272c806
+    fdac5648 e0b6f72b 319bc890 e44f9274 0d0e0f27 e56e8363 86d9d36b 37d0e04c
+    910e12b7 028ff16f 5cb4e54f bf1d4eb9 39415e31 0ce49a5b f7e1ee32 9d03010a
+    4603d62d 529ae028 0f862704 d86eedba b4f6f055 bc3c0620 79e0449a 622c08f3
+    2d57d8ea 4a9aa954 bf0de75b 25f4db68 6e66e78d b985e772 71e4d014 9790bd0c
+    bcb1db32 836f5aba bd24c766 3f353d29 c047c484 0cb920ed f5395a3a 1c7b373f
+    bae7ebee 53f81cc6 67df35e0 d182918b a3e7b9e4 bb0dff1c cd68c0bf 6fb887d0
+    95bdd769 74bbf2de 265b4d38 afed6663 58c9217f 04348483 aedb7006 c0b965dc
+    6e413486 26
+h = bac43484 b44dacef
+
+k = 0b5e1198 ceab68d9 3c8072a7 490dfc10
+m = c241a0e4 60a50697 37362863 f88eb607 14b7b4b2 65c22234 149110a3 b910a1d3
+    e08fe111 9f8f535c 28f48413 38d35396 b5f4e9ec e7c0ef95 0e11cb2b 078bcf0b
+    50862e4b c7dfa6c2 f44d0d13 1c9d90bd 31467a74 97d06a4c 6d170f0b db20e7ac
+    ee564f44 0b7d1617 4cea25dc 3fcc1053 258d8ac9 d99d8357 50013021 7cba58ed
+    0f6c9fd5 892ddb58 26e6bcfc 3c42679b 8ea6d8ce 9061c8ca d4718d3e 9ab79c3d
+    76dcd50e 87263939 111a80c5 b8a8050d 5678e20e 094598aa a8ee6e4d 3c1b22cb
+    d1ba6dd4 cc9943b7 b316b548 e52b6bf3 de232603 89d15139 1fc62fb0 231af0e9
+    9b37ca56 a83be9ae f73f1350 aa2d9c68 42d0e7ad 53737024 fc599bd8 6c5db5f7
+    9c02a74f 2196f343 91e1868b 86f0a11b 360b67a9 412e8ebd fec2df9a 559735dc
+    4b94a398 21805157 3138b7c8 b657c990 7d0e0bb3 975358d7 2ed94946 128e824e
+    0dce8c94 6b614ac4 06814d44 fdf9c6dc 19a051eb 325f691d 3ec29e20 e0919cdc
+    6b96c2fb ffeffc7b def3fba3 acfbe4ad c3061323 5b2097a8 cfc40da6 e0c3a723
+    4a608738 21d18293 d2bb05af 6712ba62 f4f5a676 614d6f6c 59f88a81 cf2d1076
+    19b335ed ab040118 e1c5d63a 4bd2e594 01134e05 1598426f cad72caf 736658ab
+    162adc27 bf9bcc52 78d9203c ece4290f 026ec6ab 5e11ef6e c570c61f 4ec583cd
+    0a5400b3 e6a1cf8a a7d05844 44773bcb 242803a2 9c8ff0f1 8756b7ef dff68b2d
+    cec8d2e9 5a357479 b543c89c 69c89896 90c50d19 1a50ff98 2bd6a809 7cb7154f
+    d14a8948 db28f1da 8b54922d 2f042f43 92dd3723 5f1f510c 81ce5c93 af2920db
+    8f32f4e9 80a86f89 1b5b8975 51eaffa7 f7cf1679 815f9903 dd28d595 cf2a2d4d
+    937fd2c1 f4c7afe4 54dc026f b20550a1 698a122b 21bcc452 51d8b0d1 782fa6f5
+    3f738328 058c6974 f0412e1d 3c7b09ab 1cc910f6 f4eefac3 0ac3232a 0b33d5ce
+    8c38f337 11fc38a8 7000a078 b9abce68 d076d514 13e81bab 75f4ca73 fa17e18c
+    6ad5396b 0ee8
+h = 08e28f83 b5e15501
+
+k = b3750462 53d28eff 39260458 74adc27c
+m = 562ad04e e07a4d9b 6f503e60 8a04fffb 279f0cb3 2e9b077a d8165fe8 0af6dd3f
+    c8c64820 c31e471a 9b2dff19 969f7b46 e965a8d3 b241999f d9f1bf7e daeac8f0
+    5a9640bc 17f70df7 a8bc5c81 d5e282b5 16aa69f0 dc6c3ac1 ec730b4d bae9fc2b
+    0f942da6 db68d684 22181508 a7020506 a3f29597 f36ee8a2 20203479 58d8ab51
+    e8b371d3 e003b1d7 dbab5759 82107667 1493f9c0 037d761d 34e28c45 6850adef
+    c0c8a299 658447cd e9e0803e 098a2cb1 c7959ded a60b23fe f351c040 64730456
+    a0872a07 180e17bb 04ca0f58 d939a215 75ab23be 9fd199cd bdc8fd2f c38225ca
+    dbef0a5e 78242fa2 f6c149ae f922b489 9b7e63de 1c3ac0ce d6ae2afb 061864f3
+    17971000 7e4236aa 9834d1c6 f41d4546 cab35bec e75eed5a e52ff5d3 66241608
+    b12825e2 7bb8d6df 05a9f98c 19088def bcab3ced 4d9fa30d affca46a 09097491
+    b1abc537 c8cdfe38 d997c63b 52f88146 7cc33d2b bb79aef8 ce51d244 e87717c5
+    a7cd9958 c1eb6896 cdb206a8 7eba8927 80ba32de e6d874b6 fc3d95c8 91ca8428
+    3dacbaec 56859945 30386c47 1783a5c7 1bd0c7a2 425abbcb 64d1a3e4 aa83d172
+    3d38098c 457dd36b bc14e903 d71ba0ac 93322bd2 06d145b3 0b7051e2 17c7ed38
+    27c68221 58a448f7 456bc273 09ee1cf6 bc98ebe0 ba083f82 f740f72f fe3f148a
+    3401eebe 9725f1d9 d32c083f 84b1da21 ae1eb2ba 61c2188b 74884fc0 e4e8b622
+    c9c637a8 a9e58782 dc714f58 b39cd7f3 544fe6b5 1ec5f0fc 36a60e85 1a7abc31
+    c84d33b7 863213e6 77da588a e1733dda 9464bd9e 9c752110 334ae8e5 ec8b65ec
+    1f422646 70df4dbc b252a6a4 a1d20a8e 2049048d 97f53b2a 28a6509c 224ab079
+    49d90bb4 850310af 5a2d1ce3 eb35d2a4 cf1a29e5 f76cfd0f 99d6eac7 46a4fb5e
+    5ed6ccd5 43badcb0 e38cd2a1 ceac26f7 5aac7f77 d7dd815b 20453a3f 887d475e
+    03442bda 6aea043e 8cebc6e2 f6840e19 babf1d34 341d371e b31475a1 07a27829
+    7f3473cd 8a41a9
+h = 606d2ebe c55fb15e
+
+k = 99208dd3 a9dd850d cc992fb6 1c574f9c
+m = 64919ddb da741762 13e09590 45036bf1 ebd36bf5 52018ca8 09389db7 db2a56b5
+    16525d15 cdfb916b 4c2fe3ae 1c3e50bc 69023bca 7b704d53 e9ce8927 382ef770
+    36a2b42b b0afaf52 13b68b8b 545b641e 355f4dd1 e328fb93 76496f2f 71f14737
+    5710d644 f0d9fff8 1eb77330 a9583c48 eadae871 9cd1c23c f7563a0a bc10f878
+    e4bead71 0f79faaf 29b3ea0a a18af31c 15be19a4 3c3bbfea 289aaec2 221eb784
+    9a1e2976 ad8d0e16 cabc136e f5809b81 79a5db54 54b19ca5 44dfd366 a9cc9b84
+    6a9edd53 cbc11115 d02f2628 8e3d3d4d 87bdd1ca 4cd319f0 84dd6649 fd6c31f6
+    85e5b72e d1c1bbb8 764e8ca3 14af1efa da456a0f 3397f9d0 9b08be64 c272b5bc
+    76d565df 1cc0bbaa aede7fa0 c8380448 82b2bd3f b16f4172 fe05ad6b b7be5717
+    895ad2c4 bfcd05b2 4eefcb4d 394fa822 6cb6a7c4 2ccb8d6f dd19358d 6deeefe2
+    8dc10e26 85d1877d c18f4779 f559f3fe 1034b470 db087c32 63d85c4c 8c55d57f
+    22039ada 6942e0dc b5e47147 2f561cf0 2efa5774 49839035 030ce164 0ed28476
+    59c261ef 65695048 e2e7b954 6255d5c4 5c8bee5f 2663b03d 950a7d2b f31e539f
+    b8c960c2 91fdfc9c a6f7e7f0 ede7f003 8d9ed53c 79cdbb7c 8799ccf1 1bef7c97
+    8369f87d 80c8c54d 5a22cb63 632de5aa bae2a2d4 e1345e7b de4c69a9 d9234568
+    bb0a56ff 0dd79fe4 69aa7906 3a13c919 d03b2717 3137e7da 283250a6 243a39fe
+    1e1089e0 82d67165 ad5cbd90 750a02df e05b73d7 bfb2977a 2116ffd7 62b21949
+    9ab4b94f 07eff73d b6912f7e f8fb50d4 ad12231e cef96a26 54533e16 6f943dae
+    aa685c71 17ae9ffb d048db29 708f2aea a6e59d5f 4fbb9306 108ec615 9daed3e6
+    957ce923 c523d216 809c4afd cd8d4178 d8525278 c1aeb041 14417846 139dfe3f
+    81882b32 5b725f88 db42ed2f fd653308 5ed0c3c9 7d4d595f 7ebee31a c26dc291
+    2ac9bb36 8b58d07e 8e391c49 350d5fe7 9a57ba55 1d06a09e 800e8a65 5ee09b1d
+    3712140b 6a98194e
+h = 41cc8130 e87c4f9a
+
+k = dca142dc 7e23cab3 5f7165ab 8d2741c4
+m = fa4f49df 3bc8680d 0a219905 acdc4d04 783c3e04 c1faf5ae ff62b2c5 a16d5e7d
+    3657f1b1 e1c3f251 35e85201 eb0d766a 0c7cc1bd 8979f643 e05c8fa4 99f4678c
+    b51e556a 340a568e 8a23b4da ed9b0567 ab56a84b 100f57ec c15b4b9a 1ad0336a
+    21b5a643 3a5b3219 60976c4b ff3bc821 2de28407 3486a61d 8776c933 02b35915
+    f7f5f17f 34af557d 0a7d0cdb 416486da 60e91486 5118101c 2bcbd4b6 eb91eb42
+    6608440e 7a4e825c bf074a16 d347ee98 223969f1 4f829271 602caf6b 99d4f2db
+    d1eba020 3984925e aab807e9 71189900 1aead584 c19c9a04 fcbafadc de347bfa
+    2ee10d4f b8bfa9a9 dce2529e af6d0a4c 1b9f5433 9ec7abde 4caff9ba 6445ecc7
+    de73f8e6 0dbaffdf e02336eb b6b89d20 00ad5e23 15a1c550 f948e652 caacba5b
+    e912d818 4247d35a 608ad5fb 460f33db 75ef3242 5a22db64 727f70fc dc80621b
+    b8d7d230 ce827ae9 8df63b0b 74c82860 6d2d9f83 005fcd48 77c483a2 c62fc426
+    3940fa73 eaa54051 f7cfb15f 0783a202 44bf2bb9 c10426d4 241994e1 50fb09ba
+    3c0d30ff 29f9bb7f c6008f81 1dcf1d9b 4bf6fcbf d449132f 5d7894c4 51457d15
+    0edf0555 61eb2934 18386cbb ffe434eb 62acc543 72214425 367f1ea4 4f239c40
+    dd43e81e 517253f1 3eb22ccd b0537a83 490a389b f8ea348d 2f184eed 730fe7a1
+    523bbc18 9bccf717 470f8cba e6af20dc 1e2b28a3 a0d2006c 3ccd8a00 eeec1495
+    15b919ba 7de2d51f 804c4644 55d4717f 29fa8eb2 a6a4dc32 e1433da3 72bd9d12
+    fec9dced c0acd099 268be85f b60f2ee3 5edadfcf 8629a11f 7288b2d8 802cb2fb
+    2235ae25 e01f76ff e9c15479 352c3192 7b9732ed 3a015393 1b41fd8b 1a98e5de
+    4b0ce8ff 4e095ccb 338a722f bbb39ee0 a001a622 5eeaa017 9353f964 56767038
+    5baa1907 08cb1d08 51172f50 57bab227 a0847123 cf048fbc 3b604512 a9c5bad8
+    6cb70c1b 98a7bcea 4910e03e e5773a7b 485d3ff0 84d41081 05258604 9fdf3b00
+    6e696477 82a59456 35
+h = 7cd713dc 08fb854c
+
+k = f02542f6 69d29a98 e0b31cac d2c9c2a1
+m = 5a8cfc61 38ac60a7 c607d5d6 e860b239 e53899c6 15a9f1d0 14c8fdde 32afd928
+    9aeed902 29224202 29e7312c 856bc55a 06f739f1 a2b761f2 3c3f80ee 8c35a55d
+    0efb85cf b40e12bd df0aa6a8 71d57b6a c550c5eb 7829b825 45d22e81 b617bda1
+    a8fd6b72 40a928b5 19eb612a 9d36f504 00c2fa85 fcf55bb7 9ba9e0d7 4eb7017c
+    c06ce9e9 75cf6550 df214c3d 3e1d38ba 1b70462e 59fd1624 42a6f27a e93506fe
+    975e2fe8 f46e5214 321d9152 36d0e280 10f32f28 9802e76f 65f06ac8 546cddbb
+    0277af26 780d8cc2 4aa188ed 44183fd8 84648531 1066a79e f72f2bf1 2ba9d2cb
+    e7440621 348d03bb c10bd5b4 be648fee df29de0e 00734c72 198d3e0f 1f83c2a1
+    ac361e2c 907624c6 7ec99435 fdc1faa9 8fd1550f cbaaab09 58ddac76 7d509b33
+    b6b561f2 d30dbbb9 c777ac54 08828d9b acf24a1d 4e1ab445 6ce057c0 53337951
+    c2ac061e 667663d4 b777ac11 f875596d 0b5f68ee 8ada170a d6f3d824 b9a004c4
+    74ac2a95 8f9d7a2c 664fc21f 8e051e2e 5275deb8 47cdc5fc 0fd20a83 1e033679
+    2348e851 67631178 5047c6bc 04be87b4 fad9cf7d 655f0471 db546185 ca1a3306
+    9e20b835 3092c57b f4130f44 ed36a5ea c1c7651b 6519bffd c9564e37 b1bc741f
+    19b87f0c d6581ceb 8da51645 f35b5f96 0b251ad9 d6955cf5 03b097e3 a6245ba2
+    1ba6fe04 770af7b0 7d1f5ed7 c1592451 e3e926bf e3acf736 f2aa55cd c6d8e0f6
+    961b22fa 8b6e1209 e5b0df32 ad81a92d d59701cf c85948ca 1de53cad 00613f70
+    73114b92 1bf788d0 0a554a43 6e43cd89 8d54493a 4185779f 01b6b4f8 25fe01e6
+    f63076a7 fb4ad8ee 65bd1cbb 2d89348d 39d3c535 7eed27fc e488618e 63366abe
+    74c13165 77f59063 5101cfd8 cf5905d4 b8b1c8dd bbffb39d 15c998d3 e1ab552e
+    d0653c5e 19d42c7a bef236e2 52b9b532 a4a8fbb6 158eb37f 16d1afbb 77791b6b
+    2d847c97 306aed0c eb50f524 47646ec1 c2a728de 2915b5b0 39658e72 e84ae1e8
+    170228ec 49d1f8c4 5ea0
+h = 2b2ccbae c9a63ffa
+
+k = e304fd75 0e5a083b 9d957409 2d428da6
+m = 6bf92e13 ab848c2f 9e5337a8 9d088430 90d2ca31 f059892c c9210290 df6af90d
+    9fef0fd0 8ba0892d 65557924 c5ec8372 512f4446 3f1c6d51 4961fb99 19dd78bd
+    ce89788c 4de927cf 88201e55 25d9782c a57044e0 ef187ea2 329b7b77 5ad5769e
+    cc1eb31b 66f3f427 060fb4d1 23c723b2 0d02d0ae c6fb26e0 b86dd2fe 31b6c8e7
+    2b34688f ff3cc14a a48e9184 37195c9a 0f7eaae3 5928f4ee ee0d99d7 caa0fb39
+    05cde108 6f2475f8 1deb4428 be0fee32 6f7d614b 2695dd2b ff9eecdf f2cc0456
+    43b00e1e e6a472c8 efab0d5f e214803e e19ed8ad ffe4912d fc022168 0249c25b
+    e6f1b293 277d1a6a df98a8e7 1c0746e4 c7be3680 9cfddd5a 56c250cc b67f91f9
+    441b1461 f2fc3479 242415bf 8e891648 ba9d03f5 42bc3527 b77fe057 2968928a
+    c29edab4 6c26784a e72d9d40 62f07bae dff63cf4 59a36eb8 97c11d64 b3424a00
+    d3711f45 85ac355d 25cbd5ed 205de8d5 0b552593 15895c6d 6cd9ea61 647088a2
+    50a3f5fd de9f2ada 05f47f0a 852e0cdb 9b1febd9 f80e2214 b26db81f fef2b589
+    8603a11c fc1f5a1a 5a9df676 0d8e10cc 4a65b608 af6693da c31c7d88 84dc9c24
+    2d066a11 4c6a1553 522119ce 6d19a3be 0f3fd1d2 f3ed608b be510b0f 38c3d0bb
+    bc64c5f2 48246748 fb351ffa ec82e8b3 4f2866cf f8a26684 1e28bbf6 13d89ff8
+    c8a36148 4c16de6c f26cba84 8b6858fd 2c1fdfe4 0454c340 ccb87b06 f9aa4fa5
+    319d5e14 da5fc9e5 5fb0c981 ec652686 91c96bbb 304c508a eedba7a1 a7f9535f
+    2c1f3076 3f4a1f4a f72d23dd adfabbbb 14d01251 7ab2c0ec e26e4981 3547864a
+    b9aa45bf f4fce2db 009e8dfc 60b1605c f70a2544 0d7916f9 6de00371 7922ff32
+    ebd8334e 266f652b 33f0f2eb 872eedb9 95fb03e2 84548afa a450b85b 6ad57ef4
+    e1c5d976 1942a4c0 e76b7880 46246e08 add61399 22ad0122 6430cb69 cb0ac476
+    2dac023f 03c436fa ddd34d1c beb72e23 72db4ab8 38f5425f e6034597 7700e38e
+    1b89e44a 3762c9b5 d804b4
+h = c91cafd8 d0ac4cba
+
+k = 26351315 9620aee0 735cb3e8 bcb45361
+m = 9dec594a 244190c3 571cc24f fa4f563c 78dec50d 13c4d5e5 69c7ee65 048b2be3
+    106405e4 bdb5f9b5 e57dcf1d 122be763 a79e12d2 95f821ac 3ab8b3da bba961f9
+    e2e1b767 094dfb06 bbcbf7ad 261d96d9 0d9848e0 17a937bd 4544360b 277e61ff
+    98e4ff03 e49aaaf0 ccf0408b b08f2c62 fccd7d84 990a5ed3 82b63ece 52fc9f49
+    1dea79d4 58a3fdb5 8bcc1c1f 6e2bb9d8 cdffbb1c 2eabc05c 08f7af25 6ec0312b
+    304b0b55 4e1d7502 81f79a44 e999ca86 7fed494a ca456ea2 21e3b7e0 7969f74b
+    587c3d18 5a824207 e5908d3c ffd6e03d f5ac1d75 d8539a18 8873ddb6 ccaae529
+    b039fd32 2730e739 afd911f9 a701b0a2 1ac2281b 66a687c1 dbf740b1 ae44291e
+    e78ac872 52372afc 50968ee5 139679e4 4f7ec57b fb5f5dd4 ac624392 f74236a7
+    497ed8fc f6601ffc e8350605 0ef60b9d de7c499e afa6f965 ecae802b 8092fa7f
+    17d8eb5e 8f17e1d3 67b6b7f5 5e826fa5 5b0e4be9 c1112dc2 3327d87d 546d8f23
+    06cb50ce a536d688 a5499a6d 256f9496 b533e6da ee7baa38 7aed76be e4f6c55a
+    3ad2a7c9 508587f4 702a6511 1949f4bf 0e90b67d 2d9d1888 5c1274b3 d9d08837
+    c21c0e70 f11fa362 df9e27b5 fb3b17b8 f3ca8e4e ea7386a6 7f08ded4 f6a7dc22
+    07f953e3 8c58ea92 455c87a0 5998215d dbf55e15 a3a28d9d 1448e372 c866241c
+    fb34e81b 769a56c2 890c96c2 1a50d3ab a4f87fc6 2564c685 447c8242 6c93f0e3
+    f363127c 69f35327 87d95762 f5832660 5d8c8079 49a9bb15 cde5277d 91ccd67f
+    7874852a 513797d2 e9bfe2ca 65315a39 e2fe7ee4 0a97fd76 f8acdce2 4163f3f4
+    57fbae96 755455bf f78f3f01 2f9b5855 2210a15c 93044eb9 eb80ae01 21c0d636
+    d13031cd fbc82fb5 25533090 015594db e2135a15 cd635e3e 78a4161b 53f4ff54
+    daf4063c bbe6a13d 42c7535e 5564744d f4092c36 58a8aab7 ad9d125e 5995b2f9
+    ea4cd18a c81ab41a ba83e101 2c32dbe2 49aca1b1 03bb5317 05d070ed db631d77
+    d38c5148 ead7bd3b ce70c5ea
+h = b2c154a2 615b00d9
+
+k = 605c19b9 4bb2f80f d74230f9 f324baf9
+m = 0a0b7004 83f11393 a6c7af76 b60c19df 2648e3fd 4aeda665 bc4966e6 8303af21
+    06566b7e 317545d3 9404467f b90d3974 9c3351b0 0805de09 7d30e674 d09e39dc
+    ea5c1346 b46d7b91 1c00c18d 90a4c90f c14f9242 d0152733 c89b5bf7 40772e27
+    8699c76f 52f804f2 72af3a52 fe9d451e dc9f558a c47a4f33 339f5b51 24c0e7bc
+    f8a75908 975a684c 6c7668c3 9d71065a 82b109d0 5d82ad4e 11b6a5ac f1fd7eef
+    07ec6fd0 d586dfce 9700c86e bb438f41 18ddd008 837f2ae1 81451a4f 21a7f697
+    8df88562 a9a66ad5 3fb194e9 da0ebbc4 a037777d 69c5e3a5 55f46096 16cbf69e
+    e6fc26e4 d9204050 5ae79fe8 9005508e 7b48cf6b 205d0203 e7b3a29e 42d85916
+    e2bb0134 557dee0e e7215a7b cd565196 9692068b b647a06a 982d8ddf 84f7c67b
+    3ab85a45 1a911248 3fb26981 dec01fe5 974cab12 29aa1dd6 4801f34b 90a33d56
+    7af2a603 3ef44635 1fd8e90a 5fbf2734 2d0ea41c 5c70ee6f 02f14451 410c178d
+    9ee3c862 bd178c32 1fb392a5 7b6f9e77 7efa7950 0e68cd7f 4ef56d2c 823b762a
+    b7babf4c 0a50dd28 33ee3c56 66aa31ab 8008bfb2 642d1422 587738f9 5587a106
+    9c6f825c 5fbe23e7 82456a2f 2b070e4b 05bd676b 3ca964fd 7a3968e9 02231277
+    7663c8be 7960e9cd 8d718c59 4ee5a34b e14c1950 cf8301f1 482bf5b1 84e8f1c6
+    469a2541 d5be395b 6c6afd92 86026cba 62fb9bf4 6e404f3b 7a485d8b 695ea99b
+    5902a1c3 863c5675 026dd4ec 61d32949 10ab5515 3934a34b 7485064a b8b49084
+    4d7ee100 db2241d7 26ee15e6 534a1c4e 769973a2 f836329b ab03b271 b54eb01e
+    e1c213a3 245d887c df597b8d 8eda15b6 aaafc71f 54bf8e81 cfd57493 394f9aec
+    f5b5bd65 cf1479bb 44afd1c9 a13c0cb5 590a05e0 a3c99870 87afde46 98180105
+    fea2bcd2 25f1476e e3e9a408 22cca24e c0c71ff2 d85d0550 908e5e7f 48044c6d
+    c0f12c62 9ea3d5a5 1048717d 7c5e737a 594c479d 01d91f28 9e3ecd9d 5902c995
+    abf42358 95f5119c 0feab3ff 86
+h = c264a085 4721253c
+
+k = 0c8be846 6cd61d70 7c8e0ba7 e240c435
+m = 5f7b7bf8 6ebe36e8 6dd093f9 57a77a8d ed1971b9 7f6c5371 9f65dcd0 376b3597
+    7cb8c393 0c513346 26238bdc 324864bc a83543b3 b9984707 11a08a36 c2a211b6
+    3ae06b1c 4bbbf79a 46a38174 3be92f0b b3b5ead0 27b1c267 29d76630 9dff525f
+    5f644521 da6d8631 d001f5fb d2975988 ab331acb 875abeba 8e7f8f57 2a4ab834
+    1c5d67ab 9cb03773 f87bbc38 371cdad1 16f38b0d 05a580f1 e99cf09c 21975ded
+    f22350ef 3edb98bb 2424184d c45d6163 9eb88dfd f9924daa 21acd25a 4724138f
+    df64c29d 4c87085c dc8fcde9 0c88486c 13ffc04d 91071fe6 8b0e9385 e4d7e64c
+    b1add4c8 e001a93c 4c53b10f bc0e4193 6bc0fe17 6660180e 371494aa df3eacf4
+    65dae0ae 8685b6b0 a2433dd1 99042ff9 f400e2aa 65b6d74f dcd231a9 b428a781
+    47b241ee ebb78350 5c146eb1 21f61c1d 27794af6 99402ab4 a214f64b 9a9445ed
+    1bfba938 565b529e 1c0c1f95 e6814f6c 05ef84ad 687fea05 fbb4e803 9a96537d
+    8bf0d689 6d8ad3b4 e91127b2 5e73c807 0c6056e6 8a94d7e5 5b0c45b1 dd0d38d0
+    cdd54cc1 176e0532 873d16e4 969f8203 59ad7d00 49312de1 00da5914 8b91625d
+    1764530b d9898336 ba107c08 e9841331 769bcb4d 26dbeb5a 903ed5dd 4b516e2f
+    d284dae0 94ff81cc ab500312 e5ef93a2 56f19cb8 80c4816f 6187ded1 bbf7ecac
+    981117d7 b6f25b99 60f1b1e1 bcf2a28a 2a929e24 7fc3714f 2f24f281 4b2f73f5
+    1bae3c86 7802a030 6a2473da 7a0f0d1d efe8279f 37887ff4 8e0da230 fb38dc88
+    ec228838 680c6d04 cb170b78 afbb8688 3697cfc5 7d446c3b eb614b8f d35cc518
+    27b0113a a18406ab 3811058f 1fd8fdc0 cc29b91b 4479861b b4e049e7 dd7393f0
+    c6642434 7e0b7396 5a17f206 96227cc3 982f2536 4b1da793 8cf6ee2c d24a6cb5
+    ce216290 a0e76a21 b5924339 caabb297 35d5645c a279a799 c777eb74 e7a5422a
+    daa59136 fa1afe7b 9d65a431 39a9468d 0ff81cff 1b96ae60 a0e3fad3 0ae7bea8
+    8573d932 7b868d09 8046af07 01e1
+h = dda3d505 d2d2bc61
+
+k = b3dec0aa 6718dd1a 7effabd2 a4c894e6
+m = 7afd5d61 397f0c2f 41ac0daa 9d74d5bc 7d0ed53f 7890d881 3cf5c7c9 8ce71042
+    1d8a2607 b6a2f5f8 45d168a9 3a2bf8a2 0c002b0b ec73ed77 49e06c63 df09cd2b
+    27bf0973 8218b620 03ae5058 8ff9deeb 579d892b cb4a5b24 411bca5e e02aba3a
+    b321ccb3 2b2f10fa 8647dae5 0c438ee9 b224fcb2 6961b5a9 1e288fe3 108fc15d
+    7fcb7573 4305464c 0b58a998 671911cd b5c22844 c1c5c53d 37b621e0 dc592f07
+    969a349f c1e1a61c c68c918c 7eb65a7c bc46e475 ed76ede3 8a57deac bf4cca96
+    2451352e 5462070a ed96197d 11f32140 06add52f 4a8adc78 5458b188 3c7b3546
+    829516fe 1263b195 14f31132 7af2d007 050ac610 6b9d6b47 a69f67ee 57b5b2db
+    0fe40f77 43453b08 161eb62f 1baa73ae 7d32a503 a602b848 286bed7d 9e3dbefd
+    833f724c db839527 f65f351c b4659326 06d036f2 caba7d70 2ecf42a2 337b3233
+    4aa2f749 81c706e6 d8902e17 7e37c483 b2863e79 04db7fee c8e270fb d36a7197
+    77a037c7 e631d7d6 5a9dc01a 16ab2302 5496237c 74b521b4 0141910c df9aaac9
+    1fb9c033 a7b7965a 7656e3fd 85e30dd7 60d84367 6427150a f8ad7deb 7088ddd7
+    505c92da f27b303c 0beb1f7d 995a33c3 134e6be7 2f2de121 d49c459e 2bdf0e97
+    6cd2013b 051e709f 4384438c 1de2c574 f1b17748 a0456ee8 bb46f940 7909be5b
+    3d38d6fd ffa1640a ff46db13 d515a720 ec2b6298 478022b6 eb22cd57 5042ee4c
+    53ae6dff 942d4cab 84e3f87c 56e79afd eb991bfc f063eedd a58ad3f4 e1314c8c
+    8d800aad dc762eb0 17076a23 2b6a971d 3cf168f7 e03d7c15 0cca8488 18e56a85
+    566b871a c53a092e e61e5ba5 4823c398 71f20085 8e4c682c 5c00647e 4e5cb134
+    2158fd2e 0ec7bb0a 4d58cc14 16080d98 62290216 f2e1a31d 0a83a7c4 a686d11c
+    cb72e447 433b5e1e e32c75d6 dfb45cf4 045c754d e05c263a 186fe9db dbfdd65e
+    099827d8 91971bc3 782ee302 e5f1ee24 a2182344 3cb794cc 1d1fac06 c103cc2c
+    89a79f25 9df6b4fa 6fa6bf7b 9622ad
+h = fd7c9887 59174925
+
+k = 0625abbe eecd25fe 97aba447 5bcc92da
+m = e06b39ab fcbfc9ac 48b822d1 e4255398 d9d5c4a3 a7c483a6 96ad82e8 a496f69a
+    3b9bf3cc 4f5f2a56 96f28ffb 2aa9b61c 4c995d53 25e2ff2b 8dc147b7 6d793eaf
+    00de1648 8e820027 e9ed9b6e 7ccbc25e 7f94e8bb 05732de5 012a7b25 665598da
+    52df8360 5e3d9042 d4cc9764 b06e7db9 d4ca66ed f1f8cee1 051cc52d d7a6d500
+    5b2b4cf3 2f19e4d6 92a5bff2 e5986e2c 35584a9c 6dcca863 02e8cb24 94f8e5a7
+    d805bed1 9dc88668 92a5655c 88a42bb5 e8e8e7b6 01ca1c37 7870a720 aeb65af7
+    ec4fe135 295d9d8e 2cfec483 89176fda ef102e75 ed1fd79b c049cf81 5e2830fd
+    5a3c4c45 6a84759e 7761903a 578cfda6 58b712e4 5a9200ca 405ecffa 0206d60b
+    2c6d517b d1623c91 c1b0ece6 253b06c6 79dc49b2 5789fe39 4fe6b94b da8f22da
+    618a8556 ee67141a 21d15981 eaedacae 99951993 b336939c 94761981 d174bd90
+    bce233f2 2a62e964 edc26830 f910fe9e c321a967 bc927aec d2b102dd 5d107aab
+    5cec6b47 e4f65f7b 77937147 8c691882 ee83c1c5 0832844a 6ebc50f2 5c9719b7
+    9516955f 038e643f f737fa44 e5d4b575 62122f92 16a6c600 5e80a030 eb96ff5b
+    b4f41e34 c908ae90 31159b1d f69fb8af 3de80b01 daa52375 ba661cd8 25471256
+    63a2586c ebb8b5b0 e8f033c7 1896cc2e a3529136 e6a5f075 03d7771c 03c076f3
+    8a8930d3 d4926bdb 3e4fda25 1a721f0c 22ef86f7 9fd0f189 bd90d4a7 1e66f45a
+    15094c25 917950e8 6b3e3ffb b4cf49c5 09dc9909 4f86f04b bfda54eb f60fef41
+    b2bc7c8f 2f9edd9c 766ab6f5 1c53cef5 9f4c626c d0d5ae74 c39beda0 e1ef7ed7
+    1152ec06 0f807220 521b9091 6f1faee8 1b767056 2e1d6024 273a337a 30be7fb3
+    cb04e2db a52613f4 16273bba ad0c2ff6 ce9a49f3 32ea42ca 2e8b0aca 0f6a47a0
+    9064d0e3 02a71fd6 a72ffa12 4627b667 eef6c4ae 9505aec2 f9098f05 69c5a59d
+    ef72a352 e84a8fc8 a09d3a1d 616d86ff 83ff1187 3cd13a8d b249524c 1e5e9bc5
+    ffc9195f 77ac6bd0 51b1e01b 07096a7a
+h = 4b1df147 bb0e2e8f
+
+k = 390d3665 4ed8169c 3cbeb09c cc733ed3
+m = cc9a7935 816f916e a68c55c3 65a9663d e3db40ea 3429d7d3 4b12dedc 4a5075ce
+    a76413ba c972f5aa 35a8b932 a438577e 32f41469 9a86f7f6 dd898d04 d90be2f0
+    a861faec 358624b3 dfcfc218 034acccb 4e1089c6 52dc8e11 22d6261b f3d006d1
+    c6819f33 cd0b7465 0e6344e2 873b482e cc5c9713 99107498 ffa221da 3ea94d4f
+    10c13d76 6c305633 817bdaab bc78a26c 331b4add fb522168 a6990953 8cfeca71
+    2ef5903f d02fb1f2 89605fdd 3f0637b6 95330681 a7fb1167 0fdc97f7 1e7b74d1
+    e549801a f169c5c3 89c5006a 9108e55b d9128efe 59b39953 bd550e23 33721fe2
+    53819103 2708e00c 68b6540d 7d30eb10 9a185398 e5505ad2 c2be573c 841a3b13
+    dd08da95 e6a5727e c2f0b117 03893878 98e5d319 46751f2d 1fe51b99 6d58bbd4
+    58a00ff8 ddeab767 662e19d9 16c00e09 db8a6552 4d8487fb f8e18e3d 2adc59fc
+    3d332f42 97f7cdf5 d1beee78 2f714218 220889a5 ed793fe1 d5d4c4ce 26a736cf
+    bb4edb32 1f188d3c 779ea482 07affce8 90369b42 82775feb 8042b757 fac72820
+    dc0a64bb 3b888729 c7bdc138 1d2e0ac6 d928acdf c25cc578 2e0054c1 0db0c9b5
+    0e66c665 1c274fc6 74d512ce 40d51a97 09c292fd 80aab365 f701fb75 3acb5d37
+    f332772c 485c60ba ca2ce3aa fc174ee1 2717cd9d 8073e925 07be5fc3 24dee988
+    e028da24 18882a73 4f2a8e17 176a1cb6 295c02f0 9b1fd69a 33314eee f7338a0f
+    335019e6 a97d4d09 3f4f656a 89a5f42b e696441c 09c9e8ce 7ce00ebe 3a3d1276
+    11389a0a 4c7920fc afbd5ef6 2f0e1cf5 ab350394 3231345d 4ac3ae52 d8573b75
+    e357bda4 736a09d7 eb7e2e80 864e1127 e631c036 84281170 35f94ffc 001f229f
+    ba6d1112 b7ec189f 8ba58fbd a50ca7d7 425d9109 3071cb43 a4c6a868 66c221a8
+    f270a02e 1bf09883 5a7bb6c4 208e9b01 56e2f5ef 534f3fc8 f16a6eec 26e30c7f
+    3e219556 67399503 9587c496 3b70e8d9 375f22c5 33999eed 669171a9 9e35f254
+    5219771d d2cbe610 53bf57c7 202bd434 e9
+h = 42e308e5 74ab1904
+
+k = b0042e39 d0d4730c 4c0dfd89 6a6c5f06
+m = ed929853 eac16943 557a17fe 16a9aa9e 5e5c9f49 264a28a3 782b75b5 ed867e5b
+    f3a5e8e7 e2747976 dc7c2a06 60480666 e2cec6b2 2968df97 a887b3b0 d02b79f7
+    9a275164 b49b6961 85d89f3a 8e42da1c 9e0e61c8 e95aac1e 79327a44 78c5b7f4
+    ef8c4f1c e07b2a2c 3d92f30e daef34d7 67516d37 133eae52 11120a5b 0ab6cc84
+    7abed35e 27294d2c 3dbc5c99 386ed2fe 871d0a18 e3dcadf8 563a2cbb 1a20caab
+    6d568f51 d9a1e111 8731df70 3ea0c1dd 1535acf4 87b99129 1b65f053 5c1d03d2
+    1863bbec 6b6fcbfb 080d1ab7 e8cad50c f8f8d15b 17f3a45a 5e8f6c48 a22e8593
+    658d5dff be40e9df f95829c4 fcdb7bf9 f24bcc36 8abbba77 75c2ed94 2f6d115a
+    5a5123d0 b1ec0101 043436ed ee7d5ddd a1b8ca1a a1834e44 c4fd247b fe38f3f1
+    d39fafc2 3ece2068 26084922 7075d074 52a91e65 a089901b 4761baa1 f21a104a
+    3b52c2ad 42e0e911 b2064182 1b4cefc8 a7469564 ea0ffbc2 1dc2493a 4cc33d91
+    0ba4099a 4b4a2561 677e0293 25f032e2 b8fc3d51 56ea68a2 3f28f7d6 95274b72
+    277877c4 7f12a112 6d1145df 121f9c92 47af398e fe5cf04e 64a736a2 c9b45b91
+    0d7aa519 4e1e24a3 d3064020 b730acea 4f52ea6a db435aa8 47a1bcc3 721e0976
+    15f6eb83 440bfb7a 546345eb f8dee17e 812467bd 6a9a2430 0c67bd56 72babb50
+    b529b7d8 e24fe790 2daf84c4 7647b237 51d0c1d1 62da5b32 c180e26c c455bd47
+    877ca49c 0d6b6668 4acff000 773b1e00 17ccd03a 34ef40e0 3a7825cf f3b25d4d
+    b1b7aac5 2eb38dd1 117e5bdf 7a67bfcd ccb97fe6 562d516b 2d33c600 a66d4501
+    38ac8cc7 b04f2f77 abfdef42 b0b3526d 25119c30 ba6087ff 51e77897 55d6ee9c
+    a832425c ad41832a da16c823 3fef96f9 2b4a3927 09c013d5 175438c2 5f5d1a4d
+    9ce7ff3b b62d8b6f a0c38844 c8cbadf9 c9309b79 6f704222 4f956054 dcd38b0f
+    449dee04 8f448285 c7dd3284 a5c3879d 6744f54b 81722f5b d0f77c83 53a2fa27
+    0ac43561 c1fd41fc 64f98e96 e51dbd26 2611
+h = 408027c2 2123be7a
+
+k = 18254a3d dc151f5d 78247409 17eb8934
+m = f7aff772 30a33520 4727d9c8 95cfea88 b417c2eb 69e7336b dd9fecaa cd239d29
+    3a1699e9 bbd56b5c eed69fed 0ffb90d2 eb92350b bf4e9fe1 d93c7ba3 0fd0604c
+    30e28e7b 14cd45ca ad25515e d0ad48ca cef1998f 8fd0892c 11f07744 9b83a619
+    7a098cec 0f5286ca 341e3abd cf0f5fe2 0bb27d4a 9903c645 142aa942 fbb6b494
+    af514928 09714cdf 53bcb84d 2d1260b3 233a81d2 147b16f9 b7d26e9a d420108a
+    5ee1bfaf 08c7927f 4396f065 8edd7951 44d24538 4fd2c7d1 ed848647 0d8b2b32
+    41d9cb79 b4aaaa10 fa293ac1 36ce662d 54654a6e c629d6d0 5c72af1b 6c3b4db6
+    98534685 3fef730f 9593eba9 13838bce e8e18fed ef1969c2 c16e9c72 81af3b18
+    7015018e 629e5f47 c2a58110 b38d913f 5e3af65a bf6eb238 78f336b3 e9447b9b
+    41f44f52 2064a7ab 5c4b0ec1 550d4f22 ebe49e40 5a57cc20 e60ce432 c4230232
+    f109e29b 5b339a0c 2e80e48c b95061d4 ef1a326e 1620069f 27d6d75f 23a3869e
+    69445d62 cb535aec 4a9377ca 9396552f 40b5d95e 30bf69a2 6d2847a6 2f8cb6e4
+    90a1b8e9 6f7cb82d 2b62771e bb15a81a 40802045 3c0c12dd 8c885754 d0d1eb8e
+    43ae8090 271aaebe c92087e7 fc2b080a e2284c8d 781488d8 96837311 70494af1
+    603fdbb7 117f3cbc 28cf82a2 9c61e99f bdc17d05 d92abfac 852937e2 8ba70c60
+    2a463454 4334a577 e477e747 73f074d1 84aa659e e14252fa bdfff91e e65ecd35
+    ecb63f77 f9415675 51a8a89f e48b5d08 cba12216 91d27e6a b3c50388 964ffb27
+    b73cbe3a df9007aa e99d0c7a 6b98290a c4e5ff29 b51640aa 1cfc2c39 d677db64
+    6f522b0f 57131271 bd498d3f a39af85b 6a193e12 42ac9019 b4a49477 feac5a17
+    544c457c 2cfebbc1 7a904074 5bc5c609 90839db4 4834e54f a79dc213 4b78a929
+    5c346780 92c19346 90a4e9ac 5130dbcb 97c6f6f0 4b7e2af8 a405038f d3404d16
+    6789fb1b 28345b65 98003102 0cd32d0e c733a109 c3694e05 02929c36 8fd1bd18
+    3ffba5b9 0d4edef2 aebb67df 93250257 8238d9
+h = 74ad71b6 9d117695
+
+k = f49ac6c7 f3aaf809 5c80557a 7695f369
+m = b85f50b6 0d7efc74 c0284283 6d91528f 20723145 fffeaf91 124bf2ff ecee67e1
+    d08e0b20 ee567668 42d7fd62 867f9021 a1435a6e 4dc24f5d 06d00261 c9aea36e
+    8028dd1f b798c089 99d3efc6 cb56b8ff 61484e6a c6c9c5dd 6173eb29 66ba114d
+    8d10d83c 5d679cbc fe0050e2 df1a106e 2e400827 d5f1cd1f cf046ca0 1f3918db
+    3eaa819b c08349fd f22c392d e9738f5b 1cf93a07 07fdc4bc fc6f501b cfcd3ef5
+    ef3eb3c5 963c89be 286c5494 4f9ac060 3a404953 5409ffaf 5d1934a1 b84cabe2
+    0ed2bea0 5da3427b 7c97041d eef32373 697ad531 eb03dfdd 0f21360f 4a61ece1
+    6c3dafa6 856e52f7 5b39be45 c99e33ab aec71ae0 f10e2636 61921996 4a2e79d2
+    2a9d286e 1207eeb7 8dbba62f b46af86f c96aab8b 70dc5604 457906a1 f4d1160f
+    356a3f8e e60d2a59 1742ac65 e41b304a 40b09314 cfe4faaa 2c4167cd 28a60cb3
+    0c7a8f26 c243711a c6426224 d3f6fb17 c3dc7b84 046f8a71 1a8ad35d d6b05656
+    a79c0787 48ebdfee 8bc5bd64 b1b1f22e eed9d57d 0537ded1 b5c7ebaf 2fad7970
+    6de74b6f 85e30ff5 784b9d83 9472b594 f0d8b3fd 0c96cc8e 571bfcf5 3d39b196
+    ad94b72f 04fda962 adb964e1 6ea7fff0 024493c9 36527932 ffa87605 35c3aaf5
+    ada6ff7d 444e7163 a41e193d 029b8b86 9204b33e 40dedf37 ffa8daf8 63ff4529
+    6f83e7c7 1b3db581 2e599b19 0ef12a6e 5ad06188 48b4468a 4f927df3 c6b36cb8
+    054aff07 d4265c35 0dd28a09 f5b316e2 3a1bb800 ca178431 bd103d86 53817907
+    d30545a9 56d0421e 39ab24b2 bc8f121a d695b89e e8c6ff62 746dc2cf 4cff7882
+    83485bd5 d2049eb3 da82df28 e79764cf 2d8e6bd6 1b39290a 8edc5a63 b49f4b2c
+    7ab6e5ab d2c4a224 5e3aa8a9 89b22d9e 1a0272fe c846d8a0 e736a99b 24aa4ab3
+    834c127e 4dcc5aca 428efd09 2e9e1167 09410d19 c0b49201 6d6bf5c0 af5c8cd6
+    937b4230 4bff64b4 42574147 2d2bb400 6c3efb92 00da794f 1b0b39d2 62b6d536
+    0ba0f777 43738313 59dd7931 db6252de 8ccd2108
+h = 8bb42c80 e474029f
+
+k = 473eb8f9 2e7a50fc 6a06803e 2f3c2664
+m = 5239a53d 59e7f68b 43b67fe1 7ee51d55 0ed2935f 874669c0 ada128ff 22863354
+    5eb531d2 caf6c96f 9b1dab95 c3f55c6e e3c857cd 4191c4b3 fef1e7c8 99addbb9
+    5a5a4e4b 93ae752a d861f656 dac24c15 945b618a 224f6868 6609e181 c991895d
+    dcddf959 7fa37a3a 72eaa0ad 1f8ec079 006d135b 651fef27 94069773 1f8aba35
+    53d30ab5 4f81d818 f3fcdef5 51760cf0 2a474511 9a6740f2 06393d67 b8cc8cad
+    bd1a1dbf 36491b55 12b2cbeb 9a79576e c73c263b 7a5a6c82 3bff6aa6 b5dcee51
+    bd7b2a86 d85e2f89 b38b1de4 f42149ca aaf03220 3f1d2a32 8bb22ef6 65194928
+    2bf9c4fb 07e44fb9 ab4d1744 5f0bbd30 1d5cb8b7 920f63c7 708a3143 3ddc224e
+    13bb3afd ed722129 1bccc0d2 89864d0e 3b93a625 470738a5 d2594538 3d317efe
+    e8c4e41a ae26a275 788ce435 a66ceb19 5bac3c24 2361cdec 98215816 22b76131
+    bc8b75b3 debcded9 b2b9ca80 b7574135 a0922c0a 45458ea1 cfcf0f27 2037adda
+    8431bce5 68048afc 831a8b92 4a8e2cff 5bd63eb6 dea0a72a df635b0f 0d2a56a6
+    100e6c6c bd25ca35 58642afa f7776459 dc3c5b01 62fa36f2 40602104 08b45350
+    c9382115 5ce8506b c22364df 8dcbbf26 7d0ccbcd 75dd7b1d 4ff6c81e b3c40249
+    ee57690c 2c4e2769 a79c2730 d8077c16 67cdd2b9 f1f98600 95a1c937 66ae1cd0
+    2dd2616f 6c2074e3 946389b0 debc3472 5eb4e9f1 92dbb0bb 25b1a57f 6497d00a
+    dcdd5246 e6af8b00 8793f528 a7109e2f 3da19169 a21d96e6 e94beae4 735ce08c
+    c0db6c0e 3020cfe8 6061f840 25cb0948 d7dd6eec 1b1cc707 c1a8e22c 519d5448
+    3f847f9a df16c949 97f7a396 664c3c98 c7c6b5e0 f6af4e6b 39b3c233 3c56bccf
+    5cbe076a 3bdae6c9 529646b3 45c9dd06 c6386a3c ab9e7c9c 8ed06a3a ac2cdfcb
+    548d262c e62d675b 063886c3 1d4ca17d d6bdef3c 83550c20 05240068 f1694e01
+    80102a64 082cbd65 3855ce73 b759efe9 6ceeeacb c3c36c3b e82e06cb 4bfb6425
+    35ae732f b4da5537 c0d5735a f13fe828 54350ea2 0f
+h = 7c2f415d 712fcd1d
+
+k = 9e40f2d4 18cd3ef4 706b0464 2746c184
+m = d97ae284 952b568f e5cf7b17 d9d16fa6 493874df 3aa5b8da 42d4b22d c2ff2c3e
+    2e137f8b e68d307d 6fb8f622 61e0a3db 9c7983b2 fb3b9277 fdd74150 f6755036
+    5d7d21d2 84637e04 f9dba963 ff9a60d5 4358d0c1 86332415 14d1103a 4f50f122
+    0189dc2e 415870c9 fd391b90 a16c9e05 e2e8a573 c309cfbf 03ee2f6f 8a4859c3
+    9b94b588 fa6032f1 9eb09c42 53e02d46 c0957613 d0cde50f 409c9226 78dc097f
+    eecc80f2 24e07527 53f54b1d 2df8d08f efb42893 9744a829 8a058cbf e6827afb
+    65ff49ee 262cf8e6 716d4171 257aa36c 3c048131 e77174fd 313c0810 cbe37c76
+    4af98515 8b51b33d b0be91d0 251a49e5 5de151fe cd408460 586bc585 634d76ac
+    b25fe87e 32fe23ec 21d5b625 a68c94e0 c9432454 435435c7 a13e0a33 d8175fac
+    27cd8685 027b7817 c6b3873c bca8775b 8bd885f2 844ec1fe 3c96b9c3 913bd066
+    5f7ed254 b541f191 3b95e4a8 132fa101 f3c82137 ea10f2fa e78aedf6 154d838b
+    bba697e2 afb7be7d b39c1f2e 3019ef81 d5831950 ae44e467 544dfbd9 5e71611c
+    96c7af17 06e9e192 c82d770c a95b2719 1d50ead9 2264d653 9a93167a 266e29aa
+    218ad650 d2a09d05 77b211ec 6ac4c44f 8cbb3bba afb037aa e35b39ec b1e01402
+    5b120e88 32640587 af484bca 4fdabe0e 6a2519a1 629fd335 29f01f8d ced13190
+    20cac817 ab104d01 34875b1e 98eaf97d fccee25e 35126dfb 3133a514 6745c8cf
+    67e2c27a 34f7142c fadaebe8 41e77955 901a58c8 d48b86f1 434e6a0e aaa1d4e0
+    8aa009b0 253b1c40 edf7e922 c995e0d4 d3e6b576 79ddd8d7 e72bf8ff 697b9348
+    7c691d79 49719e60 e32a2722 9a68c2bb 68210df5 b4a249a1 30bb2a57 77239e93
+    bdfddb37 7554e286 608de2c8 49abcea4 a090f79b 66b53c1d f8e9d016 f2bdc133
+    50feb80f 6b5837fe c8c065e3 7533bccd 9a3b7f20 27fcd37d 2f869d52 253a12c7
+    c7facfa9 adbe908d d54c7757 ac43437c a1957ef9 b4cf8bf7 e844aa92 659657a7
+    7eea6f11 187c5bc4 30945f08 d52d06cf f8d20625 be49
+h = 32f0a1fb 5e81cc62
+
+k = 28bd9696 044ad994 47b4e819 0602ecb5
+m = 3b454d04 157dc448 b215fc5f a26b493b 2f67ed78 c8464f76 e07452e4 ae0fbac3
+    4c4cd93b a3f93bc2 65feb55a 6c0afcbb 5e173864 8e655c0d e7256e52 b9fb1e83
+    5398a823 307ca4d3 f21915c5 da284042 1f26ee4a ee3013d8 c46e2942 f37ea91e
+    c82c8a75 b6e3f24f 51de7fee bf1f1e98 13ddcdd1 bb76d720 08f079b6 5d61bc5c
+    024476c5 8876a204 65a88267 25e039e7 f5636e74 81e715f3 ffdd8d2a d7281c11
+    04a80eaa 1a266838 500991db 8e35080b 3f73c3c6 25145a24 8378b2a2 95789185
+    8e6ae126 5adcda1f 59cd618c ca93f046 05fd3d7e 7eb1b1f1 44a3da6c e8d64a31
+    66d15b75 7d0c12b6 55e822a3 2a4ca6ba 66ca2357 04892379 96f50a13 652436fe
+    8ab1c4fa 2639a7d4 d55da092 3ba29b4d 4751dea6 269f3f7b 7b2f0e99 40a50c29
+    929cc4cc b1372a05 1b2641b2 91ed557d ba0f5468 d636a558 1287d188 b2a18b45
+    b1fa4267 9818ebbc 12a619c9 8099c17d 9e9d32b4 d2020fd0 2b75c085 f0190e58
+    29ef439b d23fb23c 6b381d55 50b7a5d1 058f2018 2e70c400 d59d9b5f 70ef16fc
+    b5712c78 7fb78110 302f05b4 b3a795ee 522a271b 332166e6 67ab44e3 42664b8c
+    63deab78 57bdc300 1529ad9f d6c83998 bb78f636 4fb3deaa 9452e675 f7994bb0
+    fd371b36 2321a46e 16ee4061 056d3759 8a0b8b48 abea622b ffccdbf6 ccd14518
+    31e91a32 1f40d490 0b7895f4 82e9a742 965fd00c 6a4ffca6 a4f1ec3b 63408f48
+    b6be5db1 957cdd3c c6f17947 2ed58149 ef841784 a2639595 36ffdd4d 172ef93e
+    1607ce10 7946aaf9 f7c4d2e7 229eca80 9db85480 723de140 ace9d9ef 8ece1177
+    c280b9e7 8eef9f7a 4a1d5752 6da69508 b1400ecf 5869873a 40987ce9 61f01b69
+    c44dc636 851812dc 072973e5 9be97815 ed89dca9 0d4ee262 300cc5ab 0775bdf4
+    974989cc fbd8fa3d 875ace9c 2f65740f d3a89e62 4d3372dc 1ce7d25e ec85fdb8
+    c8f0c574 da1337ba 4f41f2e6 fccd2860 7fd09637 22036952 5ccc6ff6 1dacac59
+    fdfb9661 33eb2a90 b7c53c75 21349358 ad3f3de8 1711d4
+h = bd24cba7 b102d315
+
+k = b085a130 9a46928e a0a205d8 fbbd3cae
+m = 3334c5ed a4b723a2 52e32ec6 22d1404b 98cf3b17 3c27917f bb40be05 fa1f09b7
+    70c3bb5b 54585303 4d082774 c4d1f344 3ba10b06 b97b9fee 33233873 4a6ffbba
+    309e6de3 b9939207 f61e8149 b527a31e f3582168 9b63c2fc 29adcf67 f95fbbf3
+    6d306363 4ef6575d b0779881 342c1a07 a22b7a03 15ebfad5 29b50f9a 732f6f0e
+    6d021fbf 0d0a7806 fc9e33fc e3395ac2 da9e464f e3666b3a ca676cda 59d64770
+    85109157 7d324822 8512e6ad 08ac082d 5b38e6ba 48a8f406 0b79a8e7 647e7a73
+    b2676c35 61ed95ce 3300b98e 8b1706f4 a5c943e8 e9a5c514 528efe5a f3d4458a
+    dcc4531f edba6a9f 1f280728 cda4e98d b4f53367 3e225143 2a399c2c 2886535a
+    143f7613 86974ebc c1ece1dd 9da2c8f1 cd4b6ab7 eeccbffa f7348934 3ff89378
+    20c3d5f7 3301dc3a c18343e9 ee4a27f7 2237da91 d8908328 7dc7557a 781af460
+    aa515566 fa523116 2ea24f6e 407c68b6 e4fd2542 8b5c3968 58742e0e e86ac824
+    347c076b 927d4a82 23079030 023fee78 156846d2 b4c250fe 64e69ce7 def873cf
+    30356f77 ee015889 ff0d1dc8 987804ab a4d6e051 46031c9e 2e6058c7 9fd3d974
+    869c25c3 792998e0 4c878699 02cf7cf1 3963c431 2172aac6 7ec38ab0 1e2a663a
+    aa3fe9fb b2bdd510 83c9a47b 390045b6 166e5020 f8054ee5 c537cb13 b3e11d3b
+    8c015df3 7a730bd2 fc7398eb af7d7a50 27113eae d9231ba7 8d48b68a 6fb29d18
+    f44bac23 6cf0eee7 5e356890 dfe663cb a7248f67 e878bf1c dc93c4a7 c0508b44
+    a2463312 c4cfe664 e2f83d9b 0bf2fccb e30e3af3 cdb833b0 dd70b3a2 609da79d
+    2371779c d8efa2ee 0705bee8 ca815d4b 803612d4 030a1f87 1dde6189 457f218e
+    c77fe1b6 8c79d97a dfc15e8e 566e8bae 80842f89 d9212850 5a1d3715 4dc4d254
+    e88b8a32 4063a789 7d0cab6a c5d695a8 c9f9a501 30b9f1ef 548b94f2 ca85efa3
+    b7b7d1d7 0972c7e5 6c279b56 eeed1a46 3f072390 2b4aba16 9dceb9fd 2da5f314
+    ed0412a3 abe69ab7 83a535bb b069c721 48afe4ba 5b6c9ad6
+h = a78e859f b84cef79
+
+k = ea3aed96 2acddd7b d6b7dfef f7ec2e2c
+m = d03ab40f 9965fbd2 3e4909ee d3bc1788 b6049fac 8bec104e 0af661c9 8fb7ab45
+    55478963 8b5d6384 c105fc04 641a990a 6c5d1b95 d2bf287b cad35cd9 a529a694
+    36c0eb07 45b635a1 8dc66402 f17432c0 179046d4 94e0ac5b 430fd221 b45eeef2
+    d3cd3c40 cbaac34e 755169f0 337f0153 f1a6e979 b33d7756 a77fbea3 8f7b8439
+    1441527e 060fea50 15a2b746 76635e97 2b253e3b e4e8fb31 a3d8dcfd 95b4abb4
+    09c1763b 5d74e32f a6014c89 e4e72861 a95fc9ce 04f08b51 91203885 ee26a094
+    20ab3696 741bd8e0 a4f33235 977039dc 8622bcf4 f17b3ab4 255a70c1 e296b671
+    0dd411b7 8113ce62 4c0bf7ed 83fdfe3d 1cf0b2f9 80d1e470 c17e3861 d783ffab
+    6fe1dadd 46a9237e 9f1a8324 eba29eac c0377958 0e00239a 4300622a 4383b18e
+    3cd25991 7957b4a4 51a9d003 f53bc95c 8224a299 efc81beb d2f4bae5 3455f26a
+    85ff3406 2d7c6227 34956b61 9f5d395c 81ee9fd3 600516a1 b110710f c0ff3f37
+    40703028 d11b9883 d9f8228a 9b841388 b40be3e5 a88aa438 ba8611c4 0e1d637d
+    4af5ca69 601ac428 730add4b 0c3954f3 3ac87aac 9abb4900 d066f9ad 010a573d
+    921b9d2e e5a16299 0fafb2f5 7f1957eb 57525880 c3be40f3 c36d3e0d d47bf0b4
+    84b55640 1fea339e cf0543ec f04b6b40 3e56738f c52b3687 85df4543 a2962c35
+    00f2302d 667e5552 42766534 69727423 197800e9 3f9971f8 f1995669 f03eb04b
+    4cd42126 d9688e1f bc856b0a 4aad53fa e535cce7 4768a3b5 e886af01 b3bb9f2d
+    d3577d5a 3a0f5f6b 86a3c187 db2acc05 5b8ed790 fa101308 4ba62535 9f81fb1f
+    7e7e87a3 eac702a9 59959f46 30890ce1 807439b6 ae73c99f 29181723 dc59e56c
+    ea15e59e 63991335 25bcc02b b7c6f46b 737dadce fc186ab7 9ab79cec 76617fd5
+    f5798562 50bfda33 1889f679 9528ea87 946afd7c 3e6c4a97 9fc81065 f2f2271a
+    faec7a15 566f6688 8ec2eac7 f35074f4 934d9a39 b4b81559 76c6fe9e af2706e9
+    07223b78 fe105257 5a1e7c97 8b806532 68ce4d1f 5a5ff36a db
+h = 389308b4 0cbca730
+
+k = 289bc8be 25d8c7fa 823ec7fb e0dd42d0
+m = eb604c59 31f690a8 71839dc1 3142c6aa a7c872e8 22f7c5ff 81d5e289 b5c672e2
+    02eca0bf 83d19150 1ca4ec1f aa7fb206 a57cf025 ace70775 e318a1d6 2490c0c2
+    cceb27c8 8add47b3 a6c76056 1d293cf7 83b935f5 b4723149 8be11519 69674bf0
+    0df99574 15294c0b eaced809 f7ffecc6 9aec7764 7c2f7b4f f99d7afa c03dfa5b
+    6f6ddb6b 666a4cd7 71d2de52 1a4e2aad 0b532931 66179016 22a56938 a70fbffc
+    cac52e1d ed9fb4ea d1867df3 a2475eb8 13a3f657 78653086 6e3887c5 e0fb66f4
+    ee08d36a 354cd519 1de8a81c fe5f1321 76b95655 c480cc99 ae039019 c003b796
+    61b207a6 27906b04 fec70b2c 6558e6f7 eba2b257 4f7d5aad 5758f713 2df9ce44
+    d41bb515 fe657574 4ff41837 4029dfd1 42e4c5cf 4a6f2d26 42a23aca fafd5801
+    6e958289 140b0eeb 2b58678c b9124aec 42d77a86 903942ee 0d62db62 9ba5bd65
+    ac8484c8 cc1bf64a cbc60c1b cace95e2 bd0485ee 7cbc20b0 5fbf49fe 9a7d2281
+    c629b037 7635ac55 4ca502dc 39b165d4 a114711d 27921f4f c662ad99 03716a83
+    a3854484 1fa7fc50 263bbd96 5a3fac0b 356982a7 c240854e 0ad18c96 96ee6335
+    5893db4d 678e0e67 c6e331fd 15b2a7c2 fa3593ad b3098d61 cbec3c4d c55970cc
+    34777093 24aaa57b b8e65084 c48630ca a54cc1c8 9ebf62f1 838c17f5 805f2002
+    d4b45118 2d9ee058 8f43ee36 2913ac02 8c2dd19d 5e3d3a07 18598745 e6db1088
+    f8ea77b6 4289619a b83cb890 4230b17c 992920b6 69c83e4c 43532c50 39a8ae21
+    d6b81a97 769761a4 73b4f538 89ee9439 78316dcb 09395f29 177db146 f658d12a
+    1ea75143 bc44ceda e3d10840 7c078006 c4b997ab 6ac8a5df f07f0d58 85efbe95
+    ec70f3b4 69e0de73 bf09e236 853056d1 300aadaa 46154d06 bbb5910b 9e419ee5
+    9a94f8d3 09c3c18c d19a91cb d09fa3be 8ae9df16 62120e59 d3d99310 3a57227d
+    e8944200 1699f9f1 c4538bf8 f0aa8988 03319eaa af16f7e9 e1da2190 ce34368b
+    d457b8ed dbd815ff 9c75e9e9 570eed9c be9c62e3 ee0e6baf 9cd0
+h = 8ffa184b 2b9ef4ce
+
+k = eca74d2e f0baf49f 75dbbc65 15c78d6c
+m = a5f83fe4 9c1a76f8 eff38f43 a6f594bf 1a8145d3 5c102218 697c19a8 61d65dba
+    69046206 ee685098 2c96c068 68718e3f 4bd4a7f3 55d743cd 86ec0603 b46dba2c
+    b02570c1 b0619fb6 0ae5f42d 3b4c8a14 e066f9bf b103895d 8effd0a1 a5ec7482
+    86ea20de d28ed58c 3305142b d257a721 ce0cc73e f171460b 6e2379b1 da55eb3d
+    225f5986 2f3cc39c ece7f5e2 c3f8431b 14b93d89 f62248c9 fb3bf9e4 9d07b58e
+    eb411ad2 cc411094 a60e4588 83762ba9 1784c976 f506429a d9f6d64c e3f24ddb
+    c6384959 76b48227 1afc1ce0 01b108c0 23be0fd2 51f1ff09 b272f4f9 f3f91e5b
+    f2dfddee c80ae20f 8cd2bb82 3871b84e 80aa55fe 0414d10a 33dbf012 3cc668be
+    47aacfd5 46d0a0df d87dfdd5 0eb29f6f 153ef326 3cee5267 d6715cb0 15c3b043
+    190c29aa 00d8132f 35f1b9b6 0ce2188e 5a7f8273 54ec2731 13a278d3 8bc980fe
+    e302daa1 3d5cdb45 4fd4ed8e 943ff1cb 104f3a4c cd6b9622 f29646a7 e55a7ee0
+    25d1487c ca6f7d51 f3a7b605 cfde97a7 c5782713 9c5e93e5 d0b7680d 36d607cd
+    c2f4800e a0ff4b23 038423e6 ed5aa5d7 d5c0a4bb 7ca8a80e f116c7c4 2ee6f5ae
+    1c5e960c 874cc93e 11b3b18b 38b58164 a43e2862 ad137d2d d545353f 57d2fa6d
+    7e91155a f4fa095c d5679cde b6a87b7c 6e1ead45 e2da48aa 1d7eb1d5 3a767085
+    97b84188 4e67fc43 75a76a27 ee48ceb1 981d2c6d 7ebd13d5 8c912045 e005e50b
+    0416479f 7aeb754b c5390d2a 5240928a c476402c f8df4724 7ff2709b b14a54f1
+    198bbcbe b22f547d 65d077fa 74fc158a 37473a32 cc0551d6 52c98b47 324acdd7
+    3233aaae 9e378083 f0072218 b923f14c 0165d3a6 ebffb965 40d9964b 56ecc352
+    ca4967e5 706335f0 1d0fea0b e6433103 a26d4edd 8c832b84 b6d31a27 43cc3dc9
+    a30f5862 082a13a9 1af0fbe1 3e68d930 6d6d1d73 3790cd34 bdbd7678 80458123
+    a0a11d00 4110d0ca ac6be954 f81248af 83a12461 83d070cb 0d69786f 472df50a
+    ef36432f 00e43fcc c52b1a6c 0a84fb62 c968b4a6 2806a2f9 d56a92
+h = a52d4497 a5d6823f
+
+k = c905c12c 6745c4b7 7847d3ee 2a500dc1
+m = fbc8aa19 2bb34477 dd74d72f 25900cce b377210c 0f767238 c2b12b74 95293be7
+    04e971f9 323ccf42 569181e8 56bc3d68 dee30989 51991a97 6f2eb86a 5b6f61cb
+    74ee18aa fbc192d2 f4c3445d 9a91b6fc 748820ff 0619e9c2 a9823167 d20615a9
+    c8105d14 eedc61e0 85359600 9350c376 64c7256a 181b2928 454613fe 7bc234c7
+    915512b5 b124fff8 8ff2ee9b 0eb9d061 bf03fa11 fce65d9f aaf3f740 274616c0
+    fe1ea3a8 f57bddbf e7aa66db 6783166b febaeca0 677ba41d ac28bba6 11e9ece7
+    ddefce27 5520824e 97f0c196 8f15cfc3 eb6c527d be5719b3 5d5486f7 ba83b6d4
+    d22766f7 72b93224 928e5ef0 7a8f961e 1b8c988d d3202594 c74beddf 024ce573
+    e33b1f5d 369a5322 1e3f0dde 0dec7a0c e9b632cc 4e7d26f3 70e71d6d 8bfc9506
+    996d811e f482fc44 847506c9 34508c31 79718e0e 4200a473 b90c728d 4134ef6d
+    73e0321a a389eeda 4a5fa9ca ffff3443 278b4bd8 2bb80afe 22720c37 061591d5
+    0c0e4b33 de7c1ca0 491143d1 cc74a769 8d3ab26d e6a1c844 686fa4a5 41197c5f
+    392bd1b2 ffa9f2d0 43fea8ef 41acd36a 72883ad5 c464ecf2 289ca600 d347535e
+    30e41343 fa4206da fd73160e e8adb012 5396caad 1aaa8d31 9bd666f2 b2879145
+    32e4bcab d38e76ac ae34e61a 5c4df0f2 46e92d79 6e177170 d6c30baf faa8a67a
+    20b783e6 ffd60c97 83980850 2907fba7 986d900a 29a1bd5e d9b1cc07 c0e5d46b
+    918dfccc b6369d11 6e672279 baa61c8d 3f61b719 806b784d e997dbd0 b96824b4
+    107e286f 0f199811 0c1a7704 aab98496 c8a89d66 f387f1ea 5b729c10 6f3bc3e3
+    eddb1fa6 c9d25ddf 7607f6e4 05b4e704 26f65291 cfcb1515 c3a21e10 f19cbe96
+    5e668585 a18ed719 70016084 6d4f01af 597158fb 10442d2c cb64de7c b6bf8530
+    cd00281e f8831288 6be9c0bc 58ecff6f cafd29ba 2a209bd4 b9e313d9 6ac04a80
+    251a1135 f18c985a c907773c be001f94 ed78b29d 6baba7e9 cab4b184 4a2897ea
+    2834468c c388d744 4e2c39df 7513bf41 acebba6e 68cbe8b4 9ef69a45
+h = a49d7893 f5995773
+
+k = 53553a06 4ea401e9 6b485b59 fac2e669
+m = 7887c4d9 ee028efa bba19f44 73457af5 d3f7098b 8e75bbfb dc778063 742e183b
+    e19c5a48 259f7533 7591abcc c8202408 61b14f65 ac97c694 5fe3f394 b5cb520d
+    26995c22 ea3bf0d7 5c0898f0 c72f12e9 d200f02d 1a262b77 3dbbd9e5 77a954cd
+    d85e6faa 93a08054 f5ff3338 12bb1a76 e400fdb0 b6108d47 68272fb3 502e2a67
+    3c4f88a2 0114912c ee270530 93349ef4 e5ddbb8d a624d85c 8f03e172 8d5ee1ac
+    6054c732 4a7657ba 3851fca6 59ffde74 3d5162a2 6b8ebe19 324f694e a32e41e8
+    87914018 33f3ffbd fb9a616c 72e55479 4a68c28f 3822ad07 1bfe15f5 4b863be0
+    f281d28b 738cba03 f39ec9ae 19195db9 e48ec7a9 dcc4ac94 c7e03c46 f025fead
+    2ea05a25 9d798971 e77a4a6d 6ff36142 4843a907 c97081b7 0da61898 42d0ffdd
+    dfa1fe51 922378fe 530a3a36 8af29c9f 4a30c795 6af4116f 5546cdec 04ce8fc5
+    7733a9a0 6e06d135 2faab755 d2f73e06 5941bb8b d2029767 7e7db5d6 45e7d10c
+    209ac09a 5dbd3f27 8813c9b1 d2ef460e 167a1f4b 60c809ca 5cb7905f ffedfea7
+    dd2d9a86 e7d2cc06 557be616 1615ccf1 e7c31b7d c2c5b6ea 70b7539d c72088ee
+    304c2aa7 cae4706b 8df436a1 25821bd9 ebd70e9f 428778ec e3c7e42d fbc3e385
+    1b323ca1 90e16e74 eb5520cb 227f6a30 980e2928 022bfcb3 f63302c7 ee3607f7
+    3b102390 93157f91 8f4f20b8 4ef9e33c c5e81aa8 26941935 a97cfca7 1fbf4957
+    dafc560a 645e4136 988e06a7 2cf40f77 55d5b031 a8732fbc 8cc8728d 61907fdd
+    7b0db5e7 a8c339e2 0d3fd1b5 c192352a 658ba404 62811b7e 52fa48e3 56b6748e
+    c3df4e88 6467eecd a6ff0324 e85353b7 09b1f831 936ff68c 7b312230 d0c81c53
+    aa70adb8 49169946 e0ceb289 385e31ef 45be1014 24a068b1 fecef029 0efacf0e
+    3c38dbfd 2c15f461 b103b993 0fe774b2 040807e8 457db76f 8e6c03a6 4729bf19
+    3d0da2d9 6099668c f866a614 8a5e40db b3800ad6 f207712e f7652764 37955bbc
+    b519af15 883f24bc 13fc8b50 57d976da 60106436 cf7125a7 bdce192f 44
+h = 2b4c9fc2 eca875d7
+
+k = c2b747b2 56083598 3e215479 cbcc4e85
+m = 0716a7b7 b887e10d 6949b593 8bc483f4 1a843427 f22a8e1d 12ef3e18 ea0fb19e
+    b8ef9f51 ac5d073c 1c3abe1c 70cc0bca a3c888ff bb209335 ad3104ba dc836c40
+    891f2b2c a3bba5a5 47007fea 7c53ddef a373afaa 36afdecb 318bd861 686f1578
+    4c9cac80 526bc990 8612a399 54030a10 074fa8a3 423af1e2 4ceaac51 2e70dd11
+    0c87ca86 7de35156 f6a6acc5 8bd6457b ffdb5ff8 4b12359f f384a686 935cf3bf
+    7cbcc0f9 3636e4b0 87a89849 631f10e9 e8abc6a7 0433c2d4 5570e4a4 d62d16f5
+    424b5890 f06e115b 3bafeb96 524cb709 1a6fa8db 9c26e0d1 c2aaab04 09977ca0
+    df1f71cb 9183366b 48c10eb7 b84c1024 8663df39 d7aa55eb 1bd25536 8948b674
+    0bcdd1ff 70753b11 eb77dade bfa2a53a 255b098a a62c9b0e 0c22ee8f a27a6c2f
+    d8dc6db9 7c55220e e54a2e00 8943af42 0aebcf3e e8b057f9 dcaad7f3 b9a9c593
+    1b34bbfd ea34f7d2 3c99bd1d bca46bfd 1ca34545 6a5024f4 e326eb49 e5270875
+    ba775f9c f82cda21 373bb24f 01b00e32 942b29c4 8f80973e 6c361421 d5c99d55
+    f6b2f6fd d5a051d1 5e5bd5c1 c2c27bb9 82aa9b5a c8478931 ae74541f eacb6a2a
+    edce37f1 03d4e3b5 7fece804 fb41f735 7f32f06b 721e9c1e 0af02683 0cf3b387
+    73f1da44 e7398d4d 99d3f762 47eec68b 0f01f019 52bc07f6 be3f007d e75c02cb
+    c54edec4 a6a07016 c03bf88d 1b5221d9 469447d1 ff7e0f3c b75fef34 001a7640
+    53362c06 7e9e460b 27c49122 1f70aa81 4b1e6b21 5c9e7b84 fe1d77c1 a95889a1
+    652b0cae 21947c22 01756949 abab9dc7 0e30790c 117c7ca2 3e8456ad 1ee0b3e3
+    7af8e84b ecc770ed b63ce72d bfe6ea43 d64fa872 8b876ae0 7b5e8a1e 26416f6c
+    4f540126 0e938971 c860882d c1b82be7 fdfd5155 69e500dd 0abfb69a 9d1c6021
+    9174abc6 77b8db02 e3bf0c6f f14ca389 825ce508 feda8cdb 5ae7c70b 3ca449d7
+    14d64407 bd4877cc 733f5099 23dcbffb 9ff189e0 d7af973d a05cc43c 298f832f
+    a69f2c46 a74f90b2 fe767e47 34dbda26 e64b4e8b bf5ee070 b78e6765 eeb5
+h = 47566d65 e950bfda
+
+k = 16f1a511 8960fc96 3b579086 312d44c7
+m = 44a2dddf 0a1bc863 dbfa8b69 33c66182 88f74a07 5073ca48 8a097e59 1f3a85b7
+    8a6b6a86 1a388ea2 bc47d5ee 143cdd0a 29aac88e 777008ee b2706bce 725b22b4
+    f909dfa3 587d5a65 083c60ed 07b27ad4 fa8d07ae 1dba81ca d67784bf 0cae5ee0
+    8fbea4fc c429dae9 71a2fcdd 82552e74 14f74ac9 ec8d15fa d28f949d 6b03d13d
+    88cadffb 1dba28e7 57f936b5 3b24e7e1 79580a06 a1778a82 34e78e85 2a4fbd81
+    91755933 3a695570 e2a14c96 57040fee 3aa5e0f3 ee0944f0 1fa89b96 f6938c53
+    a7b2f7ed c99c5bdb 9837b9e2 efc7202a 2c6121dd e90d2b8d 4505ecce 91fb49aa
+    45ea841a 721535a7 5357e7cc f7d91bf1 3a692682 0ee78696 fdfdf93c bde44c49
+    2c0356be 11f34a2b 669833f7 65bfc162 94a88580 0307dc79 1db8744d 62f57e4c
+    5220280c 94aa3b66 474edda6 593e67d8 9a978b1b d32a0357 38129d1e 7c718473
+    3a1ec65e 364e64e3 a0001adc 349f77f7 64f1b068 8dcec00e d4432803 f9336e58
+    46b8c147 5e20d8f6 40ab2849 02bec555 940846b6 2090e0d5 384e2182 c9497f83
+    573ad305 a92c2026 83fda39e 672b8702 1af6c0b8 03f9697e ecc9d5a7 aacab771
+    22854a07 01b1aeef f087880d 9907fc48 6717bb9a fbc07f37 fa31ada2 425b219e
+    042ac8ec 8e582e8e 0c3fcf54 4eb1fccd 9e7fbdf5 23e67e33 20e82e94 389ba464
+    1aa1aa70 1cfa4409 97c3e0d5 9a35707f f7aef804 4faebd73 406c0302 19e2691d
+    c3c7acbf 660b8306 7a23636e ba871917 becf427c 2394265b 8782d3df 1db988ee
+    280da6a1 8fd2c78a 2d65ccd2 24eee200 d604a069 388bf230 2c852b5c 7af095e1
+    e96700a4 7d640b52 eff52883 4c8c0d82 d35967fa 2cb02930 de09787d 314448ac
+    156a40fe 3513680e cb5f033f 2a32f7a0 9076e0ea 052ba300 5ae2bfef 5a4c4d46
+    2f142d51 175f8df6 086db832 3428061e db927181 ad93abbf 4bfe9666 0fd9f5b9
+    ec3732d7 72a5fd0a 3d907b60 856810fb 0f9de63e 31ae06ab a6cbca11 4808378c
+    28a90738 73ac2b08 15326b96 f08566b4 ec463d16 1dcf2f44 d2b156b5 ee21b8
+h = e0a93784 6a8bba56
+
+k = ebede462 bd6b008c 50c54469 32c4f3b7
+m = daf9fd3d a7a29102 7ed634d2 86670b9d caf5da65 f1985019 476a6143 12573093
+    097c3fc6 0b761175 5b60a20e 6febf205 beb34760 7d9ce913 8c42dc76 36579bd2
+    d4468528 a0ada17c 9f912a1f 5e44dedc 20d640f5 eb5f5f57 24edef30 aa9acd9f
+    6dded1c1 edc8dde8 83cf7e59 38acdadf 1bc44369 f31c90f5 17e26820 08214e0b
+    b91d96f1 1a95039e 0c144784 a918953c 9ded10fa e1b5a549 b7e8ffae 5a35d6f6
+    e4447d92 ee50c1f0 b99f3523 e976a112 d11502ce 168821eb 01a75528 a95339c0
+    e5a7457d 3c2887b7 9fd29ed1 442c86c7 853a83bd fa8268cd 50623736 08ee6866
+    0637d314 545da293 3aecd1de 0f099ea9 0b230af4 ab84e800 ac6b7e6e ff264ba7
+    90de3df1 deb1bbe1 6147fa36 b39d1558 984ebda0 be29cd70 a57e7b9b bebe65a4
+    41b2085f 558fea6d 82e9e203 61860148 2c460ed0 117c5d5e fbb5a4e5 8893bb9a
+    8724c155 ef9553fc b0d746f1 4c28f88b 9cf35b3e 97eed070 d4582aac a4c01f15
+    9d34d2ab 44d18fff 05a00364 27a40ef5 08e9a5c2 f49da6fb 0276ca33 328573e8
+    d8afa15a bca9e038 a18cf404 b625a145 5b9074c6 e114de49 7c194541 f518c9f3
+    cfb4f0b4 c272ecec 8f4c3f30 3b24009c df935211 398f1ba7 6344d876 3f7637d4
+    856b81e2 a4b3a827 2cbddd1f 90759f90 c01b9fcb 1f049613 b225ad6d 20043cac
+    c94d23bf 0e32292c 3bb5c23d 620708dc 8ed608e0 6881840f 32d0d212 f5c54b2a
+    3d066612 c3be04d1 61642b5b 43469dc9 f3e2c92a 901ed7bd 28da2cfd 157a02a6
+    90c20166 44f5da18 ef73e27a b0056fd7 88f8e578 e4bf0824 bccb83fe ca06299b
+    0ef6df13 b452266f 2e17c340 d653efd7 609291c2 979f8f58 8af85ee4 5eba6eb0
+    069d6ede 24c5e9ec a5e9d720 d8e791ef 2548007b c5f9e663 f1d120a7 d33453dd
+    162bc3d4 d1052649 990243bb 377a77d0 f4b342ce 1088fb87 3a7aba78 72c98d02
+    88d1ea8d 0ece45c9 f1c349f4 2da44010 d523e290 91393e05 2a52615a 4ff61591
+    117c7587 f60042df 1e574cb6 1bb24b63 12d191f0 95ed6a78 0d912e11 fe347174
+h = 3aca39de 9e37eaab
+
+k = 8bca07dc c38c6516 797005b4 6670aa14
+m = ea015c35 193d19d8 4aae0dd5 e5b55619 e6132b90 5d5049fe 669a4542 457ea778
+    a9841037 7b3746f9 8e55f7a9 9811be2a 37946e37 ce35a7b1 64967a01 3df6ec29
+    63860989 8304ea89 b0e16de7 86e6365c c012ed6f 659590af 7e878e23 1dfc08c5
+    5d1cf3ec d4804965 30d2478b c3dc0f38 274f5030 87ad201e fcf8588e 62e3deac
+    ea182c14 e62995a1 11461333 cf71405a da2bb318 1cf3e669 05ae2f25 2aad1350
+    a50fce4f 0ced18fd f594bfa9 8150ef01 494b225c b76d77cd a8b7451b d49292d3
+    8eed4db6 a1550f3a 5a86a097 e346b432 0bf2793a ed959180 63689816 fdbc1bc9
+    17e8f4b9 2a33c823 6e32f21d 633e9698 fd66ebba 1d5227ca 8aa45ce8 b4c229b4
+    0d904628 fe87fc80 24f322b9 062b414d 80f242f9 5f1f2ea6 72bdfcef 1b5bd343
+    e56f8532 314854f4 826efe54 c2331379 7ed94e13 0d293fd7 5e1f4735 9376b631
+    05147ae0 3378a70c 63f10b3a ca350cf3 99e16655 277e58b1 d1e682f0 05399963
+    d8ae8fec 060be5f0 30206006 7b377dd0 df33f8b4 62d36d67 19bd40e3 5fd774a8
+    322c741a 437f9159 c9521071 f08bd59c 7be934d5 321f9013 78ba8718 d1eb814b
+    fcb25006 fcf3db06 2e1ec8b9 c56aef14 7ec7ab50 ac71fe2a 4e0247b6 2a47fc07
+    0a25187d 57450218 ab2ad802 38ab9fa3 ad19b5f1 44bcbe2f e8d68eda 1d053754
+    b1e96e32 bc27444e 0449d241 a1f8a586 b536529d 6e1490b9 dc152eb9 ac0421ed
+    be113319 d200b55d ed2b3170 a2296824 07006b05 af824204 68dd28a5 966e77f7
+    2718dd09 3ea32031 1fa4a8d0 a355eb17 834acb20 01e88df9 85c0846e 3cec75f7
+    92b160d8 b55186ac c89fbc62 912c9781 6c30b18c 27518372 3d2aeb85 b26d7596
+    4d4d7a6e 1327590a f8c29109 24665877 09dd815e ee929e7d db3a129e 2903097b
+    8f191209 d08f895d 02d3165b 08ebe8e4 85e73094 dc8341fe 538fdb38 00c43b03
+    3cd77bf3 ab62c03c acd6e960 46148669 bf0c928b 7ecfb0da 83a0d639 ce02dd61
+    e7e46332 c4a64d3c 352a5cb5 eda70f9e 510f909a 2e3b0342 cdddf57e 69656747
+    99
+h = 6d012ad5 c94cc9f8
+
+k = be186245 753988be 6cbc6ffd bd8c3d3d
+m = bbb55fd8 607c0eab ee47bfcf c3813667 b1ec27fe 0e0996a4 0f87f47d 502f816c
+    88494926 952e19ca cd9c9d43 9f147fa6 0e980b21 d1c5883d cdf4a9d1 fffd71a8
+    cbac39fc e44e6fed 12dfbbe9 0224e9b8 9f23cffb f196ce90 0a16aa6e c71363f9
+    59300d08 2d990107 f2a3b82c 2660102b eabddfc5 1e03016f 6d64416c da70a01f
+    f324a74f 51e05268 01bdd497 4df26efd 257ff197 4f21ab43 889b47f1 0ee959ca
+    c565401d ca3015cb 1a5e3bfd d2426be1 ef1b7476 81af647c 13e3d1d3 d144c5f3
+    6651dd5e d24c7ced b3469c53 d6829351 7491deb3 2799ada1 5e7e1976 050b6a2c
+    1094695b eedbec68 57e6d171 afe8efa5 137876ca fe383658 fd5e5166 c822cc4a
+    8e34b1d7 82d4ae02 0c393ae2 8d83a31e 6b9c748c c81d8583 2f8765e9 ed391c2d
+    fe3f8cb8 61072d97 62078d86 80d4ec50 06fdbd8e 0c2574c0 ae43c0b8 0734ebba
+    e7b0dab2 48020602 0946854b c5507d52 bd5da727 5c6c7bb2 19445bfe a1e8d1a0
+    0bcb8e51 7fa9ab77 3ad096c4 9f36b161 9024c19a b03e8566 5ab228e8 36637c5f
+    e321bc45 5add8481 42721d4d 22816f99 313b01db 42c6febd 7bfa2130 5f5d3c0f
+    96c8e17e 8ee23571 329ae9d9 a76873fa e0733b07 97aa9533 a2bd6c85 831feee4
+    779f064f 7b097e47 f62c3b90 957abd1f 1af7a348 d3a3b63d 98a661c9 c6674398
+    373a3a7b 6828affd 26e2e523 b2341099 8249e35e a370a64e c82ce6a5 191fa240
+    a23b359d faed750f 29cdfa0c 22e39be8 5d16877c 02d5de78 00943072 872bad2f
+    efa27ab8 4fb29ce1 81d67cca 4cf38c60 e01ec817 9b24cce4 992c7ab9 87f9d57c
+    4f42563d 01be81f7 9dd8260f 46dd633f d80df794 9bc2a13c 6ed6f161 38325568
+    639eb3dc 2d455fc4 da02d7ce 960a55c6 55a8bd73 463a99c5 05d6d615 642bf3d7
+    92aecdbb 84187c44 29738570 594c9467 a4957350 03fa7d1b 49ef68fd f2b68060
+    fd3a3f2c 858c5bfc e9f8779b cdf125f0 63b0dc93 36aba0a8 e080b0d0 546204e4
+    a0ce3bed 69437ef6 579b0014 b6e028fb 0add4944 21f25512 b87a6e62 aaada433
+    b2b9
+h = 1d241f20 22a8d3d6
+
+k = 549a7830 0c95c136 2bc193e9 f1bf346a
+m = 4f93de46 ef046f5a 72f24041 05c14c2f f5f4977b 01554258 906c3fc6 d7e6e6a3
+    61bff2a1 3ccc66a0 b5c42e8b 3754c4f7 186e957b 48a49840 3d7be563 f35593e7
+    6fcc79eb 8d068b41 d017d080 64018e2f f7357dcc e80fb2b1 c71b1333 169460a0
+    70b056e8 51c36dda 9f3fbda7 4c8fec8b d976589c d1f44dec 28208049 4a241000
+    a7d916f6 a0121fb8 655514c9 3ff6fe3a 585c51e1 8e06db8d 4a9acefb c0da8364
+    2642db2b a36d9418 78df3b1c 4167a298 4476af62 43365c89 4f05215f d8c808da
+    f18b9772 da6ab985 425defeb 96920c4e 339c14d9 607600b7 1c31452f 004769c8
+    cfa56e23 bd8fa1be 5a620598 6b5d02f6 c41cd945 808f74da e08d8f58 335ace7c
+    7b0ca68b d95ee291 99a98eba cb42c830 2a07fbf1 33c60e5a 6aa0351b 5bdde9e2
+    21b60e46 d85e7149 859b52bf fd0975b7 f08c3ec5 8366facd 378c6a94 3f1e4f2b
+    da1789ef 674b60db 3196ebaa 8d3372ce dceead2e 1cca62c6 7bcf55f5 c059726e
+    d13d709f 3a0f2a56 f022a5f2 8ebf6426 89c7026f 92f6c0ef 4b07fe06 1d2bd93f
+    26d442ca bea5c22c 82d3d1de bebe9319 a330e1e1 d1c0882a 97d7c1cd b51b7864
+    b43f18aa 9108a79b e106faa5 e8c1b37e 0ac38c2f 10dce94d 2f3431a2 624e0d23
+    6cb7d708 a0a43894 5c8650c5 cd932316 6f7d980f 96082587 efff4bab 44c0cebb
+    c0d075a1 31066368 b8c06db5 18768985 358731d7 34a3ec0a 0376f4f7 2d9a733d
+    7d07e2ee f5db9ee0 1da9b448 2b310cff 979af80a be7d1299 03435d1a 10a09cbe
+    d017dcf7 7bf63095 82df5aa0 2e802a80 47d7d910 69cae4a2 357d5ec5 df02b40d
+    9605b2ff 5cc67fe6 f9da4ae4 f6424e2c ec894a65 c6b50e64 c17dc8d8 99446188
+    25c0bc90 809b34e4 2a09d7c2 3e7618ad ded694e2 6f71ec04 2c13b4da fd2b14a2
+    75f80e3d 18f140db a9279e38 0400040f e625384d 8bbf334b 8a1769e4 defac87c
+    a3c08504 1ff449ac f477e5e9 fba5170b 00518707 502b3fe4 a0e1e82f 18347057
+    683af778 0ccb5e88 580ee0ca f3833a64 050a67db 770e9e65 720ae013 5ec77de4
+    fe40ac
+h = d395745a 2c7c7a25
+
+k = da4e2359 036a6e82 64543bfb 49221fae
+m = 326e1b74 4c98abae ead93a8a 5a4ee7c3 f84ae6dc 484015c4 b8fcc527 b3c31267
+    be9231f7 105e8514 776bf9c5 da120c46 3381fa4a 27b5d60f cd741a8a 06a0e95f
+    6061c5bf eeb3f6c1 a0a75848 da576d04 7aa4064a 700df4e0 bed72a4f 7d63681e
+    53becb0c da735732 72e85b7d ac70416a 691ed9c2 0eab07e9 1e237b73 32af2cbd
+    35576447 550a553b 3e9a95fa b53c6b44 d2eb7201 62dd47ad 8ed17246 0d78129e
+    c271b07b 9712ffaa 733df9b7 b92dfaec 536a0e24 040a10b6 80a52f14 8f1a4623
+    552dbd60 f01bf05d 4d74c584 3c8f3810 439e889f 5c16b86e 48954af9 065e1f7b
+    fc0d38bc 747ac8df 1544e632 1fb008e8 002a473d 61a638f6 1e1cfe37 750c3f2a
+    47f0d615 015d943b 0cb2550a 5bb6398b 9c4a02ae a7efa1d3 bdf89aa0 5a75c948
+    5169edb6 2426a160 4f7cc687 ad3c38f2 f6747df1 aa1dd8d0 0624852e 546537c5
+    2d14e561 412ac837 3360631f 6b989997 9c6da6cd 561df3a9 9aeec21b e8be4323
+    cdb31530 0fddd9bd 14332c23 ab2458d6 63b30ea8 f0cd9f27 44748f4d c8bda193
+    aa3ab2dd 09f9f916 de953fdc 3653b20a fbef5fe5 be9db317 7ec7e1fb 09eb9569
+    f7d01464 ab88970f c62a1364 444363e8 19a49dbd a3139ff8 3a0001ab 1fb4952b
+    f53fe136 f8e0169d 52932ad0 b0dd05f8 d4da8525 485be124 07edba26 c720ebbd
+    cd8b8ea2 1fdcd157 34a8e05a c4bd0555 cdb97f13 cf82f74f 877df001 936cd871
+    da51c87f 884ef3d2 09e48f4a cc626291 52592700 15bb294f e7998e67 4350bf5e
+    8a43823a 7b18d00e 08d84f05 d316b8c7 cf140829 b0422843 d08ac030 b0e17e86
+    daa88370 4713d41b 4e0a5602 80e54460 192c70b1 829116c3 65cc8d5a 8d80b8ab
+    9cfd6019 44119c04 4363a659 83c9ca6a 8e4b9c04 e7496dac e07e32cb ebbaf9c7
+    ccc39c38 979fb3d2 14db94b0 e16d4286 78fbce80 e252c3d3 166b516a f7708686
+    ec3320e2 0c11450f ebf7ab09 a738869b 24e06d16 df521ec7 31cb81ed 6741b36c
+    614a6ac9 cff3e811 f9102827 b15adf7c 8dbc4d43 4cb38a91 8c1fe0bf 77fc2b01
+    1a2afae4
+h = 3fb7d6f6 52f8fc48
+
+k = 193845c6 3eb74d65 0fdaf05f 0d35fe35
+m = f665b0ba a94a4e3b d59fdf94 c97560db 6bb85fa3 84382d8c 36717b52 aa882fc4
+    9ae70786 052d9856 6721a08f b0a5bb13 75d38ed4 62ff4688 bba99c1b d0d81101
+    7d7dcfd6 ca0250f1 10741057 e6f749a5 e314f899 44e6a833 fd038a1e 2fa4a711
+    4156aa79 128d80b4 2383208d c1c3d436 1f80fd0d 498219c1 3f402530 06e0a1b5
+    2bd52951 c67154cb 185cfafe 570a0a41 6f7ac3df 369c580a a2bcbc31 46dbed8b
+    6aefd4a0 3e5e25f2 800fe3fc 0b37fe4a bba465a3 d4175625 431fca5e a54e4da4
+    4357f8fa 24f0a3fe bcae3233 100f43d4 52ad3247 5887991c b5f3ca59 7bcde3fa
+    195f9bb7 1de96377 fa646704 0f4a8a6e 5814d9e8 d2447e16 453d68a1 c2faf3c5
+    ce6e6512 362000b8 9de56683 3468ef97 8c61114f c83b34e2 3533f8a2 785808c0
+    200f42e9 b74b470a 3e11fcda f9011ec0 1a7f805b 0cfa2cd7 2a4f5f63 e07e050c
+    a52bfa21 038f9104 755988d7 e1a4b218 d95951e5 cd79c1da 8afb771b 3083fb81
+    c283338c e43d85f1 d81ed996 a7189a1c 51d28a8a 8927720a 52611e6f 54049ff9
+    590ad10c c94f6107 2d28620d 2834eba3 c069db69 b616bfdc 9d94ab73 bad73883
+    1003b3fb b33faafc 1eb22983 472e440b d4ef96a8 a82eeb86 28440ee1 6e9a653b
+    1d6cf855 54383a2d b8b140fc ff380f93 2d529a5d 281d382b dded7953 d97adc1b
+    13d5e567 58e97d8b 511c95ab 528e8b6d 85d0d40b 907024b3 12e971bc f4cb003e
+    d6251682 aced679f a683a278 7d9b8784 7a85f00f c4d3a4cf deb09e9a 0b8edaec
+    601ae255 79f68a1c 6d3184d1 c50f60db 22b2b713 94151efb a5dab4b3 f5c2c7dc
+    ba5ecc35 c59bfe15 ebcb90fd 89e04903 58988b7b 8e9df57f 74701131 c0943b79
+    9723074c 5df5db9c 7b05aaa3 059b2c49 db798127 6c3f8c28 43cfd483 34a3edbe
+    5681f625 a5ce99ee c5828cff 0ced60cd c9ebff95 02cf445d 253dbc0f c8445751
+    776a372d 09e77870 4d704213 5d41a291 6fc82ccf 1c4137b6 a9bc9875 3775dcdc
+    c2e40316 a939dbdb ec861a88 58fac430 6a6677e2 1516839e 08d345c5 8e79233a
+    10e88923 0e
+h = 6a234488 e2aed771
+
+k = da9b64f4 31735b33 ee240dea 381cbd1c
+m = 6e8cb6f5 49e52806 2712db65 519a8096 14540e1f ef75972f aaffc76f 3fcefed0
+    50c8585f 88ee98bb fe697555 d69d4e44 e4f3b407 94695fb1 59f809e4 5b90a6ff
+    11c1e16b 0275346e 7b2baa76 fc1a4157 c14f5f5a 6337b4df b6b8bef4 dd8a877b
+    6aa6b238 21fbcf86 36e55ce2 f39e33d7 e47936e0 4c42b8b7 c401c8c7 ed5b703b
+    c7f2f8e8 0da47d57 3e9e69b4 a51ad20d c5bcf832 4b17b572 70b66710 e9bb93ba
+    e6c9b7f6 f8388a28 ec6c99bf 58744891 c21135cc 14535dfa d2591cef c4be89d5
+    3dbec7a0 3bbcc9d9 7165215b 7b2a7b6e 6ca53374 cdaecf74 4ba8506e 6bb4bf71
+    740529d9 9665677b ee2009e0 cd8a8312 78a991dd f10f97e6 41c4a716 32f9078b
+    72694290 b414d9fe 9ecfb0b6 630fab8f fdc3b27b 290b92fb 79a16fdc f9ecc9b5
+    e81a35d6 16a42d3c fc950d66 bd73c664 401f4cb1 4df5a144 cf95138e b0980d41
+    e519503b 72fb5770 189883d6 5370bcfa 2c9e1aa7 eb600566 d9103c63 0212bfd9
+    be272cd6 1b7fa6b0 9f54665d 212e2c24 cf4e2bd6 f30f9d9e f60d3454 91175536
+    b375b2ac 914a91f5 1749f1b9 4750cfe7 4fc395c2 74a1cf89 859de6e5 4b967d61
+    d5075aeb 58e83ff2 4401f296 692c2787 8ca08473 e0d7ab1d bf8be009 6a4a168c
+    128dba39 2703b096 81f3a1b2 cf218372 05daf7f5 38b80540 4b82fbaf 7c8d95bd
+    1b8c9286 56050906 14a4ae77 5abfdbab b7f1eba5 97ce4993 afee4ded 2e1f376f
+    c2d2bc96 29a3d9fa f0b27036 c0098334 9788bda0 cfbf391f 2b519350 803f09ef
+    014fcab8 bc6d9991 a57a8360 2c602932 5941755f 2cf0464d ca802843 db781088
+    dce1656a d79bc244 d7d0540a abc9d884 6fa3e1c2 faa68528 7f4d1b3d 74fb824a
+    714145f2 4515ad28 79436956 190eefdf 78eaf345 99277750 158f929c fe3ab5c6
+    727902f4 094071f7 53caa89e 408cbbbe bda1c90c 8effd6e8 3f685a4c 6009f5a9
+    0c76c653 b3acde11 7a4d5a86 fca8cd67 16b9b2ce 4f8ee8d9 ddb1ce3f bce25055
+    d75fc688 38e588fe 0760f91f f21c737e aabc054b 1e36c527 aaf9cb3d 4c28cee7
+    87d668f0 891d
+h = 4a58d00e 9d146479
+
+k = 45040f8b 98c2669d f391c672 e446766e
+m = 25ddee7d 806d03d3 f4c6e013 0bab9b7a 344e95bc bfb27479 050c90e4 ac365091
+    b7101bd3 a37046fb a1c22e48 afb6bd72 d361ab96 c2e43fac 379bf7b3 61db6603
+    8c9fc644 91c38acc f9944919 cf98e421 b30bc755 75de4888 b59205c8 701ca816
+    20ce0943 70f03083 8d02f96b 1e6d62e6 9f30c5e9 df5125fd 565a3ef6 9eac7183
+    74a590d2 91dc11c9 d37d75cb 29a697c8 8da2b801 fc23b221 d15fe970 acd4f794
+    4bc349ee e73054df 7a16b839 3e6b5be5 9a0ec59e 46117450 855ff105 94d1f946
+    6e4c0c26 8e7f65eb c69947f5 cb5900b6 0b43b6d3 61283256 f5be2a7f 10d374cf
+    02373992 dc8a7c60 5b4330be f2525860 9ed75ab4 fcdb3009 021d6b11 7bb4c21b
+    0f94e516 bfc4e618 a925444b 72acb37e d9962978 44c22d58 ff91bad6 f604c314
+    e5db3ff7 91cd9750 20f42451 b97c923e 38b05a7e c608db85 4099a58b 6c85c6f9
+    19bb70f7 b2f40d54 c3139dc4 42857047 65822099 fac96f79 b1dab9eb 4bda28c0
+    5cc6dc51 fdec8877 f920a990 dbbcb808 65e571a1 523cfad7 6032fc8b faee1584
+    afe2edad fe048969 8833dbff a06e2957 f7b8ec67 2d7f5a93 1eec7bd2 877419ec
+    f1bc14da e91b27c9 abf8af3b cad1e581 2e7e4b46 dcfa4ef5 d2518875 603db24b
+    7264951a 27bbdad8 5054f240 ac73e2a2 5b70bf80 a98c5a12 30bb2dcc b87a53ac
+    610190f9 1c582189 7c5f283b 9513c9a4 77291fcd c4f042e0 60f4a397 efb20051
+    f666a4f3 0ce31166 bfd1e22e ec245d54 3b28a887 92871533 4944558c 76d363f5
+    eaef8122 58aed5d9 32c37048 0fc6ba44 accb1d03 95c78cb6 70b8ebb3 ad54bc0b
+    cef7ba4c 3e7f237b 4ccb7cd5 9015491a 3fccaac5 f820ffbf e97973fc 8ee0e0db
+    16b93452 0cd9bb5b 603250a7 ac6f5083 1f98494c e0d2177d a255aaaf 6f548036
+    a2435b07 b397e7f4 0d05ee77 01707ab3 ad0035b8 c3791dbd e39a3f1f 1ce08bfa
+    542959ce f527b6a7 750fc677 c11f6b4b 0b32fd62 ac6285f4 941ebc04 2c1f64c5
+    8c438225 2d5b49f3 4eb3fcba 85232da1 ea584301 f28da6ed c96d12f6 a1312e48
+    656dc1a5 08fc09
+h = 75032f29 83aee7f4
+
+k = d46575c6 95b46467 a2d1999e 38b4ae5c
+m = 4b6f3cb0 9f408cce 27cbeb4d 94708bd2 6d348558 cace8409 f90d9724 921703f0
+    b3114208 1379c00a 113e71cc 99f5ea71 0bedf792 01b880ca a468a4f7 6cffd681
+    ed10e4dd a324b3d6 120a7905 3efe7de6 bbb940f4 ba6d1611 78e04a9e fc2c2e64
+    a947c5bf 68c5b57a 6749572e 64acd412 60f50280 de4f31f7 433bf92e 657bbf18
+    5fba2741 77855a86 3da061cd f7b3e05d ea81d3fd 7e9a159a 2c6066b8 2b4492f9
+    12fe14d8 4f71ef35 41f12ebb 9f98f6d8 6a3d7a2b ec20df2b 8d4867a6 d297a46d
+    99c5fdc9 334450e3 ab6b1e64 802e2d7f a382ae97 b2a04e87 b2c233bf cf28158f
+    94a4644a a69bd459 357aca19 d43c0eaf 4c8599c6 5aac835e b0e09a2d 1cbe2b4e
+    f42acd40 29545b4b 8cf75be1 70305ee8 20ad5150 67e25d6d aef792f7 5362e34a
+    c9a0792a 6f66cdd2 35683ff3 fdd44ff9 c7dd4ed8 1b6476ef 3243f177 6f545aae
+    cf6494b9 7792d3e0 f0fae2e1 08cc0371 06ae0c4b 5c57ac2f 00d3d882 c45314a3
+    6a95606c 01cf214a e9341b1b e1508a8e 4e1733b4 ce55982a 3aa7524f b56d34ed
+    f7e7b6ce 5db78516 a0c2c5b0 8feabc9f 5413f157 32145a71 dc9ee0b8 662a2e0c
+    2f3ce5e6 e6d4e3d1 62de49b0 bfa31191 d226a51f ebf8d6cb e37ae0d0 c783519f
+    b1f79a87 592dbe3d 1156b89e cbad224f 0887d6bf 17ae7da5 a1041465 dde9810f
+    4b2246a1 f9941c4c 294f0b26 f895917b 0ec046e8 3eae1f02 7814b05f 8a9da84c
+    6b636744 c7a518e1 4e123304 94f0261a 82f3dfa8 c227cf36 6341b028 48de181f
+    01fe3fc5 3489f4bd 0148ff95 abc4c5d9 80c4a096 a4617643 5fe805db 8f4a29d5
+    dc3d5b78 4f0a3fe4 61584488 deddc9ef cc87b972 513f0e57 07cb7b77 7c057c61
+    b8913980 ed752e23 08296e3d c7b59a51 122da515 f31eafb1 df3b3ad0 6d283764
+    8e7d5b81 5bfa9357 3f33429a 5fbb95a6 1aab8207 e4fb1871 2c94eac1 664c0787
+    96bb30da 15d80418 86635425 de907a10 9be48fd2 ee3775cf af9ea330 50aedc95
+    323f4ec3 ec7784fd 4696168d 8024474b 63035cd5 d3660436 985abbcd ce4b039d
+    3d97a570 2bb30d46
+h = 918c6050 59e9dfdd
+
+k = 3595f9b5 d65d035d 94a83e37 8b428073
+m = d7728124 18119973 e857932a 874d231d d0634adf 4e72b59a 5adffdce 30e15c84
+    d2d01790 3b447f8c a15d9eed 2935033b 802a4c2a 31a0b658 7c6a5da4 5f8e66de
+    9310b698 e4a312ca 2cf1c2f5 bc4713f1 77098470 a76b7246 83b2cc8c dc47eedd
+    25ce0aba c076fceb db7a5df8 ad30f41a 89af6d5e 13a8e031 2bdd6b28 103d87be
+    d477ad30 669d59d3 0a28b503 e0f59265 9680a759 2caf4878 0983be6f d441e6e2
+    1ca5c248 10e1fb29 740588c1 8a53233c faa809c1 3b0737a8 dcbcf131 42991ac4
+    5452b491 1e021e8e 03f32d1d bb4fb405 d0ede659 76212538 b7844268 5c243f48
+    a3b0ab71 988babff 7586e67e 7e7d8217 0becbef1 c4e90425 84811eca 337a2dce
+    243b9f03 e04048ea abb4858f b06966f5 547f2362 d6126fb0 62d8c5d3 157d4ad7
+    6ce1d3b7 255ff7bd ae784f2c b2eee5f3 5f70b4be 1dd28777 2fa1dcf7 6a90740f
+    c8255fb4 4ac30fe3 c4e02b4f 85311425 258492a7 9608a6ef 7b0849b2 95bd1f3b
+    1066b864 b4e0d810 40982533 983558d2 c838e08a 694581c3 11c871bf 093f0427
+    9a9f13f1 6891c717 c20c3241 f224392c 07eecca3 caf9b154 08b528d5 95672af9
+    3491e62d 7b5e08eb e719d77a 5623d1d0 76c9751d 0980ecbf cb72c04c 51e7cb0c
+    40f21a3a 332eb50d 6da483c7 2128b554 a30bd5c5 ec909b0d 25f38021 cef22841
+    b4a2e9f5 799f7ec4 d9fe239f a23904d2 3566aef4 e2d9c44e ed4bf3fb ce4101fe
+    d08b0f60 36fc918d 1e13c7f6 93821aa0 d893884c 9b863f06 20054bfa 8a2e7604
+    b84014a0 9de3e141 4e728514 dbe7af0d 085d8ea0 c9c2b898 55438184 617167b0
+    bbfd2dd0 c1623ecf 499d7370 38a257a9 0a39ce4d 2113d97f 328c27cc a8f0b86d
+    516ea5a4 d8f8c848 eef17e46 09c13c79 f84f2ac1 f46517b5 1dce541a 8ed60276
+    ed266d79 38269aa3 22f6c389 361b5f9a c07aaad4 e9020b8e 7a3429f8 c389d785
+    6319d41f ff722c7d f3cb1d26 42808a42 c2a1766f 73a768c7 a03aba9c 6e62951b
+    77b8c667 b8f19f66 b31de351 96965f06 3818a7d2 8d7e609c 97348f8f c51ceac9
+    d599fc4c 781b8fd3 f6
+h = d379fda4 f9f5c327
+
+k = 15d4ad8b 9e1e6e06 269b9859 8a152c5e
+m = 32b9fc23 2cd91e49 def6d4f6 3434a7b4 c3d8a60d d129ffc7 5b14cd2f ea98cde6
+    3685e332 74b395f0 b7c8865f 48ebaf76 2a80cef1 c835eb4b 0d04e715 e48203ba
+    3e59d257 76e37347 1d82b767 c5861dac e6a95880 4eadd3f7 5893eabf b325aa4c
+    76800e49 4deac1bf 4d27962a 1de79355 008e8af3 323229bf 27308b8c 00429614
+    bffca636 813cf0b9 1e70afdf 057258b4 5a9dd148 5232f861 fa75e586 7e753b32
+    75aa5804 c35ddb33 8c762555 17613214 66974212 3e3b7297 a9df7331 35a5c60b
+    e3fb6a9c 5abcc665 da8d2c7c 7de9ee59 09ab1edb 08e4cc36 381cfae0 815c670f
+    94e24a70 ab70331e 1f364727 f20ed50f ff112810 ca8d09ec aa00652e 3d40afcc
+    689e09c0 93b4ce5d 38b79d7a b11ecd3b 05f11ca4 222654ae b624634a 975acf3e
+    ea194f63 3665e726 97b73fd1 470bf2ae 37ca19e5 49da1245 6adb3bfd 943fd190
+    80d561c3 b8b9101f 20bf32e6 1c3981fb 9588227c 6796e4c2 59b17c57 18defa83
+    a05319c0 24dcc93b 6b74cfa5 cfbfa1e2 7efce527 b5b8a87a fda5bfdc 820fe859
+    e97121d7 49189726 6562af09 10a2759d 6a5afde9 36c3fc8f ad859caa f4592428
+    ae809f24 484ca663 34ea4eb6 67acc7fc 97306d6d c373d895 382daf3f acfeb8c6
+    b76919a5 68f12113 bce3558c 2dbc82a4 47a0bd3a 0a1a932b 176dc665 05449665
+    2e5e0652 cd0b959c 329f9cdb 8bc7ea31 544f6247 453e12a5 d03687c1 cce79e7c
+    8362932e 38825e77 b9358fa0 5647bb48 b9e0db28 38b2baa0 b4b48707 3f36dd9d
+    9f573a05 39db59e0 47f20f37 3aa3a468 20c637b0 1869f93b a65fcc4b d4a42818
+    d9ddbbbe bae806a5 dfda2118 e070a398 f4046ed1 d4d63e4b 5992f95b 5bfc7367
+    3a8593b2 797ac3f5 f089b560 d031a833 4f9cca95 d34cb463 4e6cc810 ae29dbdd
+    be8c5f2b b8a8b173 8ca3492a 652bf84d db3bc27b eca34c6f d2863eb8 6477f86c
+    b082f407 3df69e7f da265c8f 930fba92 c92891f6 9956193f 9f0b12b9 c6750861
+    41061db8 eeba2fc6 437d3cbd d1a81f7b f32b6a19 4de2aef2 41a7ac1f 5922c7b7
+    d7de63d6 67075f05 8ddc
+h = d67da3e4 770df8aa
+
+k = 1e52bdca 6c2045be 40d315fd 370e6be5
+m = 9d75baae b2bc9f68 0b6fa492 8a57f2c5 30d683a9 cf5dd43f 72c6c4df cf412797
+    43e4b2f4 bd6f9b48 3f73b82d 5465846e 38b1f7fb e8bc6fdb 5986c1d8 ad9433f1
+    5f89a93c 791be70e 42d49519 9dc63167 8722f38a 1a845649 5a0b075f 3d41c0f0
+    a7bbba2e 603b8362 caa1c1a1 2c126cd2 a546ce15 3948d0f5 11a0b274 de928a41
+    f84e44ec 6e296b1b 26e54c5a 72c6cb42 9d6ccc18 d7c3382a af76edd9 f853746f
+    c6fed56e d7848563 0aaf4325 af20d175 61fc66ca b6411b29 7cc4f583 9e96988a
+    c685a202 71e97dae 205b40a4 b38eb526 7a44fe31 f48edf7c c0882702 9d6a76c2
+    66078ddc e460405a 2922861a 52069780 89bf22a5 fcc9b809 c0bdc259 9ffdc06d
+    a6a52a30 2e52ab60 571db011 6eeb37bf 092e1263 a1c5055f ae047740 271596bc
+    7a37f137 80e097fa e62d255d 3e4f84f3 2ce9a198 325e3f13 b85bd93e 6b71058f
+    e9b81fe0 16a37d15 8c69c460 19ecf048 410d1d19 36c5e065 cf3b9c79 2e52f871
+    2b04c548 1a99b1e0 d50ff76f b558129b 41867eeb fffdfde2 0d7c75d8 ca63188a
+    0de40b25 f31b77d6 f0d0ac12 a15796e6 41f13e40 8ead062d a7231f1e 61af6db5
+    3b1154b7 d08217b9 79feffcd f50e7654 3451b941 02f5a26d c5fb85bd 17b71d4e
+    4ff1a3aa 9284b96b 294d6cd1 9cdcb1d6 afa959bf 0a53a1be bb9e39b3 e9be7c66
+    870dabd1 62c7c169 a54089dc ba981256 5cf58bdb d381190e e34067e9 c22dec6a
+    4bd8c4c1 3159476b 6e566da7 0339ce10 706862ad 3b3d2060 114ee9f7 dccbfb88
+    96c343e1 0797683f d26f11c9 04e65215 4000059b 9742537b 4e5e94d1 7df535c2
+    35d01aa6 5eeba7a6 71866088 591f9ba3 ab3a4b40 20444599 5688a402 4fb0ad33
+    4edf62d5 5efeb93b a076167f 57a48716 e9e21f15 88261465 ccfbc5b6 6691711a
+    9e20ce09 0b704d28 19bf39bc 2d55a8b5 f0db4009 0f0dd1b4 0e45b321 27449221
+    be8b2b38 da5c2624 5279535d 4d87ceb1 26da73d3 e8291e2c 86e1af30 81c0cd88
+    b02aaf57 a51c13dc 0560f216 100ca244 5882bf60 e5a704dd 49babf8d e4fc84c4
+    ba3c54c5 062e6ec6 18d204
+h = a277f0b5 df864923
+
+k = 1546d319 527e8c17 b6c53217 bf1e54ec
+m = 9b6454d7 3a3f765f 38a87e0b a72a30a0 6075975b 2ddcb68b c99363bf 2b0a2e11
+    2147cbb0 2715f6cc ca1bd942 5f8f8f3d 1f0f96e5 6aa448ae c792abb5 fce2f4d9
+    5c797e9a 097e228f 4b85a1a7 8941fe35 75f1242a cef0343a a1e5db4e 3a6543aa
+    f091f13b 01098236 9bbd205d 5d0584ed e445da34 45cccc9e d820ea77 0fda19fd
+    acc6df28 c0b33be7 ad03f041 db22930e d6524b5c 86e2928d 7c2bc47c 8490760f
+    ae3e4794 b5d30681 e61b64d5 c1367581 a5205244 0ff231eb 34309393 b7726b49
+    947f7ce4 75953cd1 b82f73ef c03a6cf9 7cee4dc6 d55f3c28 f7a53ecb f4101639
+    0228fbf7 0f7bfc61 a813a8dc 17b5a8af dbaf68e3 26e0f535 b810f4b8 9fde6ac9
+    27871cbd 4c59bd93 56bae961 d88d6403 f2025254 70f15f89 423cc0a2 f457b6e7
+    fcdf21f0 317991d2 670d6ae4 2ea61bae 84fdbd97 befc6a30 fe250389 82fa45db
+    4c1edd4a 519802a9 ce429851 e6896d55 630e9991 49b1f5b1 9902aa03 961d3eed
+    e9e25a06 7fd6b59b 934ee113 f3cee70f e52c3eb3 79fd7b7a 98a92314 512f0570
+    4adc4804 19662610 2a30fe9f 43545d64 8c59d988 a481c824 61ffe1ce 96c5b36d
+    13fbfe56 60c65968 ef13d93a 6c7bbd2f 16ef5aed bc5ab8f2 c7ae2957 427863ce
+    717da788 4b579d98 8b8fb367 b5c4d884 d5963c6b 2e59de03 f9c948a5 4517b22f
+    218c13b7 9010b89f 48ee9b61 73323f46 75715ba8 d10e77c5 25e13820 8de19044
+    31aa4523 bc2bb758 a8a4aeaa c61d3f77 6c8249ea d36b20cb 3e5164a3 5ab71102
+    255755ed 110dbc2f fa64b51c ff5ae3db cd45a76a df5ead84 bd361c41 81976b1f
+    49c9d993 e850b205 03161540 9c214c6d d52cea07 a3d75f49 aeb3ac11 54d10fa8
+    4cb24147 88362a96 d73ae084 e570c57e 231672a8 c3190f9d 67ecbd9f 45682c96
+    5118f58c 9538e71b 43990733 96cc4de0 af470f37 426e9825 2826f442 05c52e06
+    2a5ec7ee 057b3b55 644bd027 c2fb8b46 df9dc3bc 264ef2ac 626fe478 9b4d62fb
+    994b7651 543b5304 f60ceeeb d1f67acb 7dea23eb 8ceef498 35a0dd2d 78499603
+    5f41131a 50e662f2 7540c328
+h = d028e3a8 6fb1de8e
+
+k = 4f618c54 213ff531 5fc525c3 d0a81938
+m = f02ab191 f360c0f3 af4f1191 ba6a8843 f6f56ad4 b59fe5fe ad5360b1 78fb7bff
+    6df13a63 800728e8 ccae81e5 f5418dce c57f03ed cfe2d511 824bdc0e 6b3a1ecf
+    06fe21d4 edd26a11 7c5e94b6 ff8a3869 720a8fbf bcb365b1 c7418c87 12ba8814
+    195b7b4b 038bf01c e711d258 6f390573 9557c48e bcac8ddb 016cbfb1 87640636
+    2f731ede 17abd58b 2f175be9 1a4d85b3 26d64bfe 6d57a729 f99167d3 02e00689
+    c99d488a e961303d 90d42a9e f575865e 84bb645d 04d25962 016242d7 3798fa6d
+    1d2be83c f25237d2 7cb55d64 772071c5 b03371fb 148ede27 75448207 4d1c9983
+    711a6f82 e389b4f4 be568037 7024867d bf2f78a2 df880efe 52b5c911 8350b5e2
+    cff11c4a 1848b374 55971aa2 89e6f74e 6b2cab04 784188ef a7e00058 0e4c82a5
+    3085feb5 798cd7d8 f39fc3c8 b15f924c bd825f93 91f30dd2 099f613b 6ae6f258
+    f7fd7097 56526bf1 969a80b9 1b968876 aa7ff837 00ab1fe6 0c028537 b9ca4aca
+    2b45156e 29cd3af5 db49d43a 6ce588e0 b3763ce7 797f550f f894675f c1dbc7d8
+    301de725 3fc2dd75 14b7bc70 f8cd6951 6edfc0fc 2f2a671d d64df424 beec47ba
+    b926e009 1fdf60d9 0ffa7653 358aad9b 5741c22c 25575753 09498a50 38390d91
+    17c8b731 3c97aa51 e0d97508 d2d61326 d5a7132d 271eab39 69089e32 10a2624e
+    b423fc7e 7e48e841 82723297 203822b8 a0ddbfcd 997399ab 677071ae 4b838c84
+    3f05647a df235bff fb12485a 280e1bb8 ab1e8ea1 027cbc9c fc181355 f3153f21
+    cfe14a30 2efbcbe1 b3edfa66 b3f67ee8 ad40e22b 127a78e1 7bc805d5 b06d785d
+    35d0b1b1 c77ab8d6 2f9cd105 72c12a5a e0632db6 81c6ffc4 45beed57 168574e0
+    53738951 4c10a837 a5a75134 ef2ae30f 4ddf8eff 8313d9f1 a0529957 d0ae83d6
+    d1967dfe 3f9d6825 5f01ea4c 1632fe84 44a7d7e3 d58df705 42dfddaa f8a8e29c
+    b0c56298 d8feb8ce 23f4bde9 120baee7 34d01d56 08d23f98 877e3ed3 5baf7e53
+    2d49e95c 819dcf3f 7743e08b 9683866a df9e147d 378f1ee9 2a39b976 6f13ffd8
+    e61dedce bc8e0a13 77b73ffd a7
+h = b943acf8 f2b3cfd6
+
+k = 8479c89d 53d7b15f b0db35e5 39313fec
+m = f916fff8 fa709810 cf7eee83 3b19f5cc 22818680 9040f2d1 861aabdd 2787af49
+    599f6b23 3f9f9d58 eb7e1907 c8ffe411 b0256c44 be6b12cc f2634176 8c2b6393
+    727d355b 30987f00 dc670061 304a21ba 76317d62 86251095 e65f4883 cf5bf97f
+    c47fe569 a5b4cd26 93f06749 385486aa 27f8eb85 440f97ae 8c790c22 e0b0a52b
+    74bddd36 882dab3e 1edcb1c6 1db8847a 1a47958d c23754fa e69e4e48 62476ef1
+    52ad069a 5bb43383 0210d921 8f11dcbe c0488d09 4b1886f3 13ed4053 ce5fe380
+    be59f8f1 e3be4de1 a9d0b8c5 b39aad4c 1cf6f40a 56284af0 b6938493 7aa587c0
+    d109e8a2 fe8fdb67 95a7e002 5216d2c9 e36b9fa6 840eb76a f1e0aa22 440a9816
+    84ee7233 beb94d03 0d6e09a8 f2e9482e 5d3e0ae7 047d58b3 6c558b69 f461575f
+    4ab07e8c 166490ef f44e244b 7222d3a0 07eaa30d 5ff1dcdc f100cf2d 426f301a
+    d1156506 69208988 5b4b320b 040ed813 93abb6e5 361b4656 19c2c839 a44fe673
+    6ea62787 5adaf6bc ba7d6888 43e2c7f9 a739b6be 88d8aad9 edda3db9 6c68e358
+    8b53c750 88112096 682010b5 c2322155 ca32f45b 3de86c15 a5fa955d 4bdac2a6
+    b07851c0 aa879fb4 6d4b909d b3d0c0f1 e567afad ca94f830 d9e77e52 87940805
+    d44df867 9318f164 e5bbadb7 cce738da 504a3b64 82b6e831 203d7399 9ea326b6
+    25de57a8 26306cfe 3fdb619f 0d096d6b 0c081f07 013583b4 b14d5b19 0a1f6877
+    e59a4749 76b581e2 7a7d47dc 4185e429 84336726 4bdd48fa ad808270 b8d66766
+    6ce0e14b 915cca51 07f7b3bf 678941ea f5e6e24f f1bea6c9 b2646fb2 1a66e240
+    fa6cd9e6 be7b534f 1abcb668 3bd754b1 a68e408c b82ef05f 7921ddc1 5526b462
+    e0a3ab37 d80a1193 29cf16a8 4fe2cd40 8e5cdd00 4e4f4206 bf301472 42e3c70b
+    13c08b31 2820252c d48e55a2 bc7ee6a7 fde55299 576dae91 68dd4f48 e981fea6
+    0fb44783 95774a6e 198b6ca9 5a762c54 d9f7b047 e45a6c2d b5e48cae 1dbf621d
+    a8faaf21 7a77d532 647b6209 64cda318 aed83638 4c0ed110 d325f166 f726bf81
+    a25fa7f6 d0e31785 d999c939 82d1
+h = 77219baf 73f3bab9
+
+k = 75ab6e1a f5583960 418d1928 58e6f89e
+m = f06b3312 e9da3c6d 5d2f5e48 07739925 e9aec131 08dd0f65 a9ad51ca b6af6447
+    6cb21cdb d33ec604 fcda866c ed85e117 5fefc6a0 7ad82530 243829a0 1489755b
+    ad7abdb4 626ed075 b50f950f 7d7ea905 d6edd935 f3c788b1 c40014c4 3791d79e
+    0480ee20 e6f3f618 9ec79a9d 98097a72 3f0dd2c1 f3056044 31d2351f e39d5b42
+    6faebc1e 35bbd53a a08af781 0e4b796b d990d48f 1a6be38f 1bdfc978 eab283ec
+    9fae49dc eafce30f 5bd90594 20116b4b f0ac5589 982c57c1 c40a53b1 2daa86aa
+    3416b740 b2ad4952 c989502a 8fafd582 80bb83d6 c6fba3d8 b6c7a0c8 74fc7708
+    9f104b07 7a7146de 8d1c8098 688532b5 870fc432 9bf3411e cc162006 0d2706bd
+    9591f7b3 06211932 d97e1c60 9dda33c8 9b1ef7b7 db24ccb2 d9875d50 d7a1a90a
+    a4e8cfee e0f34d2a 408cdbea 0d9fed34 c8c1208c afe44eff 96dadf07 8e4dc8cb
+    38a8d67f 73705570 ad603e63 9ef95a88 05fbffba f39dbd82 0c5aed9f 11654fc0
+    ac3d0b05 8e8ae7cf a1f18650 ab582433 54d82772 821b25f4 b0280e13 a23664ac
+    2a4a1f27 9ad7e04c 45c178ec b6d10297 d4d56810 c4df4e47 abccf026 389a7b33
+    8deed02d be23c040 1ab1a225 1c62bd71 b818fd01 b945f8a7 282963a2 ad9b44a9
+    9e73bfee a290853a eda24dce 332e2119 2731b82f e10f1039 c7d3831f 2a620cb1
+    53c6f797 ba2c52af 01e78f2c 32e3fc55 b2c8ad58 f587bfa8 2a3e5b60 5f2d5d7e
+    636c8a7a 83f10bfd 2a033e86 6a8c9b68 f7a8a7c1 401278a6 fa8f3e74 4fc03b34
+    0cfd5d7f 9f69c051 a04fcfac 52a4e0b7 6b32cb33 d78c541b 59f10876 cd3c0796
+    450f25b8 55e3dfed c0407bef 47b3b245 f37d9b9c 67bbe4f8 96a0c4ec aabb90a6
+    40f1cb2d b8f1a9dc a84a3b20 3a14aca0 f6b37925 730f6ca9 5b927992 b02193ed
+    e3dd4a20 ddf663f1 08b0875f d4fee158 760ec763 1238bd51 b8a286fc 3775fd0d
+    070f3e26 e669ca03 849357b5 5d1e3404 f91d1300 540e881b 725db483 c70cb86f
+    53aaa6f6 ca431aa4 6e483d76 2de12355 84d2e146 449441dd 570d1405 3808b268
+    d6f413b9 d12f4f09 6fb666b1 2b8a51
+h = 6023b608 ef35b102
+
+k = 563e97c8 e57a9517 e7ff9755 7ba19ff9
+m = b3573de3 7a69f6d6 a6d31e58 5148efe3 6a62859b 02fccc0f b10dce6a e3980298
+    cc964b09 81a06cd9 21944d1d d56d6382 692f443e 4720af09 efd05f77 03facbf4
+    8bb22160 37e47a2c 4dee82a0 57c0db73 3d73dee5 4ce0ca1b f1ce52dc 58d95059
+    6d93823d d3874522 a16bc1c8 c0505423 181175bc 9e0451ed 9d011e45 1e71b456
+    e9bff22e 74479836 760b694a 0688a892 80e1dbf2 f4462e73 19034148 82cd00cc
+    1c138d34 0460a613 3ac7591e e8b16a8c 3a17ebe1 2fda0dc0 1fe76c54 18885c83
+    742e85db 6330df09 97509350 31a604c8 50e5a1dd f705bd0f f7111dfe 545f6891
+    5d298f0e d6357723 d4c118d7 8f0d1596 f5a0dfa9 a0094aae c61ccc46 7405d5a6
+    f1f37b12 521a3c46 14af15e7 0ac6c8b9 e8f2358e 9920233c e7f35209 cc63c72f
+    e152e742 affad9b7 8e599468 fcaa7001 1f1f9ee8 6a903498 e8d4bf3d d25a95ad
+    e302eada bccb2f10 9c666d52 a726a33e 7c51d1c3 a7576343 b8c9ce3e df8f808d
+    cdf86bfe 87926b93 45f2b377 4f10b877 1f1aea99 13fef495 bf7a356c 8419028e
+    a2040d10 afc1b304 85e7e274 2c763a4d f4dff244 5c12eddf d9cddda0 0d8fb89f
+    b3f9339b 68e99fb1 9062f870 63e15577 61269995 eedb0436 a35fea24 2351cb6d
+    e47171b7 4dc34809 e4bba0cf 1f6f5617 1ebe4c1f b9824e9f b15c0d1e 11de6e51
+    bba53005 1f6ca960 02286476 952967d5 2a8267e2 520ffcf0 2a1a356a e4e3dea8
+    3c9a295a c0e616c3 46f350c4 edcb9e58 d8fc7e16 5bc57e5b 554e3ba5 087e8315
+    ce72124c 5c7be36f 9026a11c 1bc2fc98 95c25c12 c2091b6b f074dedc f86635c4
+    0ff17226 6fe837a0 a6c63b38 d1b46608 9e281736 c52ffb64 41319c0b c5114a67
+    28757b4c d3fa59a0 0b6bc618 55f903d9 5f378c8b b603dac8 3dbd9548 2493e701
+    a5ce9caa 127ad7f8 60293d6d 13d9e0de 168f6eb4 32521a80 6653ac1d 3d2eee60
+    12edfac5 8af29644 cffd6ca3 2055fd96 23378545 223e595b 8f67b98f dbed1afb
+    7215f7de b23ffa0c b6a1d1d6 61e1c79a 836f1fd2 4aa5aeff 396224fa 65a32a59
+    297c2a87 edc454e1 0b8428fa f58c4eea
+h = f29b5ace 0e0e2194
+
+k = dfb4f0e8 525cd676 62acd266 acbad5e5
+m = cca9701f 99a2c274 2cb01a2e 12cf9a93 5ac61946 85725519 902abba5 169615fe
+    1dfe48b8 663346d5 5cbee500 4a95b81c 54074fef 87ad9f49 f6a3c085 7e1fd0ac
+    b44684cb 95a43943 448c83ac c5a00b05 7aaf1d03 69c3eb51 a4b60e6b a5845595
+    20ca96ea 9dcb50f6 d62a32d8 1152af01 628f2284 99bc8911 c3f7d592 e9b266c0
+    8a1a704d b310a758 80ea3318 d8461d8b 59366850 26b4c91d 3ad6bcc4 e6ee02c7
+    4d530331 659907fe e07fd87c 2a200442 236f54dd 1ad9132d 72704dbf b8b81516
+    dab4f16e fa321b6e b6703e39 f0dd73bf af49e5e7 2c8cb20b b9ed4a89 11c7d157
+    ef5bd830 215bbb07 82aed376 02b49f67 d5f5e4dd e039de4d 2a8e9925 b4ebba19
+    30a515b9 bb0a2c36 29035e13 711e1110 32af0d76 f0283157 31ddd776 3d9828a1
+    17518c81 dfb05769 a3625538 7b7f5443 9f86ee76 f90eb29e e340d5f9 822d530c
+    0157b77f 24a7527d bbf4ceed 26af81d9 c246bcba 2f58a1b2 bee277fb ba2bc6ac
+    0a631d04 1a6046bc 5dbdfe51 241fba06 abf23f79 f762d3b4 8c394068 293a7b14
+    1311251b cce97ed1 689ee965 fa4b9b64 bcb8ce52 86496d8a 19749507 b9703ca7
+    ef09f169 09f86f17 a144a747 3e1d5eb0 31149068 0ba8a3a4 1e02fdc3 27ce36af
+    6ccf7118 8d76893b d8d89acf bcb718c3 5b3895c4 a4284b49 a12e0a3c 45d5728f
+    d92da119 d2769766 19bce72f f47e010a d3c6c928 bc424343 1cdf2555 539090b8
+    c2a41532 d49afa3f 4d30a974 12c79f24 63c3e64b 14960b9b 39868315 f5ca43b7
+    0f6df2aa 5e7e1615 5759ffbe 9d8d7df8 96f4855f c3c10d57 161394b2 277d3ad3
+    4f73894e 705304b2 2f4cb7e9 df06e703 9d3b9b3f 03a97700 91a0a215 4fea27d8
+    8c55400b 3d0b53e1 2102f237 c29b0466 d92ea5e5 66cd4c4f a7e83365 2c9f43e5
+    3f69032c b48893b5 d3804ea5 306a928e 182ec0fa 585965f6 d7b42a3a f7de7e18
+    1cd013b4 e721e0b1 10d5d60b 3f960d78 e0cea2a7 29541c64 63823b7e 6d2abb42
+    5330c2ae 7cff599d f65da6ce 2ae07bb9 cab8264b d41f3290 9fa2699f e346cbfa
+    f8294fc0 72d1e476 83e46c97 92972cb2 9d
+h = b581a14e 0b58c6ef
+
+k = 7d1f2cc2 7894b146 33e9ff67 939d3e6a
+m = f874b3ab ca31a8f8 25b53d16 4614cecf 02c7f3ea 5c2961b0 21893677 8d352431
+    1b954e73 ff75d27e cd37438e 3f6156b2 bcbed0ce fcd7af1c 01a9f690 2fa99545
+    6c2dee73 6d1aa2f6 6c04adb0 b81f5a97 7e0ebc4a aba80621 20c1906e df9fa54c
+    17e5ec8e 123b2bc9 dc416dfa dd1dfee2 33aa58ce d521bf46 f1a68014 cb894327
+    e14eed84 2e50d92c f51b4ceb f725e279 efce3a91 7bd067a9 6b1d9bff 3226b980
+    05665af0 a8d002e1 f777c9aa df2a4967 319009ac 90859773 a1a1e5fd 3d309e96
+    ac11c50c 9256746d 061b37f8 5db1166a 496d5655 83b4232d 8bc34d95 a536c03b
+    2ead6929 e58337de 89636b1c 0a908201 4ab23ada af7c232c f39e5c89 066dc947
+    5e63109b e44ed242 007a8f56 6ee237f8 ca90119f 0f3a85bc 1abb7a7c 9c085429
+    e18c30fb 8d6207e3 ec37eefd 85ae38bd 7424e570 26de0708 bc126652 306ac731
+    fe15bb91 a12213bb 05313edd b0ef4554 09f86992 3b260a16 41087e80 91831f48
+    10a49ede bfd8811e d24ff6e0 d9be67fb f6ca69ff b15e6f66 a246d700 2fd05d3c
+    db11a207 d24a23f6 bc155c73 75732cfd a48b0fac a21a5814 567c594d f69e212a
+    10cd26f4 3418fe09 d8ee5856 d7503871 e82cb169 c7d3d1cf 03fa310c 765e8be6
+    4689543d 8a06ba06 cb338f58 f8f4e7f0 954ccc64 645da485 100b6330 b559a219
+    34d4cf3a 8f855f07 5276bf84 9458e64e 0232da5c a2de091f 5f4e0074 a3fd6307
+    be31d593 5a715ed1 213d2154 2e6032fd aaaf063c f855cce8 6f5a01be ac58470c
+    66b03c15 a2898af0 e1b0ba64 aefd7e23 d00acb89 8c294afc 31150bd1 3e084f30
+    b210e1b0 a38477ca fec9af75 2cdf6255 0c277ceb 28dfe8ac 348e2543 fd522f8a
+    f76a89f2 d6d54496 797e5033 02c91831 6736ecfe 53614e56 fc26bee9 945f46d4
+    0a27639e 3d9bf3c4 19c26f1b 2211aad7 6e4c2baf d154c6be b69ddc4a 549e4c69
+    78999ecf 4519ccb2 0502aa40 2a70b96f 5adbf7c1 c22269d0 eab45a1e d3dc9048
+    2d30d2c6 034f59d2 0b1fcdf9 e289bb4a 75a62623 fc3c5c70 8d4fffda c67966b5
+    6fcf8444 89fe7474 8caa352d 183c0ef8 207b
+h = 7d9747f9 bd716f8b
+
+k = 1cb2e6d7 de289f97 c1318b3c 9b838421
+m = f275d228 f89c122d 59e094d4 aa8c4890 92fc291d 1f3f1b44 1f503127 28441ed8
+    7f4e9400 c9d845ac 0f62e10b adcea2be 5c8d34cf 278f3e76 2ad8475d 5c547ea4
+    c6eded91 609d3986 ec431743 525ab62f be8eed71 e33fcced e417521d 71743fbb
+    dd55c786 62352716 b1fc1386 903473a4 6d3941b4 05e07367 70b9362f 2229ba1f
+    77cd9675 c39eb8ee 5d046023 2234a5e8 1ded8922 6172540b 410e19bf 82caa5bc
+    c3b07ae8 45217241 52c7309f 387372f3 e765ae9c b65f14b9 31ade9a9 abb67c7c
+    1b51147d 26485a6f daf465ef 46f8e998 a54fb067 5c32d2c4 7165fbfe 16c6e67c
+    432552db e395997b 602e3989 d08a260a 43e8eece 0a3563fd bbc40bec ee0af52a
+    2449113e 35273bcd 2662774a 8ea6e207 9443d9a4 9464abf0 1733e160 b3e7e1fa
+    879e66e8 969beb2d 5610e703 bdfd0b27 9dc2dbcb 1c84fffc 8dd0816c be3e52c2
+    e3bfc7af d87742a0 f19bc869 24ff5417 a4b5a330 90ed25e2 8285662b 2edc024d
+    b88db502 2ffd14d4 fcc5637f 61759121 2e94480a 05e9aa01 9386f29d 5bb36683
+    a5ee7288 07310fdd 56249f70 103b163c 25bcfe7a 31c6dfa2 e5ef6592 b4e02d36
+    ef34a42b bd7475de 14319bf0 27f8d0af 1524ae72 2fe8f7e2 1fe4860b c2d4ef08
+    39674092 0d896087 aa4a0188 0cd38474 46433963 9f33c0d9 3e2102a0 60eb1594
+    1f0e2841 187ebf0c c0d457dc cee9ffc5 d6cc4530 7241e2ce 685d6746 0893a87d
+    5b292d2e d129514c 1508e0b6 ea6b6a92 7aabd45e 2f051f4d 3ea5538f 9f8ba250
+    725e40ed 0b9b4515 3d19b1e6 d615d69b b39eba80 b5a8a904 35bed087 2d3f2753
+    03f1ff60 500acb8e 0ce6d274 5109611a 6f65732f 5c79a1bc b35cbf8e 6307a46a
+    411ac9d5 808c9587 ea11ac9f fc9db5f0 960d6327 0fd1a3fd a95ac2a5 8eb5e1bc
+    72c653f4 c8319434 892cf474 c924425f a5ca2866 bf85039d ccc98897 f1945544
+    09e76441 43a0b250 3c80f776 47062c8b 6cbd17e5 ac67326c 59fd6f56 2bcc20c3
+    50a33d04 badb2fa3 57e37805 74624132 77104ac2 0772740a e720c74a 62dea4c3
+    9c9a3fce eb5d969c 0e2fa9fc cb14bd8d 5bd9bc
+h = 6d1d235a f979681c
+
+k = 26b098d3 290a31c6 50526ed4 1787d0fe
+m = 1ab7ba11 fc441dce 06f3a707 1ac2ba46 b6b792e7 fd3330ab 14646c1b a1d195f4
+    8c18a0ed 16ecfe52 411bebf8 25afd682 978df611 6561f13b 1079c627 20883cd0
+    bcdfdc79 432042f1 a8e077f9 67017fb8 71e3e7e1 98573618 e9193423 ec8defe0
+    2f12443d 03e83b47 75f91275 3bd1b98e e9deae53 faa79ef4 93668079 83b3c76e
+    2177c5c6 c61c28ee 9fc79196 d10129b9 bcb1ffff 91d0b9c3 9e2d8242 80da86f3
+    b11f11bf df2d16c5 13cadaea b9a4ae18 cf5de696 ebba1222 75c4b423 ba04c4f6
+    c6eb57e9 d1080086 278bdfe5 617589cb a20b42ff 72a498b7 77ccfd48 8e9983e6
+    38683a93 1f3e4e0f d4081b6a 1bb84a1a b26f9299 f00de8f7 300d1413 9783589f
+    a9344740 8f43f26e 27bb124c 34eace91 be1f5d42 e770aef3 71d0000e ee57ec83
+    22731ea7 22c250ee 22f7bba9 27ec58bd bbdb2eef 9bf16863 8f7798e6 83534110
+    03b109ab 44f3bc77 a9264c61 d9fc6cda cba597f6 698f37e3 3c04b6b6 a9c081cb
+    6728a462 f1a07fca 8d638b9f 0765f231 78aeb599 a26e2e7a 0a23de22 5806020d
+    6c0729ee d519ad7a f0c60895 9b67fb3b 17daf362 18c8c145 00c8f5d9 5b8e286c
+    d0241459 cf57f7ca 5adee44b c428d143 8c2fcf5c 53bc4966 0083f0a2 a286ad5d
+    118e0e8b 60951a71 df71edb5 49336d34 3b21952f 9a507492 a267afd1 452afa70
+    ce7264d1 6785d10b a407da4c e88231a2 0b287547 804d6309 3f06db82 e3c8e081
+    d6e5534c 417f61c4 832c00f1 c9a1e02c 42d73a46 b0368807 fe2b76f1 76124c9c
+    1f1a471a 1049f61f 47c2fbc1 267a2e6a 04c6448e b0c91225 e050ea8d 67d73d5e
+    a2fb3d6a 7d74161d 293eb79b 827d976f 1117b909 455e55cb b256af19 1e67efa1
+    f97deded a633d3e2 83db1530 b275cbd7 61e880cb afed59b8 8bb86c09 a824db3a
+    5c1f0efb 49bd5234 8676306f 2ba2d295 3f119ae0 4ae42e08 3be0019f e757e1c9
+    3962e91c d6fec7a8 4e6151f9 1a0fe21b b4bc4dc9 adefaf89 40cea8d9 0c073357
+    21e1f475 0f840cf9 83cd0748 4a097243 c037fbbf cf511de6 da93c541 c38e522b
+    2c2ece36 8b3ddd19 136f6788 66ef8792 ee9a4b8c
+h = 6f65b062 52c80956
+
+k = 0a02d3c1 442f6e1a 47bc799a 750253b8
+m = 6aaaaa4c 340736b2 8e0529bb 1ccdade4 913d1e13 cdc616f6 0885cbc6 57dc2b4b
+    41af18e3 6df0f50a 0653e2ea 7aed62dc 77b42277 ca5a3f64 77512331 a4d08b21
+    4aa110a6 11772f28 9ae6ff9f cd7f1a4a de3a86bb 9e42cb98 4ae59965 81c81a38
+    797c0b15 f8424147 2046fe4e c54fb4ec be4cf3fb f48e0546 adfe644a d9b127f3
+    79a64cdb 65a1d4f8 4d2c4c75 a895726b fa866a49 3f467ce2 93eea3fb 5c77018f
+    7899e679 79250c35 9f128a9a cdf64da6 0fb7dcce bb1feccf 17c42760 6d2e98ce
+    f9dff0db 7193db8b 16ed8c31 d574d8d7 bfda5457 f6487c32 8098783b 2377dbf0
+    e218be86 fe93512d cd2735e4 99b85bf3 447edbfc 8e568819 5d5d6d65 c0bb7b0f
+    63c9c18d be355e6b 24c40974 e1440a7a 7df5f401 99533957 55a02d67 60106933
+    8512efa4 c0a7fe58 69bd1344 d30c1f8a 21c24bcd 486f300f 2bd35f01 916a67f0
+    8e2e8d89 74f7b901 b923dc8d db069c70 881fe8b1 8e15d101 6492d6b3 1cdc3468
+    214072de f6a42595 81fa7ad1 34d2a3a8 4c174dd9 5a3d8554 76805a11 fe5ae5c3
+    cea5cf6d 3812e254 8f6b4597 25a8ca2a d892c163 5ee8d4d6 abaa4685 1bce61c6
+    8e9d517a bf47a640 53547cae d9736996 5f474f6d 122c775c 2ef35ab0 c01dd971
+    c9150d76 1ce247d3 a9c0bf56 e1ce0c34 fec442d1 bbf450e1 e9433db6 ba7b3ee8
+    8403fafe 2fdd3698 0fba2baa b8a5e420 dedb101d 80f560e6 96f33f9e 5f5d2731
+    570bdad3 aab4d743 00ff5fc1 301f61fc 6750e321 e04274e0 2e7c62a7 9f4c1e8e
+    6e2dd7cb 16fad6af bd7a2c3d 6f233c7a b4d0239f 0e875283 1aabacda 73a092c5
+    1ce46cd2 85605e64 c6bbd7fa 63686b1c c8f363fd 3f525025 f6ce13b3 e2e07688
+    88d8e03f 482a14ba 95ed14c2 abde6c52 69f3c499 80b6cf6f 4d318ff1 354700ba
+    fa5202ea e215d7a6 3278fd37 4e3ec58d 94fd2f81 fe1d993c c7890856 bd94dd72
+    a1fe7207 fe2afca4 0774f3a6 9d8da2a0 2c708ae3 c0cdd4e2 0474cc86 e554525e
+    28f206bb 95a69bab 0ec63b22 b920234b c79d93fa 4f9fc049 60e54522 ac398b55
+    2033429a c8bb9296 0a6bbad3 7259c209 8b4838d8 e7
+h = 9f0ca2fe 782fddf7
+
+k = f5b7171e 1835cc2b 028ed786 7b9b6e06
+m = 8de601fd eda9f211 e152ce6c f7d5fd4e 50c20054 d141a16b 0e036bcc c818e414
+    90dda627 f0c1b4bf 9d2e7365 30ff0d51 a9a7f29b 4790040c 7c784319 cf211eb1
+    87ab3f9d d308d709 32c6c5cf da7de55e b0c8ac20 9296a718 b91c8c9f a3d3f613
+    583721f0 7a5161f1 a9c4a9c6 1d93dc3a 15a12991 8f1ca6c4 50bcaa88 8fbad3d6
+    dd09b2fd e672b9f1 2d266a2c 378136a7 a515ae64 d44aae51 79cb11b3 27066a3b
+    b67f6646 f3ac998a d5e267d6 a86c90d0 b4554dcb 0f46e5b6 23efa610 960d39c7
+    bb2632d7 ddace6fa 98fcea72 51f175a9 ee22379a 50f8ca64 be659feb e3fa8a29
+    1ecbd447 a6bc5033 543bb356 9f4406fa 0cb5409c dcec5fd4 67e25889 79465eb8
+    0d3ae048 4f968a83 06cb3a6e 90078d40 c2b7a2d6 e8018ddc 9636f9fa 7c249611
+    021dee49 75ae3d15 d3aae710 3f6b61b9 0733ffec 353ed976 0951b501 984cb539
+    38f5f446 24bc9c5d 000f63b7 522ba9cf c0bcbd9a 416ff4d3 0149f03e d46b7ebe
+    c7ced00b 7f097b14 450a8edd 96367f63 3fa49f49 cdf291df 8fa42adf 72f04b24
+    ce4cd1e3 8c625896 16858eb9 ae8399e0 e4f0cb8e 516ca9f7 dc2fbb63 a008a1c1
+    52de27c6 b8975c75 e65bc5e1 2bcf3171 22f89cec d7266380 75145159 834b75ab
+    73f0ae9d e9e75a21 25743bbb eb22b862 265e6473 ad5821d4 d52476fb 9a90cf5f
+    30c68252 07480d1e 9d2aa8de 7f4c9e4e 573804e8 95fbf4ab 33019746 31139181
+    1feb0b92 fe8b7655 e179ab08 3373e1f4 01eda71a ca977b82 7bd61508 be5cdc6e
+    abd56a8e 2b0bb46d 41e41865 4390e295 eb754022 e973815c 1bb42ae3 9bfe959d
+    1247214c d0e63e98 db878991 8ffd06f8 55cca26f ff029a2c 2139cd93 2fca7013
+    6976234e 90cc3749 dd23e8ff dc2e8cfe c3b4e618 e5d57b5c b14b6cab 28ae8e18
+    23dcb0e2 cd87f96a e845ade2 87eff944 317a74cb ef446dcf 9cb637ed 94e2e0a2
+    67e2132f 89bbfe80 7cf4bcf3 90b29eea ce1de4d9 9c93176c 25c80c89 36809882
+    5fde4c99 eda17d88 84d99cf3 77dc187d ad64ffd4 453d7053 4ee98aae 20e6ffb6
+    0727de78 1ad6a422 4a6e01a6 e0000b97 30dfd283 685f
+h = b2a44e3f 6fe03af4
+
+k = 952b73bc a2229998 f2f5be90 bbcd5771
+m = 032b6f1f ea22b98b ead2b987 16bd47ac 97e486d7 8a234c5b 0805c28a 73a00715
+    03274504 66c1e029 686075a2 537bfdbe 81844134 f73cfff7 eaf826ce 0251f621
+    961c22aa ca900c7d 5462bb71 aa74a228 6c15a83a df10c173 664b554a feb75153
+    c1c5b862 dc7199b8 c11e09d9 8eedcb4c e228bd9b 554e4a65 fcba0a25 a678081a
+    9542bf79 0abe610b 97de26bc d09e0dd4 e95064a7 e8ac26b6 2cd99fa4 5214de27
+    e7ae5281 13c27f53 c9319b76 42bb37c3 ee403da8 43c691cb 00e34b87 a7730875
+    d4c3e849 ec0c6bf6 b51b1cb7 866034cf 585acdf6 356633b0 60bea1e2 f465b93e
+    53d27983 8e25a502 a1085a15 6390101e ab9b1659 e17b52bc 98a424c8 2aaca5d0
+    4a297f0b f11e02a4 eedebcc8 3c39f63e dbf77ac6 aa39b0bd 27f9d18f 6d0070be
+    f44f8257 8c4e5e4d 6e5dbb01 a962ff65 4d66caf5 e8766839 798ce4f4 3fc0dca4
+    5a15a89c 39c3c92d fc68395d f6f6dc97 413fb9d7 0059a766 2e7d1924 c3897979
+    2d6ba80e 947da073 99be86b6 8aecec09 f47c7564 eb244eaf a82b329e 5271580a
+    736901a4 40d75915 7ff1b5ff a9931fa6 f55ac3e4 a7edfb71 12052738 a7db6196
+    d5c1db37 a248c54e a4ef8205 cbc7c109 54f02935 109edc1f 94d38434 9e63bada
+    e8594cdc bf19f880 8c0a9270 0931fae7 6786d5a0 10422b05 3d06d235 199c07c4
+    e68651ea 527cf4d4 91bd797a 5ef27283 10dd0914 6b35dbf7 87a5988c d7048a68
+    b450c3e4 8b17746e 1c8f9571 60586048 55289eb4 77c19da9 8a1d2db3 897f3847
+    72107695 64f3bf22 c4f62c9d bb46c14d 654b7c52 0d8366c2 c52b19f2 477dc91e
+    1a0a1ae3 0bb6ed51 26d79979 b044ca09 cd034ab2 66e88117 353793ad 6f3b7ae6
+    7dc5ec3c f35b0637 f2919105 8302473f df567c34 ee0ca328 e300babf 96f53d85
+    2bd17363 05123798 3550b655 e450bc0a a8c6bde0 0c417b0c 060e90c7 1cd9452b
+    8fed9523 4d23ca14 44f772c2 2055536f 6d92a38e 3b5d345b 0f953503 7a1c5f40
+    6dd8db0c 04d828ae 0043fd53 f2df7826 56a38475 7ce61077 4045e13e d077f5c7
+    aeaf9801 536d893e 53fcc914 2f96b972 aa36a6bb 039569
+h = 3ccb5782 5b54382c
+
+k = 7af88731 0ec18307 3d4ca1a2 f60757cd
+m = 9956b1ec 4bd7a145 f9d22572 fafa2b36 c3327d53 7d5a736b b76c99e7 ebd8d8e3
+    9fd555aa 2c50c089 1edbf9f6 e1ee8d04 09a40a6c 349eed92 048b3d5c 9b9f6f4f
+    4f474cf1 cfcd96ef 3bd3d97c 4201b0e4 0778e9f9 902a4645 24b7a826 db8c47ef
+    a9a0c0fa 9f4753bb dc5a5ef9 5473c2d1 73e7b449 a1ba7d76 2d55638f d91da898
+    fc8990ac 3bf64fd0 3197149c 8ae240d4 204e2068 c4883881 bacc6400 7b96759a
+    f8416c8d cc5e7200 3c455c88 9e0bb16b 5b241da2 e43cc21a 1a890e13 420f0d84
+    97e8a920 d1ec37fc 7f8ce9a5 2310a101 0a7f919f d83122aa db85480b 38b54ce4
+    174924b0 78457239 2dff3d04 8da761ba 86124543 a763fbc0 7c16b7c2 3a6cfa4e
+    a3e2fa0e 8cdcce1c cc6abc8a 5355f9c1 fabeeb0f bb45a422 34d5a7bc 8f3c7741
+    9638b6d8 8c6bc98d 48497445 9e81f7c2 f8455b17 f5d0c011 f30e45c4 ae499e59
+    c41b5d2d 9af66773 05065e9b a7a76123 5c129a70 b7876dad a875a29a 73ccfa2a
+    2570435a a0843ce6 a5688f56 b5400ff6 690def22 be73d876 fd09d626 f4b0eba5
+    a717c855 d74d1e81 cbe6e628 5db658f5 2f4c7c66 f64f5fd4 1ce92991 c6944eb5
+    b78f190d 65931267 d342cb26 3fba67e2 37779b1b 36572d87 16c633dd 7ce49607
+    18568b17 566c94f7 d87dbc3d 7b9dbfcf 5c2bac75 893b5773 11157d2d 25134d68
+    1c54181f ac843cc2 097ad515 8b11631d aee9ac11 cafbc04e e72e1269 df405639
+    0a0e2613 72d5640f 2d05711f bb83d3d1 2c27de74 59c9500d 69b01c23 35e92796
+    b0d9aa6c b8cc8bce 72a6c286 d8b40765 2a720daa 9bba4f2e fe04c142 356be2ae
+    6937bf3e 9c5c84e8 1513adb3 c50d8791 9f058980 5c0b13a2 f8995280 23e8d339
+    a1d0c2b3 5f44adfd 55353b22 c0fb4aa0 41595882 ddc54daf 4f643fcc 6eab83fa
+    25e46540 ac733da2 e1583572 aa1d8afb 2f149c54 1aaf34c7 5100eb49 f051ce89
+    c8c015dc d4f01974 110de26e ccf83b98 2fd38ea9 4814f77a d56d652d f3586773
+    21384c11 8e53821b 824d366e eb4850fa aa1e15fe 83b687f6 5b293ecd 8da6137e
+    12fba040 cfa4fd3e 150ae76c 3e75bdde 765c3b9c 0595ecf9
+h = 7a932ac7 5e654eda
+
+k = a0a53a28 6943a7cb 7714c361 613d2e92
+m = 3cac4a0b b7dff592 7821db19 563fc615 ac0707ac 82d8008e db4656fb 02b9ba98
+    26cb5fe6 d794fd3a ab38cf19 601429df d2f6a929 732aa542 4b2f409e d71e945e
+    ca3ee127 623debb2 b97c0275 f0310025 bb6ea9b8 dd6fb729 d074afd5 2c93f5ca
+    64615025 95d5eec9 5e7f918b 6ca212a6 49c7b1f5 4787e02c 4ba1f2be f9817a1d
+    c4a7584e decd8368 f402b23b 4f724e33 6b7a6e6a 5130e25d deb1e2ed 98f05232
+    0d995536 616b4226 94e42f9b a048c759 8e2a79fa f9f4184f 26150b96 61e79b40
+    c1a629a4 fa856cc3 93dd658e ef6cc87f 97cbb0ee 45c724e4 f4e8a8fb 4ff93efa
+    feb85831 a6a90053 a28d0c64 d51e69cf caebf891 660cce77 515a6bcd b7cc3a58
+    78d3f343 bc5c5c56 40255b37 8020cd03 48c37e07 023637cf f6ea28bb bf073039
+    f76022ec ba763788 f84598ad 41218e8b 51de4e4a 6b1fbdac 237fd6b2 465cadb6
+    e79d55c4 0c6f5fdf ed19dc5b 7c3ef1bc 15b8bc9e cea491dd 233a672c e709eb64
+    55da9f58 c5d8bc2d 13d10f03 c32b85c7 c6c345cd 4d747994 7b0dd6f6 553c7089
+    f31dea40 1e11fa1b 43c1a29f 8d4fdf3d 56a4ae49 283906cd 573e0659 e1bbc245
+    4aa5fb20 dfe9d2a9 05ace1fd cf729a49 81ae539e 70ac29c8 a6d0561b da96aed3
+    f9f63f26 62650887 1865e95b 2ede95a5 a47bebcc b5cc8fda c542dbd2 e8dd5b4f
+    faa41785 b416338b 691f57ee fdd3ce93 0ae69cbd 204c9241 9ff36332 20f9a649
+    cc32250b d6737764 4e38e26c a7ad4019 6cbab108 3e70c10d 928d3dcc b1010b1e
+    5457cfec 35dc6907 2b7d3087 663537f8 c40f1687 80e0b2ca a18df113 4c387d48
+    0f618fc2 2c5b09f1 f75d372f 2e803c07 cc30bbcd 02d1e553 268e4ab2 bd5db9c7
+    4a1a9f98 48e135fc 92a2f8e7 4b26680b 19c5a913 00355a6d 08298ee3 ae3b070f
+    cfc0cb4b f4f277c8 9d7749a3 9c0e67e4 41b9cccf f6493bbf 42254e9d 742b3802
+    2b5323ed c315ea3f 402a7354 224fcfa6 e0215552 50a16c95 c532c934 f1582da9
+    b656833c f5c2fb5b 2437b2f1 a343d725 ec6ac810 507fa408 a48ae174 e115221e
+    361b1645 28f56787 3157d67a 71d017df 3036f6aa d8ba31ee b3
+h = 5105dfb6 71c4469a
+
+k = 6fdfa003 068d0c54 119ff49e 2d533d3d
+m = 83e2432e 3c858ccf 6ca336d7 76a61b30 9c32c2c1 a02f8c0c b24df5d7 eff470ab
+    cd9d0cef 2f87a025 c39f356b e3cb3c7d 17376657 d260ec33 99549c1a 8ac88817
+    cad4e8da 3ed6dcbc 325ff602 a45ff6b1 e24a7076 70912d2b 76068da5 5990813d
+    7c1af598 9b990a71 444065c8 b5f3e66d f42c7551 80a292f4 dc025e12 d1d275f8
+    23cdc246 c44e135c 8c5b0fe8 cde83b72 2baf987a 2e1caafd 766c2996 ea2680d8
+    d4ef8353 6e41c101 89bb653e 6402cbcc 36163b6d 460250d7 3c7e8846 cad6ae8b
+    9f1a90a9 b79ad3f7 deeca9cc b7fee558 3f794b38 949361fb d6b3afed 2180b75a
+    c27f80d8 946ea329 7f074001 966c3f2b 81c598ac 0cf4c96f 162f3854 0e9c63e1
+    8b3b8e1c 03b3571f 69f255b9 30e365a3 8098e5b2 a1a310bc 89d1120e 72489928
+    da37b9d4 9ddc1306 67cd2829 0c384ff4 d6dbbec7 068d6ff0 ecefedb3 a127f57e
+    acef495b 2a33b7f1 9d7dacc7 d7fd70fb 76fdef5d d5f00740 9e11f6f7 dc2e6c36
+    aab18a89 21a1909b cb509080 0078fcbc 991a4fba 5bee5917 a908dc96 e8841592
+    75f3715d 339d7ab7 fa57bc08 e711d4ac f5af95b1 aa810647 019ab4ef c7acacea
+    57ee665e d6a9ad24 51c0fdfb 61208423 d96689e5 f1a7c74a 0991c4e4 760f89aa
+    18e43fc2 9d2c34b8 c4d84be0 3ddf8908 bce578e5 9b5d1bcf 6d0bbc2e ca67192e
+    2f66fa40 3b1f2d3d 3b93163e 1fcce1fa 28dd7dbd 30d3fa46 fc4877ce aa276b63
+    0047b824 72794d26 7be9131f 6d59f357 c8b59564 47d4f8d9 9a06b11f 8b32923a
+    ceeccfa4 0d326de9 321a6ed8 5d10ec56 0ec34cb0 8d5c7546 318c431b 312d7ae2
+    c281915f ae2603c8 64246de0 f2145494 1ba27360 930453a5 b0a7eed1 8831901f
+    4b1bd278 9653ce59 e51a482e c8e515f4 f5204922 1e9d678f b4623652 d9f1b68b
+    12865b26 c36f10b8 583fd8ae 24909ffa af33057e a0e7265f 8a5bee2f a7922c21
+    8a058677 63137ad8 44abc180 c72d8301 549ab5c8 bfde3342 fe268906 e8c3496d
+    eca45e66 9a07e27d da5e1b81 8287f3f8 2a60dc86 a03d358a a4659ffd 89714e9e
+    cbd204bc bd52e50b cb09ec69 16d1897d 7d0d9e2b be867288 9799
+h = d49d180a a422f32d
+
+k = c7785b26 1081b567 de36eeb1 2a084cba
+m = 0b7ac336 323d78d0 ec93c92d 3ab85ac3 1ad292f3 263de207 5530757f bd09a081
+    8f4aeaff 68046496 edcc3a75 520929b5 79664834 fd2d2b46 ca0ca5e6 3d929b34
+    f788552d 5ba303a2 5f6c44f9 61fdfeb3 ce2e2c94 2816876a 0f5e6503 89d4baee
+    fca54e85 362773a8 301da3d5 9d3b5439 a88645db 1f42a139 6681368c ec55e532
+    c38f5425 9bdc8d83 fe3010d4 1947b985 e64824cd bc37ad28 38511c84 30162689
+    4bc0a906 b80e58b5 d6943a6c 04c8dcdf 67acabcd 38f07185 70437e00 96793c74
+    0bfdab7e b2ac1129 48e40c82 81dcd784 2061947a cadbeddd 46445c5d b9ad332f
+    8e87115f f79c7abd 734b58d3 d90389f2 26e43cbe fea4eb1b b7bc51ff 08f087e1
+    22e18b25 570a3c72 743c343b e8dc1eab 207ad19c 78771d2c 3299de71 dfb04919
+    b5dcc066 2acc345e 5acb89f9 f93c5e80 682c8f6c c1603f4b 07d95642 203efb8f
+    ec8126f3 873baa27 bdee723f 5fa6e8a0 d830ca48 02e23ae2 4cb00fe5 b421e6a5
+    f12a5699 ccddd260 af49f4b0 68c233b2 65626d7d f180dccd f22d32c8 148ce524
+    3f05c2da 0c919fae 6a19379f 8afcfd69 2decd188 50a2fa72 a1229df0 dbafe134
+    37e8a687 23c5862c 88327017 144cbf8a 9115b3e0 5b381b4f 7a4f8ed0 8dc10aa4
+    0767d5fa 3c8f3a7e 5b323944 0705afb2 8e856862 85b63026 9a8aeaae 1fa04c45
+    3f3893e8 3acb3012 094cfe5e 41a4725e 80f9f212 dfcf7e21 44909af0 18ec9a75
+    edbe8387 c962b73e 909f53c5 b2647b1e 89da9d4c 21508f8b 599a4a06 a0739f2d
+    1c5fd672 8a8551d5 a8044056 3f399486 d8a48174 f4268415 582b8fa8 30d47fe4
+    b360f408 ec768c0b f60316be 9b0556d0 8212c0ae cdf66672 4f7e4f3d a7fc9334
+    8f98a1c2 0483ba11 6390877a ac99fc04 d9a68bf3 f3f71ca6 6868eab8 27f9a172
+    cc22d4c9 66d3c7d5 b19fdf10 cd2e79a9 65ec9250 b517c65e 721fc606 937b7f60
+    809ca35b 6cfc17c0 77f92b21 404735a0 a17ac63e bffaf876 dba3fcfd f55c3bcd
+    2ef1ea21 83b8d8a6 ba42be31 782e5940 38366b53 92cf8eba 497409dc bea0103d
+    28f6cff2 d3f385c6 3f0ed8d8 4082d1af 0a03741f ef8f9dd2 26b2b3
+h = 07e7a57d c9c13ece
+
+k = 3572689e 6b6e3b6c 5d6fbcf1 80d99425
+m = 8e408b93 e1f198da fd1b9823 55b173b7 e618e37e e1a9e5a3 93ce39b2 6a3bc52b
+    8ad3c2ff 2ad0b411 8769f2dc 6121b999 3f7000a9 a771d2d3 a2508246 389d349c
+    be6363c9 e841e66b 00b4e3d9 5923f674 2e38d671 c467407b 48283586 4b173d26
+    34079128 089e81c9 b77e577c 93fa13e6 eed258a5 4e79f240 6d664e53 933e06ba
+    459f5efc 5599cded 2cccafd1 14e99e82 99837994 f2b2c7d3 65fcd94b d8685a67
+    4f49941e 38017753 3bb4339f 621e6d97 b730f215 7991ec23 8bac08e9 7043cbcc
+    19cff999 c4f8e8c9 4206c9e6 2f7c5edc 9842055b e2c93ff8 d83dd01a 2296b058
+    57e04b5b 8e2f4e1f ed10cf53 e359bed5 bc363425 1530339b 47785df8 0a027255
+    58df5f12 539a2db2 25654344 67ff15c2 3a516885 2124db39 8d528590 cb9c2505
+    0c4a98c1 fa891241 ac222f5f aea5ad5c f0501fb1 58ef1c17 d83d95fd d59c9a4f
+    084a2e0c 5c5c0970 461efb7c a19486ac 7ca266d4 fa193be4 8514cba1 be2a46a4
+    9a8bbb49 56d9cd36 71b48b01 1d3595e6 06957ac5 5926b39f 83d0d125 11bdac7f
+    e1f88f5e e0cd079c 8163ab80 3b5d7ec5 aa59e2a6 8328bd21 ac930532 9c78d756
+    6555ffb7 86e97fde 87e1e45f e80cb447 6b3e835c f3daecdb df6aa92e ae594652
+    2c32e999 d020eb56 92325475 6ce851ed 274dc385 195704dd 69ca2f57 1c10030a
+    ec2328df 0ca4df05 f63bef3c 238345c5 a6a92e47 35e75f95 0ef4fb95 bd2f2a91
+    c434fde7 073aaa6a 101d335c 755b9fd7 244ac336 f38dd4bf e94f30e7 6907e8ae
+    840e66a2 4c2e856a 1b3dc414 da7b23f7 bf693c62 e7e62c81 add84e4f db9ebfd7
+    ca0c8d6f 3016160a cab24f55 59bd8f97 b4416dd7 75c7e5e3 e810bed5 ea279f66
+    ba1b2b08 cfcd06ce f367fbeb bf32a0bf 831f91ae 8485c7ab 64bf7233 18f09e10
+    6b927315 85c2923a ac9c6793 9bf5f0bd ad63cddb 9d5d288d f7e3072c 278572b8
+    e0b34f8c ae047cbb f7653989 21a90b06 3db3c411 c2b2f548 4c19aa3e 7e2598fb
+    1aea6897 d37e3dc8 a2582028 876ea3f2 443f4e10 4ad2e663 d59232c6 5ebcc238
+    3c81648b efea0bc1 a36e504f 35e7df5d d77caf9d 0de62862 358b28e7
+h = 683945ca 9c1eb09f
+
+k = 74d0eba0 aaa0d88b b8c069fe 9af10247
+m = 231d5899 0e20ad53 e67f3b85 58c7c9ce 7228b058 0f4ee790 d53661d6 c234f304
+    569c07b4 a127aeb1 4df7735c 24b7bbe7 878b658b 1c3da72c e8dc79f4 5fd549ef
+    e2a3ae99 3d1e4705 756ea300 065f910f 0fd97488 6022264d 0a6fb162 d5e8007b
+    2259400a 9af2f81e e846533b ce1abbdf be0224c7 a7089944 81d84c90 4f3fef9a
+    35343555 8a8e20ea 8489ef90 f0d7eecb d855c92c 987b2662 1a2c74b5 ab645db0
+    4283d749 8f052185 18a58390 014f0f4f 929a8e60 7834af9d b26e2283 850ac618
+    eb005ce1 adce33a4 c1455704 0b15b87a 61adf8a9 3f063f22 08974afb 5d74e5ef
+    3c944dd2 70c64811 3bca694b 4484bdf9 adea39ee 4851bf02 c4f457a5 d1a06fbe
+    bcdda89f 7b86c79c 255aa029 0ae59d3a 43dc5b7d 14a484e4 4fb48007 e377e5f6
+    a4e64635 737a464f 04e2cd41 ad092d32 8c072e38 fa2a4b64 f4c623ec bfad79ea
+    7daade72 48e67829 b91010a9 ed8ce7e2 067dcf55 59960fd7 cece3ff9 15a74e60
+    9cab8411 a81c807e b5769d05 33b4b3f7 73dfca23 0f652543 97d11a66 e18bb773
+    da44b48b f1504d03 e8dfb79e 97d30b1b bee2790a bd84461f 243d3650 0d3ec7e2
+    67040a9c 5d4669d9 0778ba7c ec7935cd c9aed262 740ad7b0 46642f98 2e852f2f
+    ca6b8fa8 e4941534 44b05e0d 189376c3 2473988b 37cda2f7 80cef6ad facdf82f
+    c125c057 81396697 16078de1 14ab6a0a 8e3eb112 770041f3 4aeeb6b6 9bda18a2
+    8d88478e 58214d5e 24cd8ef1 34b6ccba 543820ca 2c7f402b 1341bf9d eafe1ece
+    720f2f07 af1c7df9 48284734 f25c7e1d 16b5ccdb 70769218 5c407f8a 79a387ad
+    16a5e7fa ad802570 3e004b94 de64ca43 488647b0 e7392359 d75504a1 2c465161
+    72b5507d a34d700e e86286b9 fd422d11 72f91cb2 f36518af 80f5b9e4 b6afb5f9
+    d1474f64 0ce4a276 eb3357d3 ad94ad92 90873745 f31fe634 1a99b3bc cd3abb36
+    6e836e7d 93cfdf29 b4b7359b 495b0ca7 bdac6887 26790f31 f7da7bf9 bcd2eb42
+    b9e3fe9f 49afd839 5c879305 54df525b b5c6de80 544a9139 2aafb974 724dbff5
+    8a7fcd67 762602d9 a94df73f 041b7401 02c1a12e 197419c3 7f7e1e72 73
+h = e26cce5e ee211d07
+
+k = c8e9800e 735aee0c abd67e91 8e09ec2f
+m = ab6b0108 c3b3c3f1 e39a9ef3 002c4454 40be181d 4486d367 0118620e 42c9e842
+    5f26a6bc 13ca394b 9def4ddd 8107ca6b 24407d2f 5926e885 62f7365c f41bee36
+    3f0b277f 30aad1dd 6f52186e 9b264f5d 165413a7 8699aeef 2a6fe58b 4655939f
+    a2f034e3 6dc5795c 7cc0ed0c 650a2bfe 28263071 7e642bc9 d496f033 5176c466
+    4ee1627e 3a49c495 04630d67 9500e684 1e563b50 58891444 a499bec4 29b29b5c
+    7885bd8c 9c05a713 607774d8 122df4c4 97e57e2a 429ad87a 83a7e956 5c66985e
+    c89f5520 30b6d704 f122c53d a799e953 7c9f5268 ab4a1842 4cf18a30 617179e4
+    ad51b4c3 0980b071 e57eb3f4 9aa85d44 e815906d 27e6769c d91d6ea3 9faec59b
+    2c661bbb acfb77f5 46ed2334 1e9b0cd3 b84fd86d d4d4cbcf ed5d3569 5c212d06
+    f0ec01dc dd96259d 3fe5cbd2 a52fa16d 95671f01 62c8126b afeeec55 3260e460
+    e4c6e215 832a81a2 294acd8f c19f1a2a 136ab844 86dc3a53 cc93f17d 0681d725
+    b098e682 5c146fd3 7473f570 1d5cc6f7 34bd283c 670ee8d7 d936cec0 7587329c
+    396523fe ebaf4c4c 84f7d8c0 2c2f0de0 12fa5d9b d04da49e d95a177e 4150b884
+    776f0d57 572de1ef ec62c1b7 76f229e3 19defffa ee6010d9 e2dda5d9 7f88eafa
+    1921ca11 eb1233b9 c9e2e3c9 cfb439fe f30eaa23 95210865 2630150b 56a71ee2
+    4601ce1d c55a5951 5ae67324 cb827e47 f2cfb9c3 67ba327a c913568f 91b7584c
+    6e45c014 ab34b3b8 472d9095 887b7f9e 73e3e88c f802b826 66dcc560 060c2a13
+    da7e1cef 3651e909 012327a1 8bad5c0e ee6090cd 3ba2ef9a 64115154 d0fcbd54
+    27d14633 ff9fecd2 df1f6a09 50276865 c7eb497f 5e4598e9 b783ed6e 0649407a
+    43c3c87e a3399e86 e15132fe a6cb2f3c f6e9ba2d 5994fcf7 e0a6080d 86523f9c
+    757c2948 dc599e6f 9b90b406 d8f74d88 4fb90581 59b7c526 e4b5c1ef 78c1abb5
+    9699c1d0 589e721a 5211835e c6e5a186 b1e4b41a 656d5b47 4509f3eb 4b229225
+    933f8649 b1dfee8c ef72305b 6dc5f9a4 a5c95f38 e74979b0 739a475b 30bcbd12
+    312b5729 743184c2 045367f9 46072a74 426285d1 ea593ba4 e37417b0 f210
+h = b745b383 cd92bc71
+
+k = 35c6894f 2acb9de0 9a0f0936 8ddf4804
+m = 20cd6fac 6c81c694 6e25273c 80794999 bb942bd9 15f7c171 7c7cda5e b8188626
+    c8d2a572 0a16d3bc ae302608 d23a6850 5c18edae 2cc34f68 d21fd477 3a0961e4
+    6c1a4004 841e6ce9 54bbdd25 c4273fef 4d9d1327 ecd177aa 885419eb 8d53eba7
+    5144318b 1ce61314 6d8e2b13 7be199cf df604e5f fd7728f1 1987e0a1 05328dfa
+    93273992 c81aef42 5b9ceb16 e28e0362 f180105a 14a99d41 224176cc f24345e6
+    75b4c626 1328ddd0 0c33fd05 4e8438d2 591c1dc4 de6e2716 9e4fd147 6a024bef
+    71271985 8abf2b6e 9f23d6fd 285243f9 f5927b57 9614eb91 15d019a6 33ddf684
+    caaec145 83fe6118 b0c2d2b3 c17bf2dd f1d65cc6 2c978573 b2851b44 759a0423
+    0b40f973 259340ff ba67cef7 f8800674 cecfcfa7 40f43163 1f22d171 4a4c5155
+    b14c7535 b0f0e93f 6d0102db 60badd63 3d04151b 34622bca 028db4b2 b0881d4c
+    695eb294 9815512d 7bf1f7f0 f52cec59 198d3d4c 52d8c3e9 3f151a3e e483e5ac
+    e0467ad7 5ed4fa1c 4333e330 1fcdee31 57c24be2 eead3732 13abdeb0 9b9edc56
+    773b9586 1ebb7b41 adee4b94 861a6660 943bf137 674c318c 14e1cffa 133192f5
+    20ec1480 4b7fe85d 6803dacb f3f05d11 5ceb7b42 b473a4e3 b99f0318 f2adb8bc
+    a436a067 070ea3e9 499e414b 97a5f08d 6a321d54 3c182747 308dd9fa c80c6c61
+    3e5deae6 1d824c5e 6debffce c62e8cbf a9c108cf 5b1c9c7a 60f0e9ff 3df829c0
+    cff9c0c5 0115d5d6 61c2a347 fcbcdbad 77c07e3d 8399a85f 4d5bc674 a5e66faa
+    b25845e7 70123c36 e8c6620a f6854564 67e338ec e4356b0c 580736e6 42b6d399
+    b1d74441 cd6b4c17 9fb2aac1 cacc1150 fded50bb a1361ef2 a599778f 819bf05e
+    c8b9fd2a f33cfe8e dbbcb806 65e2f3f0 d260d75c c88809cc c26d3397 0782e45f
+    d3c7e550 1e056018 e4fcf829 04968254 b8026b48 83da8f3f d23a3e2f f7ec4dec
+    2d7857bf 15187c7c a06f9c29 55d7e267 9a9a5366 129d9332 e2fb3750 b885d13a
+    f3d3ef25 5172a222 13c6aeda 03ee01f2 1d3325a7 32bc92d5 c1c953ab fc555340
+    9150102d f3976ad8 ded21c6d 5c9c2b70 d4be395f f5e88a85 5e3ffa47 fa51c0
+h = 4ebc6986 320cf43b
+
+k = e23522ec e65b19a0 dca4a175 00087390
+m = 02263201 bcdee8e5 6dffe90e a7d2b5b8 7cf797c6 e6ec5aed faf102f1 43df8e93
+    1dbc02d5 2eb87891 669b4e70 b8a60bc7 d3189d32 0a045df5 f614a18e d090bf51
+    2bd13157 3dfcc82a 843ddd8a 14eaef7c 5b6a8fda 40b4d586 02ca35b1 8b8b6394
+    2a12d8f3 29fe0a1c 8a15a2e3 ecc5b39d 198387ef 0dbdcb41 a2b22915 db7c8e8c
+    64f4592c 7633583c da000a6e 2f423712 84dca2ce ab8e93cf 28f20332 42ed6e4c
+    10e580cf 725a8c78 9a639f41 cb60e5ab 90c29a53 5c0a990c 8957c97d ca2d49f0
+    1d58b6f5 e2d1b14a 754bdc00 d43d963b 34c97b73 7cb50b5d dc6e4b4c 03ef01e1
+    30f6547d 93d1953f 0e31a3e1 51b423e5 e9a71139 2396f1fe bbe81fc8 9f7ef970
+    35f06734 cebfc046 0297420a 3ab7837e 9583a6d1 e46db725 2a59cbaa 5b8f2062
+    6054066c e677b1af ea037d7e c7a961b4 be8bdbd5 a283bfb5 42015f75 3c2b0332
+    f2ec3613 a19a51cc d94aea8d eebd2c44 4f457f8a 185e623f 190bc239 f82b32b3
+    82ab7ff5 0ed356aa 8430bf40 08355cf8 5a5ada92 d988e022 6aa1b576 af52aab7
+    1b17d064 c7ea9cb3 4ce7bf52 c6a32490 25cf729a d181fbcc a0dbd9c3 dfc397f7
+    7cecdc40 537276a4 4b75b69c abbc17b4 8e9afc77 fde1bf4b 032c549a faddcd41
+    0abeab73 eb0d5ca8 1913dc6a 9d10064e 22dbaa86 8112561e 34b39a8a a5436dda
+    67bf586c a61ddf6c 65222493 ef9b386d 528168a9 0efbfbdb 120f45e7 fa0d606c
+    8e17aa7c 0e83d44a 2e7ea0e5 6547fc25 4dad979c 51725343 3ef23def 022b53bc
+    ed59cbb0 541b1aed 65b8d8c7 0ca7dc10 8d60f278 58bb1035 db981447 3fdd9064
+    4c26d561 c44e76b3 ebb723b5 153d1dc1 6400a0a3 4d936bcc 5208a981 8d10a350
+    2c00ef32 b7578d37 4609a82d 01f2f258 1e09d1cf 7050dde6 39102182 b907deb4
+    cf1018f0 d69bd683 dd0c7e07 5af19b7c e3fede74 dac8c482 25a41458 ae823fcc
+    1a1da05f 0a51e146 80bf3af0 215c7308 a7c73328 f8d26b0a 44b2543b 864fc921
+    be5b98d0 48c4e233 94124814 4f2910f5 ee435803 122327f0 b0c94b4b 194fd40f
+    f2e5fb5e d10f47b6 8972f8f0 3fa897ed c97b3b7d 0846ea91 be1f1942 45f1dbf3
+h = ee77d812 487c18b9
+
+k = 54834a53 cb54ce0a 41a9dea0 62bdf124
+m = c1c64910 c7b2ba8b c3f44a35 4541f194 4b421f62 8de892fe ea3db0b1 108206f5
+    fd71c231 99bc39dc 9b4ee772 a1473897 9280986c 9bb0d43d 130b3afe e70f929c
+    50bafb0a 876bf037 62b17fe4 86fda236 cfd2b3a3 4e5a1dcb 1b2aa6f3 ae14725d
+    6d84e787 68d2afdc 2fad7b2b 751d4652 9e16a99a fedf0a2e 43356e28 e04f02fb
+    a1f40a53 379de95e 1bb19906 d481472a 1abb953a a77c7822 da2a3575 7210be17
+    00c6723c cf0316e4 7ab1f46c d78d2799 988f0855 068f63ca e840d095 36d86012
+    3f1c35e5 e53ec8a0 1d93c40c 99c93d2f 53012d2f 8c940718 e5b902f3 cc4f1e2a
+    234d5dfd b298ed01 be58a7bd addcd2d1 7bddb9a3 30a84139 bcfabb8f 1dd34b0b
+    e40510a2 cf31b7f3 9b572d8c 8316f47d 20a6206d 4b77e915 d35bd33d edc98a61
+    506deb68 50c1d16f 5a115fbd f9dfd980 29cab544 11c808f0 609e8432 c88c7db0
+    96d09dc5 43bb0875 a4cb49c4 eeed1264 a261096d fac095a5 8f75ab68 546f1356
+    ca674016 d6d2c3dd 2eeccfea ed157009 b3b526e2 c1aba07c 5fea4a74 e63a2e9d
+    3231e20c 384c579b e9de173e 6a940e1c 9bf88270 a0eeeb09 fa0fbd0a 373cbec3
+    5f20e13f 90bff8cc 50c30ab3 798baf41 8eaea2f9 5a0219a7 e8eae30c 9852871a
+    bedb78da cda0f94d d2f59346 4170546c 7a438444 91d2f888 f034c2b7 0042b9c7
+    7d8dd138 2003514e 72ca84a9 76208b1d d44fa027 248f8868 43a846bc 28b58886
+    fc8caf75 b262adb4 97abeffd ab3f36d9 911d3f06 7376374b 69f12940 b8714250
+    fdb52b17 55b07936 4ef80c77 d34f58fc 0ea57ac0 77417ee4 42a04020 c5c61503
+    8d1cc8fd d5fa7f65 5752de9e 8028e46f fe1cd917 caa6a163 ddb120f5 d27d76fa
+    fd449d60 4651129e 5900a826 557399ab 0b70deba 9c28e62f da270f0a c2c513d5
+    eea988cf 6e584a64 de29af59 6db0f5e0 f0ff9436 696a869d 0a989685 37cbbef3
+    e21e15b7 0b5ef611 689abb27 a467a270 59827b99 077aee24 44fbd06d e86e9d6d
+    a5c18234 abadba98 3d3f9e59 03bd6ba5 75ceb8e9 501b6b1b f567e92a e0185637
+    38113d33 0397182a 17b90896 0bdd053c 87a194ad bf3c5dae 338d3c7d dd211a33
+    a7
+h = a9c4918c 619aaea6
+
+k = 1d3c96d8 88746bb9 4f51b85c c4837185
+m = 8a1883e8 9d7626d6 53c3e1ef 6b1cd7bc 20bd9cf5 4942f280 9c4c7957 bac1564c
+    5661420e 1e13e6dd 56942e28 1780f5ed 1c055606 cd605948 8175153f 95193b45
+    e2080e5a 3bfe516b c9c82dbe bf98975e afde2d99 78019bea 0ddcad59 2826301e
+    7e8609df 26af735b a260b98f 8f22a94c 6679b464 3fee7d23 bf0782e1 b70469b0
+    f0724375 16742adf b4a02863 cec8ad37 a965b34c 339e38f3 f4b34845 95743bb5
+    db25bbd5 9a30c3a8 b848d731 c79a623f 23afc6e1 d0ed32dd 1c8abf3d 2f14a7c2
+    4bc39e68 c0b5143d 03ecebc5 eadb2f91 877a6d00 503364a7 32674bed bea2a90c
+    a3d96c2d e0cf6adf 6005020d 22ac0e03 1bc3695a a7912961 6bd4b1c6 fe70a049
+    b78f02d1 a42153ec ee92ed7f 370424d2 1a984c5f cad45452 7901ad64 8f88e403
+    6e1305f8 82842e14 be8e0ba2 1097fe08 df3cba7e f545f73f 96d3a40f 3c49f590
+    867fbf63 63af716b 07faf3bf f34a4b58 2838ab91 79aaf696 2198fe45 5951bb71
+    4f6f1cd2 6b93c0b2 bde1c380 fd8cb50e bf7b454a 089a2319 917e483b a6276577
+    ab5655db 228ffad8 acfbb53e a7c52fd6 ed9befcb 4794ca5e f5ad7ceb 10a5f480
+    a70f7e04 6617335b 266ea213 282e3439 1266f84d a64e29a9 dae74825 3770e7db
+    c9e8411e 6be5a6e5 eb587408 25e23d98 6cd5b5f3 9ec8c84c 1ec37147 d6b9acf4
+    999587b9 7cd03800 c7584ef7 addb60a4 7a75a457 8b13e777 ee7510aa 255cb555
+    a0cab5c6 c0094244 3b1ea20c 9d9d89eb f1b34547 22d8829a ba22eb9d 13291ad6
+    176b5fba 691a5010 681060e2 856c14cb fa0fcbf8 0c20aeb1 99381907 90e9481f
+    0feae8d4 67ffa7d2 7a51d7e3 6baba887 98ac9086 1e3e864f 29dcd708 48a7cc56
+    b847ae8d 01093350 96b02295 c44f42f2 c5cabb7e 5a4e75d7 28b3c61f b7ae3392
+    263e7bb3 63f35215 286d2802 dcd80459 171612d6 a732cf49 39dfbb8e 415b4824
+    d7b9a312 52c9a4e3 f055eb51 f8f02023 d4d60709 108f1d47 884156f8 383b88e1
+    02ed1c41 e9a446b0 eb06a513 71c70230 2a95c121 5d1f7425 f4b74fc1 2d0aaa13
+    2cc47ea2 47670d5a 09af63f2 947c66fa d740186c e59cf220 95cb2622 253c51ad
+    c659
+h = 31321d29 0e34abe7
+
+k = 091af6d6 db88f51d 9eb56bd9 beb8184c
+m = c6b45440 5868eee8 15bf37e5 862e070a e07a53bf 795db79f e93480b6 f9fa56a4
+    8346f2a4 d13a1f6a 994def42 388316ee 29b47d1c e7fe6763 2edf8388 02c93162
+    3ff26c7b ff272e9f da8c0da3 959c8bf7 0c3f41f5 90c3b748 ab9d7e45 a0408b0a
+    5ff17513 70ff0701 6c634d70 1d283ed4 b6e61ca1 65aee1a0 b43b348c 6984d939
+    8ae97859 e4b67b55 934827d7 fc954ee5 d0270dc5 2075e530 d4b791d7 e2843ebe
+    cfdf0da1 a5ff11de 4a28a9c0 ae45a522 0cf8226e 366f0696 5e597d56 0d8e88ec
+    1f6af34b daa09818 68b3862e d78c08be 779d2e7d 6d37e0b2 9b5ee99d 3b6e25ac
+    9b89cbb4 75c9a82f 002abc32 c9d050b3 272eb336 03995cd0 375bb516 4368512b
+    ecae9cf5 8e79c48a b6907fd4 e4c5ec0c b2da95d0 6f69880a 6db64701 dc8455dc
+    8122bfb5 73388bf7 5afbea89 e29644f9 6d77e176 38481913 b98afaae 853d9143
+    b2b40920 b707bda4 acbab317 e628b45f f9f6200a 21d810d9 c1257871 44d7a7cf
+    64e2e84c 8a621b5d 2d6cf685 e352b403 e1d25e17 d3553708 8417ca8d 4423c0e9
+    9030aa41 3aa7854c 92e6c275 cec14639 d38a960c b078879a d8d8bef6 aef27053
+    782e9112 5ceb21e9 00741b92 a6014a8c 7e5c6990 e4faabfb 146d7403 ee7fccbb
+    27fce10e b69739ff 1fd0f1ad 3d820106 2705aabb 7917e15e 4125e5d2 46163b73
+    b61437ae c21d8b64 d2a3e99c 627ef18c ed79bf90 0ccc596f d626d186 ac9f1f42
+    911de775 06f3ff54 b63ba983 d9130b33 7a2f973c d9898049 f7d50293 7a335192
+    be8d7c39 4875c48f b9eb77f7 b66540be 913455f1 fec883f3 8ee73f13 ed3a3fea
+    15efe5e6 1d2f4b5d 8172709d b3502028 60a605b6 4c6ea4be 2841414e 46251703
+    e94cc836 ba035f54 9fdc519d 6d387600 66048c63 87ec8110 3b9cd579 0408fc4b
+    ed5dd18d b7dc0609 7b58e435 fd580aa9 456c59f2 500457ab 59d7a94c c6f4fd60
+    2fec0ac2 5a584fc0 ddb8ff36 abb064f1 fbe77d6b d8ebe5d3 9f1d367e 2589335e
+    3e377464 aa2aa273 85baba30 5fb44fae d843273a 07d53334 de7e6577 3bd79d26
+    97503577 e2026d5d 33704694 b1201dc3 89bd9856 3a31db41 b903785d 6b2e8727
+    ec4c03
+h = a922b8bf 5790461a
+
+k = 286ed789 c0294993 90c19e66 e8809b60
+m = dc99097e 862480fc 03cfa841 cacbcf1f 5355892c 5b8dd2ac 1b7fadba 4f09185b
+    08c376e9 dfb6be5b 6e0faaee 9d0b3b6b ac3dd0c6 b661e415 2d2999fa ad3e4b2f
+    01c2a2eb c9c71a6c 5ec84841 07659cff cf5f44a1 a14a8226 fb470dbd ee29e5be
+    7815a996 7e6b4ab4 9eda08ca 6138c286 103a634f 7e833441 b7cf9839 1f11be97
+    7886a262 e9f2a590 c847480b 02474897 3890a41f c2b31783 10d39413 6ba1bf72
+    b32529b9 e2f5c9b4 458e1b26 1251ed94 c7d6e55d 5a4676c1 8bc6980e c00ea383
+    46ab6b28 399bdfd5 f264ea78 54ac5772 449fb6d9 38513e6d b8d7d296 ce5181ba
+    9455ac2a 1336de6a 5ed68001 7cbf131a a508cd3a 0062e6e2 652eab92 fd219baf
+    0b0b9baf a3d14fbb d318306e 090977f5 fcaffef3 9bec3c04 15b1adae 49c46870
+    5166dc9c 5fff7752 ea0fa324 b1b40ab9 513157f3 7c366b49 b65bf496 2f6acba7
+    76de4efc 84dde0e5 beba8448 0aec790b 6b4f1944 83bbd476 9398cdb4 97ac8f32
+    5ad6ce6e 3f2982ef cebd826d 21084e9e 70738c72 10973658 bbf9eb7a d5bc5990
+    c7fcc62c 0925bc08 37d33cca 50f8c2b4 236352e4 19502deb 70a60d40 4162b633
+    8df825a6 e04a4f32 917a27fa 33cd2ae9 a0da314b 06919dd2 88bcfd27 e98bde44
+    6a447afe 3fbea7f8 b99dedf3 87c50958 c752e26a 0eadad1b be778f15 74ba63d7
+    96565f29 221ae785 dc446ec1 ca87b5a0 1856d678 2d512293 dbac6db2 c775722f
+    fcc47139 45d0bba5 b21cde42 e9018285 5d607f12 9bd66979 e0218b05 bf5ab3ec
+    bc60246f 038e2b8f 85360e2a f07168d2 60fa8412 3218fbd3 59d95b73 245e8761
+    bb0667b1 4097a858 a40a267d 3b068361 2b69cb22 247bd16f 31db3f94 a5302f38
+    79784697 e5a5987a 85e6334f bc140547 a1415640 49fe980a 3af42913 99f0daf1
+    d02f93ac 0136e03a 7a83d73b f7bc1629 a735f8f1 367272da 54a4037d 1919d642
+    ed12c8ae 37185315 70c31dc9 87736ad0 5ccb338b 727a96cc 75f1b30b c905726d
+    720c4241 63345461 e92db581 f1c921f9 f57729e9 84268820 b7e4a480 22bda0f2
+    e5f2f919 4aa4da09 377e2750 b265c4a6 ae23113e 37bd239b 1c502c46 d888633b
+    67a28a4e
+h = 174ab3a1 94a3a76b
+
+k = 7facfd37 cb0acb38 7f2458d5 57fe3bf8
+m = 30354008 2c262120 5eb0f491 be26170b 677af88b af11979f 10a3108e 20486ed8
+    8ff21cbb 6ece59a2 9fa797ca c6235391 a74ba1af 5d827ab9 36c7d8dd c8c4cfea
+    cefdadb0 153e5971 f072c42c 0020461c c1b4bed1 7b6175e4 4558ec84 4ebbf018
+    742320e2 4981b26b 90689f5f e91572b3 cf7355c2 078be3ba df690e9a 1efe0c8a
+    6f2b5718 3ae568f5 5cd120c2 46539b14 5341e5dc 1e151525 0fed1e51 c4ae336a
+    7ddb8806 deabcbca a87d98a8 998ea104 332682be cdde89ef e1da23c6 d6848f26
+    16ad1b84 248b7ae1 543af561 0809b0df 53e16436 059859e9 9bd13ba5 88695a27
+    b2f05086 cf58fbcf ea974a54 8f6f2d15 7f6e2165 3dcfa564 ae38e90d 979002cd
+    b6b85e56 b4ba9326 2e873b99 42715958 b66dc684 3c7893a7 67f91213 99fb0921
+    ad15045c d0347ef8 67a30370 439cd6e7 71f1d23f 48a6967c 21550aec 0dae48b6
+    9de46c48 9c2d03ba 3efed2d1 a0cf81f5 99a9bfbe 1f0bfc4c 2839be30 92e8982e
+    f820c43c b8d31e5d 5f9fb2bb 498e38b8 63d361e6 9fa86ebc d9204d48 10df7caf
+    06c5fee5 69fdad61 7a831188 94df41f4 29760a97 88548e6e 8a6d4d1d 294c0422
+    9c13d3a6 b259401e 8a6103f2 97af4b69 17f1b3c0 9b2c99e6 91cdd159 9aa62cd6
+    9e66a8df bbf5c82a 916c1b29 5cd1653e b198f45c cc7d0014 c8568eab d171ec9d
+    8213488e a4fd2dcc 566c3dc4 59e511b2 feed675f 447ac972 f06ae20b 79306331
+    badfdd6c 40cb5113 e6b911a6 3b02a3d0 cc7b6aa2 91ba8b13 7fa2bbd5 f37fbb94
+    ec6f236e b39d9140 c359cb95 ea5c6457 da784351 399ce4bb e22227a1 ed3476ef
+    7f939bdd a8b09444 2894f8fb 0bce4c35 c4672b5f 286f8aa0 9637bff3 ebef4459
+    ef9fb7d5 ae636c45 2a28753e 39242019 7de69596 d7cfd72b 0d417682 d5646e5d
+    e0704825 4dafc384 f9d04033 866ad3ae 0b653e81 32757692 f3a1f9f4 d1fc17d9
+    7220a29a e8e1e259 15fabcbb 23919383 525a48ef c109ea18 764952cc ba87bc85
+    20d2baf6 617fbf75 4c244270 d8081704 a896fc4f 12518ca5 22a2696c e673d62d
+    e26ab85a 6fca8474 d38226e4 064efacf df7c8551 d08ed310 9bbe7e66 5d16f462
+    eee5ec0f 33
+h = 52f9542e 3d2025fd
+
+k = b72f4092 0b01faaf b38ba792 29e55d24
+m = 31d03d67 657d2e93 aeb9b73e 60ac2bf5 2e007274 07286ad8 6fe51104 182ff2d5
+    ecffe97f be265175 dd46a184 e3f78604 b5bd2e26 e4f64282 2c0a0ad5 fc304049
+    1aaee137 433cb321 81e541c6 57a55122 b693ebf1 982f07b4 c3bc063f 6223b7fc
+    88a7de58 71c6bf46 15896bc0 227d914b 2b69e7f8 abf4a40d 83bee4b0 48e03341
+    2545870f 67429ff3 d899a8b2 fe780640 8a74fc7a 7ad51dd0 8c6ce48a d3863888
+    679a05c9 fc814378 70e5b496 11320d6f bed44885 e3221aa2 bf2bec77 e2d56c7a
+    a09d601f d5eb6df3 ee8ff1b3 1043c46b 2be6b153 43ed9998 3e325825 7f40ca42
+    7d973cd1 6b1dd6c7 5878f1b6 cb2ba6e4 d3534549 513fec84 7614ec0b 3adc9087
+    9c9b6abf 2001af19 1678720c 812cd7e2 dc3b129d cbd74ec0 4212fc24 93d5553c
+    80028be8 92f2bc22 82593d1c d1dd3c34 6419bff7 50d3bb71 e9ddcf69 29a8d15d
+    b5b99925 0494e2e0 1367ef34 cc6290ff 3209da42 2c1bc851 ad634d97 448ee780
+    ece7b5de e390ec51 4c8c35e0 cff987e5 ee321a67 1795786c 48bc9193 86458dcc
+    e9039783 800fdc95 d806a21e a5cc1325 8280dbf3 66ead3d6 07d9df67 31564fcf
+    5c74dc16 ec017b6b 1031d74a 7c4a2296 d78828c4 90a64d06 812e9500 ff95c74c
+    6a895585 53eee74e 3e79ddd3 5f37b771 e7c064b0 0762c1d9 f545b250 619d8cf2
+    fa3036ca 774667d1 da6768c4 4bb7351d 3e18e24d 2c481f2a d7af3e07 210caa86
+    ec8dacbd 42a98a69 7a90101c 6a83a1d0 5c7990cb 67f9addf 93b838d5 43cfc8c6
+    3a507ab4 05efa035 7a2638a2 012fa17d 5176f9b8 855ccb60 a60efd9c 46011773
+    e5a9c7e1 7f96b094 b20676ff 55001346 7111556f 3fdadc43 32d9a536 58d77b44
+    aff509b3 c95b5ca3 0c45c265 e1db19e9 ffcc4904 1cdb6858 4efc0a0b 3ef9a4b7
+    da56e226 dcf6328a f58734ca 23a2e626 f4955be2 de2f2615 10f6a012 49b8ce52
+    0b49fed2 299f2a40 bab9f12f 2e72aa67 79dfffc6 a3670548 1048f4a8 72d7d444
+    6ecd0298 48bb1048 4b73784a 3900729f 5891b00f 1cd191be 0bcad10a 3115e8f7
+    1a550131 0ed455c1 88a95eda 2a752952 c89c65c1 87c7bcc2 537de144 e32bdc33
+    1f916fb4 2971
+h = 6fd94c06 a51476cc
+
+k = 42187408 22a2f2f9 fec50271 b6d2cdff
+m = 49e64eb1 3bcfa83c b220579d 8788cccc ab2d76f9 37d9d7a6 1c146a61 e3691ed6
+    135cb983 59214246 efeed3b6 a10d8196 01a651b8 067537e2 52db2c9a 329c91c0
+    f71924a4 f3069194 2a409ada 61a97d8b 465c4b57 14ac9aa3 b78cdc86 7d719786
+    ff1a7511 6964c575 e532c9af d140142d ac706dba e6145954 a5ef0342 dee9a9d6
+    ed9739d4 ac9047f2 92c7b81e bcfda0af 9dc91a53 68851a16 8a9ec710 bfc4984e
+    0f1cfe7f 7cb1ef73 408be1a4 486424ee 606617d9 5fca78b9 045473a5 940cdc44
+    1a10e95d 5649c50a 9dd44a55 70d12a80 4f9e4416 16845e6c 6ba23ac8 8be5b782
+    4f977aec 534c8e2e ca159b97 e5c3fd50 031263ef d022ede8 1333064f 7105fbad
+    9bda2851 0c5bb131 12406b8f 349e43d9 4a6e0ab5 30842b70 6be63356 c2cdfd34
+    6ebe6384 8b4e59f7 6ec18b1c c0631edb 6decab7c 34bd49df 828af8fc 4e0ffafa
+    8cf345ca 110b165a 5a26ecbe 4bd1343d 8a93da19 5010c5bb 63581244 473ccc0d
+    16d553fb 67582073 ba8fdb2f b11aea94 2db4c661 0bc7e617 cbdc436a d0097bd5
+    e2a63f04 fa3d3da6 130422df c4be4165 5912f73c b081989a a4cb9723 014ec781
+    db09f68e 121f41db e574382b 66dcf155 05cb0f5e 6d3a1473 d54cedb9 e1a920ac
+    bddc3c45 8574be28 4511cc00 eb8ad5e5 a5190809 9ee7c404 d5c0ec40 c11816fb
+    a101fefc 6b80eb50 5608434a 05ad3fe3 0df8aa1a eb4e8bf4 fe10177b ad3d947b
+    8df22fab 900fa0e0 f6f923c0 c495eab2 6339f6f0 0c09c521 41d41e08 3fb63343
+    1ddb80fa 2322544f 587c417c e439bb03 297e3db5 28b3d84d a198c69a c5e33c8e
+    f4ea8879 c471e038 f0149017 525be5ce ef76beab c4b79a39 a2329ef4 a08b4c8a
+    abd06cdd ebe6462f 34eec1d8 9b3c28af 0192855a fd20d1f2 83eaba74 62c60561
+    f329686b 4e72dace b84ef79d 3be12b27 df85c3c9 55605410 136d75c1 74b3192b
+    71859670 8dc1c504 ac9b1c72 abceae73 15a7de1a 54fe1509 0ce1b1f4 eda4010a
+    606cdcd8 83a701c4 a8392094 ddd084af b9d04c86 d97c4c2c b7bc9980 6cf70223
+    697907ac 2db61b01 b2769eb3 b140bf9c 55323914 99340b45 00fbcf15 8f608b9e
+    039b5da0 79e51b
+h = d942cb7b 7c05948e
+
+k = cd5bebbc ff4d3aa5 31f85373 4709b224
+m = 0c5211f4 98a8d75f 86cd18e4 f46db4f5 f7874526 e5e914ec 2c2d8374 d7ec6b24
+    070bc0d5 ee4673f4 08ca4d86 4d3b9fc5 d123ea4a 68ba3404 54d91058 e13029d5
+    c7379ab8 e53eb045 21d3594e f174d82c fb72d211 e81a2612 4a745582 3b648bbe
+    206ffb37 aa0d7857 d235e2d5 af081408 dabf77b0 613ed016 7522d704 4a564dcc
+    d722d122 4230917e 094ad308 f796a227 f3959d3a 722c8fce ab3186c5 4b876605
+    a479a774 9154957b 8aee79e4 f046cfc2 4142b311 210aeeda 227484e9 2eaed106
+    160e2ea0 d32e8c86 c488d7ff 81a4407d d9d9c4a1 3e7098fc 6b08dd14 4f68fd80
+    16392238 6b9d7aaf e2db43e5 e04db916 32370975 edca38a4 26f99263 99b699bb
+    275ccc47 fb1073ba 626b0c3c 18045fed 4c833d2e fdee4e98 815fcd7a 6e5da77e
+    a7957ba7 35a313d7 b087a583 0316ca96 267b2d20 64cc5c3c a9008248 304a2bcb
+    f330b4e8 e7397d41 e1302214 17432645 950bc546 1b996653 6bdc0bd9 cd04942d
+    c8b8df24 56c2f0a2 ff5fd6a2 c16d265f 6a21876a da215a2d 48fd583f 6c13feff
+    186f31e6 ae5f6ac0 cf562bde 80ca9f5e f5d25118 75a84cc6 4b646a8a ec20f512
+    988f5eb6 adac2b13 dbf3d051 113852e5 28b6d44a e433dc60 a3b5754e 2da0a358
+    86adcd9b 4623e634 a885f3a3 ebb3c3a7 0b316d63 52edc798 01dbc5cd e8c06783
+    4d981f3c a974696b eeba0a3d 04f42a08 fa07c90e fa11eed3 544f7c95 53d10b0d
+    015b82f9 ebf43462 0b2d9250 7c4ef77e 9fc5b79e c0b9f504 a6452968 02280abe
+    2242faf6 0299023d 98913587 d223100e 3e1194be d450966f 0d2f2e11 769a3538
+    744a66ba bd86db37 bdc786f7 1d38308a 2cc22679 878cb3ca 2f6cb641 f1df90b2
+    0966c9eb 8156a4e9 d5c7595a 0f134dd9 c659528e 172f5200 a257b372 ad9a93ac
+    94fbffa2 7a11df33 00ed8738 c364f366 a4e4f13d ff9e9119 190b0e4f 1e93d1dd
+    f4b300fb 2833294a 6006c2ad ed54f2f3 a96609a5 d86be954 6c1202a9 52384f9d
+    98a3d7be 5e922197 e173b57f d0f89a95 0f23939f cf56ce09 3ed61b47 04acc6ae
+    09344bfe 3085dc06 f1f9bd37 c4d1d9af 2e96ae0c ed4c8446 e1cd42e9 efb9ebef
+    97e34af3 2d7daaff
+h = 8e0ad160 392e30ea
+
+k = 7d8de240 ecef5283 ab03a129 e949203b
+m = 143b8d68 59a62fd3 b8875309 29dae084 6a904e54 ccd72410 b8821cb5 013939a9
+    f5451aa0 b59c7227 9ce82ff3 f1c9c03b c9dacf67 4860b607 c7c911a5 92bf143d
+    141635e4 53912744 7811529e a1b60df6 15306360 76bb7d94 9fbd59b8 506854be
+    00eb3c17 27229fed 15ef0429 21c81943 943b4bbc baba6dbe cfac764d f21a8406
+    716b7c0b 825a4520 db16fef4 bd427792 86f31697 972df135 3d929ecf 207aab98
+    5c10723b 58ca502a c6443d0e dc71f074 b9b6879f 1151d5c3 702020eb 1be258b7
+    25c01427 54757d85 15a7b53c 34a1b191 638308a6 8c16f508 72fddaf1 e71add5d
+    e5220456 ffce492b 072b7d42 87df3e65 e154c562 4b5c5b52 30e642f7 85ecc17f
+    2988be0b 2c10f990 a1674cd5 caff4d68 03185b12 39e27cf6 25b98b97 1d5288df
+    915afdbf 2568a73b 382f4d19 c6bc48f0 b8fcb1f3 90ceab54 11a29b55 9dddc04a
+    efdaf819 70614734 bf4d141b e65e42c8 67c7f9f2 445064f2 7d4a0843 5b39e911
+    37074f61 4c73d87a bf167724 a885e733 7891c378 d0997dbf 09efa8cf 4b352dbf
+    458847df 504596cb 2e89134b cd8aa6d1 3f3c8f1e 4349f526 71bd6e59 60f3e639
+    599f6ad3 6aca1eff 630fa09e 2d5f8922 c07048a9 6d6926b0 117e3826 876c7974
+    323c5ff7 9e6fa5ae 32e4d128 2923048d be6f63df 71661740 56ca023b 7170f84f
+    9c903667 d6e558fa 91658cb1 98e55e88 d5b073cd 4ba50545 39f018e0 916aa489
+    3a6befa2 249c7949 c587ba47 4d5f17ae 6f45a8eb 1f7d925a e31b98bc 5b2baa6f
+    dcc38fcd 5b9bc85e 7eb147d1 a6a3f636 b580236f fc2fcec0 f646a6ea 6f01806d
+    938f3c99 66f88445 7fd4bb68 8fcbbbc2 cd90e194 b816ba1b d4f8e5e6 98704588
+    3f186c8d 6bdff45a d16837ad e40cb79c 8a304b24 6c8c8096 60922d1b d02cb8fb
+    77c0b2bb 6559b77d a2210a8c 418afaab 3dea0e7d 1673b1d8 ed09e385 3208641d
+    5e691b34 c177ce8d f634e426 5cc8bde0 9adf29de 9a00394a a380e6c2 146c24b7
+    f2576fe6 8ace3651 f9b0102e 3a3a6da9 a3f20530 3b994a8e c49cafa4 574fb99c
+    d659fbae 06eb9ceb 38d2197b 3d4dc2ab 26edb7f7 34294176 19917c65 236756af
+    ecb3c84a 14ca982c 4e
+h = 725c6fdc 4aa4f680
+
+k = 2a1ded0b d0a0e5ad 79985713 c0ae4d6f
+m = bf9e5d0d bf1b5b51 9324701c 165a7f79 abfcbd89 b473f040 0a8703a3 1a7d9e88
+    0172d9dc b2715f19 5c74a710 9d537029 d93368f9 fcc8f020 50643a79 2e7e0efe
+    2b93a0c8 4d483ef7 eb5b2ae7 259bbd16 6646de9d 43916678 9d544a4e 9c9019fe
+    14312cd0 b0235387 01c0839b 17025cb7 6a570279 a86d3522 0761e2b6 1e41a20c
+    844a5092 d601c89c 4fba9238 68bc075c f4f3c7c2 e861fa98 75a5630c 3df9994e
+    bab4e8fb 4373613f 2828bd2f 6f94334f add64116 0b56f8b5 811b64cd 6eba1d27
+    5abc2b36 f92479cb 44bec17d 0072fd7c 3934857a 7e463e22 72faf7e4 7cdc17fa
+    9cdd81c0 035d4e8d 5302faf0 9d43f4d8 1f153e6c d6a648f4 40142371 774dd852
+    0835755a 02b38b24 07bd2017 e1a0c05a 170e80f1 045fd3fd 055464ac d318af31
+    93b4e9b4 672cb317 586eeb6d aebdf452 7aa74081 fc15e6ba e8bdbd57 84457473
+    6b36d215 79bcccf9 d4af39ca 45fef9e9 73706f36 a9c96c83 871100c2 ffe82b55
+    b86db733 56d284ec 418f691c e2c74470 2b2f7491 b4dd1256 6e481234 ef0d0850
+    ceea5da4 b10e08e4 b69b1cfa c18a99e1 40f42d75 11ad1bbe eb8fc29c 2151df8e
+    45bfceb8 e66a49c0 2656017c 24150296 9b2437fd 31d1e333 a7521de4 44201195
+    1b8fe323 940d4cc7 ff6c9df3 e13cd309 a3653c97 42e5148c da31ec8a 178d8b35
+    0ed758e8 f4ee6dcd 0df4b1bb b3bb6ee7 fefaa1ac fb669f02 68f02129 917e9c8b
+    cc8f6eeb 983112c8 1acbc249 494a2f81 d0e20eef 2d6b8a48 1ca76c0a 45fece29
+    3d2e2db4 a6abbb36 310a0da8 969a1e38 d4e96c29 39fd3d66 623dcc6b e666ca24
+    2bcb76ce ba21e364 b8dc7417 c54566e8 bba8312e fe34afc3 6458b93d 111a77a1
+    0f27d7c9 1a18d275 e9b289ef b116124b 51b0e83d b774eded bb6288af 814bfc96
+    5014f0be 4257c0bd a1176261 4d2c9834 c210a8c4 bb928da6 aaa98215 cfc0de21
+    32000144 d78f3f69 0fb6ab5c f807d4a1 93230ba3 2657c8e2 389a6e97 4be23e80
+    df6f784a 493cd311 cbe9626a a912abc7 eedbf6d4 c3c96229 1a5f7e7a 08611601
+    e35dcfb5 3fdf443e 3d508b4d e78e078b 8e562526 5eadfc9c 0a27b116 cd43eb05
+    8c851f86 d90c378d d698
+h = 4692ba44 0a73b79b
+
+k = 550b7f39 06954892 c0251b7f 206bdcec
+m = 826bc5db c97b539b 25d69520 29bdce8a 31c1931d 9b458afb 830ccad6 ce312f4a
+    5758da3c f7f4625b 9c6336a6 1c921322 0a01deb2 38dcc3fd d2e2d3a8 bdb79041
+    86fb88f1 b63c5b11 f8ebe6a2 f2df5acf de62706a f97738cb 6c1e15a1 15d511c1
+    f4b1c4df 487e31e9 ce0475ab 5fb72190 5961315d f54959ab 4120bb88 2ab64404
+    1e65451c 2e3f2e16 60c5ff65 0a0925a0 7e39ec7b 3d684fec 9487f55c 76c74436
+    5f95cd3d 4f88d598 7ac016c4 9b4ab3a8 65528596 e306448b 85de1eba 6e0c46da
+    dd5bc678 b5f9e7d8 5474f5a7 7cb4e53c 9ff1f8ef 23c0ab53 08f303a0 4fa44e32
+    8029fa36 c5632e5b 11d349a6 501ddbc6 c199e9a1 4affae10 a77325aa 0eb6b81a
+    3d165bb3 95609000 a811c43d a3aff23f 5393776f 5208348a 0f059f02 c73b3a38
+    35dc1433 c0dadd6c 1036604a aaceaf26 d96c909d dd3f77c5 42c847b4 69658a7d
+    ba6f03d8 a5245c47 7f5938c9 43b8cc94 e931cb02 53f3c45a ca0246dd 9b0a3d49
+    4d40da73 eedee257 0a4a7d4f 126c956e a950639b 67731d53 d20e08e0 7d19429d
+    a3aeb3ca 0b7ea444 3a2c41b8 dd929f1b 953d4d13 d59be1fe 38401bc6 4f66f7e5
+    1135c0fb 4cffdb56 878322bf 1d41ec6b 08418498 4817c61e 373fc77a 00c8ea6e
+    182b99cd fb4247e9 11646933 8b86e86c 97f63b1e 1e0eda16 e16767f5 cacc7584
+    cf7d3dba a84aae16 252488f5 95e9f107 62af0042 6a9fd890 31b63d19 84ed8079
+    e850a71f c5457320 7d0bcb54 3412bc2c 15beb814 20d982af a5ed1449 1bd70073
+    3573700b ca9b5494 20252248 89001ba7 10c33446 bf404493 63449ea2 85860c67
+    e2301154 70b3b4b1 16ebf8e1 9aadb9fe 5923e69b 3f9eccf5 a2a29b50 060a8239
+    62443fd5 00526a84 45c1f6e4 68221d6f 93d90200 e71a94b4 0db64322 3e2e0de1
+    9d36fba7 07440a8c cb17a630 ac2546f9 97f72ea6 f595ea4f 4a0be694 91242d3a
+    5f8f6505 f387f221 166d9fb2 65cb61fc ba644111 459b9ebd db92088a c490aadf
+    19c8ab6d acbdac49 e4e3d223 230af243 1e709455 5410f620 cb90742a f16237a3
+    31f10aed 7d3fc4a2 f78b9f26 11374488 0cba390c 1af0ecbc e0cfb656 970a6633
+    00d7e63c 350c9fbf 4e7895
+h = a9c0ea09 03f83d69
+
+k = 7f3fe081 d75a066b 9b261ba0 a57afa49
+m = 45eb4804 b9196f74 ddc0a25e 2e7aec93 2d77d11a f9011100 4829b440 ea2c4e5b
+    df19d742 2e3fe558 492070bd cb22674f bcacb182 9feac480 f8aeaddc aeeac505
+    848d3cf5 2265328a 5c3cb516 8cc7fa85 8a0860f9 24f54d82 880ec6b7 a97f5c58
+    60a94914 dc570c14 c91577eb 38859a85 83f7c810 f25af5c3 73384d51 395e7a5a
+    2c1f1b8b 7fdb3464 ab90b783 25cf62a1 c04d1149 c62d5fbd 3ac36da2 9c030e37
+    8d67aa58 b56150ad 5c91ddfa 8247ad92 067c65f0 b8f3a4a1 f927ce59 e58e4864
+    ce348c9f 093b3a85 6bce9cd6 4cc46812 acce7852 a8899c8a 90656d6c 3d0b8a4e
+    015d5b88 a7123797 a702c911 45afd6be f713394f 5d6cc337 45ae3b9d f982a6db
+    05717e9d 667981ad 69634226 b22c25e8 a759d407 adbe76b3 26c790ba e5a351f5
+    d8e29a95 af49da3d ffa8d202 feec063a 8c24832d b4443eca 533cbdf9 1612b1d9
+    4da587dd ae523259 d7e60db4 d8d83d48 3a7799f5 1b222640 992580b5 b9be405b
+    c9b9c2fa b99d6bc1 c4dc4fc3 c8110fdb ea9eb468 33defb97 b6ede19a 8fd476c3
+    4cfcb563 0671ec53 1ded4a71 d522b83c 08681adf 3f7a913a cf5231d6 635b3f5c
+    abd4dc59 c4d32f49 d7c735e1 928fd198 dc78a1fa 1e7f2666 bbca1f98 ff5d22f0
+    20fd7e39 ce9eb5b6 221c2308 cbec4c7c 649d5724 3f1dc056 6714b8d9 8030656c
+    01c8dc85 9a180775 566f2ee8 336afdcd 51618f56 62112854 ef2fcfb8 98577699
+    c9632565 6d8df037 7507a1fa 508801a5 87fb4258 53528b6c 0279efbe da30025d
+    54d05e11 05fd2961 ed18f2a0 c6f6b634 c4438cd4 a2f48d42 8a740448 9f5ee660
+    0df371e1 0bdaf5cc beea5108 5ec1918d e4963af1 9d781910 027744e5 c100b32a
+    4c292aed 41dc7af9 e3a911f7 5bf655ee c579e057 873edc34 dc339a06 61056321
+    5e83abc4 0d1fe453 ecfdafb1 1f70c33a 33d8b4ef a8de4e71 4a4e464d 742e7785
+    03e1c477 9c7a22f3 d15f6512 6a092e12 cea1c626 8745972c e402d682 ed18d2eb
+    567d706f 833746f3 36d0c7b9 579b3853 aa07e9d6 ba1f87ba eee7de8f b1a180bc
+    ca926fa3 b2048698 36b1525f e8bad285 27588beb 6395a727 66647f3c 3f255b12
+    77675b8c 12dacfc7 7b29ed9f
+h = 60a75cd4 2d7a6b6f
+
+k = 083e967f fec08670 b7e15187 d729c3d1
+m = 93e044e7 78c738e7 7fa1ab8c d4b0dc84 c975564b 70fa09ce 31b71d02 39cef7e9
+    ce42e311 9761fcdc 186b4eef 2a4c0556 621d524b 5225e514 7d751c26 8103a7fa
+    a980e707 bb6fe6ff 824024a0 56057870 e0a241c0 19b01ac6 5f3b7f03 1a215506
+    da122c2d a39a47f9 60ed008f b55ecce1 c2f1c155 8f38e372 ab96d9df feb856ec
+    a18962e7 bee12d9b 38aea035 24ff0e6b 1095da81 d61319ae 742bf719 80273872
+    a65ea00f 568ba409 79cb6eab d435db65 b075bce1 3da21b7a c8f372cb 7bf971db
+    58249aa4 590bf3bc 6ceee7e6 89ad339a 3e081913 19cab319 3bdf9445 b1a6d549
+    6dc3629c d12a0703 88d6bddb b18057cd bb1939fe 449b3d77 464f6ed7 f86fdd6f
+    38b65bad ffd6bab4 4123c252 75a3f4ac 56d6b179 6048ca91 04fae403 86d1f196
+    514a90a5 82551c4c 8d16c03f bd0f9b5b b24f80d0 8243c6ca 11e13db6 8ee93da9
+    7762bf08 a36add5c d1872ac0 713834e1 62d530d0 0ea330d6 be9f0414 f2f3ee26
+    e6329ae2 06770ad0 8222bc2f 95435761 d3241a5a 639809c4 9c60ebfc 88bea281
+    91aece0b 62762ece b9a1b68b 19568b16 cf39b93a 722ccbce 09b0f3c5 6ed42c58
+    817a85fd f28e557c ca91d82e 13773d7b a11c5127 59258a00 fcc41d1e ea9b5682
+    18b5fd4e 3aa2359c 90f96d7d d5f3ce2d 999991a7 6e9be878 a3c0d260 e1ecd35a
+    244977ce 1fbee433 f474aeb3 3d94c983 b2390b73 f7d5f2d9 026a1e2f 5c47f43a
+    3100d381 8c3dfca7 1966d31b 8546b0ff bf3669c9 c599c6d1 ec8a4a6d f083fb3d
+    02c459e5 a6b269a6 9f9f50b2 f83c248e d5ce153d f3520a66 2e3d8c04 2a724e53
+    f6ca6197 2c9d46bf f3b58672 c8f4b9cc 133bbe96 5a090710 260158d2 f7ec33a9
+    8b1d469e 70f044e6 ae0267bb 5a76c9f6 679d7e68 cc9aeb66 51790619 00140852
+    7733d67f 9d033b7f 42665430 20abc252 8eeb5c35 8927d13d 568e305c 69d63a40
+    de355313 0e4cd786 d6696d45 b2ffb986 c1fd4dd3 7ba2b562 906a9316 ed5669b8
+    aa0d19d0 37830863 38386fdf 92e09f54 d98d2b63 19eb212c bd5a4986 735c7dde
+    4237f86d 309700b4 8005a46f 11ffa2fd 0bc90aac 3f3227dc 154f3749 7a086e69
+    53bfcc66 389e91f1 16ffd332 30
+h = 23a3b611 d7e038dd
+
+k = 5f870762 b5a6d6d1 44a00e01 b477698a
+m = 7d2dc304 bebb4364 11a155a8 55dcb2ae 73a3fb1c 52213e89 32cc98ca 548f84ad
+    ac1f91d8 a3bee466 68924885 7f34cdc1 d5d6fdf6 74acf617 7842c699 b604e6a5
+    e2f70a90 ea826745 9289d3c6 a80359a2 a7528b6d 162c512b 408acae9 2534df93
+    f679f242 957eb0ff 274e3c6a 0594b38a ee14ec0a e289c891 99b854fe 169b4107
+    1a670cd8 b943553c 4744bd09 1c52c87c 28a88c1d 5746fb35 2d6475b0 99160709
+    7f4fff9c 84c3c493 b383f613 a3e7893c 3a9eaac0 7515364c d1d83433 a3c50094
+    4b77f634 90ac7ff3 ed861e4d 43a321b1 8f5015db 2a2f277f 51ee34df a9557de5
+    2b37bef0 bb8fda29 7dadf9d6 56d86174 0a1b1ba0 7effc218 dcfa76bb ce7e8a6d
+    908d8bb7 4116ddaf 8aee01d0 ccbbf85b 5ba0ea49 c8dc4b12 e6db5697 42338efe
+    7c0adee2 468e0e96 7fce7007 ce814fdb ed783bda 7a6b852f 5177cd0f abc3c3fc
+    5b20efff f3c481c6 3a066b1f 46408b2d e9ae8df9 37d6c4f4 ef911447 288c4edc
+    baaf1d18 a9025714 148b6617 eadc063c 9e0ee6e8 ff671304 e786ea07 438d369c
+    a8e8da31 8a8e3dee df22dcde c0e300f0 9733fb8c a7f9e04a 39e5aa21 16ba8795
+    2f78a605 0a14299b 485465d8 f316c1d9 86d15e3c 4abe9440 7888befa 653dc096
+    36cdc67f 2b7069f5 2b11d76a d4fa8d97 aed5cbf5 cac0799b 490be096 a050b4e0
+    11c4712b 90d90212 4c138b91 4e92982d e1672b26 f506fb4a 49d7f8a8 3259586c
+    86ab4fd5 eba5238a 934c1702 0a28c1ca c3a30212 d21944e7 9ee6cb2f aab6bb87
+    b4a22463 ca6383d9 1531a912 277428bb 858934f4 51ba3b8f e77f3654 8bcef37e
+    4e326e83 94196ef4 9d34f7d2 03996e54 aefdac93 20cedb3e 80878ed4 f34bdb0e
+    cd7b0241 25fdaeca db2ce9ea 70c284eb aad09109 40c46adc 182b08cf 660657bc
+    a43b472d 15be868d a6bd5d5c 33f4db56 a8e0e096 60d34d6e bb0ef22b b139ec2d
+    fac37ea8 002d17b2 11890aa3 a3205f3a 13e09888 0f3b88b6 7d13c59e 40b4eea2
+    53e68e3c a846b5df 7dfc0e94 a7141e31 933f40bd d2530ee5 3847b9fa 5fbb0bc6
+    d5e82abf 37ac31c6 a5a4c190 113b6cf1 98ea489a f14f2149 75f9faeb cf9198ab
+    ce8f69d0 6521d142 762b1f4e 4656
+h = 7ad2bada e62320aa
+
+k = 59efe815 bbae67f1 39df3776 87cb1522
+m = 4becfd4a e9a1e704 ad9b5b5f dda3d5e0 fbbf64ce 8433c709 0288d40e 5abf020a
+    97a9c04b 721b57e9 7978d45e 35fe8b8d 3a49bf4e 75933511 1c43f360 c9916724
+    b257e3ab 0cd11be7 c72ae561 3f046e32 77f26db3 226ee14c 218dd329 445ce1de
+    eadf90e0 fa4f8c9b 152a43a1 8e068fcd f9a69919 da9d7231 d6fa7b3f 7e917cb8
+    8cc57ea3 caabb37d 60148fdb 018f8d95 49c07621 30797136 9787e4c0 99a09e3b
+    19026995 a2634b9c d932eb61 45ded4ba d2e33b72 64cceade 6b177f45 2c17d481
+    3a23f1d7 2a7d3afa 7a2b672f d64d09a6 8c656ce4 54626930 5a9d63ac 12c8ccee
+    b0e5d7ca 2ca7ff5e 700a3fdb d68b9ad1 7fdab31b 9057167c b150424a fa988ce6
+    d35e8431 4901c749 0a2abff1 7e524052 3e3db64d be897bec f06f1352 0ee54cde
+    9a9da4c8 e4a1db02 067eb2f8 849a4b6e 9073e463 ddb09da0 edbc9132 db594c24
+    a4fc2bc3 e1cb530e c7f9cf75 9be295d5 16c6bb3f 389706b8 d276425f 2628bccd
+    a4c8f971 80c3c531 82ff37f4 af2aef39 125dcb1c 54291478 9fa79060 09ae55ed
+    a22ca9d6 f1aa371b c53c142d d12c8630 688d1d40 abbcca48 2ccead94 17374de6
+    92cea822 6eafbf06 cc98bd80 e1bfd5c6 e389ffd0 4e6ad711 8118a344 6e5b3dca
+    869d2938 4b8189da f35b9681 3a228382 be0983f2 f9eb7cc4 26713b47 1ab8f022
+    f68cf244 33690f8c 0758bdc1 580a9e59 22f0ae99 a065c5b1 59d0e3e9 22a66102
+    0c4efd8c ea50dc89 86df90eb 369fb293 788379d1 8b45020a 5723390d 1be4949b
+    af9ac606 4006da3a 4120cc01 44f6e3fa 908c8a3d 39fe61df 7af4f548 2e0f0223
+    09c1b7e4 f1f9c4e5 adf29c5e a59ccb54 9ccd68ef 3fadb5ad 1bc62fb3 4757f4d2
+    5f64eb94 94f7cfc5 62242fb9 9c003989 f5346174 f9572e55 9c0058c5 10ab4939
+    37bf7a4c feed1ab1 afb056c9 0606c567 1469623d 126c09ac 7e59f967 76c1d67f
+    e3419dd5 1223f1f6 c2b898e2 4316cf99 b173788a b3f934f6 a752c2d9 fec3c9cb
+    f39b6671 5866a7c6 7f83eabd c1ad0831 e7afa512 8963ca70 1685a10f 6c95390c
+    aed7369e e3da31b4 edbb7709 69ca8463 855c5153 eb46ad78 1a09ff98 83577cfc
+    bff13354 2a8a1266 cad63fab 02d6e0
+h = 7f0a7247 ea7d32e5
+
+k = aab0abda c912807a ce6a9ba7 3eb52384
+m = a3db147d c7326607 d8ac02f0 8e6f10fc 2d9d2f91 126c72a0 0f8e07d1 a6e2b643
+    4ed981bf 16ca37ba 6740ff26 73198c89 c3a5b763 31eb90b9 5862754c f82787a1
+    945ebf09 9723f3bc a706ced0 fd26eb12 ebc6bc78 b2392260 af31848c 3774dfa8
+    a2687fc9 02263680 3e258ca3 c9acbc84 d8c472f6 4c4d6d23 5491ab0a 7143c2aa
+    48262d48 4504faa6 37be3f0e 24e027fb 7a72ef4f 3a7ebaf2 05f1fa35 d1b68b25
+    a61511e0 75b41e70 66ea34fd a1b9806f 296ffa3d aea5960e a147d8cb fbcff22c
+    c6afc3e1 1ab7b386 3480189e b43c716d dfdbea45 e4505d9a 94422bd4 d9bb93f8
+    56f10292 4f222af3 32a989a7 c7583198 5e868072 1783558a 6346c97b 60bee941
+    49798285 035849e7 c68b5250 8ba280b5 b6f11286 be2c7dd1 a795e900 e54f0f49
+    1600b9e0 56a0abae 88a19220 22c3d1f4 833bd69f 67a2a78a a518e83b da867be2
+    5b6f0883 0c1d0de9 cfb03c5c 536192c4 0be89f88 76b22e74 20d8499a a1e08939
+    49861c97 9fd5963e 983677aa 3c7bc354 600cc726 cffdb3f1 9a5407de 391a837f
+    1d43cfb3 ce4b05f3 a74cb132 0d521e1f 53be4095 d347ceb3 b2022292 9182e5bf
+    c08341b9 6f60f2f3 8ab2d482 01339653 1b7ada1a 7becb3d4 7e1acd32 b55d87a9
+    04c999b7 bdb4189b f43f0b2b 8d2f53d9 1d5a649c 090724b0 029b5633 30b8d738
+    73227bd6 4aa8ddd1 61e62a9a e17562d0 9b73cd15 e633c1ac ca7a2bc7 9f9f824b
+    081001dc 004a8759 15ee2128 4b25dc81 f54f92cd 049e0e4d 9066142e 624ba5d8
+    e29b45fa 8c227277 f5773cf7 42f799e5 cfb3d1bd 4623cd42 e81deca6 778ed979
+    71332650 b33d0827 543441f0 50771475 12a3b78f 94cbf6a8 54e7ecd2 e227a147
+    f4ba74d9 c88db466 8ae2e95e a146444e 01b005ab 44f31077 ff28eb61 5bb4c290
+    2f9d4146 97444484 fcfed8fe d7f8c1cd 213c323d 5f2ab354 4c55b83d 180226ee
+    494b7dbb d40f7df1 708eb527 1111b31b acf48807 c3d9bdc3 3d0be2e9 2cb8ff96
+    42f9521b 649095c1 6a97ef26 911b6deb 3673f7e5 7758eae0 56e5d059 55631e4d
+    80be95c6 17e645b9 a58aeaf0 a896325b ec5a47ff 3db717b2 10635f62 48a7fccc
+    39ec163f 926e5f6a 4e0f88bc 35428d18
+h = 1804b5da cd915011
+
+k = 33a60a5b 65e22e15 70edd85e 508a4079
+m = e9e532bd 13f260ce 6c31579e f9cc5c57 8c6090da 697c1a5a 2c807b11 110c67a6
+    efb36f2d 3963e1cd 6634fd17 9542864c 43cdd49f 2f9f2859 f47bba7b 011d57e5
+    4e3103bd 580db9ca 3c80109c e1ca448c 347d5256 591e1c38 9016fc82 8662689a
+    6d7cd66d ae4d712a 885da3a3 93402f6c 8f3bb8de 7cd84332 58c1baab f23fe5f7
+    b53b2fbe 31587bc9 dde1e89e dd3979f4 29c872c8 3c67a808 044b044f c82659b9
+    e64ebb4b 4afcd847 aa5ae359 e0848abb 2775f71f 12f38424 335224bd 79fc93b1
+    4196e920 6574add4 f9ddd5a9 2d392377 edc2f90b 641dcbc2 048620c6 74ce750f
+    7a468658 d33af6ad 0ad98040 67cd093f c9e529d0 f24d96dd 52ca5c69 23b0ef24
+    baec36cd 2975103b 2ac1bbf1 65a6e5ed d8eebdd2 6930e1ad ebffe306 f4badd00
+    49f98d85 bd7711ad 108c3bce b4ec9155 31f66c04 16b030cd 4d6574d0 81129f98
+    05295fda 26d8afc8 04c4d104 b48c64df 136c7053 8ea0735c 65a8ce7f 1a0375d2
+    2a1184a8 31464919 5bfaae8f f414879f e8c3652c 633382fb da44fbc3 83b4ab6b
+    cf7b3dc7 c4f7a5d5 874d966a 5f5d5d25 737d2810 f2411502 5f06156c 7d3e92ee
+    712a3556 b1cd4712 e84bfddd 34c975c5 7bf53c5a ab461bdf 98e98e69 a4a79b57
+    0a38dcf6 0584bb27 ee690774 ff5382bb eb04d968 d40d0812 1dd2157b ffd48faa
+    0cbbfa4b 83aa3035 c8ea6855 b19f9490 3dd9ce62 3f311bcf bdc7544f ed61ce77
+    8b0f0659 d6928cba aa8a1ff4 00b21c54 1fb56309 3abe0c1d dd6c2739 2ebf5d12
+    60e1d313 8994415e a29961c2 c500d6b2 4fab65c2 6ff57e7f 67ecae4d 1933a5e7
+    8f70f6cd 75d3fe1a c3113202 42eca1a9 96773f82 c4b73b48 be7c94be 6d050640
+    95b1bf66 c0262f26 15a8f665 f69f1397 a4bbc0b7 efdeb0de ba2be871 9d3897b0
+    2a10c0af be91a7b2 741f5d26 dd42507d b9f2e46c 6dfb6a5d 4410e775 1fc6265c
+    ebaf3dde 701a214a 5d99c165 fb1126fd a92cbf9e 19e61d23 9742ef83 0928f5e5
+    6bf0d630 8d1a737c 31f206f7 549958a3 aac07590 364267a2 74ef00ce 5a192c19
+    fbfa7a18 3ee3ff18 5394784f 41f81479 583b8b75 2f916b44 1b7e43c7 0c98afc3
+    2854864d b75e0308 5be5a4c5 43d3e958 fb
+h = 49fc541c 6cfdda66
+
+k = f59c9362 e053444f 1f883e31 13f8b967
+m = b90e3d61 28292834 5de702ad dd37b3e8 d7b73379 18464468 60baf7f8 2892a0fd
+    cb87c191 a2e554bb 1a89f22a 25238b26 99b5f44b ebb68358 71105a34 400d9b68
+    ecb1665d 41339cf2 de93b4c2 532729f0 192f54ec a64d9fdd 2e09b354 68deaa38
+    61b0b780 64a2212b 4d84705a 4f401c53 bf386bc2 5fcc61d0 b1247365 4905647f
+    79f4d2de da670ac3 e3eef252 c8b0564e a910739b 80ae2bd1 d520d684 a49056cc
+    1ef1135e 837446b7 f699bf6f 9e06da0e 8f23a300 ce2af58d 7fef2631 332471eb
+    e3c0f42d ab9142c7 a752aff0 04a2d956 c87d6299 0453624a 9148cc5b 77eab10e
+    a63af861 00bd18eb 32cf78d5 0b0635ef 59d17af2 0f4cbfd2 62b90364 d6652388
+    0c94969b f8710a95 0083d179 67e86599 47ffc0dc 259a9990 5990c970 c1682dea
+    e08be872 20d5b386 e8d2efa9 8f2d3868 5430a835 869f9757 0fd9a790 c51f3013
+    8e2dc58f ffde543b c1832670 899d775d 7a0fc452 de433b8a 5f89a9af 799ea0bb
+    1b91b38b babc725b e07618e9 1074eb0f 4e7f0b80 b1f68245 f826fba5 07cc11fa
+    08219da1 1c60918d 2caf5e4c 8271e0ef e633dd26 c4220993 0c540991 78ea319b
+    78c9bcbc a645dc90 ad6b8e53 1e115520 58a8fa71 9c95609e 27afccaf 313f80bf
+    b951b59a a8549d20 f6e1bc8c 2d2c336c 3bf35ec7 2f04d759 775b5931 75cf3cc8
+    26dce2e8 197284cf 91f2ccfb 88690c69 19d03b87 1778a0af e8b46cf2 fa20d6db
+    83f3cddc 5282c24d f4d94ade f5ed104b 49b856d3 5e5a01a6 85d46c2a 2235caec
+    d2d432ba 0b14ad81 8a5b08e1 54613780 5a872708 d8e87455 34a9a63d 53c1d874
+    3913b6ed 887ef771 6d27780f 5343eb37 021c3c6a a876b0d8 4cd966d7 82c7315e
+    3df20b7c b224aa5f c2457f21 adc7a2ac 9fd506ed 50e2b2cf ea685b7e 98bd74e3
+    4546345d 24fc198e f85c4a22 eff7e16b 66930667 eba823c2 27c4d5b3 bd6c838a
+    854a3c69 e0bd3b42 0f036c90 9e77728d 66a7b0d2 b8956999 aba31a0a f6e67d99
+    c0128e52 98e53bc3 b297bf7d 38918f50 affbf740 348e4a0f 1f4f5647 65af5643
+    0ecd41da 45435c6b 53795537 4edeade4 d806f677 16a8fc1a d899c103 863b2c7a
+    67151600 e39ce280 d21fce5f ae6cd46d 40c6
+h = 2ffddabb 16ca97fc
+
+k = 2dc0eca0 7971b287 dc6e58e6 5f887636
+m = ee2f42c7 92fcf902 f7fb8d27 08141292 2ba288d0 8b78c658 7ee2b5fb 9b2af1af
+    d0103931 84617157 b03a1b11 e24b3283 654a3f59 4d0a7546 f60a7503 a5fda554
+    8b3b48d1 6076927f cc3f7ba7 54f9f6c3 690572f2 d296d58c 405df8a1 7aeb2665
+    b9f33161 7ff57ae9 75c9deca 3be870f0 fd403e18 35a80b30 e4316e72 f89f104a
+    772ffd29 d937dd7b 043d2f2f f4930929 9b20f148 254cb696 70d8da23 f4371d4e
+    e87125a5 52d6395f 40400501 614f354b f60b8163 725f1ba3 c7966402 20a48f82
+    4b468026 60f02783 c3de81e8 e2fbe7fa 50ce171f 96c13f26 a21af16e d70cc127
+    aac4aff6 2c7eb862 db225685 f81bd5ae c260598f 8643816a 9a1f2c5d 570eadc8
+    9ed9aedb 842c3a27 02c0680d 05e9cbce 768d00b1 feb85812 a6744d7a fbf2384e
+    e86df8ab f4de0da7 5bfc02bb ce4f1eb9 11c883b5 695d03f8 a336bd02 93409b55
+    550fa44e 49c05812 a74c184b 8c6fb0b4 56b7e6c4 3e895dd1 7ab36b39 56878df0
+    b86f8c76 1c295efa b26507fc 1abb3e3c 3ea9d7f9 5d87dbe8 70e41dd3 bd0806d8
+    71d1cb18 ea873cda 295d3669 b51727bf 4e6f6da1 0642756d cdc2871a e2cb5639
+    bbed2b10 c667bd99 48110a1d bda7c19d 7fda6ff7 673fa5a0 7833f692 0a5bc936
+    787127ec 5a25a395 0f6372bf 05cab011 4a742529 9aed28d6 32329a62 32aee5e1
+    29390988 9c66848a 06f1673b f87474e2 fc828976 3aa6a966 30889194 2f5e4d96
+    a45ea390 292722f7 c3381b8f a2b6e1c9 c81bc4a4 36555fa8 b43d74de 250dd6a5
+    1b400a38 80a92b15 9494ce21 8c29ce94 6aa36d08 c1af17e4 bf9043e9 2b7109e6
+    b6599e29 012a6349 ea891294 3c1d3a50 3187f50d 2ba37992 8b08c28b ecc0b0e2
+    0ebb4dd8 266416bd 07e7b7e2 7815b9ea 6f481785 a15af573 08603605 5e3d8adf
+    402672ab eee4e3cb 4cfab631 2738f20f 87cdfb19 4908a569 617df67a bf71c95b
+    3b5173e9 79ce909c f1f8d588 c421d4e0 982000ef a31bca87 320a0e37 70369874
+    2f5a7df4 52746747 fab7e511 7f805e6f 2d8bb6a1 e399f86e 1ce4b911 ba090c3e
+    164e43f8 dffb4338 1ecff5cc 14879d90 db426c77 7108699f ff1cc54a 5dd94545
+    565aba0e c5d2662e 8b14c619 6a5bfd58 1b5701
+h = 62677c0b 0c146275
+
+k = a38c36fe 65d9ff19 f38b1c02 e1ff1b54
+m = eb815681 e992e66b 284feee4 df4fd2de fe3418b3 f3b25111 ae00b71c a9457a9f
+    79c2bd25 b20b641c e897f4b4 e28e18f0 30152550 307d37dd 5ac0f802 d5ca9c93
+    9557e46e 2cbe0443 86b4e7b1 0d794274 de6ffa73 1182e82a 0a282322 b22dabd9
+    547a3439 52d2d861 0beee84f 748352b4 6781e014 07ebc50c 58dc08de 9bfdd555
+    047e1efc e0160236 09c67046 863c2908 f139b250 8cc1af09 00a964d0 66e3a995
+    e000b38c f5fa4177 f13fa53d 3eb189ec 18f0a547 3a52eeb5 548e9d0f 58892693
+    3d43fa84 b8b9d490 5b59a45a d0d5b292 cd6cdb23 d94e5ee8 43c3ac5c 914b63d0
+    5a70f86f df00204f c7094fd4 be62e814 cc4e2450 0ae3aa01 617c9287 a020c648
+    b8eb4bd5 b192f35a f65ca794 52e0406d a3ec7d82 1829be99 bff91654 83634e93
+    b73a0ef4 eb32ac34 288f90ca 638a02dd cac37d3e fd49938e f5887afc abcaf6ef
+    ce9116e2 8909ad35 11246def ff46b10e e03642e4 52e04d9d e9201117 8e4e0b16
+    ba8d4faa e0204cab a4d66851 0201f607 fdc655e4 d54c0466 40b1a5cd f9d743ed
+    8a7c6272 5b73b89d 503d0c85 9d1298b1 f6301db8 9b5c597f 78270256 1a5fa18d
+    b2fe21db b9807623 b6212928 680cc994 003f97a7 4e012e4e 6447f8cb 56b4d17e
+    4658e158 aff8e7c5 13b63354 91059a3f 9eaa6c88 430aa30d 1a112b19 9a7350a9
+    fdb1b6b4 a0155205 4eca9ff5 ab4b2832 e02f7c21 8a6b56c0 84fdc769 9a660c9f
+    1435e1ab 749815f1 cd320fde 5ac2b6b1 e999e00b 6af00d63 2c390160 fc7c73bb
+    b9f219fa 5fe1ab72 028fd052 99292008 6997b681 c3351363 8b1b893e b75a22d1
+    e9f719dc d516e0aa 356bd486 72b00d85 828a42d6 93e51cff 8e33b1d5 c303c0cc
+    a4578872 aaa48f6b 31e7066e 93f4dc43 c7670acf 46f1f570 68eeb0fd 13462454
+    b3a94d09 a57b28ed 9825680d d4f4763f 84bbb4a4 ece5c282 96dd570d 8b05a2d6
+    e8038dc4 8d884bb8 47a3284b 236e1bd9 459b40b5 340a13d9 7d719451 b20b7288
+    632c3d7c e2607d96 b4960269 51251830 e42f5564 b6241570 ac222b76 2c8ab018
+    cdfcf091 e8bdd814 e3ff5689 b361bc08 7cf7ccf6 07de3388 065a8390 5c3874fe
+    57601474 01a9c638 ae9bd075 7f82e973 a1fc8b86
+h = 094433d8 88b7c8ae
+
+k = 55ab857e 6cd340df 5db7131f f21769ae
+m = e65fd750 55201271 5f52fc84 c0dcbe09 81bce1d7 b6f77d4e 303c30a6 4e296cda
+    c9088fee f4e59e4b e01ec954 ce64731e 4834f915 a92d67e3 41fd8da2 024c21b6
+    98788ac5 7a0f1e8a b34402e4 02d43cf5 5ce49494 20c8e26b a51219c7 02ca8268
+    1ce0dfc5 e7e6b1ee 2fff8880 30ac2530 f9ac8bd9 2618ad9a 06368b9d d55019c9
+    1fbf5ba9 d3054297 991742b3 a5a7d0d0 63002aeb de378cc8 af6ec387 1cc4c830
+    35d1b8b1 22205759 97f3b084 4d8ac1fa c0b0a9c8 4b00f526 8cac5c55 0c185238
+    f63408eb 2a836499 32d12f01 ea48e6b0 f1dd9143 4754a6ef 40741832 ab7e3c6b
+    cf71e242 8b2b3606 5b536b99 8e2e6fb8 0559545b e67cf400 c5d73a67 fff3acc9
+    ebe46cc3 3a24e46a ad67ffc6 739fed2a a6d78806 740707fe 1af125ab fc51f5c2
+    350eda49 a204ce1f 1bbfadd8 55611a4c 19aedcfc 2347447e 9ea87949 9e535b9e
+    3207d9bc e3ccb62d 0ad02c08 f22f02ed 8e1f39f8 65579491 fd841a9a 4ac14b45
+    7d8064c0 1b83df11 934762a1 a405230e 43b764c9 92340df8 f9859789 905c388e
+    feaa69ac f442c5bf d738bfed 9dfe606f eb81fb52 ea148fe5 7b09cd1d e3a4f839
+    4e9fba0f ddbac7e9 ac30fb3e 42124fca 8687ebac c2a06c44 ca163140 1f2d9ca8
+    8f294e73 18e97489 d9c79ba3 42a2eab7 129158e4 52e72752 9d3c1db9 01a539d2
+    1d88260f ad0dda6e 4cf09ae9 5d553388 18b995ab 8ed37c08 11eff643 251aa15e
+    a9e651e9 9851be4a c16401bf f623de7a 84aa705d 2731700b 85e92674 d5852e47
+    8c6bcf9a d2fbb3de 53c0e26a 108fbb8c 5b93c71a c2748648 d6a9bce2 15132049
+    56a8bec2 a001e630 7e15f6e4 4b16c021 2b19d6c3 6f9ec886 f039f063 2de0116d
+    30aab17f df8eac01 6f45c34c 7faef71d 55d870e1 e5b40298 781a91b2 cd762b97
+    c902421e b2c92d2e 01c9b9a2 d00905dd 44a96c65 df82a174 bc2b1947 e6f285e2
+    5f856418 530b0bd5 738452d0 e97cc44c 430ea62b ba2588fb af777745 9899c622
+    09bf3edb 726bc858 f35bb833 ad9b2b20 7c408689 e9d158ce b7b21755 3038efd7
+    8391b5d8 f8ac41dc c3207340 fc26ca2f b75b798d 25f3bea1 484fa953 506f9df2
+    70c263b3 0c5ce82c aa7c0650 4901d5b0 031cea08 43
+h = 9d5f4a4d 4f72aa2a
+
+k = 35995e57 c956556d 704db52f 3de7d2d3
+m = 55163541 8a0fca92 a938d16a 44e713bd 589629d2 5d0e96ba 355eef40 9fa08bd7
+    89b334a5 ee9477f4 16df3f5f 3d7db86e e4961cba 979fc460 7aca0df9 af3e119f
+    8704c138 944f1b0c ec1d1c0f 6bf3f367 fc6e707d 7205ed19 bbf1033e cf596462
+    5dd3e928 f5548bfd 98b2fe9a b631a858 79fc84ac 9f117096 064b77da 161fc618
+    976de292 97ffbf38 86ce7c06 f04d48c0 8f9419c9 581bb4d5 87b19f0d f23dc319
+    a470fe80 ab579b31 f1629550 604836e0 636b7a3b bab7e9bb 20d5f317 c8b9633b
+    3c8b6ba5 48287348 f1736eb5 78db920b b7896d39 2aa16573 07027402 f74d38e5
+    e1c37fe5 a66a1fd3 cd0d951f 5e5de905 30906ad3 f4cdd1c3 07eb2a93 63886044
+    79678888 29e91251 da538947 e6bb950a 7bfd6900 a30b3571 852b7e9f 784b8c19
+    d08f9acd 5eb07244 fd99716c 03d3305f 9b7e6cd8 4e0f82be b0af62bf a03bbef1
+    c176d3e5 80a91970 0d0e9b43 af5aa867 ed2c87f5 218e2c05 582b7a38 9fba987b
+    bd24023f 118c3fc1 afc99b50 660932f9 6c1c123b c1eb305d 611e8a53 ba6bfae4
+    62e1342e 1d7f7664 21b999c2 7032e17b 31bf6552 ebc9546a e9b86dfd aff30648
+    f70af9b0 fa9dd6bb 3d461fbb 5cac6bf7 12eeb757 d6cba7dd 42d764af 867e7f81
+    b75da129 3c071fc1 1e51b622 8aa75a8d 1862fe6e b19becc1 7627407a bc3de252
+    bfd6a835 082949fb 98ec60fa 903ca165 73c10217 749ccdef cf29900a b78572bf
+    f07c1f75 ba18007e b9fe02d8 07809400 69860c0d ae0556f7 cf4d9060 4db4f7f8
+    bf0ca702 2862790f 17d3d07e 06da586f 88cd7ed6 4015a536 19bb0e30 1450eb6b
+    2609dcdc 42b8dad4 fbe0f279 126e9890 f8a94c83 d30a931f 8bfe80dc 44f53cd2
+    1c028e7e f9fa3cac b6a3d06e 2f3b9d7b 9b67f545 10fe305f 6f6b9695 6001dd35
+    effce2e4 f34df124 b4b63ffb e187af49 cf9f393e 50b4b49f 77b3e453 e8f12dd9
+    23068cd6 21510234 e7510590 bedbd3a0 54cbdf95 cc949a24 27e2b90f 054919b5
+    11c0d584 2c46b9bc 8698b149 44173e4e 7e1cfc42 0d617b23 e4ec35eb 2a49e1e5
+    d3e3e788 0a2fa87f faad2afd bc29d58e 1b7202e2 e0a82167 5c415b28 46679c0d
+    0d0d42cb b9f12047 207d071f 4bc70d8f 3230effb 5fd6
+h = 2095f64e 706ce791
+
+k = a0a5750f 1b4563b5 a289ca50 c10ffdb5
+m = c4c06e59 09369e59 14ecb51d 83477090 3d574abc 0a5bac88 1ff94dca c21f7b78
+    b16360e2 a2374b10 c54090f0 0349a1ae 82e5ed77 aaa6488e 1c30e89b 2e2716d5
+    0f2149c7 b9bada1b f379da50 65e2a676 3412893e 430bd83e 468c4672 d90f3dd4
+    653f1230 ddb0e6db 9c053e0c 60860762 2f3f9b55 76f879b4 ddb17e6a e40efd8b
+    34df72c8 4538c1b8 198a64fa ea7de1f5 82261e70 b3c80ba8 bf04104f 518bad08
+    7e5ddd21 13136f4e 723eaa53 6a303282 e58ccb4f 419c8f4b ba0f748e 46be40db
+    be60400b 0346d5ef 0ef0641d 50d11c73 742139f9 8b2cd79a 26071132 73e61857
+    da3b1f3c d77fcf29 8b1a76d1 b0ab545a cc6bccc9 dfb10fb4 22dcf2c3 6cafc164
+    58a20fd0 c6d5e319 6f23f73e 9db059b3 d68dcfe3 f5243fff 5227cd58 6bed106e
+    c7ffa98f dda81060 0d455723 674a2de2 7604542c 62f7fead 90c20505 c67fc478
+    52a6739b f5c85db1 02dadadf 2d625830 2f563ccf be52f666 3c5859e5 600e0a97
+    676cb5bc 34db5d35 f0ba216c 4a330803 f7b849d3 b368b5ea 771437d8 9b260e3b
+    63a55df6 7d609e32 870a65aa dde15d55 5240fd7d 26e3ebf6 981046a8 ffde45d4
+    8508431f fe4ba619 1301f43f ecc12be3 3bde459a 212ffc7e 0ae4cb70 c5e79d16
+    9f614efd 90bf5e3e 8358be58 f13c0657 0c8e6358 3f099d99 f694759b 56260f7e
+    c37f21b1 11acda4f 6a0cc620 604a5d08 18f8875e 5c238861 756c9e1c d631f803
+    28768305 00ab7164 bbcc1b30 11a851d4 14442a7c 6014e342 ae9be87f 630f6a1e
+    5169e130 3bfccee9 48e54117 c61866a5 cf2750b7 cc137d20 2c0f3190 f704ef2f
+    f36806c0 223dc46b 3b88a079 98b626fc b416c92a 940a5559 6732fad4 afe16130
+    0e58189e 97a4ac75 69bc3e04 247a4b4c 511b286b 0106e8b4 01030034 afa88a38
+    826db375 9e1f1ebd aa9a7c2a 6076626c b49f9c2b 5dbf6496 729fa0d7 55a78028
+    228e9d56 fe705d59 85d64345 fb31ef4d e38d81b1 9f79a41e 0f57895f 3c538bd4
+    4825ae6b e7a8cdf7 e571f670 c258d75d 50a57110 e97155c6 6a3b6ebf 13d607ee
+    1f296f14 cdc03ea3 69a0f70c 11026204 ba26f891 38f9f831 a2e72203 3a0220a0
+    c1001b97 98429678 6753c788 c4647617 65a61d5b 3d3edd
+h = 0833579a aa8451e7
+
+k = 674362c4 c7060965 abf21fb2 6730f94f
+m = f9fdc84a 0d14419d aaadd044 91b04c20 bccfd018 c1cc8f89 513ecc11 cbe9f56a
+    ae22bb07 d60f6076 19b1c5f5 c846ffc3 b8f19ea2 e64bf16f b5104426 f21b5350
+    7b9f6182 a876daf0 79ac3ff5 7ceaafe8 d3d68deb 83e798ff 5e9abdd3 d8f1c1bf
+    e5d44266 d5f3acde 313add01 982c1d89 61b46fab 66ef0219 e02505e7 1621561b
+    3b7f923e bc1b017c 8c60d699 d38b11f9 8be33f31 67d60397 09375352 8a0b572b
+    5c099279 6f5213aa 4b85a97a 140d87aa 565486ee d95a158e 5933fa7a ac36391f
+    cf8078fb 17d6c2bd 5515aaf2 266fb7b7 c3bb005b b9b2233a ad4b9b99 a38ac5bc
+    3c7d3008 39be17b2 b732d9d0 222e0ea7 ecba3e4a 350b7bd6 e4d99330 45c7aa2a
+    2a78c168 88227e22 8e08d0e1 187390e6 b6d9dff0 9851fe8b e13ee629 ee7b60e3
+    063aad23 46b462cb c3eb2436 c09437b6 88115d20 83460a40 34c30f65 aaa31cfb
+    f5a7b733 cce8c96c d25e7566 fd2edee9 531a1078 02cb760a cb5a7a8c 1909a6ba
+    d177b40e 4245ee84 b005bd39 780a1c9a c3b30cd3 48a7a065 179fa9db 007bae42
+    86be90ad 96dc617f bdaf5452 8e921a5c e064f12f 3717735e 4f4fc065 e73ab1b9
+    31fdb498 bb6d43f0 07edd812 6fb5fc0f 50fa4291 e1fa1238 7910c3ba 8861d02d
+    00a49fde 7af53684 b75cea81 e164e767 255ba46f a5b178a7 46d15448 0f68fe0a
+    1b53dac3 c3bd3255 4c1e8c54 35c8666c 9346a731 a714226c 0d3b4c29 34e4570b
+    3c7e59ba 771b105a 6bda6e12 c6ac1b82 5988fd5e b136a172 3fe5e135 b0079d88
+    f34e12a5 a6c6bcc5 c72bea26 40dd2d22 a922f4ce 6b67ec74 b974bb7e 8ee01f69
+    3caa4782 912ce561 d552820d 1c5f0852 6510df24 baaa8677 ebb43e5c 781ee094
+    4e25c147 53059205 f140550c f96e0424 ac9b3e52 233e8329 7bace2ef ec4d6a75
+    3b7b8142 976af377 923e5ad3 f215fbda 2d24bb77 91f89f86 0125c2bc 599b982c
+    7d63d1d5 c35ea0b7 cb4ec21a 364b8110 44f32624 e4de91bd 1c8039d8 99d088c2
+    82b38810 ca88a93b b94d5f70 4010e717 7b6e8220 5d99b2ff 177a8f8f 31c210ad
+    396cfa1f 0886253a 0ff39cd0 1adbaf00 2e0b3029 e7ddaef3 5245dd5c eca0e1cd
+    e75f71b6 1f284c59 3d7e8f75 9c5b1a04 9b590534 0cd87338
+h = 6609d7b6 a9388c69
+
+k = 29a20b91 2dd7e561 6d4147b5 61e13a51
+m = b10e0169 7ecb718a 58c2dc1e eefa8d10 e4c3c332 1cde9869 6c29397d 3dbf8e9d
+    fedba463 7a2e5bb9 129d7365 8b64859b 17aa0a63 b8528406 d3e32dc3 76300296
+    58f98373 b31718b9 cbbcb8e4 f59341a7 bfe60539 eda5fbaa b0b529df 38cf45f4
+    3a91329a 8f398de0 31d000c3 aee46295 800da04b 7d5265ae d27b78d3 96c8db82
+    8a9698f9 32697ea4 6a68bb91 71e7fb12 e102a9f6 e384452a 275d6c9b 9fe9ff0c
+    9ffd7440 7c02dcd1 b0910e5e 6b3d17d0 8fb1531e dce29361 0370566e 10409843
+    33b2d47b 60834c8a 8518fb40 a65c3695 1fe98e7e eb7935be 06425ffa d84bab13
+    2f30aa6e 0d651f2d a17544d9 d1acddfd 650d4ad8 8c431580 2af594a1 3697d5b4
+    e9d87183 2c313c1d d90d15ab 736bce85 f095909e 935366b5 cc158088 72c53b6d
+    d3f94f54 b6cb99fb a4b9ae63 4389e81a 30cac1f0 f37590cc 599a6a89 308334a3
+    69be0d1a f38e687e 98db6fc9 6520d9d6 c61689fb 7641ce1a 83d5a28f a7aa579d
+    f3f2ef8f 07076b09 ee52ae9b 40efb7be 19f3aec5 45e089f8 cd2a7003 da87abcf
+    9eabb9ad 5109261b 8087ea09 c113753a 847545a7 59279298 6bd0dd65 2604b808
+    c41d6dfe 77e3459b 9fff8e87 9a0ffe99 3a79583b 35757019 a6c47d41 7075bfbf
+    b0a2ca6c c0d2d726 7baef9f0 3679c693 56527a95 d218d1fd acc0d7b2 31465a73
+    0764c328 8125726e 816141da cc4f4d5b 5fe4a59c 5f9ed6b7 56f2e698 921af926
+    fa5fcb1c 671bd831 9f4ec9d0 52ef3f1b ff6fd842 2036e512 14d40822 9952a889
+    e58af9b6 b4879d0d 7bc0e004 e023fed8 d28077dd e07365e8 a1780eae c0f472de
+    f2f0a751 38c235a0 2f0718bb ea3466c4 a14e4739 a220fbfd 41362e85 c4117354
+    f89ca271 01c4fa3f 097e0bd2 1346a373 a55bb377 fbe16227 f7b0df0a 0f9df0d7
+    bafe6b1f d4f85b82 c7ca7295 592e10d2 69d37489 a38dbfe3 593499e0 100f312f
+    eb0e4499 a31f92a3 e9f92219 0698d6f8 bbd69c18 6f622dd2 2b6dc93b 4bdd5f5f
+    73c2ff10 70b04bd8 0a6bcf0d 04fcf125 2c4a479a 6040bb47 1e7df27b ca53f600
+    85eb280f c944767c 2be66f0c ac8ba8ab ec035176 1ed623cb 38625503 082e86d2
+    72cef397 6f930978 e8445b15 4851c911 ffd40b30 576d7b60 57
+h = 3c975714 832f6c31
+
+k = 2de090b9 bc019ea7 7eecfe8b e93b7b10
+m = fe0a716b efa7074b fede9eb2 247d8de5 732362e6 beee0050 4d4f01e0 7903917e
+    0a519eff 73903199 fedbe407 5aea71bd 4a357250 bf77a31b 625fe606 6540bda1
+    79e2d69b a9212ee2 303145e0 8cec1ae3 40001dbd 1b3bda11 a0e55320 e7d0a6e8
+    7b5f0883 caad6ec7 aeaceb4c 898afd9f faa866ca d9f5f9d1 170f5547 16d9115e
+    c687832e af02c99e 8d24f1c4 94eececc 6900a522 af4526dd 010810d5 666a6779
+    313fa8b9 b45e7b2a cc93fbdc 8368990b 48ca2407 75f97335 de51082c 1528ec46
+    8eaa08b4 e16e89af 67ca9617 12f99369 181e7954 2e6e2afa a48d18f9 10767687
+    d7cc2c6f 936c2b8f efe43ba2 a0eb16bc 923585a0 90b22291 89ff5f8c e1759e16
+    fc7518d5 1a4111b0 f531ac42 101ff0ac da3d13b5 a4a1a031 377a25aa dde71dcf
+    1ead06db b7c19ed4 07c0b18c d821a980 4f346fda 349b1623 f65f6978 9aa58222
+    e6222197 1343d519 c4ef8897 2ee2ef57 ffe2e73d ab39e483 0d631462 1d89396a
+    c3c12d1a 86023ef2 4b363977 e0add95d e3aafa7e d4f57231 2b5249a3 dbd388f1
+    c6d4faf5 9b9234f4 1a49cb94 76999e08 db2f5855 4b44d9a1 827c7a70 1f18594e
+    1dd7aed0 2d626337 7ea7ca6b c4e01407 56c51ee6 d0d1eb8c 43b69b2e 95589539
+    777aa694 09bb383f 9f88ab2d 8cddcac2 636bc629 fd2d1ce3 84353086 d9e81066
+    9f9feb72 7017290c 74f8cb2e afed41a5 0790dbd4 862580f3 2e04dda0 6b1e92e3
+    cc4093e8 1ff3772f 3348274a 5c17c296 410c9a82 0de957a7 691db17a 15a68a1e
+    caf91951 dc1b7096 18b16138 9a15bc3a 6afabacf 4ede585c 7765844a b3a3f282
+    5a2d01f6 b0da5141 269998ce 9120dd92 50c33efd 7a3d426b 60089713 89a465df
+    56a91ed1 c453dfd8 43265352 8002d216 6b25f3d4 177df503 542e0820 d0c05b5e
+    ab45c3f6 db73c395 a1685c7a 747ebacb dbb83039 56573e18 2af74861 da4245b3
+    b0cbd9b8 d22215ec c4a3ee25 6baf3f93 e86b0454 ffc752d1 05c29f72 6695363c
+    06f903c0 24eea3a2 a38e83ed f1e7d3a2 6ccfd82d 0c7448af 76978bdc 9f1c672c
+    6c7fe26b 02ed9f3b 7d5ac2c3 ba9f030e 5926d03c 7e6f896c 5de7beb5 9a28b344
+    6a762f67 240df9e9 40aba3de 0b8dde85 d4be12d2 b5d8b147 a950
+h = ba886d4f 1a86d69b
+
+k = 9fea00e2 836bee68 10cd0c86 212fe942
+m = ccbdbae3 0fdecf0b a9ab9eae 717e6fa5 19d273f3 b1719c08 431c3f06 3cef4512
+    25427cbb 8e7350d1 098db299 49a458bf 5d4bc618 a8d93101 f89fe111 5a1f7dd4
+    f3590007 734eadce 2c0382f1 7b7112d5 a7d0f993 58eacad2 f005de49 c510d540
+    9f6dc164 825062c2 71a7a749 39511350 fbd3f851 478d116d 93ffb538 673bbae5
+    4c92cea2 78ebeed5 ef5f9800 7648e3c1 9a733131 18446ef8 6ece5b49 8705906b
+    ddece746 3bd6e45a d3a4bf50 11501851 eec7709c 84c84343 7da5c0d1 f1fa47e5
+    0f83e626 2e2c3600 4706092d 2b4fdec4 f5390c4b b788152c 3b00deb2 3c45418a
+    c53aee3e 402f3a1a 90a0ea52 6b1d0aec af26197e 698e2bfe 1fc27e3d 30abbdfa
+    ed802f86 fb170f2c 9d7f67ba e5e6ee02 7e4dc3ca 9825d1e2 440611c9 0cd7cf2f
+    c1e8bfe4 dc66d6b0 6f85ee1c bf907051 e764105b c47858e2 f6cc80a4 7c4bdebd
+    9d34f2c3 d487048d 1babfd69 8ef3d56a eb336cef fc346581 2a8f491c 71bce146
+    c66a8055 3790ff42 247b880f c8c38347 b05ec4b3 a236c90c 29205084 3b101acb
+    dad1c56c 2e26be3f f62d05fd 3e7d33ca 46694ed8 7f3044a6 b3e2cabb 9db56a19
+    406ce498 bf8f11f6 30d518ff e1f437c1 bc1f0f89 fc294fec 165e348b 2cd66f73
+    85c84f89 fb40c0d5 1c6513ce b7c83471 086d747d d2d9c079 df72a930 dd17b55d
+    3674094c 4968d6f4 00b98d84 5a629ad2 f1265bb9 1f5539b5 ef878a15 16903654
+    ac29ace2 e20e07af 9fc46d02 808597d0 31a58c05 22fffeb7 3e9e2354 00709715
+    1706c62b 50600498 df4241c8 cfcd860e 2a7241a9 a4984644 e1e0ab01 81fa62a5
+    b8825a78 bb105cfb e0ca310e dbf69323 26bcfcdb 82c14268 bd990316 fafca7a8
+    69de6ec9 83f0b333 c280aac3 d256865c 26282e66 743b7c00 145acf5e c1a982f8
+    cce3461f 8192a886 a7186e8c ab9112fe 96708e52 88b72a77 161f008d f404a2bc
+    32af987a ef1c06ca 792cd066 ab2128bc 986b2e63 1a07916c b63c5f34 7adb6209
+    fd6da3e3 78d0605d 0fa6ed99 df23ddb4 b862dd18 ccedf0f8 c1ccce69 248c02fb
+    299f4e31 88b751bc 67fea52f 4fe1fb42 a365fab4 214e3225 546410f3 5fac3949
+    90c11ccc 29bbe75c 055d0a5d a76ba353 3eded0f0 c3311888 2c1ed5
+h = f1167f89 162603b2
+
+k = bcac9468 d827629e 0ab624b9 8efa53f2
+m = 6bb7fc80 2f43f239 874571bb 17086512 d61669c2 8f69bbc9 41d2ffba 6fec6a9e
+    aafba544 e07cb5fb e6a41ad5 c2935629 1ee42885 151f98f9 0ab86211 b62a207a
+    7885f9fa 3ebfaee4 c5c906f5 7e525636 b5fe83c9 2705ad7c b660de8a 04395544
+    a7722a4b 71bc0059 fa6555ef bb976b32 0313b3e8 15f3d2da 572aee95 ff267fb4
+    93130f4f 42e66659 55ae78fe 04bfc493 badf3efe 644c622b c33a456b 8f866303
+    fa200032 f1b9d0c3 c85218b6 f453c491 328b617d 53a8214c c701e0e2 4b896aed
+    398a06ac 6240f0ba dc617831 60d34301 bc6e81bd 1f2de4ed b3204479 42c8cf28
+    2db0887f 5bc116e8 0f5c1ba9 34b8a4a5 fb86a13a 8f68a124 f800d056 502c6662
+    18c52c0f 978d24a4 9572bb56 6ebbe301 0851fb13 2631b2f8 fddd2252 fe2c1d13
+    57f9f0a1 58c16610 05a97c4b 1788acbb 0bce0e75 fcaab3a4 abade288 91ab4d8d
+    ac127bb2 fb2a2a33 88984e4c f093c995 067d206a 628bf005 1ec83c86 6434ae2f
+    db03d235 f561710e d9c3cb6e 041e2e9f ec6d1615 fe627ebb de4853eb aa6c0e4e
+    49690293 47af9a17 fafdcb64 ebb5e032 ba35c02b 8f17e8de af3f3625 f57a685f
+    450a9bfe 502c3c0a ac76bfcf 7aa8a6f6 a0712f45 5f4ae8dc 20c2a666 f223770c
+    61c54322 d475e194 420b4749 453c4d23 a883ec66 c4f9d6eb e9731ecd 81f72c83
+    2bc916b9 11f04ba9 05dfa011 9c84c7ba 1162b4d2 45df3f74 463d6ac5 71d32ea5
+    4f9c01d3 fa34d5f1 24246ef7 fffc698b 6a9b3083 b2012a6f 3af5fcdb 8bd08aef
+    3872a856 a710e941 5347166b 471e7ca2 2ed64719 ba680c13 b66dc5a7 71931fd7
+    6daeabe8 d9856c62 18c1d68d 1d210559 241a4719 c304656f 7b51cecb 2bf8dce5
+    a618146a 1687077d a4e5a09b b692cbc5 25cea4e2 8ecf6017 1b947d50 1ee1b8f3
+    87a824a2 2435dac8 955b41c2 2b899840 396e67d2 91c2aedf c65d755a 3f1b40a2
+    d2543cbd e0d9cb44 8d61b199 18de97dd 5a5c58d5 74c6e6a9 111aa6d5 b2ae6bf2
+    770b8ac3 bbcede47 24b46b59 59f852cc ba2ebc04 74afc818 c8df1f16 63ee9b13
+    308b59d4 7d219a55 dedb3410 92b399ef 1e1299f1 883dd420 70e5ee8e a5208e43
+    f8233b24 a4a71422 810d1899 21462fad e1c13875 52271b22 19224ac4
+h = 25090411 3fcaba34
+
+k = 046a55e6 fa58dd13 ad77cd76 77aae73b
+m = fb2bb9b7 201dbadf d4e088ce 111c94e0 4753fa2b 2f32eb0e 633cfcbb d3f1abcf
+    b30d63b1 d2831ca1 b6334493 141ff012 be62a982 b9c7964d 6878292a 0e95f847
+    50103ef5 cb5ba1ae 0c473348 d7e2243f f70dba40 d6ea4e47 b581e653 ff68c105
+    b848c6a4 8335e248 e68a39d9 e67f56ff a2da8496 bb637169 1c8e29eb 0a1f4d35
+    a2839855 1d52b22d 9529d266 a5c71dcd 5d957035 6fabaef6 663484c4 fc34eec2
+    23d6a2cd 3139e877 f8009c2d 6f3291ae 079053b7 c2dad193 3d8545e7 c477e62c
+    06bdcef2 16fd3281 17349dc6 4c726c40 48f687ba 0e56b7e3 0ee9af68 27a49b59
+    17940517 8ef0ff49 c8cb26cc c0520c5f af187363 3883fc57 c5b0d807 4296e170
+    53ab1534 f2079cfc d440b30c d7632597 63ed1047 0fa775a6 a7f670c2 5ed7c73c
+    be5a2f20 f26e3c70 d320a9d1 01c90ed5 472cac95 3b9d7651 2d3d3a4d 43fc65d2
+    e9fba068 dca93437 ab2eeaa7 d6acbed2 5774cc6b 9e77f69e 3d601e6c 1ed00c3b
+    9698c09b 20daf965 e2f28787 23f93fb2 6728d9c3 1a18b98f 891a333c 75241244
+    0860be7a 1accdf84 531fb0fa 11607d8a 6f983e0d 7ef63c45 60ae007e 7598e471
+    793ad0be 5a926ce0 ef5f964d 71a0f001 86091ed1 03f3e9ca c005a7f7 1c9cdc6c
+    230d35cb 69a0f7a4 11d61b06 23d9423b f7bdfb7c a99f1b92 ee82f700 3e0f3936
+    c8390f5b 7faf4717 20cec3da 0c1f0670 045ac433 818bf8d3 c8546dbc eecaa803
+    450ea900 becaaef4 0fd5e784 7cd60a1f 32b05132 ecefc241 6393d4e7 e6ede701
+    c5a02c90 258aba6d 197f2af8 6b9ca83a 3fc1a8af 543be3ea ae689122 c07c10b6
+    58035aae 9a7b72cb 9bb11807 d8156c60 f0c939ad e0b7ab63 324de15c fc17ecc7
+    76912cee 750519e3 8e874833 0e9b5f81 543ba554 14add25d 2772e266 95922ccd
+    0873bff7 e4496141 54c491be 44a7a3a9 f64fbd13 6da5549c 2b961c4d 50284f13
+    37eda2bf fb539f6f d4475f78 e0774037 91877a35 00fcb62a a7af6e17 e0764b05
+    6c5fd68a 7a603b2f d69c751b 98371d22 24ded7f1 6625644f 25551a80 789cbaa9
+    0dc2d4a4 5ec9e21c e6e5258f cab7e2ff 00af816c b4c9d780 aa8ebf3c 3e25ce3f
+    f1963a34 f056a383 73b33d18 ac45a0a1 e936bb80 b3edaa9f 822d453a 8a
+h = 4b0660e3 7a16e743
+
+k = bdf241a4 97523edd 292445cf 8a4354b3
+m = 09e24029 0b7c2817 e71792a1 2329452c c45224c8 c68ad322 2a438ef1 c4a8b450
+    0724f083 bb2c2276 39d727a4 786e338d fbbdeb83 1428cacc 1de1e279 986a540b
+    13563063 bd9d19f7 19cca507 dc6eeb66 4a6dc7cf b5a53509 5629250e 795736b3
+    90801233 f5caddc1 c0a5abdd 94b0ba3b a39ef0bd 80601759 d34552c7 7efb1f35
+    0977e3e0 240138b9 7501c77e 166416ad b7f6723c d6b3cfe2 915f20ed dd8f576d
+    d85753c2 cea3846e a4272041 6ee14cea 8dfaebbf 0539f124 f5224a6a 48247f90
+    7733e88d 1b07b13f bf3bea43 e52a64c5 a10e5880 17c22abd 4b6e949c 662fb69f
+    20db2854 72154d79 6f464439 5fde62ca 7a2499cd 0645756e 8c40c4ab a1b4f7a3
+    f3ed2be2 4e071e69 89a851ca cc524090 3cdcaf98 1991e11b a10420cb de360dbd
+    0e408ca7 aeb3b46f d804038c a2948fea 1fdb5010 f949fd47 26b6f85a f5c08975
+    8699d88d 11bb848d 805b65b8 54a1caf8 7233917f 8fb4bd6e e85dfe0a 881e5fee
+    34a43724 7a715755 c9a51f6a 1f5aac1c 5f2a6bed 39ac9fa6 75019ae9 6dbcb2cf
+    8626f44d 3b97074c 2ca12f12 f4e45bc2 e3d696d7 f23ce0e6 548e5e74 ecd45f06
+    df6a014b 7a479329 38901fb1 4a2f1568 a8cdda62 ab2fa5df 89506449 88c275f2
+    3fd8397e 971b749f b90edad9 8ecc3089 1c9b91cd 089cbacc fda57bba f948dc48
+    ce2b1a50 691a790a 303cd582 f000224e f8478323 9b887e66 d7f0a888 b74dfd69
+    8f458085 f25f56f9 2d60635e 65ed45ba bfa448a4 6a175d62 3d28b80d d5467352
+    db191364 31581563 6a22e33b de149a45 69873ee5 1a95816a cd19d2ed 5b7e56c0
+    8a90c011 f24e10c9 27721612 6f3aa284 259d4e47 3fbeba99 e251095f 5ce9bb84
+    563863ff 73e974f0 daae054c 685bbf6e 11a17c52 0d996656 ad0b3275 d4e8a209
+    ea6cbd6a 1c477371 675d19de a9544529 1a409139 0155f92a 18072366 c4a8118f
+    99534a49 b9901f10 53337601 90324371 80b60f47 b4266af8 76ebb37d 0a54ba83
+    3bdf41af 8e973fce fd681d3b 7dd0709f e3da0a2d bc857288 93324596 b17caddf
+    23c56034 7bb38009 76bf7827 3f96d1f4 17169c43 79431555 a7cada87 ed5e24ac
+    2e14dd66 f6ed6685 d93aa03d 5b1613bd 1e7f93e9 34111a64 f053e884 d9af
+h = c2af1a35 cb590952
+
+k = 93bbbc68 2eed6872 460f190a 60dc8480
+m = 25be4ffe 27886690 c76171ae 5b8a9dd1 28028244 3267aaa6 821e6017 1d5de70d
+    dc8f6ca0 10da4a50 47983e32 962581d8 eb69c959 fc115ea0 5aa96dbf 84c2ab4d
+    7cd73fdb 49ee0068 f2530333 528152e7 0acf4771 a084fba5 935e5b2c b3724409
+    328b7ea5 10efb2fb 1e5e303a 66ac89fd 2911c1b9 6dae6a16 75cd1d3f f80f09f7
+    df73567b da2d233b b80970ff 9a6bee93 d1658476 453d6fc1 0d0b1a3d 79c051af
+    df9dcb0d bbad9fe4 eaa0ed59 ae8c3352 87d57d70 79a8bcf7 9f4cbb5e f008c22f
+    7f0bd548 1003a458 6de7bb87 fdebccbe 1a5f70a5 0f596f0b 4d73d5cd 6c35acb7
+    26d44d82 ecb7f4dd fdd6155f 68a284e5 7fb72c35 334bfc6d 52bccc62 97b7fdf5
+    a61830fa 04433b90 f51d0ded ee328eaf 5df75dcf 23cb8da3 daff7953 90d8347f
+    7afa4fef 71e87d2e 0d1b76cb 4ba6945e 92c64d47 3e3b44ba b28f9b50 591fe13b
+    8f8acccc 781fd3d1 af9b4ae9 abd18143 e56567b7 b5c66bcc db25b874 d71ab8c6
+    32ed1748 89b4567d 07b8ed41 0858939b c8477668 84de9edc 2eca0779 9e12d35b
+    adf24bf0 82141e14 4e78c3bc 9453b2e6 699977f8 edf50ec2 74eebcfb 30453902
+    55801cda cfe9e5be dbd5adce ed702e2a 521c19a4 3fa9f20c 83094fbe 9a5782d4
+    018217d8 b01b6e53 c28042a3 2669d964 18477798 818b2c10 a210400d 2f2c366e
+    deb106f6 73272a5f 74023da8 44b45e33 6f717ccd e453199f 00bf1f1d e65e4d9e
+    35c3d086 89afc1e2 45e1d442 9bb1c1d6 f8ec5762 beced624 44a7a843 267ba28d
+    ef8cf1bd bfef5d9b 82208d14 5aebebd3 2a9f27ef 5b16c0df bb6660af 02a040f5
+    85f9e88b b6a7de03 5f279b30 f5c73a20 d28cc17a bb3f340b 19f6d5df 6e41322d
+    bcfe0af9 67abba74 3d1f6685 9d780284 c3781df4 ceebd035 0f52becb 2843615b
+    cdaaf9d1 27d8d486 ec2bc26e 0ef5fad3 c521157e add8fc38 9be1cced d9d999b1
+    45be915a a846c3e9 469b7333 5399f746 7e46833e 604aff06 4973f38f 021a8008
+    831bfad3 935fbedf 20e51692 903c64cd 5d55d1cc 696132c7 08324478 973fdddb
+    34bc39e5 0e07dd50 7dcde5c7 d5f87937 d62574d3 041fa7cf d0ea32ac 5db1f7de
+    75fbcc2c cf1f257a b29278cb 54f54910 faa97118 2a400ff6 7e0d31fe 0e8150
+h = 694c7073 1675920a
+
+k = e06e1b06 2e21086a 7562c678 f8188da6
+m = 58d3e2d6 d8f34c5a 6d008813 115ea7bd 668afbb8 879be14d da5556e1 30164b14
+    b17bc4a2 1aafbce1 15081623 08e4168e 55ab4eb6 45754fbc 8513da76 bb725ecd
+    6e9857af 9fe9bdd8 a77aea6a 66ab48e2 c4aa8973 d799d09d c544bbc7 34c00b67
+    1e67b9cf 52cdfd04 7e3f9425 6df6af06 de842408 47754509 3269e7d4 6a7bea3d
+    becc17eb f309d381 bd6c2808 1cc408b7 ccdd65de 385d84bd fc6c3dcf 03357da7
+    fc6f74e8 ddf4b9e1 7ee18bd7 2b6a6509 5c8570ad 6b6eb377 19ac1337 93e91999
+    c0ef8a60 524ede37 799500b3 8af86067 d84ad963 bb033254 fce5f96f 57c0fdb4
+    375276da 34f3d70e 391a542f 3ab464ee 05c030dd 6684a9df 2c0a5630 d27c9092
+    23fda75d 45e847bd dd8d93a5 b86cb316 f97bda88 84a5f34d 1cfd9743 7318f341
+    1de75b56 64378632 e06642c9 39eae258 04ccd589 d8a0f7f1 b830ab8c 8739a0c8
+    2312894c 1cb2b0a8 75dc3fd5 c08a93eb 5c842c2a 68132fe5 c151b04e 4764ab5b
+    ecaa0687 b42021a2 ea27d959 0052a9a8 f162a511 e1dbd17d 9b7275d5 0eb7d7b8
+    f2fc1b78 e6a5feab 04ba2369 46ff7f81 b644f4dd 1d0d7c06 af262b64 f0e7c15e
+    fc2ed7bc 023f1454 e8ee1c55 c59c23ba 082ce9ab 8bb7f760 1ff27132 84e6cfea
+    42ef6bcc dc5477c1 8e49d6df 5940d7df 503c86a2 eccd2cd9 6d373276 6bb99e63
+    056fe273 aef1ba63 32ebe88f cf87c024 934749ec e4cc02bc 1f30e22f 000806ba
+    74798ac4 1bc3d655 ad663424 77b5b69a ade6e13a a4fea1d5 a66b3736 edbfd639
+    02953be5 486d55ff 574e807a b2162590 b42f76af bb401655 2e57602a 2487fcc0
+    8ed3180b 23585d82 75066462 5304ee8d 62148eb0 66c23e30 b117c549 5bf7e915
+    afdb6d6d 02f07436 ed0c3d2c 877171d5 866bf74d 34d4fe8e 5b9461e7 5072e8fd
+    2f7fa262 c9d3352e 76d08f2a aa06c522 189ed1ae 166a57fa 404d3616 1974cebb
+    5884208d 130c2401 b0f5313c 42d86e84 accc330c 43a3ef68 71e87061 47ddbfec
+    b6b60de8 4a261f21 ee81afd6 a453879a 8f9b40b1 0e88606f 2c27cdda 052c507f
+    2e14f89d b1647030 f2957648 522c9777 07d2418e 2667bd76 a82aadca e585c40f
+    d042e3b8 99e0af23 3b05bb62 01879069 fc4639ee 0f5d50aa e94213c0 00202150
+h = e67a47a8 4ed8f5e2
+
+k = be478db7 8a40a2c6 ddaf46be e7623826
+m = a550f18a 1b5d3144 f88c4df0 a7160f2d ccb32e83 c7f65292 b6864a07 431a969b
+    d16f523b c2463d68 a369e271 34bfecf2 07af6418 c5d159a5 6efffb78 056f3a80
+    dbad9edc df912a49 1eeff935 708e3c83 00f5c684 c5a023ed 77ce307a 269c5fca
+    fd040af0 b7e9919a c0a0f4b9 adbbdeca a82af556 49d76294 7f43a7a6 b1ee99bf
+    4ac64157 b9b363c3 a094aeb6 e8a3aced df2663f7 bd7a6425 d2b7d5d6 1650cdc6
+    1e1d95d2 387e6dcc 10b1c7fc 8195e602 c1f801e0 1efcee98 056a36b7 9e87621a
+    8b4d3334 6da6703e 0f60c631 e9c2fc6a d7a2830d 87028980 45c4ca57 acb5469e
+    e69816d6 a25b7c6b 9f5a9369 0c15ea6e 874e0374 76cbf7c1 d3b22da8 3019ed57
+    cdea4c5d 5e0e050b 1b14e4b5 f26db4d0 a1c0cf13 88292861 fd017ae4 4c9723ec
+    01e4268a 85cf6167 2d18efec 5de064fa b6e7cf4a ed3fe7bc 3ad0b867 08cba968
+    8bda9bf1 892eb351 3de616e8 03b3040b 153c7a3a 36fd02f2 b63e17a2 dca32488
+    4f43347c 84c406bc 138f99bc 7872eedb 5d195a35 0f09c42a bf292027 1f55593b
+    5fd4dc7d d0c1b0ee 3f3d00fc e5e2db96 5fdf4d38 9509629b 86dfb849 3b5b9cce
+    b7a5b38b 2768f0f4 f4ae01d1 54ae809b 78ca15f1 11d0f8b1 6b4fff8e 70cab872
+    da679ecf a9f7ba24 91525b31 1885f454 14459ba9 40950718 a4207728 d17c17fc
+    9ee7f589 0198f7a9 b1e4e63d 4c42dbd2 39dde6e5 21d64839 ef5796d1 9fbf761d
+    89109e9b 837bb3d8 f6da1065 4550b000 8edaee03 02045032 74960eb7 8e530bed
+    9380334b 9ba02dc3 3edbbf37 7bd8e1c2 c6351bd2 ebf8d63e e3d54646 2c8d0367
+    99fc677a 5b34abba bb46b4a2 133a843d 731a5a37 87ba9b0f a83108aa 3e0b2cee
+    79ef0696 f5d9e4c0 22ee16ce 7a717a4f 13fe0f93 17c49e1c fd59b88d 28f6adc2
+    7be4e5d1 3b02e6ef 3b04295b fc3da51d 10136564 5cde4919 9122d215 19487c8e
+    67df4d68 ed383561 8b21e408 5e325cb8 9db51ab2 e1e547f0 add270a3 a8768549
+    1af8dc9c 8f719f0b 20675f67 8f14907f a5763101 f538ab23 1cea8063 710bcf26
+    1adc44e9 d6dcf4ad e27446cc 0fe8c737 be3df73c 4ba630e1 592c055e b4e0ce5a
+    cbcce90e 81c9bf6e ca834485 42a4aa5b 5e47dfb5 43286a00 4b906ae6 679be862
+    f2
+h = 9f0db8ef 09fdce92
+
+k = 54de06b1 2baf3111 af28823c f381f85a
+m = ffbf0c73 cd4239cd 51e42b58 1f8b8523 ad8833ec 5bee0291 48f8d374 3f2a4fc8
+    4be74380 6e36b094 2ca6b945 e7c86bf9 bbedb4d0 5c40fd82 b8c97767 4fbf81fc
+    6e91cb4e 8b6cde45 183eee48 52704f59 8050365c f0746ca3 b884a8b4 b74782f0
+    89005f5f b2a75340 a8125930 178bb965 fb4d1ed3 47cf50e7 0b0a2072 0638b1b2
+    531fc41c 32f4393b 4060ff95 e72cfa42 30bde686 fd4b046e e9e3ca78 9a9889e9
+    645641e0 7634839f a394f1fc 20c21c46 2f4c64fd 7a2468b2 2b67f9de 3f7ff774
+    bf69d249 894546c9 c716f941 4e8cdd6b 097ff833 0b29b89b 1e8d47ff b9284cb3
+    cb92f989 790c671d 473b6943 c9f0c04a 94cf8917 d036e5c3 646903e9 07a6c623
+    575d25da 87a9b986 8b7be893 df99d593 da198710 e27da301 72319f46 934d083b
+    64cac455 90b15d51 4c129c2f bd887add 230fe47a cf35cae9 070357bd 07936ec1
+    3f181a9c 50e7b371 e5e718f4 b1a6dee0 bd9abd13 93082be1 1557c940 76e65ccf
+    85efc74a 851902d5 3be5be2d b74ff62c 445866a1 8be585b3 d6be332f 42bcf78d
+    56b24cf2 a80ddf71 66e94029 b41f224f ee8525aa 8f9034d1 f53cd1f1 4f9b6aa8
+    dbdfdb8d 239bb6e0 e07c6e3f de80586b 8e65930a 4c5f71f6 dc080ea5 15d495f0
+    8267d0f8 96cd1016 f9e3d1dd cb43d3ca c6267746 ef9d9e5a ed623357 8f7cbae2
+    d3d21593 a1203691 5937436f 4b5d3932 b559932b e0867161 940e83f8 62a19132
+    75fc02af 70dcab40 77935b94 9942b5fe 235d6ed8 e39fb355 80cd7372 c26ab1f6
+    875f2fe8 49f740aa 8c85e421 71ae26ca 7655a2a0 c6e86622 33419ab7 8dca32db
+    c3ff6935 406fad59 61bdd833 32a0d1af a811259a 9f65c353 74cd15af fc29329a
+    fdc1340e 71cfa208 8dd6efe2 65b9fa95 a97720d7 30636784 745c17ad b8a3b975
+    c9b41a0e 783bd431 6cf7508a 4088e9c8 e38e6181 c032c19a 91f84053 bb329530
+    b128069a a6c90120 7a2cc64a 8b5f9ced f01c1127 30d3b2ac 41bc7990 23870d4b
+    6c0bb4e7 ceb88a72 e6588263 f2126925 bcab57d7 2dce03ae c026472e 38566a1d
+    4aa51638 fcb0a945 5793a312 5c13a30c d3853713 0386994e 2b437510 f5b03f6e
+    54ce0b1c fc88001d de13c6fc 062a69a5 a00ab54f dad8f940 73873b70 a7d045ce
+    1f02
+h = 39016691 4c4b35dc
+
+k = 6674a6f0 8217cb59 4764e404 9e903c5f
+m = 610c3d68 abd37f42 817c960d c20b13e4 76231625 603d579b ccb75067 16eb97e7
+    7815c317 4b9f47eb 12193fdc 2f7f6bdb f89ab96c ac8c2304 a4e337a0 dda54a0d
+    0d144412 7d7c49b8 a4ac3e4e 4c4f65c3 d22441e5 1b21239d 787672e0 fdc491d3
+    b55db7d0 8546765c dc44a3c0 797c78ad 14a18863 0ac6765d b791ee33 cda61d66
+    55f5a2a8 dad58625 346af479 56786c9a d7616fc9 ddea1c4e ff3962c4 fa0cc2b2
+    f2ed83c6 036c100f ae03715f fcf5ca1d 06398980 621795c8 91108445 4ffc3a83
+    265b9add 88959d78 e114e7e7 3572592a bf7f058c 5f6beb88 3bfed009 45a164e1
+    35ff1eef 08535d75 eed2c11e 4e436117 fb958d64 ab87d65d 1cdfd75b 3370e0c2
+    627049c5 aaeb9de6 61b5cd99 1a63d3d4 74102842 043d87ce 20d64757 244fb761
+    8ae90341 95f26f92 e8b0f9f5 92a057ae 4bc4fa6b b3cdca8c 49dca7ee 89449df3
+    d2d41f2d d1dce548 697a7de2 3fdf6c21 30861b1c f19dda6f 41b5fd33 bb491d21
+    3dfd38d9 d16d8151 7cf0e1b8 9cf94aa0 266b27d7 7c1e9700 443e7d07 ab451d77
+    34faf753 6a4bd7f3 93d0d074 d4f45d9e c4046d61 29b8ad84 96805c20 84e25cca
+    b05ccb1e eba80563 2dcf9caf 7734eaf5 42ef845b e79df111 c7b06f0a e79734dd
+    1cece917 65300a09 fe8d46bc 0c689a28 8221beda bb5c5456 12cbba29 bd04604d
+    c283c3e0 9c6eddbf 11c784b1 09990b6a 33acd71c 32c402ba f7627adf 0d0d68a9
+    acd7aad8 0688a9b0 d544c44f 573b033c 6c7b7b79 75323672 ebb15476 178e16a4
+    ba24fb29 6e381c62 f8d44f2a 3a78cdf5 07399c85 3d07c1e0 6891151e 3258eb5f
+    bec218be 23de0d0c c465d7a6 5488d7ae 91c0179b 4d049cb3 d599bf46 155e6be7
+    e4bdc82b 5eb19da7 ebea4a3a b21de900 8a07edd6 1868b258 7b15f616 b676159b
+    dc793304 e3f34806 3c597ad0 908c45e7 92264d4f 5f464f39 3f06b132 d6e8269d
+    83bd27ed ca1c4634 84a5dcd1 defeb9b3 2032cd79 6e459159 cf188ab8 e8846a2c
+    86133b50 2c343731 53a7c8f2 c9fbde33 5adaaae8 943c9fb0 919a8021 d4c3bcfd
+    5fcab7fd af43ac10 31f445a1 55a4e1c3 f13c7824 aaf0f85e 43543c3d 690036cb
+    2aa33129 af988a1c 64cf4c6d 8e520b12 be33bae6 a317c3c9 63424f12 54227236
+    6d02b2
+h = 2dbcefba 50f9cd6b
+
+k = c70e155e 4b6f7482 22c1eb7e 9c46c63c
+m = 45fe1ecf d55a84ae 68ffdc77 0c07b269 ada64fc1 1c037e10 ac28a593 07a0d5b3
+    6768ee7a a26fca64 ccba265a 9969e8e0 fbd7e1e3 e9f78f5e 87ca789f 9c5e31c9
+    81b47c8a da812884 66d75922 09bf29db acb778aa 7bcd2b21 7d93fe98 fd904358
+    597c970e 0f6b0f51 00c8412d 81099a1c 97dbe934 2192e552 6d30975a b4349b54
+    ddcecd79 4e9901d5 39530df4 f6355cd2 b44f3a6d 09aebbd8 cc99dc1b 299ee184
+    be99bd6c 0e50167f 7ed2df95 4855c113 15463446 f43db456 9c538412 bae9bffc
+    6273faa6 89816055 a0721803 27fc31f6 5ef58f60 637ef77d ee38753a 00361e51
+    9c9d9f23 e3267ed6 fa96785d abc37e1e 49ef9900 df55fbce cef77571 95012f17
+    0293e3c1 5140183f 33e0dd0e d8d4929d b8dc2236 6e872fff 91b1e926 0f01f48c
+    d0d489c1 b1b7ebe9 5be7c0a4 6afe15c3 229dc989 e6ed4dff 09bdeea6 81350961
+    6d6b0ba0 d0921cf7 349182b3 496b66ce 6e1c195f 2301d8cf d35b8897 0cb66784
+    b5f1bb99 943bab16 d31797a9 20ee1be4 02d0fd77 877602a9 2b3c26cc 36edeec5
+    5d18456e 61435733 c70df90a 0b8f04a9 a2716189 4ad873a7 3f385e3a 89954c7a
+    c5a62799 99cc5d15 b975b2d2 6becfe41 84476ead e4833617 457fcd00 b159f8de
+    e47c5666 a671b439 115d352a 804c1a09 7b4cd8a6 89567272 6f342be3 b653d651
+    49f4a886 4e2ecf35 8c5dbd43 e136f9bc 439edf93 a22341ea aabc813f 458ea7c5
+    55e6c9ff 11458630 e6bcc3fa 914dffbc e161d835 acc67220 c30d0d46 953bb06c
+    8b762dc3 45ddce65 709a28c0 79869b50 394e51d2 f168f89e 6f75a9da ac34d5a7
+    a28f2a68 c424c2d7 4962dc02 70544691 56b3e19b 86cf9358 e62ccd9a e76fd728
+    2aac1f30 97bf768a 4117ca7f 7943ec49 17fba765 fda28a84 95d0fe27 157112dc
+    591845d8 0581034e 71082b7e c7cde786 079660c5 62e58815 2dd95582 b7f14dd4
+    44c12719 4cba8e73 cd488b48 e40110cb b82d979d 30a79b45 7e3179fb cc5263b9
+    e1c93e1c 26fb2083 c2fc1b4d 56f31a47 d85ca8c8 be61c365 bab26122 3e2a1f63
+    e315085a 113712d4 a793d467 4234c041 1abb8f39 33596ec8 04ea8893 b49dd544
+    ae5a6285 08b279d3 b07448d2 ea7cf848 76f39bc1 74de67d1 eebf6b20 bbf2f092
+    cc6efc16
+h = d2b3a6a9 f0038abb
+
+k = 0410afa0 e2e141e6 eb516d6b 3f10d35b
+m = 8fc0c309 2924f0fb 05108358 f4e65460 aa1af596 9d9e124c df37778a 9e72e930
+    24e14580 ff0c7bcc 9f828a73 bc471b27 ea952564 76fe1c07 d6250f63 758fca0a
+    32ed5624 fcc0edd8 e5600213 8827dd66 d0f66c53 6f4e737e ff5ee30b bac94ead
+    34e6fef7 a67f80b7 908c0348 28a7be9b 61ffe2f9 dbbdd56c b277f9b3 e315390a
+    c5cd3a09 972e8ef6 f8326bad 25d467de 52178360 aa356a54 d3862346 a621c228
+    41b512bc 800ce86f edc1291e baf7b346 6239a9c9 f684ca5a c1bf0817 6107f130
+    959f1001 22df3543 6c8622bc c4f1fadc 8817d020 7c489514 5b30e6c6 a6de1382
+    afa4d741 6077f43a cbb02ed0 3e21bff1 72315f36 6af6687c 27fb7ece 6d7f0c94
+    f52405c0 56e74c61 99a54cd5 b30d24db 3d01d034 401de179 55804c49 fe07a6a0
+    7c7ddfc2 420c6e00 5ca3d0f6 356e962d 103998c1 e0d286c8 3f86f102 1a1f6619
+    72afd1d1 47b08c26 434f56c4 193b32ab 66b7e7b5 db5047a3 b763b9bd d410b5e4
+    262bd1d3 684c55a7 215b3ed8 8ca281bc 2c1405ed b18d2561 b671bf6b 51ac0613
+    dd3c5f96 798aa3c9 bcea95ee 175fd0c1 73fc8b18 3764decd 6ab255cd 6d807915
+    d0958ef5 a52c26cf b5304c16 14548e9f 3640dbbd 280d80da 85b4fcc6 6752d573
+    e0d3e29f 201b9cad b218df08 cbed9029 befcf79e 7caef249 29312f7d 7816bfb0
+    c33b894d 449631a6 ed5ef115 11596a24 94ebdcfb 3a35dc56 01f8ae4e c58a64c2
+    16618ee6 b864d660 705f2a13 2105b4ba 395de294 4fd5a612 495f98f4 80b28ab8
+    cdde2db9 2a91c972 b7e90d28 17087ea9 17dbe415 ebe3faf0 293a2ecc f555922c
+    6cc86ffc da4d6fc4 0a2c8fde 93200719 0fb8c3ab 574dda83 3093f148 dad79cdd
+    bbd50788 41a8b847 656328a5 2bc06507 3ed85ade f3e91aa5 ed478467 396b61ea
+    514f092e d813dd8b 9101ccea 42f6c015 1bfac6d5 99c34bab 9ddceef1 55324941
+    38c2d630 0b98303d 7df5098e ab90a699 61eba158 5c9592f5 8728922d 0a58684c
+    5244ee3e 0d4150ef df89a4de b3ded41d f465e749 65557d20 4719514e b5a0b2c7
+    1a87cd71 7415ebc8 eab09bc4 08e2833b 26591f3d 9d78477c 34310519 c8aac7f9
+    5cb11ede 4d596175 3857affb 498f6bad 32d1b9d5 b83f799a d82950db 1122cb0b
+    40005b95 a1
+h = 42ace428 ad8a6f5b
+
+k = ac84016c c2666ce7 bc84abe7 9e0d2c96
+m = b5851e18 6dee870f a081a91c e0439c30 f782edcc 6b8136b5 d91c9687 5737152b
+    7ef86834 51d85de7 5be124a0 ed3cf0eb d25939e6 83577892 3d3199a4 4e508681
+    f6dcf57e 97fc1839 36e66698 c10205f7 95df5f2e a604fdc7 b31a0ba7 23346821
+    3772b0a7 2c4e69aa 805c8a98 2e3072a0 e1f2698c e6cab75d ce0adef8 441a7ead
+    eafba1a9 2228e59c 3904bc1b d1366442 71241d5d 3e16fc0a b826ec14 991da61d
+    bb0557a0 f79e3fd2 9f37b1f2 bd385ce0 23e3c089 2540a8d0 ffd1c5be f3d68016
+    e961d081 f9f22146 03ae6e6e 0986397e 98552617 e3e48ee3 83cedd6f 118f035c
+    079f96a7 438cfd69 ac1c5d31 7337c241 1d0b7220 c4f8c2a8 576d75b8 50dad8fe
+    d7bcc16f a0493218 0c60ee71 4f77315e c2c221ae 36eab758 e5fdc411 2e6c835f
+    3e7569c5 1c6d7fc3 f65e39cd 86d80c00 a001e5c2 3343d04f 331ec581 2ac2e976
+    7a6be923 fe7c834b f37630d2 26b0262d 76fd825b 2f53c31b ce96d039 ab88ecea
+    b75c4f7f 7fd60b3a ccda96a4 4c7c9915 6528e1b7 343331a2 d0814d99 fb5b6f84
+    42cac475 e6211dc5 bbbe6db0 21cf9acd 41f03156 f1100346 391c783d d9094a09
+    679a06d0 b16edcc0 5119825f d65504da b53799b4 6a1709f2 8efc684b 564f2d56
+    0523c501 9e9edfa5 c738ac1a 51e2005d 33a913b4 13801a26 43e210c7 8079128a
+    5a7b0f95 b023743a 5ee8b157 ccf165b1 da33d717 5d0338cd cf107d51 b1508e5f
+    1cddd471 65616e5b 8a171174 e2cc1f08 12c370fa 2f863b1d f6b31820 96787101
+    4c507bc7 f62e2a08 caad4824 a49f4f3e 68c80e29 5bd2c732 19a02b95 161ce312
+    e6623e07 a6f9bc84 8ee9d92b 9cb57524 9a954cdf fe38bb35 6efc5825 371e776c
+    0ef02c36 ed892522 bd78af90 e0c8bf15 1e6be612 a807e414 c24a8f50 7ac8c851
+    9a980398 38bb2858 a76aebfb ae8be90f ab138714 7e0503b1 79c6e519 69743bac
+    07fc122a a34f2809 5f1a4801 0227bddd 1af3a238 f14bb759 50916677 a606b45e
+    401d9de3 eb44cb50 2bd78854 c12ef814 453fa58b 6a735c77 92c7fd63 4bba0e38
+    db54ae94 61ebdd6d e24a2d8a 0b29dcfa 2c927ab8 c2020fe1 bba1c3b7 5d825be1
+    f33dca78 f5566b35 ea8553d7 d00755d7 f7d95c02 d5eb5856 b8adda61 b602c887
+    19d07cf9 f869
+h = 6d777d4b 155633e4
+
+k = 864bb541 77067812 6fa15c9c f31ca178
+m = c3ba73c9 78ddbecd 545eb3df 48c80e2b 7bca4cf7 43e23c0e 0faaccfd 83ebb026
+    ca835b0d 01d252e8 2ce6e239 f0858f13 4d6246d1 59754517 3c7fffd3 8901d781
+    dbd366e3 a83eb5b4 83a42445 d93fc82a 2c560993 43c07b82 80c9bd6f 4bcdd7fa
+    aace5a16 764be04a e1e7df50 e336189c 4d42dac6 f56373cd da5e98b1 16dc74af
+    fb80045a 7d4311e3 417f2b63 26a9f25d 426da5f2 d5f8857a b12a9538 38edf953
+    1d962700 e77c499e 4ea6c529 0bee55c7 66795c87 cb45f87a ea8bb197 23c34426
+    05e0e445 770146b9 a8930b9d ffe18c4a fda91d73 4a34265b 2122006d d9e819e5
+    57c80453 69034178 724c9e0c 6200bf3a 58a188d3 e69e0a39 c0322662 373dae3e
+    6316a71e bc063707 be3e61c1 2f220c05 585c5a56 5e491b87 ba428388 b3ec3c02
+    fd2b353a b0fb06e8 8e8b074f e5d02894 978fe9cf 3d8ecf4b 405bc934 c269e1ad
+    807e83df 860e40d0 7480e4ee 93f8e2dc d835b9c3 b4309797 b5876099 d0c23a27
+    55be9681 f73f3077 773f8fbd fde60bbe 9831bee5 4c1faa31 1221986a a113bc7c
+    d5162a0a 49cdc77c 89109762 4b08b9e1 5d3d566d 1c78b16d cfe53b5e ad1539ab
+    1bd16f3b bbbad1dc 1197934b bc68d29d 0fb6f548 ce7d6bfb 9a386a8b d70989ed
+    4d5d6eec 1d9c5db2 3623ef55 90a31e58 a7b80d0b c19c4183 c4f37873 52c9371a
+    75a26171 64c6f6f0 907e12a7 8b6e7dec 072cf282 4daadf3c adec2b49 2d07ac11
+    0285a41c 4f93b2e0 40c343a2 01fa3242 094fa7c3 8e259d42 bd20da5c 137c0469
+    3053abab 74adafa7 ac2b2721 f0bcc102 4fb3307e fadbdf5f 6f7871c9 6d344aab
+    614e1044 9ce1c6f0 9377ef59 d108f2b6 47edcbf2 7377a80a dec3724b 5b900d58
+    8808f487 5c55975b 4afcc9d7 ee2239f4 57cd948d fb608421 c53e9c7f 8e35ddcf
+    00d5d0f8 35cf14af 6b36ace9 df491471 f10fe4ea adfd130b 813e6f24 9f1ef18c
+    2519dbd4 bbf44b1c 28342aaa 6c96171c 0f9409d9 c99724df b3697913 bcbe4df7
+    7e5b6ecc 6a5a48a0 b97b8f18 225c7c16 5e7e9b89 c4d627ce 10c26622 bb9bded8
+    15036112 be022032 25d09a4b 17241aed c70f89dc b1dfc261 60b3e261 2d04a8b4
+    b6c7d704 1a4b7cfc facdc466 5fb226b2 cc558167 d1936880 a3014074 064cbdc7
+    2b641e9e afd4e6
+h = 00e4983e 20b1b27d
+
+k = dca4ce63 e2a194ad 223cdf6b d7542576
+m = c4aeda85 dc42eb5b a82ae4df 0d76e6d8 bade0288 d7911713 1d09afda 7d043e8c
+    34c658de 0efc1a2b 6ff42b9b acafbc66 731e9106 d9c8c576 db737915 7c4ed8c3
+    5d03cff9 78aec491 56ce5370 62a2c337 6af0f97f d6bcec5b e385dbea c5ce89a4
+    b4baeb64 124170f7 d87e3870 16c7e337 b9167c3d 2e849927 25093c06 80b4a960
+    7cb0c2b1 b73c427c b84f3eca 275f9e63 e4d9defd 2f36448a 0f3b6f84 dbaac477
+    2a59e048 1b5d39b6 6502e0a9 efd28fcf f08a4a67 cc0690b6 c8e5122c 3a14440c
+    026aa582 d496c010 d04db57d 9dceebfe 04987fcc 0881e90e a8bce7a0 5df5c3d0
+    f7495b05 6b7589de 58cd78f8 8aee76cf a2a942ca fe60e2f4 12e050fb f2239429
+    45d53be2 31e27d68 b85b63ad b60b2a23 ab300e45 22c5baf3 8ff78b2f 3349fb1f
+    8676622c 02bfa89d 43ccc003 913b6ba6 d755dfd6 14772f82 672aaf6b 3a82f6d1
+    5f9fef97 32de4ecd a00939aa 2ab89611 6ca15901 8fc427a1 b582daa8 57142dd1
+    2f867d5e 4c441383 311b3521 3a8a1ff6 10aa1677 79c5fec2 9ea22050 92d89bcf
+    539abad7 22328466 b433df87 3e257c6c b1fb4543 7ad259fe 6fb51d43 6c89caee
+    9f504391 118df3aa 64b38bb5 31206796 2dbe68d6 b0bf1b06 54e82cbe b495decc
+    900e851a 9cbcc2c5 ceb34cb0 5dac9db9 695994d6 d3f53a18 5912c0f9 fe0880c2
+    d9c5a198 5dd2ddf7 dbe6e013 578bb518 a43f756b fb9df0a5 ae47f3a7 bcc34a48
+    15d56470 82f6d5e5 1d45cdc3 baa70412 9e112d15 e400397b cd549a8e a4ee4f90
+    55efd01a 0bf4e848 1c263e86 ad51ad91 d0f721b9 28797d9d d087e8b4 091a9d03
+    bbe29b08 31e649f0 ccfb0b5b 982a8539 5825f423 c38bedae 7c787e8b 04a3d890
+    b0aab1d6 5f0f2190 bd99daae da7dd2a7 fedfcbab ef0cd712 5963e0f7 531d21b9
+    976377ac 0accb41f a352621f d337c568 7212e7aa e24e3c07 386e4170 0284d1b0
+    14165051 34c995e9 121b46f6 5d8bfdf0 e3d39d82 78ffee66 05be4833 c87a3ccb
+    735c32ab 30184ca9 fcb6df56 00e55038 0a6a5db8 f980b11e c0b14f19 952906b2
+    cf5deccc 6efb78cb e6c409d5 1358d0aa 56539921 db0c2ff9 68c83526 0abedfdc
+    c8712dfc efc14bbe 20283bd8 e4a3518a 411125e5 2e9671b6 57b9f1dc fb475f37
+    c70546f3 ef52e73c
+h = bd2b7888 83a574d6
+
+k = 315c84f9 80570233 b2c8a26e a7331be4
+m = 7eb54399 530d2556 88bf9e8e 221a68ea 57e5c28e c5c2b2bf 7ce9191f 27acacfb
+    b7aabf94 97b536cb 946e6e12 ccf89ec4 b130ee02 214ba094 defe490e 58dc3fec
+    d5c37025 203c4138 2adbc4ce fea04369 14183657 9c2c1b78 9ff59749 b6552891
+    5a250050 0becbb7e 13389dd9 b19d6ca4 c3fa9815 37d3516f aa5fa766 182b0205
+    e38f4c21 372df4c4 4ae5dc19 76da99d0 d4f0acd8 9e0baabb 9a89c5c6 ebf2f24f
+    04d79917 a2f3cce6 beab3ea7 67218766 ef3e957e 9ca3a882 c9b3ae7e e3288834
+    9ae994f1 029abdbf a45e6be1 4d272564 08fcba8d 70b033fd 36d2483f c7a9f76d
+    ecb6f06f 52787b2b 6db0ca22 235787a1 b7ae623c 423615ea 3ecd7fcd 73f9b563
+    eb8ccfb4 5d43c1e6 892f455b f26a6e61 8d70cd00 165e7ec7 89ea24cc 57f0393e
+    aad349e9 036ffe65 f67edbab 8ca8ba62 883f1883 8d501142 9a58a95a eef8012c
+    391a323d 105cc136 ce502d4f ef6d7773 b0e841a5 ca6d6848 2e8b2778 d5e52e5b
+    01055849 6f90cffb bd0df1e7 9c421eff 4747b22f 785ceaf7 265fadcb b1dd5a26
+    2ef1aaa2 a3dad25e 89009a61 9c619df4 9ec66184 1d6d3937 d53e7924 a0efe4e8
+    85050549 f04fb09f 71d71a0d 3bbd8f19 e69f2a56 7d3236bb 2380e9c7 c61489ea
+    6d37bf6d f820ebd7 7abe6125 6749a7f9 1c775e4b 5b26819a 28fa9082 293abf0e
+    68e89809 727fa2a9 2cfa49ee 6dd108fa 62da6971 5810a0fd cc350e90 d707c819
+    bae28b4f b9942ac4 72810e23 04465146 9aea9e7e b14f113b b4a6ed7d 8cc8b7d4
+    4f297d35 1483ea33 c2732bf6 941a99b4 1c023248 be72c5b9 8b12fd5c 57c4492d
+    9a4b9361 41816eae af58f0aa 5a28a6c9 6c22800d 75b442a5 4827021a aa6096b8
+    85b8ac8b cfff937c 118e7632 5cfb75d8 2e2cf3ee 6928403d 84d54921 d15dfa68
+    ebc150bd 85206023 b670ef4c 4d01e2fb 294bae5b 11d7c924 fe54e289 83df69b1
+    7b1467f2 0658d282 23454808 9a382b50 a2ea79b0 6f91498f d337f778 ebfef8fe
+    18834a09 27e02602 84ef3692 31bd58fb 3b286d20 bc4169c6 3ff49425 76556e47
+    20cdd947 ae5ef8ac 320a2f74 b50dcf8e d25e59b4 723c45c1 4a1c2f54 7c5b85dc
+    e1f25fd0 fd6e62af e2731b31 35ca6ee9 15949a3c 266e9fbc e367a0b4 cee223bd
+    f98d85a9 77824761 27
+h = 09212089 d3b08543
+
+k = e070aa2f 3c501069 6635f486 708535c8
+m = 10a5a80b 89f4a1b6 466ce553 bc8b07e1 679efc7a 3bcf689f 4b3e86bf 04a4f18b
+    a91c5cb9 db5e8d08 498bb3f4 302591b5 0c0ec653 4d94a173 6f22fdf1 3577c23b
+    fd6ffe79 1870b173 453b78a6 bffec92c 78b84fb7 ae3642f1 8c266596 5cf3ae81
+    f8421a33 c1d6165e 39c166c7 fc8e0ab4 3731c927 85afa542 db528804 0762f08d
+    213ded28 c85d2467 c596a6bd f3af7dd4 0869a8a2 5219cd3b 0f3e99fa 6361b5d4
+    e4c3d696 dad276c4 0d658177 6e32ffa9 29507b78 6b240d7f 45037d16 60848410
+    a06e30b0 2e402de9 922e674c a44d0b66 56872927 73a8a71d a4e58dfb 6ced3e24
+    9fa3b89e 7320e738 861c64f6 e024fd55 deea9bc4 42c8262d 8cc57f4e 9fa5199e
+    03cc7f5e dbe526af 021156f8 29ebccb9 2e903250 56dc4220 a081403b 41be0b57
+    8188c59a 3545efa1 da6f30a9 09002c32 de7b9ef6 c9822f3e a4e088a7 e164a211
+    d2ccd273 111c00e5 0d827168 36a21173 2eceb85c e3942e61 da6873a6 255de7ac
+    a493ea69 6f57b6ed 8f5a3822 05aacf84 34b45faf ca8b9341 8bd16950 31b68ed9
+    9128c750 2a82719f d9159795 c14258e2 1886eee2 b644c616 84d93c7d 3e953ebe
+    83d63206 5961171b ffe4304b e092f792 3d4f1e02 ca4069fd b43ca3a6 2f6e3295
+    b11ca4c4 66a783c3 74012459 ab6c7561 a163b1be 8fb3aaf8 771c26e7 318d8277
+    b02cbbba 5a8318c0 7ca1fc55 81ba6131 03be7f40 d031e913 3ad71e0f 9ad2ec73
+    00766a60 496effe2 34dc0eb4 cda45031 247b0954 44e3ef11 48c1eabd 53dfd8e2
+    264fe8b7 db5f5bc3 16d01472 d2030f13 065836fb c83aa6e3 c895c5a0 0de4e0ff
+    4acf16df 848cb50a 1ef92e55 a63e5c50 bced5060 780e6199 5f3e2803 bef681c1
+    b24b6eb8 9be902f0 c9d2ff59 27c880df c25e4960 f3cba983 98637e49 c5b1755c
+    6ccd50db 53a6f3bd b52eeac2 d8cb6eb2 edeccca1 cbd3ff5e 389e8289 4a6838ff
+    c58a056b f3409de9 af249c9b 7cb4ab20 b88b7dcd 27f43435 67d31724 c035aa08
+    b0b2ec82 573b45c9 d64e165d f954a969 bc98f8f7 e67df659 f0acf62b 9cdc525c
+    8ba21919 b6155d61 da572875 8dfc3132 048e562b a1593900 d8a494a2 329361ea
+    20f7fdd6 af85b530 9eace415 6bdc23cf c01ac749 9ed9f5c2 6546eb9f be3502c9
+    0a676e1b 816137d7 f779
+h = d86b4d8b a1a42162
+
+k = 0e4b6bd3 d0d35ad9 554588c7 c5893d5e
+m = d9b54c85 6eaced24 d3cb7cdc 87dd54f3 cf4cd551 9755ec9f 984fc7fa b7e191fd
+    2e175662 c9f021f3 a813a7fe 4592e692 24ffce04 e96d883c ccc9d1ae 087541a6
+    f705959c fa01f8e0 42e2e17c 3420f35d 9a9149fc 5edb420d 29949ec7 b8b110e6
+    cec76318 f8385d56 cb0ccb5b 138f4c93 476d44f6 143627d7 21fbec61 eb0e5547
+    e7403c8f 47b4b0ea aab26838 667d8a72 ce658f3d 0215cd58 466fca60 48380a64
+    05bfd754 7f427033 bbaea887 92511541 a2fbe7fd 1001768d 8676bd0e b81f4239
+    f23337ca dcc067dd 99ae9c99 83d69ae9 8d23db34 c0d75be9 e78db702 e0e68da0
+    7ea784b4 e32ebd94 a04a4a46 0603ba37 bd1a7f55 9e330912 96d18502 e2671737
+    c03d01ae c7e6ba96 df1b6daf e8d19995 8264ab28 d146ebf8 ea4a7d89 f20f8a64
+    b12c8dac d882cea4 91e123a4 18ffe79d add5e939 e94635f9 7d1a9911 ad9cf2fd
+    1d695114 8fe4285c 9c3fcd47 46f6f8f7 6383f890 f4f133b6 09fbb50d fa0984f4
+    12306613 6e0d2a7e 5f1d2bf1 be2bcd21 be28fc3c 5c138db2 4423065e f3d18a39
+    2d99852e a960055a ab8efabb 509f69a2 76088673 0ba42048 1302643b 12993355
+    dc77dd5d 0f77e824 a2a27599 68d89257 110c4cb0 af9bfd10 3c2a46fa 28bd120d
+    5fc975c0 78222bb6 1873a9f9 ffbfe478 391d3346 04cf03ca 9c8d9341 6187856f
+    5a1beb38 d656f938 b1a524c1 76fd4817 53832896 aceca33e f06b17b2 fb9fe6bc
+    3e5da383 f5d07e65 aca5ef0d fad9ae1c 801ae344 cc9f2c3d 3d3e1551 278d74e0
+    94bbbf6e ac416e85 60d8f885 ec8478de ebf584d8 7e632bf7 95dfe12e f98c3047
+    d5253815 90137740 d54af638 4c36110c 22491824 ab70cdaa 60922707 55d748d9
+    56a76780 2f7a8170 4e6a2eb1 316e4dd5 4c839756 31b00c15 3c6ff5f0 91b9ecbc
+    36dec4f9 9813cee2 8dd2b77a be0d45c8 edfd6aef a8068004 dd38554b 8bb90a87
+    af824cb6 6f1f6807 783bd560 39be691a 11741df9 350dccd7 1f91e930 6aaa6204
+    504e1428 37392f06 98af1ed2 f648704f 9fea3375 4fbc2313 098de86b fd5a4fff
+    a95995da 46c72506 0ab43479 84ac5c6c c45113c5 becc2453 3f1cca3c cf4deec3
+    eb22eb5a 5a1fa9f7 99744c2e 196ccc4f 333df95c f9946309 da0765ec 8c6ea38e
+    27813aa8 2ade2609 d5118a
+h = 1a5fa1f1 ba2cb32a
+
+k = c84174fb f016c864 e5004c3f 22bc2d90
+m = 5b9b85bb 144d3cd3 28afa075 9946ea05 37550ebc 49e8e55d 206852b3 6acdeb50
+    8d7d7b63 60f0983e c9698d8f 4ce2c999 a70ba547 2941b242 eaf0039e ab89c1d0
+    400efea1 bdfc46e0 da2f1a50 ea7eede2 abca36e1 378ce418 e1b6cbd6 36d653fe
+    7124f1c1 48396308 50c71495 18fa5363 2d2a1a11 0ff68844 d3866cd6 d4b04dae
+    543cd3bc 6eeadf7f d0c100dc 67ae617e 5f3808b6 42549638 3cb5d088 a40e99af
+    4637c373 05bf9a0b 1563f459 2cb933f3 8984c0af b3e5ed25 838f608c d8cc60a3
+    abe558fa 5465a2f1 323cda8a 90327b92 9c9a2e87 af0508a0 605aef99 c5e47bea
+    5aa0b3cd a82fe14e 804cd40d 85568e28 a4e540b6 df299c16 381251c7 9ad25f7b
+    15d7d973 8b372e21 d3434d65 51cec625 b26ff72e 974d41e4 e8453bfc d5e489ea
+    aa478997 fca7863c 497141dd 591013dc 40cc05ec 14409686 501ef7ab 782acc28
+    5054c830 a8c13a65 5b2d7cf4 c266363f 086f32bb 7312bc7c 9a8f5853 057e9287
+    bf1285e3 bf30206f 412977e4 0fcb7b02 b47352a3 5b2fa27a 368f6c0b 0a4391fb
+    a71f2b86 1d779891 a13d98f8 3eff4cf6 42fa4436 d9108eb3 42eb1acf 5f40bc23
+    660efb6d 1c402471 d8b80cc5 634f11f4 d60df0b5 ca465c98 8eb13dbb f2733758
+    2a50efa7 8a986d23 1f3c5b27 09f04154 d818b051 b336636e eceab2ea 98e7c323
+    4cde190b 304098a5 13414983 087856f9 9d8f3b6f 375bbf21 c6d3026a 3fd599ec
+    6a698c4c 127b4a1b cf515422 32dd4d4d db4d0f40 23fa2cf0 0d103ad5 acbcc1e4
+    33408374 79b925d7 2f67d934 cbe8b9e2 bc905c89 c3f3e7c8 079f14d3 825884a0
+    6ccadcc8 d44062d8 6aa30ee4 3c621653 01dfceec 4fb9d485 e49f69f1 227468aa
+    583b668e 0cec47f1 bbd6d649 ca054f29 12fcf690 2584106a 574c168f fb962df1
+    d4a4aed2 9a21ef23 87aabcea 6a253d25 70c805a9 d3d30ce5 55dc71db c7f900d8
+    3054e8cd 58882a34 0fc51955 9e853fd0 ebdc891e 8cc50855 f135d4aa 3f7185e7
+    847906dd ad6f66a4 9d4d546b d4098b3b fe34a2ae 2e16104c 5e64c937 8593384c
+    268c1d3d 58ce5bfe 6192289e 9e78d441 1abd7ba3 a5c9acf7 d228412e 82a4e182
+    6e493955 82d2112a 6ac7b294 81548806 412c5102 5fd23106 9f33df44 7d913d1d
+    5280850c 0029e4f4 539d73cb
+h = 70edcc1e fe22b573
+
+k = 522ab0c6 34b34512 1f3e7816 cf5b6292
+m = dcf5cf93 f1bdad78 541ad8b0 a95b1385 1e169be9 e7ce776f d9ed3d00 1f87c624
+    592b63ac dfae7f6a b1b48267 15dcb89f b682e4b0 7afcaab2 a3fe4fdc 0740969d
+    6bdfe3ca 0f7cf62b 6c8c2a91 ac3fd054 ad834f03 3d3fba2a 115d0011 d6a1c2fe
+    5d47f7de e5dd0457 acec1867 7840a871 1acdc1b2 688265a0 382c1627 1122b8d7
+    acd1682c 8b2543ff af37a301 048ba4e7 9ba5fc18 d9b48fc6 f7744608 629350db
+    24e89dcb 49c40fed 2e284521 dc811c2b 335d53e8 b84c31f3 43128e12 b3c58db0
+    483d02e3 c2ba8497 56567f73 72d5686f 322c1315 3ce1622e f8784e90 61844aeb
+    c75e35ee b09cf6a3 3a288315 4bf41cb9 a6802643 10faa78b 1f551837 2a10eae0
+    ab6de255 8bc9ea28 d608fd9e da4fdb8e cbc674bf f6fbd30f a7f0d2a9 636dcbb0
+    dbcf91c4 1be02588 d585e09b 7204f0fa cd65ca43 5e1fcc41 9a61fab8 b735f9e5
+    f3cc2f31 9a6ca102 e26e53ff a18934dc 15b70cac 3930eba8 bedda542 0390fd8c
+    e89ec46c a04cf964 7fe12887 b6fa87d4 794dd68d 910dc3a3 891ddb7f c0097525
+    755c5ab9 4b7213f6 748b8848 e45cbbb0 fef626ac 74675b14 b98fc9b6 139cab1a
+    4a670e16 71a69b28 8a52bad8 d7688473 a7df4437 e5983d11 49ceddc2 2b8c2497
+    2427668c 54c8f054 38477053 6ee31a50 3d12ca8b 7f44fdfe 44139933 8f451aaf
+    bfce58fc 03bc30ad b9790335 ffc13db2 8b4b9dc6 4f8521c1 34878dde eaf85cbf
+    2640d300 25f1bc0c 4b65f5e5 5b8557a0 fb1e2092 9ca59d54 f32b0c3e 675cb7cc
+    cad1003e 904fac2d 1f9380a2 0906c4cb 4612dc30 673d65b7 9ac59b55 b2720285
+    11d7c0ea 36694fe8 da9ca58d dce2f2da e658c30b 87e4a525 c70e4a81 281176c8
+    6311aff7 6086aa71 2c40e8ab 8e56b906 89d51c46 0213be51 c6d78b18 592769af
+    c3babd56 86df41bc 8bcb4381 4cef154d e44ac4c6 fcb4b529 2e5ce2a6 3dd5e29b
+    29cf2360 193adf3a 68666903 3135d336 30e7f0a6 e8007f79 dbd61c8c d6c43bbc
+    3add442d db3ed3cc f27918e2 1da379ff 6df2082e 2f3bf33b 2c486a8c a136f38d
+    86bfc03f 8afed5d1 3b8e5629 1641b5f5 9226bbed bd87947d e2a2a1ee 4246e229
+    99346ac0 e5553e1d aa12cbce f59e9437 34c6d08d 4a82ad77 4effe361 a9c56a83
+    84d11b0d 8fc6cc15 17d37514 98
+h = a208278e 7673b777
+
+k = 22b2e3f8 27b006da 7f31d7c1 1b436971
+m = 4b51fc23 02f189bd f2d40f88 e0df6c93 67c6f414 238e2367 382c5b28 7b3257b9
+    90381e0c 0e789012 a84042fb a605853f a298656e 6ab8a743 f8434a94 dda21e16
+    ff06d50f 24d9102b 11dc7704 792f2175 b007abc8 e8e4c36c 8a07231a e61610ec
+    562dc391 fda4050a 721bb130 8a55134f 17f4bc61 9362b916 bd108269 591f05da
+    64a0bd19 81c7d736 65d272c1 b8c53093 395ebea8 5712294b c1eaf3f8 f8352cfc
+    8bc8e08c 7eaf33a5 9ae99b78 5024bc41 9ba25f21 9c9356d4 50d6472d d46b2a85
+    74834f8e 3cacb737 85095601 15036d13 a1cee27f d0d78557 98d702a7 06027e1b
+    eb6192af f3882f29 1bc45e4f a83fc3ed 95b8a13b 1513c148 6ab174fd 9efc13d1
+    b7ca06fe 8a2974af e10d90a1 05587dcf 9317f55e c8cf0011 bd83a223 8e7a01c1
+    ae8be045 6375b170 8c8b7f8c eb9a3bd8 56a11183 781def8e 2ab59c1f 5d66f562
+    ab388201 0ada1a01 1c97499a e4a77e7a f4d971a1 a4201849 33bba149 d5013399
+    4c4996c6 8b6f3940 886253ea a2e3beb2 9a83f212 50c5f5e7 3f3d7ead 431420c6
+    91eccbbc 58c99c28 1674a23a f01cf9b8 c4c6bef6 8dfcad19 d3266e7a 5b5dfac2
+    910d16e4 b62f1220 bb315126 fc653974 429bbe61 841e5574 1d1c11b3 e5998ba0
+    a63ca7c5 0fe47d79 fa49eb40 0688ef68 6fab6613 027e8586 ae9bb3db 827705aa
+    34a99c4a 57bc41d7 f960af10 b749ad33 c9fe74bd cc9bcc9e 233f4210 fa4b1269
+    adddefb0 9df36fc0 0d003774 7b846907 7065d1b8 9af2601c bdc1762e 09b2973d
+    47f96282 187629fa 7ce3c627 68628124 b28155d9 25082ebd a423cb38 a055e209
+    e09f78aa 02254206 2baa5e39 17fab5c0 d923f759 fbcfbf0e ac65e3f7 ff7ddc07
+    2414af50 b5fd43b2 e8c50ea3 6fbbdda1 177c015b 8390bea1 0584c338 d2d4938e
+    17ad0bc1 ace1026b 5802cb9e 2a3f45d3 64be3e5e 0afc42dc a7c6ea49 f5ea805b
+    c017ca77 60dedb5d 5dea97d6 76580fd6 71c51815 a58801e4 0a8e0aaf 11f0866f
+    b6123608 fbb5a063 0aa79eb8 e3594e56 c45ea2dd 1c60afd1 aae5c115 cdec2db5
+    d70c6214 aea9f660 88d1efdf d9bdef01 849e91cd 8a617b09 abf9c9ae cdb63752
+    dde8ad25 e94c1540 180b17e3 5e9b3eba 61ca3416 1520e391 32ea8e98 c821e5e9
+    e023d60d df2a0808 44a984c8 2b0e
+h = a20f8ed2 25560b0c
+
+k = 50acf0a3 a6f4020a 658aa071 cd192e1e
+m = 3c2e3fe6 3604a1be 8d81227a fc5d9014 cb07d3f9 47ce2b68 57d0de6a 7760d87b
+    c77866f4 db238596 706fc1b4 7e8a829a b6c0f475 863d1d46 df1685b5 a8fff99e
+    8b87dbac 764606ca a6066a5b afcf3220 8baaf0d8 f9d3a902 11b7ae15 0c2ce67b
+    bdf06c55 568256eb da0c52ee 1ab29556 6482d8bd 86c965b4 689ccde0 f37ba15b
+    0fc8d878 865d25c3 4e70d6be bc44c99f 2c67c08a b9e94912 2b8dd792 3ca36b59
+    dda70934 7bafb107 a64f3b46 fec336dc d916d833 85634650 7c60c3e9 65edae45
+    0637089f 6c0bb9d3 840f8b32 42aa26a3 1a49438b 32d8466b 516227ed 804be3c9
+    8a45ce7f 28d6ec10 75efa7e1 450dd49f 635f17cf d1a05724 a0985a86 8b05a335
+    bd0aa576 6e0c96b6 35737636 503c1d13 f469f4c8 a0dea970 243bf3ad 4f1a8a58
+    73df1384 2fa762b6 593bcd9f 0ce73428 8fb3cabe c72b84b5 f757038e d8f7b0c0
+    7d4cc15b 063a70db e462448d b040249f d4d6f095 a7e5dd85 f620317d 89009cea
+    0604b2f4 618f6c3f 15404350 f6b1624d a95591c7 5d47a93f d3081d9b 4ef92bb7
+    a1151483 6d13d44e 94ec0aae 09f7274a b320f916 5094e1e7 ea9eb574 66fd8047
+    a746b1e3 f8151b9f beb272df 06b3702e cb1c2072 37fe651a 66addf88 aff94ec0
+    bfacce33 c758b8ec 4f8a7249 e7995131 f9d332b3 09137604 c1c57d7d f272019b
+    1cf73ec0 0722fb09 07fe1f6f f23ed506 19691870 03e305e2 2b60c7c1 f897dd4c
+    2ad31fc7 28ffc1b0 17188d60 bfb0329d a44f8cb7 5ba586d2 3d2d81ea c638ee70
+    f03a1608 e826dc4d c802da99 7e40bef3 c7fd52b2 6e75447b 16fd6750 f1b8e9c4
+    ac218a6f 0642c233 5abf968f dda1a7a8 593bef91 8480e0cb 61c8c767 3b2c921e
+    e1f0013a d0596234 5014f22c 5a9c14c5 5178d047 5f50847a e76fa7c8 8bd59203
+    ee8a7a14 430c8d2b e1b42ad5 11e543a3 5fd929ef cb8296e4 0644ca4a ab6ea042
+    855143a0 56c0d75e bb30fe1d ca95bb55 99d962bf ad9df496 aafcc543 11f1b976
+    481ba07f 8497446b 763e4af9 679dfa6f 97ceafa9 5ce7dda5 fe82d7e2 3e056361
+    89a37ad2 541e2568 ec02c848 337bdc29 24d55642 3292f25f 88a6c206 526db7dc
+    4ce9de32 a12d2fe2 34b05e1b e818fff0 71737fa1 bcf80a4f 0b3f734c c6ae57d4
+    7d7e0436 d502d123 0b4554a4 7c6aea
+h = 746214bd 84ee9ee0
+
+k = 78c83280 552c883e 8b082587 4affd566
+m = d6803e04 6c66f65a cf121396 1d5b7d8e fdc99967 9c5c5a69 fa9a9975 0e2e0c18
+    78abe33f 53477e05 6aca01f9 20a736dc ed12db20 6b6d288f 374be5d0 eff0a1e6
+    0739fbbe 429aa30e f24ce946 8cf4ed99 84c13c76 4d1d0abf d95a7fc7 6ca3031f
+    207e094a 7a0876c2 df551d3c 3d9a1103 4517c8d9 058b9b52 d163beb5 2dcc24e4
+    848b0916 18ab2c2c 98ae3b5d 9c7bdb7c 4c72858a e928c5d5 0a97655f ad6b5a94
+    74d70f34 00339618 828af4f3 51c4bae6 f9a8775d 3642fb57 a3a83d6a b90f6d01
+    346b7b68 f0e688a7 3932d7d3 3be17ff9 6c76670e cf6d86d1 bd686e5a d113dddc
+    c0ff82cc 52661836 8f5e5993 9763c176 c8c74164 26e629e0 2367cdd2 f4f193c4
+    40d5f66d 7fc7ecdc da003f8e 7997b0ca c9a9ee62 abba71c0 c80e1733 548e3cd9
+    4441faf5 027f3465 8e01dda6 917903c3 1723596a eb1640a8 52e410f3 e52ce46f
+    147835b1 5c89444a f1f50ac4 ca03eb06 b5886042 7ffd7eff 19fde41b 629269b5
+    40e3411f 62d343a4 8ef0d5d2 dd5d932a 3fb7e604 0f70936a 92821331 89cde1b5
+    43364416 c3ec619c 763b2a91 8dc01528 690a8023 1dcb968b 35b724c8 149723e5
+    192c69cc 5b2453cd c3aa6115 ec3c480b 8ed48e67 3025530e ed87da5d 1546b398
+    e27f7551 1bd98a2c eb972132 76107fef c8145d80 99f20952 6ea89639 d53c5ca2
+    fcbf97fd 7e353181 060a72f0 1a89aa09 897b880f 5dc39c6c 1e2cbe5c b32a4955
+    fd0912ad 8fd40abc f2860938 0a09dc45 ceb8aee0 f484a530 11a8ffd4 5a5133ce
+    a067cab6 10824d3a 0df42c04 31742f8c 8c86941a e644efc5 0cc4b8df 04fa52dd
+    44587348 4d83295e f7a52f6d b07346b3 acd47cff 4297379d 0cfaa541 3b32d77e
+    09e2c5dc 0565f4c1 d0bacb03 8645d6dc 08a1850e 7c884153 2befc4e3 f6ae1195
+    77914c21 5c239496 7bdf1834 3727872c 53cdd162 68f77286 acf7146f 22b75e90
+    6fdedddd c05faf1c 1fe1e032 b2815d1f b885127d 4710e963 b3cf1f5c 6ddb9f7d
+    90067b2e 0d0920c2 66cb0b3a 247f62b5 53ee7efe 3e93960f 3bf4b8c3 9d44560c
+    0f3c4d9d 12dcb954 2c86f215 6cf72ace 64cf700f 10854e94 01438d34 cab05863
+    9c48749e 872071b3 c008ac1c 78c834a6 cf4a84e6 9fd27398 6711bb50 97ea3f0c
+    984c7b0c c63b698b d094ed2e 75365aef
+h = 55f98938 7801d2cb
+
+k = 3343285a d6ca04bd 6b5fba33 1ae48e98
+m = a2bfd05e df860325 9aa7c7df 0a8ea27c c52c3593 89b51b1b 404996ed 272fcc2d
+    dd7e0180 a29a2441 04931d2b 78d23a4d a01b4123 90f55c55 989918b2 e672bab6
+    60ff1cc1 3ddfc0b1 54405495 f143b251 699e3cc8 5c95c6e5 3425aecb bbe1744d
+    3c744829 c6d4536d 1a93d6b8 5f958123 70f1f5b6 8e8d359b 1011f5aa 8f6364e4
+    0eda156b 2a0d2dc7 b4cc9494 9d20f021 26192c77 a74d5b83 cc528f81 972d41f3
+    65fb74a4 9abf394a 06b77841 217426ac d4d512c3 e09fe790 98ff0ba5 5b314f3a
+    0a74d19c 20e9b166 8fbcc332 a029df4d a2334435 e0ccf1ca 4ec121e2 2c7e4c96
+    2153346c e745661b a99df225 5485d0cf ea510937 94c4bc02 5e2fb119 97d9f0d1
+    e340febe c261874a 44f1ee16 9b8197e3 b50d0751 b6104b3e 0b3897ea 6ca4e4c5
+    c7fcf201 0a6eeadb 19529c44 66a81711 91f0722d cca1eb8a 6fdc78af 4519f7d2
+    548c90b8 09983c6e 50102284 c5aba73d f4dec7e1 27a91cc2 b514b231 6731b631
+    a69b7eca f99d3187 30f8054c 75dde404 d5f1cc94 9a202760 ceaa9c34 ebb19460
+    ee1f97c0 4b5e35d8 9c87f366 24af2821 71f74a33 71709e87 b615e1ef 9d1a35b6
+    1b14eab0 f538bf8a 8f81a5b5 d85b7845 17ba4abc 058efe18 ececebd6 0d8722a4
+    10e4e3b2 a2930b0b 05b36c2c 6e009983 fe26e45f 1203491c 7c90ab7d b4b4bd62
+    3b42c254 dfc05465 febb1c6b 3237f0b0 5ddb01d7 ef396418 f0970fa3 1274afae
+    dee25d4a cfa84ddb d41240ca 92287f5d 442c8aeb 9a2c8e88 d6a66e70 4a584b5f
+    cf554c84 c91946e4 75b07696 3c1e252f 44edab85 68945854 02421c97 d171b181
+    f9c2d8c7 55ad253d 497f6743 d156d2ea 3ef6709c 1fe15bb2 3a8aa64d 80eb6d20
+    c32a9a19 a88760ae 758c03b2 355aec0a a55727c9 28143b97 53cd9f31 4fffae5a
+    5ad614c6 528fab6d 3832e6c4 76f4e022 44fd22a1 e4394366 cc0bec65 c2fc7afb
+    b3913bb2 96f790a8 331aa52c ed289c54 97b3a791 65d054b6 a98e53ec e335a74d
+    71f1d965 98ca837e a346bd75 83dedb38 168db01a c62b3b5c 645313fa 052de50a
+    8cab2e16 f4b1b540 bcd97cf3 66bdbc28 cf9ba245 3f08ed69 7a65bfb3 d72d2c87
+    dfe19b5b 03318d51 f315c645 7fecc974 3eb67032 e9efac1b 29281146 a0e2daf0
+    b7d8c14e 3a882989 10e14f70 ae811969 26
+h = 1c85bb65 758ed914
+
+k = 3f85f531 ae0f086e 0c5ed851 30435fc2
+m = 13ce8aa7 ffc18690 0311ea62 f7353bb9 52e33335 79cdce2d f1b7bc53 e5107f51
+    734b5d9f 0e663cbf e1438516 b7d61bff d5699fd2 791fe2f2 e28d44ab 28ad6655
+    e1923bb1 4211cc00 248a7e50 fbd9add4 5448d695 de7cc256 a6f6269f 6cab079a
+    4ccf742e 7a374915 458c2107 0db5b2f4 2526ce3f 343d14ed 154ce72d a4162b7e
+    75c3a790 a77598b0 70ca735c f3329c2f f1a84522 674ca2e1 915c430b 166cb83d
+    17e3747d 2bc77050 b92e0b8e 48b8b0c3 34461f40 0d042b76 02fc27da 088b004d
+    fc892501 b4a52a7a 8cf7f9c8 21e410b5 be969f17 2946935d 6e2ad3ff d54197df
+    71530316 79c63376 1b7da608 84a34357 2835ccdc b23932a4 bed73d6b a3add4a1
+    4279b6bd 63d52581 5100785f 759d8a1f 947f0262 d3440141 2f7c80b3 77a5d254
+    02726616 13a89bb9 5a510e9b 6bd35783 4c45fab3 bda1a439 7490c24e 043604b2
+    6cd1daab 0b223593 552becca f8c7461e 5983f032 234e50e8 ce41a1c5 994d79e5
+    6a18afe9 f2c165fa 12739de0 06f7de3b 04eb721d 64d3d9fa 95421799 deae020a
+    c3a0739f 101c9484 de610004 6e7bc01a cf1d0384 a3c83421 fc5ce5f2 9027326c
+    b3bd83e2 b1ae5cbb 92447e9b 05ae1067 f9dcec67 497b68eb f449ebe0 98c1b7d3
+    78b77292 ca24d4df 5c0e32a2 673271c7 a689e1e5 e523fcfb 3746b60e 2777bbca
+    3691a72d 3c853e64 2c2b5ba6 ce23b6b3 d1f8e7d4 7df234f0 21abedbf d51c4fe4
+    db8e6905 25872cca ffd149d4 3596b7da c760bb41 0ac70d1a eb2fe411 bc7573ec
+    3a5da724 13213f2a bee566ec bf8ac4b5 559812a9 bbdf7e99 ddc57e5c 8381082a
+    77e228fa 48ba5c4f 594adc4a 750189a5 3128c89b d804d498 85c1a5c2 d4753674
+    65a4e688 8e8d6ab5 734226d3 bcc08091 5fb1bf40 fa2c3cc6 f69088ce 13ec8c83
+    05ad2172 1b7a73a3 fa28070f d0fb8828 301c5c00 9ace317a a6b11ffc 92fc22d1
+    cf011329 b66a4122 6bc9d976 faee80c1 b03eefd5 6fdfd835 3a682073 b93f9641
+    7adfb986 b2dda165 2db83497 f26e848f 16ee2c18 aa10332b 0b00689b 4e7b2676
+    1cbf04a8 1b94dc67 02152872 f84106a5 f92b2b22 c268c23e 702f37fc 6ae72f02
+    78e300e8 6fbf6d00 380e490f 12f9b731 0abeb183 7f1d80cf 07e2faf7 486c8a08
+    c0486d6f 2253ff7b 6559d8bd 40fa060e d3e1
+h = c547acdb ab722b7c
+
+k = 71134318 af77830e 62e20179 7d96a157
+m = c402686a 926400c2 d8e57425 803d6cfa 7d6c2e81 46b9c513 f17dbb01 c54250e1
+    e125a072 11f3ef47 f8fab560 3e6ac631 35380b89 95b153f7 b64304b4 24460be2
+    0ebf1e5a 2d9c4a32 5826eb0d b685f55d 7fa0a113 7c462c08 49698a85 03268141
+    30c243de dcdd1972 168241f2 44099c0b 3069e5fd 403875af 3e29b39b 8355a64f
+    c9a49e55 bed1e018 6d246973 21e6d2fe 4455be89 4ab42408 d5c5953b f247b3db
+    e08bad5b d72101b0 9ccc443e 9d6bc28b 910b5b6f b032c9f4 fca17d6d 8d676f72
+    9b347468 c19e5b50 4b0c28e1 b70533e5 699358d6 da4c9e4b 0aef25ed 73e5e44d
+    8b61cfa4 e887d35d 2085b490 4cc81a1b 8ca1e99a 37d67b3f e51d64d7 067858cf
+    04162f3b 5743e794 7981402b 40afc3ae ccc59893 7927f637 7931e878 9e9a1986
+    d3f7e4d0 ad410006 4e434b4f eeb71433 a6d9f7c0 0545726d e84c0fe5 15fdfae8
+    d8b87084 ddb3c9c2 68a3bd95 1baaef64 aaa6d1b5 1cd3976c 8a6497e7 8792e952
+    84a99af8 fd90ca38 48e38f44 54aab5f4 59f0bfc4 77ae34bb 29275eb4 7ddcd807
+    ae5a976e a7ad562b e7d28393 273d334a 71f0ecff e3a23b71 9658bcd8 84feae7c
+    d445dd5b 3a6fd242 98c3da59 99e0025a 384fb050 797c32bd b1b33137 411efbb2
+    6e6ab538 09d60dc9 f08394f9 e09d22c2 ada4101a 64cdca23 d6c70556 8afea6e0
+    d77cb098 4e0388e1 ac955268 0eb08672 d709facc a1be1589 77782cbc 4e9d386a
+    0718cf57 1713339f 3871d9eb 6594df1e 214a8dfd 29d0a515 685bb7ef 8cc3f726
+    b7dc3fca 32c9c1f6 f7447e39 98ff1e54 9ddb9049 b2aa65cc 076bd14d 27c3d4fb
+    a933918b bc4efa57 15296680 ff49f03b 3abc4a87 7c89a9d7 f2a25729 30e026fe
+    db8830f5 b0014ed2 3a1d462a d92ab88b 4a3769ae 657f431a 4fa3f137 cb9467f7
+    da0f7f9f f622cb0f 6f82eee4 feba1727 cf49ceb2 0cc950aa 443610c0 bf8280a4
+    1995b985 7a2af38d b1838e06 addf71cf 49c1345e 25fe7a10 871a81a9 ab2ad4ab
+    27b324ec c1e11047 040ba528 22a3408c 933bb03a dddd81db da9c2b96 024d4637
+    caa1cd8c 33514c98 6273dba2 4c55801b 04004784 8bec1da6 40b67ec2 8015b6d8
+    857e0188 ba074678 31693c8b f9479833 c3dcbcc0 32961f6f dc96422b d9ebf1be
+    950d7ecf ff0cf18b c37469ec 74acea7d 767385
+h = dc335fd0 a8a144be
+
+k = 558e0b92 93168cee 8cdd09a9 d7272268
+m = 2da2ab36 00c64985 9ead688d 8065293e 0fa34785 49b2d108 bd353520 ef610d0b
+    0d9da755 76156597 06bd37a1 a6be169d f5ddac21 e8aeae78 73172cc0 08440b8c
+    993a169a d9f6624c 398f7442 81d8f5c6 df5d41c5 fd10ab64 41ed4cfc 33dd45ae
+    df871200 f3c997fb 05092c81 b13f40ed c0626c67 f939b0d9 5ccb5ada 0a50dd6e
+    3354a69d d4cd5966 63779de3 18defed7 2297a0f8 6badd2ee d0676986 e4a25a91
+    bc913187 14541716 36e3b568 3e3628d7 a954af78 f6b0bbf0 a49a64dd 72b28e2e
+    0dfbada2 126110f1 13491daa 55f42191 63df1888 6f60b8da 2fe948df 3813bc03
+    94e5e013 262041bc 78bc7625 90a74f2a b423137a 45042924 92ceadd0 b9958286
+    8b593b1b 1a7e023d e0be09bb a0e5ca7a e7d67958 ad792752 19b246fc 6aff468e
+    733394f4 c1e75385 057c1a99 e034b123 7c2e5a95 113f458e b7c5447b 1dcdb709
+    9c76eb82 79de1d8e ff39e104 6e2fb9a9 ba6fe8ec 1c9ede87 209df3b6 d02d553b
+    79757a76 cfd3ddb6 d40a6913 b9e80a06 6b47f6ec 56697533 beb78204 248ad734
+    7abf2a3b bae839d8 0c78973d 55c36b00 613ee626 6e291621 cd4523e0 8499b17b
+    5b1780fe b6cc3c6e 7ba462fd db6022aa 36cc6b36 05225e34 abf8467e 6b84e460
+    7342e57e 08ef12bb 0fe9225d 2daa17e6 a975d394 1ef6eb89 278ef335 b482bdf1
+    b121d90b df2d6391 6533f092 35374cd0 d5f85468 0c89c820 e7b5d58f 409bce69
+    1793ce68 e60ecea2 ca57ae83 5e9ed20d 4d58bcdb b7b3546d 707d2cae db69a119
+    61528248 48a81744 2f161c7b d8b381ef 2861da97 258cdd38 0a03e8c0 38dd2e6a
+    dca93105 7cedcd57 3a85db02 c43a535b cbf6e193 0fef6c2f 66313212 64dd36fa
+    2c126061 baca1d7a 7e37e6d6 3a005915 b36e53e6 e8508208 82ba9de2 cf7ef4c1
+    af493889 8e088922 e16f8dbc c8784254 ce669006 77dd12a5 057db8ec 9c57d75a
+    b16d0cf7 8f7b9a8d 0284aaf5 65299b02 3dc0a399 9b61a10d cf092648 0efb69a2
+    c20c5c8c 4598fed5 5d994872 eae06f3f 99112e41 66854f36 f23fadd2 086494be
+    785dc02b 1ebf7556 ddd6a8c7 5a498779 09d5545d 3fcab8d0 9d36fd8e 9d70a97a
+    b480ceae 4656f10f 3c05d8af 338f6cfc f7f41e9b 22132f4f 7b9d0f0d 04c031bb
+    aa8337a5 ce124ccc e72bc90c bd851a1c 271b31c7
+h = c903f5d7 e9221172
+
+k = 7e0ed49a 8623f3b7 aed6de98 3a565560
+m = ab0739e0 cb83a9b6 f8bd7266 bf242981 63704d03 b1ff4ea6 ddd0872d f4277ac1
+    0aa6b87f c4e13ca6 76d5dcb5 8c3c6a26 666ea720 bfb81e40 c5c7d636 14ff1f26
+    e44f6b12 bd1b97dd 47610337 6281a465 589ebfd7 e10ccdcc 53e40ada e81c7c2b
+    92f52f86 461a1dd8 25368ba2 5e8359ef 6db8b51b 3e690eef 67882f6f 6f7ee7e3
+    536a0423 8130a5cb 61547ab0 c109accf ccf45fbe 848f04be 25afab94 7ca27bac
+    a10c81a9 2cecc265 952a3aa3 67cd9474 4bd0e352 802ee299 08c4fdd4 9786b247
+    1f28f6b0 e02045c1 6c2025dd f0a3969d 839417b5 f3273a58 e5507112 82e42ebe
+    3322faf6 86f95916 10026143 6eff8ece 73e76ade 4eb8b87f ffef6d9f 4344e675
+    995ffcdc e245b371 6b75c64a 2ade80db 061a45cb c9ef4e41 78e639d4 7cf9af0d
+    78532fb7 a738ea35 8bbaafa4 073988cc ae0585ae 6a055d91 bbbf3151 2298e77c
+    2b46e645 2aec0f45 70140a3e 9f8704e6 38cb7597 cceedb32 b7b8590c e24f69a4
+    f3c2e4ef 31df9e96 cef66d3c 34812901 4df43621 e55b0e63 a9cca479 b9e587d6
+    4cc29b88 f51fdead 5091dc63 7b6a3636 f00b14ca 3bf54aab d0171d9a d73b067d
+    3b54a348 cba83a9e deb45651 18374c74 c0337242 a928ae2b 2abd88df 20bdf03e
+    e67fe7d0 af3fb3bb fb03e13a 19e3b330 83f6e988 1ac027d9 2fda69b8 2d210ff2
+    1176a4c9 be774277 c7bc1523 5a869456 e07b1a96 bca93054 49a4444a 53e05b8e
+    fb8d75a9 3d7e9205 c7d34e03 99c2e8f8 b498e090 a271c068 565e0899 f2a01aef
+    41f3d109 aeb944d4 558a3259 ad7e2904 5f546513 ac3f60e6 f5c9c221 b5552b0f
+    bcdcab63 1b4eb9a9 1796eb7f fb0c94cc c04c0e49 a8867f2b 1b29955e 546cb7fd
+    37b5f96d 9f088216 38b45f14 66031758 dedb3525 c7c85ae2 4fe7222d ef95e6c4
+    3f9b08f5 8332face 2b75528b 207446bb fd86f658 27eafcce 1c814ad6 5868fdae
+    49aeb845 c12df850 73363fed 028c7a08 635419c0 0e13dc1e c23302c3 3ab41aa2
+    a36de2c9 431e6647 de006e8a 79538ed5 222a4bd8 6c81e500 b32208b4 66269fbf
+    bba23ab4 db5b0fea d2f063fe 63b4488f 0bc71b69 f9320d97 96315716 738802a4
+    4198a74a c0ab9539 90a1008c aaffb964 998c9b70 2c24ec00 f6bcaed7 fbae50f5
+    37fa38d7 6aa58b79 5e000648 d4d124c5 8cebc2f1 74
+h = 47ad5bf4 f0cd6127
+
+k = af0095ac b87d2603 569feb36 e1b53525
+m = 7f369f79 e75162e5 c161c5cf d712af08 0207511c 178793f6 77ea459b 5cae3acf
+    6d8605bd 029e5bd1 2080896b ddcf269b dac8b265 1e7ec324 28506ae0 b6c1392a
+    1869e3d1 32db780c e1d29d10 67b6c79e fff2d6bd e2bbc9f7 313df8bf 9e9dd246
+    bb037089 c4aaa470 0d1b9e85 bf0e32df 2cd92595 8f3f7d7d 25f82601 c5fa7524
+    42d23959 a7becf08 4c8616e4 e7cc7642 97284c4f 75f5c3a2 1ff0a4d8 a0e5e4b1
+    70060223 849024d8 87693b4d 5065a079 4e635428 d6da536e 0840e930 9f63cd93
+    1fe0f1e0 db58b013 ee4ef5ff a5524093 0d914d92 031b52d5 c7bc09b1 5452c59c
+    ea75395e 191ed106 633e586b 03cb001c 69ad7c71 ace83793 cd0a8b90 09065a49
+    89200eae adec886b 292e452c 7f9dacb1 64261959 cad115d3 56ab7765 a7f56ee4
+    7e694e6e 07f21edf 3ee7a095 47a764dc 6b627a01 b1e22acf c6f70c06 34bcc380
+    f369b232 d5b9c0cf 9dd0f7ea 1501ed88 63082a6e 30f15435 d2a3f8d5 26266fb0
+    830cf9f5 023c9f08 d75fde6d b4282d25 1b60f528 d1cba56b 950e172f b18086d9
+    062008fd b0fcd828 20b89d56 4696984e 5efe9a48 7dd7190b da117455 3988ec4c
+    958f3c4c 30c7f23c 8b763413 9c6ba8b3 3d6f9f2b 3df97fa1 4982a5cd 78cccfed
+    10fa03b5 d43391f1 796a310f 0d03ccfe e557ac2b 61514a87 1a5c8309 0c6ef77f
+    14b09345 7b8066ac 5537de73 65968fde 0bea52fa de970488 7cecd8b7 d1b26e15
+    6fcbdb66 9dd65081 ffe13b76 6a7c9a60 5e6851a4 492541b6 45c448b1 6db1559d
+    941aa2b7 4d71b349 5dbdd5dc 642f81c4 5c9d5ad4 0dd1903d 5773bc43 7ea5fae7
+    5ef29ca6 7e79e10d 81a74172 ba0d0f77 2cf4d927 270f6487 72eb10fd 6a2cedb2
+    5b192568 aacd7279 4d977be4 34fc8672 f2e5bd9b 6bbbccae 379e3756 c2829946
+    05ba0c91 1dceab5e a427e1f1 c28e4936 7430b800 b7546ff8 01732079 2f49319d
+    c6588fff 9871811c 69a665a1 ad3d24d1 d534d117 81a099d7 8e3559a7 5b63b621
+    ca684c7b 66b60eb0 57bc6a5d b99fd5b6 80081217 6790015b 8bdc2370 20100b9a
+    6d051d04 545661d3 5683e368 78511432 ed3a2a53 d3b8220f 97caba4b ed35c7a0
+    5f5ffb07 bb3cda83 41fa050d 079a8639 08236ed2 3274fbbc 4df7ea69 24534641
+    a394c932 3c34f2fe ed4c1f04 f95c5075 e261eb92 cb90
+h = 0214765b 94f63f46
+
+k = c0282b07 1584c453 8df56a8c 2633e5f7
+m = 18972ccb e714e810 316a616e b48d2c10 834685f0 bfd88ba0 57e58a34 7807d7e5
+    5eb79263 d568a63b 1d0293e2 3b04906e 6ca2b0bb 18106e31 724b8cd2 2aa6a53f
+    bfe81ee6 aec44dd8 39935538 409605dc 8aebbf5c c908f438 855f12ad b052d9b6
+    6064d7d9 bde2c9ce 4ef52e85 ef7a3397 ceddd5e5 5206bff7 8444d186 d8cd3c0c
+    a89551ca 27d7f927 99ff1b77 d35c07a0 c6743bf5 a0053ccd 643180db 16fd54f0
+    3d2183e7 47c5e4b6 24e9f0cb 9e647d62 9f08c911 c855451b ce40064b 32dce129
+    a0e88812 6b23ae2a 008bb0d3 6c4c2ed0 34fd3af3 9863d5b9 5c864ad0 593dc433
+    a824a070 2d726a86 2bf95ac5 c8910e54 53b8fe2c e0096525 44c11ef0 053e25ac
+    de593cf0 f8860521 ef49909f 1afa5a82 d7d5fa4b bf54ae35 65f7e52d 9e5e1dd0
+    3c8fbca4 18dff00d 08e159e7 7d774ae5 31825517 385ded2c 84bf6c1d ee788b7a
+    89281728 9a398725 d90b4e49 feff9445 f7866f43 dd9905d8 006e942f 453a578f
+    50eb6d55 935ce144 75928ebe b913063b 50065922 45761685 4a59d587 2d4ada25
+    7b8ffa9e 2d41a334 ca7be64a 013be0c6 ced168b3 d9bfb4d5 7e752f49 e631e1c8
+    4101f886 11c87c02 43992af2 4caf0236 cca75ee3 8ca2df6f 1a58e1a3 d3507d8b
+    7b7d80c0 eed0f4cb 03f29bf5 54446633 1f09a5e1 caa06ddf 572383a0 c618df5a
+    5fc4aa95 76d94ab1 470f724c 9933ad92 92e82fbc 6fbb5636 1e4f1a8b c326eac5
+    90cc92aa 43ca2de6 de06f729 15b3c1a3 fda8ca97 40802af0 b976b682 df012bcf
+    3a91f249 76864c2e 192ecc77 de53d246 635d05d6 c3cda299 94796a2e 924eb3f3
+    43d73c3c b37e7686 3251bf4f ce9e9010 65eeea29 92b2725b 8ae82d5e 2fd13e27
+    0bf2c457 ffd1a4f1 16049e9a 7edaac15 4a626ec6 9b3e90b9 dfcf63e2 1f0df2aa
+    431e4d8c 9e8acf83 3c5b83b5 3be62a00 cb38f3de 9e5d1146 15ef55ea 453a4eb2
+    897ede8b ac62ac45 ccab46a7 99dfc067 9032c447 96004192 330b7f22 30541647
+    27aa2e79 1acaf9b5 358a272d 0b9af080 9fcf06f5 3804ec07 79536460 ce31772c
+    fbf7751f d8b64a3c 5bfb2407 85d00b91 2a152ac1 084f70c5 307931b2 b72aaf5c
+    6acc60e2 a9909b4e 989e528e 02209495 03391292 87b7de18 eb7604da 7dbcfd49
+    643c4275 438755db a0463b1e 6b3eacdd 3182eb6f 67e9de
+h = 604d3d29 f7e197bb
+
+k = 0ae2314a 54bc99e1 2712524a 4077c122
+m = bd802b75 a95588bf 8425b6eb 070210da c5c2cc0b daa1d90d 3037349d 146c8260
+    218bfa3f 703962ee 7d195a03 2f12de76 4e9c9505 2940ef65 bce977af 50fb3664
+    efab2753 f78505c8 de43e660 fd560983 8ad1d78f f7846b61 445401cb 6db0a1c2
+    436b5552 581bf1a6 70f1b3cb 34fc5a55 05a4ccbc fb0057b8 edefd816 6e05de1e
+    4bee214e 050f1ad6 c61de22b ce9f8f41 0b218cc4 f3b774f9 b328be10 51715722
+    8acb2322 65668cef ba783f24 e7631d99 cfe2bc85 fa4fd706 f41b091c 993e5508
+    c3827725 f2a47ef1 047b3def 67fa34d6 a569a1b3 0f9e57fb 0a0cbef9 3c940f14
+    48485051 a1878ae5 c8e8251d c0520d96 fa04d5cd c20ae271 7674d436 ab7f275a
+    2379ac0e 0ea889c8 f623c745 5d27d83d aa4d068d 828acf1e 00d9d82e 31ffb55f
+    f544a6d3 df7afdf7 80f521fc e3bcf8cc 3d68f013 9e081455 f3c4f09c ce8f66af
+    377d40eb fb8a51fb 6e94da56 95adb2ae 8ecac92c c06c8a39 889c1b34 61fa8789
+    e63693c7 b99770c1 f063bf58 c1c21ece 4e13b176 7827e907 a382f4af 0622b643
+    f4195cb9 64a3879f b33c84b5 bf08bef5 86ef4b36 e8d25d99 cfbdfce6 1e93c72c
+    7f6f1ed1 c3c510cb 3a8956a1 cecac2dd 5099f00e 1aba662b bf6b9f86 f89e720b
+    f2557a62 576062c8 3a92a2cb 7187a488 0feb945e f4b367d0 57bfd670 c87d72ef
+    15f5ca8f b7e9ee6d 33a88b51 6b38c500 25387a3d f15675ff 98e60b1b 05aff1b2
+    e8360c96 bd2da322 ce3c9514 3ea4815b 42e492b5 b461a855 2066c97c f05160c4
+    86bf4e2e 54d494c8 0e568721 8fee9294 b45efe3f c2e34692 1f013f45 692763ac
+    f6022784 6253dc0e f8629b24 36e9646f 76a91d9a a995a0a1 93669f54 c05bf24f
+    132647e6 c3323603 8d454304 74ffbf29 cd8a3c83 72917fbd 6d24b32e 4cef5dea
+    59d488d8 35437749 e3522e6f acf9cad9 4fee0c36 bbfcae53 78b55f0a 0b8cf2e4
+    76206f68 3f2fd723 443c7094 fa460bc7 c0f8c1f0 7ef70355 9e6f553c 4ac8f77b
+    f9c4c7d7 7ad8ed0f 401f5ab2 c649589c 0f43a27e 96c152df 58936657 75a46a9e
+    d8731c0b b08fbce2 3465e524 bdb40320 35f286fc e9a512e0 75b2b5ea 93bedc02
+    c4a89c8b 0a890d07 9faaeedd 1b1b8ce1 70bac1b4 a32720aa a1585e4c 8ace7d0b
+    092ad5b5 e08894e8 a8ba2f8c 55d8b468 9ec8f83f 9fc96b58
+h = b2639041 5ab17517
+
+k = ae68c820 39cc3ae3 665b374b cbe4780a
+m = 89ffdcff 7543d950 ed9e49ca cec70094 0545d1d9 ec37fbb7 43cc35d9 3ef08f1d
+    59685720 1c126a2d 8f00de56 68aee4ab 56b160c9 1115fde7 fc8302de 1edf216b
+    e361c8b1 8f00a4ea 4c0c6f6a 97bb1822 81a8b407 badac85d dc2520bc 4de1d9e2
+    194ca2b3 ff7584be 66c9467e 55ad625c a62d735d d548bb85 3d542e9c 0e9a5173
+    7e40c9e9 a938b2f9 b9d9adc8 26466ba5 8cdd088a 82d710aa 65ce9573 1a995f33
+    bb498f21 ed97f26b 85581919 219f5a0d d3c33b30 86d4765a 1dfc6364 3d55fab0
+    497c68bb b5b7f594 2913d390 7f427997 73a67d2a 4b47bb1b 1c9c1820 585f8fc6
+    57f70f0b f0c0a766 ec3cf850 d63fa1e8 53f9cac5 38e0665c 332f086e 527eee28
+    1e80fd2e d05f545a 277f75e3 2699505c f5048d58 6990489e fdc749f0 f6420fd8
+    99a86efe 8f180b21 24452742 b7bf9533 45d0ca5f 46dc44ba aaa017e1 13404ff2
+    bf79aa8e 281d39d0 8868227f a33ba907 b4486a0f 79a25c85 036e87fc b2346ace
+    a652d18c 3b8eedcc 9e2d9945 41509857 e7b15432 bb2cc1df 1d012a2b 9d57fb78
+    a7076b21 4e5f72ae a392d34f c4e1d916 c8b694f0 24189af0 7aa4325e 730f873a
+    e2ae2d7e 1d57dcb9 78910902 ac521c15 722042f6 812f6e25 7a6ffbda 802eb8d1
+    bce715fc 7a8f2cb2 c625fe33 c86f5a0d 9eb351d3 d6788a2c a4ae5322 adeb1888
+    a0b41305 8128ed31 afe905b0 d2b307b9 914a9b98 92463c08 26f4f825 184115db
+    4526c595 84294d2e 36a497ff 01ded9b5 bc051689 4d1d83c8 c81bbb3d c5ea2f29
+    6b96ff76 342e08a0 b0190773 a16cf54e 824d3843 ec10ce02 2f1087f7 ac8aa4ed
+    deb9fe40 783f246d 6341809b c92d1870 d2c7b85a fc5f012c 4d7511b8 7b789c0c
+    bacff8f8 9a30e7bd aa825da6 d6be6c42 2182e4e5 a51a2144 f09e4017 a3a6982d
+    a5b389cd 7007de2a 5edf7689 5d3af20a 9628e5ea 6d3f73f0 f0e9df2d 6843b51b
+    e77a2ef7 5d4478c2 583b9526 39f2b333 13b217f0 f4a65928 16539f65 01c29551
+    87bdbdf6 e359b188 eee2c5da 2aff5a0e 3dee63a2 9b945f71 1644613a a280bb1f
+    f6118343 02bef3af 8f7f6817 154ab23d 2e60c7cc 05dd5b94 2f9c7777 a1837211
+    5a64c6a5 b3ec4e17 44e6a02d 60fbdf30 febace13 ef0ecef2 9b66a1c1 8e20d0a7
+    8d2115f2 251ecd75 71d64b42 72107768 31ec8815 95889002 27
+h = 6d619f73 1fa63381
+
+k = 2154cd0a 169f8b91 11befb66 29a0aac7
+m = 2af4147b c28fdd19 136d6790 7d5135d0 d51df5d6 2b712651 741a13ba a01c8d53
+    3718a650 df922728 6215d2b8 6534e12c 30171ab4 f8edf265 0d55dfcf beaebd01
+    a9d5a9f2 ad991561 e163f148 efa7cac0 4d794aeb 031b4e74 c9a48886 35859e64
+    34bc77d2 293dfb11 8be5aa83 14eb1378 1114811b 6ff4be2b b3dc1888 09cb92a2
+    4398c307 c03bd384 5b39811e 1a36927d 3067075c b3c028b9 8cc5e73a ca19407c
+    44896bcc 6b62e091 fcaedba2 f13092c2 df3b998b 69680d80 18c555dd feae6155
+    1e78de0e 1f3a0fa8 d6310c57 d24e76a4 2d699c73 8c355c78 be83dd24 d60a1b2a
+    32aae4eb 0bf5edf4 e6a2ad48 390cc4b2 0381f8b8 8fced745 386f2f57 984d58ea
+    361c979e e5c39201 e1543366 a94e7b45 f4e1c50a 76bcf3c1 00faeca4 7fb95feb
+    5d1c1552 27d24228 4b821707 0aa19b26 589ac8be f84165c9 043fc635 4e970d3e
+    a4ed9aed 5c72119e 33bd364c beb0d63c d6450b00 7a654782 32ebe1f6 072d26bd
+    0a104de1 0dee73a3 3a5cfe36 c7195264 7883246e f09033ca cdbc47d3 898e2f0a
+    7d4f392c d5ed3c72 e613e493 f6a821ff 9a14a760 8692a130 a01996fe aca36ee4
+    1aef7cd7 1a490e1f 58d000fa 9fad9357 b12c9cb7 9cf32022 e628b312 36dd068a
+    4f553dc5 bd51d7e7 64298d8d 2fba2fbc 1a59200d 52b0bd1d fad5d193 ea8262ee
+    454a4677 044ec56f 3e7c99bd a7fc79b4 63d521d0 d3139bbd 488070c4 c5ebb35d
+    91c4d9c2 c4017bca f82d99f2 77c7c825 00bc299a cb69dc50 1a1e03ae 3876a20d
+    5560c0b4 59a044b5 b4aeaefe 0f5412f2 12524ced edae1a4e 5471ad36 8a51439b
+    519126a8 1f4a4cff abff2612 9a69bd5e b6b92eb8 385d468b 1d7679f1 b058284f
+    b8ff7489 8801ff86 4f89859e 66a8a4bb 84004dc8 8e265f6c 6a1df6ef 510e8ca6
+    0d389d5e bf8bc6e2 60e45cb4 58acad87 1539fec1 37339732 a8b2f6bb 9b1aec6e
+    6d25b980 e4cd6625 005317a1 83bb716b 0d0e76b0 8cba6a98 e6e7f673 74532340
+    1416ee21 6be04885 dff684b7 9c2a7802 0e3c242e f3878862 32e54711 56ee9460
+    2fc83bd0 82de9548 a858215d 28356b26 341217ee 8c107a1a 95e17d7d 4a36c4dd
+    4b296713 e4e1ef11 f3f362f6 b9af52f4 702dc8de 5b0eec7a 47424685 d8e6d5e7
+    aacd41fe 81512b4b 1f1a2e85 689d259c 2ad32097 fb87b8ed 7b88
+h = b82fafb5 d9a9d32c
+
+k = 5c59bf43 de491806 77f85ae2 9957509e
+m = 5abb9798 ff366a90 c8568f4f 84b7854b a1b94f09 82f045de b93328cb bca76db6
+    b0946b26 562bbf31 2f323e64 5cd4fa9c 71ea966d affd645f dddc6213 d3365c91
+    5f89435c 953f0684 3e804b59 32571282 a15849a4 54e6422b 811b5d43 27417aa4
+    10f7fbee 85f5fe67 a48ce989 109f8fd6 c526424c 12a414a1 d132f30a 01cd7b64
+    460fd3cc 1c507659 6c55a173 e17b2366 6cf4c5d8 69212c13 e807d37b cc0fd542
+    fce22766 f9c2bee8 7f8ed249 696a2f6a 8b7b56df 802e772c 176003e0 9f3f50ed
+    6fffe7dd 92f5cca0 624753d9 99f23fd3 75ae70ff b904333c da2a097b ec68ef46
+    14dcee0b 84cffd53 63f3e5f5 bf4fb15a 63d4cafb 4773f148 8437aa5d 8f660e8c
+    61720e35 f5168d60 ef2e0339 53c1f210 2caf5069 85b4905d c85eab27 785ec527
+    ff512dd8 ebf3c514 6708a8a5 952fbab4 e4025c5a b174ef2e f5cdb1ab 2e4b71ca
+    6462b468 48028aa8 cfffa8f7 40b9f5d9 26e7c3b0 e25b10ab 70b77e44 1dcfb4a6
+    ca69d361 d165e634 ed930484 1097ee7e ce9a12bb d3e4d509 d2919e50 f14bc8f1
+    a3faddb5 a0367c41 941acd4b af34c018 cf4218d5 a63e56d0 39c148d9 6b61acb1
+    f5fa84f2 df71b99e fa6f6f65 4a221516 1c5e92f4 05de7ea1 5e40e2f0 c9421f91
+    3fdd1862 08be53e3 3cd7b213 9ad2e44f 9d065f18 2a1eb1c0 c8d0d7dc a8615560
+    2e7837a5 0e01b58a 3c954a1a 927a0224 df038421 3af5b605 2e3cab9a 581eeb79
+    bede0fc6 f902c1b1 96082c29 27726bf2 84f7bf6e 53ad44a0 fa5d4ed2 7261fb8c
+    ca1b1a02 eb83c81f 3d9cf112 40644f66 c877c2ac b86839c5 d2a351a5 a7d3022e
+    c677a8a6 1395cf42 bb60a210 8ffd84e1 94e2e20e 7fafa33a cb023190 6c31f7d0
+    b07c60e4 093abe43 1daf35d9 cb3b2092 0d7800aa cbf44b62 d892c0eb 0b81a9d7
+    236aeae7 1fa879c9 878a6e60 e1c54f02 4b7caca2 fc03e7ba 4c56ef0e d04f8d6b
+    9a7fad74 56f75924 c2056c92 0739692a 92ba6f6d 3f128d15 a23c237f 30a2b540
+    b3e22e0d 766131ac d264d7a2 bf9319b2 a9a551c8 587f117e e3e1bf05 0d0b2799
+    b2591da9 f129dc78 a653d1bf 16dbe7fe 3f6c8208 62a6f48d 53ee3086 19dbe9b0
+    3fc96848 434fdd3a 10706776 ff07f93a 86f47130 a9a80e30 8f6bf393 e74c3aa4
+    44340846 28805f5a 67f0369e 4835a8c0 e0cd1b12 8fb9fe71 31eb07
+h = 3dc959db 5281f7e1
+
+k = 1b5f03e9 7a402d74 26ac78d5 44cd479f
+m = 65d836b5 ef9d8d81 b1f17913 11664ea1 cf5ecfba 85263676 71c76ead 8503d36e
+    eead9a1e 1007e45c 3af772d8 4ec18c40 2f0c188b 32d6f56c c60ffae8 c4fa7eb8
+    0bdd5a82 e43a36a0 8c89b7c4 94e1d89e 4ddf0176 0841783d 2feca827 0b6a8202
+    da75c436 9b7b363e a09fcb23 5708103c e0cb8654 61902fdc 4a339c33 bd3f7e76
+    ea1efe24 7a62c609 ffec7f74 7cd02ef5 4c062778 df50ab21 a55a0bc0 130b25bb
+    a4cac4cf 50fc20cb 258ea55c 2dfd7581 2b838c2e 5fc9b64b cc07ae6f 6338e1c0
+    ffcd4920 3150beda 1d3587d5 0fdfc0b8 d6885657 afb1b72a 17f7afb1 f98a30ca
+    b9e0cf9a ab18da29 dd72b0fb 36600f29 3997f653 3333b767 5c2f1d9f f3944e97
+    fa071319 97bd62e3 c9b73405 d9b9ae29 862cc57e 1a6a3b33 43686ef6 3f45bd98
+    095652b0 7fae1bc1 23d71933 940d5b57 21785c75 69bc4e04 856aa7e7 83eadb19
+    879c7bbb d6fc33df afb628ad ccf02d6e 4a08bf60 5edd8c2b bb5007a0 f7d8ef68
+    ed7ba70c 9b5aeeb1 83c4cd08 f597b469 67da6590 bab53160 4eb683d6 2cce4f1a
+    6693050e a6e6ac96 adea1289 088d10ac 817e126b 828836b0 ab9a7532 31392400
+    1eed523c f23bfdaa 4e5700d0 f4f77d6c 42b4e9fb ae5edb30 ef90eeb6 f831fda0
+    4128a776 ca056f9e 82105568 c98c7fb7 170462a1 80ee31bb b73d6cd3 023465e3
+    c427b179 93a1fffa 2b973e2e f52c7897 537574f4 1290165a 5855f449 d34e8487
+    d45323c3 b4827dd7 4831be53 1cddfddd 3d8fbdbc d47efcca c1779f63 921c7caf
+    98ae3176 19ce8c06 9fb1da85 5dd5679d 47e385b6 d63f695e 37cf9642 98e2fe9c
+    dd7ba4fe 660c9010 67ccf2ba 4c56820e 2a76252b e1c74239 1aabc310 91fe6bb3
+    97ae38e5 d68831b2 d0c3d031 9438d133 c11eb53a c95aef27 34bbdef6 e9b4ff5e
+    e6316d97 871773ac 7f2fa671 f028b398 f0817ca8 0f447765 e8121c1b a067301b
+    ed88d662 a50b0e4f 82930635 6f8108e3 3bd3ced0 9c8b0eb1 8f6c3245 0ac6ab2b
+    1599a684 0ce17241 5907e0be a9f1e9d7 816cfbf1 a5c55c0a 334a458f ef9dc5cb
+    0c4ce005 aa5a762b ff162f9b 440a2c77 5e76ebed 8b3c5f7f ff2b42e4 ec45128b
+    e93237d8 02500eb2 5e12b9e2 581ab7c3 e7957554 7214a82c fc02edf1 e4caef83
+    50600cf0 42816811 9e3ed77c cd56a559 6cb25ad5 69a38fe7 1bee6604
+h = 85065f26 05980da0
+
+k = 3a1d452c 948615c9 32202dfc 2388add5
+m = 8a541407 f5911af4 451b1679 736bf9e7 be9a5eea 1cefd425 98504073 93cae360
+    70dd67d2 bc597408 177ba465 5c143dfc 5dc19baf caeb37f1 cd091d8f 6df31c8b
+    91d695cd 7d9ea89e e238eae8 36188e2e 4ba1178c 4723c546 ec71d11a cc574717
+    a976d230 7dbb6f9c f5a620c9 e6bc0adb a051ecc0 90489e0c c76421c5 307c7865
+    05c538e9 a194c641 5c776345 d0738fd6 fd6a5e7b 0b025653 d3497e22 680b23a1
+    ad323283 f1eb7543 26a4c737 a0d1e155 3663535a 212220f4 499343a4 3bb05aa2
+    6dff5c81 2809b044 73f95db2 1fbeb76f 880799aa 09b1eb94 cf5a2e75 cea50a0b
+    1678a9ae b922747f 2286a3d4 961da972 ee48949c 2c5913a7 78acd1c7 8b909bf3
+    8a8ce504 b195675c fd0f6f66 080f1b8a a61e3997 a02c98c7 17255d94 05483493
+    e69c6061 eed4ae70 c080d733 0b8a9f9f e03ea0f0 cdc1ef72 f92e5c6a f679e663
+    065197c3 17cd2d04 2bb82202 2f80cb3f e2919b50 96114a89 531be94d 9f3b69fa
+    51605c7c ea2c1947 213db312 feb06284 4cfdf6b9 4645550c 5c939adb 76078e80
+    3978bb99 97eae69d b895b6de 1164274c ac01d6b7 53e5311c 94d8674f 62265edb
+    73a7fd93 bfa2084f 260e9b57 ecc92fd6 57373262 212ad111 8a342513 aca920b4
+    c8503991 2a68a82a 6dc41c98 36f5b8fd 855bbe12 9132b567 fbada988 b185fe61
+    60e6fe87 12de4a26 02c7b55b e6be8de1 adcafa26 87398b92 6305744e b2bda0dd
+    f5303c42 f5f75e63 06ab6f3e fb67ab75 469633c5 c7b86da3 11c5b095 11285f50
+    ff1d96d8 0ccd30b2 835335a4 200c3da0 72b7ab3c 102ead16 6a165135 0fd6a790
+    6a182be4 a910d4c1 06cc99d3 d57bcf57 ced813f2 6b53bc6b 19881019 d20c3e42
+    7df028ae 34abfe36 e4a68f23 f468302d f6949dcf a21ac1df 56e7daf6 cbbf13ee
+    5af26c80 628f889d 55076bdb 0ca243fb 4dfaa5ac e2112232 eaf0036e abf13d9c
+    d96c4d57 7f70ac01 b1ab2c27 697ece07 5d396459 f2e2cc17 de8f5fd1 eefe1355
+    5ca324db cf3fb055 d65b7327 59ca983b 3bf4b717 cf818866 4231910f 24273454
+    7dcd23a3 b6bce82a 0106f36d c0661b65 e0144d6f 6054e759 da6dea09 7f092a26
+    21d5081f f9004aa8 84d798d4 776a4650 fd314f4c fc4f4ffb f7b6d46c b33935b9
+    e8cd705d 279e7010 bd8f7fa5 b5a6b5de b94958ef f8af33ee 4c19c7c8 84
+h = 9c065415 8f96f1c7
+
+k = fea0ecd3 0ffdaf66 5457f5d4 31d3a95a
+m = 191bb6b5 461a8cc3 b8abc516 9908cce9 49ea2668 8f209e7b 33a28a12 cb82d5a1
+    6b737780 4bd3230b 4f662110 6371d9df d6975bbb d7e4467e 33b8487b 429178e3
+    125366b1 d5972e73 0aca1dd2 4ee31e32 9fcd69ef c1805309 c915894e 47654a0e
+    fd990ad6 72c6a86e 6058d7df c2645664 a3317871 fc2362d1 39a0b1a5 7b19154c
+    0b39d27d b69604f1 f91c05d8 f213f423 136d05da d562b0df 63e2e59d 0f6b8aea
+    0ef6e97a afa04f7b 4288b73a e7074aa5 cb525eb6 e5c9966c 9623000c 0b94493e
+    8dc7e640 1d221be1 046b3d6e fae67704 e965e9a1 c7233dbf 89d331bd b4224df0
+    5e28bf94 d1078c11 4efebb02 282445b5 1367b119 fa510aac 49ea1cd5 8b21e85c
+    4118af2b b12009f4 1a194ea5 132b4fb6 ead8cd87 c020a1c5 a7b4ff31 38d3a084
+    8037e246 56bfe31b 07a1c1ae d9406c5a 58e0fec6 06fd02c8 063a5c60 6b0891a8
+    70405158 62aa6442 0298f13c 80974ff7 c2311b6a f8596e71 a77a459b 7dbeff88
+    67b90a14 e307346c 09f10822 1d8ff3b0 d3157447 1fe56003 1cdd580d a3aaa858
+    bd8fff2d 6c0e1706 90d8fb52 d195de57 0d16ae20 8a431954 63062095 373245d3
+    758b7ab8 1dc3b565 065c80df 7d2a43e6 26e9ec00 a2491d64 fc0a38e4 351938e1
+    0ff56679 8b05ec42 cf3d0a0c 106f72d3 0bc9a312 be39d263 7b80a8da ab9483af
+    51b5776e 772b5eef aa914c18 396ad648 ebcca7d7 869dea9d ff33f5ba 0860ef94
+    7ee4470d 97793c6c 9271d852 6a29ddc2 80a3bd1a 3321a17f 51f0e2c9 c43b70ad
+    3bc08252 081e5f1a b45e6521 da5ca6e5 8b39c460 bd3c3b40 2b0265fb 3f4d6a30
+    c08c856c bb35e148 d3bcc47e 13576a3b 2436b6c4 0cfb1495 1be61e5b e8484981
+    d831a5a4 cd2f0ea8 2671ed8b 68b5cc0f 1e1cd516 356a0a4f b01dfb16 b10aef64
+    67066252 6be94216 99d78353 13392a99 0b6fb87b 84f26b68 633a9d17 5a514da5
+    0695222e f51a448c 472dbe41 1fe8361f 03e1999d e74922ed 92521796 8c6c849c
+    6380f1de 0abe6964 0ad24e01 4143862f 5aa9b638 bc8b29e2 f02a733b 12ad6c56
+    2e2a5c6a 1e1d12de 2ecc30d1 bc375d14 40332fce 523196fa 7bc93e73 cc19ee01
+    5c777d05 c64cfcb4 9e536edb 644c93f6 ee49452d bc6735f9 06a3e849 036c5088
+    8ee30c02 56ca1c49 67d676af 7f616dfd adf21e06 64c7509a 6e29e3bd 6234
+h = 610cf09c ac443ec4
+
+k = 5d90b8c3 5140b00d e7002215 a7a65368
+m = e886ec64 de1c590f 33c6e2b4 1c36a14b aaacdb17 6c8d40d8 b436f3fe eb531c2b
+    d03f7717 77388d12 a429f81a 99f7d06f 14dae1e0 ba8fc594 a78dbd31 25df89b2
+    e4382b08 cc464bf1 06156843 bc632f85 e5112f02 6fc5de3e c8bece85 7e384ef3
+    41396149 19a915ce 53c88967 9e58d2f0 fbfc3633 6d9acc6f 378b00c9 4bd2294f
+    e7a88eb3 881366c5 c9f4471e f5b53f27 0edb8a55 9dccc90e 97b214ee 5d866ce2
+    cab3ca28 7a798b64 d0a7f105 ab692aca 98c36011 44a272d9 11b9c221 21a56171
+    910959fd b3cbdc50 ae8cd903 6b2557b9 dc672100 f5f91616 395b7e02 f4398ff0
+    badaa6e2 6b20ec17 0e069747 f589c738 94964d2c 038bdab3 f284f627 3b2b4d91
+    1a9cbd36 9019474e a151e700 d9690f3c 1d002335 781b0b72 ad926b31 9fa352f3
+    9f4eb222 2347bfb0 36722603 e798e6de 433ade0a 17cae55a 0eb58427 9509c10c
+    82790132 341567d5 6c9edd76 9d869b20 bdef1aa5 5f11c4dd 1cc69902 4a3cffaf
+    ef5474da d8be939c 953e4c11 b6059eb8 f3cb5f1b 7aa6b6c5 33beeab2 7f7af899
+    f718bd70 de47fa1a 8412b9f8 f28e1381 70395b40 34724668 65751209 de438e39
+    d0ccd380 76042c7e 5e202817 386b2837 20d8df71 f3445f01 39b5b333 a43d8030
+    4fe8141d 5b993c16 9fb57797 299b577f 26aaaa2c d8b7cd72 60e84ebb c8d468cd
+    d5e439c3 f215ad4a 86ebd583 50ca463c 853e672c 666d6797 709e3e00 85ea205a
+    79d5d7c6 5b0808b8 c0e3d5c6 a8f50f40 9c0226b0 ad7d7ff8 c29f0423 aebd678c
+    ff0ff02d a021f647 14c60206 9a17130c 6aeb976d 2449f4b1 8b973a9a d781e9a0
+    fff20c93 8f5e60ce de3d1790 42911660 a5c8d5c9 96e42667 5aec0e47 d5211697
+    704f57bd 577f5fdc c3c47dab ed99a916 e69ef304 70c60d17 ccfc0fbb 5bfb3448
+    943f865d 7e4caf48 1a692b98 64c7ee14 317f40cc b6e701ac 1354cb14 0ee54ec8
+    820debb5 bf03d925 21a8e55f 7e307fc4 7b74eb4f 4d5fb066 e9f77023 ad72be11
+    c10eb239 9bc63f2b d69f6632 f26fab87 f93edef6 aac99275 538d14c3 b0eb80d8
+    501ad867 cd7ce7bf da76e77e 70201cee 854ad16d c3ea4495 5d847469 5dfba146
+    dd130179 9b7f52fb e52f78ea f53503ea 7c978194 e05476a6 c71b6b6c 2a09028a
+    01167edc cea38e60 21d55609 cf62ee4c 3f8ec27b 386e262c 7d667f02 d791cb
+h = ed8339aa a112458f
+
+k = 69ea3301 699f4e4d c809f849 2eab1a71
+m = 655f30dd d893f689 3d3ac287 775d3165 3449fde4 d3b2f675 08e4f108 f3c83266
+    b6dfa1ea 5201843f 94d1e70c 78f68ab0 f4678ac4 84cd4c8c 755cef48 c40f84b7
+    500b9e44 c73239e6 bb5464d7 7d692943 d3e414b1 7e6375c6 a3e27f46 82d7acc6
+    22f2f296 95f740da 702493a8 79d7ab9c fe07540d 1c990e31 891744d8 afab5639
+    438dceb2 4d6d25ba 0ba9f293 5793fb14 f00c8117 65b3a29d f0952fc6 995a5190
+    bba4b009 eb064a72 4aec14b7 d1310281 1abe672e 9df5d4d4 e9176548 0a35002b
+    460d1993 7beef71d c798a0ab d9d6cff5 411c1458 4e7a5648 90b056a1 b12b315e
+    debe2f14 84e996ce 14524d9d ee22de4e f130978e 085e2cc6 aecfb428 51b7a539
+    9c7baf78 6f97bb1d df56c026 a9965670 47e0792e 87a44ed8 88c5f3b4 3d2d6ddc
+    b0db13ce 33666fa4 18df0b0d a0c59e8c 2f083965 808aef2d a26e792e f4baa2e8
+    bab2c097 221f78fc 1c0e53df c279b23f 6163aeea 0c32b51a de464ad5 f12a4a69
+    c2a1152c 8e715116 47a457ba 91337d5a b20b1beb 1b9f8b5c 240d033a bd07aa3b
+    88fc20b6 bd6554bf 618bf49e 37a7a9af 2820c4a2 e81cdc13 db7e6fc2 43ad0b31
+    1899245a f8f93f88 542c06db ccd8efc5 3e782165 1509a892 7af82622 12271fcb
+    dbf46d06 42b7012c 6c5dd4e3 79310a4c efe3ae06 fec42d53 5917b10d 50322cc7
+    a2568628 d60b31d3 0a0d1d44 15bee2bc 94930b1f e3207550 465bdcab 52349ab0
+    3e0866c9 ea180389 247f962e a97d3e01 d3f4a6d2 a31f6e80 8e41cc9b 23421806
+    ea9bd8da c67789b2 d650b2d8 2db4b18d 65e0960b ae2dd0ac 19c48729 ba512aea
+    992b4ee8 c5c37fdc e223985b caf517f3 4264ad04 8ba5ebce 971a1cfa b993a5c6
+    b815eeb4 515467a1 2a640085 200a2683 df79166a 0f65ec52 a64cef26 a228a1f7
+    1be54544 3f13ef31 272173d6 55ed5614 534110dc b1b383ce 01bfe679 cf53ce68
+    64ce0fac cea7f712 3fdbead3 04022994 27c028b7 f8c2460c 0377c2f4 1bc4b82a
+    5b55978f 85969263 b0d1c17c 3640cbf6 39607ab3 48908b4b f0d4b5b5 0febcfdb
+    150e5ef3 d942a4a7 27144dc6 6fd5e18b 86e80e97 5ead9835 385c786b b6e2af14
+    077982dc dda10ed3 d81e5a84 33cb7d1d 325c7576 060deb80 5b558ed5 5c7cede1
+    d6b5eb1d ef2f91a9 aefa9319 b214a543 7654a624 695d8271 2fe64d4e 40d3218d
+h = ff985ba7 6c094324
+
+k = 343ee2a2 c105f272 63a3b47d b09da84d
+m = 2136ef38 08347295 e0c08075 235a17f4 cb0cfdc9 08d50140 40a04fff a5d38a1f
+    b0a11081 9b2849bd 0ecfa82c ff31a00b f56ed772 a5810a83 1978f949 8fef9f69
+    d341fcf5 47139566 3b3a5d0c bb8af422 b0792c71 6cb71eea 910c0759 df14dd3a
+    1fc335cc ed31ed6d 3d06279d b6eee82d 712b1368 96c50a9b 83d0c741 9a7e99fb
+    787459ce a6c2ca44 8bbfb21a 06b2f046 3f4439fd 7f335a36 939e256e 0f1880dd
+    ad16b0cd 3c7f0079 a39ed7cf dfe390cb c813b60b 618d5b50 4037f868 0240c393
+    70e98d0a c16cec62 3b9c8bbb 3200a8ae 5637d677 53fa2b9f 32b304ff 3cc6a96b
+    eba21deb 5402af87 b41cd03c b825eabf 3543e9e6 2cba3389 bf0b3ea4 69ccb66c
+    70a5d342 98d44387 45e2b192 ca25bf8a 11246ad8 30497296 3c484184 7108b644
+    450c1097 3536f678 254a9fbc 442326c0 6365911c 81cf0156 f9412ecc 6dc6c736
+    15d64353 ebba0f1f 2e26a264 f8c88d72 dfe9044b 77362469 a7928c37 c3193f8a
+    e6d45d1d 3db007af 406ad764 1f6e2681 92656714 8ac2190c a2b30935 660ec7ab
+    825c811a cc2997b1 d34c5d27 ef6ce48e 180466ef 05be2fe2 b70bca49 5b64ee90
+    272f50e8 0ab8da18 730635e4 6101be71 8be59ae3 95bda272 02308158 58dd303f
+    aa5035e4 6787245e 1075bca5 9d00d398 80e4bddf 84807615 333aadb9 0bf98c09
+    9a9ca202 5328f562 41e66e7a 639de633 fde454b8 e05d39e2 76b1a0a3 c83a65fb
+    7c3507cc 2fea8e54 6dc7f8bb eb95d3f5 0df3170c 21180376 8755c1ed d2397c00
+    f968ec12 3459c9ca 4d24146a ea9b6016 0375dc86 1650f716 1ae6da5d 0abff01a
+    275f4733 c4ac2420 b890fa0c 74063051 79d49ff0 cb92c262 288b69ce a45362c2
+    310c8726 a60b8b5d 272c6350 f006d8b6 69fd861a 3a51ba1d d1ed5e2c 2ab3b917
+    768c86e5 90122565 d1e4b7dc 48385cf8 ae6f204f 8c6ebf85 2955d923 60b4fcdc
+    7ac6e67a 8fbfd843 5733a60d 1caa4cfd 6107412a cd01e421 334a1ecc 0e438a83
+    0266b81a 16461b21 9d96272e 67eb69cb 6ee44447 4aea3660 35203d4c fd4dd8ce
+    72e2b924 28096019 9b0526bf 23e00e13 ed3e1668 3af2a1db b1c06bed d3b673a6
+    7193544e 9d8042c2 f18c5ee5 aa7bb90e 025dfbfe 45be9a1d 7871ffaf 2f218db6
+    e223a2c1 ceab5b58 f0dc4e13 49d49d64 63c3220b 6fdb2879 35cf6db6 023c2be3
+    0d
+h = 3a5fcfe2 659ce297
+
+k = 9b5ee7aa 3ca2d374 3500ca28 31e27b52
+m = 22336b4e a269262a d6338afd 8a306edd 2b1d8d9d f97fc0e9 674c1d42 9bfd50e9
+    0a8ff7cf 0e910dd8 88481827 dca4953a 03ebb3c5 079114e1 005fb81a 01a7c5c1
+    6183ef6d 181f5265 43805884 ab5e1a9d bea4f066 36128ab5 3c34b4b1 57a48d48
+    6c210259 825b5b97 e007ea71 4daf4d30 2764ccb8 f342bd0a 2449e21e 007dcde5
+    17d510fe 934f6bdb 822a9dd1 bea2d010 ca04b1fd 4071c147 d1b15328 92f93e32
+    9bdccbdc 44c91f4c be9ca7b3 c07faa72 b32c4471 dbf92186 c934080c 9d25d32e
+    a1fb1eac 0b5ad060 151d1bfc 8587987c 856e5f5d 11414c20 ed26b4ff 18218bc1
+    07211bdd 585e6cd6 5e2811e2 9f29e954 0e60aa86 df41608b 3c5dcae7 bfac10dc
+    28668343 9d8169a2 9c066ae0 e5474534 5d20579b 601206f7 7c79555f 69f391ac
+    66d1ad50 9fdb6436 7ad2aaf3 5a352413 841db4fb 1770ae6e 015264fa dbe5356b
+    5ec12e46 ee1a4a61 b38c0f03 bcce76c6 3f4103aa 21230cd1 ebafbf6b b1626f8c
+    ddb6b0dd 5bcee228 5a29f32e a72ca4e7 46ca5ec9 cfe23c55 234bf090 dd17a3fd
+    bdcc511d e271112b ab99330c bd8e90cc a38997dc 23161c3a 74c60c4e fd28ea9b
+    3c642d3e 3c4def3b 65eabee8 56668a05 3bf87126 358f2841 03677e90 c1f5b388
+    eaf57573 ca2b57f4 6793eb5d 517938ca 86d5d485 615367a1 dbab2dff a6269586
+    fe1e12be f8d7cf9b d5325137 348aedb2 eeefaada 7ce896d7 81120c57 80c55fdd
+    a35be025 d1957c68 5c4911b2 0de1528a 5055caf7 9d75050c b848a1f5 fc9df86a
+    fc02a7e7 41423acc 3087489c a08029f2 14580504 a6c05966 1542a6c9 53b85309
+    e36d9cfc a5da477c c0a3ff42 4b606aec 9b6e7a52 5832d6fe 97167f55 dd9f6484
+    89b68e09 69c0a5e6 b5fedf99 09c62de1 fd656b56 f263649c cbe6c58d 8065bc3e
+    1088e9f7 335dc014 3d6ce109 ad48b9cf 1dea8f02 ba4141b8 64c70f34 0da3dc64
+    6327fbe0 59a28b19 047f3f45 084986bb be195b02 116aecb7 07f5c811 0d3df276
+    0759f11e 4a4653b7 5cdc1efa 741e24fb 99aa606d 932ddcc8 836f9c30 de0eb5b2
+    c38e68f0 28055932 4bcc8c4a 66bc051c 72c84053 1682964b 635f95fb 1054d83d
+    f9167a31 f4f73b15 f847f190 22961022 1e53e671 a082c23f b6607961 8256c0a5
+    4c02322a 6edabbb8 04bd359d 8c3b4e01 35f2a545 3478f210 4ace7a6d 0641a94c
+    0cb2
+h = d035100a 5bc2cb96
+
+k = 81353195 7199f6d0 3939e83c 30f0d682
+m = 3e5a7762 ded346f2 c501df57 aa4fb10f 0e32011c 36a186aa 1f75f71e 6aa695a5
+    7e4386a2 ed3a7943 aff47a29 08a92f1e 5e330e2b 99d93dd1 ceeed13f 00078078
+    981f2be4 aadf995c 72cb0a5e 85601d48 abf4243d 5ad3a2be ca28664c 85365741
+    09b90c8a 87a4a31c ab6b9613 c442966e 1bd888ce de643f69 e7355f47 f0661859
+    1dbcabef afe8162b a39961e2 5c90ade8 0ec71d9c 9ef18262 9eb6eb63 51225c05
+    0737e9f2 c9bd6789 50d8b1cf b414c629 ddda8c2f d11d45d6 177b88ab d308a2ef
+    447ffe95 e4962ea9 0e3eedf5 d954537a 61cd7b19 26e4c73d 5614f611 8e2048f7
+    d88f405d fb0a3744 a8ff2a77 2e971cc1 8077d2db 219bf87d f58ab33f 81955e69
+    047c82f8 2c4e2f7d 3ae187ea 1038ca9b e48f78ee fb177384 23221d21 b0feabcc
+    d7476745 57b4fd4d 50763625 b76b50f6 9b8a58d3 c65aca39 748c3c40 7f731913
+    0859f72c d7b37a5f 871dd821 130992da 28565d94 9413a92e 5ef83eb2 da9c52a7
+    6b4a549f b33c7fb5 172c799e d49038b6 59dae7a3 558e68e4 6e9609d9 2ba5553c
+    68f27f1f bcbe825b d5b83eab cf05caa1 e10ebc72 bcb4d08b 09daac4d 75ce38c1
+    89fa5e8b ee6a1435 9526576c 04f3898e bf2ab5ae 36c4c3cf 3f230d53 b043301c
+    7103404c 7f62dcfb 96e48ae5 0c235e59 d79bc15f 9a27d00c 3877d5ca 169ec904
+    04d5642c 8bd8efcd b1e5446c 3033b1e6 6dcf5e24 d63c3031 f82e9eac 8e1b5ea3
+    6d1e1524 8cdba709 f52d032d 0ff9360a 232ece20 8cb6e397 6e36cccb 924c7ef6
+    eb9c4748 84b6ccd1 6458f49f 7b09bb17 d85dfa4d ba8615c9 8c207274 ee08cbea
+    b9e6a720 eaf0f8cc 03847601 0bcd5bf2 2c26dbaa a3e55545 d6dbf36e 6c4e7bcd
+    c9a50cb2 4384d099 9863b723 f45d487b 768c7b29 a2bc7aba 25a4b220 7d459273
+    b93b94c3 15619e49 02e2a37b 4c02fce4 90bc02b2 9bc73b9d 79b37fe3 6e001744
+    207e4ef9 95aafec6 f047e085 aee01801 d3c6d04b 65e119c8 0843a88b dc9babe5
+    cc821e5f 8dce5971 d402d681 5d55bc20 932e62f0 ea5042d5 49024780 e55cdd95
+    4d50249e 0c13a84b d3b2e3d2 cea52964 cbd7a2e1 342fdd2a a201ba03 622b547d
+    42b428f2 02a11745 561258b3 ac32720c 4896e6e6 66b89192 4f749158 bd641e94
+    e951a9b2 765ddb05 416d1cdc eea64ccc ba7fb260 3556d977 6aac6511 f39f1859
+    899de1
+h = 10c11de8 6121bdb1
+
+k = 2c28e696 eab74745 bebf7c3f b56d9a1d
+m = b98a5330 04a61f14 dc578a14 8a95ccf2 b70e1c0e 739d523a b7516665 93cf6471
+    3cc9a727 431838a3 84548223 399eb661 d00d2e34 73cfc359 5a127716 c2782ffb
+    ce44fd29 ed34dea7 ab5781de 65317bcd 275262e6 37871107 96301a53 34a43421
+    3790ccd6 e8e173b5 88d04f27 bd566ffa e0590712 87c95f3e f5d31c2d 32256aaf
+    96bef0e5 b6ec890d 8f29ee2e 5105e32f 3768d1ad a101f67a f62d2140 2c63c05f
+    ceb2fa0f b25965ef cd6de0b3 a5214293 33d1f9d6 01849f70 989b5277 586d1f40
+    6247c939 d41fde52 e9bb1fc8 2005f3a4 4ffc49fa ca1464f6 e2ece52a 9462d974
+    c23587c3 5854cf5d af7a03f9 0f8cc648 11e7ca9e 550f2fed 40f0d25b 4c0dee96
+    36847897 411d7d5f 1b62c03a 9c4c049d 5119c5ba 395c8bc1 1ae440da 5c1f1c1b
+    4052592c c9c5527b f83ccf1f 6cea5a6f ec667eb5 0b2bee55 ae460182 f1fa439e
+    8d858bd8 0a3c0ff3 d786ea5e f374c6a7 df64fa75 507bf117 359c6334 5804f6d3
+    8d5104c7 7108cbaf ae11d5f6 b136301a a29489ac 850dd1f0 74e716b1 3fd33245
+    9ff1b44e 1cb32ecf 97c90cc6 196b03a8 d9e1f210 2d8f05d4 81b78162 de966005
+    631cc748 f9daa7da d5112233 95a5ddae 8220b159 c4fe7a93 fe8e321b 19221e25
+    b74ab833 399261ee 6eecad07 05a003dc 2761ea23 a3b05372 7dd49b0c 2d8230a2
+    6305c1fe 3db5ec33 a3f9980a 613bc80b a3f7d475 dc39895a c87a2bfa ad54491a
+    61159c0c e99a8443 6e1c93ea 7f97dca2 3090f1bc ec860c27 d310334f aa328ebc
+    79abe4d6 05a7b8da eee6e4ba 987d2ebe eb638fea b3640614 fbfb1478 a4c5c1f6
+    28e8c447 1caa1d47 059cc502 3be477e7 ab73868c a61d708c 7e732352 953fe41a
+    4f359e65 34d95a2c 2410da91 b47f2c07 64daff58 5c55dc0c ba2cb8dc ed9fc5b3
+    25424682 8a29bdf3 d0fa27a1 06accf03 f3f4c49b 2b614d35 89edd841 71c9b7d5
+    27e57d29 3fe1ae04 b5eec65a 4dbc622f 4ec8a137 36fc8592 8dba84a7 11d776f8
+    f4064ea9 5fa3e931 d77d5d04 4098b2c7 9fffc3fb f0f337da f411f765 13d33493
+    89ef82af de0b6572 710d62b5 752c7408 cc769c70 c7ef9a90 8cab5dfc 187b0cde
+    8fe52233 34b1c187 5f8897cf d2d39afe 9e005b1d 6fe87873 d43a74af 04362ecb
+    7936156b ed411ba3 cf98f9eb e85e6c3a 6e5e6873 3ac18ae4 21aba94b 7767b10d
+    fec262aa
+h = e5907348 f2f3524c
+
+k = 47a8df39 4c094d46 45a9183b 65d301a1
+m = 79ca4a96 eb6b1e9f c086294e 18498945 7cc9c305 316ae503 efec1013 0e8d3c2a
+    58df3ee5 b68dd7e8 1987c960 5d2667b5 8d356cc3 a6ed33b3 ef101c44 74369e58
+    d1b9b622 c28fe798 17f26e64 0f7f5658 135c5f9d aa3ade43 a622dd98 3474f96a
+    039e1463 cb996609 3b68a442 7b70581b 2fb49ffd c0b8a69a f74ec570 e53f9318
+    d17c754c 3629793e 37248b9b 7a686ebb de2fc394 ae412314 38077d33 d2a7e501
+    0a01b539 588044bd 5613315e f9c67012 f68f94b9 2f117ff1 649b140b 3e49aaef
+    d748b39c 9263a32b 9d2a2a93 bed1c28e e51622ae 64e83530 dd150945 6a59c83c
+    56ebdca2 c8cc1480 185f9490 d6197722 36184414 374a80f6 a5b48e31 feeeaa39
+    c155d330 cd1dae45 92474238 ad7e79fd 6e8f5ec1 8bc2708c 4324e8fe 13b40a9f
+    c33b906a 9d97ea58 f9e72f81 c377525b 13ae0d56 642100b9 5229e049 33f81924
+    d0f42539 9c7c2fb7 f71fdb01 b59d914b 9589b819 07ec69f6 4fe0d316 83da9e71
+    96ade177 59b7d100 7755a7b7 886c6052 ec686637 050746ea 06b918e6 13e10921
+    bf7f0def c2781ada 983d4dfe e0b8624a accb079d 01605fb8 77615d4c e4196123
+    3fbc6785 5b5ef8f8 bfb9a08d b7656f99 cabfa9a4 1ea8070f b87ba592 ae8e79e9
+    396c4a3b 509eb577 acb0ca69 7aa75052 ed2d83ed 8eec20cd 7684b5d2 b24411d1
+    c72995ca a826d649 0d7579d3 167b9b7b 164b3092 6915a2aa a72d7656 9bc2b9ce
+    e2c5880a d6bacfcc 52996d1c aa769d65 a40439ff fa6b4f1e ad4c5b12 1b56f44c
+    0e327cf7 ddbc43cb 9b75317c ed7883b5 bf6d7192 fab8feee 11e8493a 6e19b59c
+    2f46e7d2 1bc67244 3c3fdd88 f7c0d00c 4d58a342 f4811c75 db6b4e32 41ee5637
+    9137bc6d 6916dd90 623dbc4d 477c317c d2295098 eb4ff613 388b913a d1bb2768
+    44442e8b 32d41374 2ebccb2a 044baf5d 51601c13 ca38ebc8 8ba57ea2 889ea65f
+    68161f3f 1a274a80 f535f970 81d3bd94 ba0fded9 8a22d690 68315aa7 d731db7d
+    6c9d3853 1551e3d8 0f6b7057 f3edeff6 35f9212a b762a039 208c155c 93c51a15
+    6f934fca 529e8185 9d412dcd 24a5a967 0876a07a fd157784 ec67d263 70ce7825
+    54e7aa67 58323ab3 e1844a8c 4721205e 49f42181 5fce1b23 8ec66086 d8589513
+    026f5ec2 266f4507 a304f8ec 990040fe 6189db5f eeed9917 abb90480 88cfcc29
+    1b1c153a 31
+h = 032d899c cea27157
+
+k = ffaaabb6 8cd76334 17278457 3e8a4827
+m = 8a3dee3d 46ad961c 67863db3 e4915210 f1e852b5 4fd7c0b3 7890c0ad b009bb57
+    7b7d083c aab57bf1 7b28332c cab785f4 7fb305be 1c9e7b65 be211bd0 39143de6
+    c055714a 05b5bd6f bf912d5f b125dcb7 7f5444f3 490006ee 8b02bc52 bf88e603
+    c608e340 5cbf93b8 5cb57185 d8feaa6b 2aec1afb b68c8cb3 d54c2f79 0051f4c5
+    bcec13d8 38924e40 35767ec7 97023227 5d90c3f8 20d9e9e3 c587c81d f4e0db47
+    4d50eefc 7054ba7f 31b8a1f9 d1f2bbeb a6293920 07c4551a 4401e7be afe6bc65
+    ed426870 15b07e6f c140e070 c680935f ffa4554f 7187806c 1d0ccffa 97e4c951
+    f8393212 04158613 e0b11457 54bd6d11 f0789dc9 0ccce3ee 0b557840 6ef3797a
+    5d2c3f5a d471432e 643e20c2 f0b459d4 f4968bed 005136b1 5dceba88 a0e58161
+    1739676c 05826c57 a558787e e4404158 07379317 ede64479 7a5ed372 46464ae2
+    29649858 de37b253 291207ca 389f3ca8 38bc7927 82105a09 9bc6f19b 285f4d85
+    469b79ff d68a80c0 c66ff954 04ebbf7a d702f5d4 2bfe3de8 f648e805 cad00efa
+    ba2f4ab7 bbb37938 065433a7 86e28e9e 72735469 573f04c8 d4a4fa33 290102f6
+    44600017 a9be5d54 02c2e14e 0f995f71 d6719876 6ecd131a 0cca4c8f 7cde11e1
+    1d421e68 5e405b61 5916eada 9c3fbf91 ff8f4151 4138ea8e 3d32bfd5 7218532a
+    cd104665 d26d31fb 8f36864b 4e96df05 79b964be 5ac4384b 5b5cb7be d6680568
+    b2dfde03 c51fd6a8 7da89418 f6e2e5b9 e279a572 9fd5cc23 2cf3ae5c 08e051fb
+    cd0edeba 984664ef 70d76bd0 56222fdf 247c1de5 96cbcc29 62787cdb 12890aa4
+    08ef8711 100eee93 7cf887d7 58322583 a23756e9 9ed9eb62 7310f965 76c8cd85
+    e1a87fe5 f369f9af 25155e40 2ca43769 221bb990 c7f2262b e215a4ff dea778f4
+    246ba178 0d858d82 10e453c4 faa2ebfc bf4cec46 2eae41a1 def98c8c 3792175b
+    cb1fc532 bf4eca00 3f31e99d dd09d6de d45569d8 7d16b3b7 216d1553 46ee8a8f
+    a9ecb8a5 cc36d3c5 4379d694 4a00a577 24a31e37 f35a9c01 929741f4 67fe2da7
+    0ba71331 e910519a 489b70ea 808fbd7d d1d21c9f 5bfc03c3 9b5e9ff4 006a9c21
+    afb7f116 c1a5b46f 4ec251f2 bbd426fa a9defe31 8b642c2f 96240a28 cfbcc41a
+    2f650ed9 f73f6d6f 0c6c6851 95cbf14b 0282dff9 7f2a9b8b 617aa267 4df9345d
+    49cbe3f9 f744
+h = 33b292fa 737e68a2
+
+k = c33e8a8e 53e968e2 f4a3285d b8e5f2bf
+m = a3f0e3ee d3490d27 84fa5489 5e87ad2e e0fb0577 1327f0cb 793adb74 8a360896
+    6d5a2fcb 09d72d47 4dbfc8c7 b4f589dd e300c632 28ef662c 0c89cb04 aa91189b
+    8ae2ad1b 03309d44 cfd70fb6 53f21d5b c78a20b4 86db1eec 9f5a6c26 2634d162
+    5ad6ebbe 78e03739 170e843a 8601b49f 217e4fe7 59919e1a 12eeef82 7a7134a3
+    34fc76fd 8a92b28c 50f546e8 cce37f8f c87fd080 5fa9dfc5 39f75eaf 6a4d43b5
+    b53a3499 dddbc44a 41fbd2c9 0dbef17a 905bc49a d8935506 39100862 e1d6626c
+    3a3f420c 3b45ba65 a2254c56 8c192d2a a81b4f62 5f02b28e 8cfdaa59 a8de2617
+    6707d55c d13ce248 c7dbfceb 37ef2b1f f1075c89 862c10de 25fed290 53ba6f90
+    66203c61 d3ba1995 dd8b48d7 ecdc3890 4e3c2efa 3618ac8c c390cdc8 a9da8031
+    5a92ff67 6a0e8ed0 c618faaa 189d64ab af465041 0c0814dd d1807a16 01eeae85
+    34658b8b 0aa0525f 44b38443 436d49d1 3addbf78 73fc2579 79946738 d8a4d2da
+    883554fe 472e25ce 31619170 14040a98 06c4ffcf 115c8659 b805bbb2 2a6f576e
+    06fa8a6f 037115a5 503091b7 ab7b5bc1 ea8c680b 429f4814 119c2693 eb2e8895
+    3ea3e58d 31a3917a 1573aa21 87fc1a73 be58137f 7740ea86 2597ddf0 4f94eb63
+    f830dd58 fc2f87bf 1e80fcf1 85c8033b c46fee5c e8aa783f 76774aa5 52a25e7c
+    58c56bf7 38dfa20d 01917385 29a1b5d9 44492b68 519f4474 35b515a7 db8c83f6
+    d2144b29 7882a74e 4943f386 e462b068 4a75f6dd 123f1c30 e5326412 d27172ca
+    e61ede21 46ce22dd 069cbbde 36814dc8 4d3feb99 850e3ff0 2cafc489 cfdb205c
+    08664fb8 5baa4287 e9a17ef1 ad86bc89 52549a12 b33979d7 d715409f 7801a2bc
+    4452a334 5040ab9f bf9517ad c2329d0d 8d0d0227 1971d145 41341065 592ebea2
+    27677dd7 c82c67e4 95aba636 71238806 60139487 812b55ce 5c8c9b6a 11b04f72
+    71d0b817 2b6a64c9 09511536 d1955a53 560fdc2e de8eea65 4cedf2d1 598f11ea
+    86dbdea2 6667680c d7d316cf a5a1ed16 c4675fd4 0b01f7b9 f9b4c684 3f79dec4
+    8bdfaa2a 07201b0b 75b55da6 26c1144d d2d946c9 9caa18b5 52a6216e dc17413e
+    55025b07 d74ed52e d4943e04 b49283c9 aac93ec2 0514f83b f2b7e6a3 faf6eae0
+    f6db9948 793c30c5 5fd49393 a2f6add5 013a1d84 d1388352 558bbdda 0b30a7f3
+    0353e891 02696c
+h = ce14d07e 5dc040eb
+
+k = ead3c9fd 9a1094d0 3d7e38a4 0bad481f
+m = fdce8821 99991e0b e58e6886 5e3e1eb9 3ca15902 5f89f9e7 4848bc8a d747a253
+    797fa65b cdedf63e c2c3a39b dad2cff1 9dfa94d1 6631f4fc 07c5beb3 d0a07a55
+    e3a31f7e a99f84a0 74c550e9 e5f7cc3d 46f784a8 f0f0e5ec 323d7c7a 6e280e08
+    6cf7df6b cbf72b76 5e270910 bc3d8bc8 c7d5216c 175473a3 af96e161 86ef9a42
+    555be1a2 a2aea450 4cef9084 eacd67c3 cb8daa3a 37d30748 0107826a 190d138e
+    29400d86 cdb706ef 24a88a3f 61a2d646 07c353e3 9f12b69c 5313f2bd b0cea4f1
+    6393e8d7 7813d23d 636ccd91 6cff06b7 058cca63 f43e7bc6 0185b0b5 77f80e79
+    2a535853 2b820519 63315eae 368e406a a8ddec41 2de84de2 f01b77ef 5b991054
+    106f9dcb 308b664c ae3d1732 b2c0e26a 698fd25f 8278671c 33fa6711 6d02e528
+    f004f096 7fca9e85 d7c71f8d 87aed956 7ad122de 28461ae1 e642d54c 6490f0de
+    0d033f37 d0acf8ae bb5025dd 7f531da6 f18173ab c4a66f7d bd3fd1a8 f1c99d88
+    b2106748 e0e1ded5 43437e00 8d79fd31 543d3dfe 2da821f5 a9919e44 62d8a7c7
+    bd78268d f1bc0323 3777a842 fa7e78dd 243219f0 60a48d36 1387635b 6b151820
+    488e9ee6 291edb18 56ddebfd 0ceed4b2 25ce62dd ed6a4285 9579db3f 062de001
+    f021b5a0 a9a0dbbd 5eedbbcf 13acba3a e8f72d72 4fc96caa 31497a79 389dc52b
+    93251b43 5bf5d2f7 e5a66157 03a89efd 1da99ded 73171c2d 8981e2b6 61a151da
+    27126499 5b58575e c8049238 af123149 f581b33b 59745c58 c8ca9d90 65373389
+    f6bed61e dc53ee6c cf37c137 cc061866 8c0f7f11 70fce67e 66770ee1 60816278
+    09b364ee 5f0f84e8 2368b648 2a736bea 9ce24083 e6b0697e c4d8d876 b8ca213e
+    d2ea2d5e 2ce37388 372917b7 193acda5 617addd9 be197e50 5662ae7f 5eb4b7c4
+    a4645976 c797cbfa 16e02112 62bf973e f081c35e 05035559 2d635fb3 cd1a58a1
+    31f376c7 d89188fb 8023b522 42539583 30c4b6b6 1f004354 fa730a51 29cae48d
+    75bfaaf5 64face8a f34e7297 16d279de 335e6828 df208750 3abc2084 49bc5396
+    fe9319bd 70f7dea2 a2eb13a7 77ae8370 be45648f 30ccc687 500c0a3b cc0822cd
+    0a1b39c1 f67a34ed c0b8f80a c16fe12f 47e94231 15887faa 9c3b42e3 ba1af820
+    47e82c63 8f37bcc6 678f95d1 f3117247 d2ed8530 b9e20b08 cb97a40d 5875dcc6
+    a57014fa dee71229
+h = 5719d4ab 77e5b45f
+
+k = e7f1bc7c b9c485ee 027c86db f8e46cca
+m = 01ec7661 5ad5b258 b7101042 73359102 7a09b61f 0b74846c 5fa09341 c5924e49
+    70be4a5e dd9bf165 e1c502ff 210ca43e ebca19eb b5ddf771 492c6ad3 c65148e9
+    6df0d0f0 418fd920 ba53a7a3 11a98a3a 01ec3c11 ff778634 65bc2044 9e456e20
+    95229a83 c002c929 eab3c5f0 08a35c9a 47b41787 2c9e7d62 94821995 5af35e46
+    d688a6b9 d723187a 5edc8b14 595bf0bd 4a5d6b7d 055b707e ef055977 443b72ef
+    a3e30862 c10df22f 8d10056e ff7dd846 a616d166 ba46f573 ff5c8126 09b7c622
+    79019f94 160d9acf 3f1a8c1a 198b9d3d 77ed19f7 333cb0f1 3c3b7fc7 d15a1111
+    13dee54d 809f8603 1ddabbef 5f43fe4e 68b2b7fd 2e7b20cd e65b7d19 eecef5dc
+    490f7b9b cfd791e1 9cff12bb e6798337 f135a1f8 4912c384 23d52d96 8c30ceb2
+    34684cbe 889820f9 4713f0ca 5cbbb140 a3545b52 f62e21e5 1a5616de e6983096
+    a86c7990 15d716f0 2016aa80 1d7ded42 2228b01f dfa1b8a3 28d954be 1f427fa4
+    89060671 27ce34ad 74ccd414 7d0f3502 3ca3c849 d9171d8b 867fd290 99a313a6
+    bc738789 ace73679 37cc7be0 8dcd610b fe855e13 6ec85250 23495475 0d7bb4c8
+    278aff6e dc9e8f2f 840f08ee d6875983 527372b7 7dc7626d 36637022 fc53f70b
+    36167c62 a9e74ba0 2148714b 5545a1e5 9db98048 3530ceb5 55a7e87a 0fc49fde
+    f0956a2d 6e4fe268 d610c352 2f95d929 2cf136be 463cd4aa 03201bfc 1102d274
+    e28d747d a939b1d8 d9b3e0c9 54cb8aa4 2a718fbe 6c75a0cc cf7c8867 0a21019f
+    f90ef72f 14e1f8f1 5d46128c 7656ecfb d7d64fa7 06d90b23 c204cf08 2e4cbe0e
+    8e63f20d c566d85f a93cdd1d 2c74c364 5f8af29c ae4ae40c d6b36f52 d8906243
+    41ebe789 c6b263e7 7a1fcf89 93336d5a 91965624 3f535971 1327e09d 680c0859
+    acbb3607 c5168904 dd6b0437 b23a836a 85a55db2 cbc2dd21 0004333b bbe5adbf
+    6b345061 a35a74ec b63bae7b 16b77df5 66f44996 5573ea9b e7d71574 2f7bc831
+    8bb3ca08 a3e9d0c8 4152d1fa 14b553ef d8abc017 2e078b69 f6834f35 8e242531
+    55b1f015 72930ee3 821d08e7 06ed7260 3a6e4bc4 b5abc16d 2e0ef7ab 8bbaf92a
+    ace0f9bd ddcd3d85 00a933fc 98462bf9 020564ed 5a246559 416a406f 818eee78
+    19c159ca 0f8d3c06 c150dc50 c5ffb9ba fe63e149 696f34bd 10e47b73 f7a002af
+    30a08b08 2e099af9 30
+h = 19c5cee3 4eebd632
+
+k = 6554a0d4 c8493428 3e8dc71f 40ad1d62
+m = 38142fc9 5011cfbe cbe36648 de17c153 be145b60 a5f7a01a a9bc4979 8ac09e41
+    af464e5b 1a83f94f 0066786d dd32a3ff 9c098f57 f4ec57e2 12176c8a d117680e
+    383b36c7 5d6fc632 a488a026 8fd53c0a c4579269 5e0d5a92 4e7b6727 6900eda1
+    12c9668e 51ae3c16 c2ca0cbb 022b6608 bb3f50c9 2bed4911 7ea40750 41b4d1d1
+    1943bafa dce93435 5d7613a9 c58c4177 3d99436d 5a7b66ba c8afad25 33c378b9
+    0b05216e fc1cd195 6589852b bc27998f a6d6d10e a0ab0290 f710f4bc d85cf2db
+    0aa398c2 0e75de06 3b92f3b8 8c2df957 53d47728 e56814fe ed3da9f0 06a9979d
+    0543cd12 8e4cadf3 72fae62d 385d6566 c01885a0 bda7f898 36283c5f edf4fbf8
+    f6d5e317 df242d65 81ec4e2a c62d3376 95fe78f2 af70c4db cca51d2e fae3a193
+    c174d2af ce13a463 3e26f9a5 89d7fd55 253133d8 da8c1f2c 9c91a2f9 b1b5a089
+    b04bd72b 39a575f8 5af2ab46 54b7ea9d 13e9832f 0da9b512 eea82595 4056d6b0
+    35355ada 45beaf59 2e6f989a c9b56dbc 3bb397b7 e83c60ee e7ff2574 3b75ebdc
+    20430dea aab36d6d 9c58bb11 b18eeef0 a985032a 0a5ea019 5a004a5f 8f60f524
+    a5d41fe3 ee22ae20 5097744c c3874fd6 b4647649 95908cf2 5a057f0b 8392bb69
+    c9882cac 1cfc8c6f 9f4b9449 73cdad84 f68dece7 08ebf178 5c6e397d 3a304157
+    d995d344 8ffef118 d4b3f0bd 70756f63 58d270be 252d3f55 c1ba2ac7 b372948a
+    da98005d 35a3895d fd5f3cce 1f56c7c7 a6eb874d 5944f47f fa5c56d0 d393a464
+    7769502d 40803f3a 7fcd5746 a76503a7 f52dd213 b2d58915 ce44e857 2b55425a
+    4a74490a 3524b254 01e64b6a 64ad6963 5f26e905 61030e10 c8386778 7f88a2c3
+    a470752a a2afd24d 5a51948f 26c43deb d04fd476 638cb5db 3144465a 120a8129
+    db6399d3 88dcb40e 8c8610a8 bd9ffb4c 730c90d5 0ae24829 3d92fbf3 473336a0
+    44d8d354 e89a1376 f07a3f7e 46e59f4a b76683db 8ad42840 87810861 1312345b
+    bed238cb 2e432d37 a46a79aa d585fc89 7c094d90 f5dbab8e 4ba25d61 d4a82fdd
+    8f1e9f30 0251e9cf d5403b3a 0a7a459b e8bee0a3 c9cb70fb f21bb435 ddd84a0b
+    a94be3c7 fb42b813 3bca0279 2448f310 69533ea2 ea4e4e21 496f606e 835dfb5f
+    5ca2f974 408e66bc 04b8272e df55ac70 30829dd7 c550cdee e510a854 545ac71c
+    1c7f05cb 54848ce4 e97a
+h = afc447a6 5b242b7e
+
+k = 9b024cbb 57d5c046 3b0d0b62 b74562ee
+m = fb4519ad 66e0c81d 334fed07 615d7114 d24b7398 a0508d7e 582e8b7c e8349ed0
+    76cf3287 8a2c73d9 748a3c3a 130153b4 6a1e333a 49dae012 0ac2e3b6 df679731
+    9c4bc331 26dbaa06 e5cb8844 9b03d1c0 f8f83637 b17c4ce6 1fc0a27d dca7c15d
+    8623c5b8 b50e56af e4825570 95222253 050e9826 2a0bda28 6f1cddc4 c174a4b0
+    f52c6119 8af5fb77 74c7616e 2a18e3fc 8d68bda9 c4972a9b 8149ff5a 06f673a4
+    2acbae63 564b2e3c 3f4412f7 3f15cc30 966fd84f 117c8549 8e029667 575074b4
+    576d1784 f8d22106 e1aee954 cd2f1ed8 374d2955 652b27ba 61a4f5a1 b67ef5f9
+    5b7853ae 312bbab5 5733642b fda19517 e0cc58d8 cf9cdafa 42339bab ba2be17c
+    55b11660 81e8c755 a09577a5 e5224cee 421337cf 9737cdb9 cb4115d6 be6cd921
+    9a4d1a57 3ce3de44 a4ec84b2 67978ac9 c3f7170a 08e637e7 8bb7568c 033ebe9c
+    90718e39 f34e0e0c a843d3b8 0d9f55d6 0d548c01 ef943a1d e53cdd00 c02f9cd8
+    c3ba6169 71124305 82b57085 43d32b18 1ad4a45a 51603edc 42f30824 2527833a
+    7331d4b8 fa1c2dff 54d9f54b 5f57c019 04dc1c41 748dc42d b702fc46 83edd2ef
+    0e72abdc 0c7ac241 a87efd06 c8bc4de5 f160637c 99654289 ae611321 c2978cbf
+    04a00b09 23b07d44 6a367147 e434359a 4325a46d 01c7a84e 1651974b 8789e79f
+    c66b9201 133c53ac 381769da dc7cb40a afa4ba09 9af344e0 823384db 39b8f2d3
+    65ba94f1 28e1a840 70203fc0 5890018d 3cae5f84 6aa17980 4933a579 5fbfed6f
+    51009321 cc820bfb 4bc2b7dc b54e6e8b 0ed8cd14 44a5bdeb fb5a1413 1e9c49f3
+    0ebcdc1e fa941e4d 9a0101a4 927fa95d 1cd82094 c5a908b5 f490628e cd588f1c
+    fb552bfe 62f19555 9c240bd7 60bb159a 74d9caad aced4fb8 ab493a5f f261eed5
+    8c25659f 6a9076a7 d0ea9804 910732f7 51855bf7 1e7918c9 51e3e5f3 a0459ebb
+    c3c6e81c e9178d40 fe273c61 4a75198c 2995ec8b 2c1cf70f 3fd3c3eb b26e9225
+    ddd3a14b c8b173da c3e29df7 93a01db1 7784eca3 d2181d1b 4ab045a8 47482b62
+    d783f200 25cc05c7 8900b720 46db3e82 cf967255 63ab0e0f 8313a581 1e7a8a22
+    b79b8d41 c55e40af f4a38228 74f104a2 c7cfde62 556abe56 0ab92ce3 bca79c5e
+    9db1d786 252c5878 93356329 faae8e36 414be1cd cbdcfec0 c27b15b0 fc0c004a
+    4509f4de 84354a03 fd03be
+h = 0be743d8 61429a61
+
+k = ae2c6d34 26b6ce01 eeab1de3 6acec7cd
+m = 34b6a2a6 e3394de8 045778a1 72fd3b00 db7beb2e 42bd4241 f49d53d0 ad90ffbb
+    cecb5be2 7d612293 ed1c7660 eaf0c78c d0ed9288 55fbc6d1 6ad809c4 3b206d0a
+    529c895d 1be8cf54 d72efce5 0165b257 0e722f24 5704d5ec 57cfabcd 333ba174
+    394a1714 3cf52b24 fa3cb2d3 b5a83c7f 2ae4b692 0e320b39 b3135381 4cea859a
+    76e1c2aa 0bb44058 3e0e437b c12f8f66 064efc7d 45508f58 5d3f7914 c5f76503
+    e7250dcc 448f1466 f447ef52 9868c250 5a982d1b 6fd6b2a3 cc1345d4 30fdcce0
+    1eaf1be4 f70952f1 550cd5c7 8b47ffd4 7eb62164 cd02f0b2 968e33c1 e462c7e7
+    24af3d38 b7e91a92 c9093133 8656ba30 0cf833cc 728e21b9 69d8085a c5c2788b
+    00050c34 4567ca07 0d8f31f0 a23484ff 58651b95 0ec7df59 7fde0cd1 edea25f0
+    0643bb71 1ecd78c5 9c25af92 86358ef4 b4d94f49 62b0dadf 35f8d40e 354fe050
+    7d1760aa a91e8318 7a587c11 31d538fd e897c4cd 6301f71b 51e59e0b bd3e445b
+    c34e23b8 c2568e52 2bc12eed e3834f16 e3f99221 a48ebf87 a0add3db 261cae2a
+    3c3c2e3b f4b47a82 4d709751 62a43114 669ce9c2 7fff4367 c9c81612 eef02e39
+    15c05ddf 0ca5d250 91f094f4 3f8c2c9b 4dd64f43 ec32f18a 9c0f27c0 4cc4cad4
+    fd21f8b9 f63b93a0 9dddaec7 5846c930 b34e62ab 47d1f2c9 451f6c7e 2025ce52
+    ff6c041e e1ad4741 b557db77 df2ed880 db0e4cd8 8e845bad 6454a2dc 49cf6462
+    9695c050 94c6e1b5 3e55af4f 04677c4f 16548e05 040dc6c0 b3ba9921 64bd2551
+    fd40a921 32d13ef9 ae1d5f6f 7483d694 3c8a9e57 ca77d89e 1e997d91 5778679f
+    9e6ebe53 de0a1cfb 35564e04 6d7053fc 39ca5785 f01ed197 d2a30947 0b273608
+    42f830c0 e1a7960a fdf78105 74a9601b 70bd84f1 15b3f33b 6400d729 239efaf3
+    85b24e2d 4bace16d 11ba0438 74a14f03 5c2d5f83 d045e55b 42679621 ec77662f
+    371cac8e 2decb8a7 282e236d cc09541e 1c5ba5eb 11c7a005 1b4f3bca fb0594c9
+    03cae0db 2d636501 c94981a8 28046d7f 65ae8d6e 1bd17b06 289bf2db 21acd833
+    c2a9a99b 27bd075b 9ea5b3de 568e3517 be7cce69 d9bc3032 13e3110d 28b1b0ad
+    97a014ec db3c348d 4f1efefa 278db823 728c0c46 a80fe23d b6b64221 384e3896
+    10847480 285a75a1 007cb787 1e014405 81cff297 cc279403 1ca44c64 e3993253
+    60c06f0f 98b09dc0 500c0eb4
+h = 810f5fd8 b76f4435
+
+k = 4ef4c4da 2e1441c0 21d606e4 c88124fc
+m = db72193a e198ee53 88476796 80116bee 5032d18c 90ee7433 d0d5aca3 dba795d2
+    fab48cb1 312cdfed 718776fe ff4cf282 78ca8930 c694548c 23ae1c2f 90f820b3
+    92d6cc83 2f1174bb b4e69cdd 8efc516c 1f351ea8 3d86bc79 422c77c3 fe696c6d
+    0fdfa740 a9a11808 c7d780b4 10a9ec48 b2b41443 ecd342b6 c5d43a4c c91814b9
+    7122c9d4 38a17d20 290de6d2 36c8318c c6053f8d 1f27acd8 fb94cdf6 a638b6c1
+    3cb2cf66 a69df54f 9cf10382 201eccdf d937645d 94fe919c 976566eb 22c507cd
+    9dcfe39b b488384a 4ae5de07 6ed738e7 24314af7 2a9d12b3 16b615a8 66753eff
+    fa438013 935bae9d 462441ad 6f9c1860 037f98a5 41f66064 f9992a3b 869ea79c
+    a38f8396 dc0fc10a ffb58626 6447f363 86b8238e ef6bdeb0 5d5ebfd9 06cbe944
+    35a3669c c63dbd01 d66e5ac5 bd4e78a4 4debb23f 8c418db7 6416cc8e 139b5ead
+    a499a675 a5cc2226 5606aeeb a4fa4c9e f22a7f7c 3fdbad2d ebcae3d0 48857146
+    cafa8f04 b84b3570 803e849a bff86aaa 100ce9d8 a87b0c90 bfc2d754 1187c712
+    921d5993 f288a618 933f00cc f251e3ef 202515db c72204e0 ed0c262a 46ae420e
+    3bd4a1ca 3ff20513 87444034 eed1bf8a de30c1fe 84f87c90 48f990b8 7f950758
+    130016b3 b0e4a27a 772c19d4 04b8b386 958704eb c2813c0e ad619d58 b790379b
+    c0af2f72 3aca28ad a8ac1fba 25e32fcf 48342fdc dbf70114 db014bfe eec83369
+    46a0efe2 ba1f406e d8d63ae5 77ab1fd5 33ce8683 c04af594 6c5624cb d9a3a6e3
+    73d44d07 c1b99868 c5d3954d 93ba2aef 517f7052 57ce7e36 21d72197 bace54de
+    e1ad8d81 c94145b5 bdfaff8e 260713c6 6b072d0c 981fd970 ca726da6 cb288739
+    200cfa85 44ab9e65 a4579283 3ee17e73 c40733f9 29af7c82 f7ef1c34 7fe05e02
+    a0111ce1 1e3166b2 ef881c88 eb08876c 7bca2a78 69885c32 1d23da76 85c2d8f1
+    09b681e8 bb531e86 182702fa 7a091fa7 8ae51dc8 1a50c551 2ff4b967 3ca23381
+    5ccef415 1e13c52e 8beccdfc a88544ab 7c65d52d b49ab825 15491ff2 1b43b16a
+    3ef9574e ef2c509f 347d0d6d 3a8b084f e37fb5e3 7b83eb17 f04c279c 4001271f
+    32e04403 412c67ff 446a5ec3 6ac75725 3f62ed3c 0219b2de 2c3f88ff 819f972c
+    c0a8c442 c23da8b8 7439afd6 aaab80fd cc1d2e9d d2de8b56 6e5153ed c437d5f6
+    3c40a379 ee88b606 beb45504 35
+h = f12b91ac 43068940
+
+k = e70c7e72 10877449 1ec0b7f7 833cd6fb
+m = 265f2867 bf3d2ec1 f2d0e956 64598485 f714e553 ebb3f9d7 0f83b5a4 52b004ec
+    6a31a9e0 d01478f4 86f0f0ec 52faa1c1 f79cb933 c7b987d0 d02420c5 cc1186fa
+    9f744577 8756fa39 b5c620d2 2b1dfc9a 0d8d12cd 64803ed6 6e96725b 5aacc57b
+    0a3d70ad 09961b04 8d8117b0 aa9d99d0 9f7f5c7d 86ee9b2b 2d970a8b a02387a9
+    fba7b353 d02f2e3e 13588629 fdc05cc0 71cb92d4 7ba3a3f8 364f0240 a77c4228
+    debc08aa c0be531f 34b04a5e 7b052251 41f92122 23ff0475 5a769aa8 1bf652cf
+    4afdf2f6 9240026c ccf4c0b5 1e81865e 8caff920 a408915d b7efc195 9dcff083
+    e8af5ebf 2644e182 cba9a7f1 710a4a51 399db5ee ab1bb7f0 11c04739 fc3ecd02
+    0b983ebf 7ab6af10 774f54b3 d54eb761 4e70782c f281bae7 5e40dce6 4fad83ec
+    f039abf9 cc1e1ab4 e7bcb133 b1777452 db71dc49 f99f79b4 961e8e5f 8703cc37
+    9f66518b 9279ade0 f2eb94be b1daf1e4 f6901ddc 0ccea49b ffa647f3 6374b843
+    691d40fe 382c2269 129455fd 42775dc6 58833f87 11745edc 588afc25 6658d790
+    9416a49d 4ea4269a 349ef1b4 0a8511af 08d6ac3b 75594460 07b06679 efb8deaa
+    ec31da76 ea603a82 93b238b5 b685eaa5 3c77494c a535e077 8842f505 0a035245
+    e52cf009 87b8a539 357c2ee3 5381959a a57ff7d4 5520a995 d76bfd4b f8bb8eb9
+    b4ad0d1f 3d62cc6d f52bfab3 d35f1349 6394f3e0 f8d75fd5 1d6451b6 3b807e81
+    999eaf64 a984dc0b 9d2aa6b3 7834f666 4b6e37af 6242ef09 84747fe9 708af4fd
+    13c3005a 17df404c 579ed109 51ec6e61 06a6c446 d6214c38 6fca0626 125c48de
+    ed8bae12 afffa3b0 f08e7912 77c44988 bad5ce88 e971fd1e be3705c8 de41e678
+    e6e8bbc1 b15669d5 d6f79ef1 74617c6b 8a10550b 0171a0ba ed237cc2 26e357c1
+    dfcd92c2 297e7bec 92d0bbce 2d7c112f d82ea8d9 b5e7a3f7 e9391754 4a8ee669
+    276ba76b 3cb5a4f3 871818fa b0d609f2 13a5ea77 1aa7dfd1 06fa6758 20eaba8f
+    696ef17e 138927d4 4b81ef96 d985da0c da105ecf 01d2ae1a 4be3a660 a700fdb6
+    5d8a58e5 50411203 02128cb9 72475c85 5b732b22 d5701c6e b34326af 51e72a47
+    7c4ed321 8daa3e2d 51e485b8 51f7fd09 c63fe5f4 6176738f 690b6019 5937c727
+    107b2403 4ad2d758 01084fa8 0545e9c5 f0318915 aac0daf6 2d50e0d8 17c4573f
+    cc5db04f eb9dd07c ae1c9747 3de3
+h = 59781bad f600a7ac
+
+k = a3f9d65a 467e2216 0c85fc51 7d7c7153
+m = b81df1c4 fc0fe393 57d5f2ae a2040630 7f89431e b5077b91 fd9afd8c f36405d4
+    f634efa7 8c9cf7cd 73b2fd93 78cf3eee 0bcd1d15 961a30e4 af67bdc3 79a54026
+    4ca16805 7b8d83a6 5fbcb375 51d6b539 2d1f326d be90e415 34c04005 eee17422
+    1196b0f0 4c34f31c 48106235 bd50fcc2 09541582 8bb293c6 7726a3cd 2c642a25
+    63cd06d5 ffa6a12d 90963e36 8b39ad9b c5da125e 461af140 539b6305 2f1f536a
+    69ff7bfe 13c0b1bc 2ca0b537 94be2026 6cdf98d8 b1bdbcad 50958ee1 25bf1552
+    bed9424a d24981ce db2eb996 5a25c89f 6fb33420 589a03e8 d128998f 5cd12cc8
+    594f81d2 54763645 d3dbef34 9ffeec75 1f60458f ed47ddbd c0ae2251 5d3a2f92
+    344e4e94 87e0ceb0 d020bc27 6cec098d fc1c6ede 6fdc191b a063cd99 a865935f
+    3ab97b54 f21aefc7 1192f86f 86d2d917 6af8e8c2 7cd69709 b0fe4424 ec7d5e57
+    ded28bea 5bba9674 1ef43771 cb476b44 7478a17f 7671bd7f 8924abca 44778ed5
+    ab6e5a55 78862790 e7243822 3fc4cb20 f3f6ed08 686e161c 2c014d8b cbd268d1
+    12bc0b08 e1d9b1a4 30edc801 01747097 5f83a38f 09018011 a531ae10 d82dd623
+    25230c77 8f7c76c2 35c1f1e2 57f96d48 daa52064 f7146d2a afd8c097 3785be76
+    96ce8045 0745e30b 473a7cd0 222b5370 cdbfd854 25edc3b6 bc3b4aa4 071b9544
+    957a732b e46c13fa cc9ad444 82b87416 7514131f bb1c814b db0d0f36 d581b2b7
+    2c9fc687 3177efea 431d1e81 d436a5f2 204b2ac9 1b9cc203 faf039da 3f3840ff
+    9fa48962 e643b432 ac0fffde 89bb6369 fe90fa87 620f8f8b 764d88f5 a0d8a76f
+    4fac3f68 9a689901 894f7dc4 6398554a b24c6e94 daa99587 e1cc7ce5 445bc57d
+    b9180980 da42d0ca af89a413 436d0201 ca1b63b7 82df41b2 efccf32a 51b33189
+    a1411a1e 76a74ef4 57e1ab02 ca2ea44a 08fb5afc 58eae3b5 a8c2cf55 c2a11730
+    9664eb9f 05278a12 9bffe421 cba4fbb0 ebb8a04c 2e505824 79477d78 fd1709ae
+    51d22088 455dd59f 5da20899 f47c8074 44934590 94df86ac 1f819bb2 4ef0450e
+    d5db007b f242a84c 7b347627 39f7d57d 6389f46f 1eb820bd 7a91ba7d 8b9d6773
+    59057024 7affd88b 2c1723df 8da830db 4db685b3 1dc51a9c 71827640 a5eecee3
+    40c2295c 19645a10 8f8b3cda 2df1b448 1e295acf 0244877e a52f4361 e402a0f7
+    d6126f5d 62fb10db 67b6b03d 91a7ff
+h = 398dda3a f26cfd97
+
+k = 5f755fc5 fee7e8e5 3a1e1718 8b5e255a
+m = 4ddb2950 72baa306 39f12e5e a726d192 c50c8d7d 371f5f21 2e961612 28be4d68
+    0ac193f1 4833d73d 7f163eb1 80afd05e 501688ae 658a3ab5 80e6c3d2 396abe72
+    c6abc62d ba6f8408 b3611f11 788f1b7c ba7ca71d c5d16858 ba06f07d de413bb5
+    44682161 821bd8cf 8231ece4 0f3a082f 89660d22 7a0a7172 0b7eb2bc b1389ca7
+    76165198 33d51a37 528be406 3d6f23e6 7ad9a273 1f61f78c 80821301 2b4c5605
+    873ccace 4c0d9d7b da81806d b20ff916 1db38bfa 905222d2 e8727a54 0794d9bf
+    e93a0591 758dd750 72424de3 4514d574 680ae772 fb638c1b 6e7fde0f aea02f5b
+    6b95f4f9 d2d6dbcf b1f28b80 47afe02c de49ed61 d8210055 ce5fcfd6 3110f8dc
+    5175c2cc e2ea00fa 46e7b3b6 23d12096 b1e03008 499bb6e5 7aab7961 2cf58eb4
+    f4399996 310188d8 40ee0100 f6537bec 0ac5ee97 d4d9240f 625f43f2 fb77a408
+    89423bdf 6df6018c 90cd24ee ac97f177 1160fc3f e3d6b192 adf1c02c bd7c308c
+    0d7c8f26 3715de17 57b6ecb7 0f095598 22353aee aa30659d dbe560c4 b8ebc8f9
+    25c77036 2704255e df738e8a af691c3a e73189be f559f6f1 c73cc12c dca44c59
+    235299e5 fbeed257 001c4811 b960a870 38b8643d aec918a1 6bfe8213 bc455e5f
+    063710f5 e04d5f86 c1f2fb81 16ea5904 ab306faa c75e3337 2ad0a919 dcdd587d
+    630b41ae 66f6e63d 55e002dd 5459b280 5c49c09a b0461c5a a4a66919 47618093
+    f69025e3 10159b10 4fd59cf6 4da746e2 1984b5d7 d59334c7 e91c2ea3 22c197c7
+    225f0c0c c9510411 557a321c 51f9e2ca 0727f224 951a51fb e1845104 86207d74
+    46a71888 4c58658b 0ec6ae02 a69bf6d1 bd5e9e41 23c888f0 3b72e5f7 664e8a79
+    1eaebff0 11e38fe4 d5e3ae7d b4b54037 2475f505 a17ccbf9 992e9c04 6fd4292c
+    cf033874 ed803c98 a7aa05c2 dae191bc 7b626bfc 656001bb 45c5bcd1 ba13eb6a
+    d8b78e64 0da3aeb4 dac42e5d 50265084 f646a9ce 3dbca24b 47e053fd 928fe3a4
+    451b5ca9 d6805ac3 5eaa304e ad9bc7e5 0a96b1ba eabcba19 54ba2700 14f07c92
+    b629f41c 24f402ca d773fa10 4443b57c 6b0524de 4b1eb1f6 31cbedc4 c80ddc1a
+    4bbf644e b4eaaa4f 0c0a1c5b 571f71da d9c73bd8 0b446ae2 d72dc7ce 66b0bde7
+    2e28b2db 6bc13dca ff774007 06069b39 22b6de43 9b0e1645 7a984e0d b2e62ad7
+    1a1f88b4 1c4f3b22 34f1b0ae 5dad5ee2
+h = 09932d76 1be9b547
+
+k = f00d4c64 fb68be0d 2f6ad8d4 2a997dba
+m = 8338ae0c 6d725d2c 2592407d 973fe326 b2ea1c8b 98175da2 7fd19a90 10858a83
+    7af084b6 ad29811d a1eb2ca6 0fb22519 51fae77a e68e39d9 911b389c d02c78b4
+    8ea89bee 7faf63da 327120a3 2f164354 bbb57fe9 f0d32de8 1bc05b94 083928d3
+    e0d13027 cb70a38c b797e960 6ecd8bdc 5936044f 89e32c4c 09962b7d 0c0ef85b
+    cb6d228b 123c2ffb 1f604091 3a0b184a 1eb54d2a 349af806 b5625bae baaf7bda
+    83027568 4655d4d4 4db7aee1 70d6d31b be76e140 eecae1df adcc5292 3fcc5b8d
+    d54cd457 a8e2ca17 6ee35174 cd2e9dad 8e78d8c7 9567dc5b d6503d69 a6fa1837
+    73b713ce 4caa9cfd 59800d34 2737fba0 e012edc8 4513d6f8 64352614 b2c9dcd4
+    2ce58368 23ea9509 00f92ee1 a8e426eb 742aecf1 6c0f32af fae14792 291ebd8c
+    7c76ce9e def142a6 27d7d6eb 5bcd5e83 2b88d4cc 2b5ef7f9 1d43db65 5dd39fe7
+    ce83c923 b52f5319 65a34212 04ef76ee 91f5d88d 5a777445 58af9423 6a7c0c4d
+    0caff1f7 b9c1c4da 2d590c9c a2cf159b e118f8b3 ef5fbf36 2969e526 810086b7
+    5a1729bf aeed9a01 a60414e0 12e79cc0 553e4077 69b669b3 2f3dcf84 de6bb381
+    8eb38462 79a81b55 19cb1b5a c2528c02 448f9538 78b0d9de 129b0d50 41f62be9
+    09242960 054c2b05 d298e934 5c790e4f a851135a 72561c8a cbde0c57 b9a91657
+    befeb3e8 c5263a62 2ecd4b18 e05739c7 830c2eca 25291643 eeed682b 86f64821
+    fbfb7635 0c39059d 5e390e85 6c6d8793 e37d2c07 60e87db6 044e2136 d5930cbe
+    f57d8be3 20d5240f eff3d0fc c53b1bcd c225bcb3 945bea7c 2b99d3ff 54da1b06
+    07755061 b483aa10 4258ffd1 ddf67f18 06151ef2 8712ffe6 e3025ef9 666b5ba0
+    82f9e5e7 33bcf1b8 a5889371 dafbebb3 37bff136 f7fdd469 9dcdf847 6e08b81d
+    d577ee16 92575f52 6bf2c7d7 d23e3985 4f0525f3 5ae9a3e4 8cfbdb59 30b51ae8
+    7451c62b b17f3897 0af8cdcf 5bbda166 11959c99 f505a130 cbc6f611 3742d896
+    e749238e c782d384 5d581b97 a15adfd1 1dbfa6ea d320c73b b62af3a0 dd59ee6a
+    a35702c5 392a3b0d 3eaee11f 07318402 5faa9c3a 62b6071e fb3178fe e4a8ad2c
+    fec40889 1e5bf12f 90a0f51f 2845b2f5 040326b7 582b913a 261b909c fb55507e
+    13e01eac 4ca93fe2 6bc9adb6 d970d383 b4d5fb69 21f1984a 3dd3104d 250c954b
+    5b7722fe 6a205906 1812612c 3b8d4a21 2e
+h = 2d0da9f1 e2f98180
+
+k = 737bace9 c53c806f 9b12bac7 286b9cfa
+m = 6a168079 b24313dd 9ee2c7e7 c22fceec d8c9d314 e4b3faf7 4525c054 6574bb40
+    72661c61 2dd74611 6941de32 0545e42f ba698da0 1720fcec 43334940 d30e42f6
+    41919760 8209935f f475852a 50aec2ff 2415b3bd 96437775 e8cc8164 279fbca4
+    764f47ca 108c7161 11f48db3 1159cdd2 12df605e 3aec8d2b 2154d3a6 00d60084
+    eb5d2226 d48f6f0d 95efcc25 c5236340 8d10ae09 664dd7da 53de9118 e31ede19
+    bbd218e3 433562dd ff794b5f 54ec54bd ff42206e 0abeaa54 be7f19cf c802102b
+    02ef2b63 bcb9bfc8 5fa0a085 0939def7 9b536b6a 4e1b5c2f b5c327c3 bee59c5d
+    428e5bd6 fddf6af4 58d5bdae d75d3783 0ed6a2db 24b2df7f efd9d319 06693fd5
+    cb474380 79966e01 0b1c034f 2a78e7f5 82b748ed 44c4ff2f 63355eca 41d8d494
+    da225f8e a90838d7 03e7f30f beb72b18 a5d0ae7d 94aed08d 892a198f 860fc155
+    d5d65782 b8ed2d75 f76ce81f 5f007953 beafa3e8 92f25422 76d6ef1c 76c6d823
+    a5224bce cdc20811 695800eb b4a163e2 13f3ed4c d2314aa4 0ce14561 1730c3a4
+    0d57c18e b3f622c0 83bf9c10 59ced8c6 6c544131 a5bb8c6c 4989d0e8 d6a2ad92
+    8961eee8 1feeb274 344c663a 9109b8de 8f5a7639 221f0bc2 f0ae1a40 f176b1aa
+    984d9eaf 559d5014 d9dd1a12 a6043fdb 5215c185 8954fee1 b2f6e28a e300ef2d
+    70148996 0b891c8f 425e475c 74d75e3c 64e80312 c6174e0a 6daed18d fd07a332
+    00f7f635 5f79f9e0 b4f79a2a a42eafad 26858e8c 1ed57d0c 3816402f a9f21513
+    d0d92e9c 832fc2a4 1eed04f8 59478fff bde6c63a 6bc4e564 d0ad0f80 21e32ef2
+    79d23061 bc61578f c258bd2a 65b3ec18 d7ef18a5 dd0a37eb dee4296d 80c691da
+    6ba79b79 cdaf1314 919f4c32 68e13cdd 7aa40b4b 3aec4946 5ac33f3c d5bcf786
+    89622e51 d0cf1065 f43dbddd 54998579 089e3380 f787402b 32f97a0e 99c38898
+    293c8ffe 8520f7c8 b1f9469f 2c214730 358f3f87 ddd8b809 c9b40a52 6988f2e8
+    535bb194 c5de81db b4379c00 2497ae0b 3a1ae2e4 53fbb871 9a0388a0 98e08a56
+    e552c394 d9844d6b f0c6589c aac43ca5 a94550fe 6ca9017b cdade23e a7693080
+    a00e1510 e4481b3b 5d9cb6db cfe292f7 6d0f65d4 9dbaef2c e18b39c9 04f7ba51
+    04240e2c 6f499e46 9d58967f f2f699f2 d2f45624 4201b2fc 1fef24d5 4bd469e9
+    abdb0ac6 19a55556 eac7c624 226b1244 4e27
+h = fc8029f6 16a307d5
+
+k = 040f66ca e19ae53b 43804eca 2088a105
+m = 3e25e5de b1091521 ac536dcb ab6b0e8c 9147769f 0569af35 a85fcf57 079c2289
+    afcd265a 0356a5b7 32dc8ff5 1710ff40 e8e375eb 09b87c85 0b7f3a56 d84f389d
+    ddcd1fa5 88591ea6 f64d170c bab61b91 6dbe55ef 3ba4b212 73dc6873 6873a3d4
+    8a90a7e5 8d78c779 7d0a3780 7e843549 a3b07ce8 bf4dd9e7 5597c719 2b5d1119
+    d88c226e 65fb7a81 9d7a49f8 28da0e40 9d08ea18 27d0368a 7386131f 873e1fbc
+    685b291e 431d0395 8f8c0b68 22d988e8 12f7ce19 e1fe3cf2 99f1fbdd 386f3c8f
+    c493246f f1554b50 283245dc e2d9d2a6 664eb330 57638367 306e66fe 95605775
+    9e3c9a60 bc2820fe 99ec5e2a 8fb04bc1 7db2ffbd fe43b616 ec06e1a4 1cd1977d
+    9112e690 fc67a00a 59bdac40 692b824e 5393ba06 e1de9af5 31e598f8 47672570
+    042f4f45 c2890aad 5827754f 54d7e77c d401ccf9 ffaa79be 7cd69755 b0d0b6cf
+    759da50f 56ba59dd 80c06b70 fa34eefa 75ca01bc b7509de6 16e6a3b4 cfcddd52
+    cbef3c1b f3596cc0 dc6c2171 2d6e5e11 2c537197 25411e8b 10cf2bd5 655bf99b
+    9e9447ca 67bf1ffc 49621a41 134fed00 4192a00b fa65850d 5361b58d 543a26ad
+    ad5e5680 d7904d8e 848c4043 b1b78d5b 7146f234 93f256f3 f770fbc7 07e2873f
+    a3ac0240 1d379f27 98fe780f 9a42dabb 6a884d6f f2e83774 83ac8c18 e3f57ba0
+    9c0cd357 80e308d7 4a82ab5d d4867656 8f012a90 bfdfa10f 03bfdb3b 36391610
+    4801e6dd 56362e79 9b767533 7920b458 00f1d135 6c15da9f 66855ef8 b6719e2a
+    948f4a57 927a4051 e798a03c f9d16f9e 6924ecd2 4b4c2073 dc7bf134 1941a1ff
+    0649f0f3 1bd87beb ebe9939b a4eed9fd 07088699 6248cc6a ac3e4212 50cac5b5
+    11f529d2 f7c55af1 4b8e0b19 9d1fbf47 1ddddb04 aeb80ab4 5fd7e4b7 fa1e32e0
+    0c9afc34 4f8c3f4b e195a570 cc81abff 347c9358 d8b74be6 2322f373 de34125d
+    5629d6ba 4c47c64a 385c899c 9b84214e 2d95170e e036b4e4 b0701a2f b45a64ee
+    f8be0233 2879efe7 00c9c71e efdc2b37 b91174f2 f20e13a2 9c646048 f6349a1b
+    fa915267 ff8604bf 75abb7e4 d563d6a4 64ebd487 d765beee 177b93d3 12710389
+    d24e746a 358cbae0 e5ba1506 2497135d 280fe922 e62d22c5 f15b7f0d a946c2db
+    8a2ff1e8 8302f2ea 5039e738 53dd5b87 a9c09fe2 716f990d 4b9f0581 2ac1293b
+    b5b0c0db 3e12195e 71cadc0f 7176a701 9325c7
+h = d6e25065 56b11fc0
+
+k = 99ac86eb 0c35704c b1629263 efc5a22b
+m = f6f1d3fe 5227acc1 8e4de55d e235b3c9 7b403379 a9f94945 26e3b78e b6de5397
+    1f9408a7 0c1c01f8 fdf4b90a 5e58a2bf 9a9e7a7c 3dd54831 e561fdf7 8f067366
+    075a75c3 27d47e3b b9f7c0ad 25a6a467 ed692b02 db8a6031 9a23e670 542715b3
+    483dec48 acc0027f 0e288a78 57cd7aa1 950caf0d 6fdef1f8 4ffa891c 5fabb661
+    5a407247 65a41293 74c7c6ea ac95540b 942126a0 28e7ec93 be52541a 6d6a2666
+    27a7c88a 5dc76a93 8bf2d4ef 6e894df9 bb23c22e ff1d21b6 9b31c71b 8eb39488
+    68d95b0b 0d62217f 66f72ca1 0441b43b 65f50dab 71a08eb7 2059c57d a62a4a2b
+    dd99bb70 5f3220ad bafade97 2c887179 7a1c9e4a c16a21b8 e409b626 853d7f0b
+    dcead891 1dee9fce dc5e7876 298b1c17 4b391038 17604614 6869d1ef 5ba0e61d
+    d7f6b881 ca4e45d1 b9cf87ab c2f3e1f7 04204658 a5160d5e e6442fe1 f5ccc439
+    7548f716 a2be1f15 595aa971 9e8a03c6 da2fb026 26272d3e 96a623e0 60d25a9d
+    487e529b 33068739 61b28f01 631457b1 dfd38224 271ee168 cc6ffcc9 29335de5
+    da7ab34b 5ac601de 095454be fef74367 3e00a1cb 329362db 6d15f7cc 25367b56
+    26859e9f 0f14022b f5af3efe 33bc9c79 5f1d0c3e e1baf4bf 7c4b0f4e 20abe33c
+    4b0ac4b7 ad00ecdc e30f76f9 dfcb2320 487e4d9e 70e327ba f8acf58e 19743a63
+    a27aa063 3e609d1f 21e6d232 44b33d16 d342d14f abaa09c4 69e2449b e94b2c21
+    1004cba6 ce75a618 c77ab327 ff698bc4 307e0fe4 702ab081 265cfb20 2cc8e7a6
+    defb3b5b bbcce887 24f597ec e5cb995e df271239 6420b58b f0798176 2f5ba793
+    12e02154 06053f0f dfe6a2dc 0bcd5c97 e3006888 662780f6 d5e12fc7 239ba15a
+    3e7d21a5 4f0d064e 697e5a36 17eb7e83 408594d3 bcde8287 582fb308 d98655cf
+    674ce734 66cf949e c90eb650 d1c9b04b 486ba35b d943989a 943916a5 da8e66f1
+    eed289fa f3b0ed18 f269c6c7 6f712fd9 989d361c 06a1784c d0f8bf8e 48c3e4b2
+    4f3de790 b36d4bd6 5209e1be 1d42aabf 841aa438 4796239d 4f893c6d f654c776
+    0cd46c55 f3c6c884 c939a274 e54e4b88 99b42120 f99272cf f28217e1 6b527305
+    9f139b7f a46107f2 abd8b178 a783d17a 08a5b17a 085ed1d2 9c148219 97daeb9c
+    14c4f82d 7c6cc933 79d928e8 e8609317 20f9f794 a8d66d7f 79cc83c2 b657e86a
+    b8a595e0 2a1f992d e8ff7ab0 5fca6388 c5c5e726
+h = b8b62cfb 39912803
+
+k = db1700f7 efe88685 2ba6200d 28c79996
+m = b3ef4941 bda7d8e1 a63a0786 2a485ae5 76a82ab5 ca69f65a 9615eaf1 6dd431ba
+    7122227f 818121ba 1d921d33 94c73f2b fc0673bc 5c37e620 28e2c0c4 6bb3cde4
+    8cde251e 6ef975b1 b766bdc8 0ceceee7 3a095af4 3d356a10 0c24181b 2cf692f3
+    cc790e31 b8f7907a 8dea66be 0ba46ebd 34d943b4 fd1ba4dd cbb1deaa 6b60ccbf
+    68e9e4f5 e1081e5c 81f9700d 877b52e9 ae420e9c d4271c13 00b797ac 4c99ee63
+    305f444e d67122c1 b3a530fb d713b389 2116710c bce4b7d4 1da55483 dbd5564b
+    455a5f3b 40bfc92f d42c2f58 14f43108 ab425ebf 189167d9 7b659aae 09573703
+    35f51fb8 a87aa7a5 0b4272bd 376b32c2 b31f968d fb19b648 8f1af55f 40af693a
+    00ed2269 5dcd275d 14b4a3d5 8dca4589 ad8791e4 a5f801ac 1ac303d0 0bb5fc07
+    54672eac ef008bc2 eed58c2e 654fb21b 84971c6f da39735c 63e95466 da873852
+    1b6ec910 cd36bf25 75046015 ca2fdb40 d658b707 149c2df2 c6139168 a04aa39a
+    a7560997 a0422870 4046d8bc af3810b8 be202be0 95ea3d27 b217ff20 f49cf67c
+    1e92b993 f46edc87 ecf62755 83fa4a0a 870c5948 2fb95bcc 0f3462c0 3ebbce2c
+    0244a435 78924463 f05ee701 3f3bd181 34f50b27 a20a08e6 fae73819 b6fee4d8
+    f38dd8c1 f6704d68 5c9f38c0 bee63dbb 686c7a9f 98b3819d 68d8f133 ec854fed
+    8807d618 7ba80444 68bdc855 721780f8 c756a448 c3db689c 198799f4 6c0765cf
+    eab3c446 5d4c45f6 7da2c6d3 2a413200 9824d78d f311f23b 0bbfac01 906ce947
+    a58198ce c97871bb 9b8da369 2f6c874a 25c40be0 6015b2ab e7e5eb5d addf5f7c
+    de2db183 0ca66c61 f8078924 e8f229ab 9763390e 2de9b9f0 2700c24a 0ea4f6f3
+    9c613bd6 4db552cb 0c943f70 799ccef4 b7de42b0 c27b9940 3a01b306 723f4e8e
+    ac1de64b d658ea64 6fbe0279 f7dc56eb 0a42ba4e caaac2fd b9692af4 3a4555f0
+    00f4d18a 36e2cb81 b59ced9e 06a6bc31 eab1bbb0 b523d6bd f272d85b 3c4ab569
+    90924b90 8ac40e72 109f84c5 15a262ab 499df574 7ba09b15 1ccfbac2 54d978ce
+    cc014688 fb47bc83 e3886238 e1c266d5 522cc252 e1a4be65 c62b1aab a1b23939
+    616e21f6 334ae553 a6fd93b2 3b42fb04 96d43613 ade24e69 c8def42a f7502d56
+    0eb415de 257c2f51 96ec3322 7214c28a c9a9da22 a80b1ebb a6f40f52 2f92b5e6
+    c281213b f61e6555 5e3f9a17 4aed937f ea61e886 4e
+h = b85ea5ab 1f30792f
+
+k = 358ff4e9 f4ad4c39 08b3541a 47133381
+m = e8672ee9 73f7f020 9ed3c476 44ad7a24 2362dba1 2511ce5c 93bf2931 465b0052
+    a59aee62 b7a17f05 b6516fff c241d503 164910b2 e2ccf09e 295fdb55 8d6e91c2
+    2743d7a5 08b3cfa6 5ffd5f00 fc81b0e9 45b2655d cbae6b69 d6133f86 7e319190
+    38bde40a 2d96ab67 917692c8 25a891fd 390688fa c9a970d2 64115edc 821791d5
+    f33c61f9 410cb3e5 552e46bb 6eac730a 1cafa0e5 4d8ef181 364333fe ea4489d8
+    8a7ee427 0327f386 a466901c ed493701 aee31ca8 679b3abc 0227c1d8 a4adfb7b
+    4fc0a933 dc58d6a9 0b728290 a9fd4276 819382e2 9f3d52c7 6cc316af 6b819e7e
+    0d4c56e5 f155902a 10498faf 2e4928b6 8646cd5c ff962d7d b062e967 078fb265
+    ccf13333 71f53f89 1cd596ea b35cc708 5fba82d1 e980b9b2 cd09c364 824f5081
+    daa07c22 83a1a8d4 452a6f8d d16b827f 5d0776e7 9f151c37 de277425 d7cf92b0
+    faf5d596 1302ecf5 566541ed 24651ebe 85dd88ba 0aba32e2 9c462f80 e41b2057
+    51766e62 8201a9f0 1eb51be0 9fe10802 c68fb0cf 8d261695 2998b500 618828e4
+    f6361c0f a2b0c2d3 79942a62 b2520c6a 6d4e2e84 b67ce73c 49e2b858 ae9a3340
+    761ad6a8 bc55381d b17e5c24 158eb65d c103159f a9f632a1 f8c7dd1d 41673901
+    5cdfe2d1 25903f20 7fc93fae fd969024 9025d472 5b94de3b 5a2044dd f30322e2
+    65ba0fd8 3010ef6f 16bc4ed1 7255cd24 4091d92f 3c0f4b0a 43acbb6c 6d71bd01
+    7a820cbd e2396336 0a41c466 5a9ef167 f420dfb4 d5d21579 f7cc09fa f452a228
+    356351a9 920ccd84 0859f3f3 557ef74c 08ec4d74 5a2da6d0 36066a40 bf0e66e2
+    9f0ed60b e7a578dd de01e435 08d9a583 12588e01 f923837b f8200611 59081f3c
+    2c6467cc 092ee438 43b4e162 aab02368 8d507bc1 afb4bfbb d0790dbd c907ba13
+    0d6c2b20 61ffddaa 08889af0 87b40007 329bd82a 5e0f2061 719974c4 f85d1ccd
+    6952ea92 ada673d2 82200605 539b70b8 73a6f80d 45aefbd7 003dd554 6deb4b34
+    1caebc9e 6e62d829 1d637ba5 6f9dbcfd e5846a25 b3dbaed9 8a062682 1c808f6f
+    5b214411 477c7b00 7794fd1b 0bfdd019 c31bba2c f3831dd2 5af28d9c 5ecd6be6
+    8053d726 fab775e8 b7411516 e295eda3 da3c19e7 0ce4fe5d c5811f29 bf732538
+    56667e55 c142f322 81303752 b13e0243 d558cd9a 9bfb69eb 2fe44abc 94c06363
+    9386f5cf 94db72f9 92882d0f fad54731 b8ce8133 ec53
+h = 74aab6e2 3835b848
+
+k = bf9f1b44 28f07fc9 e7fe88ce 15121690
+m = 609b0785 063ce38f 0dc042ca 17514382 74483f68 5fecb71a b893520b 961b68bf
+    2e9a9a83 77fa5e87 0075e339 6e13d9b2 753f669b 6e4e285b 87aa4dd2 47e80621
+    9a814db1 415627d9 819c2717 ae587de6 504ff9af 3963507f 6b530fde 0c3b1d06
+    c960f83f f9a14194 eea8b143 0a22ec96 ecb8277b f7b3903b 4bbbde75 1e209282
+    a58b4b76 99f65ff6 b2000737 cd0fdb83 62cc415b a456a1f8 dfd991b0 8e055d89
+    3f331954 bef682de ff3e9d1b 912afdba 354fec04 623d9339 858b905e 81a47544
+    8f2c07e8 aa398c03 b9d98a42 7920fe31 a58abbb8 cc6d5181 319f5c48 d9584460
+    2629a32f ca12a3c1 b8aff9a6 704b7b16 af60794e 4394b854 2823e9fc 044e568c
+    bb1f7bbd 104d3cf2 4c6ac418 ef7bece7 59cd9534 30ddfd90 b1e53989 db29f6d6
+    6993b5cd f958d366 01834f8f 31f9d0fc fec14a0e 7c5d866c c0ca3baa 7ec817ac
+    4482f34c e647470e ee3f63ae ca42a2e9 865f7352 fed854e9 34251567 33656d18
+    36283ddf b80068b3 d576ab7d 4802dac5 fe6e95f4 fe2f19a8 e3ad9c3c bfe3c99d
+    51103072 55cf5d58 e3b44495 94ca4597 6c912256 184299cd b5736049 5b3eb424
+    0d411285 e751b239 29117f1d 32ed477b b813822b 928cc1ef fb203f53 bb15626f
+    3c19eec1 2c8ec665 810fcd0e 05aea08a a1f5a56f 01a22a1b 00dd9f51 a9dfd0a7
+    3156520f 07a4828d eea0841f b27896ba aef8f73a 9b01b4b6 842669f7 8b8f8500
+    ae3133c1 3955659a b7b78e36 6a8aa1c2 9f21a2e9 10942166 530824f6 8726c281
+    b9fba378 418e803d 6e3965c3 bc82f639 896b12ae 8dcb244f 65dd7a32 8a19ab42
+    bdb63c0e fd1eacc0 0cf909e9 5b43126f 7a8fa409 82afc6bd e9c38913 8c18bcc2
+    182a1194 9220df8e e3d61d3b fb7e3351 4dda3766 4927765c 10bd45f3 d99c5748
+    172bd914 dc941ca0 f4395162 550f3931 cbf60309 7ed8ceb6 f9c288b8 64359e54
+    770dfcaf ec4b92af b2525a9f c6e69792 9c566261 13f5aefd d3aad338 3cf76db0
+    5bdebe6c e9e91bcf d25fb638 64ad5c81 09eb7563 9e34793b 7656a404 6ae486f7
+    cfb3c01f 02c2ea6d df9c99aa bfc2291e 6e5cd92f 2cfa5a38 3108f62e 25cf9834
+    3d5b8267 f73bc943 b067099e 34a3a11b 6970041c a389648c 16edfafe eea39a09
+    9247f9d4 25da9678 fd8b8a79 2d9373eb be24bd19 b0230316 3036db3b 02e8153c
+    7b716320 5342cc45 70066137 79b83769 0b27e1b6 656178
+h = 9fc64351 fb13bffa
+
+k = 5401b471 431004b8 f4227afb 505f1f1b
+m = 57242ccb 9c8f99c0 ffcc7175 00272352 e78b5dcb 601597e8 a0a9193e 2d297fb9
+    5e5e08be 3aff4497 bbf19c20 5591218c b4191688 817448aa c3405e56 ab02d0d1
+    30087bb2 2f4040f6 f154fd44 c75ef249 864134e4 0ea3c502 115362fe fc924b5b
+    46ed2a0a d6de5dfe 786ea7a7 b1aeb406 66d91297 7b80e3ce 5b2932b5 920302ea
+    0c5cb9ad ceb6bccf 7f5eda4e 731b3239 8747b1a3 f5aca7fb 05729cf0 2152850f
+    c706e4c6 8823b649 c705659d 32a8c10c 57403ea6 6ff73763 94e58e73 919fa59d
+    c958a950 957d8510 47620f8f 4b76b492 850b3044 24272377 a3ccde78 67554f12
+    ec7db7b1 7f832b82 6d494e63 47988a29 4c99fd1e 6c1ff559 51c841a3 c8d71cd8
+    c0eeacec 7506829c a0761310 801c7f72 773a9297 fc2775e5 901bfead 2a8ed8c5
+    c15974f3 d2d3aee2 9d9fc68d 98f29b4a 274e2fa7 598c0801 69979dd0 83f236ea
+    d72455ce 758bc31d 8d94d1b7 0e498595 a5b8c8e5 ddb2916e e9e927fd 4cb998ba
+    70238607 fec4e8ca 7757a995 94549058 a069dcf7 199898b4 0b9d750e d0686734
+    4c6701c4 75f9825e f3e06eed 0dcc6187 53da287f 04ccd566 d89b3947 78b96ae1
+    c425ad53 86828b3a 2882fd1e 2dec80b7 3437c820 171bad3d 191b1e1a 9278b63c
+    1ec00ffa 4692b4c0 a6a69de8 8fc7215d 1922bf33 ab7b7e25 ad464c44 30dbecfa
+    99364523 3c976ef3 9be52ccc c71939ee 188a8e51 9f70c236 e6ea8b07 2be1e250
+    7e321fdb d08820f0 c24b3d81 17fd9af7 5a76e31a 72659a06 58832a47 d74a4aec
+    39cf0bc2 84fe3916 d340b557 82ee2686 5b2a1770 e3a76b21 fdff67db 698388e9
+    af88f1cd 882a03e2 8b9dd864 537e1eff ff5b77c5 aaccb3b9 ccc0b41b ac7c4743
+    6a867ad0 3edb0b0c a1f4e6ec 416f3b75 aa2f55ad 68152330 b2a12dbd 62e40378
+    098e9d25 bd9c16b4 669791b2 9bc3801f 86c4f16c 96daafbc 2fd5f677 1853fb30
+    addef67c 72e0163e 2897afbc c3a080f9 25fcf867 5db10f7d 90ed6b97 a587ad04
+    f3eed7c0 1f41c687 2fb9f90b 5e8ecf54 8b18d20c 60db4b19 cfc4d60f d81ddc35
+    46edfaf4 3e26877a 2fff68f4 59eedad2 0ffc64aa 50ea57dd ba92f14a 8d567949
+    dbbdac5c db25c664 71999839 8e972388 f3d6bcf0 77ed0e02 ed4fa695 5fa3be2d
+    29593954 9017351b 9a2245ff 7d940599 142edc3c fa3e7e93 483994ea e70b46ea
+    4d15e89e 462d61ce 3c4bffd1 18cd5109 927b5a4a 5ea81f87
+h = bae0d087 38675120
+
+k = 744c1917 226c9590 192f458c e24db93c
+m = 00221e94 764733e7 ddf999ac 5ac5fbbc c25e61ab fe77c9d3 8e43fef8 a170e0a3
+    409561e2 8e3c5d22 1a4b118a 00cf10d1 a4e7f18f c9759b28 c3a95245 1676c577
+    9488267d 7cb46c96 8e120f21 cac82d32 145e7b5e 6cb0d502 f9f506a2 1db081e3
+    23d59339 d3a33b54 0b861f2f a0260aba 325e9c01 bcf3d63f 24e35d9f 680e1673
+    a183fc75 8438cd8a 5f8a8fe2 45480ac3 20c94621 43ce2d87 a987390d 15209362
+    93cfa8be dae18de0 7548a217 44daecb3 2047e00f febc303e fcfcb32c ac6f2f60
+    ec03dcd5 8d8ab2a9 ecea20e5 48dfa6bf 73a6bfc2 aab2fad0 b6e3cf12 9af70c91
+    48bb4d19 30c8aa43 8807de26 e6c02a82 b98fbdf0 304178e3 5703912c b478b1cd
+    a7ac8175 edbb7050 a6724892 400ac251 549f07cf a5fde438 fe4ff374 82ae7d2d
+    4c40355a 4c48ecf8 82959f50 030231fe 64866557 e3ff9362 9d98afc2 a101ba1d
+    c93dd2b7 338ee5f1 cb08e5b6 f3314e78 37616e7a 68d23699 2fe89661 fad01b18
+    cc9966db f49893ed 0ebc6910 75c3da6e 4cae9adf b400182a d866a399 7d9752e2
+    dcde6f23 1b31eb1a 81046729 11f053b9 89bda35c 6b8a9975 1abe9f3a 78743897
+    439b2507 059d4b17 c8d59b94 cd4ec6fd e29aaf72 4d6bc6e0 431c9a2e a22f42f0
+    7eb228a2 72c6ddfa 1658e7d7 e51f57e7 d11b8244 4da659b5 77d1bf21 9fa9fbe6
+    eb26a705 12773c15 6d862117 105e74f4 5ad3ab2f 02760f07 1cc648a8 f75a4661
+    9b55aeb6 0cfa4702 4a253176 4f2d2725 d768e936 5d11407d 7514921c 37906853
+    230f2864 29a04af5 430c7152 86b85aa7 86e0bf86 bd06a5f2 f7fb0d57 d159a24c
+    30327c93 f38e2eaf 22fc0ea0 7017a86e f8918271 258ac814 a01dab38 10f6da07
+    6d9b11ee b8ad2f99 19414c6a 2583d32f a2587e07 b145221f 8d9eb300 53b2e71d
+    cc79e04f d6b2cbec 3eb6ddea eab91d1e 885efe3a de34124c 566d6611 95f0995a
+    11769ba1 6d13335c 32c570af 63363507 1795d20c 846ea080 a2b01d54 c3aa0d54
+    435d440f 9636d901 ecf75ad6 455336d6 fb83a5b6 5724c55e 3d321f85 3bbe701c
+    fab0096d 4809d585 748238db 7f82d44d 6a284300 6228439b aa308e90 6216c70d
+    95d7a439 e036889b 2efc76ed e0831a20 aed35f90 ecf7d05f 195b4d68 18dc9a2c
+    0bf7d8e3 abf25664 8f77f729 61dae2bc fa97bc92 fd9cc4bd d6c3685a 07bcf92c
+    ec2cb5fb 21742c66 515c095e 73895479 c7a45131 8b568bb6 ed
+h = 895a4181 e14e1ad0
+
+k = 70a61216 02fb4b75 e64b9af0 d5df2917
+m = dd310fb8 fc4384f0 4708f75a d6c1536d 4dfe2868 0656116f 15d4edca be9d6530
+    0c7364c5 b88f8152 376f27a7 02db214c a85a0221 eef40aa0 70a8cc64 6fd97406
+    00fcf831 801aaa51 246c0eea 57a2f461 69fcccd0 b2b7abd6 d0c2c060 a85899b5
+    ed25325f 6d43bc83 d2ecb6c1 5886fd9f aa0457f7 d3f907be 0b3f97a5 2d19c84b
+    2fc5e4d9 8c0b06a4 6ec401b0 c6d1f0fb 449df610 03a4f66d a9ae9e4f 2bbf97ee
+    e169004a 37944d57 13c803d0 82d6edd5 7aec2c3e 7d280387 1dc85d02 2acfeb17
+    d6a02dfd 4b5dad10 ffd722e4 39144d32 612f6de0 d7771348 9229f3ba af663fd8
+    950ac136 b4d609e9 77649dd2 47315601 ef7b9026 e7e8a1a2 bcc3f2b5 d003fa07
+    9b6dd39c ef3328be 3ad16400 d233f450 48a1c2d4 d352a7ac 0d622b10 e3e0faae
+    d7a7b87e 8c2dacc1 b5b7b49e 5c4d8916 2fd1e2af fca88d16 36bb5fc4 57ec44f8
+    4528c119 84065cc0 a65db540 a695e8a4 29a990fd edb27bd0 b5229b88 b5fffe32
+    e1902f06 ca5e378f 9d62beea ec364cf9 f9396357 f9a451eb a53b6e1f d49fa6fd
+    39def78f 53f8803f b08791ab 008ac69f 7a966ca0 b81b9e85 720e8171 ccabc273
+    c22e35cd 5db19827 9769e5a7 2f8c097d 9a04b8c3 583478ed b509624d a6adc38d
+    612ad600 0531d18e 8b5dae51 7294c108 68de9a44 e0e802b1 773e7b7e 2a4014c0
+    bf53e419 81b456da cf3e5f99 c0ea9cb7 83656342 011e7349 6ac05b90 61bb2738
+    7475c469 a5187470 0d9ece8b 381f76a8 713f2b86 605773a5 a6a74520 d753e19a
+    fe7a82b0 caa5c441 8c45b95b 1095c331 0f15f240 a0aafd1b f0d378aa fdc96823
+    b12fe86e 891f3692 f8cd6983 6e2f5ce6 0426f3cb 4695a326 394655e9 9d860d37
+    ef2ca93e 845ece83 f342b1d9 3b75bc49 de76462f 08fe5fb6 d5e88e4f fc342021
+    dd6ad4bf 7760ffd6 9841c9ec 3276f08a 86062a60 af684c75 fbb10e24 33395edd
+    08aae047 c3d4e3c9 bf52981d 1226f829 503c3184 7b8cc3ea 52ecd61c 68a92fde
+    3ecaa4d6 0aa8aa27 4f551250 7f9a3a22 777144b7 a07f269b 15f81951 a6825473
+    b242d272 1f572a0e a8968cb5 b3bc69b6 7010f667 8f7f611f dd146937 f7f42138
+    f15e9c9f d73c454f 17c23a7a 5ac51bba aba5951b 11b7ecd4 346dbf5f e7935572
+    8e33f860 2bb97553 fc5737e0 b8d1dbb9 6a06cf83 5d77669a 9e937d9c 22c8a5b8
+    78008506 362c0a53 81052b6d 03a437a8 05b7d1a5 0bcbd4ac cb05
+h = ccd0c2cd f07b44ba
+
+k = 1319a58f fb87b6b5 7ca68897 e3f35cbd
+m = af3bd96c b9388519 67175cd3 5d08b6b9 c93e9e3e 3a5beedc 97a7674a 7606975c
+    cd489e6f 22992407 b282451f 025d97f7 ea628e83 52a8ed8f b8365378 0e8782ac
+    f2eedc85 566ee1cd b50158f0 4c64db2d 2e816b60 1ffccd35 41243c84 4b60777a
+    c01523d6 da520d5d 902d224e 575298dd 3adfefcc 597f9d37 bc7cc552 3b351c8a
+    6115c01c c779f20e bc418778 5148d5c3 6ee13658 a95fe22f 446fa444 cd25f6cd
+    36fe9300 1da9e0a8 9844cc55 bf4157fd 12c15e6f a35268ef 56bacd3d caafdb71
+    3a0c0a65 563e861c a1a0cecf 5093da29 fa91efe5 edf9ff78 c04e7005 15196ce3
+    9cf14c8e 5258abc2 feb6bd4e 9aff3c70 27a9534b c75c6356 006ccc29 f217b448
+    449fee93 94717349 a5a7f05a f327dbbf d9bab6ae 3ce2ed30 4586c45f 46d8da38
+    12f6ab1c ab675e0c 39599e70 86d3ddd5 c5f7965a d216283d 9e987523 674f3f35
+    25584cc0 678e89d2 d0c1a549 f97cd890 ddfd4b11 dd2f31f8 65095ca7 70250b38
+    01193e8c 41632e0a f5b7e4cb 2dc09c95 d837e2ca 4e791a27 9996500f 6d7f85cd
+    e4f23883 7fde517b 96f9d33e dc1668bb 202deaf2 03e1b048 bfce22d3 279bfcd9
+    21365d4c 4806376e aa46bc26 878f9d50 8e739052 f0031853 caa4795f b37470c8
+    5de07fbe 770011ff 7b9a2bf2 57295a30 136e90ac fcd97949 f13ab9c4 6af83939
+    c1d468bc 84106016 c996a04d c5bbccbd 09c21a27 c4c52bac a4c88688 73cc3888
+    c42001b5 8a829515 925ffa64 1becb137 06259454 3d68a3cb e220b849 6c2c628a
+    86460840 d1d8839f 34d8f6f3 5f3d8fd4 0eac70e0 3175455d 94da288e 0be156fa
+    8483d485 54d5315e bd50d2c1 9ee09ac3 a2d0970f 12327918 36ddc970 e41d6abd
+    98cf7131 992ea20c e92daad4 b21dea7e c797be32 60cee3f1 dc246de5 0ac3eb5c
+    6ffc9339 87d288bc 9727dcf3 12c43f26 1ce7aed4 5250e775 2f86a79a 214d2ed6
+    6cfefa6d 4f1dc157 c26c92b1 36ab1eba bf01fb3a b2b940cb ebbe3b45 5a67cb5c
+    cf43faa4 fa299795 355ea267 f5bdf11b 1e15ba2a 1487d726 7e832e70 23737351
+    4119684b aa524a68 8fcc520d 2d568c51 d49700be 04800a00 0d75b0c2 27e66e3b
+    55e82616 a8b45365 696ed464 543c7d86 20fbd505 3b19a61a 5eaea8cd 8ff44d4c
+    66693075 f9a14a2e 3eadc5d9 23f5a4e3 e64960ae 33d2b91e 17bda0c0 a86b6ed9
+    8a2ce697 6b86e6c9 70eace6d 9a782aed 01955ae7 06d5907c 4362f4
+h = a4b830c9 12e9c344
+
+k = 3487da93 14b87e94 b620aa82 d183108c
+m = 0270fd96 10ea4937 ec61c062 154b9065 8b35ceff a1ff11e7 2e61be33 41bd0bd2
+    b72d68f3 1d43399f 2c54b046 c804ce60 814c5f9e 15e7e2ef 3c6e822f d2cb9692
+    f26e4c72 72285ec4 617ac620 7fec1ee9 19f2758f 50837f78 f9a8b9d3 c804b48d
+    a58a9224 9402645a 5d7ce14b 50e06621 9bc4786b 223ae567 bf0edb0d 8d8b1464
+    123b07d3 533702e8 c490c68d b6f50c7c dfaa9fb8 af41e8b5 88d93cef 9245027a
+    968285d6 bf769c98 9c1bf4f1 03558839 de6682ce ee3f446e 95813459 2f71bea1
+    45fde3a7 d194208f 5f840018 4c684c1a b053dc1c 9a6bb5d8 30262574 e074d3d6
+    22579898 6dd5bdde 9afc4d2d e544048c 1e95072c ea23c1c5 fb92b1c9 743453f5
+    7926b454 6cb8e765 8ebf26f9 b19044ce 7a6f9859 7d019b70 f0911b91 ed518c38
+    5520c2d9 b701211f 178c558d cc8e93e8 87ad2286 e4b67902 8badb305 d57efe86
+    40534e5c 3a2128aa 11e0ce83 96ecd640 cc8716d5 4a81be22 2419dcc7 ede9847b
+    2c5ba390 3bda2b43 e164bf95 89be0d9d 1398acdb f2ee33ba 6d731e1f 65075b8f
+    3df73b62 69293d44 42813c45 2d916aef 7ccaea12 5fa7ffe0 2b5556a5 d9b46bc3
+    1cb521e0 a9f259d4 ef804a23 ae5eb9a8 4753f7a3 65c2793d f5ea5ccf 3743870d
+    a90c7a7e 4cefa73a a435b7fc ef61a1f7 5bf465f6 5f216e27 36e9dfc4 fee245ab
+    63e70fde b96f92e5 93b39c4f 5001d479 9700e091 b6fc7e88 a50af200 c81d26af
+    2ba90e85 107d390b 7d30d246 d3965df5 9d36c153 03ad494e 6087d545 f265613d
+    70f60a77 e5bd1516 6549fbf9 00852c2f 395d1179 7a3cfeda 0a0f190d 8c13b31c
+    92094f9e 93c731ff 34ee7988 5ee99500 f39ad887 2a9520de 6179c007 d374245d
+    8ee345af befcda48 a613612f b859e83a a40af02f 49c44c69 43b3cfe4 7cc56f23
+    fec25514 09500f06 68e5468b 298e7a85 3bf5edec 562e86dc 3cc956b2 6ed6207f
+    858e919f 8ed8890c 66a86299 e7fe461e eb62b01f 4d1b6814 1d031990 4a3d15d8
+    2e37932f 9cfab832 70f7a425 8618a6d1 761e67a3 c6c66d1e 1ab9def6 4c86610a
+    89f31de0 409be40e 02621e2d b2978103 be53705f 52081d3a 57e548de 99ea8d90
+    468a7ed6 a99a041f f7dee1c5 86ac7aeb fc50d4d7 dd075063 1559adf5 c60d50b1
+    1353ab7e ff927bed 6cc9e9f0 b44b97fd 7d217c24 2d228a03 294614a9 787d9ce4
+    4bc65ac9 e139cf94 f71e76df 9bc8969a d558fd9b 1a4878a6 4ea5e41c
+h = 8628757e 68ff8e92
+
+k = f84565d9 734a3582 0ec7bd06 d72b4ed0
+m = 1bdf98af 8ed33e6c 293062f5 3f8927d5 c7d4049c 7d946752 bc9198ec 95603fd7
+    b30e64a4 2bafa47c b0f915e6 c91551a9 32aa84c0 bb38760e 6003945e 1c9b9352
+    101dda24 d4c5cc9a 92f338b5 f45cd268 16cd8aea 3400ed8b f7dc56a9 0a7a5720
+    e1b05834 dfb6333e fd304de7 c9546445 bfb9a288 afa98bf1 fae8cf14 ae0e63e6
+    41d6b31f 2779f6c4 de4aa404 06d8297d 67cbaa20 a1513dfe b46421a1 6b4e634b
+    8a95b925 c163ec17 94edda7a cc83a91d 37249610 21481e7b b7e6512b 96b0b806
+    894e855e ab5e0d37 60b42228 9539988a 9d224337 289c413d 75acfd99 31442328
+    75646890 daafb479 48b33aac b0de1ce9 3b6bcfef 2d8dd3bb e88cdd1a ff8b2730
+    1c580718 76d5871b 6dc1f066 1a8f05d5 fee25fa2 f747ecc0 7e8ef08c 782439c0
+    7d981031 4b91ab9a e68bb4ee 58f01b83 25a16e16 d0bde753 4859cf9a 8b794ab7
+    9535ee82 3f6f5a19 2120b107 cfc8431e 5edec208 aa52d083 c2f16b07 43732fe3
+    0fab227d c0484f62 aa791d59 d271fde9 6d801d51 e2cd9280 ac469834 c38afda4
+    40f98582 71567e24 c806062a fe2fa766 bcdbc99d f26834ef 2202929f d9c2dcb2
+    f7ac5ae9 05335f27 4e80ca42 4e57f0f8 8c06a457 8b48e796 5dfa4964 048d69e0
+    4492f2b1 2ec8f234 2aecc62c 41b501d8 dc950799 18acf164 7bef62f7 f5c6407a
+    db449df7 305619f2 6eb89188 87e09d8c ace30606 c1bd9673 b5f4eff1 7df7ddfa
+    da71010c c25be14c 7dc0fdb1 ed854172 161f5970 0d9edb8b fed878e8 bb923f2a
+    ea7ed5e8 b747b58c c7198eae 8fe18041 12e05236 ea8b847b 75095a11 7a8bbee5
+    61d57082 857c09ba 3c42308d 7007496a 59cf9099 fcb6c5e6 94d57a8f 8dc3da6b
+    f47905e1 10c7a0d2 8268fdb8 e32585e8 649fc048 23b0059d 56e893d6 8c1d9628
+    57b52d4d 95684873 335c62a5 4174eaa5 529efee2 6e812351 e230bcb2 736361d9
+    054b6aab e6c2262f bd27b0c6 67863919 662a9535 a7a7d71d 9ef27936 008a2bba
+    590445e0 01a189d1 32abe2ad bcbab6db a19425c3 78e1cda9 c7569701 0fe3a012
+    19d5ffc3 364a4044 c5eeef0a e535ac97 f7448bc0 37e9b7c6 4a992c95 87bcb107
+    d1745546 481f0a4d 3f086ba1 3981f090 582dad4f d444a615 66191b55 a96243d1
+    0a2fc4fe 55353c89 0f2361a3 af2f43f1 1eca2c8a 6e84222e ed13c837 1a813b9b
+    fa3f87a9 d59b2434 167c5e9b 79ad8ea3 5cff91d3 b28e7834 50e3989b d2
+h = b6914212 9e70ea0b
+
+k = cc81096d 65200f12 b4865b9c 35b20d40
+m = 169648e3 667af58e 7c725d2e 2c8a9300 103daa56 0e4c5a3b 4523e3a2 d48dadf1
+    6fbba643 66c51c24 782b0cfa 8427fe4e a1b686a6 1c3523a4 5dcb1032 36a7768e
+    0bcd1875 41f067ae 5af20ec0 ca39f866 fad9a41f 05a2219c b4138b9d f68dc426
+    05d264dc 536f6643 73eb1a74 76c8368c 49447bbb e1647d2d 687a2752 121996bd
+    aeceb6ee 6456b72f 940f6173 3e4b59cf f9208468 0196d2d7 74fd87ca ca94dc9f
+    cbf00bad 8fabcb4f e173c6e7 3c8b2859 258f072b 51860846 5482e1cb 7fd7483b
+    8cd670d4 667c2a6b aab24321 2607b761 a061168b 8b01fb82 667cceed 41e7fea8
+    8685d4e6 0a7ebce5 2f4365a4 80f7a49f f6c5f8a9 83ae7865 02a7f700 53d2c3ad
+    534d34a2 3ab55c0e 3438fd13 ee6c8077 b34ec424 94a1e25e bf75319d a9446dd3
+    8ab8b827 5b432331 ae720e85 324eb1a7 fb7fd7b8 8bf47236 d104f5ce 113c5170
+    12fb50de b7974282 f7f3323a ec22e73a 8a366048 40d6580c 079c4e3a 00cccdac
+    30947aa0 92d84dbf 21d01589 f886a780 bed9dc28 1d1232c8 ba3baba6 6d4fc2bd
+    ed546f63 2b6b9c08 c176fec4 5aa3373e c52a357b e5173b76 905a6763 f11b39db
+    e5ee0066 fe549efb 3def617a ae6352e2 accacea0 1deb9230 cc68221e 87de1b4c
+    8bb49502 81677a8c f18c523b b50d53c9 05597532 23522de6 21dedd0f 1eafdc03
+    c1f46666 f8df329e 0965b92a 1641645e 2f152f5c 22975d1b 59c159f7 4f464e5c
+    fa4cd14a 58e3661b 656b1444 5b4b9467 d75a9fdd 9b563c67 ea863c78 04956050
+    ff5121e7 f4b96334 20d9ca8f 1865f593 20be5a9f 1caafadf a3e9a657 7ab4f820
+    92d61338 95b12c5e 457d9209 c967d0f7 b59f6275 bbf79068 26e3799b 4880b5b2
+    eb906573 952ba430 85222c8e 922e32e3 4267edd9 9d5a1370 e7208d40 c75875b7
+    fcc521b4 59b13df1 6dd6aea2 f042ca56 e13601d1 a676e009 e30f0754 2bf593b8
+    600fef27 f4962736 5667ce9e b4f87716 2862c3fb cad6338e 1d082eaa dcfd2b76
+    f4ddc58f 09aeb60a 86ddd0d8 0d97732b e9b95971 813d3063 ca9e77eb a766007f
+    8ec561b7 bb0a3aa8 a23d622f 68d1abf9 9b36e493 1275ca4b 94125e2c c4c4d79a
+    ee2f75cb dc44381f 616fafd5 c0608307 d9754afd ee3c9c38 d6e8c667 ea21b6fe
+    8ea0c6c9 eae7a3a3 3e8a2c33 b854994c e439c5b3 8fb48a02 a655b22f 87fec0f5
+    c85b0298 a3fda94b c2e13e1e 380b2dd6 7adeda0c 62a39b3e eb24ae85 c15f
+h = aa992d33 620a654e
+
+k = 24298f83 77a633a9 08a7d299 eef3be97
+m = eb5427d5 c0b1cbba ceb6a290 69229bd6 49c97002 6999937c 06b8a8f5 662ee4fb
+    2400b21f 0452b2c9 54c2686c 983ee9d5 1db33791 d7a10453 a732bf34 9824f359
+    e1774fa3 5a62523d 95e9af0f 54dbbb23 633ce3ae 90059698 18b55524 eeee4fc9
+    ef16a5d4 8861e9d3 49fee8b1 9b6c17af b90bf7be 0e8130a0 deb6c867 cced220f
+    31e7696a 7154bd14 67999038 d52c272a 10a37043 9076f8a1 89a813c2 f422c0f1
+    8d2582f6 55c8c473 a289d3c6 180301a8 3b52b17f ae3658f9 18d3abf7 7003dfe2
+    7cf2933b 3e540304 7f002fdb 35ec2ef9 22050996 806c9505 8b30be48 5a850218
+    84ea1a2f e4b05569 68794e3b 5c84ce7a 195862f8 ec6b3620 021985e2 6206afde
+    2581e563 a2dff7fd 0dd8bd84 4e7db97b ea7d45ec 491fad3a 20b01669 a1b9941b
+    baa6ecdf 47b48b3a fb64585c 45af1dcb dea78820 5cfd1de0 6f052615 372cff45
+    b7284cfb 552f2ee0 6eb76878 98a003ee 02f85080 110a78b5 c08b91de 6950f4b1
+    a0567a95 837cb589 2d1d3845 205a4472 1c1221cf 7f5fff1b 1945eb5a d4b07782
+    50a0f990 f757e753 3343bec6 8400830d 70903eed 0757346a e6bb5f1f 07d42abc
+    2afd5c20 bc2740ec 866ffb2e 5cd4c426 f75304b7 609b9f6a 53981392 b8a394c2
+    13ec292f 9b36bd95 eb4797bb 3337c1cd 10fbe6c0 47e743d1 c252a0e1 cb49c553
+    b82da545 a92f702b 847708b6 2813a3af 4781dc9c b9d0849d bd493373 fc2d5ae4
+    a760bae2 3fee63f5 a96aecec ff149e8c 52c1d2f0 25bdd943 432caca4 5f498fe8
+    69a670b5 6b69c0e0 b4427ba5 c8243abb 00df98e9 7d69916d 16973ba3 a7e5f463
+    ae6be1be 57100f95 d020c4fa 50b09cb9 0d483f68 feecaba0 8f4adf46 3e284b7f
+    4b356c8f 30d20e91 2b7d82c1 269e8f81 0e4141ee 306cbb37 2c507bac 964ecf36
+    99704df5 3b1d82e8 3ba66cc5 87cc9a76 81d31ac2 3c72f534 b867d94f 1499cbad
+    6f80626e 23a180af e8ce4cd6 8f438c28 819335ac 0851de86 610fab24 cf5a6445
+    6b27c8b7 5d8c38e6 8cd7b3e4 ff48a76a e96bb658 26c9e93e 0eb5d223 3e8ca929
+    da202493 c3a9b716 a831da6b ce3b01ca 35822047 2a26820b 0c51759e 9ccc2980
+    670de206 6ad58b11 4edd74df ceb8420a 829046c5 79a43f25 92ca46cb 7789bae3
+    cd0a2e60 97b33445 e0fd11ee ec9b9c9e 3254d6c0 eca66aeb 8237e23a 6401f3e5
+    1cedee3a 87327b7e c3ecb534 1c1f5293 2762fa29 840369a7 aa632bf0 a110a3
+h = e9145fb2 d96a754d
+
+k = dba0091d 6c38d7ad e3bd98d0 a072167e
+m = 2095c40a 7005f03d d2cad265 7dc15e95 c4af1e9b 8aa0fb23 4559a9de 943abecc
+    38243176 a0b41ceb d3e92093 c94f5610 6351e64f 7e3649ce 0c2d961d 3153bb12
+    fca0b28e 0b6fbc24 06e60adb de7b4a47 a37f09dd 7c96dcbe b607b607 e56699de
+    fc6b23cb 5467fac0 855f9e15 76e27260 656928cf de0fb290 21deb6a9 7e29943b
+    9c269d31 2967b6ee 7fa77647 1afc8580 01b3c4b8 de33af31 05f7bbc4 c8165adb
+    4d601fc1 bbfe28f4 2081f3e3 d4f7e60c 7aad0b4a f9e8d071 465bd712 827cd8eb
+    4e8c0631 319449a8 c7955e2c 128ba503 0863f6b8 919e5f6b 192a5b48 aed4e5f7
+    70b8016a 41e09428 f2eb81b6 778011ee 975eed78 15a7ed79 98d3539b 15be14eb
+    76fd76cd d58a3774 fafee5e2 4aa4c21a bb5112dc 1c38b2e4 74823722 2d9dc55f
+    fe068633 c11aaab8 fdcd8c03 2dcdc0d7 42c83e16 00e7df60 9ab79773 a6232a7d
+    aeee30be 5cc7166a accbe8bd 3a3e9290 fe8c2ca8 141a6616 b60005a0 b11367db
+    7dcf1b3c b11c8135 21ab6082 468f2da3 8f4c3f77 3bcbb728 86e529d6 b5d71571
+    cdace391 dfc6adc2 22541c21 00756acf 7fdedc97 05d71ba2 fa8b8292 7fc42be6
+    daf4233e fcdf88f1 b078c1df 62b5d94e 22aefdf0 350eefcb f479df41 7dfc671a
+    df847d19 2799c4fb 26848a5f b19eb33f 4f61a00b aebe3629 ad7c5dec 67f5622f
+    a1d99abd 3097d5e4 bfe9b180 984f106d 902061b4 8e5a5a8e 346a47ba 43f01d72
+    4ce091c4 10c7f50f 64fb1055 316875cb 3ccb51f5 ba4a32d7 50607544 2b88ccc3
+    a77fc64e b3a6f731 d79f5375 3d3cfac1 07b97288 bf2eca7a b2759f6d d229de91
+    35e9c494 9496e820 9d59d11c 30254c9d ae3067b1 a7710e8b 55e24ca3 68b960f8
+    d109cfda a189a901 97d0db41 607a5870 292e50df b96f687c 6eba968e 5309548b
+    0b445099 d34fc782 94ddb216 07ff3cad 020b275e b56f89fc fe2fcb60 1355722d
+    b3fc184e 72889591 dffe0bde f9d9d6d1 175772eb ccad9d03 cd1da05e 950456e7
+    31c572ca d04ac518 7d76a5c7 275d594e c96ac432 926e895f 3cb28be8 04c2eebe
+    0b4e2651 1dad6b63 e63d4b0d 14e104e3 3a2a374d 8a1761b2 43bf85c8 40e5a940
+    fa69fa31 39ec087a 848676d2 5f5a5912 b08b5fa1 673b12a4 989e1794 f518f65e
+    1cfec135 ee8f8b25 34f4c1b6 f3e10a90 12448234 e2d05246 7c9ac6d2 bb6c821f
+    8678c32b 9c541f18 e30ac08a 47bc368a 074a309e 4d932949 6aeb71d0 d756c93d
+h = 818cf7ca 5ff1cb49
+
+k = a994429b cf81704a a7ac753a 1742c0ae
+m = 4b26251a 73c359f8 8e264ddc 63c396f3 b54303e6 402e86d7 fa19ed4f f7663bd0
+    0fe00696 fcde2ccc 56caa417 a2044951 0d351dab d2fd1a6d bed70cfa 77fbcb73
+    323d1c6d de7bea21 eac2a0cc 52830a88 bd9aeabb 6df63288 5c9fae20 ec923308
+    ea6f19be e16675c8 ee189767 0a179684 7419fe5a b50bffaa 3ffcc674 b189fca2
+    e1e56c60 edb96225 b4b0a9f8 df81591c 6fbf6714 bd685767 98fd8602 d3dd6821
+    e5c34036 11868e15 577e27e1 d26853c8 7d916431 aba756e0 be01b83d 46b610dd
+    6159463c eb85d0ab dd63bd0d cc3f5765 dbfaf03f 42a501c4 ea0b18e0 4e791efd
+    1b8c87c6 90e2f196 47511b95 0813455f 94f4332b 338474c8 a3e7640f 1987724f
+    d536a481 ec8a73bd b94e75eb 632d49e2 ec511d4e 5147b577 71b1680f 6398fae9
+    a970a944 6006c033 f580bf64 6b17ad8f dcf7212e 847e1b83 b7bfbe6a 058a019c
+    b1807c42 fb311982 01b6635d 02a60c2d d6b51171 12893dfe 46fc4113 065be8b6
+    11fe0aa9 f29ace5b 3893f13e 12ec84de 0138b4ff 4b2ff79b 40823644 ac9a3167
+    5c5ecb6b bcecb1e6 6998dcad 59c52613 cb76f4c2 25cc5235 774a30b9 bdcc6b39
+    e670d54d 9947ef28 cd4cc179 36b2916b 6a3ee9fd 5fbe9ade 12c5e666 111a1312
+    3dc87694 4a3e05f1 0959e4d3 12323ce4 c116a638 7b218f75 4e8ceabf 47b250c0
+    af90d130 6b3b4fb4 4f50483c 91566aeb bb47abbe 7d9fa090 5248f8dd 1f38c84b
+    fb7c8eb9 44a275b1 ded5c593 3d68b1c4 ebf47de7 e316c1f3 16c41851 27b34166
+    a66aebf8 37c6df7c b300cb60 b2726ec8 bea95501 1c950e82 10ae7861 b9250877
+    dd5d3b77 ebb53b09 823bd1f7 31cea08a f8955c77 bd713f75 eb56441f 26441c22
+    f9a8ecf9 2e20e448 2e8b0b78 5a072969 330ff3b3 81d86b2f 100fc6e8 5c8537d4
+    84b0d4f7 8477d24a 4506968c 838da765 f50417b9 24288460 8ac335cd 0064e3c7
+    de65ff6d 33348286 4b60c248 4fdc9826 0c69d097 0ab1e527 63cddae7 08211704
+    40e70834 fdc26b7d 244cb5f6 a45e96f0 7f2b498f bcfd1526 128873b4 4cb419e1
+    4836307a 8324c1c2 8b925116 edef9b28 0343abb3 f2b19f71 ff8300ae ad65167a
+    c948126e 80b97482 6ac756fc 6a6fd646 ca36e0e2 d9f6ba74 4cfa9206 357a18ce
+    2487d244 19713a8e f8a4c1c7 f4c5f8aa b1e3d759 d97417e6 b8bb97da 2d0e7762
+    f9671912 34f844d6 644bfd0c 187450fc 0e98b20b 4119af61 9c1cd01f 50f85319
+    be
+h = c1218464 4c4baa98
+
+k = 3c7ad7f5 de63d675 075683e7 5cfa2520
+m = 323b3f8c 6f5c2020 05978c7d 0b415868 1471e8b6 3d248526 87f87c3e e3b71cee
+    0e95d8e3 c0a03618 4ca6aae4 db7f7428 af9d1a52 f664f840 3936077e a40196db
+    bbbc91a6 5d130975 868e5853 14e7d637 a68a72d8 5604001d f13f04a7 22463ab5
+    8c8adce4 c28f0b0e 61580492 febf7156 bfa1643f bf104703 456a4e32 e2775296
+    aa1d337f bf86ae11 f9873e20 0abbd05d c0af76e4 c3300429 0f9f8e44 07db505d
+    a1231382 28e1c11b 088f8196 0714cb94 0c7cba53 f8df72d3 29f92bf3 0eb78ece
+    0b6f5664 ea5290b9 a20388a0 e0e0b6a8 43527281 22658b1e ccbf1a87 5d49bc78
+    97be6557 308736ef 06feb2f4 6805a4a0 39541a36 69c7989e 3f5ff8a4 960e0ade
+    41848a4e 1eda18ac f08f2e7b a40fbd21 797c3ad4 2c253591 fbfcb9ca e6697d4f
+    13e7c04a e290b208 e39cc848 c7f5267c a324fbef af5bc63e 77439c12 280a37b2
+    531d1204 5ba134cb 0a8193da be3396ee 2c682ab1 fa2b00e0 292a394d b695610c
+    a852b4fc c2f8d038 0823c54b ab3b8a3d a101346a 173d728d b41d4093 5dd67c16
+    b004f54e e8e50def 5992029f f3a3d9d9 5a6ff17d 255d0a9f 878a32e6 cf742420
+    b2087fac 1f21bafb 1ceee079 b676f1fc 3710c26a 03a4c767 7de02862 a9ddffa4
+    e8fd6379 9d979a63 58a6fd9d d13c3d11 7d0ade28 dff2e1a0 8c47283a 961ea941
+    d82f5f72 2f5a1ea2 af649998 5de3a523 2c5b9f88 a5298bdd ece7a63b bf85c278
+    6040bc95 d1cc0aa1 cf85eb82 c8051091 43fda17b bf8efbe8 f1ceb107 7cb65684
+    913a80bc 43e17e60 015bb6ac e8839c17 251d2725 abd857e7 54148ca0 98c8ee5b
+    420af5db 2864df94 a8668527 87df51f8 03f41674 abc638b8 a95b1d4d 19f03e53
+    bb68fb84 98d7dd5c bc82d02e 83a23d35 6c96960b 838b0ab0 9a4ebd93 8ce58470
+    4c27cbc0 ffd493f9 02c39c8e c95de3bc 6af5ed4b 1fa8b8c5 2ba2f8cf 2a2b1809
+    f5f83412 9c2085da c9fb3edb 334fbd91 506468d0 078fe09a e5abda48 3f0c61de
+    cbe3d528 cb9b1132 4e5ad342 e5a3a84d 6818079a 1454d8b3 9dc8263a db1b5dd4
+    0d465f3a ccd622bb 0fee9292 34c44bc8 49ee3f53 214b2fdd 5555f2b2 7c8aedd7
+    6688393a 7d691996 523df5fd 1f118633 64453416 aba7bc0f 52ae1a39 631fb219
+    b95fcc6b 433454c0 c9319fcd c044404d 61b8e710 bbc93a73 8e6eb282 512e9163
+    2d1fe847 d3f73a89 42bd5d2e b74d8b9f b4dbe752 ad3a5cc5 a896e816 8142553f
+    1290
+h = 2cc5a615 0d6c9c92
+
+k = 6df92999 32995abc 8498e252 0a8b271e
+m = 91cf6df9 c64e0970 2abc5439 fac96cd9 fca5effa 2a6efbb3 7dcfc494 0be072c5
+    bbc50ac1 96649f76 26e1618d df4a1b38 95e3e477 5133b1b5 94b3b3de 5d48e5ac
+    43e57e72 76365ea5 1a9117a8 e881d26b 19e5eee3 94da6320 fb811888 5e2e6c36
+    18b1ca98 0313e8b2 f4f4c373 2bd40d92 f950ef2c 7191f12c 18d787d8 88476275
+    576fe6c5 ce440807 4205b1f5 257548da 2a78ef18 1f7ad74e 55eb0d56 de9cdd54
+    843c22b1 137169f6 7ec5079a e1317772 dcc1c370 7fd48825 437104e9 54bf75a7
+    67fba40b 40233c48 93498127 028f3b7f 204afc29 4487c6e6 eaca775e 9b5dce9c
+    52aa9f00 1a848333 65f29cac adfcb148 fd46837a 4be83ed0 2aa4bc15 7d91b054
+    c1308002 6644b171 baf74921 9f4fdd15 ecb2d4d5 37cda7b9 57b3585e 8f287a00
+    360d11c0 167c988f 1a480f52 200ee79e 04715e0d 6fca186b 04298f2c 57bd9bb4
+    b9769ea6 d2868529 ec38b395 515bd44a 90e6ff38 37f9316f 940841fc ef748731
+    96edd617 e1e0e67a ebc9ea82 b6c42faf c96b2e1e 53ecdd25 21388197 3dbee2d2
+    7c24f0f9 28084229 3e7d4cfe b5d51d81 4b0894aa 870200ef 54097d33 9c39c2ba
+    783d31ff be6425cd 13962f0c e48d5529 3adc9195 c9bf933e b1f6d2eb c903ea17
+    4be1364d 74998712 30e548fa 36f89ae5 b9824115 e3af3a21 7771721c bb6c4e41
+    60cdb5e7 410398b9 baa4cc55 cca1bbb2 5eab7472 221d17f9 e5c9de2b 2bd42d8a
+    69a774b2 c448fed2 c306c6d4 644a546b b4c63b1d 73f316b6 1ae834fa e6442e25
+    a09ad607 56ceec36 68bdeb97 afbba86f a1c856b9 669f651a 8f547e9a 3d6b21d8
+    152016cf 9d7af126 edd1dd1e ddecd84b e8d54293 cdc5863b f6ec0a35 5befa7c5
+    fb1f875a 378e9f53 8bbc4308 1dc15e4d a4dac7f8 8014c4c7 11afbba4 b9be2352
+    34caf80f de7af826 ce1251e7 bc422e84 e6d0d601 43ee4637 b2aaf1a2 4dda0fbd
+    55175fea 9277931e f66e4629 933c2ba8 846b6193 54260dad e9c1b79b 110a1246
+    f5c697d3 fc0309d3 22cd6828 919ba0ac 69b2d602 52f1346f 309a77cc 5a5d0889
+    681aca26 bc8f6a6e ea4879d7 6b7c0774 453e5fbe bab582de 5bd55642 c59245e2
+    a0ff8e6f 2dfbe600 c21e5717 13fa9f09 a89c00ff 80968ac9 c16e0f11 041535b8
+    f51406cd fd2bcafd 9a9e3f0e cac04988 c8b177b1 41f56ddd 85166858 a109316a
+    2eafc678 e5edd620 baaea091 9634ae97 99c60e0e 30139d24 99ec2980 e12da116
+    aa2404
+h = d60ae5c5 0433cdb9
+
+k = b6d4f168 bbc8021e bf05277c 3279ffc8
+m = 7b96f292 ee714635 f9a51aec 7843aedf b644d493 8d51e087 9a3e004d 8e449cb9
+    485cc857 1e76343b 71661ec4 9e52ac7e a84a4ab2 cef9552a 8705b5a0 9ae417cf
+    22f36292 709d99b0 35cf1d27 a3b19b43 346db080 b5865393 310ee877 5f7f1a08
+    fc02e3b5 e3ea3f76 0c68d412 a5512c0b 947b1e14 aa1f28d5 653d52b1 e6f83641
+    bf473793 ceadc620 1e73fbd3 80da7b7a 8346e26a c0595379 14b53bc4 f5881146
+    cb42baec 93fbb7a3 085cc3cb 8e7977a4 a33bdb34 0d8fe8eb 82b15079 a4abc8d8
+    ef425a6e be5b7a97 3951739e 4ba058e9 18843699 d86e219f 52324efe 3889bcf7
+    10f5308d b7f87f1b 1ec6a48f b3fd9289 033e4061 ef3ddbfc 8dbdc596 251767b9
+    7e03c0be a1ee547a 694629fe f3d13a99 75da8e66 a1eee3e2 fe584e00 4c6ce1c0
+    c47918c4 fba99d01 c561263c 97700e8d c8e1a27d 151ef014 0a611fe4 1920584a
+    1600904b 0e81392d 16e6a517 55a567f0 9fe9c90f 843a6598 90c8cacd 9854c1d9
+    68a33066 88c71502 d5d04907 c2aab102 9d653090 73b32d23 bd894a24 8fc03dfe
+    56ed50ca 62c2974d 54a82ebd 5a83b40f 2a04ee0b c35712b1 489438fb 92d48c13
+    141d148a 4e13ca52 09fd8213 d8ee6c3c d4f4d916 9fdb6a20 7ddb0abc 1f812a22
+    431fd791 feccbc11 2abb390f 41243bce 8484109e 6eb6d443 f2fb94a4 2cde1bc9
+    48ba9754 7049624c 6db8c710 87b2847d 05729726 f1f8e542 45bb0756 a0b98181
+    e52c66ad d56e2aff b75a1e88 777162ed aadc4b40 b4f20f5d e196e4fb 8ff82bb5
+    d5942c5a 242200ae 245c071c 7933a223 204a4f55 510512bc 1a3ca56a 8be42c45
+    7a9104c5 d4d04e25 9463b526 4091fa1d e1db9fd1 bc50fa6b 0ab95a66 87d5dda4
+    305504c4 03214457 5fc66db8 5b6a507e fa57bf99 aaba49fe 4d800575 4eac902f
+    18bf485e 40194161 6bff1986 896a50cc 9817062d 9ee95647 875927db b8837543
+    540c7ee8 8bcae860 f80540a5 c2956c43 769437dd ee712272 cbb03058 287a38a9
+    118368d5 fe770abd 3ad84063 0393b678 2ee10ffd a0e40639 2ca1fc1f 511f8a92
+    275e4f2e 74809d00 fa45d8fe 53ab9a2a 79520d20 9bc656ea ae7d5ce4 b4dcb00e
+    12f1bb35 fb6d4793 c567e684 02f9354f 5beff5cf d2eac8b7 927993fc 7481fd37
+    671f9df0 1f2a9a57 54a0734a cf23f3d2 bfb14dca 7a97bed8 6522a0c7 b4b32167
+    adb276cc bf982f9c 6adbfafc 385df3af 923433ce 7ffa701c 5f9497b2 d604bc6b
+    3697d28e
+h = 1f884910 0d5a431a
+
+k = 269d068b 29403a7b 832216c1 c04f0831
+m = 047d81b5 4c8b76ab e306cd0e 94ff3db2 ec65e29d ea65fbd6 65cb9ff8 c5982bad
+    e27811d3 682d9542 78063c16 caa29178 2bf237fb ea4db7ed cf1d813b 62358f13
+    65524bc5 1de23865 c3bd1ba3 1444c143 d97eb909 036fef85 b2a711ea 903355a7
+    26acf12e 554af62a cc3f4e8a 029fdffb 5697d813 c3ea87fb e91fcaf2 ff18f79d
+    b3676f66 b5a709e0 d3c5957f a4e599a9 ff2e3f35 5da1708e fef7e1d7 6fd45dd7
+    eccc5581 29d1b41c 01ba05cc b1767370 39210210 afb3b4bd 41f49f24 c8d87fc5
+    9209679f 9e07be2b 9007c5fd 7fbd86e8 0a71dc29 302fc555 4a81a9a2 fa1c8095
+    57cf556c 4c59065a de5927d6 39c94d12 52dadabf fdd23d8f 12bbcf89 dbf7d039
+    66715ff4 68577189 76337d61 9d5ae788 1d4e7646 ea18d00e 81d85e2a 46647a72
+    c858659a ea82f5bf 421e10cc 7c75ad93 15ab14e5 b197c23d 78159cbd 28970f97
+    8a776ba8 4bbe8a19 f76e93cb 35902fd7 fee39ec5 7696f513 14bcb596 e89e2406
+    c9181903 3b4ba665 2ebfb66e d9e64949 e46bcf67 7ac92f7b 1134ab20 010beddd
+    62144e60 9f30c93f c0ba2170 fa3d5432 6b0029d7 5b9f56b6 c6d283e0 9ed185ae
+    2a317d64 fabfc207 cef94de7 0bc585d9 2dabe357 7e6ac7b8 20047b01 26f9b43e
+    93dab504 467800c2 e8d9f55d c3dce63e 867791c0 1a9a07e5 2115318d aa35bd81
+    f47f3e61 2d76540d daf06d3f ac9a4af4 2d13eb87 0794e144 f59a57cf f76b1d1a
+    b1bec012 d8bd33d9 eaf5b33a a9b50991 69937542 00c9e043 b09d7863 c926b218
+    c6eb1297 260298d0 384543af b9664344 ed544942 21b939b4 399ed5be 2d0cff7e
+    a659366c 45a405ab 8a07ee15 55ea5fb0 da86b001 7289a483 26a514a2 28e675f4
+    930603c9 9a513f71 7ff4792c 154885f6 7bdc9c19 5acd56ec 2f84bcc3 fbc318fb
+    b3b06977 e910c18c 8061f525 8f182712 ab6bf08d ee6c46f9 d0e6c155 f1674583
+    d29797b0 55b73396 aa7dcacf 82814ebc 542afe95 45bb32c9 f69fb99b 68c6e573
+    60418ba3 b2e902bb b822253f dfe02ef6 a1fb3234 84ed486c 8c625a11 0e889dcf
+    1e2686d2 5a06fe66 3902460b 4078eea9 d05ac2c2 2fca315a 1c45b9d9 005425b2
+    5bd52d8e b4bca124 db340d18 e8ecb2a1 9041703d 6a0297e5 86bca7da c327a9d9
+    d09b5d9e 8263d784 2e5693b6 3c034354 47d81876 6ad01136 59fb7ae6 81058ba0
+    4a80d17a eb0e95b4 1e6f86a9 6f6660f9 360b447b 9c933bfe aafa6171 b6de06e0
+    f9cb87f6 f5
+h = 0bad27ba 3f9421cb
+
+k = ec70f6d4 be0a8939 4a9c5135 36acee91
+m = 867261b0 383aef3c 501aa9e3 391aeffa b259ae62 e43c43da 96b1cbba 48b6e110
+    d23b145d cf428068 f3b3d677 951e4802 4f0ee16c f97ddd18 277a4946 e285fa62
+    99dc1c17 51268413 05b1986c 8f99478f da7da11e 12692ff0 2e9d4c0b 449a96af
+    f2ec1e36 ac48d255 e4f2b85b a64798a7 14969dd7 6ba48301 774b6838 3c5c3e29
+    6840bb32 d60bdcb9 29ed6dfa 5e116a27 cb2e89ba 4b4cdedb a3d1952f be20663f
+    ff1255ed 17b02651 5f4353e0 6bdf7a0f 0fe0f7c1 d1f135de 4eba6f67 c3971f84
+    18b68055 e76c17a2 e5416ddc 3c17d55d fff95806 e43e9fc6 7a9345f6 baf5f076
+    144a9fe9 6dc54fa6 67b7c3ad 50d07916 3e08d63f b2f00fde ac305441 59d99651
+    97780745 ee8e0d80 5a736df2 f60250ca 0c2520e4 1d4d6dc7 1d7a5502 a623e514
+    05232073 201c962e 76b68400 9bfdfc9b 5c385b9d 954969e6 a0ac7577 d828295b
+    55b1248f 182e8b63 a8778cdc ffbd18bd 4564119b 03aced13 86853db5 aba04ccb
+    6be64e05 2915dc83 41e75356 85d97210 801b86bd 86612b60 36ead506 4d5dab6f
+    33482d0a d9c2c05f f98bb4e1 cfa2b39d 5e2c6843 8182e4eb 051dea82 38f0f1c2
+    a9406986 7f4d4203 8dd5d7cc 4f8d6ea6 a869d1f7 9b2c6c99 3e98f870 546b1b8c
+    2080168e 47af47b2 585032b6 eaef08c9 4938f9b8 a982446d a4c9d684 6f217f03
+    c24b205a 4cec8133 98419cf1 d41c0717 ffa33908 9fb39503 34fdd808 e9b1d767
+    b1105e99 0279e433 0a7bd19f 8fa39c50 f1d2faf1 88461f51 91404c35 407970d2
+    3241f5ea f693fb0f c9cd8d6d ac57daa5 4bf39746 ee512b91 78772319 b4ab0f25
+    492bcea8 4c0f1855 cf92c248 4c9ed528 205ea8a5 1da9fef5 8e209673 37d12e41
+    42455dc3 a5d657d4 48465296 3b34ae7b 0cb0e952 07bb0e2b 1a91a9b6 b71f006e
+    cd20bcc0 c94ab7bc 05b6bb04 133678d4 8d725bd5 5f4e0d4e e94de016 9a9f5cd8
+    1a908138 97cd16fb faac1f4c c701cee2 dc70d36d 49bb2ae8 d629279b e1537a43
+    00f3cade b6dbfd90 0bb3e4dd b42f6dda 7a7303a3 6169efd3 8c5a903a 7a5f27cc
+    910bf1e0 7cdb3651 18dd2c98 e4d2f83e fdf6ee84 bb9e6df9 5a07de70 846b850b
+    bf65afa1 fbb9b58d 55a273d5 4d8bece6 37e80fe5 a2396dd8 4dad56d9 fdb2f009
+    2c363ca8 984d309d 1b11b424 996658dc 0c4419c7 f44c60bb cbe99b30 19994cee
+    4c403031 9b726339 8530e0d6 f2a36be5 83e0acae 1ca01773 75900fd9 2e9fd462
+    0a4f27d5 fc42
+h = 2ff3bce9 b7d28f95
+
+k = 55f0d73b f6e743e5 6b51b02c 1dcc8943
+m = 372e5fdb e5423630 eb79b960 c0d8150f 6f0d206f 43ac6ff1 070379e5 90c6520f
+    4fb43f84 e9468dfc b8291560 8606a37a bed3b127 12839afd 359df47b 72df6522
+    8d086ed7 ece04e0e 0a93d9ee 9d916026 c90e46a8 a9d0eed4 18d90267 04657cbf
+    0d1eb395 3f2d637e 85085745 6d154942 7a60d827 f256c2a3 a483987f 4b479736
+    93a4d06a b3763d9d 2c76cffc 5b74434c b96b1445 a71ede7d 9fe0f072 0ea57cde
+    ed3b7a4a cf93a28a d16b36b0 87d1fa20 18507d62 d8dc26cc 8c0d3353 5499f567
+    a998c0ae 978cd2c8 5ad422fc 52335e60 0442412f fc6b6a22 bcf3bdb4 44bfdadf
+    ecfff485 e5f21c26 f44cd1c2 c6a7ab02 d938f86a ec5fb601 4ae4ee71 c293a2ed
+    e414ac50 38cb7bf1 cb466b91 59dea6ce 57cb905d 15a909a3 f136ddc1 c179fe07
+    f5100078 10aceff3 a5f7b3a1 f59f8e05 8daed7eb 8741305b 15dec59b 46962ebb
+    9c37bbf5 930270d2 01d239bf 4c4d7b32 df24d4b8 317104c7 96286d1f 29923fff
+    c84180f6 0ad795f4 234ebb7e 77aaaff3 4657d7bf 1bd3fbd7 eaf839ee 41f37790
+    7d42a58c b679ea23 59e8aed7 401ad8fd 5d31ab4e b74120e0 b4cb9bb4 8ed0d0d2
+    71273800 4fe70aff e2f0d875 5b6f335c 5d9992a3 872f9564 843e4c19 bf98b831
+    6de8c9e4 eb1a3ea9 6d8f8043 cf06ebc4 1294e768 027954da 52d0ef32 5e072ca4
+    80e6b5db 02de8ac7 6be14166 3a883c61 d6d2cee2 648b1621 bbd7184c 19d3ee17
+    1ec6b423 a236481c a5f01289 a8e7590e b1800e60 42b22bcd 231230b1 8c495134
+    7d5433c3 15d0f144 c7235ea2 7433e139 781e6009 974ba491 3a5e9cac 74f09113
+    f5708d3c 0e36cd85 a746c511 db12b55f 3a910d59 5cc4b308 0405f768 896dcd7d
+    5b10b067 76e5c76d abbcaf5d 4bdf8871 4fa1072c 32f7b4c6 e5a19cb1 70dc3a4e
+    eac8d22e 1e038dec ab85d40d 1fc7c331 78f79c60 52e718b6 4e9e19dd f4720857
+    82d22318 f3a3cd96 c9f7d928 0cf68b93 3597f200 1d381935 74705e8b b2103ae3
+    9ba70564 7207bec0 dcbe4381 19e2f336 8e038fc5 a3c6c3ff c9900966 28f9bd13
+    c5c380cf c82c51bc 8e8d0461 c427bfcb 9463bf58 c5c29cb9 eb8acc84 7ca2493c
+    3839725d e491f66e 3aae2da3 85f5ba12 067bd6bf ec72d576 7824ed4a 17340865
+    535d63bb 59d6e089 037682dc 16a627de 62234285 27689b6a 9434419f 9095cf79
+    9031dc04 2cb50409 5e729101 d8cbd1d9 e7292b79 d7bbb7ef da235c48 c9c4552a
+    1a80376b c8474e
+h = 292a5db2 5ef96af4
+
+k = 189877f8 a96cac43 b3afd9cc 83051661
+m = fae99b51 307cb411 e365c039 65ce82c8 c4cd3dd6 c1d5c20e 65ab17d0 0cf7c77e
+    2742c26c e3dcc26c b4523c98 bac85e43 088c13c3 e1332beb e9015b74 7d093ff8
+    d5fd9a57 a83f14b5 b2d2e42c 75fb106e 383983bf c931bf3a 50881565 14e82983
+    230476e4 c7f386ea 86b7010d c8984994 7fa7e44d ca13bac6 4ca7837f ae46da58
+    c9c81ea5 73892f6a b6309d7d 029e9911 c1785d02 dcff0906 672e420d 6e1971e3
+    54d88d22 4e48f2db a657ce36 229c5c51 d42a50ac 8be7d79e e4268792 850b2b44
+    e5627cb7 354c417c 5789ae67 7ebb54b5 0fc0b69b dfbe7504 a966fb1a b886becd
+    27ed5fec 5967d69b 3f5c7c14 fb661efa e4d4ecf6 022ec4aa b01f9e13 cd389689
+    af7472ca 79e344cd 54793980 2e5d9a02 2c797eb9 f9a3175a 5e63f73e 42f0e3bb
+    aaaf552a 8483f8d5 db065d68 24a4946f ee203814 19bb4b22 e3f567ea 92adeb73
+    b8c06046 52f7d3d1 fab3acd5 e0aab800 47be17e8 d986f02f f9e814ec 3db4c7c4
+    ce749c1f ee3fe0a7 5e5000b7 25470c31 75c21182 4883433e 3f6d5c9d a025f0f5
+    f98e666c 6550452a 0169668f fd5b472e 1993af65 9de4f2b3 537602fd 1f8f39fc
+    9dc50637 ff1fdb6f 7d2afad6 b6a1a37c d826f73f 3818ea33 e7006c3b 80452bc8
+    6c7a1838 a565ced2 74f5e1aa 0e0d1c92 24e14412 aaf16eed 3cc5b584 d336f34e
+    440b0d8f b65cb4cf 4eaac67f dfdf9365 fa7791fa 469e3adf e1275e44 75a4b9a5
+    7d93477c 6db2fc25 23202000 605b906c 1b6dc573 e4f9f0fd c3ef8c52 63bba1d1
+    05544420 43a5327e bf061a51 cf5a8748 4f3a25d5 13545cb5 09c9e43f 635430bf
+    5658be9c 5c4768a1 e6f0e14c 76032ddd 4ac68305 589bdd60 13f0b4b3 1d18333e
+    1a0eeb41 51523cb6 a75ffcd3 cc178ba6 b9b888fa c107ed72 3ba38ff8 f9ad2584
+    45efb173 7e2c2946 d48e8138 d6c36327 d78fd6a2 ae3dc44c 17d71517 5f86d2d8
+    a73f8d9d b56dff8f de8ddb11 aeaecd52 98b9d0ed f9c535c4 37fa6efe c1fa2c24
+    df7a3a48 b6a49025 4ef216c9 b2825f41 96035e89 4653db37 736a786c 1fcb6fd7
+    b7a63607 1fb3e4e8 40792bb7 d395ad51 d3aa7634 a225661f 997f04d6 7cf231ef
+    6fb20585 a156576c c003f29b 9654b9dd cadf2e30 852f56c4 025bf35e b44fe841
+    f9bd43f4 f23f0020 0b27aba7 c026ec7f a17defa6 a6d8cf78 34113aed 60392f11
+    87718150 fe990dae 16bbab47 8df3e7e2 d98a75ca 6e4c550a 7758b607 78b11b3c
+    de7263a0 38304029
+h = 196bd0f4 8c15c830
+
+k = be1ea7ef 37e3ef64 13b74138 0538063e
+m = 6f92d0dc e552f0ee 15705518 9b4d469b 8bf7b6f0 9ca14d84 6c204160 c24bb591
+    53eeedba bb76a223 7ef779ae ba226949 d2b4f457 e52180e1 92691c6b 6255c173
+    cff6d40c 3dc966cf 76dbb883 3c43bc39 9b31a19c a4441afe d133a988 980ba607
+    d3571280 d8403bc9 3f4fd9aa cecf9d69 697a135b 8840cc91 585e9c3a 26a2a50c
+    6440f676 10eb4b82 d96cf459 efbe8710 7912bb4a afd54bbd 8a91c181 8a32c499
+    fcef711f e699a89a d075041b 98bb74e4 29dfda86 3466296d 6d74b24f 72f7e2fb
+    0e6df16b 8ae4e0f1 05c8e6d7 fa228d1e 795cc3f3 e765079c 370b69cb df044909
+    c899b6a5 78b99733 f69ded09 c038ef57 f348f868 26b7d128 805885a8 0b7ad494
+    ecb044d4 e4db3f1a 08ee42ea 137fba42 5930de5b 88543902 1d89a10a 96ee9e89
+    6a9c947e 381cfa68 811865e5 0d31ec7d 883aacc3 0df06aa7 fc8e2bd4 f2d7d3f4
+    21d4b528 c6693be6 89fccffe 1f16fa57 9b31b862 7d658591 1cb62f4f 98c02b21
+    82a6d49d 23842c33 9fcac6b9 9bdc473f 82980715 e25f7974 7f273574 9b70329c
+    fada97d8 ffef9cf0 6e77f711 18c68319 ba95a821 35516861 26cf0245 db2ba6a2
+    43e917f3 97589247 8a9dc914 8e6fa578 a296f2e6 ef527451 b4e10808 850a28fb
+    85c7c293 c78b83e9 af9892dc e845c884 e012fa8c 9b6de77f ec86e64c 3fe40a4e
+    24569c79 94072568 72c30717 21f4d6f3 40caec51 d9a62ade ef97e407 3c065b2a
+    91f0a0fe 3c9840c4 a35529e3 62b18ed0 ab2f00dd 1785edb7 ca3fe2c3 0279e619
+    1275e131 d495d8c6 6ae7db48 82cdeacc f087e186 e140c5ba a1ddded2 e590ec91
+    1a758497 7b91a58a 511820b0 aa7be623 61431e46 2f4e56e5 f8675870 d88b7d90
+    478f5b2c 2dbb8bcb ce4edf1c 90f89ba8 1ac59e2e e559c97c 84e64334 84752139
+    6b12fcbd e2d51340 5326b117 618f9074 72d5cea0 e17cf552 5fd39e83 a99cd5a8
+    26b5def0 c9b003f1 d62b0842 38953965 1aafa2ee 03453cbf 99c8b9e1 25fd6a6a
+    a008ab90 d74f95a4 d9a72d06 0d3a33e6 ea69fa5a a98c95b8 9bc211b0 361a182e
+    028eb97b cca64fc3 e51bd591 67b38e50 4dc41fe9 5b37d44c 7eb0fd26 5672f9c8
+    3d991e5a 21ea5590 cbe375f6 82e35cf5 cb16f3c4 6777c906 cf7c565d e520e74e
+    c027a29b ab7ba24d 5a75649d 5275e823 5c5f4b1a 486df688 53815899 169c2167
+    eb95cc09 4ea688f6 61163d0d c3de85f6 609a5de6 9fc6720b d84d6f60 38e7f6ce
+    ba4163d4 ec084d51 c8
+h = 06980b64 705e3c0a
+
+k = ee57d315 f1681191 ce85ab1f 7171055e
+m = 83058043 a87c942c abd50ffc 4c655dd4 402835cf 83ff6c37 d72d4c63 6f87b5ff
+    4535698d 799000ae d05efd8f 8b8d0f20 e98addde 0aa6e5e8 bf3998c4 47055ac4
+    6118a288 db90a8df 96d312ef fe461323 28607bae 14e61527 3f2e8431 15f1e9c3
+    1dffc668 952cea0c e307a734 8c1a3835 583468cb a49ea18c 2bf20cef bbe0ea5c
+    de5a07cd 9fd8fb5e d68a88f9 5bc896f6 15f71056 c1893ba0 27a61b49 d55bf92d
+    ae56a0ab 70884e97 d53bd153 2e050355 a92d1ba3 ff5478eb 57f37f9c 26b315be
+    8c032396 c7b4a0c7 3bf5aa9e b92039d7 53225b4a fa044d31 97f2b979 a8e266a9
+    38b27eb9 cf000cd4 d8f32968 0a4e977a 89ca2b59 7e604da3 8926c52e e8a1302d
+    13052369 bcc882c6 a99c4515 eed614fc 068b0bb9 b2abeae9 a1f6a4e9 6267ce58
+    609b6b8d a9b5da6e cc0843e0 ef61b1cb 4af7ce17 f9f932d0 873413fe 82008419
+    e9421b5b 9dd6c204 2f8547be 7e95a123 598a8d7f 0bd1da92 a46b0ba2 418a9a15
+    8d38be29 e2a867df d41eedb1 08d66f35 c17277c3 3c278d4b b547149c e9b2bd5e
+    b28aac03 4d3950a0 61c3a2b4 843db404 6c7a8c54 efcc0b9c b463513c 8b133f74
+    9b51c859 5144c465 b32e6636 4844015c 5c2745d1 b1fe1a91 431b5b88 4f04c393
+    84cd7793 24216a72 2778cec4 efdb0852 25f4ff39 7c0eec6f a884ba45 2eecf132
+    6b047455 57e55bb9 c53e54a7 eab48e21 b9ffd85a 47aae951 4c9cc8f1 60656903
+    cf9eacd1 623d0e94 074d575f 733c376f 6a5968e6 1f11e6c0 d4fdc602 1f2bce40
+    cafbd407 742c5627 ddd41eb6 83e9fc1d ee8f9bcd 259d9a56 550a0b32 08bb03e4
+    578e4370 1c7ff507 2c9e43e2 123f9887 be3e2a41 dfd5bbce 0281d3c9 56998996
+    253c8bf9 ab98453b ab251adb 768d0edc f9c0303a ba227e3d 0c4b23ec 5f181004
+    b54768db 57d40973 271b28a0 a72ff9b4 0bc28c6d a47dde5e 8ff6acef 4113b760
+    e5c0cca2 e112dcd7 089ba769 e7dd87b3 0addf6cc 2b13e593 5685f1b2 1deca35d
+    59962d1f 46ca9d71 7b0b6971 33d9c099 a61ba17b af38eab7 437b3c4e bdcb7a49
+    e3ae1b08 9fe687e5 0ca56b1a 019c3e90 f710e8bc d658c9db b2f98e92 e39f50ef
+    a447d5e8 4ca61d94 4c959c04 1087daef 50065516 5aec682e ffb87b28 e23d7759
+    ee2df9b8 01ef90ee 9ff86945 7d01764c d3da6c30 263f2074 afef5c97 4712a361
+    0de6e1be 04a57347 45941b69 7a49993c 3f3ded9e c69f4562 bf1321ab 59f40f91
+    5826f706 b85116d6 35ca
+h = 4ca9f62b d9728c11
+
+k = 7bc6d391 40ba87a2 a93642dd 43a92c24
+m = 300101f7 c8034006 1ec73a7f 51ef918a 1ae704b4 c8827d61 14f3f626 dc41c61d
+    44f41dde f4d25ab5 3c73e45e d17bd095 e90bda9f 048bf669 b20b28f0 d78e3368
+    3de3b3de c798a8c0 4458d0ed 49bc6da7 7823bf4c 7f11ab17 de98f00f 29768784
+    1b501590 5edf2a43 73b4f617 c41a81a6 4078c23c 5fa7ee5e 6fba75b1 ee8d44d9
+    84143b09 5f02738d 208793d8 087d4f9d 1e1e942c 5b877729 704626db 603999f7
+    45e40bf8 7bb900e0 5a08d5e3 fb3152bb f1d11d3f 18336008 380b9210 70181e0c
+    9558882b 2c5a6415 2016539d ad19bddf d9c50d3d 0b42b765 195ef1f5 05309856
+    4e84f8a9 a077a508 6f6f5108 21bc62d9 822ad7e3 1b380912 33b21b32 cbde27af
+    f9ef67a3 902fc6b8 a794f464 93cd6bf0 75d8894f 75c5fe23 329e3ab9 750df561
+    1676a633 69915ec8 5b045b39 259ed10f 9376e37b e380a71d 210d83b9 997fe220
+    8f1d2238 26d9104f 23ee1464 fba6a6f3 3b386df9 21f1af5a 7365d56b b320edaf
+    c3ee59e5 71684e0d 2d96b0a8 50987856 738dd333 a6c8f884 e74185b1 fa62a708
+    9a19cc95 525d6ee6 8a19af76 3fc2080e 2b1b0afc 83610be3 5b05d52f d6e20bbd
+    ac188b87 767a7517 359e872c a8ac79a3 0fdb529c 7194fecb 10233de3 16fd5988
+    77a9ed98 4871f734 02d736e8 efe152da 8264516f 2ca0e4cc f0507fa1 e873b95a
+    9e2630d3 18358dde 77fade62 d9277849 07f9c2e0 1149d7b8 1b12bab4 a887633b
+    38a5e945 14088eca c4da8a3a 8ab735c4 67385f74 c49fcb63 5328649b dc0a5ae8
+    bd90b75e e36d32e3 eb8c6c34 593ba42d 74e928d3 3b810849 8f1f7611 8eafc87c
+    42edb992 37cc4563 0b3dd6d8 431b0299 b6e842d3 d1607ee1 e2ce53fd 3631281b
+    207d3d63 4f6a4ca7 00733a83 22dc18bc 80c81214 7d1da30b e8d42786 874d7911
+    64e22382 a35e7825 def7f66f 91cd9988 27031c3f d77c52cf 3f878498 41810e8f
+    1f109ea4 c5a84050 64af1931 e52db4c8 080c3df9 9a4ef782 29a2105b ecee5525
+    4908e475 14a85d33 f67bd7fa c9a8a787 6ea87594 f1682688 80fbad0c a72f8ab8
+    e7fb3870 17bab6f1 62811ff3 d01eb54a c0fb3708 aa295df2 99ce020e c1421c91
+    baebbdcf 61965535 02218993 7513e0ad cf5968d9 42c2d40d 194859d6 2052fa54
+    ad58953b 0f6281d4 1df9b2ad da334c2b 4534b8ec e946a154 371f6b50 2df3b22a
+    9fdf16be b4f99463 21da0af0 4e27215b 2158cf49 9745f5d6 dc699160 2fddc616
+    779809c2 68fa7d6c 4a8174
+h = 6fa91d5d 0ff6a7ba
+
+k = 435813f8 3256b0ee dde2713c eb71af51
+m = a5357fd2 120262fc 11c373d8 c938035d d4351e43 9e3f01cb 92b38bdc 1758238c
+    079331e8 5c848881 a36a8d8d e05184b0 fd8adc24 ab766930 c769e193 7df8d5fa
+    e8985050 8682f891 c43d9f2f 6c996c33 d199a1b1 67f66187 da9039f5 929a97aa
+    a116a16b d41c06fd aa62d28f 3c45bf0f ba4a455d 3e6de47b fc322b6f 61c38473
+    8e1c1c3b 14699141 27180d6f d60e658b e3408d94 2e5224a4 dc25539d a102a287
+    73a8d3bd 87cb5381 f1729771 e5065cc8 5fc0eb35 742f1ce8 4ed7947b 52e89517
+    72dd88f6 b5855778 856befee 13a358d1 3633a98f b7c425b7 d512a92b aab69ee3
+    f3b1ec8c 8a976532 2d91bad0 949e0799 48cfc0f2 c4bd5c3d 343c2d8a 718ff8cc
+    cf739035 297cf44b 02272267 80f0073b b360e45f fd157259 3b9f3b25 5c6edc98
+    84b538cc a8232fc8 e73b7579 67f0a115 4f0c8c2b 18990330 a7f6cb84 d6bf4a05
+    06e37ab5 25211d29 d0c8f592 0b7e375c bfe7877f 0171a52e 3a33a061 d369a530
+    2b7dfbf8 4f047363 dcbf17df 8751619e ec267c7c e5416b12 a6855657 eb8415fd
+    de11ca04 0264554d 2e5ff8ef 9ffeec46 1fac9572 869ea58d bbd08d8f 478319a4
+    8cbee7ee 02e0d40c 390fe4db a52945a6 120e4f77 52a93fce 65464833 bac28505
+    c5930938 b264195b 21bbb76d fce2a141 ba1d3f7d 300792ec 21d31fbf 4bc3c2ad
+    ee69bf0e 3a93b108 0001479d c2acab72 65faafe8 8f46a3d1 190a7812 080d2306
+    a1e2fb9d eb746fbf 06bc581c 691764ac dff3b011 c595ae56 5853957f 5aa3e66d
+    78fcb3cc 4806a5ee 7af59a34 e10a471d 63165b95 db6aa087 021b1595 b12b4b8a
+    fa31c7a7 77f4b7c4 23244ffb f5b5cc3a 3b4a2ed1 47fefb01 599fc7ab 69d538b2
+    f0e51140 0f8dad7c 5c2832a3 7011825f 819dfa94 21664908 b09ea70d 45122c90
+    b4882729 092a9fa7 45823602 512099e4 3279ce10 af28d8a5 471fbaa9 60e92edd
+    55ea6bb8 d98ac7e0 2e48f9a4 167c4a8b ea5662dc b5e7c30a 59866711 7e5eb9ad
+    17849c12 130566de 4bf3c3d5 5dc8cd16 a22d5590 bbecd4b4 c166e549 06e5b2c3
+    2db8f461 0b966473 4c501d05 dc2e0874 9873fae7 03f4e7e3 86103bda 1ac33576
+    10ec204d f85d871c 7146bfbb f93b553d f929cfe2 32b524a0 c0882afe d7b983b8
+    c27e2e5f f7f4cd90 87729204 942a1f77 b98656b5 4a5e73f8 bf8d438e 02ab9d9c
+    ffd1e752 7bc02ed3 1e9c1933 3f2ec2c5 af91a998 7a884a79 ad226a0a c0ef96db
+    5cc23720 33c5c8de 3f26de8d
+h = 1c30103e eb1274a8
+
+k = 4fe0e485 cdf88136 6b62f31b a059d79d
+m = 2fc598df 32186926 891c3757 9b654dd1 ce6221f9 0db4cc4f aea57bcc 8273d177
+    299fc01d 56564209 b9a3219c 058a86ba a727af43 4eba4042 0104f8dd 0bd45bd7
+    72a0ccdd b3814ad5 ff254db9 3c0f224c 3b582c7e d95c3e04 759a2f63 4bc36c51
+    a01bc31f 519c3d06 6a74dc0d 0ac0cd39 5327ace3 17c585b9 111bf010 341eee17
+    a5333c5e 1352a9cc ca500eb2 5612240c 12b1d427 ef0635bb dd623dc8 38646d32
+    78a494b7 9255ef73 280fcc9c a153987a 31c0e938 927e69b4 c8fa285d 0c64284e
+    5bb67daf 3ed97be3 1bed052d f1551f22 9b97efbc 785648c9 82af907d 423d8ce3
+    e6d4882c 02b9b207 bbbfcb17 df2bc537 da4df767 5fb710fc 8d056653 c560458b
+    47c5667a e5f86dd4 f5eb0a2b b136547f 9009c34e 675a60a6 81741714 a0dbfc5b
+    98b73abb 97649f51 bfbe5bb3 5e08b9ef 303a2e05 3464e75e 88128245 0fa24c43
+    b490f65e c7b6f9d7 d97ec77d a5de35e7 0ed46ac7 5b7a2098 c624dcbc 6d1d95fe
+    63f16e78 adda0376 aaa71b42 4d127439 d08c59a0 dccde10d 6ef37a0f 106cb435
+    5ee7de02 8132596a 1d1fa2f0 c6630dfb 67d76ef8 de7503cb c9125873 bbcbb6a0
+    538c8d3b 9d250951 cc7af1ee a4b5c111 38bef55e 5f3e070c 7c70e884 b8247612
+    cf318bc3 05a918b0 25da157c 69d39cb7 5784098e 4cf900c1 d38d927b 73ae06fb
+    d4fa181e b1ef4a12 c2eddd80 853f87e5 22a4fcb6 9563a5b0 c85e33f2 2dfe26f2
+    619974e2 6857c34f 364129b8 65a4f2e4 1dc80fc9 039693f5 33aed113 b3c87763
+    01a4d12d c4b47da2 32a1d073 d0529ef5 efbe131c 330bf33c f63746c2 3b04464e
+    1ed974e1 695aa083 e629897e 1ff800b9 8528c7da dede9240 1b84155e ae15ca9d
+    8500f193 50549f63 569707cb 79b764e7 d8a35142 5d75dfdb 151dceaf ba26bb52
+    558dc540 5bd52acc 7bc5288a def41e85 5305c4f7 5a27ad7e 136a5bf0 a2511e98
+    c2037094 65f1918e d16b5ad4 28f7d716 72f2d7ad 0287a498 54fae839 494ce5eb
+    c06e5d2e b4b6c601 5145df28 5f98a179 540b596d 9531a7aa a0334401 d2cff9ae
+    67b64b30 39c98ca4 fe2fb378 2f27a7b3 9b2c4bbd 61b078fd cffcdb97 9a844e00
+    569075cf 81f1342b cb385e9d 9d1309bc 46bf780c 8fd62a9d 790a7673 6f6a624c
+    b733aa6b e3192b8d 55f1fda9 ce20eff9 1e5ece08 194b6966 9747d7e9 4fe84f1c
+    ba7f9e30 ba85b541 f35823bf 835fba8e 32f63d01 d9218818 133767bd e3a1354e
+    a7a2bf59 e9ce3edd af980608 a2
+h = ee8ac992 add01d05
+
+k = 29e91c8b ddbcaa97 3af96e7c c2909695
+m = d112d04e a702a210 25af48aa 58734633 840d9dca d28c3a60 138f9b40 600e35ca
+    b45e7871 8144890a 898e350b e9723478 b96fba13 9ec4aeb3 ada40173 20052ff7
+    b89e5f94 6800fc17 cfbbab62 8cb493fd d4219970 62aaf9aa 80a99a37 993b4d9c
+    15465bc1 16090f60 574e746d 48431020 59e6127b 85416450 941225df b5397a4e
+    cc239880 74cd1754 e49aa8ef d4a8ccc3 ab5fd947 277ce90b c72e5faf 9561f069
+    357d6866 c48c329d 4853fa41 28075c83 87a9b007 43341c0c 74cf8660 62f7f341
+    da006dab 50a02be1 073fc0eb 7f148aaf 41f6379e 074e43e8 d6ea162f 1929cb21
+    5076c4e9 d76a2142 22f4dce8 6efec458 fb2f89fe d677dd6b f56c9f0a 0397afcb
+    80cebcb1 5fc0d894 b8e35bb4 4e22e9a8 1f648b68 641db209 6d7c3bd6 8d10ab4f
+    b1ad9763 8d58f73f 8776e021 5a02023f 29fa23f2 a5a7f209 eb4038c8 692cf4c9
+    29369532 e454fb27 30cfa8a2 d1ef5903 fe02c8cd 91753bdf 92892b2c 4dfdcbfc
+    14e0555f 73b205b1 9d55588a b8f4c464 084bc31a 529b2a02 5ee5f765 c2c789aa
+    b8ec76c8 3b540385 828cdc4c 300d1240 0d931e71 645001a2 3aac11d7 009bcf87
+    02d072bc 0c1c4e0b 8f988d75 8bf6f6db 918ee4b1 0c05bce7 b1c8b16c 50808c7e
+    fa53431b ba7a7328 c3217a01 1909fe0f 7d7daa48 ad1a413f 8862d41d b4f9c768
+    5d571789 11d23491 966eda23 2451f5e3 adcbd941 7792b458 8ff35a6e f9f295a1
+    d975770b 258ca084 e1e007c1 d70ddfd5 91221779 37a7c280 48b7a30f c70c9243
+    46ab58e8 f5b238ce 80f43948 428cc1a3 ab1f6107 14f82bc0 a6e28a4a d06e918a
+    c2fe7104 785122fe f6568ed5 ffd7e9d9 101de4c7 5285f671 b619d9d6 18f766c2
+    cfbf9c4d b5b571aa 693c738a a26613dc 2f6ae71d f9e1b6a6 afcc8628 67e13c18
+    7d8a84a0 87a865d9 519fbddd 850b3803 b926de68 995ead2c abe2eeb2 d7714830
+    1ff02dfa b1421195 00dd224f bb77c3fb b6bb8dfd 2739a236 9b760074 0f853535
+    e797576a e1c05b2f 82b1a6dd 46f07f87 19d98331 110fa4cb 6dcefc64 aa09eaae
+    758b797d 50db3496 8cf00f4b 822fe816 92230971 a7bceaf8 10ed1906 9c117afa
+    28110e5b 5f6a4e42 88d67702 cd4f97ee ab19a5e8 03f89ffb 23ceeea0 7df402fe
+    5670e748 306db694 4b799033 381cdc1d 8b79dcf8 c75ad857 e4bd591b c36c7070
+    de7d0f1e 387c04b8 73ee6cb0 17321875 2e8785e2 1d885cbf 89b0c840 bfe4f40e
+    db08ae5c 93f3490e 99e9938d 6665
+h = d69c179f 113ee4e2
+
+k = c933d088 a9d8d369 3d517e07 6514488b
+m = cae5c0b2 f84734ff 0c3498ed 6868209b 5bcb68e9 5c6124a6 ce264164 3c9fbde1
+    d095a1e1 676b0ad5 7fc9d423 44bcdb4d 8fa9fab7 2e6f56e4 378bde2a a4f38b0f
+    07bd8354 e56c8920 187326bf 7446f0ea 7606dffc 70199315 2b403cee 2b51bfb9
+    0f7cac70 d8f369ac 2ac32a36 e3fe74ce 167787c1 813ef41e 87b31db6 2870ce52
+    0641b4fb 570c8e26 58c8a597 72c2d435 a95409aa 25bb74f3 2c01d16c 1c9cd31f
+    714e3d8d d61faf1d 2ff44c8b 93725d1d cb46e5dd 878f3843 10e2a907 6b49d072
+    de2fb405 c08df774 2f2b1a00 102b7bdd 422998d0 9f06c514 558531cb 4f9f9960
+    9915cc14 607d3692 df9f3690 9255479c fc4d00b3 9e60f3d8 36dfa9a8 4fd7fa16
+    7c1dc514 5b76367c d492057c 89c66510 c050f9bb 1b673269 a62a1fdf 3b52ee40
+    cd213b2b f2c71092 084267f4 5a449028 635878ff 72ccd29a b1bdebdf ae06e5d8
+    ec1802ec 27359520 4cf6a9ad fd71e029 11501cf0 6cac6f32 20b70a6e eebd9b0f
+    d8fea911 67fe3eba 57572f1e f7dd8f11 0762f8e0 bc299e2b ebc2941b c8355551
+    521842b5 a93aa39d e6693d50 33522229 e3da8e4b e7349600 ecc930c9 1446fac1
+    93b3380b 9b43b8a7 76891502 4f0e046c 47469fc1 8f64ab28 e446bd44 0c0a9b38
+    414f0ed1 87782258 39f4dec7 85279be6 5fb51dfd dcd61a29 833646b0 1b24dd67
+    5d08d2ed fb771f9f 01971c3d a710e842 06275f41 0f5e5e40 d887cd3f 8632ffae
+    019f3789 09a1980e bea1050a c3e6bc25 21627823 137129d4 5ebbb755 0bfe1e8a
+    0badc7a1 76d28eb5 e483a54f c094fd17 f4e263a5 93f783ad 9266d8d5 b660877b
+    fdbcb59c 591bdcd5 33d2ed8d a4244647 72311850 856b3d06 e3cbcd28 3a0064fb
+    78521cc4 469debbc 6adb25dc 82e502b5 9189ff80 8c5b5d14 e4ffe4c8 3c05eea0
+    2857e4cb 29201e8b 1c3634fc b5103e9d d67699f5 7abbc3e0 6c16a57f a3f8e6b3
+    eaa06646 a7fb2a68 5eb08f19 cfaa72b8 1c9428b6 3723c01c cb9fed64 5ef01995
+    6b318a6c 949f2450 b82aea21 9a8b0134 8bcd0153 18a448c3 0568731c 7280e6ee
+    dde3f769 858eff59 39b4967e ceef2acd 85da7a2e 2bd8b368 3f892bf0 d80aca9c
+    11c296ed 5acc27ad f6552ee3 80f030df fd2caa90 6b264b4f e42a9144 97240f06
+    8171e763 82b455e6 2996785c 5096fb45 6595d875 c3f26641 a6d63e50 9b535d05
+    55735920 f2639a3a b44b23c7 a7585675 4169b9ae 07b6bbbd 21a62880 4fba7604
+    833445bd 4d6a6972 756d4c72 0b8337
+h = 025d93c0 8b8027ab
+
+k = 8ef752a6 8a1c45e1 89ace000 b66d229c
+m = d7e2dd0b 47315200 6d5918c0 710bb62d 73df4589 84eac9a6 41101f3c 073c27c3
+    ef92f875 6846dfd4 8854e385 70ed5c4e 0b00d806 16f37f92 ffb4b7ab 9d863245
+    3cdcb035 5aa0389a a1e5e0ee 6b126322 78919771 634d1fb8 ca820fd6 9f6f763a
+    0e1fb28b ec8f4090 2fb9f354 db18ff67 6a748ef4 23004859 36e13b37 fb09dc93
+    27cae4fd eb1e75ea eaa8755a 159655bf 967ddac1 8f1b16db 493a7102 f66f9040
+    cc3600d8 e6939a10 bc2e3094 e4125d6b 791dd98b a8e8e16e dbd34e04 a50d37e3
+    a7b6ae5f 47101571 d4a33a9d 919a1234 046fb141 4b3582a1 5ea63e03 33dfd4c1
+    590bfa21 a4af1742 22433a7f d60b87cc c828a895 498eab06 e6cb5c72 5ae8c3a8
+    11d05630 25d627e3 6918c089 bb53677f 7144e468 031faadd 55578faa 8c9023e7
+    80fb726b 1d78cc16 bd308ff9 6843952f 7702576e daaf7d97 79049c8e 0152871a
+    ffdb0d01 62d2b0ff 96423152 7f90aa95 4a6dd414 e9367f4d c833d14d 65dbec9a
+    b48612d4 dd3af003 0efb4181 cf44b30e 531f6580 2e99e679 ff254fb5 240b0511
+    4b7dbdcc 959d99c5 28b90c38 3ee422f7 b053f7c9 daf70b54 c7d44985 170f79f3
+    99e16b55 6dcac868 dee38489 c2c12a7c d069bba3 96e7a0b0 2fe0688d 6b1090f1
+    56cc6a08 3089f53f 30a4459a a725bf7b 44095dda 9ce34066 cb9788f3 d7e8a5e9
+    8e44217d 5a99a95b 19f49b17 526386d2 1abbde82 5797c79f 191e085f 43836183
+    d41f4998 eef7e08c aa1859c2 d0116831 cdbed0d8 955c269d 15e97543 b9965d70
+    07383aad c368dd94 aad1afab eb685157 84103895 6587342c 3351fa38 a05ccbc1
+    7b12e598 abcc1b71 81dd420a 120d8e36 c840f032 8625ce45 09b23a3e 44978ca8
+    d27ea552 6e8a9ab1 aaf301fe c589c9bf 2302e962 3138f385 14bcfed0 180ae5a6
+    1312ba54 60ee6657 a9619dae d3729536 eff25c48 2e0df33b 3fae36d4 b9de8612
+    27470f77 0a4ed3ed 2b4c6e49 9b0bd368 0eff9f00 57a9e9ab eaca122b fcfc6641
+    93486823 8e363bfe c5a78328 7fb84d92 796a76c4 e29dba5c caf44469 13ed36b9
+    f5cf806c e184a8db 36a52c27 a4e07d66 4e6e03f5 9c67da1a 1d4999ab 903ac6b6
+    60fe4094 3e52c039 a7b1633a b5165791 c271a27c 9e5bd44e 5764bec6 baef0552
+    d3942819 f038ce21 86254b7e 07557ec9 588e1bca b7278b2e cc4cfc02 6491f555
+    f7c90ba1 b6551bb9 96f86899 79db73aa 12d930fc 6780aac9 8fd30877 ab7b0001
+    0bc6fd22 27567a83 ccf7361f ca76a843
+h = 4fee5fd7 afec1c64
+
+k = 92b278c1 0f505dc7 1739609a ca2198c0
+m = 39df8b5f c000decd 2fb6a2e3 10ced428 62a3097a 3bece542 954fef2b 8fc9cf31
+    f5f0a3f7 7566c0df 15962ec2 e75e19e4 1ffb941e f903db7c 2f4a782d 189e7ba9
+    dac7aab5 3de2c1ee 538bc62a 2c8097e1 678cec73 ac383c49 9aef64ae 16539ab3
+    d6eaa49c 592dd5ce 7136c178 4fedd542 ad3043d0 1e987a1a b5a9edbb baacdafa
+    a983224a a3ee1575 2ecfb05f 53ae88c4 2a4730c5 ec47862a b81a9daa 12634e21
+    3e7a0ef9 cc3847be 8b900e52 95bbf141 12f73be8 4e757b2a e5d0a309 9e3907eb
+    641944a0 f809567a d0728b34 52f55b0b a5eef5c0 1121d3b5 fa8756d2 8cb8dcd2
+    3f16b3a0 53b370e8 e67f8cd6 cff06ccb 944d44cf 945fdba2 88d9fbb0 a47dd23b
+    9008943f b41de791 db184b5a b0c2e5c1 8f65a17d 4ccca24c 3edf7b32 77060049
+    53be4913 1bc77b48 d97aabe8 7db1a781 64f39cd6 19418e2d c46daa82 51f6c916
+    e874946a 05a7db46 138af5e1 8de05248 fd2dc81a ee750eff 33a50139 83392872
+    03cdae47 4b0f79f3 e5e1d5dc 6e53048f 2187e2c7 6503ee95 c5577b53 66abe403
+    92986294 15049231 cada95ab 57185c65 42cd93c3 59066e59 5aa0e256 cc7133f1
+    9d944866 9e46a67f c71e7fba e36c2c32 d0b79992 1b9deae5 da0f4c3d 3aa3ba92
+    3624bbba 624b04ac fe02156a 33c0d9b3 2191f850 00aad31c c7e5c9d9 05e402b0
+    f3c70dcc ca5dcaf8 99ef2831 82a6e20d 38c67a5e 2a45f637 9463cb84 e652cbc0
+    efd9822e 6261e3cd d61d9745 28627e80 d819f730 71fdadbf 226cb8f8 c3cd5e27
+    f3434148 6e8d7614 9d5ace85 45bc1f96 6dfc7018 91401e24 694d7a60 572079da
+    0d9e99d1 c6818833 13d7c497 86f5d7f0 57339d96 4d8c52c2 29bdbb58 477b39de
+    0e59e3b5 125912b2 0347fedb 63c94cb9 2d6eff19 3074a804 036f52b0 a04fa1d5
+    e5c25a77 a802af5e 683c63b3 2ab2e255 ba9e3e1d bfb10d0d 5a573555 5645d7dd
+    0dd9e6f1 8221a6db 377ae7b0 3c72bbf6 9ff25998 09bfd611 8698f5dc e68960e0
+    2935590e 34e2007e ae74dc58 ae263707 671e4115 c5133071 172953ed 9b0fb62e
+    1ef68943 8f649a9a 30cdefbf 253105c2 c1925015 028f0ffd 231a929c 33d7064b
+    470397d9 bebbc401 076b46b8 205c62ad 7ae955d1 4e3da076 c529f2be e5c974a4
+    e73dd22f 8ddb2547 adfd699e a5c45c38 1e4a62c2 a5cdcd8c 409da058 cc1ec38d
+    c7b105e3 ffd7803f 68a0e49d d4342bd6 e50516ea cce0b4f0 d7e58f08 2fc3aba8
+    92f06a7a eb2cc63c 0264f135 e583ebe2 7e
+h = 75c5a3d8 6ae5b262
+
+k = e35f645a bd998894 f3097b76 69a297b9
+m = ba32cb07 1e8ff45b b7ed30db ab0b76ac 2049389f 09836e40 3c0496bd 396bb140
+    b904cf0b bd010d88 62699fa6 863cafe8 b2d068d1 a88ed66e 74422aa1 6ce0cf44
+    06f7dcff 1c8ba17a 147d4f0b 224c173c a3ae24f3 0c07918d 700070a5 518e59c5
+    de982e6d c6dbe41b 22e44978 ec8d9953 147b8fe0 b7b9713b c20db698 8406a2d9
+    d9faf6b8 eadf2ed6 a5dccb3c 6aa0e92d acd8286e 68baca40 2b058c34 df8b07f5
+    ac0d3fc9 6b4d0eae 46b93134 0ba9688d 1a016488 7527705d 96847da3 36447f23
+    9446f037 96a485a9 a8f3fdbd 908133f8 1d2c521e 6eea4aed cf3ac464 af1545fa
+    973cb324 b532188d bc62478e e53b5f74 40349061 19406987 4f18ee9a 5af64e96
+    9d004183 504f3232 10236ec2 6a65caed 31513b7a 3e53b012 2b78f63d 5f6317bc
+    b2508cbc afe2a4d5 160d9216 a2d48220 a353cdfd e5e703d8 706c6327 192828bc
+    593a8230 533c2873 096506ff 1cdb0b4b b31b58de 7299a4c5 bb8f0c64 0f2c0424
+    67e91729 d3354296 7ff29c99 c7aa38d6 712067ab 6d751a8c 8ba3161c c9f4f31f
+    2f9d2bc1 a22a25c0 5b02266b a2457278 878a2ac9 43c56e7f 1cc14f5f 7963eaf9
+    f6efc78a dee0f916 1f549347 0e1c0b03 4aa9f029 96559a8a 3af5f7c6 5b532859
+    e3176408 a5387419 76c6f1de fda8de52 d3441bf1 bb4caa04 f00c5587 0f8bd2e9
+    c3de7472 4d10f591 47ab3ea7 46214230 78d5a871 31208132 de780bbb e068d81f
+    f68248c6 6cc951b3 71c28147 e4dc456e 6de74861 c8d24cfd ab3f3dd9 41c5b4f4
+    43bab209 54137211 a674a1d1 8d930014 f2288a1e 8be76c9c 6cec8bde 3d972d9b
+    6f085ecc bfc7c7ff 5a7ee84f 4c934ead 8ccc3b06 fec8c04c e32d8b61 8dc4d0da
+    304ea36b c01fa75a 74f5d2e2 c260f963 cfa2312f 9f9b67e1 c1834fda f11f1838
+    57f8aeb7 433a183b 74684599 00040fc3 257f6cb9 cd73b623 11e06f52 8aeb4b42
+    339502bd 28e4817b 7234689b 7eafa7fa d08c8ecb fb6b74e7 65c2d319 399aeca9
+    139344df de80e38b 06dee560 ed45b342 6cb9d9f6 25c7d631 f4303723 bcca7564
+    05422066 80231807 41376c5a d1dfef3a da9d99ba 6f4a5c4d 4a229bfe c2c4ec94
+    e916eb5d f904ec58 203059e2 3f6928e3 f4804519 0ff5b1c1 ac06c8cd 041124c6
+    c66651ca 130cfa8e 5f7b87ab 09a7c886 e3d8acf4 746ca4dc 4bdb2aea 69513630
+    6c42af9c 3a9d4b2d 7fd11f17 1e255d07 54cd1760 c499a90d 975f4266 23104e6a
+    31d172ec 3ab43e85 b13e95dc d2f20300 c874
+h = 6e2d7492 b33cfdd2
+
+k = cfd7c406 7a68ec9e 1f9ffc26 2e785cb3
+m = 6edff72e 617da3f5 59cb540c f0a05519 01482651 8bfb39d5 8e09e20b acfb5cc5
+    06cfa6fa 30c17ec0 2132b10f 49f7ee85 c2522955 dabc2d18 e3df42b5 5b35c328
+    bb6c7695 7caf337f a88470d5 52cb04f4 a22ebe0f 346402a4 36d4c924 27ffc254
+    5dc59545 bae19c7e 51374a66 4b56abb3 bddcedd2 38d9554a da9543d7 ec0a5be2
+    5838654b 775fdd11 59a02ce8 99b60358 6afc1b07 3e563400 2a17c150 aa59fe4b
+    8d0f5329 6602e988 8cd47557 aa80eba4 0ff2310b 3459f20b 1cb694a5 10fea8bf
+    3a9dc9a6 be2f35bc 2cdc5189 f6ab84d8 322d14bf def5be9d 37872594 9524c44d
+    9a43ab9c b3733e6c 3b906b3a c241f13e 048e0f87 58a7064c 543c8a6e 97b2728e
+    77d7c268 18b31dce 3f4cee28 b6022996 25d82b12 f4323fb0 3a93b9a6 9da1182f
+    1388d0c8 d1ab193b 5fcc9cf1 83a9f9b2 cf8e9b69 b1cf30bd 9d338c0c 33717988
+    4ffed16e 84f39d50 ac2f181c 545aef94 11aea58a 82af8596 84433bb0 758dafe9
+    4e2c224a b449cb2f 4811ca7b 44975015 257250f5 e706d037 ab9f6eaa aad45052
+    9b76b870 cae3943b 271c15e7 2d5d979b cdcdc56e 750244ac b4e5f0cf 174a1bbe
+    9da0f922 021759d7 17d099ab d87b7bdb 21630998 ca5db24c a5cbf308 aaf4f950
+    611aafe4 8ab9ed0d 90fea93b efebf4a4 a4c33f90 3bea97c2 40cbfe2d fd071392
+    58b4fd7d 57f71f58 e1212e91 b8dd27cf 94f4103b eed8c045 ee750228 2c1b28cb
+    c44f51bc 9946da94 b62e6e85 28bf45e2 baea1ac1 cade2159 fa61ec6d 5cfb5b0f
+    b9f28cae 407919a1 4ae3de1e 0258c9b9 86511b85 51022123 97b9f32b 23eba5b7
+    acd940d1 684ac70f 9db322d7 91dc4934 7fca7317 f4c27d35 fe000633 74a0a535
+    9d3b63d9 e6487cb1 100c6a2b 3c94a776 9c99c44e 750ba644 063aed4c 66a09044
+    6973e986 b6baf36d acfab4a6 df2415cc 9d656cce 5d772fef 76d0d273 d120f961
+    02fa991f 3b7b22d8 9386fe9c 447fa4ce 50e96d94 88c21797 972968b7 4a8546f2
+    b6873332 07062959 fb17717b 3b13f0f1 00eaa105 88772791 46980946 41a1bed1
+    3c0c9aa9 c8a9da84 31d8e55a fe17fc8a 55662361 119e6f86 18ef6b9e f67d12f5
+    8bec0dcf 5153e4fd ff5fe675 40acdcad b9114f18 a3dc300e 941d78c3 61eff1f0
+    1a4e813f 92cc803b 78d18290 53f6bfaf e19833be 2a5786de b370c653 e8fa3f09
+    f20b1466 09a3ddf1 52159d5f a7cb6728 d262cadc 884a605b fbd67be5 8970b993
+    51bc42ba e2acfce6 bb9a5929 2e1aae1c 98716f
+h = a8902ba6 5656b836
+
+k = 5707b582 d15e872e 3674ad17 826988d0
+m = b8db0a8c 2200074c dd7e0279 ef1cda61 8eabd40e 3b34e7a3 e4f06565 1fc00956
+    45a8a1fe d8ad3284 22339148 5ffaf2b1 be603a91 27ee49dd e4e9c9d2 1798d3eb
+    65d025bc 5d363558 39f681df fd5d0364 d7e176fe e87a2c45 421f1813 ccb8157d
+    4ed4eedb 40ef01fe dbb5df3e d9631397 e667f8ad 9fbe0114 ca100f0a f5ba5d81
+    0999ecda 95d421eb d8db75d2 b1899c54 518ac4ae 2b59f164 c66270da a12f9ed2
+    22249a10 53d10b70 01b02685 9929c097 006cf070 6c91cf79 3b554579 15e8a892
+    36811924 fe55b2dc 9fcb860b 96f35c4b a2d9038f 9bbcf069 98186b22 cb854ade
+    b091e759 ca50fb5f f99767ef 6e28d6e5 19bde451 94778821 61f8fbfc 43fb1bb4
+    0e8c8910 fa12b190 014d8d57 48d322a2 b1ca93c9 c34cd682 76c6caad ac7a4fbf
+    9b59fa67 26f74c0f f482b94d 7311cf17 40623b01 8739e87d 9e854338 55a10555
+    4085ecd5 80ba489c c205816a 2409735e 6b41d26e 28f2600b bf1fb285 45884395
+    d2973076 d302690f 982ecb0f 082e917e ac444dc2 e787d2c4 72a8b67b 797fc7b3
+    28b93e9e a7ca5b24 619b5afc e48aa496 56c87225 cb44cabd 5ed9b2cc 4af6248d
+    38b9002d b1bbc2ba 9a8f40c5 895f1171 519350aa 3f1c611d 56c77b94 ac8dc3e9
+    e038a0cc a1093f1e 290ef0b1 8b6f5e7f f77d46a1 a143b0ee a18fcf4f d14023cd
+    e2be54d0 e95a9246 fffa92b8 ae2588aa 5b13cbb5 3176273d 0a57388e ccc9f0ac
+    cd3bcdf3 78480398 6debce58 12b7d209 19ab7896 b26f65b5 473f22a9 4e56612e
+    3cb19ecc f4bcf7a0 3068a96b 529c8da4 992f55b4 73ccbc94 9fb50025 478ace36
+    68f9f935 2748c2ca 16f59664 32a225a8 49674c22 e248fdd5 f8ff7d95 00ccee0b
+    ed5f85d5 1f5ee3a9 5a98ab3a 2c935f2d a8a5ccf2 43bee6dd 90014d41 57ae50bd
+    3b473fd4 b7acd029 19d3318a a46cfb35 78be93ec 359f156a 55e5f315 2311c164
+    970ca42b 8d0cf404 d6a51111 8fa932cb 4a25e5e7 25407a2e 0f32a188 e67cc8fb
+    5b00cda0 00e76206 88237a89 217fe074 6fb56539 505389f6 9cb6960c 88649b9c
+    aa7a57fa 41dd63f3 17ebdfbe 5cf4f1a6 da167f0f a82b8c3e 0db002c2 27ca6cb4
+    aff4aa96 e0242e35 7beb733c c63b473b 47355e32 053d6413 9d232d23 b299189a
+    3c7f4266 9b308b1e 9c922b36 969a9bb6 da817898 57b259b2 f7ea2753 745c9132
+    fbb9dc36 2d64ac1b b9cbd913 83bb3e69 7f4f93fc 2b679e00 405caed8 fc1c30f3
+    59ef8348 db800b0e 0f5fb352 d6c299e8 07b401b3
+h = d66cb806 846f78ca
+
+k = e76c0314 76697af0 ccac10a5 730fb129
+m = f978a172 c33b86bf 1659f83f 8b40f8a3 f056615c 9208db8b f49efda7 d540ac92
+    0d9e2c59 4995ccab dcf7d46a 2b7a0c1d b9c81508 5352ffbc 21f62128 ec7d5afb
+    5cf320d4 26cada5f f42b941c fd4b4284 539595a6 4f156469 b2ef0a1b 49d35763
+    5e2c92ad 7ce5bfa2 6de9410a 82efed36 5f293c7a f12ad4ce 0dd4e680 36e04163
+    f2c6024f 2cffe48f 34eac4fa 3b8afce8 adeb50b2 1da89aff 91c62448 ed277f02
+    1c48e28b 55fb007a 09372d87 2ca6377e 39f7a4fc 9738a6f0 04fb88af 040af255
+    f1fb5e54 fb49fa78 db244c75 005da676 0c259578 92cac32e 7981fbe1 c8013bd8
+    74d2990f 08827328 d3996b59 29edf31a 918b2e3f 2ac9e208 727685f8 b0f5371d
+    d8712338 7838bf9a 3a90b731 ac8f62ac e747fac3 6532c125 ccf29e3e 443748e1
+    3e5b42fc a5398958 69622cfe 28cfffd0 777c9ebf 79a5427a 5494245c a056ff40
+    8df512b7 1a9c7d40 69384b12 c95f9418 1f5d4411 ea20780d 5d94f7a0 54809b65
+    404e844c 6f7a69ea faa858c7 5fdb20f3 187d6643 d64984e8 687e46ed 80d71a1e
+    d2e185ae 2081f8c9 043ae3e2 536c4d20 051ed96c c2e5f473 337afeaf 816f5a84
+    8fa23af6 0f638874 f8eaca6a 50c07308 267bbfae b478f87f 4fd9758e 7595154b
+    e0da2a2f 87e61879 ceac756f 26a425bb d16db203 b0096c69 5c3dac08 7816debd
+    26d17aaf f837d7fb 3811a75f 4ebc8ce4 8b0233a8 343661e2 bb370b4e 2480050b
+    7f0ad659 70e80f65 2de00a3b f144e9a0 c9cf17d2 faeb3ed2 b5173dec da7b104f
+    737c25df 95c7ea4a 5a3eada2 4d5c73fe 6b2545fc d516e78a fabacbae 5c469876
+    b3b2b1da 8748cdba e4fbe174 9c7cc9c2 046412b7 9715ee09 76468697 7f9115fd
+    6d7cdfc2 66957c0c a37bc17c 6f1a32ea 967b4476 2c29d71c 13b9c707 c4f5350d
+    547b4a58 d93c1fc2 3dcf5d0b 4bc8cd29 64fe7ff4 89ab6da2 64abebf1 f25732f0
+    f19a53ec 11c1c750 0833f9f2 a8441299 e0a27971 05b54bbc 5da4cb88 2c422e92
+    f65b3653 8e4565e2 d51bd8ce 9d6482a9 1e72f057 7dc0b142 d2dfb454 909980c5
+    7b83b161 44e9abd9 1fdec4dc e9541bed 6cd28931 41996ff2 89039120 7a67d6ba
+    b49923b7 3b9b91d9 e70f6b73 e0be4c65 57a6c564 ca84bbb0 296e013f 2b009014
+    8be2f3b1 ac15aa61 07ea3554 0d151bc6 334b49b6 ddd4d53f aa3a28d1 4462e0e0
+    db5ab90b 3d3372fd ec22fc35 4b2190a6 bd1bf989 f0dd768f 7892d9a9 72e7ec5c
+    94f9f4ca b1d6f66f a0744dd3 ad73c734 8503902f 83
+h = f27756ad 5880f603
+
+k = 18507169 c7951175 602bf3c0 f67023f1
+m = eb90e398 d612a63a 535d996c a4f89ec9 197a8eeb fadd5a28 0df6f5be 0adf80e1
+    0b871cb7 c0dc8e12 009b98ba fc31407b 37aec67a 096cbb66 cd34019b 31e1e484
+    8e34c189 23f2abfc f56a094f 3d2bc355 92898a56 5163193d 2b5ed310 0fee3451
+    e78b3460 18c2d5f2 664f60d1 df77708f a7a4359a d935e9f8 1c0aad39 ca90ccc6
+    adf019cd b09d377d bb69536f 618ebc19 d0542af5 5995853a a45fa5c9 9e2b4b22
+    dde5e19f 62cb0fa8 c2d89f1c 014846ac 3b444990 bad9bdcf 9c1467bc 297f64d7
+    fc2aa5ef cc2c75eb f87f5162 63192230 1d20af09 c5d04af9 1fe3c637 a3733532
+    7b7ec1ec ad2fa2ad 10a8a0dc a008f7f6 f9979f1e 8b1701e4 6a99bafc f5d9005a
+    c9b5af7c da4b43de e90c4f73 5a19d51c 4b12591b 5ccbea28 523aa69c 226696f6
+    a1c9caad 9c7dce96 e60fb019 41d41b70 e8d01797 718b9beb 45f33d1a bc1daaa2
+    7996bf13 b6bf5e57 f520cb29 dfbaa184 b42b78d9 cb9d5541 80612fd0 e2c5d104
+    2f157c76 5edf16f5 ed094390 7b59eb21 82fd147c 69110556 56f85164 f0cccb1e
+    dab8d1b9 f3c2354a 8ceb8876 d1ba89d1 2758245f 7877bc47 2e43bc1b 39b99046
+    e0aae3bb a6854aa6 e5adffce 14387ca8 42251dc2 081539da 46252977 6f0bc2cd
+    5ed16aa1 d1ad9d90 68987926 5e0180ca ba09b20d 490a5e85 d21d08ba d6964573
+    ec06ed39 03cabdab 561de19f 937322bc 157c47e5 0b556423 600af983 2551bc6e
+    dc6d641a f73bdb86 b9cf23b4 09503ea6 bc67921a 805193e2 437face1 02c5584c
+    de8798ff 36fa9000 27fb4f92 b99abda6 f787495d fa0133b9 6bd9b214 07832721
+    4ad41cd0 44d819a4 940d6b88 a02448cd 11ef627e 6fd7226b 299f1f21 ece0b728
+    baa6b7c4 a6c6413c f5d3091f f47b996d dcdb8f73 289cac19 566bf9a6 63ef2776
+    5ae627cb 78a511c3 b15928b5 0c9ba74c 839a947b e59d022a c02b4580 94361b9d
+    3f21e5a9 5f032a78 f419de6a a5f1287a 81588167 10a6c4e1 10a7f962 f6f85527
+    d2d6e701 2f73c0a1 f85d9f50 fd0a4e1d 97d5f0aa 7a9d363d d464de47 21eebcb7
+    1d7a8cf2 861f8881 a019c057 07252519 a92502d2 c836ca8d fe9a1d86 3180f1c4
+    e82a703e 074c5b50 416eadbc d59a390c 60d0c8c9 83954554 f7f21669 d3cb2da9
+    e3ed6585 f90c9b5d a07ee5d4 8c3f2b92 25c46e78 0797cf7e 54cce694 c42bcb59
+    2e789c44 97723aad d0d281e2 40d243d4 b1c81677 d697e5d3 8841e88c 67902228
+    567d2c04 ada5f8d9 bd6fee5d 49ff49fa aabfd4e2 95b6
+h = f854d3bd 6b0d7ae4
+
+k = 513bef71 4ce9e5a7 f00cb38c fc5689e2
+m = cad8d748 74e3a4cb 08829b8c 27dd59b4 2517bbab 89140d7f 71b37edf f3b37388
+    0bf98920 4d9ec0ad 7f97102d d6982dab 438e37dd cb1b6566 810ef0f0 e31aa8b3
+    f706e3bc f7466f9b c72cf8a7 0818f30d 8ed8b12e 7a287456 bc24d407 fa7b88b7
+    06069909 3a2c86cd ebbfc146 8aba9fd2 1fe4c8bb e5f8648d 3dd1975a 284d4cd5
+    95252ec1 5b8868ae 9c656ab1 5ee88bb4 c8c6fac3 832b32f1 119317dc 90908945
+    70c8dcc9 f3271004 f0f09fe0 16c7fd27 af18645b e64344d3 d4cfffa0 abdd794d
+    99dce330 7b2adc6d ea3e2947 2679ccf1 430fd07b acf1ceb0 23298925 22197864
+    700d635e b9b8b242 c5d1c18f 3b754bcf 6988eecd 5d18aba6 0fc46a22 5f549965
+    cb61bfba 09810085 90177ed2 6a3dc7d1 fe63da4a 381cb5bc f32b6b16 189d7e37
+    3bf998f1 b99399a5 2697864d 05354379 2ce4b7a8 0d1bcc1d 962b17f8 3b7a1ca2
+    385facf9 ea69dfcd eeaa97da 1b076c20 1d4becf9 fd6b4109 65107d97 eb334caa
+    6cb8218b eda7aeb0 4d225efa 23069a5d aaa9f906 be54126d bbc813e3 fb87c479
+    c54b5911 eacfdd36 0defa569 655274cf ce2edfc8 1df2f841 a725e548 f05b7d95
+    2808e3e5 2221f8b8 a16e40f5 16a76dfa eaabb087 0ddfd741 3ae44021 7cb7a8a7
+    c3000a43 ee98545d 52bf429f 7f405f88 62c07d27 a33bfb1f 9db4a388 5cb127b7
+    0404260a 19f65a46 e5020e35 01e67793 fa62851a 12701c4d bc9e3929 26f35353
+    c0fadf9c 737553ec 6d26797f 2b565eff 7245a48b a5546e9d f639d9fc 23c2b970
+    1a9ae5d5 50eef1a8 1e7b8606 8589b4f1 8881c167 2551d2ea 6b399606 7466091b
+    bd34064e 0e9f25c6 07556431 cc0329e7 02b549bb 8a709feb f097d678 32086158
+    89c46d4c 46a28027 4321d7ea 9a93461b 17e08d46 ad022c2d 010a16bd e719defc
+    9ea3642b 1db1fc67 e5b3ae81 6f021d23 27c6b7d2 0e2d643a 63ebea48 9eaacdb7
+    5f63ddc6 ce9bed16 d42d4eec dc17d18c 9d333e25 7338e3e7 7789056f c769e944
+    e0315991 d21c2d1b bc3217f9 bfee6aea e1ea32ba 743a5ea9 b122175e 17f86877
+    60b5493d d8333620 5301e128 6ad8d9e5 d3629f04 f70ed7de 1ab70e31 26a95fbf
+    413f073f 5f25e534 48e53172 676f5dec f6ceff22 94855d1a b9361db8 b00a1977
+    1cca9e47 1c263781 655dd9b5 622ef9cc 1b676356 c2bf2d8d 8d6bde8d 0f95c405
+    57570029 3547ee22 94e454ff d1b25a9d 6c1e4027 f3a74fa3 7f32152d cc9f440c
+    1089ac20 e94fd6f0 9ad4b79e 8db09f8e 25303ebe bd8bb4
+h = 05d2408f 9f6467aa
+
+k = 19eb47b3 9721b46e 5373274f 0213ae00
+m = d72e1951 bf848db7 3f2b2df6 ce6e7b09 20fec055 a71277f2 8793ce6a f616c481
+    ac273348 fa82fe40 02ec002d ca96b3a8 32ae7bdb e6ce3fc0 fdee9fe6 3c5384b5
+    1a6f2047 d8f3e2d3 2304be34 a3ef3b4e 94feeda7 29bd5bc5 2e986491 13bf0428
+    1c4dff86 546544ad c11fabe1 f2e4ef75 6f3c4fb1 6a48556c 64160bbd 250c9a3b
+    09791c79 8ccc2932 f74d3b55 acadb420 f57880ba aa09b360 8cddd0b7 f775ac34
+    a3009975 0bc4dbae 36b53d3b 7dce5089 6c2450d7 f1083bd3 5653c980 ea7b9165
+    4fa82c10 b19b1caf 0e6c038a c7a684f2 af0d1830 9fc72458 5eaff7ea c1f687cf
+    df20407f 0c25e029 e4e4b38c 877ef827 38239e3a fa7c60fd b3e33d5d 0762950c
+    4666ce1c 09a092b6 1608cf0a 83f8a6c5 ea6d5a53 97b770dc 3518b8cc fb5ad3fc
+    28fc932e 080cdf4f ebf6b71c 8463a05a 16e8b52f c6ba7a8c 4de915cf 11dd9cd5
+    edb24238 fcf31d28 4dff5a80 9230166b 4f21e19f 2d6f7d3a dcc72162 62f187e9
+    95e5f224 b6e88cd6 2f2f0510 246c7233 e90bb369 7c276be7 061cb94d c29fc2ee
+    cd78a2ec 5ac2de33 c43b6527 fd5b9546 e922d63c a3677dc2 2cea4bfc e853b22f
+    35a8804f edf6fa70 b88e5fca f5a6974f 71b472a0 ad165608 cf5cc353 812cba35
+    26257c1d e90fd455 7411260e 2e1963be 1d2518c0 0857dfd0 58df7c6f 8e3ca097
+    288c9d8c 1f2f13dc 1f7b66bf 7578e541 4d76aca0 5fe1f858 7ec79bbc 2de13a6f
+    5d8813fc bb84d655 bae9ea73 84c967f1 427046a5 d8f4aece 5dffddab 14ddb98b
+    57a5ab57 4bec1947 02fd6ea6 cd99b658 858beda7 6ab0364f 8bc8b617 d5b085da
+    a9eb8e47 9602fb8a f54aa579 101e9f2a 15c55f33 4e352039 f27f65f5 9a8f7682
+    923a81dc bd7c15fc 4afcadb8 dc3a86e2 acbbfa54 23e94b58 d9338690 92537706
+    11b017be ddb37588 2f95cd83 bfd725a9 b63f4b44 df3b185d e5db39e6 0be53cd0
+    c68af87a 6a4c684d d8e59fa2 3992d267 7bc1dfcb 1e588310 1fd3f507 8992dd30
+    19905a26 0484bf5a f5f50623 b13c1632 5d74407e a2c48399 6b7ef9b2 2111f510
+    a6bec334 ca8186b7 b80e581c d6156e11 7626757f c7cf8407 e1939906 3e93abb7
+    f063f0fe b3481b6f 422fe948 073866d5 eda6c8ab 4a9be2d8 627c13b0 87af2786
+    28de62ac 450eaba7 a657c66a bf5ce411 2e2ea367 4360aadf aab8bef0 e1086ea1
+    20dbd47a 15e7176b 93938fc1 7754debb cc39fa99 b4e8e2c8 aa36ea71 3c86b955
+    0cf94f04 e1fa0cd5 6f2c9300 00cbbb29 4a294e2a 251017ea
+h = 14e1d13b e9286a77
+
+k = 9ea004a0 9b9eebc6 3954bc00 ba2741a0
+m = 857d40fd f901b82f c9bf1df4 6fe4ccdd 97a558cb bef18506 71c5e545 97f1b6a0
+    ccc61740 c46ad218 2c8a9ee6 5a7a370c 81b26a2d 3da09e0e dd54ae1e 37b76f3e
+    d65b7124 419c1048 209c1824 44ddf667 f58a4555 63307117 d9539567 432f4cad
+    004bcf65 85f11e06 ba6cbf06 d4f33193 2a957b2a 8030c4b7 1d4ab473 7c2bcc92
+    1910df6d e6429d60 d90788eb 047473d7 ef95a64e 1f31c138 f002299c 335d5517
+    220a79ba 8ef4805e 4cce56df dfe3145b 9340c2d4 ac2b547a 1c7b5f7f 97a46f0c
+    ddf95c2f 74118b04 2dbf4ea1 975f636a e659406e 3ec0c963 05e4fd7a d9e880ba
+    57198139 cd498fa7 4bd4a12b cfce3108 8b08ce61 f3b5cbbc a24861ad 6f2b38f7
+    d8fcb0b1 a5db895c 13327f4e 351ad5f6 1a55a9a8 daade519 37770d08 6416e9b9
+    54f4cb87 16c08547 d2993a13 d40e8bcc bf4c6af6 6d76f024 514818bf ddf15f29
+    d77548c1 68b992aa b1c74d4b 98bd0eae 61c96eaf 9785c199 c54ac5a4 1031cc8d
+    bd392642 2ace8e02 9c28d2d7 d95384a7 0766fd04 1cfc3c07 c76c6b3b 7bc84c7f
+    5894ff38 343b7cb8 549f0b7e ba692ce9 0b72fed0 1754b73f d42cdcc8 21f6cdbc
+    9acf2bb3 1f713c5d 346dc08e 14913d69 63a3368e 715f7c40 137ef64d 4b949411
+    6f362630 e7703631 24ae3f6b 8217232a b3071029 cb0a0136 03cc5e36 1e9ed236
+    0d09a29a a79090f4 d69be9e7 0e7796c3 9d96e8fc ccaeab11 e0351a3e c8a36ade
+    9c9c48f1 e989f85a 7b77578c 3cd3f4f6 57927adc 5130703b 0ef1c97c 7e8ebe10
+    5f875042 4b1ccd52 94bbcf6c 0d499990 006b3070 d444caa2 c99a8706 03dd6ec2
+    2f8b3d2f d87324a2 ac069e06 af3ff9bd 5e9aa9a1 4ba2bb46 27fa96d1 b42a36a1
+    c14cf031 4ec49c26 64469936 9ebf041f a903d78e e0b3986a 8931b161 17ebd79c
+    c192db5b 0b9c50bc ba909eab 747ae280 00a93e01 d2c0f3fc 4d6dd464 2697c414
+    3d218563 ddf26498 b0edc3f1 51d4dec5 561f2579 f3df3bd1 a2d4282f 6f63def8
+    332b1028 a9d38419 1bb97b14 4b3a89de 218a11c4 e4b18fbf 28e02fcb 4b1d15d6
+    cc106094 41571351 afd06699 0ab101b9 881414f0 3166dc91 3fb5734f 0b99d29f
+    214779ae 6712cbfb 00c88777 e2cb6f6c f22e13bc e7520e95 587f199b 7eb1ceec
+    b74731e8 9cb07198 4258ce99 0980245b af6dec71 e859851f 8e7491da e4a51022
+    58485c2a 2e6f65c1 fb1c0273 0fcb46dd 7f9bd6c2 2c798879 1bca5a98 a8f1618c
+    5c8fa255 6eed1401 b86a1c48 8e23fa3b aed3fa63 720f8892 29
+h = fcb2af6b e42aeb74
+
+k = d57aa588 d6832d37 06aa28df 39758904
+m = baa07bd2 2c9880d5 ca0b2192 27e58ca6 12bbdef8 9fb34673 91edad24 5fe4fa6b
+    3ced415f bc6d5abe 1194e654 fccacdad 80970f7e e2d6e466 d23a95ae 6e2f4ff3
+    584b21ae f33b99a5 e5ff324c d7b5caa5 b3bce226 79ecacd3 0fe7eff2 1c810eca
+    fae78c95 6c45a80e b4c33057 f9732acc 12335026 437aaa92 c2b8d1e6 aba15de5
+    0258c6aa d4a29efb 77c9c473 9d10008f b81b86a2 fe222564 c9011688 372c8a60
+    c1255b10 997f2ed1 69b36c92 a25ff7cd e1d92d99 e7ce019f e2e936cc 6bdd059b
+    e727f20c 7517ad38 d2606d54 15ea8f9f 72c3e0a8 87de8f2a c198a5b8 58d01595
+    5988bf01 89b80b73 e5ccfb86 360b888c 7aa7194f 05434f70 4f1325f5 abb5e24d
+    e2dde1ad dd2af8b3 0edd83bb 3937b038 1e692e1f d78bab58 3200dfe5 38967047
+    c4b93c72 f3a7228e 85d17215 6e04b2e0 c91c5237 bc0202f4 9fd3236f 7b54d81c
+    fad36190 de936790 f6bf3c8a 1d145ec0 79e43df8 7c3329fd d4915328 14d97d22
+    5b2d447b dee50328 b826fb06 47c89085 b377b32f dfc1f5a3 cffb8716 f5351136
+    75e6f55f af735203 a86600f8 89d30332 2d548cfe cfbef904 ff137c6b 62d2a165
+    d2bf1e0b d1f86b2c bb6269f6 bdfeb3e7 6e740c03 8640d90b 00d4d909 d0b82a13
+    a12a6d94 4da939b7 684387f1 7e6b381b 27ca62b5 a823d669 5718b697 ae391883
+    97068581 bd6cae08 5f44b3ae 4356e355 c8371e97 b967ae69 e3c25487 f9f8a995
+    b2f39ac9 856e3d90 b96464eb a9473c38 d8ec6167 85933b9c 6b525bc0 92a8797e
+    321daac8 67a3d1c0 b358c650 7d5f1617 8af846a3 d226479d 9a4307cc e54cf268
+    12262824 b8f1218d ec2c97c2 a95d5fdd 4d838eb3 7150d697 703c9751 8848ddf6
+    f2599538 f5b64a1c 4e6b9928 8bbcdd9b d2b73c78 b7bc7534 1ad50883 2ad70782
+    d31f9d40 4b7223d7 f5a8e2ed 853109b7 7e7dbc86 8d158f48 f9932f32 a4f61180
+    104ff46f 332efa20 1f27b24d ed9463ea 2e23c83e 97f96bae 803acfd6 388d309d
+    a1d16922 eb0fe8f9 d8386254 385d52c7 8ea36765 c0a081ce db9fb99b 7dc623b4
+    6e01410e a6458892 1e6f34df 2f4c3ebc cecf43af 861c9029 1a153cdf 33a8f853
+    8706f34c 16a33f19 b49b33a4 31682f22 88f403ea 8ecee18a ba4ebda2 ac31df48
+    7dbca46b 9d1c13c8 7df32499 1dd7ad4f 60ce7c34 46d47724 88777728 7763c444
+    ff040ff5 526488cf 5cadd336 fa3f8c3c 055c8468 54ca34c8 58cf8c26 6bb85be6
+    06b8241f a0b73f97 38b19bda 476deee7 d8102b57 45cd9e00 dc06
+h = 248351ae 7d323f39
+
+k = 7984f9de 8a3478d4 d740efd2 527e52b4
+m = 59c46687 c653f845 2e9e838b d95d3fdc 0d5be3a9 a2654e1a 627d1e17 e004bbbc
+    1ff18383 d2a70131 e1966e37 d307fc01 ddff5380 4af332b6 e9e4452f 50ea58a0
+    e8d67b5d b2b50c7b 4d250e96 530dff51 e5028f6a 8d446c60 9b805910 66393638
+    087773f8 75fc3f95 bb8a1463 d96d6f75 da01402a a77a4828 371f530c 31d53658
+    ef8b58df 7fdcc31f 5d9322cd 2a68a956 3857ea70 be2a556d c6117767 48274ee8
+    956f4ee1 e82f6634 d6c5d511 79a47411 62e78c39 b413d3c0 5a7355b2 ea2ad083
+    7cc93493 8685d035 88aca819 92ace6fd df3344a1 2586d95b 7d7359fb 1a5b319a
+    0d35e708 2ff00364 9674033a 6ca6178d e9b9a687 ab8cc2c6 574e7a9b 4f23d1f7
+    b796e3a6 c6c2d361 32a6c2d7 98d061e8 ba04ab55 24cde092 83441e5a bc8fd732
+    f8d887e5 c78b424f 037c66cf 08161ea2 2f884002 05a68cbb c00b0799 d7225a0f
+    4bde75c6 50e74a5b 55cdef31 b8efe9f6 97a72690 03b04a7e 0495aa06 8315a24a
+    bd4483a6 102dc1b1 f32f4ba1 ff15b3ac a5070b0e cc10070c 3eced036 5ec2ecee
+    3964e669 e8710c4a 0a552aa9 de22617c 4b0c806d 63ba4433 9687a610 38a57706
+    db966b5b 4ef297a7 3ef48ff1 2e7ac134 f73e7fef 28aa34be 89944dcb bd1fa55e
+    a96c35b5 b3ff08db 55a1711e 63128bbc 44d1d2a0 7e1c533c 16ff8fc7 1e02ca08
+    6940aca6 919d6a28 7950660a e0b4aa41 5143e5f2 37b0b4bd af5ff15e 4e3027bb
+    67024287 8cc9190b 2c1f96c2 ec6b316a cdfde206 cca5584b 0d287c9a 1e2cce7a
+    1230b20d 04eb34fb deba1fcb 72d1ec15 1ef79dc5 3154b145 38641987 5b4c8dc3
+    4f00eb32 fe20016c c0a27487 6fe3db49 08fc9b98 b5206318 4b1748a8 4293c900
+    046213df ae435d2f 85f63f73 3e8317ab 2a6e05fa 0259ec68 ec5459e3 a9385703
+    071fe6a9 0e1be5b2 65886b91 ff807503 ed871868 f411c167 08410834 8e3487b9
+    99e98672 a0889411 e80a3003 5c51a83d eefb54ce e9f18dd1 f30c2a1c 572c2099
+    6df768cf c57733e9 a04ef001 ac770bf9 8d57cf87 34bc6999 3fd250f8 1aec56a6
+    39983486 7d0abff7 3ae88e58 1bea5ab1 d389a809 0060abe1 14131ccf 5194edcb
+    6c88b8f3 0b99e203 a076ad07 df4a6e42 e38d37b6 5dd06251 caa268f7 9b460dac
+    a3f43f57 53a3e146 e6fd1029 ef801366 57012449 207de181 b8057d2a 494ca3d0
+    7aa5a82b 136497da c659ce25 c05e86f1 6ae332b5 54396198 7414452c 89d74e84
+    30b0c45a c1e996bc a9eb5471 fb6b212d 838fe244 195f8a19 5917dd
+h = b16c7166 831b62f7
+
+k = b7fffb04 04d1e6ae 3d8a6830 b19843c2
+m = 5bf90bf1 5cd49c71 5b2860d7 9642f4ba 51248f9e cec88a72 f6a89386 da6c560b
+    151b9865 7d0be4e9 f6d4c44b ada98981 d052f8b7 c567ddc0 536503fa e1569e6d
+    b18fbaf9 37c8bbe2 03ab647d d6d2d2de 6a1152f2 031948ad 48da16e0 71325344
+    e87d0e40 8b67610b cadf5d36 6993172d a8bd447e 74229581 ebb5952f cc24dfb6
+    daae5c5a 91787f4a 8422afa9 9fab69b6 204fc76f 4ffe5f41 5a5fb824 2b21b422
+    cf4c9f98 3267115a 0aab1246 bcff7faf 3cd3517d c956dcb7 610f520d 7f3da541
+    3b3dd72c a6ccae91 3be4335c 097a219b 7144e4ec 034431d8 fe9a3fab b93a680e
+    5f2e49cd c638dc9f 69fc5a3e e0c42734 d29d8eca 793798a7 53667218 23b16c18
+    0331f2ba 0013bd96 b9d788a8 e34915d7 b8f16e56 9e4d361f d7bcf316 39dd6341
+    2fabd294 9815312d cb7ccf69 8191056d 92291467 09e4f087 3f6e0eb1 bf71b3f8
+    1fb0cad2 e12f9aec e0d57b12 4c6c2a62 edea6f6b a358360e 95957baa b7e966b0
+    770852fc f8df6274 38e229ed 5a4910a3 0e8836cd 87715eac 44d6e2ff be56de54
+    463068af ddc832f0 088de30d b4a8259c 6a9e000b 695ea01b 91187823 c67b168c
+    d5a48c3a 8bb536f1 a86ae3a5 345385b0 87956182 818c82b5 ad54e15d b5832921
+    4f56554b a647d037 a9467691 50f7cb55 449b30b4 0c4fd2bf 05d110d0 46bcad8d
+    862c8eba ea3f0d8d 1990b423 6ab02cab 1f4b8001 609a1d59 bf3a0720 eb9b0d81
+    604b4464 ec90a834 e96a5843 6572bf85 9c6956ed 5915aabb 8a87d45c bd91d45f
+    331a3c93 ed9078a6 983d96a2 d8c9bfca 4b4828a9 369ca7ac 883c2590 70f50daf
+    1c22032b 11644cc1 ccc73dec fc2b1a69 eb539df4 5c448044 246a131d 606aa21d
+    494d53fa 2fd5b061 a242c14d d32fbe06 70356310 b1e75b11 68d82e1f 56222718
+    b9a40c5a 9ee9fd78 1ec5ad09 4dd63c61 009cbc2e afb87e43 e507101f 4d11c891
+    a1604883 09ec9a9e e407f257 a5d6f6a0 54df0206 84d605bf d8562df5 45e644d2
+    12c7b1d2 f4d8cf9c d6fa5daa 7499a43d ed6ab565 22ad92fe e180607b 257cef0c
+    6f8d9c1d e80661b0 a1aeefc4 178b5471 d80bfcd0 27ee0404 8e8bcd03 9900c319
+    f5f59ac8 666d3413 0c9860f7 83e24914 b9746b1e 66d736c8 eb71ab45 27d1303a
+    c42bd867 7255ed42 d0c0d00c a258988c 424195b4 b628523f da4bc635 e7038c20
+    df4eed2f 00c90116 8c37aefd c55858a9 141cdf15 4ad2359e 70111fda 0356a837
+    78b1f38c 2aa5bb3c 9f11b686 652c818e f3934251 a432ff30 1350cd2a
+h = 6bb08d05 c6b4a187
+
+k = e36b5fed 7de4e99a 726b8c81 51fa89a2
+m = 51f4392e 8ba61159 5cbf8f79 521d7d8a 205d4c7a c0aef05e adf49a97 5397a685
+    982a15f7 90aa1802 fe313c98 bb030b47 b59c5b08 c4922675 c443470d 8b16328a
+    8b679231 ff11c33e 73a3e30c de433dc4 c5c2c605 5f53af45 91b4963b a618aba4
+    1cdc2d37 f87d5786 e2aceefa b2123792 cad569f2 9f834c08 f2d9620f aec5b33c
+    6b9f84d3 86291623 e55d35cb 9470c504 4a32effe 7c3327ab d3b805b7 c835d25d
+    44aa1fa8 05bc3975 27cff49c a09bb533 86ef5ea0 2e474eb6 2e392fd6 59473541
+    604626ee f06fed60 7102ac45 24cbb298 c6e7fe08 c9cc31f7 c610f7d8 bc5891a7
+    84c20415 6743dccc 98132aaf 66aec808 47570981 6d506a11 0becfaa7 66c3763a
+    21137040 b30b13ac 1f9e76f1 5fdf1497 6cba6b16 53148e08 4f07825e c70e6d12
+    77aebdbd 3892a7dd 945616c8 f813d746 34470668 f9ce8569 b790a4b2 45b022f6
+    3fb2512f c2867c65 cc386d02 9e598138 aa5cdd34 0a4c711e 61c79398 271d7bb9
+    b7fdcd18 04670450 2ae91aff ecf34fba f45f4222 e8b2e6dd caadf989 a9bb8f0d
+    a85ae7f8 50ef0ce8 018a7659 bbff8679 439e68ae 35a3eb86 55f1e5ca 42aeca99
+    1bd149b9 b16cd5e9 82b0ce1e 46befbcb 36a3ca2d 3b3ea4ad 7ccd59af 0b4669c5
+    8176fdc7 57d8e050 1fc8c886 07bf479d 8502448b c4ba6b53 3be30f61 d601d547
+    14ab89fc aa8b78b7 528a5ad3 4f41e9d7 3d5cbce3 30cb4a84 d7fb068a 21238af1
+    a8bf7f9a 3ec5f5a0 c1d2b667 077b659f 60def375 5072a0df 92ef5806 40f85445
+    e153248d 36e407d4 3fafec66 f9751d7f 30d79b36 6e2d4e33 16ad85e9 eb8266c9
+    5e62d9d0 f8fe633d 3b9ec874 4459cdec 3f59defc f0e3d304 82784daf 26614755
+    39a8f7dc 2f2263a0 bae08136 273accd8 1abc91b7 6457f0fb 564bffe4 829ba06b
+    5284dc28 8ef7b731 34203728 e18ad6f8 12741d1d 9ee643a5 eee8484a 4c95b4ca
+    1dece065 344a34a9 d4aaeacd ba7d69e1 16b7f61f 6f2cf63a 67184a0a 79de26c6
+    aeba4e5e e688c407 cfea4e96 743ce0bf 827784ae b8ea3436 6f90bc0c 519c613d
+    44d70923 2a810989 d3cbdb49 011453af 0fb21148 520f38aa 51c37ea8 c32da39e
+    a07bb168 6599ad7f 2c91a588 4e00783c e26036d6 4498afd2 a01072e4 84708fbe
+    7fecfc67 68563d67 64ab7bcc 3aed145c 0c1119a1 c54b5589 f503ad3a b88c4368
+    e0c1e165 eb72179d 569c31f5 bad85207 8a27ff89 6aad6daa 43605a2a d2eb54ff
+    68b5ca9b 843ac8ec 93c8756f 39a0660b 5c91c00c d98c792e 1d6803ba 8b
+h = 17cc86b5 c86d7448
+
+k = 435d9358 b10e3338 e752b571 d0461854
+m = 46d6fe5c 8256dd20 1725c0bb 874f048c 94f65bc8 05f1907f e46b4481 730e0938
+    11411dbd 89e20a5b 2ec6de29 27cb2962 75b3910d ac8d6ba8 343479fa 2cfa2795
+    daafa984 13a8369b 59fab626 4ae6d486 dd051632 b495e1e0 43c87544 69e0f403
+    aa26eec3 23218fe3 56de7ba3 f20252f4 70b8c8c1 70a09e00 a8535a05 8132fca5
+    837985ee f6797c87 4b3e01e7 12a5b037 3719d901 01d0795c 77ad3d2e d7505b49
+    158b40df 79af019f cc10a185 ed24acba 8f97788e 8bff5f00 d3b372a4 7e5b84b7
+    86bfec75 05b9d1c7 89fd8312 0d96e744 8ec47031 d260cb05 c6759afd 91bb3f91
+    8887af9d fef51df4 135e7289 6b548d37 8ca2d45b ca83fbc8 486b5a70 693c4220
+    766132b9 9f94d1f5 ac713977 78228c49 9e8fd669 bf144207 e5d68d86 651d525a
+    9d61fe0a fa02e6eb 6286a756 54abdb03 c3d1b13a ccea5c25 d6af2f2d fca98ff1
+    039f1b45 b4a5855e 97dd93dc 69d5dd8d 4e0d1a8b fe54212e 37750e6f 326d2560
+    fcc4377e ffa5c7a3 8c026866 1a7bdd2f 0062b18f 9bfef251 6d6dfe8a 1377abbf
+    f37a53d9 42770782 ecbf4e40 ce63d625 97672092 8304de7a b3453ec1 b1751408
+    707abbfc 9dbfb413 5a164b2e 2b7f9aee b11d0402 02ca6755 a210cfb0 a47d063b
+    faf8953f 8740b23a f955a193 0c12612b cf42f1ce 075dbe64 4f5f263e 894603bb
+    06a8e3eb 0b862218 6b3a0109 45afade6 8677db58 bfccbc5b f31e1a6f 50847957
+    22c9034e 86809c87 ed7e323c de0d1253 73cf13f6 b28eebe9 d5061ef6 d7abb979
+    406392aa 2b6d0003 7a1812c2 703f0231 a178e5af 79184cf8 edd2dd9d ebd31939
+    ebec5d2e 00041c3c 79fe2ab0 ca38acc3 64c21270 0cd5ad56 72252bca a302a883
+    c4dfc9fc bde9e6c3 540829ea 029cfdd6 e8865aca 1c34cb3d 84ddaabc 1b4008f9
+    981ea2a8 9656b9de d1a0d92d 7e3e6801 2718da2f f1e85302 1a6df4a0 a99702f3
+    d9f1d8b2 a5c01736 9907d59b 3f0ad7bf 65365dfb 6c916e9a 27cb25f9 6a32d7c0
+    40bda524 60dae1a4 2e2d0ee7 76318587 63892de5 3ea0a830 6d587425 f338800b
+    0a44dd34 d914d403 81498e82 f2be890a db041c27 4a3fa33f f7c5f524 5089b03e
+    a75dd283 40ed98fe c0355fa2 1fd818d5 72d43ccc acadc961 1ea92767 05b4f42f
+    7a1de499 c8b352a0 1da22ed8 be1e8806 f5968ba2 99236ffd ee9b41be a2f70095
+    2fa0e970 11a3e544 16921705 7229bcae 3dac423a b3e574c8 831ef4c4 cefe8743
+    362e94f6 555a02a3 ab350a12 fab181a6 21bb2728 3464794b 472760cb 054b
+h = 62303161 c8ad87c4
+
+k = 7509a5a1 5080d68b 4e62153f 8e46fa63
+m = 79e25869 772f38a2 f77e4389 40bfe42d 0efb4c3f 85afab1a dc7c5cca 5bd27279
+    960043bc 2b873829 f21fa0d5 393f345b abc7feca e70da750 1dd25f09 5a6ea078
+    6c55f1ca d080ee64 d25174fc 07493e75 7c03dac9 07e8bc24 07a95f84 f86ea941
+    36df31e9 1a3d1f12 7bbe6035 ab754574 7e827cc7 270d587f f7431027 6e291db8
+    1d9d1a53 f431cd24 6c95564f 4c98e07d 1a52d084 f23eab85 bf6f7f3a e6dc17b0
+    76786e70 ef96d56c c534978f ab6f052a 3628685d 5ef04174 c788888b 494394bb
+    9b65be9d fb97c306 9769001e 9127820d 7252bf17 b8992ebb dd30cee1 7d14f94e
+    9feccf76 44c219c6 fccfd058 81ec59af 18ff35fe 5db448eb 25f5760d 40bb324b
+    0b5e7ccd 3474f147 9eaa91b0 715e773b ee4e6f17 e8224f58 3ae7c6ad 095a7de2
+    24ffadf4 14ae8db0 723e06bd 3c50764b 4c5cb762 899f78e7 334fd48d 28246132
+    017d5144 59213149 039a516a 4b99c1b4 3dacef50 b0f3d4ef 90103287 147bbcd4
+    7b6a1dc9 b082245a d50ae572 e678e5f3 f6363550 fa6bdbb9 e7cc5ca7 82186b14
+    a19ef581 65a42b05 3db0d2f7 7f1b2cc1 3dbd7019 9acce3a3 4d3f809a e516ba5a
+    318d8072 a8e05fd2 6ad47e70 cc0798bc 781777bc 8a49f06d 3717072c 6c918205
+    51a98c3a db8007cc 10275dae d17e4d32 31b55cc6 575cf492 1727a0a1 2c6495e9
+    698e3721 117c6db7 7af23a7a e9750ede fc60fc1b 36c48202 4a4b0cc1 8b1692e6
+    c25fced4 c825ca87 5524716c d5d64263 7e166fd2 7d141055 3e8f27c2 325c7721
+    1ee87f52 72be3eb6 cc08ae78 cce12687 2a78cefd da927be7 b14cbe37 992a09d8
+    076cf776 6c4a6c17 6070a073 398bcf77 7e3830b1 e793310c bc6ff7dd 0978449a
+    0df4eaa4 524bd344 693002eb cf12203f d10ad498 565f00bc 4290abb9 9acf474e
+    b057a32a 1eab935c c4aa32dd 5f05d276 7d5af5b6 f44e11ca 2412f43f 38fa4142
+    0469b67d e8bc360d a05c1b8c 93ff0341 a534ee17 a2e9f372 05c20779 33dad01c
+    8123d820 217226cf b87e0685 f00c989e bcfc6c7a 56ec827b bfca704a 798f9ae2
+    af728b53 a58a20ea d4eddec9 0ee1102f c326f001 04dfdf54 f6cca9c2 24d9e2de
+    719423b9 b2a902f1 4ec7c4ab fefb9415 80d36a24 049114ae ab2d78ab 3072f69c
+    5985371a 794e7e9e 7383713c 75886012 bfccece1 c2a8e1ac b772e0fe 9ddc1cdc
+    350f7412 c169beed 489ac680 6f459855 9ec426a5 e92d1a25 ea3aa74d 8ff6a6d4
+    c4b77dce 04a5dfb7 13e24025 61638480 1989d1cf 53d00072 fce96c06 d13f1d
+h = 2b9583ac 41b7cb0d
+
+k = 2fdb5c49 5629e24e 4f2cd408 cfe17141
+m = 7f3141b2 49b22077 9017b990 5c5e3ed4 134082bf 0cbd08bc 8facd089 619a9a3c
+    30f01482 df5bb97b 740b8a24 106867f4 8c9ee2ae aeba89f6 d007a96e 902c3600
+    e9064738 32fd1eb7 dccdb252 12cd7bd7 7d1abeaf f2f9f6f0 9fc9409f eefdf0c6
+    4eda218f 697782a7 a14e78f2 71402b5f df803d26 70d83313 55145699 6cf39b60
+    1ec2e89e fbb273ea eec8a19d 9630aeb9 ee3599d4 c295502a e893aad0 a331d925
+    e02a49a9 866e06c6 43f14d7b 50da8c95 64c035ee 4812136f 52eb30ae da2bc80c
+    6da86b41 4c48e70b 5278de2f f3ff2fc7 4a95d913 b1f5a7b3 894e4293 9db6b7bc
+    d46a0659 d60f8c38 6f6ec6ed 0bab9394 a9ce3cde f7ceae8d 69d81e8e 4e594793
+    99b3c81c 1961d587 5e32363f a8db7bf6 4619b965 d86fc316 0ec09dbd 061701b7
+    dfe56869 41069370 30b02a4e af99b5e6 9ae28d43 03e7387b 9756b708 4f5063a0
+    d122e182 959f9103 ae06f124 7f9516e4 57f72e19 359fb6e7 51d7224e 07d8a9ea
+    27203ab0 906b8821 01c44bef 04b16f9d a109be57 a5271a8d f31407ec fec34886
+    7f30fbe8 b9600c51 f39ddf01 a458b1d5 4c004bc2 1ccf2c5d 065ec9bf 8e9deadb
+    37890b85 80070c5e de60aafb 8faaf59c 4a2bc0ff e073fafa 3bafd2af 1b209b72
+    9030b032 ae23834a e7f48e60 7acab7f9 72c17986 9cc9f60f 87539fd6 88d7b823
+    4ba64576 2f610397 cac8e754 689b1ecf 17c7652d 6302afb6 cbc8e8c0 a37e36c7
+    82d27c08 90767a82 4882406b 5f2476d5 e0071203 a8044050 3fa3f89d f39b48f7
+    cfdc9efd 163d4d7f fe34b58a f0d8acf3 4fa3b486 3c354aff 05643e1f 8123908b
+    9cf3f33e 4397d2e9 2be28063 e0c3521e e50d437f c4062f00 0a82a234 5c3d2ded
+    f4693a26 5e286b92 bb6de10a 569c272a 3193b594 e1a1f724 74969071 41c35806
+    59748ddd 756ef098 7a57cbc3 096947d0 f06e701b de2f5a34 aebaf51c 6e623e9b
+    ee2ee907 26d3fa7d 3a192a0f 011d2071 202a8d07 3d4d3ff7 148b995c c07f4a95
+    daebfc26 74ece867 98bcb177 46d5429a f30dc36a db2c2b4a 918addba 3294037d
+    c9a93e9d 4317863b 748ecb6a d3e97e8a ff7f5dda b3458261 f6aff072 66e25152
+    28bd3465 55f3e599 59e05680 4b3e9a28 0aa7fa9b d17e9e7f 946e7b46 0a8c8c25
+    491ee5fe b04a3b41 62f1a062 cad64acf 74ae2cee 0eb268bc a2266a1a b09aaa2d
+    7852a9c2 c957c1d5 17175aaf 37da5c6d 23a29849 52e5c4df a2cadda7 df8f09cc
+    dca22523 376ede9b 9fe3fd89 7212d3d3 e1b67675 246cfeae 2ffc398d 0b6a6958
+h = 6628a8eb e3e28289
+
+k = 6378499f dd976d23 af3b03e2 d494bb68
+m = ba8bed5e dd009e7d aa18e62b da1578f7 5124e1eb 79b1a95d 0786e1e7 733cb597
+    ab4b6460 df693330 d560c2dd c1c36de6 8fa1d3e9 98290c76 7fd323bc 9bf10018
+    a26522b3 cde89dc1 f841f73e d4e2b1af 43eefc09 6fd3fdd6 e4c145bc 44b28c5d
+    f30cc630 215bb507 852c82f6 5e9914cf 6f00a3e5 631fcde5 4a876b08 7787838f
+    061ef2fd 29db52c5 076d6d86 0c2fca8d 045be023 be0ff251 6184e1b2 5ee85e1f
+    f782cbeb 61c9ff12 0acb747e 1b62c783 539da9f4 3f8ba954 0204f52d ea18ae0d
+    2707d5c0 91eb2a25 254abc59 99d034db c5f9a5c3 9c58a62f ea21ce76 b21a6223
+    c221fe4f dbb58f97 e8894341 6a640593 b7db2dc8 7a98c5b8 bb5d5151 e8c7fbf0
+    db53d753 49c12ae2 33a66cd1 4f5f14f3 10082fdb bc243fb2 434dcba8 80630379
+    76944397 cdb36864 e4cab96e fb44c678 f16e455e 116410cc e27f62e5 c5df47e7
+    fa46529c 39b14394 ab2374e6 ad1f9ad6 ea61ed77 994284b5 f766035a 13b4695b
+    3efb047f 88979ff2 e26181dd fe9a5556 8c70ec52 4a219924 ec193b65 43986908
+    0c0bc081 8df592ee c3897543 32f654f4 a1c02357 fe73de8d 27cdc93c 70b24f4c
+    9364ad99 42271ff3 0be88df7 7fc7fb36 04301b10 43e403bb b03a215d e6679597
+    6583ba9c 9a036f75 3effab43 e455e81b 416318d5 ee87eb58 6a5a33d4 c8908f08
+    f2ce09d1 1220f2df b97dfa75 38badcd8 70a13494 49e23a30 6f404eb2 b6740d47
+    4bcf720a 2f49f5c6 bdd4e942 54aeef20 9a60d114 da594e7f 2506264c bb7e9198
+    5c673855 ac411f56 9440daa0 ef7b061f b5bceb80 e7fcc9c7 7b33bb0b cb19a278
+    ac713ac2 359b1d56 bff1a80e 32977364 5ecb97c4 8be8bb64 e4c84276 48deb351
+    98968884 811f5f66 48798b47 527a7ddb ec96ec99 27bea124 7b064416 5d5cae37
+    59276088 0b26b29a 342a856e 54dbc1da 4769c465 ba3bae33 ba0a3361 f3cf8e98
+    b0fcd9b5 75172759 8e9c9938 f612abe1 39d1c6e1 2883d778 15d1a742 4127f7f6
+    54b09c62 697052bd 0892c13b 0e4460f3 af9cb134 4298006c ed773777 caf65232
+    83cf8bf3 97c62e88 3e2b3a6c 89ff4fc9 f01fe62e b10d42d3 257d8431 228aa715
+    8d6a3b00 9ca40423 de6ec639 a2c1e2c1 d48f8f22 fc4c8048 6abdade2 2757b016
+    9d9e43cc bba8e06a 433cf5c4 3bc1b136 e9658223 a7b779ca 4d502449 0c346e8b
+    8ad2960a b4fa697a 25e09342 399f1fcd 7c96872e 577c482a 2b51461d bf883544
+    63563134 184e3480 2f96fa06 c7d5d032 3ab3a984 f794dd13 1b1b0fbf e456498a
+    6b
+h = a3ab5bac 28c6c20e
+
+k = ef6814e0 172b4b7c 0cd3b560 921b90cb
+m = afabc902 d902aa6e d6e727b3 7900ba48 7c426c39 1e2fff3c f0ea700c 45159ec6
+    b5fd77f4 ebee0dc3 2a7e0c43 579a928c 4b46a7b8 3f055866 41528cc4 6feca3f0
+    9b95efc6 63406c0d 921ea849 e99ffc29 082af98a f6b9da7a 82378eb3 cb040bdb
+    0484be1f a02fd5c2 4b1b5c1d 485ae809 e26d9ad1 a66c939d 67090121 39b9860c
+    6bfe2f86 bf79ad1a e7165bc1 3fd95730 0daab3c8 420257fd 972a5060 6001edb8
+    6e8986e6 92a20b8d 7ed99d07 a80bb066 e84325d4 afa03645 2bdd0abc f5d7c61d
+    28b2b270 b9b28279 b19c6c51 eecce44c 164560ea dadc999f b4d44500 5398c108
+    48720a69 064f2e2f 987c3f06 828f1a2a 65fa83f0 0028d77d b2c57bfa 330856c7
+    5ef9eb56 c833e0be b12565ce eff43e6a ea45baf9 6bf29514 fbfaaf2d 01683d15
+    313c9638 041dcc54 ab95e9e4 49a44f7a 83b93640 f9cba056 aa9f6b7e e4e47a93
+    b6e48f36 fbdca535 93676475 4523b97c 60fc58b6 a99bff2a 72354087 5eaddba5
+    555418df bd7d6202 094b8101 f3b701c4 c5a9da65 04e4ff01 5882f6dd 0d805f08
+    bad9e417 65c93fb9 974879ec ae2d1783 2f5d4784 1709caf0 e0c6af72 8d173f44
+    bab4eb01 0eb8a9de fb435c87 fd0fe355 ceb68477 63934801 31f671b0 4d43091f
+    7d6b8853 d47d7f60 63ca87a7 321100d6 327b728a f3c4eecb d86ec97d a6cce6d8
+    86149c8b eb15319c 90710939 e5e3cafe 36db5f5c dad9482e 538e0d3d 5f6104a4
+    f5452b95 61018d18 474d2985 95c3d8e2 b4733843 6e3e0f62 c829f5fe 1fa8b008
+    b6ff1c84 3b28f6d7 a45f2b1c 407a67ee daa821d8 164b5b99 0990c94a 116cd6a5
+    6fb929ef f6e25d06 2797d66b ad545093 b85a52eb 4fe329fe 488cb230 bdbcf649
+    74e4309d 03e0387a d6ccef07 be6df9bd 2778c003 e86f02c6 121f4d53 faa9d5f3
+    e1195b4e c655a44e 6cea1f26 1b2241bb e641f82b 888b5f48 1f9a8cf7 d528ae6f
+    761f2758 cb01438f e3d28c20 11871386 f8a75e42 58be0fa8 c2d59f56 b5d89fa3
+    3e423057 426aa2c7 5b20282c c53a24c8 3c222eff ebc15462 07eded30 39817a19
+    0425d6f1 371b998f 3aca06e8 3fa20a30 bee643cb ce5fd758 bdbd08b4 2631bf97
+    b78b909d 03109802 63173e57 91c5996d c97549fa 33c5d474 31ee8731 dc0773f8
+    510c2de1 0a5fdcef c9f2035e 3b421348 62648b2c a1bf1d3c c780ec9e 95b7a032
+    eff16661 1ced98de bca59ac3 1c6dc895 61bec612 12d11999 d197ceec 073169d9
+    7c47cb67 c2328e37 d1a20484 c7bec9e0 b61e3290 e03b9a20 93c71451 73815ee3
+    acd4
+h = 7ba4e9a9 88230700
+
+k = 4f2f8eaf 4d524ccc 3a6b6b1f 7f15c2ee
+m = d102accc 84dad49a fc17d751 27fd8641 e4b0e697 7d3a6d7f 2c8065cc 07b1d120
+    55935494 d9ed9213 04e30b68 e3be24a0 d1eb6eb3 c799f4c0 4733e1bb 63df5652
+    48794b93 ab0afd71 0446faa4 03d42798 045bf24e b773a179 c588c4a5 44bbcb54
+    df220514 e0db7ead 19a2949a 07d93f8b 58412f13 0151d972 ffb4204b 9adf431d
+    afccd97b 04594b1d 3cf49420 dd82add2 916194db 63c7d6be e2bbff5c 2a2e9065
+    eba87ef0 5c82bc43 cc4cba57 deed0f39 4933ca18 bd785bda 1ae65531 81536a94
+    714968a1 716ee6b3 95e69543 fff007c0 44c87725 be1e4143 c4b86243 e8036629
+    34128de9 c15bbb67 621e372f 036be671 0dfac120 902dea8b 3388e277 685cae72
+    14d0a6c0 a052a57e 4e89e80b 058e27e7 cc82296d c3f0fc01 f0408945 97987ad8
+    644851df 78745d8a 2417eea8 f668e5d5 fbac68df 30d5018e 385eeb20 2867f5ca
+    8b756b78 c964ccd3 8d224e2b f2261dae 0e11b7f8 b9a77df7 5c7c56f3 5e6e7a85
+    6515db6c 629d8fd8 1c13e0c0 fea385ba 4160f7a1 e3c121c2 b9ee2855 8f0d5224
+    1a577ad2 640aa41d 3a41e9c3 30cf1c26 0bc9fb9f 122fc453 0d36b3d4 aab0a70e
+    d6e19f49 d04fcae4 75435aa3 7971e22c ed9c138e 61c9b08f 78104f68 d7e40385
+    c4bc6657 1d8347a2 90cdcb50 9706cf7a 18c7ae4f 4d680d28 5c118e5e 1251feac
+    9b61f840 36cb55e3 c2b69b88 8c8bb734 8fabe50e 76ffa4c8 3ef3b659 2644c434
+    8c4af304 1af2386c 91e5f12e 9f5b8a81 f8265e01 99ca6357 537f9db1 463fb8e0
+    9a3ad460 930a3ca2 d0d4787f 9c395056 a821033a 738b5465 dc9894d6 29acc7e8
+    49a36819 9db17409 2106929d 05be3020 f4d831de a9bcaddd 611d439e bdaa0afc
+    e2c8eec2 480ac26f 9c190756 2d2b1209 bf0d6bbe e33faf2a 199af0c9 3d27629c
+    17ae642e 7853c13c c9d21735 d3e84608 ce2f0692 109b2da7 e33ae73c fef42f98
+    a7953e11 c2cd7fbb afc23e8a 20caa77d 4907233f 8d51518b 97067a49 975b38c0
+    7042c3e8 a9aa65b0 f4d56d84 33cf029f b6462ecb 6bc61c95 7b8d66b6 e1966c78
+    cb6e1b4d 6dd14bf1 0fcaa03a a1a9af71 763da1de e8d0c8a9 cb257574 f4b490c5
+    a10b4c57 def2297a 71de60d8 dc36fe9d 091ae372 1d841bb0 fff9d3d3 ed356978
+    113f8b5b 4962b82e 42213996 6dce0681 57be696c ef4f1e70 a8f9ca39 2b875f54
+    8d3858f0 1185a0ce f614da5d a1fd696d 09f1c0bb 797b7bf1 1876cea1 da2289c3
+    db89c525 32d68552 6799722e a4ddf0fc 8ffe9ee0 3674f449 7bf7506e 1f639c31
+    fbf7df
+h = 73e55b6f ca1de331
+
+k = ba144a3b 85a68ab6 da2d71ce 91d66c70
+m = cdb36f4b 2b490968 beff6d0a 07cb6f92 ef513688 ba8739a1 2e76ccfb 248d5a8c
+    a8ed8b76 b4da45b6 d1c466b7 8ed2a361 8626e873 35155821 262d4474 1bb78246
+    79b24185 c5d7411a 8ed06fec 7b04ee06 8a1d4e14 744217ab a737965b 9a83b8a3
+    f5cbf684 ad68beea a9ccbba8 fa6ad754 d5efbc52 245dfe95 e4842ea0 88546d11
+    aec9ab2d 7e04aa05 d5d13f9d d40218cd a3f2f234 8ca61572 11882236 83330cf0
+    e4fabb9b 05402d09 d1476b14 1e49ff03 110f0549 71b53ca3 a7b63b1f 581b4dd3
+    37148acf c946fea4 74a32da7 ef42f899 ef60313f be783f03 833c15ef 92e073e4
+    af2d5666 c338d306 c653f45c 31de3258 b59f88d2 57e52af6 31719e19 db43e8f3
+    07512dfe 53f91703 9ab02477 f25275f1 44857e66 34c58c89 52592a58 5fa33cd8
+    e8018142 8960e5ed e278b993 bc74610b 1ee43797 5624e4ca 612e8e0d de9a457d
+    bdad0b78 f6717f5c e8f8f116 17e2c66b 46c479e2 1206d2ce 3e347c39 01142c5f
+    fc752fc4 54a2f9e9 880cc7ac e7a1a730 136ed5ac 0b7573a2 c57af9f6 68d79c62
+    b9dfba21 946dd645 3f49791c ebcc1c63 0e958056 6caa285e a3f9055f e3181d0c
+    636ec1a0 6880e31a 6043938a 25f0e523 9f96ca07 76664099 67c08d74 26bbd80b
+    d1eafd25 6f158639 e3a4d77d 8ce9fd11 bcbdb288 6250a8ef ed9285e2 b1e50a4b
+    17180a73 a9415d7a 512264c4 1b93a864 60f022f1 143d50c8 978a2364 1b05b096
+    f1a50009 2495d142 d27fd41d b75c8ac0 519c0451 23afff1f 99b745b2 fd139e16
+    2143bafd a42649af 3b587835 6ab0b16d 9ded12b3 f9462e1e 2cf92e5c 24f65e92
+    e21f551b 0667f2e0 fa21de2c 3333e090 a2b2c0dc 7aeffa22 3966a31d 04cca034
+    aef87f24 df1541aa e57a0545 2fa793ef 741356dc 94cbd2d3 469a692c ea2b3f58
+    6aa607b3 aea2bddf a0966492 8f6ce5ce 2d095f59 b56cf07e a196fe86 5b7b8f14
+    f0431565 764b8111 04a62bad df56da16 3d7f9067 f2f9bcf8 3a578a55 3ce0d53b
+    426cab91 ff1eb5cc e7b8e889 3f66d4b2 3c86bb3e 1482a405 c885fa07 43bba687
+    eabeb784 05beb3e1 60ae67ba 0a2fd5fd 11c8a191 e12f5907 544073f3 ae53dfb2
+    d913661a 804e87a1 e26f84a1 abe0c71f 94f87774 08cac506 09e099fc 3035a56c
+    922f9964 f6a75912 09cecf9f 6271b175 62384b87 aa40420d 94e78c95 9245d770
+    a9da0ec9 84191cd3 b4605736 2751cab8 d563e1d8 2af20576 ea236def ad8998d5
+    ef713e97 5c0a30a8 08c854e2 8f6545f6 a7d3ab55 47521db3 a4de5294 e8f41001
+    b2dcfd7f
+h = 0959d7c0 eb988967
+
+k = 2e476de1 f38a2cef 4da328a1 d98272bc
+m = 4ffe23ba e47e9f7a 8c943435 29b330e0 cc1437f0 c82be7c4 0d18089c db611806
+    1f107775 64b74760 a0f84b12 429f9dd5 2eed6f77 89992710 3c6aecda 120f377e
+    43068034 5eb927ad d858b950 8de099e1 d46e673e 44b46975 216cbef4 f2be45ac
+    3d5478ed a5697360 ffa7fcb5 c685efb5 1b3c7616 b7ebc034 bf9a5b3c 52c7e55a
+    07804cb2 1caff31d 31362675 a987bd4f 4e837ba7 75653342 16757df5 67061cdb
+    cd6ad0a8 65c94e8e 633b4df4 9f6b64aa 7035c71c 7a182f55 bb6a9eca e4158aea
+    1f98ad7d 0b10e10c c2c30119 8b9fce6f c36dc8b1 36ac3475 ebeb270d 65f33cd7
+    c983ebd2 f2627f2d 27376761 375641f5 0df23559 8407bed5 fa788e98 aa034df7
+    065e52e5 96808bd9 a394a3ea 09395790 8a033244 d5f43c03 b826ef45 d44f213f
+    a8c2242f 7b3ce171 d0a4ac25 e68dde43 01dd5b64 4be4b9c1 a5e1c8a8 755907db
+    6af8a5ae 163bc39e 4c30a760 8cd62467 d575b704 70c4290f c54ef060 3192297b
+    1beb786f 769f2181 bdcd6a14 9e1ebf11 9bef9f9b 2721e18c 85330256 b5abba4f
+    5f4ef0a4 dbe9a83a 45cc8c00 f819c9cb d73174b1 7743dd95 5dc73504 e831ce3f
+    1d624c36 0c267975 d2d31b34 12bd6b40 7c704b68 bcf3070e 999d4dae ee290e85
+    c1fd8478 4ae2bf4a cad248a5 1be484f3 be2a7146 d45d999d ebd53da3 95fb3b88
+    986984af cdb16f04 3009914a eea8e48d ecedaa6e 5500b3cf 389732c8 d146cb18
+    7a58f411 75d7d264 3b31c9ee 299e2a09 97c81e05 3dc09f56 05b5c753 9bea4a3e
+    429fe659 5fe37d61 6b0a0529 21f880c2 72b53876 8efedab7 0d0bab9b 74344917
+    ed3fee59 f2adb665 a394b576 821f7012 218eb32a c237f495 afeb246c 0c204fc5
+    a557990e 77aaad03 5e349541 c08acf9f 7255a0fa ba47749a 5ea5269d 89c8a26e
+    7433be55 1b755e1e 8ff2da2d 0dea2f4d 63a49805 7e8c24a9 09a1d82e 9ec7ae7b
+    9b6bee5a 48545d81 efe71f71 84e9f153 6b1cd420 6d5cb537 28626742 01a6178c
+    bcec6dc9 9e4443c0 621d590d 8247f42d ffdef1a9 5f9edefa cb76ee73 b1a955fd
+    1bf2a460 df12f341 e41deb94 14561635 78214676 d41800da 47359d4b b1780638
+    cd48ed6b ce3d7e50 aa26c9b8 7c6acb44 0dfa686d 1113d5b9 9d76e69f aa31a4a1
+    5ad5ca98 8b17ac32 69c889a8 d4f3c2ad 1fd99287 037dc292 ee14f652 764d6df4
+    1eb6c8c9 0ca3ce0c f38cf2a0 ce822bf9 e9a1dd9f a9903a8b 840a25fd 56e93ee3
+    a2f128ea 4e905ba6 4e706f23 2c0fa53b bd9b7175 58388f94 9b719929 4e83de91
+    ebb32b25 ff
+h = 24546994 ce60e777
+
+k = 7f487d75 045a0dce b060f5e4 122d92d8
+m = bd0a59a3 0956e863 a2f4c2bd f807a9d8 78eea408 10033b18 f719173c 3f83f3c1
+    584d40b6 7a4102f6 c920936f 6f857b4b a045f443 f65b369a 8e74bca7 3e81cc87
+    098c094a ec4a24e7 5d101fe1 3b9e8a88 7cd3c664 8ebfb260 fb962716 51f77a37
+    d014456b 4d38825d bcf42a8c 025cb719 57ee5f85 9fb4fb79 c2192179 69fe1290
+    46a069c3 f95aade0 bc60b3c3 04e835e8 bd60d026 60edf7d8 021dced8 e548891e
+    14b15de9 a8d793ef 2be33560 4247f862 2035be7f c336a5c0 7fd2b48f b1941aea
+    3bf0af5c 346656c7 9e071233 c6851163 643080b0 3b04db8c 9cfd91f6 69fb61c0
+    f04a9b99 6b13a148 b43cfb6b 8358d275 5ef21e84 bf069fdb c1b0e45c b808b305
+    03238c16 20754dcb 0066b789 766ceb02 0b6d4810 e75cb39e c88f0cf1 5433ce39
+    9aca3619 1e69aea6 0ef7c2c3 c20a3fef d4881353 6a9f5399 384ad5ec 4411f789
+    23a54d02 2c07e11f f1c066bf d92bb333 b7b3dc45 34725395 a3805495 54832c65
+    e1ae679f 13682d91 82fa8883 ff1cb876 b6e346e4 8b3a09b4 38533020 a40d008a
+    7069b812 7bdc0f9d dfd178b0 c16f9ee5 b42a6f75 388e31db c2ed9711 20a1ff6e
+    b0dd2056 93b5a24e ba663b0b 7ad82ff3 a179f108 c7ed31b0 0e462408 1687212f
+    aedb230a bcfb39c1 f19afbc5 c5e07d14 b7d7b898 fc2e002a 25abc962 a3b203b3
+    57216974 31d48235 18958221 b2dfa412 e1be7eb1 5731b757 439cb808 c6c57590
+    a0bf358d 53186964 70246a06 c9a6c75c 5c83d31a 030ede5b c67a1ee1 652925f6
+    62b2e5f0 fd41d34d 3b02e853 3cc1eba8 92342a01 a60f2430 4b8a52c2 13ebbfe0
+    884f1290 18095fab f80c7dce caf62153 6f0c0646 647afec8 9e10d5ea 2ca1b6e4
+    f4b48ad5 3572f1a8 6bc7f00b 202338c5 71adcc03 ac5b0c44 a08864f7 90057119
+    be196890 dd6a7b16 6cd9cdf2 3bcf43d7 0b20fdd7 2a4f9663 d1a740e7 3f3fb3b5
+    eb0472f6 4d8d38f7 310a11f1 98678d09 873f602f b6f876a4 4f0f34cf eb3dd8b5
+    a46303d0 3215b56b ca5de497 0ef4b3a7 00ae4d21 7fb9d096 d6b43f77 a87332aa
+    d76ac7a9 d140e67b cc3c988e 465d0cff d6568d37 9290c2dd b2b38161 b2bff9e2
+    17798567 82687075 70ce1be3 a93f25cc ff70749e 4458c5a3 8f5c1766 ab8a2725
+    8507c0a4 c51e0e92 255cb32d 3a9a504b ff71d484 20c23f7e f21d45d2 9cf9f63a
+    61b5d065 412df29c 76259187 1a97b020 024553cc e206898c afbfbf1e 0884b5bb
+    dc3ce8d3 7736f7b1 02568019 ecb3a82c a46d4196 88dc80b3 8f05370f 930855dd
+    b35b0bb8 f8ae
+h = 8b9f96fb 294d16f3
+
+k = 62a40563 656321e1 e3a1d132 4c0a0b68
+m = c90f3123 ea11885b eeea95bc f576d101 4c59db0f 7c8c2248 a1f1161f 635b09cd
+    b0c3a74b 9a4d0ccd b75f95dd 245ecc5f 4bae58b7 9a2c1ef4 1e699373 c59ab356
+    ac7dca63 d4d7eb1c 4b28771f d8fa7803 ad390dc1 faf9ffe0 9f1b8cff 94ac3527
+    2ceff836 a7eeb45e 5635161f b1fff99a 4a05003e e07b0d3e 62a1f9a4 58cd6df2
+    4cac8d7b 712589e9 59538a65 800574a6 f949df21 aefc4fcb 29acdd4d dd5585a0
+    5ad25ece 80750fc4 98d93f1b 4f8980bb b1b55ffb 9aa1be8b 0fb8c889 871d3127
+    b231532a b5617a6f 49fec02d 962e5d9f c4fb40d2 a0159533 788a01b9 74c77330
+    23a86029 42bde08e a5ba100e b3500793 3f145b61 bca2543b a3df8ec8 fd5dd83b
+    efdd9dbf 56aa2bfc a49eedf3 146e8c86 3dc867e0 0eadc961 8ca9f70d cf06a01a
+    e255b9f6 73061d9a 6c328e67 ef93e9e4 01f2f2c9 1e948dc4 9b57c0f3 a03043cd
+    2bc305e2 b8404216 36269846 a453898a 88088ce5 6003a7dd d0dfb458 a28680d7
+    cb1d6f06 681d266e 8b05701d 18b65514 d8c4b2e6 b546805c 8ed4ac78 b8063746
+    da4b8894 c06bb70e 024f65f7 0c273f79 45cf93a6 8d53d3d2 4d3a0d24 2cecb6d0
+    b6c223d7 ba989035 9dff2ea2 e1df0e64 56e7cfa5 0d04406b 62f2bdf5 a7532527
+    75059172 ca18fea1 363a4fb7 87841a09 40448905 d0dc638d b3d486e3 28908c16
+    5feebe6c 6b59da60 c643447b f41b16d9 da22effb f174eee1 e04b5be8 2f64fece
+    a2842789 56cf6b7d 5379dbf1 90d32a3d b4be52a7 f5589b65 10d6b572 f4ef3c72
+    4421b586 fdaa7f52 d4ccedf4 9443147f 27f214ad 9babcfa5 97e80d99 1a9c13fe
+    de68aac6 61a9c9b7 9cbf0d1d 53d8608d a286697a 6abce135 358693b2 48d117a7
+    fc93ee8f f5d39284 eccacf60 083fd75d a60a939b 86a5516d 7fe183d6 2fd1026f
+    95300fcd 59ac500b beb7577c 1b6b5779 58406004 5e4f21ff d23b1aba c866f114
+    c47478ba ffb7ed0e 1f2d1476 cbc4a11f d25dfb70 1560c587 ce366ecc 630f8085
+    bde5247d 2cfa6fda 67c56a48 daf8ef1f 8335411b e257ed77 dba4bcab 94ce993b
+    ecbd0939 3a8f7079 a8fef7a7 a1d575ea 920b49a0 121f8f65 1bb391cd 52740ea6
+    82c5a42f 391f5941 2a4a4ff2 ab833999 500e622d fad260ec a6994bb7 b4f8b267
+    06d654b1 0e1794f5 08f64f81 2af393a2 95cd280a 4ee53a30 e18f9077 f298218d
+    181d6d9d 8b1e9907 fc736746 852d3b7a e30f120f edd32e77 f36cda5a a20a6523
+    00f0d0f3 14c209d0 3dd91d22 9aa088df 391829fe ca9f739b 08296fc5 927df7bc
+    313ff884 85fe2d
+h = afc65ee3 10e9a5c0
+
+k = 2dd9fbfa f9d8aac0 84031b16 13655e0a
+m = daf1d6a5 099c0349 f4626432 b031a15c e7bd6d4e 6b1b414a 338d16f9 c8f49d2f
+    0113a456 f9707318 dd5a8adf a789d490 2ae9503f 4909714a 26c9609c 1fcbcba7
+    7ce7cb40 55cdb3c2 9628c8e2 b76de563 78939ab0 326779b2 273cefa6 ab0185ec
+    e059ecd4 3e133a0c 81375f23 dd663892 98ee47d3 d46c54a4 931bd142 43614957
+    a3323f27 2594ca84 a7c027cb 2ad33888 77b7148e e7cb3c17 73022c61 cf35871a
+    6d74dd70 9006bd1b 6e29f7a4 f10772da 11a9f49b a7623b0d a826b346 6af03416
+    656a4224 dd65dc10 459296ec 8549b012 1012a736 906f2d75 e8deab6d b47b2059
+    0c11975c 1b17ece7 590195d2 b3426466 44a247e6 47d66d73 9ed3bc0d 78221443
+    cb951d36 d3df8aed 8f6d246c acf60620 06dab721 b324bc97 d0d044b0 7589586b
+    8e34936e 0a243119 2256ff0a 3f505182 b8577ba8 a303ee84 531399e5 d03792d4
+    277f8dfd c39d49eb 46a91298 4b22cd7e f01a1f06 5bc21a04 261817ff dbae3466
+    25857219 d2af6c46 f509f978 fe52a06f d797a5a6 31c17291 a7cf18f4 564e7834
+    ce235791 ed3c60c2 1a70f53b d5078cc1 2a160e5c 2c6ae3ab d054ecf7 3afbf504
+    c137561d 55234949 885660b8 ffceae55 a1ad1394 467487cd 678a9e65 79ee3020
+    c3087f91 76ea9019 fab2b388 8e7a4702 14a50746 f6a6b755 4a5b6bcf 694dcee3
+    8dc99a22 219d4fc6 0e1f3657 b7e35b70 49594b3c 4931b4fd 00661c6f efd02541
+    27045961 6129c401 3a498d62 ece15596 e61ac3df 6afc7648 c41dc5be a3bab1d2
+    f91d8506 06898b2b 70a5e1cd 01a28289 d474f702 e4314ff0 3d0870bf cad22928
+    fed79bb1 303bd51e b118bfa5 d0631227 e212e99c f5d7f63d a9c4f5aa 33ce2374
+    5e30dafc c5a5e102 cc098479 f4a3cd2e 0632964b f96fd8fe 7671dd66 3970cdb2
+    421edcf9 9aa08eec a3b8e228 9e8f8890 894d2855 9e061644 69053fbd b8a6cc32
+    e5ec2fcf 2733cd31 8c61f8b9 697b095e 31666caf 67398b22 835d17b3 2a2c769a
+    03bd6fce f7d948c3 46ad1ef2 23ea34e3 1caf8d54 974caebb fe7193d9 560e5401
+    b7d70ef5 3eb2bea9 600b4aac 1d36ef3e 14ae108a f0fff1ac 0ef0e0f6 0bf3a0cb
+    e0650ba5 e7db0845 ed2a477d b486f1fb f9af7d37 f24d02f2 180e5936 232dd671
+    360a2066 83ab5575 8284a6a1 fa03b17d b167009d 652da228 03944a94 083d2151
+    5fb79c1a 4b8324d0 ebcf7a42 121aee60 a43938c9 fdd893ac a9893449 dda843f6
+    714a8fbe e1a63331 4ef2f73d 8e3433e8 43f0f990 a787d6d0 b04cd965 7fcf2589
+    05f7253c 07006d5d
+h = 4b2c49fc 8ae1ec08
+
+k = 3542dc61 5789a2c2 61bc7615 51260521
+m = 89e9ba37 ae00236a e378d7f1 92d39e26 5c02b79c f0ae6f0e 871bf3f2 3f59eff2
+    242f128c 9967d7e1 aa551ffd 282dd20a d70cb023 5e7b4b13 76e1b37b ff3479c3
+    8fb3063d 213cc14d 6a412e78 d61c32dd 9b63a931 494bd2ec cfc931c8 ca3ea161
+    4271a1e0 53ba2460 96769b46 22b561f9 a7dd4055 7c75cfd2 bd484961 f5581ef3
+    1e32d25d 0365f0b4 04bb8fab 3d890380 e73ee126 7768000a 5c2ddbd2 8bbaa68b
+    cf38694a b793a574 26553065 c6ac04bd 1a694e15 038354cf c29ce011 7399bc2f
+    ae100623 3921526b 9ea97871 e6fbf6cc 7065041b a52bbf7e f4405fc5 81aa1b30
+    ba9ec880 5da39f5b de344bb5 af756883 c0fa8bcc c05899da 45c7c430 9de3c051
+    8b358f2b d44e4e94 67e0a7d1 488b78d8 80688859 a753662b 18da195d f38f2ba4
+    d8efd696 245e097c 6533bf47 47516f5c 2b45d528 d06dd095 81cdf79f 00d261e7
+    7964b0ce 03f0e510 e95a2186 ea3fd591 6cf75e2a 47432f00 8d3fb48b 26c36a40
+    6f338eae 693b7321 e330296f f5eafc2d 7ea5b519 2cd41c49 72d8b06f f370270c
+    94d53c95 37cd79f9 b8965b97 04f201c8 d60b1f33 9d9dc55c ce4b3114 a47b0865
+    911a8255 207b1327 b467dbed a0d3afe7 0a6502bd 3594daf3 26336a00 93631fba
+    43240518 30920f6e 883a4cf8 64c0ccbb f8cb5b68 9b3dc8ca 450d10dc 185f02ec
+    84ba910a 86133f26 ae78ee5f aeb8f407 20bcc5f3 9de975bf f1f185cb 3676a412
+    514f2696 1a02ff36 5b7a1c71 58faad11 12ed2cac f86167fb 679df45d 90d503ab
+    80023d37 502e1383 758197ed cb0a2392 8b67e869 db585ec2 8010960f 4fdf9be4
+    77150b13 28e9c50f 64a3a0f9 ec2ce956 0f85e427 5a340a72 3e9877f3 dfbc4fb4
+    b61ff871 b17188ba d0b65f8f 552972ee 2c14ae0f 28b39c87 03655c1e 52794a17
+    947c2ce7 721815a8 774b7ac9 35f7859a fe448636 2cbfd30e 8c81bf67 e7c35d3b
+    78e5e793 a5b8f6b3 5b7dfbc3 bf553528 509ce954 99adad05 61612ab8 4cb201d7
+    a8088b7b 8f8da043 964f3284 86e15a58 2e4b3811 8c6f0e9e 092aa558 41bbad4b
+    08802614 2e040b8f 1937f997 d64763db 4c0cab43 ec8e75cd 54e7104f 85c0c708
+    51068514 2b73d7bb 42157578 c31b47d5 c17bfeeb ee5439d3 2b34105b c3a8974b
+    15a83730 5a4e2d09 84d98dea 33b5ed45 68ef54e5 d545b037 59f96e67 0951fa08
+    eadd88fe 6d18cc5b c03a26ad d95e75e7 9ea2e28d 737b66e2 b903dc56 a01eb207
+    ffd06974 883d125d 13782172 00d7b2e5 86307a1c 145b9d37 c538ac23 63abbca9
+    c3d17c60 7ff022a7 83
+h = b47354d9 37e1d17d
+
+k = 9650e707 8b3f6728 d576050e 06fbe55a
+m = cc9c657e e3cd2b8a a50ac432 d30efc34 1ef85b2e fd9c7821 9187f3f3 11b05533
+    e5cd4393 deb043e6 a90367af b87c52fd 581e06d6 9d103fd2 6b294b6f 4bbdf15b
+    b03502ef 946db61b 8ff2a8d0 b4d33588 b3035a39 197cd601 3ae22ffb f2ae63ba
+    aa58f804 3a88cb33 61469601 315ebf64 cad9b1cb 730f87d7 e28df876 6f9c2653
+    85d725ea fc522e56 3bb0e8e0 2dd6935d 7b3a1529 46d56fd4 29e5cf32 e131061a
+    28d13342 8e2128d9 450c5bb2 c55f8c21 3f67a98f fa704f2f e86b67c8 02ab438a
+    105fe384 70db71cc 5be80b2b ecb0b6e3 84726a69 dac2b9a2 3b6abc99 ec095871
+    2320f8b4 15e80367 af617c72 b9c9c73a 8ecec2da 6732ffff 78fb1821 90a5c656
+    be80ced7 bc3fdfdf 6f259d32 c481a363 6145559c b35bd061 c0d1095e a23ce95c
+    4c907cdb 23a1de62 de94b71d 5f64b553 a228c1fa ab22c94d 92a10303 d542a24e
+    11d9a24e 1caae816 aa5e1592 75597191 5121510a 7b7acd16 c52f2a44 fc0b3c91
+    9a810d81 6121117c ebb73972 816366fe 88550c0a 663173cf 11a4aabc 25e18e81
+    4f9bad58 edfc33aa 7cc0c72a 708e2014 0ef6cd94 bdc2e12b 38fec634 659b601b
+    843f7ebb 0bad6c88 efc5f5a8 084f69f4 e9f31b83 ba0af451 c5157ccf 444f4b34
+    8d6a21b9 085ceda1 19b5b6e8 535f9516 a077553f 17ddbac9 b1ab1e2f f01ea2cd
+    3e31ba45 38217a70 0afd9f37 28d5bdd5 272c8718 1badfd1e e2cb2b5d 507badff
+    1b9a077f b858b5bf f24208e8 3268def8 0e48db87 bec1c16b 350e5ab8 7bc5bf1e
+    d98e0894 f2baae4e f3f87ff1 3a2a22ef 4c81e304 09ccf441 2892c29c 63f4e7fd
+    e60694d2 90a0205a 176f6014 cd793933 6f48d384 da620d3e 76606ae2 1e69f6b5
+    a22e27d6 34f60775 8b118c7d 959797e9 da4e10e4 cfa82de5 64191c3e 5443eb5f
+    cd31f4ad c4a14ce4 21bd3fc0 d4b5c7bf 529c8390 9eae95ad 84169585 0ae3deac
+    4218f86d e4b06a1b bb895730 827a3863 4bff33cf bc0ce94b a4fe54bc 09b5efd0
+    3aeb64fa c184a1e6 deaddbb0 d592063d 5d857f54 a071a2d7 ccc2b2fd 2dd19037
+    77f6d9cc 8f840974 d4045ce6 6d658be8 8b5d6567 5b4db076 a944cd50 c3bb2a74
+    acfeebe5 cbe9917e 9c4bcc76 749b33d9 f1837244 8a821ffc cee70ce2 61c73344
+    6e7d2dc0 80f3d619 38e94468 781d7b0d 602797e7 5d798499 6d3aac7c 10fa943c
+    d312aea4 337c12aa 9b16d878 f793d100 45113ee8 8b99a81c 85366291 5fed6d6e
+    f85bbf0d 015cd636 198c557e 52bb9696 621cf3de 631923ac 48da3879 e6cb5885
+    d828db19 356e3bca 13bc
+h = bfb37030 8780da65
+
+k = 60d61863 07882cce 42542c00 e156b0e7
+m = 262a1a2d 6c680a2c 2ad20df2 0cb6cd19 7911c256 f0a38d7e 42f51f2c 9730723d
+    807049c8 78a1d9ea a291c40b b534f330 699f4564 1889cb66 5e397496 48d43434
+    7ba634cf 6bcc0174 d562c1e1 975912b0 7e5f0ec1 adf9aaca 663f9f08 e5f44709
+    796b25e2 b353b292 86ba2b7f 699a84f4 ee8b01fe 1fb1a4d1 7bf41ffb 5b8e527e
+    f4c88a81 bc9dfc08 3eddb40e c71fe086 54b5d345 418b226f 65615755 c3359a57
+    9a378dd5 de188724 abe7daad 8e5e57cd 09d77911 fe086eea b72bfd11 6e4f4274
+    9f898f5b b3732163 78f03e4d 427e543e 53f4ac89 a60bf0fa 5662d225 e0892aad
+    da5c94c9 124ba4e7 47650bff 886f7497 49074c25 6fe72f59 8502812f ea312167
+    1400e645 07fad501 f90230be bb8bb075 3f9fa9de e8ac0017 26d2d6b8 984cb758
+    200beab3 14e2b500 018298ec 3b5b7193 940b646d 9e63f25b 55cd1731 5dfdefc4
+    96f0d8c1 cfb50463 154719e3 03f5dbd2 3522f956 9d86a400 6e367314 9853e417
+    6eb3ef45 f9a2fbd3 051375fd 2043d553 df4a4af6 f15b0716 95792184 fbac8a96
+    41471272 67b0d656 d77026e1 85db34f7 2115ac2f 28a1d5ae 6daa42cb 0f9ee2c3
+    8540f0fd f38e0d51 ffce59e4 161d1c2e e136f9e9 4378ee4d 7bb14db0 deb39020
+    3a7a6f17 4df6d1ff 58a63621 f8b9553b 970114b6 61b177cb b0d1a514 04973584
+    0238cee3 c4c4725d 70d4bc9f 473dad6b dec62f65 7a25d43f 41fe0813 3a5c6706
+    c72af518 2ef069d9 3a1e7104 a1b102d3 06171949 53e988ed 9d901fd8 175720ba
+    e5b96161 31248d20 b68c0c80 0c6c5fb6 dbca8945 cde2ce62 71e23c1e 8dbb90de
+    afcd0e45 0e8035e6 24cf5211 d8f32755 0d079456 3e62f54a 17515002 283ac6a3
+    98386288 78aa6c7a f56a8699 b61aa6b3 dd8468f3 d3b2c72a dc4c76fb a8385676
+    cb44d3c6 87f69bd9 c7af0141 62ffea65 ed84ee13 205b45a1 6403358e 64c911d5
+    991ed409 3436f4db a4558035 2c97b3a8 a9376372 ab7d5966 9e47af2a 22a2a1eb
+    829141e9 9bf3632d 44baa649 08d95edf ba52bb81 32bc0ba3 c1406e1c 1841763a
+    b8a170b2 e369c52d 2babb22f 4c10e959 d0cbf12f bfb037da 73fae171 6e32f3ff
+    36629355 f5f325be 00a55530 2bed8b30 9f609fde 005112aa 4f03b24e 319da297
+    bdaeb02f 48f659dd e12c8ea6 4531128e 7f713f55 19c65f10 d443200d 64daa6a2
+    a500e45f b67582c7 edccca3c 2a1d50c9 c2ffe8ba 552531bc d851cf91 7561ed26
+    8e261c12 077b7592 710993d7 2f31bf9f e6161a91 d33393f4 aea67ed2 63940f93
+    9f5eda53 9340721c f4453c
+h = cf94a3a6 3e8a2848
+
+k = 4026e2e0 2665b990 319cc40c bacee0ad
+m = 3b3c9235 7c202054 b7e8ab0b e9b7ba56 27ab9225 70eea2a3 42f60b04 327c8d27
+    985bda91 065c6ccb 0b41de0e 57dbb28c 00e477c7 78e358d5 c3f171ac 4e8240b9
+    09d441c8 d48b47f1 ef79654e 535195e7 22c44534 880b6806 bd9ad6a5 f39ffe0d
+    7a237e0d e153e605 d7a1cb27 0ca486bd 0f563a01 04c0e517 c0253802 fdcd51c9
+    8f821b13 b1ab5585 00fc9b1a 7de1f0f2 f1e5ba2d 0f3857a6 f181c9ab 19590764
+    a6f2e69f e2d51952 d6dac364 c0b468c4 904c0dea 35b4f77c 8757200f f53620ba
+    9740d8da 5c44c4fa 86b4eed0 c55fd773 defd566c 2ded4820 7d5d18ff 96bc592d
+    2ceec199 c3495f85 3ddbaa17 168f0d25 cf74bf4b aac1d5ed 52a75123 50f4351a
+    0d3c6f40 a81e452f 8060b07b 551b1e63 7e11131d 82f9d3e2 28e18c7b 627d4cee
+    c9c43edc 7a371457 3e6b581b d7477ada 0c0767fc 92641a84 4c37cec5 b5c9915c
+    89e36a77 b35dde78 abdca980 5c713386 8dfa0873 21882b49 fb03de78 ca924c07
+    6f824f2c e264d4c4 428f61c2 d4c69261 9219524a 55140718 083921ff 289de760
+    8bb5abdb 2aba8960 34555f17 86374891 ccfa32f7 fcc05823 6a9860a6 b58614e5
+    de8220d9 a9e9e5f4 ed70b560 4a10e572 99121679 4c3a2aca eab8d96b dedcbbf1
+    58032e21 b9977877 6d4f9374 8923cd66 2f0fd6b0 fab4f1e3 daa1d325 b5cf5526
+    9efcf5e2 440b5583 1ac66320 e1bd8c7e 01d6eb31 cb6b618b 13aa9184 c45d69f2
+    03cb9b5d 7171582c f8631f63 40040cbf 28f70415 d70e84ac 465350ea 7afc6098
+    df044572 d77191f0 3f4da653 26f2a10c 8de73352 59d69238 ba70f726 6d4752a0
+    cbb65ca0 ebdd52bb 999d3063 053edc17 6eee973e 1ac82f22 5c546953 1886e04b
+    b147c3eb aa1a1e75 2403564c d993c92d 77b83081 5a92c557 6e9ca0c7 5f1d9890
+    abf2303f a5776714 7360a962 579c99af f715cedc 86020364 803688f3 4ed1a512
+    ea0d377c e02c9fb2 98125394 22b5f59b ed73074a 3cbf52cf 90ec9fc0 726bb4ab
+    4de77127 a14d4f3f 09ffc65e 61379aa0 13b2214b efa4ac26 51c07fc9 a04e6721
+    abd760d1 b5af4582 02ca52d5 f475c550 707cf77e ce47d319 4ce79a08 81368812
+    d7ede947 eb98bf63 168007e3 e5e526ce 2cf46146 e20e126b 59780e97 78bd9233
+    56a35918 de2f1d9f 41940e86 d8b56b30 a8193110 e21bc52b b9f30ebf ac536d45
+    abb5607d 23ab1911 1dd92a00 f48f2000 c7fc163c e1b38545 4bda21fe 94838d7c
+    3dcdf7bd 9c5ad659 50389ff6 4244bf69 f9f9c9be 2fa7dbfc c95767fb c47bf00f
+    143d4c26 99e0fbad 88c774a1
+h = 09081326 a445679a
+
+k = 3074affc cccb2476 bc947f7f 693830a5
+m = b800b8b9 3d74fa10 1f8c5464 51022a5a 4708ab00 f8872604 1fda423b dd16ee6b
+    fa45d6fd 5464fd6b 7c2cae05 f04e1c26 0ad0ae6b 3325a794 bc412e92 d0f03cdd
+    32adb69b 63eb3271 eb8a068c 00d023c4 5a665210 e2570e14 ff0e5ea0 c33e6d0a
+    f5920f8c b54bfd8c d1ad8d85 79c36a1a b8873798 1bbd218f 88d8bef0 7e68f4cf
+    f788163e 363fb977 3f10e367 0eb880e8 a3e00be0 ba51df7b 36108408 20969ae1
+    70fe0716 41244b0f 2538cb3a fcbed770 73c963e7 7f8c1856 0ef458fe b9eef649
+    6006a306 086dfa42 0c6478d9 6ada4914 000cfbeb 31317e9c 446c2492 2210a653
+    5c178557 ae1719d4 3b6b606a 36bb0398 79305d8a 3c3362c9 64bcb92c 07da4ca0
+    828cba91 1a4e02c6 06a6de29 42ab4e05 1a601025 f6ba5390 a55f94be d38e59c1
+    6c1a19d9 7d146e36 98e02110 7ca79a9f c77102b8 2ab7c3e1 25ef6063 a397df6d
+    810de2de dca02099 fbdb3a5d 485b281c 3628f7bb c4dd169c 1c4320d5 6caf52a2
+    dd86cce2 03245bf6 4615997a d1fb1908 34d02cb1 dcbf5cbd 77d7ac73 af7d3188
+    d74a0c2b 83639b64 8850cd37 90309a8f bbbf215f 3302b11f 0d56d188 8f684026
+    c4542ca8 3782bb0e 0067d1e1 7139710d b8961883 69a1fa79 76596224 a6058d68
+    3f8805a5 628c980d 72f9d58e c2222297 1a75b6c1 e2c72015 19b23e73 568aa300
+    9bdb1391 7005c64e c9acd351 3ad9b97a 9eec4b8f 86e923a6 a92ff160 0846f934
+    e22ac1bb f065f3c8 9233ffae d80617cd 2a39e432 146eeadf 17d0ec63 ae55b938
+    9ff8f343 301f9a4e cf343568 00452e5f 3b272bb6 a98ea4ec 54888f14 3d98a6f3
+    c9160d89 2a630fa2 33354714 4869d894 b3128b41 14e3ab17 3ada1b21 f92a1593
+    699852a0 87e16331 fe167fdc ec8e9fda b8ada04d 92683232 d8cc0a0d 9ed38163
+    b3c7b7c1 57e83687 8bb442a1 a6a51b5c fa36fc6e 6734ac31 680eea4d c6603bb3
+    4a4b4a68 310d0d29 d7d9aa97 1764b431 7fad6c95 7b9e96ea 327f4b14 cd4a7aff
+    d275a99d a9dbb549 218b3d4e 46964b16 fbe37ac6 60cdcca8 28a218ac e8b7a214
+    32e0e160 df1c4e46 74f26711 0cca00ec 434c95b3 9bd2c9c2 de5a7f43 a3f833af
+    d5731c96 850d2fba 0b3c088c 813431ee 5c71e478 aa43b637 58c36d4e ce75df30
+    aea4ff6e f42082e5 ae69c770 46cba543 4a0338a5 903d7de7 a987646d 6e4f8a28
+    fb5347b0 a19499c0 3f3f885a ba010b80 3798c172 4c566d06 11257da1 c365cb72
+    95e6b71a 7769f943 c1634d21 884c6784 587b9810 851d4b7d a4604c95 7610fc80
+    5c2c1efd 88a1025b eac36d93 cc
+h = 5675f210 d020f4a2
+
+k = d7f41f50 57170224 db5606b0 aeb21265
+m = 26e37fae d2ba127f 94bf57fb 2fb5f948 c74f0fa1 04f43fb4 3c87543d 0298fecb
+    d28fdcb4 d643f3d2 f3d17215 c804611b 9a05f1a0 9d65fc02 95e0d870 f92838c2
+    a801adde 46552ab2 32e352db fc03da1b 8718f9d2 8c977b10 6d06f433 c3117073
+    7af5f211 cc2e141d 060f479b 16a8ad56 bce0d57c c283c5c9 065a7e49 6e50ec2f
+    e3eabc9c 985e2115 f4de8409 4a9d82d0 be3a6adc 88c5c0d0 f1cf6a2a 69aa6c58
+    fce22e0c 3134f364 8d2cb2d3 17386d3b ad1068e1 25cfa3f3 6c536eb3 2661c869
+    b2750656 d2caa166 91aa45a6 1c2548b5 a04a91ff 3ecc5cf5 83314e83 c7c93241
+    4f192b59 599b1231 2121acba b96a6336 e43aaaf4 5bd23057 ae7ad42e b16dc063
+    69b203c5 6d1a1190 791211ca 636e1b36 05a0aef5 241a8a15 70b51cf2 aea995d6
+    75a87098 d52d50df 53c48471 4dcbb302 a287d1a8 8231714b 8de4d490 c9bc748e
+    21253f0f 4bc6e84a a1bc3747 e4d423f3 a94cc0b0 67aeb5b2 352e8a29 e8ff36d4
+    6097a6be 837bea05 0fd012ba 890b4c35 365a4b73 88e841ad b2f0bafc 23e87265
+    bd440781 4be9fe96 fe9d8cba ed8df08c f58faa01 02b06fda da7f782b 2949c313
+    f061b822 15955eca 70780016 0eb3f651 406f405d 42eaa7e4 6027c956 6b9df651
+    24d172f8 57272ecd b2a5507a fe124a7d cd4aadce f567a287 10352e84 bbefad0d
+    9e8eee18 8e71d3c2 8639b93b 6379a201 49785790 11da2acd 6e97c3fd 7ac1070c
+    f2073684 181ef181 6a531d1d 9c095b85 9eeccaf8 0a46adf7 6382d5c5 0341a07e
+    39e87bbf 1fea75e9 75f1d9d6 fcdf8dd9 672f8e0f a51b2f0b daf792a6 c706ef37
+    58d6ec88 85ba4023 a2e15c3b f0da3a42 06813d92 5c9bc1c8 7920c44b a1bd968b
+    d5114d7a 776ffeb9 62898fe6 f66168c3 ab2e1db3 61827cfa b0c60de3 0c067d48
+    2b4f9d59 987bd86f 6518dd3c 4cf525dc 0d5b89a9 971d829a 371f780e 716e4e14
+    411941f6 f2f82924 0812e0a3 27c71e07 a2df1ef9 acf867ca 6108a507 89ca0d9c
+    7459fe22 4377e3bc 9e2f17ad 84f827eb a93bd786 e856ebf2 965f363c 99c3991a
+    6d4dd339 b28d9e63 95bb2a68 2af0ac5e 704844e3 4a2dd692 072ea3f4 32e51957
+    60bd5b80 3f6f8c2b 5352f337 3e66fa31 32ebd86d 4e108630 0091302d ddb5dda9
+    977f3632 7be46aa1 b0e0785a 6daa5cdf 19128d00 d4fadf0d 87e8f56c 6f217b2b
+    40311061 9a517d19 47347475 3dc51571 030e1d58 721b99d2 87b1cbc2 418ad775
+    e7ca7351 2c789297 a25543b5 ce6245fd 3fcc26ea 3e976479 2c4c587c 4fd7e322
+    a540b5ff 243a8c7f 91cc0e4d 0d84
+h = dae24e1d 08ec1217
+
+k = 969afcb4 a5553f7f bf970255 1f224097
+m = d7e3573d 36aa56c3 2fe9681e a8c4630c f800b7be 2f14b5e9 4205578b d6de59e7
+    fac05cdf be880b9b 7c8874be 7d70f7ab 62d4583f 0e62569d a3d747a3 222ca6e4
+    239c3d1e a8f84e92 5d1ccff3 4abca89f fd7f84ac a13af6b2 c89a53bb f03fd17c
+    84a31bc3 84fa840d b65b92b2 0599e458 a4fbca50 9ccd868b 517c861b 831d0772
+    cd5d7717 446a41eb 29f838de 7f5f8e12 edb0bb2f 5720799d 0d712e65 9ff7f3f4
+    9f8fca41 281dec17 b7830780 eab3cf01 8d7b79b0 14183856 9bfb6787 28c90feb
+    6387432e 0b18c2ea f1b54b44 49414a64 6fe8a2d2 b9549e18 b2cbbd60 d2ad78ff
+    7d4180a6 c7e64d5e 68c2b1cc a433e140 287782bb 78405c8d e0214d11 dcbf321d
+    c0915222 b5710db6 ba1f8eda 269466f7 5a223fa9 99dae32e 176a6c57 8870a2bc
+    093bc90e 5e0d253d bddf9d81 af1eff37 92130049 89d3249b 72ef5443 bf967e1c
+    8cdaac24 08b69d68 2c8ec994 d38d3256 3ae381b1 9187a3e3 20cacc4c 29865b17
+    10bb7e4a e464869e 3d4bee2c c54fb2be 2409986a d2fb50ae 7736ab74 2c8a2b2a
+    d5ccf2e1 4eb7299a cd0a46c1 baccfc40 2e29bde1 14f3daa6 537a2d8f 444ef421
+    aa908e13 f5221a15 79bcc4f9 49417361 261af17a 339fc040 3c2da8e5 07d29cac
+    84dce960 5beeddbd f25fbb81 0e89958a aea6babc 184ed5c8 136705dc 2002739f
+    d78ea20f a0c07469 99dfda39 046c0d39 3a311426 12c9eac1 97a92ae8 9e8b9ad2
+    f797c1d8 239ded57 6d0e0521 0001abec b4a0e178 ffd0ad83 f3e77a47 df2507e0
+    b9f53e86 41aadbc1 83a99002 b7989c2c b7bfc9cd 6b5d5fdb bf19824f a8443f9c
+    3aba5b72 54c00b27 7e47ff92 f30c28f7 4f8e2738 7638dc18 59ea761c 2e6835e8
+    8be0cb75 ab5470f1 7e89876a 5749c958 1b64d56f 363b94bc 92923726 068ff291
+    75fd68f1 680b545a c3cb9e2f 66927016 fdb9331e 40a7247e 84c58ddb 375da4ef
+    6b3e6a34 52552242 5b751eb7 ef857e3f f73c9094 08278bc5 fbf50bb6 659762b6
+    058be335 ede2d4e9 c583b865 22a8a729 ede6f457 22c3b6cb fc24c3d4 6402a9d6
+    9e14d566 5b03adc8 86ec22fe a653bf69 a1a66558 a58d8646 468ff607 b7d8f0f1
+    ee49cfe2 e0d5d48c 579bbf1e bcc06f64 64d0af16 98e3037d c296ee96 81f7ef30
+    9ff09b16 f352b725 3cee40cc df6e79f3 3118bf9c 502aeec2 30d8fe61 a6039d4f
+    421c44a4 d476ae0f 06e10b57 ca5f3593 a8eedeac 642df22c ab7d3928 2eede332
+    4f1bc41a 790aa53c caa95e72 58a1e95b 037a4fa1 3c4f6334 b8ff9f1a 313dab6a
+    e2ffcaca fde4e799 f5a4322c f4b69a
+h = e2bf9ad9 f2a74aab
+
+k = c53fcc79 925d6fb0 1f9f2e98 debbce55
+m = e22d1e8d 0b99866d 923b3f6e cf2d1391 5423d448 93c6a9ac 4c94c029 133624c1
+    a3467742 ff7ff8d2 2d15fe6b ad73b8cc 765940e9 2ed6753a 2348c3ba 2779cb99
+    1563d77b f17c7afc 44decdb2 922034f8 5a547295 8fa062e7 b890b703 1e16df3f
+    453de9d0 4ecf118f 2ffc8834 06dd431a 08311e50 1507a3d8 281b6fcc 4f37967b
+    b213cede 574ca5db ee196c09 8f1d8449 f5d67ec5 c0bad7fa 18f11ad4 1debc1a4
+    b07fe13d b3703e18 0d181760 983487fc 5f1e490e 203c037b 125b6af4 243103cc
+    c2f9c9dd fc5ac5b4 6cb0ef18 fd72a6a9 9db820f1 51ae95e1 4329cce1 b5ceafd7
+    4e41469e bf8cefed 79c15baa 7726bf01 228692ba 4261e5c2 6c23b33b 94e6ef26
+    4272c822 1dbe3364 e14cdd77 b4b1ee4f 1d387c72 13480bd4 f33aa6fa 1b4c3ef0
+    1af04660 2c5a1436 81dbf21f 26977a87 622c0f56 e28871b8 24b09fac d4b87339
+    3c97e099 45bea5b2 ab23d590 b19ed1f8 e7c17d34 f3fe6161 40ab7996 6642969f
+    89f58997 66a5cba0 d2d6c44e f24cb006 757c2aa2 9183cb5a 7a5d19b4 0c61a328
+    085503e0 b4721024 4e4dbb5a 14135e9c 6905de25 84bfb44c 9b752333 e48cb0cb
+    a90f73a5 b2bfd646 d566a3e1 48abfaf8 3a2f9c69 49b71a93 ce12d32a 7d069ee4
+    664eb242 02f7f7de 38eda6e5 7e906b47 7faa47fc 7a8ace65 ed85aa46 afa5dbb0
+    525a10f4 6d4de147 2bd68e5e 765ecc04 a94f9a42 e5fbb9e1 a9e6acde aa57c552
+    5e767b30 43ef184b a964f745 bc4e5409 5b0a9667 14981910 b2971c86 3c9822fc
+    0bdfa7be cdde54ef 43e91786 972ed871 5323d9e9 166e28f7 c4dc2e25 2d42452a
+    0fcb615c 202d9bdd f71ef7ce 174df9e8 adbead54 1e3e9f2d f02aa0fc b72a5282
+    586bb957 dd34e92f 55b483cc c468d32c 6296b148 42dc8992 7d0350cb c2e9f303
+    65368a67 4b804658 75b6e590 d59553d2 fa401a4b e8d8b0d9 19b2ad1f d362028e
+    75972a53 282d8a34 7b0f9a4e 71a46a28 bcb14876 068a6e96 f827060b 1853026c
+    1dcf7d4e fb441958 4bd6b444 12d9dc82 11de4fed 7eb4349d 10470057 277175d1
+    a49e6ce6 98699451 dc53c52b 8f7b1571 89a0410f 3329ba8f 7e052fc2 f6c8c406
+    a9ff4928 4a4f2199 26110112 932d9a3f 3942eaaa e02a112e 2afde502 2c6689fa
+    7ce466e8 60910938 f456a358 178b50cd 5a3bca3a 68380435 225950d4 8b8029d9
+    5718cba7 451c82cd 78782037 560d2c32 bd4e631b 8ca4484d 71b63e8a 895e2663
+    32a454fd d1ea4103 288ce2f8 ecb3b655 b21b17fd 991d17ac b62f93a8 37b48c15
+    c4e790a6 4c8dd40a dec02e06 43a3bf92
+h = 35da9984 ab3cfb92
+
+k = 407e7d72 3973870b d1262ac3 cb4cdf96
+m = 76967168 4f56785a 7ccc1845 53e88814 b0b9fa6e 04df0733 83da8bac 50c8dc03
+    d35b6ffb aa398f38 f4be75ac eab2efd8 30b90fee 2ba0a494 1f0a81c3 ee8f5b03
+    dc7972dc 965d8e9a 47c6753e 8f5ae2d9 6870bbc3 3096fedf d282360a 8ebdcd86
+    13e82989 ec8128a5 8012fcb8 6102dd40 4021b373 0369f015 9d0b3578 abe32a53
+    81b90b2a 00aced8c 2d1f7aa0 033bd0c7 7d62e003 3a7ed21e 28e47070 5f358362
+    ff3f97d2 39770a29 3592141d b493075d dc81e777 9b576668 73d3b92b 7a72e61f
+    f28ce4b6 dcf8159d 28fda582 3e492c3e 9475a25e 6fb799fb 2ce5ea4f 5bfba25c
+    c6b10307 fc508d9b 24900eb7 32054cd5 e7ad978e 0b7b61b7 4ea49540 21cfdebd
+    e3d054ba 7f91b8e8 6e99c027 b504753d cce5b9b8 c711b3e7 aa9377c8 738e27f0
+    6a5c2626 6261c905 c3f77f66 252a5102 37841cce ea1e48dc b8e15324 c83613ab
+    ded49bac 26cb7732 da6baf90 e4f33d33 85455b5a 30baac11 1980658e 4a89560c
+    3ec999f9 f793c919 c9bbfe90 3ce501d1 728d8a51 c6c85f5b 012d3144 827c696d
+    43e86561 031a705b 629beb3d 4201e93d fef09c83 c50c4874 199736cd eae6a492
+    dc86597f 858d30d2 a4a3e786 c3681bd7 c9ca043a fc4910c7 f8ba2ec0 d0ca4c3b
+    80040bbd 27ae8271 3b3dde9c 6e57914d 49292318 74b0db67 a6102c45 e485cba5
+    1b21afdd be23cb30 cac8393b 877cc9c0 f77c3cc3 a897e415 b30f5603 9f4d2a1f
+    40b8c8a4 c0c711e8 df4b3cf0 e7244642 99e6fb33 e45e283b 608a6602 538351fb
+    c5c5437d 10165ed3 578a018d 53c4bd93 049fc056 43a6aa95 dc8b86fa 8b9ed671
+    62919362 8b66244c 10053aa6 ce3d4fa5 7e422cf7 0c272e79 017f387f 3a0cc3fb
+    672830d2 bbfea4cf e6a58254 ba197392 78370d92 d51b603e 58f8a84e dee6f328
+    f671ac8c 4da11372 932bb5c5 973d8ac6 d1ffb116 97db5fce e3096bc1 e8a8c002
+    a86a0f7e 4293ad06 3602e2c4 8c33791d 9593970b ad5b04a1 a4d815ac 6b090391
+    8dfa642c 8eff38c8 511be88f f8f78e22 db5946b4 21c1aeae c002d23c 2b305d3e
+    dee96e8a dbe2df54 f3497e96 48d1cee3 dc75fe23 c9ae921c 545a9594 354bbd38
+    7181f9c9 1817743c a7a66d19 6e16bc45 48a28df4 973039a5 700b8d9d bbb9f867
+    7f0c870f 7853dc85 926b9a77 3ae9bf8d e2871ed9 697032ee b863a467 88544c1e
+    6bcd93e8 28463907 3bfcf196 9b5fec8c c1e995ba e447f933 837c657f c5780c8b
+    dca86f29 6712a0b4 60ef6de2 54af9cd5 5b7080bf 7a160159 ae127f9d 4b9fc291
+    1c8ba084 412f4efd 2a61832e eeb4bc87 44
+h = 0e176409 de5342ab
+
+k = d193730b 624d2b9f 504cac43 e98f6dc2
+m = 085fc97f 3dfde597 7379c190 245e3a2a a9484533 1ee87bf0 f09817d9 3124cfd8
+    8e8470ad 24f7c12e 551f46cc a5eb0b18 34d713ee 4e5affbe 6a26cadc f16e099a
+    2e7042b2 965d3164 4d1cb948 e1484579 964d3cd6 9a78babe c9987322 e2764a53
+    0bd93783 6932ddfc 6ed6b7a1 825184aa af1e9d74 3ae84673 7f5ec3d2 aa923bd0
+    61f4b10a 7fb6af87 8a4856eb c9360e41 1c114b99 7c272f97 a43cdca1 4c1e7940
+    9afd1af6 36cfe107 6f44da4f 8b24fa61 12a823ab 06bc5ee8 f381f46e e02572d8
+    78a39762 9e938624 8a298605 81260036 0e6d8d9e 34c245fe 22214b4b b467d721
+    bfacc34a 8d85fbec ab2f72c1 ae80bb95 5a4dcc19 8e2fec6d bc253281 24ac5143
+    2e271e4d 929a9c52 712b389f d6d1d441 c64c8c90 3f518e3d 2fec8e27 017d7129
+    c9a0e0e1 6ffd4e69 08490d37 b7eb058d 914a384c 968d4562 e9b18afd ca824e6b
+    eaa66744 9e98e182 2d55549b 97291a1b f3d81a4c 26cf0f50 9159f175 0c26bc9e
+    fc2a08fe cf4b1dab b293aa57 8927616f 0eaddce6 4a785489 f7352c3a 8cab59a6
+    9ab837b7 40c8146d 271892e3 4c164aaf b8de47ac 122f8848 3298c920 2c91655f
+    b73dce57 53e30866 b18f249a f8c6259b 89af6547 8e9ff47b 3aedd8a3 eab8d55a
+    c1919f80 9f8e6180 9c67c217 9170b3a2 8c9dd165 54e8ad75 387dc3ee 6887a50b
+    9b529de3 8103fec7 50e38440 dcf0e526 be41558b 93e19c98 20c4b3d8 58ed5e3e
+    fbba82d7 2d1aaec4 33049ff6 f658651a c45b8ee6 c92e22f8 e03b6988 a6d9e093
+    dbe59f5a 9277592e 8a0024a7 688abf50 bbeed46c da214d7b 968aefd2 6444493a
+    6d15f8b5 77f086e4 801b19a9 1c2c9b7a c601f529 1467a6e4 ebbf5937 dfd19cea
+    2acd3d27 bff8b5af aaf339f0 d9863d77 4aea71d0 dacf8389 8b0c0dfa 30e5bdd2
+    995399ac 1c9f4192 971cb41c 014f0563 17e0987e 6bd92a1b 524eb6a4 54733534
+    c4e4a752 347b1c02 128f2e3f 76adccc8 6372650a a790eee4 7018c918 b20da203
+    e7f40271 bcfb4852 05222f30 5f47a29b 311bef79 5754ca38 7f47c128 ecb5ba9f
+    c1a8b8f4 e576cd14 d29bef70 f01c8f02 ff67b61e 79df1067 98b509bf 4004d443
+    5df98f84 513978eb 50a6b03b 73ade2f6 090d8aaf b937d220 36730246 d8fadd82
+    33785e5e d3e70259 c3cd2e1e 521a88ea ce8422d9 4da43c88 0bffceba ce325fcb
+    c06fec5b 947eb513 69621edd b1ef3079 e6689081 1d558ad6 c846f548 3d0d5e90
+    0714f0c2 5de90a8c c2826eec b2cb4674 7a1a55e5 84e54d38 b543f245 6dfb142c
+    e27667cd d1d9bc7f ca615ffd f90f2f28 4cde
+h = 2b6c8bd5 f213410f
+
+k = 8d687abb f2c5b89a c7944afb acdfc8a7
+m = 4025fede 1e4cfdee 53cada5f f92bdea8 6d924d81 55ec525e fc0a6cae 86a09af7
+    0c9348a3 56a7828a 91c4365d ff551350 1ab7c42f 5a50c488 3af9a2eb 2414391c
+    e7df43a6 6a44252c 5c8a1122 2142ac7c 02c29da6 b1e4d33a 1a317cf6 1f428f2c
+    f1be4802 dcae6462 db6caaa2 ebff6f01 3200d364 27835eaa 030e616b cc5e4ab6
+    208f4c96 5cbadf69 399a5059 5478cba1 63e6e471 2d546315 f4c9f6d7 2f262241
+    b8630cc0 5cab98ab 66c5bd0c 649cae81 a225aed2 fd389036 85129459 b15dd1dd
+    cbedd384 d33fc586 9cb46ae4 f4c77639 743aa082 ce1ca924 db7ac53f f89991a5
+    978343f9 685bf9a3 ab881900 18164df8 c361d371 6ebc7121 99643f39 6804bf00
+    d5c10871 07433a45 0b0f3637 d7c3660d 99c0827e 9a916d77 4cde3bbf b8fab32e
+    e421896d c36c5cd6 514cf37f 13d53863 fa583e6e 89cb30f8 92a0729b 0cb374ff
+    b3d6d239 80d39ea8 fedc88e1 b4c2dee5 ba49280a f2017d48 848086ca 4b7cc9aa
+    9b49eb1b ff69ecd8 4fbc5786 2af58af7 20235719 9378c4ba 3e88ddea 8e972f73
+    ece77705 02a97d67 8d2a9ae2 762fab6c ebc76e43 6f6ddc33 a987ad59 5f955e5a
+    cab0ac9d 66bce383 815f1d89 86efc96a 290bb1f2 a42485b0 c6aa148a 67ec92c0
+    87df2ed7 f0890072 5f68682b 998b0bf8 a5deef9a 634d9e3b 46d70a6e 55dd136d
+    42343abb e74f3e01 f0767b5e 7d589146 ddfeb15a 167dbc30 25d73db6 d00f0bb3
+    2fca9d33 4a3350d4 5b1ac113 77019c3f c5a2dba6 891ed9cf eee1da18 5f87ba8a
+    a7ec55da 7110ab86 6d9cb938 2d69b3cf 4ea60960 ed85ffbb 49a64db5 803bfc70
+    d917ec6a ab92ad05 aad603ed fc1319ec ae137705 fbbdcdcb 1e82217d 3c0f83e8
+    2729fb4a fff03a91 8ffe9db5 7ba404ce f14dd1e5 16617909 0fe2308f fcbf94e8
+    33c537d6 15e85235 cb0e7788 4f8b4f18 0136616e f6f11443 646e06a6 914130df
+    d3853de8 86db4990 61ce854e 6fcfeb57 6b80c993 dedc3949 9931d477 e0b70cc9
+    b457af12 652e46e2 de558331 6b2380a1 977b3d78 dcfd8c14 72a37ffb 901c1b6c
+    d5d6d863 3392efcb 4ac5808e 230f3301 e882c2d7 3e94b2b1 686808e7 56e04341
+    8a556c26 e43330ac d5ab8148 6ebfb68d 99c23ee6 c66540a7 61ed73ec c0855a58
+    c24f4e6b 8c534d0a 1bbc41f8 15a20d2e abb155fc 02ff50ed 503f346d 9adca026
+    bd61a52d 3beec345 84a59cb8 fe702727 a195c94a 23914f6a a5e5a1e9 7a06bfce
+    6c0d0000 78353ca8 1ae6f1f3 4a5286f1 894f16b4 036cf6cd 5deff311 1e697d6e
+    ab225339 df06e453 d03c3162 fb7f1785 722550
+h = 7729af54 789d2498
+
+k = 31d262eb 1d4db0c0 bf862026 27a768ca
+m = 1470d471 8ef4d7fd b2e0973d 641bbfbe 4b094f48 92b58f6d f9740e49 41fedeb5
+    486423e7 afefb02c 316206ef 2505df11 3d912cc6 5608510c 0c91cfa8 5be85f2f
+    5f2e6074 9e10c876 775f1a94 6ff58ef9 1f53626f 620fd8a3 886a7d3c dba0820a
+    65d220dd 91bb8eb1 8530379e d5d8b326 d1ae3192 0825de8b 06d16032 4cdda24f
+    8e9b1531 716052a4 cddbb152 a73d5fff 5e6bb2fe 5b6d9da7 08166e0a 8e4cd5ab
+    4ea8c563 89d597db 0ba55075 9f4000f3 e175f6e1 d1a1d7cf 54549968 a82bf691
+    294e2216 8d3570c8 a839d038 a57ac691 dbe1f2ea 1f729591 83742570 0b141dbb
+    d2558729 45d800a8 d44c13a7 07c12282 70f84447 40d6b30b beea1c07 34d17ee3
+    d87f4cd1 1825cafd 0500a51f 638e92f2 7514b39b f2d0527c ec9e1d6b e4c71b23
+    1e97a893 ea23c3f2 e3c7a823 c4ab5e7f ddd953e4 5db716cc 25e802b9 4aa35e66
+    2dc8759d 97c0cfec 6e03880e 8cae0ca5 26396b03 33f9f9cb 9437a9eb 52926123
+    6d5f4ed1 b61eb6b9 bbf82756 1e29fec1 c9a3e884 c4dfc833 e86f2c76 85befe4f
+    8aa2eb0f 4f795e37 a206b869 3bcae773 9af6443d d86c0343 c197c7db 5fbc33b0
+    881455a1 44d93598 36e8c9a6 5822c6fb 1bcc73b0 9c1286d1 799f1580 b9091181
+    e66d3bee de05dfac 2e83ce61 9a56b3d6 f8c89570 5382816c 00dc0d3b 5419b816
+    2faecb5c 1bd290c9 a7224fcf 7de0190a 7d3bdf0f 41a98d5d 1ed27c0a 2c6e26af
+    89f25fe8 5572bea0 7903503e a646676f 1338d1d0 8e3a903a c53f2dd9 ae581fb8
+    f8ef96d1 2447fe2a 8ce4a644 e9ddd624 f09c726f 215525d7 cf2bb06a 3c7cd65b
+    e7561338 743110cb 4e9d7555 6d89c605 19701502 172fa82c 5fd1e9f5 dcc4e0e8
+    f8318aee 2f5e5b9c 2f2a997d a9836405 19068739 bbb2e273 339438c1 01d01a9c
+    8aefde9e 5b2ddce7 8badd518 ffc4f470 e08e6d4f 74552fc6 679a2e17 bccd257f
+    752714e2 a4744511 547cbeab 624d493f f893bd20 ed955dea 85de7f43 8b1c3ed1
+    61e561d7 279a60e8 db93d7f2 531d0444 d0700d02 0a5cabe9 9192fc3d 848cd5d8
+    ae848ad6 f98f21b2 a7912e49 a49840a4 7be5d1b2 15f71e72 c619666d e2da7e42
+    0600191e 8f4855f0 79c1b80f 53ef2b61 f5a14c43 083bb154 fb471d7f ff553042
+    c7f36b1c a5809928 b13fd91c c0fdfc14 efb30d2f 91ed7c58 e2f0a81a fa9dfde1
+    7d51e2b9 f2a37b82 9202b4c0 e3b66a55 18f827bb 150afb11 309a22a2 bcdbd939
+    e33e0030 2faf247f 0d58b1ef bd0475db 0416d0cf 7dea0e8f 561376dc 16b03355
+    00062ab7 794ff85e 1d630a9a 9b7366af 7fa1fd04
+h = d6e8b92c 9ebf6fc3
+
+k = 7ff3c1ee 918227e3 21ac7d4b 5c58c57d
+m = d7b3be16 fc9838f6 5f328b7b 23c7f6e8 326b30b5 566a4bff 0e9e773a 03db6144
+    11313c40 5c76c489 7bdafa74 1c80e349 f43f8449 06c44b06 cb106685 147f1364
+    176e1f6f 132ee95b 63fdff3a a912e517 c947f069 5e0b0808 0b10f601 1c55057b
+    da06587b 6aa2e5ba a8743690 14d60488 9d35e4db 726362c5 d173af7b f4129511
+    8dcdcee2 e51c9ae7 541e7925 c29a6191 93d720e9 ed45a193 658219ad b3eff792
+    e28aa404 0018b3e8 66903e01 c121af6b 14e161d5 5de65f81 8bfe1f52 def50848
+    f5de7fc1 7bddb133 ad8e7ae6 df08bd03 ab3baab5 313ede80 a2f2736c 99cb4f57
+    f104404c bead7067 2cfab3b0 90ee592f 0a14d041 f8066e51 633d4539 6e602f5e
+    b182c3a8 ea4afe59 663d6cab cb08aa9c 817d3e96 3bf3624d b1271d0d c88c7507
+    0ba99c96 e04bc8d7 aaf00285 be65db92 41122cf0 d03898eb 0d5e2b01 9cb8b9b4
+    c8eb7819 8da4f552 fa4b001b a4e28e62 6014384c 96c34545 9d3093f9 46473e54
+    27586d22 90a9fde2 76c804ca d00363f0 9b682ff4 d2865ccb cc0d586a 748543f3
+    4f8853c6 39764488 3f63f5fc a30aecf8 88e71a1c fc4909b1 21dfb345 849c6cf1
+    a3851946 649969ec ce7937bd c31475ba f763458a f33b91e1 78b3f992 b474917c
+    ae764e72 656bb275 88640c3d ad56fd0d a084b8f9 feb0b807 211b7c58 42d6e187
+    a55c4aac 0a2931a1 96a6c1f7 1176a034 3c32af32 fa23a756 41f61dbf 12050966
+    30143143 8e5237ac 2013e12b b7374d46 328776fd 14017dfa 32c0558e 7e2fe54e
+    043bebf8 e38fb564 87e52117 b1956867 aff17fba 858b0675 d3f9b90c 54f74b07
+    f95ed2c6 38b10893 c2c26e5b 441cef3c 1b6c59f6 1e86077a 41b35fc4 8624f936
+    6a609e2e d8040255 f799b490 d7f4022c 0c80cfcc ebd3fd70 001255f9 6023a271
+    7cf311d5 d2542482 6c791ccf 110ecd70 3891f965 94d1bc26 99508bf5 234b9830
+    f03d4687 9809ee18 753e7b94 18ac1951 8f360c11 123b15de 5afbdcf8 f9e85e73
+    982d3d1e dc516d74 4053121e 14eb2e5d da010cc2 98e1f851 710f0a26 43f88053
+    20284d0d dfe07b74 470b1bf3 96136b9a 8d23146f 6b83b6a6 1b9e5c7c 2ec26244
+    17c60d9b 633a61cc 3d0cb121 114ebb2e f59b0500 f329c892 0755ad85 fd001135
+    01e6e093 fd5295da 2aa48aef 66e69ef5 f4ead2ea 706a573f 76636d36 e7e97967
+    e41d86e2 ee54c282 8374914b d1381a95 550fa78e 040f833b 5f8c76d1 99ed0c58
+    8be02045 126c8594 b830be11 417c6b6c 30a696f9 195ba09e 3beb0209 7250486b
+    14a84e3d aad740c0 bc901d9b b621ced0 cec927f9 d8
+h = e4f68975 deff926b
+
+k = 1ba58943 2f1fd37c b0982a03 ba1b3195
+m = 5b27e301 aded6599 27027063 55dfad40 0654f99f fa11025a 22a62499 fbfa5e98
+    2c365e21 30ca9923 5f556fa9 048eb158 0795e346 c000280c cd8ac25e 0d4d5190
+    13fb6413 2db5757b 33f609a1 43f98649 9749e4c9 013608a7 8e8ec0df 89bef927
+    e9cebab3 f4b40cca 76b1784b bda7041b 51d94595 fab26ba4 fb9c4b37 0bdc5450
+    ced121f5 3130cbc7 e6440ba0 e7b5520f 56efe63b bbbb0089 8142a328 f0dee6fb
+    866bd1f3 3e9c8568 c8277a03 1647b7b5 e64b5c30 b65058e7 a1f324a0 e19eef23
+    b19da72e ea647a18 c46d02cf 85e589cf 57999aed e0e65647 465e8b23 f6a74c9d
+    cf828251 f121d95d 9f864478 356b8ce4 de9dd503 34b598b5 d1dd35c5 acf75b84
+    50571971 23b521ab 1e02e0c4 7c283320 05a8b7ae 136db66f c0d1bdc0 788e23e0
+    8b3ae3d0 d4f5a60f 41242cce 5a58a06c e6204751 22f3411c ad0ede18 f8175894
+    c8907a48 5d4869ea 852aabb9 6a053fce 134a7350 d4ad5a23 a3d66358 1d111575
+    d3b88279 de668e8e f1865d8c 12cf9901 1720b2d5 640eed50 a57a2039 28380868
+    7dbb4084 37fe953c 1e5b84e2 e6596d26 e4b2a920 14c619a9 5b4974aa a5ba684a
+    8f0c20e6 8e24f3ca 27f26b60 68a7a385 7ac09961 1097f063 d8debe4d c22c0dfb
+    5a90a545 c52adfe8 09061071 2c3f2258 4d7bfd2b 8f9b6d18 d4c64ccb 7dd0c5ef
+    6c2b5cb3 41a4358b 6f719b35 4296f7f2 d89b2d33 eb707c03 2d34b067 dca10bad
+    96e212f9 35e4cb76 727d6646 4c9e93b6 9a0b9032 fa8b1082 afbf7c80 bc67f76c
+    e7bd0dfe dbce734f 470aed75 5959665c 034e896d ce0b161d 0dc9a520 72cc9fcd
+    db0181ff 92729aa4 648d38ad 40be7b3c b9f87c30 cdb00946 37498559 445e7736
+    a304b1c5 716d1dfa 0b817cde 1c7f5739 7d94d10f 7e8cc053 e24aeca4 a7892a03
+    55120a93 2ed22ab2 37ac85f3 7f8f44ef 163d61dd 71873e4e 420c622c 43b5ddc3
+    194a9090 0a03e4a8 2769a22a f0a864f2 3bf2b21c 745d2520 0c54b90a 20f80464
+    b0fdc63c 1bad285a ddb4d4c3 7210a171 43de6946 963af90f e5273063 a6f4d8ca
+    0801ea81 09811356 cc19dadc 5f44d79a 71afefcc 6a8f519f bd5b8548 b8b8a0a9
+    55ee12ae c7b681a7 e5217191 bf193ff5 ba27cc2d 16b62826 adf9fce5 cdfa544e
+    4fb1b28a 20e48bea 3f5ca47d 8e77bec5 1099ffa0 085b7daf 900c35c9 df212e7c
+    96fe653e 5fbf9ae0 3fda58c4 69540d59 67f9e2fd e169a671 e43e20f9 70e5be8f
+    941ea797 eddf7cb0 43863bb3 3afdebba bb21f4dd ff900dfe 4cdb74b9 90c4956b
+    62ef10ae 8d341665 af420a9d cf059447 d714e4da 9e8f
+h = 3aaa6b40 8c0bc199
+
+k = 39d28452 26d09e1d 3ef82124 f9fc051c
+m = 93887c3f 0712daff 24faeb86 f470f9fc b4a89e75 e2edb554 883695ad ddce6c58
+    52e6609b 5f23aa6a 56dc896a 89e6b846 19e8bbbc c6bda3f8 2c41962f 050645e7
+    665cb7e0 535ee28b e33dc27f f877a88b 3d4f97c3 dbc3cb80 367054ab 45750c19
+    e84d0624 f00b2268 202ee144 e550462e ccdd099f 973c88b9 e48e6aa9 dfe7747f
+    54bb9863 3331afcf cbba3bd8 0d81f0a0 8cac2183 e7cec5f5 99b19b32 7e992810
+    d1c5c814 ed5ac195 e702d4d5 5efddf76 bc566c9e 345d3c64 95a8f9fb 24ff1735
+    c9fdd2a6 290ac1cb 28e496dd ac3b233a ef9aa3c9 677aad79 4940aeb4 a98fc28b
+    538fba35 e52ec8e1 80769dae 7e2d9676 f3330fa0 59fd693a b10f2f3f c40015da
+    62aab7f0 a76985de 2f68ba37 99196d14 e56b01af 1d35fad8 e431085a d273a65a
+    97146f89 d7c76f21 26e83b5a a8a29902 e438b138 81432dd4 034ea825 0be0996c
+    02fd4de5 10b95f10 3ab44e59 10d9673c ab53492f 768cfe9d acd07dc3 604059c6
+    6f8b15bd 9536cc35 81335c40 e7c92c51 7917a344 795ce3d9 770b6180 021a0d0f
+    108c8b5c ec36679f b9b0e186 573f072f 99341b96 11c3aa42 e9311604 f15a9c01
+    a097d809 e57ee5cc 31b34ab2 b0d8f37d 6cb9d041 ed93a889 46d3fdee 95ddb9f7
+    4e1bfb0a 33522a03 7e214afc 9ddd5dbb 6d32cdf3 1b19fe47 d250a922 880cd50f
+    ee236c39 9cd63e7b d1135b65 83eff07c 9da57b07 995ad2c9 2f877953 e3e0d845
+    5f7e57df bbfebffa 27b66172 6c7f5d25 086f59d1 137277db 5eab5643 aaa98a08
+    5275bdce ba4d40cb a8aa5616 a1d66b0e b254c13c b21d6656 01ef6490 65d512f8
+    49ce5873 25377934 13af6c64 ac816086 7dd70b55 d3a1f780 f65db16b f4a206d9
+    02de0af5 b2941cd6 0a0252eb c8fb3fdf ffe0b56d 994af442 b8093c5e a5186b0f
+    4e5f8b10 13f2225b 54c3121b 912c7a20 4ff903c9 35262427 4825c3b0 1da93a98
+    f5b77ae9 e2bbd943 207a51b4 a19628bc 2994236e aa8e4842 893e74db 967199da
+    7bb642a0 cdc256ef 5fce2bdd 0f5f22a9 4b36b6c4 6bfb6b59 47bf443c 88281f13
+    9e86f38b 3b15be1b 4b241bcf eeaa28e8 113b23c9 eaafbe1e 7d395ae3 545bceb6
+    f9e988f8 c7566c48 a72f529c 9280da0f a3a001ef c9b666fc dde0f186 297231d7
+    ae2ea11d db5f2899 fa42a770 e105436b 4e5d990c 01488d3c 124ec3bd 62e07dfa
+    d8b9b973 c144ebce 6163fe03 3df8131c cb1d16a5 01ca5e0c 40ccf7bc 74960fa9
+    db686b83 306958b5 523b61ec 390548be 06ba9a1f e40d33cb fcccbe20 0074d503
+    580437ac 2195b445 486745da b36eda21 f9494c6e 2bc9a3
+h = 17b83c4a a3c8f08c
+
+k = 6c9e9fd0 a5b80e58 bed644e2 e7f6f810
+m = 5a259149 9669ee74 66f13358 2b95dea4 872338b4 1e5913b2 fa6ad73e d5dac49e
+    a4089cf3 fd154455 200a85d3 dbe9f405 6bed2e8b 4125ff7f d27d3880 da14f961
+    f02ef992 39510263 bfaf8375 9b0b7974 c2932710 ea909ecc a405c65b fd6a17ce
+    e3b8e3cc 8b49c1b0 7a7e7773 f6d3fb6e 3f68cf9a 7f50b064 c4e8b19d 268d66a1
+    04480ef3 7b3f25c0 9d6f45e7 f06de529 f73612d7 3c47fa0f 56d48e6a a86fb201
+    0a23aab1 7be40c8a 9a41f88b d4c2e6f2 c69f32ae d1a42a5f 3c2980f0 7de5976a
+    f9181729 8cdc21f3 f79fc4fc 1a1d55ef a5af7d31 8ed7d060 30a85c52 e7b3aad7
+    dfde2658 58755feb 3170bae9 e4ae83e9 05455e1c 675a3544 6734b3eb 2b516244
+    ad7dd0ec d934880b d406fa09 a597d79b 4a019325 1299935b 95e7173e 137567f3
+    0ef462a3 bd86e1f6 b97879d3 f64ef24c 3206b48b 342263fa 49542a0c 1825cf98
+    d23da88f e477c0ff 2c0f1cc7 2d35bd96 bba19088 210cd701 073f7d0b 6dc3e7ee
+    df257611 4de57cf5 f03b8220 8fb442b9 c2295a38 fef35d33 5fc856bb 88871047
+    f43dddcf e41d3b8a fcc7ad29 847476c9 b8d9ba55 61181e01 9c12f478 c01513e4
+    5b2dcced 9ab5f4de 40a931b9 c0aa19b7 7b93fbb2 7cdfbc31 33109be8 9ecd3368
+    ec080ecd a5f9ae88 2c70b30b 891c5242 fc746834 96f46b33 ad8dd0ab 25ab587b
+    3e3756b9 22e8c7f5 abdc3035 5c4c2280 9b55e6cf b18b0ee9 9ac071cc 041b68da
+    0cfdc501 ca506c47 fe2b04b1 cf39e855 16889298 14772e5c 32e8d575 32837e64
+    fe8beb73 63b65822 016b2d5f 16af5a3d 4af2dde6 ff824224 b84dbbca 32db25ff
+    9a38c3ef 566f0e02 a3fd81a1 cf9808d9 c516a2ca 9d36ffe4 855e6f04 76ee2b76
+    05e6e80f 046b0510 e6489320 2b5f80e0 5e52d720 19b43da4 77cd0b26 412701f2
+    b6a2bc75 ad77d540 fbc2f385 2736325c fc35174f bee359eb 005a3837 826c1e27
+    b08c6c23 eae56da1 db38d77a 1c9a7443 9be04c2b 2dcf9527 bfb3dd5f a9cb20aa
+    a3144668 5b439476 39d641f1 7ff0fb2e a3c3eeab 4911d9b2 810d9c89 7accb7d2
+    1ed7755a be61cc47 e8952f1f c17ab984 2c987553 65ee37c2 3038ff08 92b64960
+    ace3ca4a 270166d5 e8471fcd dc0eceec 80707f01 631a27b6 fc92eed3 d864baa0
+    bfb25745 d8dfc66e d3963c1d 786209f3 66a4b1f1 dbce4048 8b15517a 400f8cae
+    293c6118 eb303360 a9d017dc a87b95f4 bf426c89 757795f5 43bb26c5 336afad8
+    9ee62c98 0c010c14 9e938982 d855533d d5bb16d0 f44abb7e 9fce5b4e 6eca70ad
+    b0298bc7 81733422 3c422a55 e41a00af ec714eab 56843a9f
+h = 5eefaec0 1cde8feb
+
+k = 196d4db3 920299e9 3921aa51 7bbf6d8b
+m = cc0787af 3b7926f0 0ace0f7b 30804eac 7ba2a195 03375f95 6fa41e04 9159e4c1
+    ca3bcfe7 afc0fcee dacb5225 4194b64c 1d2d521f 4326bd5d eeb3b413 98baaa79
+    ebc130b4 35659b8f 82bff17a 3ac208f8 d6f9a8e3 ed7c1c20 52c86e34 a10473ec
+    a234f2c3 638793c6 e36be9a1 bfbd018e dcf600e2 6c57d538 d9de85d3 0add49ac
+    2106dac0 b8dd7586 bd6c9fc7 8b244529 18b0895a 43ab2273 2c4fbbcb 5dbcea3b
+    9a5969ae 3a8120a1 1b7e5bda 80b0181e 0655dd84 c545d053 79466412 09e54adf
+    cfa43929 6eb9eeee 59ec64a0 4bff63a4 8d07b853 3157714e f705aab4 29457f1b
+    2ec325be d5156ab5 5f9aa944 d21c80b6 bf12ecca c726956b 073d7789 f3c52535
+    dc4a96f6 ad45d5f2 0600d02e be10f627 d15fa126 11676ab9 f0472b72 87955e70
+    52a5771e 411a5541 572e0864 7b624364 68a03c2e a148f9b9 91277562 c50db558
+    06c9d245 7ffa3dff 35f280ab 733723ab 21ab010c a3f10420 580eb3a2 8ff39ce4
+    9ad8e775 25ce22d2 cdce3d32 a695ab66 448880f3 ff916015 9bc2bf25 78102a32
+    b0877f9e 6e3fb352 a2a2ba3f c3be37c4 ad72113e daf400a6 21c73e96 643901f5
+    74631c17 2111254d 4e42b839 f6df3fcb dd37d7de e556245e 08bc30e7 dadcfdaa
+    867864e6 1a319d0a 23690dcf 8f2e0b13 ae3a862a 6edfef6f ed7be6c3 ee2af49d
+    0ad35475 f8911b82 250d43d9 04d52d49 638addf6 70ab54af 0cc49345 4414b5af
+    41bf8076 a5e06202 946e0383 365c6a8f 218f1c5a f43758ef 1fc19579 bf1b34c5
+    714c603f b6b2eb91 ce26211b 8ce13aba 64b787a7 59d460ad c1baef7f 9df7da85
+    f5c3b36f b4b56395 f96950aa 5e9684e1 08e135ab d25cf271 f06f0777 9d481c47
+    336347a2 4f2d7111 7c6c672f 37c23561 28abe0f5 ce0db85f 2fb2fe43 4911c69a
+    c232f372 3af1d4fc f17e7cab c57e3d25 647b9656 9e258e32 712a17aa 39ca7403
+    2d107875 b418a8fc f34638ac 5d480d6e b78badbc c887627e 0d7f8a29 d6b6b058
+    38c0a9e9 e33577b0 99443520 960864a0 9a7bde55 cd704c22 da17e1be 4a4c5492
+    6620f453 b7d7de17 d6446016 3722dfe9 a59b6b64 9414b391 8b55ce5b 2c5462e2
+    385334a6 263925a8 14143711 5017febc 73669190 27a2a77b e53519fe 786c83bf
+    b81c4bdd 0cb00fa4 f4541dfc 53fabc7c 35a74366 f685e8a8 64266398 ee983a6e
+    e57cfb7b 3c094524 28efbcea 6198edef 4536ec50 412f52c9 246629b7 fd19086e
+    8698842b 12034e88 b39bc96c 0305c82d 95d3d89b 298a6997 1033108e 51589af4
+    8166edff dbc9be19 b5c07f68 2452868d 77f1e0c9 87b92fac 44
+h = fceb7bb4 42f0a9e8
+
+k = e38ba97a fe936bf1 c9c3e384 9967d029
+m = 65708f07 067c5c1d f1f578db 734b8be5 7ca96615 22d6797f 9026d68c 755b0587
+    69ff282b 6fa2a930 6a472227 a5b0b67a 95729c98 317ff7e0 21231b6b 35aef0f1
+    20ef31a9 3aad79e1 007aed5d c6a46958 0e26b390 9c823d39 80a9798c bde4c679
+    709be4a9 b2e4900b dc253f3a 0e90a300 ebb1b2b4 e46294ea 58b84c5a c323c6db
+    45c53eb1 7b5478d2 b3bab183 69790b0c 3266637b 9efccc07 0d9067b3 3bc9c294
+    ebda4da0 9ba1fa15 34f64e1e 63443c17 d485aaa1 4e03c700 def0e07d 5bfaa58b
+    244e7bc8 4172126a db71e231 7fc7eaa0 40d2ada6 df92d40e 57d5488b 7fbc4f1b
+    16048980 a09274c7 e9736e41 2021b567 f996b1c2 31807ce0 7b604c98 215ab63a
+    e548cbcc 2cacafd8 9941ce5f 6422a8a5 b0f5fdf8 a4209cc8 68ac653d c11063a3
+    392f23ec e81c87cd 3a22e56e 949e5837 2b45ff2b c5aefa4d d55df7d3 c5fd2089
+    e52fb128 c40d47cf ff2910cc de0afcec 5ce90a1f 5b0729eb aace041f 406a7654
+    0355f764 2da29f9a 0301de89 698d990c 6918a06e 0b787f1a 6e132839 58e761c2
+    dd6e5a76 de5bb942 ed42af9f 23d0a4b2 c7f0e321 d7e23a0e e1c6f4b1 f5109c1e
+    c76e95e2 1fa4d42b 1d74cc49 24ff4b37 e7172281 7bb3a2c4 fe6c8075 235617eb
+    52e3cfd7 1ed917a0 949482ec b3f55fdf 5ef3c98b b50b2a63 001061da 785db72f
+    706c8a98 b88020e5 84454071 68bf5000 3c5c4e51 c96ca93f 044b3a30 4eb18bc9
+    f0ac423b 46b0f611 fee4e99c 59f1a039 19375cf1 48a010b8 0ef8739f 60043518
+    41544b30 351b93cd 8d078662 b7e7d7bf f8e3df01 55369cb3 701b214a 70001baa
+    31894580 f1a47c9a b7004fa1 8d456e96 aee0ad3a 5cc7a88e f3a83300 6eb8acca
+    4c8adc09 02ac271c 6338169b 4891d2f6 24f7e09d 905ced7a c18d9cae d613db89
+    9575038c eafd328a cbe4b253 f5e9f07c 57f30743 1af79b34 cf1549a7 e8de330f
+    e14c8874 52cd0657 d6670e8b cd24195f 207995c5 eca4db0e 949cfb4f 34ea493a
+    a82bd673 b944b030 b8af134f 9c7eb509 a1f61209 a06828eb ce84af40 defcbe22
+    f4dc346e 09da1350 7f30a3ee 157f2e4a 45ab4a8f 574b075d fe196f42 52dba33a
+    b99688d1 38f9fe71 38abcff8 9c9302d5 e39fcb60 bc656994 3399fba4 01aea6a7
+    5f4343c6 7a48b9ce 82bf38a3 0b3b0982 95d1b924 d7124a8b bca8c9a4 d47a1b10
+    105e7f3b 8aa09583 f21f578f 8e3682f2 5571b387 0543e178 019bd20d c0a52fb1
+    cf84ab47 c5445a6d 08408e9b e036de09 852b03a7 93f3f81d 9492db73 26911fd1
+    6906451d aaa158db 4c847807 4bd589de ef6deffa e566509b cd45
+h = 30282c58 7e17f71d
+
+k = ca2a2547 f3145fd6 5242154e c99228d7
+m = f690ccc7 b1a53ab6 608c9c2d c21e9202 3d7cf2de 6c54e869 24437450 a7bd7914
+    b8458ee7 8a756240 98bbf157 277c9c9b b1ac1802 2b6703ee c2f7a9c8 ce8ffb1b
+    b562d90b 7bc6a8c8 318b48ca a0872ebb 9a3e2151 4b1c0f69 75eb3fc2 672bc97e
+    3d3cc8a2 9eb94bf1 b762650a 0e006f78 7c1e27a7 1cb2372b 63e52146 35f17587
+    eab54c54 751186ba fe545607 597c3ed9 8e18b4e3 b7019455 987910db 1a045bd9
+    fcf790d3 a96b20cf 34d396f3 37d3c2d9 2fda74b8 76084b19 b83fb8f6 74b14b4c
+    43b821e9 ca0f670c ead4da52 876fccad 8be74607 797a3e38 c272c7c0 cf60bec5
+    15c62899 1603d1fd 4d33ebcb 1c8b4fae 7af47621 baad2d45 33ad756e 4e6825a7
+    fa0ff634 c79481c5 859b5793 2adc4dc2 ae5f3a84 fe9fae00 7e02988a 20f1512c
+    9520b437 4c13cc4c a1871f40 d75d46fd fa4da326 ccdefa1a 9453a810 fd13c784
+    d83be1dc 9a682a55 9cc03c3c 38217fd1 ddbbff72 9db9fe97 93185b14 29780170
+    dab4e458 3cee9f09 6568b3ab eb0d6d30 cd8d008d ad265b9c 6312a60e 9e5ebb5b
+    ef7ddb96 7bc85fea 0420c1fd b325043e 382c1ca9 9409223f 3fe2888f 895b1a49
+    f633bd4d e4cfacc8 67ad87c7 9a0e598c 91f06908 0da39578 8b1c1a02 734c9d2b
+    b669445d 8acba7d5 3e4a346c 2e84576e db7928c8 ed503fec 6defb54e 14902afc
+    90f9771d 412b633e 877eb925 4de02af6 018c1fcd afad22ce 0c0b9517 6b965158
+    7aace8ab f01a1fab 5bc139dc cd8b4c5b fe6d2037 47606878 2f3f943f 24622f13
+    10da9dcb 60465794 04769b38 00137b24 dae1f20a 861bf4bb 69f0be65 929fa96d
+    7db92361 d1c99662 4224e8ad 8ac857e8 70d6314a cf688122 28e174bb 879650ac
+    637b23c6 debd1281 790f0a98 8ba76c6a 9a4ef939 2ea893cc 42c900b0 abc9934e
+    9ff1552d 20027276 82027f49 5a6576e8 c6154a98 f43bdf02 90e38467 1caf26b0
+    0ee87b46 605ab92f 6e2102ed b081bf53 fbc0c2a6 e812fd70 9c4b82e8 532041e5
+    754594a0 ebf25a79 d0b511a9 44fcff17 6b51cb6e 6c3c0374 fe09b322 38e5e7a4
+    e5f6711d 79402956 0f532455 4891c8a8 b0a929e3 3c6db8ce e04f094d 71eee726
+    2c54b727 07a00ae7 ddf37829 937d05dd c83daa5a 9653964b 49968044 d5083e64
+    c59efa8b 338e72ed cc36f14d cb5d82cc bdf42328 53546206 cfb89526 3cd96429
+    6aa3890d 2a6e700c 74f14ae6 e019de0e 51c3286c 6851d1cb 53ca7782 faaa3577
+    be8843f3 c1bd8dfe 7422e801 00c805fd 236068b8 2bc60c38 2a13b1aa 7cd0753b
+    ad4b3000 3ac5b43d d08bee0b 0ad0237e a0bb5071 43cc804f b1f2d4
+h = 0904370f d33fc116
+
+k = 0024b226 4c5f2a7a 3d7df4b3 db5b1025
+m = 91692cf9 48630ec4 3432f0ac 51281a47 486f6075 1a9cbeb2 dd741d12 59b4dad0
+    91ceb0f2 49343f74 53beac96 a5f28feb 31b8ea8d 21ff87c9 fcebf14d 48381671
+    0b7d2b5a 87d2cb77 face0fc8 4095d3e1 ce604951 3b3106a3 82413689 724270e2
+    8e1354e0 064e4fab 501e39be 86742a0d a450a5e4 31f69fad 23fbe970 0e10a663
+    d096a51e d39de73d 98ce28e4 4d209456 448dd194 c15563a5 950819eb da2f1533
+    b82c7870 26d32242 4fa38d2f 759117f0 8f2d28e9 4521bdd8 f972dc1e ddca4141
+    ff9428c0 7c184cc5 1019bd79 dc162134 c8934ca5 704a80e8 2aa21af7 c24d36d4
+    ab958f64 639c8068 fa7d1e4a 387f1141 8332469a 6c553d18 36f3ede7 0fa8a754
+    f80d96ec 5e5e8893 e3c92bdd d2908031 ca2837cb e16681c5 14d9caf7 cc5961c5
+    210f7c39 a8c7adae 30620170 73de6539 3950f1f5 a7aec915 4b21a686 a601a578
+    456854b9 6d24874a 4f4c3edc ae7f7e1a 27f1597d c7aa1352 31d89f5c da688823
+    8d7796bd b6303ae2 84d26bb9 18a74694 34bf13ef 2da72fae 01f567bc 40061cf0
+    222a4805 2115176d a04b2f32 4c6ee55a 5d71f801 3d2e5e5c 4a791916 b07468ef
+    7acc42e4 b16a6996 a986ad51 72916adf ab4b2be8 ad74cf28 592cabcf fa688be3
+    e0b8ddef a6f07864 36bcd9c9 55e93e01 0980cb83 94d6335f 53b5a305 2fbb93a1
+    7008a0b4 57852370 7491b80a 0de847ba 554296c3 92dbba39 a085a678 c5ba26a5
+    c843dfc4 72b8836a b2171355 8212cbd3 1dc549fc 0d6f3e8a 915faa45 81427a44
+    d03563f5 115929c4 f942aca3 9a78e0b3 7d4c3700 e44b94e6 e0d610a5 1a05c9e2
+    0155be19 f77c47c2 d90aae33 ba233339 4b12cec6 5b59c9dc 2aaf9a69 af5bbfe8
+    1ee2ae46 3a7da0ee a73cc536 3e47316d 4dbe7a48 d9f6322e 084ce66f 54032736
+    dd8ac789 4a308553 527a092f cf0b2e42 88a21721 1a8b9dd8 dc53bbfa 29540281
+    7523858e 4ee3344e 8afdfcf5 558f9c37 b9218b73 3e6143da e354bd4e 452d86a8
+    31417bd6 8363ec21 e6f6e956 872fa0e9 d211f269 b2964c72 20907771 3fb5d1af
+    5a7c4587 54e6a3a0 bd5e8e28 322d12cf 4438b55a a39c575c 1db8b690 83568361
+    b8b94e8d 16860d07 0cad6b55 ef2609e9 3814ef2a a92fe84c d197fa41 04a3d3aa
+    607629ec 44682be0 0762ed09 7a4f32c6 cad98859 3afae46f a87e72b8 43a04b71
+    8c7ad838 bc7fd718 04bd6e3d 6dc15610 c94f2a3b dd9846b5 40cd6688 c4504f14
+    bd1abfde 67204d92 beb240ea 9f184e48 4391abd5 2ef989e4 90e50f4b 794240c8
+    6ce01b75 6cd316bc f64db766 f3142b6f 71b595d5 26d93a9a 365fd503
+h = c8a51e84 e70d005d
+
+k = 1d47c06d eb6f400e 81964e0d 2378b744
+m = e2d10fe3 2a4245fd c0ec0c29 278d4bd8 47eea541 f2c6e65d c7e05fd7 0d035b66
+    e23223d5 f2f03632 a56385b2 e83d9846 2fa0808b 6945cc5a 7b8a83be 1effb59b
+    d23f943c 612fee7e 43628106 f109584f 86a60214 357e8eee 016ea8e4 426c46c6
+    dc3597de 479235a9 b31f0c8e b6d00090 e1984d09 8c52700d fdb876b8 9a410f09
+    63be39b5 0a0434ba 8e28f5a9 24cfcb56 d8aed1a1 3088f29b d2b71b78 e886f9f4
+    1813263b f97df807 601849ce fb9321ff 91c7771d bc0551e1 a28754e3 8c772550
+    3a2fb201 de63c061 8c34a68f 6ea40243 06b268c7 6a57c689 d3781c5c 0b121ead
+    f3be1800 dfdde28a 15430dd0 e7b714e7 f7b36387 7e36c0c6 1d9fed25 58855856
+    025307e1 a006ca74 b09a05d3 6315b186 01097c33 e414679e 11f71889 38dd6b7b
+    2b418b45 911ad275 11806c64 4aa693d4 c4db3061 7a30349d efa32aef 53be68e5
+    de737cf4 56287c1e ad774043 e4a46b36 048a0bcd ad11ce92 db410c08 f7ddf5d7
+    23e49639 cfd0c8bc 24e389b4 02beb410 60c279fc 08465988 abfa1afa 5e1f5520
+    9a361bbf a1a94a0c c8ed477b 3213de32 c6a75072 71bd2fed 15f23472 896aced8
+    5777c9dc 7f117c07 f94fad82 7ba513e4 021d35c4 4d624a4e 4676747f 4932c35b
+    584f7444 6282bd73 b7e0b479 44f425da e8585b89 4cbaa363 17966e45 f5befd44
+    37448a21 a2f87dd0 6bf422ff 005e4141 9ce0d558 e29159ff 770bbcf6 a01245b8
+    d1cbe47b e0c42589 ca948e74 e23908a7 6a892b06 f5e88004 db46cf81 022f1ec0
+    f0c16c90 e8854991 76d576ca 40ad69cf 1b704523 148163ed c8817aad edff0a6a
+    03b7cf3b 4b1b093c aeae6047 9b5ccf08 2a543cf5 5864163a 69f1ad29 e39209f6
+    e90360c9 3717f7e8 1416a349 018f6bb7 ba4595f7 792139a9 be1dea22 6bb91ad7
+    5e2e9ae1 fa065bea 0709e893 f85b8a48 57179c7c 1409a67e e40c8f67 9690197a
+    ee6a4adc a36ea0ea 4d855e56 f53fe6f3 378f32f7 a5cda1c1 efe335b3 e6e282e7
+    0d83d80f 9a107a92 53a51ce1 b865b5fa a0308d9c d53f62b2 4c617c88 f2343eac
+    55e6c6ce 433e6318 7219018a c9b0b1fb 96bfdf04 599dd94e 6446479e 716e8804
+    227eb7a2 1774ad6d 3b4dfd01 a3686c15 c77a3d12 2151c690 9cf7304f 802b30eb
+    a21c5801 3aec31fc 66e06654 7db2c150 78040eac 48b02d4c 58c0d690 70e3d624
+    d5b235d9 ea9ee55a 57017d55 d9dbd451 34a7715e f66462ec 74e489c0 93524eae
+    ecd8bdb3 373377f0 c1326fde 464fd826 3a248b77 4f1ec070 a1b5ccc5 8f60a7ce
+    8c483196 e0115d63 2b2b1e28 f651791c 09946db5 adc2060f 0eccfe63 62
+h = cd9e03cb 0b3cf397
+
+k = effd66ae 85ea2d64 33e72372 e6db73f7
+m = 05a231b4 a583ca0d fb8e26cf 77a2adc7 b0879613 cf0e4689 ff151344 ec64ccee
+    50e9beb4 2de309bf 8a82a8ef 59f05f37 1efa669d 2de9294b eff9645d eaa03738
+    c31bc395 9ac00d90 babc99a8 59fac13d 247619b2 e1b8ec8b eb09c192 ecb64518
+    dd466cd1 50bf57a8 8bc96f6d d8492bd4 edd89094 74a33517 63696c9c 2af23152
+    e9a0f809 c37acf59 2546281a 4a1725b7 21e95308 6771eaf0 7e8540ec f8fd5d6c
+    8b35f8ae ba117085 db177efc 49aae325 574a9452 5695affa b6286ce1 5cc0ae72
+    286c38f8 e021031c fb810794 1d129254 f37b0b0f c31978f2 095f17e2 4b7ad5d8
+    f9a274f6 8e17da96 af7fac8d 4e6a73f4 4a4675ad 565f85f1 4c4c93b9 063be85c
+    9c720d2d fdacc80b 2f2812ba bbb3d50d 500c2841 444c9167 d6cf37ef fd5b834e
+    624ef76f 918100b7 488ef639 04c781a0 b3879b8a 2ebafd5e 73b440b2 06e2cb1f
+    055346b1 1aeca5b7 0c1609ed 95269bf4 e2258929 e2aa18c7 3c1f9d33 ac9ea3da
+    fb42d1b6 431ac232 62f2a774 33b7c4d3 2b375516 02c5c4f3 0965a67f 5595afd9
+    1df5b887 c67f36ca 32019092 673805f2 7042bb6a 959534ae c532efe7 fbea6fe7
+    659e2037 febbf889 d950b7a4 fd502dbd f40d51c4 c4085f54 29bf9306 51eab3fc
+    c8419a5d 9e26fa1c 6471bc32 7e63c7ed e3b3fe97 08e24340 df32a7f1 2c793162
+    8bc2b687 20825bf5 36ae0e49 f4545129 6caa5ea9 98324ff7 576c043a 89bf666f
+    5e34228d 5727b4c0 ff6b64f3 10ccdfa0 a90d41be 30b1d045 7fd90f22 e1265b54
+    8f7624cc e94c66f1 f4201df2 346941ab ef73ade1 c24438da 6f41e8fd 4864dd6f
+    d0d5afdf 962fdd88 3050e69f 2847656d 38a2b80c 3169b51f e8220b90 98024797
+    2c8230fc fa332819 57574815 88c10bc3 af355405 a8863ac7 ecf367c2 f9f61e2f
+    a7fb5c59 6518b3da fb094146 a530dd5a 1937223a ee1b6f68 d9fc248b 76d94bbf
+    12258ff6 087c8a76 1d7e5d29 4ce962bf e62d04e0 fb0bad14 c8d31ba5 78200233
+    5bf7031f 43caf42b fef1c810 5b0c743c 09552339 bd29bc07 fa2d201c d5601b51
+    e1418970 b357d432 db76f1e6 62844c7b f6fac6fe 4c83d715 112b1c9d a4c532eb
+    1d7960c3 c6982f48 cbb11647 0fb723b7 91255de4 d3e95694 f2fce0f4 4e474c8f
+    566b04e0 511d61fd 8537bfbd d0c861e6 415b818c e6b49ffb 512257dd d79a0bee
+    cb5ca992 d0f87340 aebee30a 927c6e2e 1cc409c1 99cb66c2 a9a3b6a2 923c3a66
+    592552d9 898db7bd 1eec576c 08c99613 43d08013 b5e0a402 6718a072 9576b4d2
+    4b2b380c 9c5436f7 bb89d37c d9de52f7 2d0985b8 d822ec19 8e33cc63 2865
+h = 36db66a1 519e57b3
+
+k = da3952a6 a642ca35 67cbf9a8 dd48fae6
+m = 80725ee3 bd0f0ba7 7a599173 3f317cc6 c2c3cb23 f7745915 21fa83c6 24334f56
+    e6e9b32a 019840a2 267fc676 aaba2619 af04337b 1cc5ddb9 de9e43ab 50d7958f
+    093f6697 32519f46 5e2dbb25 0980bac7 6049216a 90720952 d328845e 35455b05
+    00d9e9dd e5013c0b ae368a6d e805b70d e5fcf569 d702e4ef 6f1fa886 81ad6414
+    08fc737d 41118a5a 35a4b25d edaefe7e bfe67638 01d6fb27 da7d4476 ac7f0e5b
+    b494f784 e5929a0f 3af441ee b4a1e01f 871bc4fb 71367435 c0d7d170 bb945168
+    311ffe20 6479a7b3 51623775 9183a8c5 877c3e2e 40aff753 cf6649e4 cee8f9e8
+    61e34bac 5e331b29 5f06282f b601fe14 34740746 7c6feb7d c73511c8 f7994ab5
+    a8cd3e07 405e4f0f db45d0af 77210633 f319b308 9060bd09 8f164d99 1c84c91e
+    962bdc53 1221a838 20dcf0f4 46fa4173 6abdca31 583e5d2a 07e4a470 12c5dd58
+    40a2c0bf 3582334a 76c723f0 203ae70f 95389f30 7f270250 d5c56623 c7014d85
+    48d57e5a f38bc5e9 c102339e 8e2d363a ca9b89bd 824eaed5 88f4a755 4524a993
+    30953742 d572ad16 a56afa3e d8159b81 47485d13 ec0b3813 88379777 e8217a75
+    5a2af486 5e12a236 99351802 7126b705 e9ea04b3 a778de71 7ec955ca 51dca68b
+    840e997f 66dfd4ac 74f11946 9c0d8cb4 ce9aaf81 c15eca18 cc2daf01 b8784f41
+    7414bf2d 748bdb7b 98cdaebf 38ea87d3 fa1203fb 413cfa56 5bbe6c6a 948ffe17
+    48278f18 3920bded 88bd94c5 bc2d7374 bf103620 b18a905b 78ea9fa1 36d8b6c6
+    4d9d7a56 946b47e0 cedd10da 7c955c3c 5981fa38 bd0c90d9 54fde72f 5aa74f3f
+    8ee5d067 cde52fbf 0cc39d1a 023a5575 c70d511c df7df7ff 44524edf 732c1afe
+    2d9bce39 42a2435d 9329b1fa 0eaba791 5788cde7 ae409b1a d07df306 c1951b7e
+    b30e7455 3a1fa17d 64c6af5c 69802deb 07f66320 a20de1e6 1a8ae082 1ada83b7
+    8ce7a62c df5bae45 aa515ebb 2a2889d0 5e2f607b 2adbbd25 97ca2391 edeaf4b0
+    bbc996d3 d82982ca e1fa618b 9523d215 50d194bb 3047275a 5801ddfa 97576b44
+    95e89dfb e0456885 61d0fb35 d622dd2e c4b6e711 6402adeb 1ca82253 cd74fcf6
+    f513e3dc 029b4dff f11b0b67 7c541195 041ba05b 68853ede 98f67eb3 eea13c64
+    5a7452b9 647419b8 ba0ff855 80f350f4 7b4a2a79 855d076c 6d0b2125 4872257c
+    c45d2f4a b994b439 bd40637f 0e0873e8 9c1a0354 99efb73d 18672189 51e8f263
+    a6322aa9 1e8d987d 03c1315f 48f150e2 68f38784 742df759 ec51611d efb2eb2b
+    4ffb52b2 4a2356dc 5c7bb67f 7606e211 bb68eaf6 dcde7dd7 124d0a73 656cbb
+h = 074a731f 34072192
+
+k = 2301c34b 12454c52 31fb4881 b0871105
+m = d92873b4 78141a39 46d5f544 64a93e5f d6f698de c3566949 1420976b 8870cea0
+    a6211a9e 341e9a09 86426ae9 0eab3faa 0246cdfb 1b101047 7fe2d441 e7574907
+    ede573a4 02f0a3a7 ca57a17e 0c03b4ba 400b8bec 912186d5 9c06dcdf 27f28b0d
+    013c0286 fe44cd0a dc0ff7b6 e478324c e3fac946 73e9e791 5f0c1052 5f1883aa
+    304ec89b a032e87d a9e60d62 b6aa61f8 e11fd7b7 6cc67b88 cb1ab81e 0e98e0d9
+    68998962 0bc697e9 120774f8 c04d7fc8 71aef77b cbf25e31 727f3cd1 e33592c8
+    2743895f 3ea79335 7d7eec4f 21e4d0fa 47feb642 33b047fa fe7af9d0 bbdd2e20
+    f70c7282 9f66af46 edb41e19 be920f99 968de7cf b83e5fa5 ff74302d 91a8e29d
+    81909b2c 70363087 fb16b5e0 6dff56f3 ad454f0f 4bb618eb c9acd00c 7794a7b7
+    bf352e0c 1cab2931 2baffa91 863395c5 191e7475 fd1fec06 01f575d4 49ad1502
+    f44a8c1c d1c1953a e176c23d e46c4b3c 607cec2f 9f6602d3 ee88ed5c 5fb344ad
+    4919ef79 746617ec ab9c3ed4 adb2dd57 26cf45a3 346f1f78 b569e610 702d8a5a
+    63b81954 f6153fe2 325554c9 00006d91 faa4f44b 90bff258 d57cf87b c13fdc77
+    e7c70b29 a48f101a 968eaaa9 e4fde5d5 724179d3 70afb1f0 c5f87bd5 5e4f7836
+    2ba2f214 afe6b33f bf59d8eb ea51cd73 ef0be845 cb1badbe e58fa31e 5a30a011
+    85631e42 d0ec0b83 780085d5 3689bb36 4118acb1 fc5b4c2d 500612e4 b53b3b85
+    a2e334d5 c6e56a65 9802181a 4fd5420c a25fba43 8b450328 028626b0 b899b9d4
+    dae2fc37 b7f9ec84 b6821543 5718534d 106f280a bf771731 b8375183 3badc216
+    111f4735 d4765986 b14d0c9b f4f4ff02 b55fe301 2dd5bc69 8f4659c8 e4da9e73
+    39b5e1f1 8dac3be7 ea941ff1 5f6b254d c548b188 28eba664 824acd56 02bfea97
+    7ba45bdc 92807d4f 2556dbcd e26aecba dcbf44de fb598913 aaf2b639 7f6db0a4
+    96948293 810679e0 1cecce92 3a0430b3 bc97cb0f 854f02c3 3ce880e0 4aad44e0
+    3b7d1435 e479a332 53998adf 95e24d0d fddaf310 02715e7f 3973b83e 0239847c
+    4cc45248 a8692e89 b1d99cd6 3a9b530d 9f6455d9 0b15b91f 34e750a0 c50d69aa
+    f1b77e1c 0463e8b6 2b860e86 c4176565 1fef0994 916eca9f fa8b1917 6763626e
+    bcea1a81 9cfe7c8e 7cb98c07 53db11aa 604fdba5 0186ab33 8055ca11 cd8639e4
+    3c186977 1778bedf fe0af9ac ab93b6c6 46beaa53 52b02e53 7fb5104b b6a07c0c
+    4f36b7ee 5ac3a854 d2a18434 83a1e112 ad7cfc3f 7beae493 ec89b552 eca8cbce
+    1c5435e9 76a9d44c 983e0ef5 bb03b012 3da87d24 17de1777 847c551a 8bf94cee
+h = 9f1347bb f51f2dc0
+
+k = e3202bb9 70132b2d 1b424d68 741d3594
+m = eb53f2b1 be913abc f6dd3bae 44156479 d1fe6a74 82b53cec 7cc45abe 8565ac7f
+    fc60d422 3b1805a0 774b0401 9301cc8b 7013f9af eb1fa05d f87b9a86 3d54a137
+    854090e9 4390dfb9 20a80ece 5e143024 2500fb65 7543b2ba 8d276ecd 38534c81
+    1a98b924 65030ade 2eb1683a b4ce61c9 29cf7882 f8f82a45 bfc17cb4 be0a7e59
+    fd91f454 e3b12cee e3254b6e 9a4461d8 8ef14edb e8a57522 939fe8cf 91330057
+    59e5d309 1f647b51 1ca8db99 7d376aab 579e2b26 ac270227 2eab9f8f 6b963480
+    1d0e63ae da6bb32c eab09540 0f3b49be d1b92494 12274bad 68c22d17 73e3255d
+    4b11f28f f365342a 0f1908ac c479bd08 65828cde ac287fcd 6ae46c66 23baf0a6
+    0ce594d1 dda67c29 20277455 396eecbf 980cbcb7 06a84d47 45c5350d abcb6053
+    b1523075 58725631 b8118889 0c1a78dc f863c313 b7bb57f8 d39ca8de c72a5b80
+    60b0ef55 5118b2e7 7aef06f1 5ea6b1d3 b874dd3c 3d39d107 1d84d3bd 9b475d43
+    bf3d2f85 a75f17c8 756fdda0 8d1d61a3 7901318d 58c1dd9c 8dbd1ef6 1df8c5ea
+    9914a93b 2af1da70 663a9015 edfdf48a 67927266 7c039df2 e80e36ca b1680430
+    485e3f9e b2c804fb 74d76353 af588def b17b76b1 5ae23546 06d44d10 cc670e6c
+    a7820cdb 8713e5c2 5ae1a850 b2314315 a42fe74f b675b457 f68e9c51 9f926047
+    cd406401 31effd69 d5d734cb 68273b9f c34bb9cb d5c39cca 56fff817 30bbe531
+    dcbc2170 aa6b65f2 68b457fb 2bd67bc2 d92fb274 95157a79 0ee1de1f 3d3f3716
+    829b4f29 69728786 2c2c40bb 4ef2b547 b6fdb8db eb991e8a 27024858 4986e56e
+    2f5ad09e 5162c760 e9b92352 a50565f8 60cf3f9e 0641de97 62db5671 a6c0686b
+    c1c35180 11f4e1ca be24c9a0 93d4838d df7dc976 c2270cf8 d79399fb d8a11066
+    338ebd38 67bc72f3 85a2063c 6b6049f9 66e5047e 8fcc7dcb efe13c51 35620c5d
+    c4b008d0 3336839b 0524553b 1724cd1d e0b1b5c9 48c8a9ed fd7f166e 71b13dce
+    8505133f 7b850371 68bfbb00 85e55d08 3d5fc0f9 b87d3a2e 58411f4e 80cc3ad4
+    071575b3 7e329790 947ae432 7a855d69 c7da9d07 ffa04ed5 c7eb354f e04d7d4c
+    49ee42b7 ca044592 ba180a51 3cc92207 4d3e390b 58db95de 58f744fc 07598e64
+    b9dd746f 71e04233 30c12351 5a707976 5318a177 148cfb13 2954e030 04548474
+    230c5ec6 24262a90 4630110b b4d00bf6 036abe25 8c55494e f53fcaab b8c1b08b
+    975a0367 0c6378cb 2b1cba0e 9ac40561 501b6c53 3a9b9570 fcf99a25 aee285b9
+    4af41198 75f1e0bf b582caa6 468e7bb2 09964a93 e9c05ce0 855b13b7 928fa01e
+    28
+h = 5f3dacb8 8f0e95f0
+
+k = 06b201c4 1254fd91 8c61df19 360812d6
+m = 013c1cb5 e8979845 4db71e68 28cd608e f6a6ec5d ab750adc 0c0ffb37 ab6d2dca
+    20e66ab2 188e07af f944473a 4f97ee14 19af4db1 93e8d71a 137aabe5 47fb1702
+    75d7325f 52016ff2 2ddb5ab5 fe22053b 59193aa2 db83fe59 96ac14ca db9a2328
+    6aaa2b5c b8d774bf 1df26a7e 779c66e8 fda98be1 18f923ba bab1a938 6ce15650
+    2b4fad01 19316113 efd569ca 429fe64d 5f709710 c0d1bb37 e25585e3 edbf0994
+    b8be92cf a06fdeb2 6d2225b3 7226589a 79bef566 86222f3e 74406069 d2b5de22
+    dd400c01 8c8c472a b68ec362 bc9aba8c c5d391c9 11961473 8740c4d6 c25fae64
+    78f0f882 21a38ae0 447bb910 7c4b42e9 4a6f7550 ee1c083d e7193c7c ef00ae92
+    a9c5d558 8e4cf649 9394961c ef67798d 42efc163 102df38c 6a199b8d dcfbdc03
+    2f40085f 4ccd330b 8ef51da2 e3f50d6a a70ccb53 df12445a 7397560b c008a7e4
+    a8f5ad52 cd87565a f3fc2d87 64058a62 024cf476 a75cee5e f3a9a205 deaa2734
+    f3634be3 90c1bc96 6098319e 2bdc9ada 101589f1 466fba91 e90537fc a53d84da
+    5473255a d5ce7c09 8b1f9626 8380c575 e9b6d66d a577a1f6 1067b8c4 99309597
+    b89c18ec 9cb97734 1b336f5d c14214ea 27743f03 5b9060d0 72755e2d be3ede1b
+    25eacc3e af1f1355 c9da3b99 b294211a c1b67d9f d458714b 45d5b0b0 38ff2612
+    2169358c a14b2466 050572bb 1e7e06ea 06ee5818 1977b268 d0038962 772c298c
+    85f20afa 1f4ab01d ccebff9f ff4a83e1 e05c0e36 15e5d29f a61b6f2d 510bcc83
+    7774d859 2d04eacc 8e164789 0060a061 c4127b9d 53e82a8c e16093d0 71cfc8c6
+    b850bb43 1b6f524c f82868f3 00be6284 20635962 62cbbfed 9a25af16 d06ebef6
+    00943e6c 80bfe32a 01759081 1bf01024 1eff8a71 019a1209 14a4f270 74827156
+    972469a4 abc14827 491e5acc ba7674a8 9515f285 4a845125 45e59fcf 1c68acee
+    09c827d9 fa125601 a7f02d37 49f15a67 7408c555 546ebf86 b118ba7d 074ca1bb
+    bcdeac2f cf02738a 3048c321 1c613358 5085af7d 7daee82f 2473eec7 0c8e3a48
+    c6b031a6 48286fe3 ffee1a76 002d167c 445aed69 99879b95 f4f9a2d6 7adf5d59
+    5971b4dd 66b64d46 3a9eebca 004b6cca 814baf0b 2ccbf0a8 368b12eb dbdc232b
+    f0f15092 9052727a d9cd07fd 6086378b ae7805ca 171eccf0 a6f54324 3d5f2c75
+    ce4338f8 8206abd5 4726f110 b5b6fb02 035a45b0 c2de56de 5c26ad36 684e32a2
+    4572f987 06eb169a 643f70c3 ec13aacf 2bf2af04 bff8da24 48d81b29 2085db04
+    aea00a38 2c497d72 520ce7ad dd8fae2d 6848dccb 47bfd11e 978bd137 5607c5b7
+    e918
+h = 9277fae2 97880145
+
+k = d7d1e523 8b2f597d ce64db6f 9cb9c61f
+m = 16542fd5 185f76bd a7b99e43 69ff368f 7976cc6f 3bc71f6f cbdf9c1f 5cfca002
+    50538a25 d125e630 1b519191 2888d858 9f8d8755 59fe87fa e9bee777 9fe0e488
+    9db204cd b6c608f0 8d00a728 33db3600 5fb98554 1064701b cbd59c0e a942bff2
+    16b75b24 6c5e1066 34f97217 52f437d5 278cfd51 a800d730 4f470b06 20cd9f9e
+    14e4778f 8c5ebac4 18ca2bab f700bb7e 37748fea 933b960c d7d1f8d7 d0fc967f
+    673286a2 11531e5e 4252df8a b8968bcc ec9416de c16a6fcc c35e5076 b31eb98c
+    14018793 cfb1a303 e445d64a 5af3b111 edb83a19 353242e4 888420dd 433d7e6e
+    1fa02285 88cee081 b9b3b1c5 5092d886 cf08b3fe 3c8b7b98 597ef5d6 bcba2148
+    a62172b6 19707d99 3a5473e1 baaecac8 a3b5ca26 27287241 c396ada7 75e33501
+    0ca27f51 d3491410 5dea12a3 78983fa0 74d803b2 b0eee266 a22e622d c3f22959
+    d403b33c 17093a08 98dff1ed dda59e78 67920f24 979f0cee 1ee05908 96d53dea
+    5013202d eb9a56e1 acd19cca 715da77c 308d6729 97211084 987f5e88 515a28ba
+    da627a10 18a61b30 6232bdbf bd36b292 cf27c3c8 49a777bb a9b66cc5 385c901b
+    42cc6df8 0bb09738 6e1c6079 4ad816d7 584eac3d 3a1b5a57 bb938848 50046161
+    422161d1 c1a4ff35 93c14ea6 abfebcc6 fa1e1789 4bc3804b d677dca6 a0f24e01
+    606343e9 b6aa8b1b 0dafec5c 7b71cf40 05fce67d 6b3a7294 a90b45f0 deb7aee2
+    cb9b6d08 f0d7c313 02efd81b 894fccae 6e8ace6d 1918be87 edc620f9 335dd38a
+    61080747 d8660dcc 33647a8e c53f4a8d d1275f40 900be9e1 69fd8505 772449be
+    db2ea166 d62eaa4a 33799503 d7c7fc5b a38b6b1b 5f772559 c1e7d910 597a651c
+    03d3d4af 7010ada6 6e60d949 53cc48aa 45b81d33 021d6d5b e17dda14 b02418ec
+    b041f833 0e076f56 3d46ab6e 86ee8f10 be2c4597 bb270552 be9cd2bd b6321efa
+    8d609462 72ce5ba7 bb6beddd 2574a167 a6512630 badf4df5 88ba9752 b0d3f74d
+    362ce670 f72011dd 8032e310 59c42f43 2e1d7049 365ddee0 d689dd1a 8b760465
+    1db6e876 37d21af1 7727d5e7 3a948976 5d60d6c9 1aba4b24 65f64871 b0caed1f
+    fcac80a4 0b2bb05c 9867979c 13486baa 43110cde 447f0bbc 4b68009f 4032fe78
+    c2c0f1c0 c5e8dd74 10381315 c41587c6 75a34fd8 de27c1c2 5839f43e c7ec4603
+    4d9b4af1 795d0241 668bc331 b61b628e 8bbb35a2 67bebe01 7873bf8b 14f790be
+    819114f2 d60361e4 d5e0d030 24e6a44f 82245ca2 90e73845 2cd05bb7 ea741448
+    eec382df 93261f1a efd0c44c 1b020ab1 6dca27ec e576a94c e0cdf73e f9ce6bef
+    d930ed
+h = a84e2a60 ad2c4ffb
+
+k = 22c4edce 5c8f6327 c2631013 580a973b
+m = ea9b0d5f f9a44123 b4c24e17 7258bbf8 cf2feacf ff188518 0a628b05 65b1de27
+    55f312eb eee4758b 1ec72fca 97a7cf8c a21ce3ae b2251e68 35ef3b2f d21bf77a
+    906a924e b8d7931d bb831ae3 1d67661d 431572a3 95627c88 c59f7092 42d7a2e8
+    e5e7a3b5 390112bd c50d320f 109a3cd7 8ab286c6 28e1ad3f a7895a70 f4eec015
+    0ea200be 12cd819b 802c6910 1ad3385d c78891fa 90e9485a 0f1d44de 8ccbe792
+    4853f846 30d3a355 05bced30 4dc85996 78f2a0d8 96a09bcc c9efc18e f30e02d3
+    4120f6b0 40e80c32 d028b908 55bc69be c68dda4b a33780cc 75757550 3176b220
+    1527bfb8 5d8fa8ac 72a8dfd3 01e5b368 b70c6ffc 84e959e6 bfea86ff e0b0ec4e
+    9cefef0d 4963bbfd 222b9365 34636ff1 8dc425ca 9ff9a854 fceb1368 3905115a
+    fff9bdc9 5aae6841 12287a52 1324265b 3db20ea1 939ca1a9 4f871fbe a9229e72
+    5e58b387 de32d9d3 1363ecad f6308d84 53b352ac 6ebd5b11 a1f21fd3 9dd5a401
+    331825c5 2f575f17 6e05bc87 e3781524 73ed8d41 1df83515 e1c2b6c0 ba6da1c5
+    efc1425f e8d7427f d681bf90 cd74f59d 3db0832f 1b283e6f e06e65b1 8824feb9
+    3baa7693 8aa3bda6 c966cf05 db54a511 b13de0e5 925a0bc3 6c46e0c5 3f59738d
+    f334367c 51e00b73 f8d4a023 017eb800 ce8a06c4 dd6d996d 5c1d56fc fec59c8c
+    7913a0a3 43a86c1f 3d3f3516 9a80f19b 2b490038 760d334e dec2803a 161a182f
+    22db047f cfb770d5 2dd0f78a 25b1e156 c64e1dd7 b9d0f3be d3c5f631 597914e8
+    c1bfd715 db37607c 244cfb6f 832aa5a8 3bc375e2 895066cc 90d77d3a 3d3f1dcb
+    97b76004 24f00510 6f3b82e3 9800b0d4 80601968 d413c804 fb4dd72a 76a62a75
+    480e2d12 d0587b89 a4c1779d 9d8a78bc 00c3ab28 b529d9e0 555c86ff 9cd652ed
+    7e5591a1 c26dd2c2 3b2832c1 dfb90fe1 ccf2ad9a 882c5567 4cc2de21 0232803b
+    163f35f1 d926bca7 51632ed4 6558294f 40d20841 41f966b2 cc80c158 2c1b533b
+    b5ffcaa9 e2191f52 cfda4c3a 8ac1a3ff 49d2b0b2 d5281ed2 2e070554 2826ec2b
+    89cefe92 36f09fd0 80464906 f2b91d21 d08d1bad c9f3e179 67fed512 ee3a4545
+    9a115c7d 7410fbb3 a1a1333d 4f223b54 769ff452 82b5a59a 7c4d6709 61718905
+    d591b4bd 2be6aa55 8232aa43 838d0ea2 746631df a1471d02 d5be81b0 a937922a
+    8600ef5a ed7a5adb 84ac2efe 7d8a2b16 9c526507 abfa457d 3dcdd224 db7b566a
+    50a1cfed c1afbef9 3e9f17df 2e71e05a eabc92f9 5946e433 f0cc2c01 7cdb1f28
+    400c2201 51995bdf 1a480f82 20e6603a 9d3ff15c 41486e1a 7613ad4a 0ebd912a
+    bd4c155b
+h = 28e06b04 abb61d5d
+
+k = acca88c1 a794f9c5 d965411e a350c29e
+m = 811e8d59 95af02b1 cdb1a60a 01d756f0 f4e08092 acdcbcdb 555725fc 405998d3
+    bdbb7bcd a628ee03 0d4602a5 b7936893 955df0eb 4aa06cc9 8285d468 6ea0e0ee
+    00af0365 75f60a35 1885ca30 92130c86 96e17ef7 ac5c859f f050dbda 23e29c96
+    2668ab7c 8c598cd0 421c93b3 f36eb2e6 941c45be 87cf23a8 275ead64 055fb83d
+    fcf8cd05 7dc144f5 5077b388 9447d3a1 66226b50 36767361 7665c0e2 88f6fe32
+    a7c195f8 47971008 aedf3067 97ce7b61 3673289f cd54850a e7872ecc 1550fb9a
+    aeb9d96f d7c70497 467feeb6 c7d62e4f 738d0bf2 d30d21b9 8af32c4d 3f531d40
+    b1725ede 94c401b3 4c9c9a23 49e54f00 5844eb27 20c22975 793c5240 f74ca3c2
+    d4ac6054 8a322034 17fa6ff5 b4071b3f d459d0be 7459fb30 9424bfa4 722a6eda
+    fbb8244b e504d49a 00d9b0ca 1c77d150 d0a44a9c 1510946a baa3d161 d6441bb0
+    463943e3 5e058a75 48928dc5 715401b3 208c3526 039a170d f17cc65a 039e45d3
+    af8717d5 d4ace80b ce530e87 04efb103 a78d19ee ee854c93 f7971c01 818e9d86
+    f5980a25 976adcd8 50f1a4de cae6bdd2 25f8dea6 206ea53a b1374323 63625b98
+    bcb46b91 819cd39f 5497960c d6ddade5 36f8b572 7b51b76e 42b5c89c 46ee5a48
+    415d4728 e95fbb29 fd5dd942 ba99318d ac192762 0d53339a a4e654f9 7a1aaf50
+    7963a5fe 8479781c 0b51ec80 5368dcf0 efce3b40 2e40b299 08512dcb 54af64a4
+    be96bb1e 3b821df1 7fb68794 87815f55 ed3bc5a9 c51247b8 54d0d80c 4626bb3c
+    893a3d37 0956ea17 bacc1b46 88932d91 d5e976f5 346203b4 0fbe84a4 d4fe6e4b
+    fd11e22f 84b15db1 b87b073c ff4c9a70 55c91cf0 faed3d5a 943351e0 c034d1f9
+    ecce8027 0dedf078 9815db61 27d7cce4 cff7d186 c7567f26 fb33489e 7eccddfa
+    4fa21e82 dd4c5bbe eb008217 422956ea 619af7f7 cae07e39 fd3b79f8 12e5ba80
+    443b8450 4179fa62 f700abef 267407d3 de70915f 43cf20bc cefb4dac 10076a5e
+    e48198d4 10ec39df 21d30ca4 17a99299 db9ba806 4e9023ea 72b1a61c 365ce998
+    b58ba181 e5d5461d 7a6c1bef dfb2878f 50243dfe 1769254a 56b57532 a01eb903
+    2f8a9523 218c651b ab3a41b8 a554a386 45567cd1 04b274fe 561a417d 9b5a65d8
+    8a88a8c5 ac1f7e70 98a42ba4 78ac9f6c ac7d5529 4eacb253 906197ef b7f286cc
+    5b24b4cd 658a9d7e 06192ddb d236bab4 35c3e15c 5d09f06b 5ecd1359 bca7d494
+    20d5a230 aca022f7 1377f37a 5fd15d73 06fa59ca a65ebdf7 0d47f2e4 e283256a
+    4f3fd710 29605a98 48ab0859 5ad4d475 b0b22647 2bfa81d1 c6f6d05d eedae16b
+    3086ada6 33
+h = 244f88a8 6c637703
+
+k = 26a22c5d 750b257f 92b1b290 4570841d
+m = f6302fb4 02be4210 82522e4e 553c2c71 dd0a13df ccebf56d 7adf900a eaa3096a
+    73fdc58e 3ddb9874 8f8f345c c738103b 16b425f8 fc90a815 79afc6a5 fa4fa626
+    00b6e1b4 5af0b0b2 8e3aff68 27344b91 8e67a198 ce405860 04751761 f0348706
+    f7e394cf a2e690b8 57020aca 81bb9973 cb0d4ed3 30e4eef6 c8858adc e2931503
+    53312722 ef9bb4c4 947573d4 d2415bdd 58c82c84 63b1ea52 00146a71 df781d7d
+    f2fa61df ae909f8a d5923177 13872482 8482e8e8 e7c90139 a3f5b8ef 68521bad
+    19a40900 e907f06d 88c90d66 db0fec3b eaae9e09 c005b49c 40579cb4 bd2dd330
+    6f25ffd5 6cb105b4 3c291e73 b282688b d8d8e9ff 5010d30d e86bbbda f5bc8e4b
+    c002c921 ea2e2bba a3c0b892 d4f4f828 5a0b99a6 f202da09 34886a84 e36b25d3
+    59879545 33938de8 cf179143 866e0adc 5cfcca69 654b1316 ef03f145 fc8d224b
+    0c2523fd 50a2f27f 3c8663cb 6144eca1 0ec0f142 a929857e 4761003c 2f67bdb7
+    f986fe83 de3cdbb0 891b28de 9989ed6d 4dfe8668 484308dd d5a7c43e 0084c075
+    628822df d8924fee 80157d54 ac7a8f9e 6286dc5b 252908ca f8e3c20c 0e556cc8
+    005d3873 c301ea22 aa85b67e 2ebd6385 fdb04f6d 3d93b582 4d2a50e5 ca0f97a0
+    927e986c e55e72c1 4de99fba 4db282c8 a591d858 744c3e40 7da83330 70395ce9
+    fbb276d5 394132fd a316ce6f 04bcfe57 881c8013 958c34d6 9bcf2704 997f9825
+    ab2f6050 a79b8d1e 553d4cf4 401047f3 3212dc2f f37e1d4b 12b78232 2891428a
+    8c38ad13 270761ce 4b9191ed e2f62d4d 9883027e 1a963454 7464ebe1 d781e833
+    aa5a34cd c7084c33 de6bd37e 3e14ef99 ff3a7f16 977e0150 18727e1a f5c4a9b7
+    61675f20 56fb078f 6dd9769e 2ab24040 ebd40f93 211e85fb a8108d7b 66b957e2
+    013a30fb 0b044449 b60dd33d 774fc7a6 50cfc536 4b9c471f 2448af26 47ba5f1c
+    13008f97 b044ef77 8a84ea7d 0d9bf469 66807009 7b584235 2ea359b0 e6fb7895
+    aef25d98 a2c82b30 262aafb2 e3a29204 177a8b9c b3e91e21 2f6b9a0d 3fcd8dcf
+    8a065c44 3806e1b6 28d81286 885d66af bd1f1c5a 3927eb50 62674039 be103a78
+    37bffa95 2721fe12 c6ce0b2a de93025a 911431e5 b78185da 30c28ead 6f9fdf2d
+    03e5d59d af427325 a613a97a dc4be3e4 f69fbf8e f26c3956 1f42a58c e479c353
+    e3f11201 933a0ada 2dd25295 a00d8030 cd58d5b2 4f85ce55 0f033dcf fa52cde7
+    49ea3df6 4eaa329e 25683682 a5e38f5b 81e9b8d3 7ef0ef11 a9fad6a0 8a28cdb4
+    5c9ca671 47b324cb a1be9a46 fc9017bb 734461d7 3fa3ecd2 600360a2 e6771ff1
+    a4208d99 2c78
+h = 662a2c79 fb3bfd90
+
+k = 889f36a0 8dd4e292 349ebb7c afe2c115
+m = 71236a8d 116086b5 c76fb074 754e21f9 bc38c1ae 38015063 640f5963 52521392
+    ce99afba f7a4efbc 644d460c fcf0e8b1 d4f26539 b4dc626b e20a76fc 1ce1cde4
+    c33c5736 ea2d79a8 bc129ff2 801c29a0 dccd110d 160f3696 72df42f7 d20d3f69
+    05042ee9 1d3c4706 3531b53e 09ff61c7 e7e10413 e152f35e 3c1eac27 555fd0bd
+    0142bb10 fcb1a9f8 7a18c7d1 4fbed7cf e8c3defc eb0912ad 49d469ca 9906de12
+    c25aa917 eda00ec3 45964595 57f56868 94c3811a d43e1b1c 91656a07 6b2abb8f
+    0583c749 11987ef4 30b064aa 880622c2 acd745db 3d0b29b1 05d68181 9a4b956d
+    dbf2ec6a a28f659d b6d29ab3 b7f341e5 40bec2b4 2975d79a 1c8615ad 7a126a79
+    b9b3d97d 7d344e62 7308a4e9 7e89c032 b852f84f 6d821bbf 63fdabbe 1a55df20
+    e1951073 439cdb4c 3bdc0d25 870f0222 f894b74a 299aa44f 3e781b1f 113e85a1
+    63843ad9 54d7bd3a 6025a680 92ffcac0 0d616a91 a01c8f10 2f6ed8f3 5da22955
+    31cc9400 e06a1d54 c3000d98 21e16fb2 171ba81f cec9a43e 4cf79ff6 cb83ae70
+    379f60cd 11298a1d ed3370bc a44ca843 7ff85bb1 04061644 8305d329 d4142912
+    8645b4d5 a0ffc010 0a7cd8db 060d5d15 992c2250 2bdd39d1 39fd02de b1b13ae4
+    8a5100f9 3cf9a1ee 3ff50998 d91bee5d 2a6bb40b 55ae6a1c 0d48d435 472e676d
+    09885ed2 6551b5d1 54a4d41e 3e22ade2 4d4085b0 8daee426 4b2263d0 be4113ad
+    297140d9 6cbfab1f f03b893a 5ff8a16b d9624cef a806f604 e644a2cb 66817ace
+    d30237f7 ae228c22 98ef19b6 cf7b0ca2 105b31ee f7167d48 a5df43ff 18bd3416
+    e51f9bbe 3761b5ec 50df049d 7aa28591 88b9651b e6772b90 a754b475 a9bf9f53
+    ce95b4fc aff72a53 0f4dd5be 7af701fc e2f58d09 e71dd02a ee37b077 811bed3f
+    7ff56fa7 b329a40b e841e899 075655ab 2e2ef5ad e81b5adb d9555591 d68103ee
+    8a411412 323aeb5b 28123d2f a532cf73 0bdb31bb e8700f7d 6ab49667 b53605e4
+    9057230b e782f582 77d514dc 71b01e99 752fcac9 a5f97dec 89f32c56 9492c150
+    b22472d3 b7eae45c 8022af18 fba67caf 5664cf92 d7618a01 63b5aaad 57ac87e9
+    070022f0 4718014b a9853679 5c9e1b9c 4e1c3cc6 4420c887 3bc2f490 28b16888
+    e28edbec 84379099 8b0eab72 f8682dfd 0155088e 351df0f9 1ce94184 eb31fb89
+    e01c55be 0252bd9c 508bdcde 1312a56c 23c09478 dbfab29a 7ad6a27d b0616e2a
+    27e32fc4 7ae46eaa ab4705fa a328f026 e61e946d e3f26962 d4a4cd69 6712c4f4
+    52350632 c4b8d02a a86a0a96 953df8a6 5a44f7ca 1ce55e80 312d7691 ddf45840
+    42b1d6a0 270bce
+h = 68c58ce1 2410f3fb
+
+k = 4ac95e6c 55d7bcda ac61b841 69685bba
+m = b3c65995 142139c2 eb7d59a0 de24f9b7 72ecd382 9f3c96f2 3a61a5b4 74ee035d
+    3a33703a 3b0fb226 3c1c8b07 11c7e649 a1ea9f47 372bee68 b28d5d2a 217fae7f
+    48113cab a6ef8003 e1468a5d bf74af63 4b51ec81 133dd179 d44670eb 0fbf1b26
+    637819f1 ec4b66e1 48fec71e c0a3e910 c0b8d54f 1b5735fc 8fc4a3e4 eeee7309
+    71906ca4 b7cfbb24 c207be8a ec1bc143 a5a907a7 c6367a02 381b0dfb 77ef7f79
+    02313c6e 67e16c0e 4c6a71c4 60dcb4de a46e9a99 867a1be5 f2f1a8d7 47b741bf
+    b12e7187 a4950fb0 bd1a1f1a 2ecc6875 1079f3f9 76dbdf65 437cede3 41adf793
+    4dad92fa 86026812 e058476f 8a4df114 1537c57d e4d472b9 cdafb8d4 08299582
+    6f9bf888 2b25faac 9f821e13 f6f14786 181d83fe e500ebd5 a486950e 5bfa8ed0
+    640cabb5 046c1115 34bacd21 98a1f63a 80adeca5 d5f3beb5 38dce232 171ff11d
+    401de008 00590e31 afd74e36 46f0ee04 841152bb 7df1dbda 2cdbce70 2d0a94ba
+    aa21476d e3f492f8 109b213d fcee8c8e f9d5f21e 9c5c8ac8 120187db 990c109e
+    c9fe5228 c693141b 429089d6 124d33ea 2c490010 b9000d59 2b4ddd48 a3fb7981
+    464cdabc 14d9aa56 7cc8e36b 8c3fd8a5 104044e0 c4a83e59 5bf5679d 6ac35fe9
+    d50e4a6b 8afdb328 277451f1 ecffee3b 71c5b4c0 f3b97b9a 63e4eaba 31cd31b2
+    537e44f9 4b5feb6c 5ec1a189 65f27166 8e5556be 84755543 48515097 ff25cacb
+    2a1bedec bc506aee c2c6981c d1076159 6d96abea d1e5ea0e 1e8e8e5f be138503
+    0bc09b8a 61358f8c cec80cd0 b579a469 d539b5a5 072fcfde b07d9a2f d9831ef7
+    cd830085 2f2574ee 25d43035 ac845a18 23f684f7 400a79cc dccfd5d9 763ad279
+    45bf4607 a26206eb 9e872066 b31ed41c eef05ea7 b41f4251 5e1e02b6 49d7bc74
+    902f3327 08a8bcd5 f6c4a346 4fbfe345 c69784cc fda25575 2fd5a5e6 649362c9
+    eb1c3226 1ecb8340 5859713c 4422b415 9ea95c1f f440b43c 38a33710 97bde5b2
+    df7eb68c 07cedc93 a0c5f202 80c2803f 58cd6581 d1aee1fd e0405804 ba47b274
+    3dbdaed4 757ab85a 2d5abc51 ccdd3c68 c137d3d1 5b73b096 cd039ea5 0cc65ca7
+    f4e25095 5fa698fa 7994b813 62ccfb4b 79b85435 f6b2ea9d db14e7e9 7f757e78
+    1ba35179 36248139 66cc16e6 3e6e4d65 4bdb528b 554a3077 af32fa9e a744fffa
+    c48a05bb 6aa81aff 772a5733 4f3cbddc 2a550e94 ece5ee32 19675aa3 b9351b94
+    1c42fb48 79eb62e2 b06470ea 6bf804aa 93038350 194099ae 37bc1ade 781b53f1
+    0183ff50 69496476 36d063c4 9c907184 3976bbfa 15899c5c 95175189 5508807d
+    1acfb006 87574a05
+h = ddd5b0a4 018c8adc
+
+k = c0cb19ce db03614c e034ff8e 5b59f854
+m = fe20db5a adcbae20 19269c74 01bd8eab f9f2e19c fad96c95 610a02c8 148555ec
+    a43a1ea8 c181dbd3 a0e3cb48 de34548e ec16ac6d eb328c75 b881a365 3ddf1775
+    73fdf919 a3a37b64 dbf15176 8694766c eba70bf3 8582a7ac 0c327e0c f70f4043
+    309c01da 0dfca179 4c0fd59c 7c0dfb7f 40e28c70 fc065b0f 51b778d6 3e73558e
+    eeb42d27 d9c40fd0 3ee30610 e336efdc fadf044f 2052ad15 53072eff ad1cee5a
+    ff6bca19 5e35527e db9b4829 27336f87 dd2f68be 9c1bf787 4e583597 0da3376f
+    da4e3032 5fa12e5a fa74dd00 4fa717df 4f0905c6 5368f7e6 afe6a97d 2b0915ae
+    46d8c2d1 9e249728 85794437 0c6e9c51 7472d997 bf813bf6 a7c5c5de 01926d33
+    09d74dff fdf71488 6b119659 e1edd2ee 5c27afd3 5d726d9d 147903a6 6a44652c
+    7c7cc1bb 79e3e2a4 87fa2494 54ccf18e 1a63138b 8d699cc3 2c6d1f73 f68b53c2
+    6e5fcd9e 89b61763 69479c6a 5152a0f5 70daa7f0 04041185 57da413a 1875464f
+    a8e59b80 4b6d6f54 f8c49edd 1af529a2 9464b7a6 199cdd7f 8b7cd37d cf06f4ea
+    5131e488 697bfe77 8683fc2b 6b0e1f11 c2e8c6fc 1e39e58a 95861b12 ac9a23e1
+    559b2150 4114a798 b5777fe6 6f731878 cd141505 d9e41752 c9711ecf badd669a
+    d3c9176a fc7840c3 027a7454 f4de72d0 a82d91f3 3a7c4776 2cd07cac b58fddd7
+    2c932cf8 44bc3c7e 2945d621 af934b04 10174527 bbac0f6b 0fc30018 2be7335d
+    af84df86 868f94dd df23fd90 280b3955 79a0b9b7 a6fef97b 38a0f5d2 40f63176
+    04d6d7a3 a8c4ea09 e9f87816 9fcd53ab c5311a57 62bfe883 032cbf92 43f93052
+    55ee26bd c47bb319 7976ac29 8bf0bd3d 0d051de6 3427ab78 779c53be abbe6abe
+    7e89b42d 9b768387 9b6a9ed3 c4cc4470 854c3a79 16961202 d2d849db e3956a7b
+    55e4b449 e1115d19 b20ffb82 05e23399 4b025977 c1f47cf2 6cfd1464 179dd05a
+    721677aa 5d5b2664 5c96a2a4 3001f377 a83d5e8d 0cff0906 372e7366 6ab28f0e
+    00460524 4d5e9b30 8466ce01 fbfbdb15 0f8aa69e cd4eb607 43774a61 1fd959eb
+    2a102d1c 9d51939d e68c8dee 501a6781 c72a5857 2da1e8cc 5b504aee 7dbdb2c8
+    3b70a797 4521a8b6 3f02dd37 0e4fc58f e98cdfe3 7e20a649 c633a0ab 0f15bdaa
+    d21f9785 57a997d6 4cb30b7c 00fdea6e a466de34 ca3023ba 01202177 2718b789
+    0b020011 78768ccc 82356ecd b9f1c011 49b798ab 0ff9c5dc 1696a85f 0f5cfe56
+    8aa9b51e a1b7ce23 8cbad523 ecca960f f175c4a0 d8294691 9a760736 59fcbc29
+    a317200e 47234df4 a8332aa1 ad89630b 47bafc09 1767c1f2 3ff86dee 5fefd581
+    26b666cc 3a61b19a e7
+h = 0f71b760 4895bbfa
+
+k = 938b4f61 fd5fd5d2 befa6e17 105b3323
+m = efbe6d1a 9503220c 53d4f79b 3c918891 04169675 c7ad3a55 28607608 5e817ead
+    29881569 b5f7acd6 26c3eda5 7920711e 2e0be127 5a70f7d0 8da5ab96 e140e22a
+    fe2f2366 e740cc36 3fd835da 88497b40 0cf97a69 b7bcd33d c9e698af c932d1e7
+    d18e545b 14e3947d e9a671b4 be114b98 ee72d282 859f9b9e bb7108a8 f35384de
+    dd0f43af a7dc5586 978eaa38 7d60b96c d806003f f485b332 b7d8f1bc bb0ef249
+    b1917aab d1f5f8c6 8afc92e8 cf4206a5 b080c38e 687228c4 ae2ccb3e f5c868ec
+    541de30b b9220322 4cacf42b 18c73b06 52ab96bf ffd4c90e b6ead114 4f235170
+    6e6cee50 841e4e5d dc01f6ae 3347ff01 86891908 2012bfba acda9ea9 b1d8d7a3
+    e75a989f e42fedc3 734615f7 07661fd4 6d6e9dba d8e6af50 8ebf12b4 b26b9f25
+    cd9a853e 7fdaeafc 6959076b 56a0314d c5014560 e785964e cb471bf3 d5ff062c
+    6494863c 416adcf2 56e4b0ae c8c04133 67d776f0 529b7318 a7d9aeae 655a4c5d
+    3c3ead1c 7b03e0b9 cc5acf56 5934392d 592bd7fd 05b70088 b6bbc0a6 4d9a51f9
+    951c6904 91f0db40 4d0faf50 c10e60e0 6b7a6191 0337e8f1 f8dd1c59 85989a62
+    aff46790 5310a25c b732f7ae b571259a b705ce76 5b5ec323 eebf4862 668734a5
+    98404ce2 115ed254 10616fcc d23d143b a33ecef4 914c4877 5b9a38c1 2b4e0fdd
+    65d35317 50789608 7cb81684 3352911d f6e5428b 25f90172 b7b50506 780dade2
+    8f6764ee 793b8efc 41da0e6a ac1db0cf 7d046ee1 055765dd b06af65a aabe7417
+    f1176550 52b9df30 91c82c88 f2aeeee1 39e17b60 dc01e92b 707bb322 2d272182
+    ea78a21a b52075aa c0a69693 696e7942 5715b29e 98b3a404 2ff97100 ec1c1ff6
+    0becd788 bcceda25 696bf3f3 51fc75fa 5a6bb074 272a08bb fcbc7d71 a4cc336f
+    8b5e3065 8bcf6e02 e1d0d996 de46f3f9 616c012e b876a561 1a8e694f 7c22d646
+    4e43bb0f 966bae7a 5d32a04c 512aabbf 5e9f5044 a1de4d71 5678e352 5c4615aa
+    201d9f7a 935f772e 1111824a 785b8da5 1875f458 e82a6582 c1ccc663 b9e7bda4
+    535a992d e5423016 711fb5b8 d4024310 42e34e59 02c66ef9 f329f4b3 99ef2812
+    827baf24 61b94e74 17366753 aa563eb2 dba2070c 70ccf75a c4655a20 c79367fe
+    37089fd4 0b7c3752 a4d2c4f2 236f9eed 66b771a3 89c6d947 873da0e9 54b3b1b8
+    85794327 c33e6545 680e1cd9 24ba6ad0 8e5ac38a 345a715f be74f27c a9cd4abb
+    fa7e95fc 07224715 40636866 d6823b1c a0829e6a 9874a326 bb3f9477 50df14ee
+    6bd3778e dc74a623 48b206d3 03cbaae4 a52ad25c 23684d1c 82e4b020 fc1e2c53
+    4c90eedc f30455b4 4a8f
+h = 95d2418e ada07ad1
+
+k = f5dc56d6 3889711f a3af5f2d 50b929ee
+m = 41b7e732 3446d1a9 f33da8f0 5d84eff4 45d09b50 22c890d4 2e137791 7bf712f6
+    27db6d24 4a18fccb ae145025 e5d84f93 06449a75 9ad6edfb 227b7902 b358afa2
+    0571fc3c a792251a 42978d80 d15ee41c cb56a955 2534870f 5a2b54d9 3a7ff4e1
+    0f400af6 745749bf 56201fa0 be5b5fc9 7e46a8b9 20ff3130 a73d49ad d5b30d5d
+    db54d209 dfe01b10 f7b4d9f7 e2a7cd43 b7aca2f6 a0624b19 c6a51e29 4d1adca7
+    eaf2c69b 9e2cf00f 14224c65 ab1aa246 fa5cf531 d70e61e8 f8ca9346 d2c7d1bc
+    84e20176 cbc4cc1f 28645330 6ed82aca 826af4f8 30f487a4 2d7275b2 68c83105
+    8814376c ecfc1d53 72894161 98ef2c5d 997e53f1 af1eb1c7 b51f7d1c 143d521d
+    8fae40a8 b21c7977 6f811291 af02e5a9 028851ae 5440ef02 799695b3 a378d506
+    ca7fbd4a 97ec01fc 7206454d 59900615 6abaa4c8 ae4e7e3a ec480b0f 84029784
+    f859a10f 0c6989e6 f3ede95f af146e7c fa458aa2 7af5d2d8 5c642558 c189f43e
+    8cdcb6ac f0cc1016 e27a1098 26c2052e a03f4dfa 8308e8cd 31f452c4 8b1f86d3
+    92b2b7d1 a4f49ed3 8042e62f 9ebdadc6 33452fb1 756476d1 ccc5ea64 c09b1906
+    b0b7f5cb d47025f2 63b1c7f4 da08e9fb e5c22bc9 5c60b4d3 2bb8a59d 39b7d197
+    1752272a 70cdc079 a7869534 f0fe0457 8c678815 a46b44ed 33a13d19 6ab2eef9
+    e551ff7e 71bc1114 bebfbc76 4c9fdf53 88434e14 af0c2fd3 fcddf13c c22a7708
+    1216d8c5 2681d2a6 475676ea b31627ad 35ff9a03 53bea0a9 bab829cb 766988a7
+    acb5c8ee 3857f788 e5e60380 5d593ca6 d32d429d 0c7aa898 9d267517 44e273af
+    b2ef238d 1139974c 2beef021 d847533f 53014ebf 71e78fac c23a6809 cce18dee
+    b34f4330 af061612 40ae601a e527b60e e58e5a7b c7f1d4e5 b4a7d5e6 bd41b27d
+    9e2369eb bb7c00ef da67a3ea 62e237fd 66471d4b da56e6fa 5e768958 23258912
+    bbfbdfd8 cd4e8d11 12c20c6e bcdce49a 69a77822 db196094 dd06c4dd 72992e6e
+    e70f178c 5e1d1c9e 696eb777 a9db2f53 6c9bd577 5ac04858 8d749e63 1d9a6eaf
+    96fe94c5 72c68d55 2728db1a 4223635a c284b470 b33851d0 f7d6799f 3d4fb437
+    06746930 495b3f64 71c8b95d 0dbaf48c 3087e0dc 74d9ddbb 72ba0e85 3a462cd4
+    5f9e1f3f 676fa199 91dd16bf 319eb733 4d094591 416094e2 1e171813 5e70c573
+    705cba65 dfe4a75e c764b027 ad5109a8 1b5ee91b bb2d7cfb 2234f070 fb89c8c5
+    580be468 2b58a7a7 40489924 5828e1cc b142f773 f323ac4c c0ba9a2b 720ef04f
+    3810355e b31ab1e6 febedb97 5ef635d4 88f0f94e 0468d784 203594c9 d67adf5e
+    59144775 84359ec0 974793
+h = 9693ecc2 9b092689
+
+k = 1fed8baa 4b2d71ae 1866f067 c1b51017
+m = 188ec0f2 cf648cc5 fb5fc47a ac9e17cb 217b5884 dd4d21bd e23176ab 22cc6145
+    743b768b 91a60f6c 20f68355 241a08b5 b10b953a 6e4c497a 79fd9deb 6b39fc9f
+    411e77da a832994a 95955d8e bdec99d6 fd8c9888 65f7bd28 320c090a d3ea01a7
+    3ab14b71 9d739c40 d4932035 e396b848 931f658c ee86868c bd90b15a 79835e6d
+    4d381d0b 268177f8 d9ad0dff 680b4bc4 80369753 0daac803 33e3f25f 2ccf099e
+    f1cb8f76 a0dbb209 bfeacb18 8a548cf2 a0a182c9 dbff53e4 1cc1632c f66dcbe6
+    3664b50e 9353caa5 9a0aba5c c22bd93d 71cca75e 6c8c299c e143a59d 27a4c7d4
+    39f5b6be 85b4e0c2 69d499d6 c1f406cb 485129df 964b0bba b8265924 16cc0653
+    df7cb1ed d358d9c8 5e38c3fd f2664388 ceb21790 9116b3c7 6dcc3ad0 d2973dcb
+    99a447da 4e1edac8 ac18088a e2eaa0ec 0ffb0a4b a6160753 c8fbf627 cedce280
+    315fea28 014edae2 80dd099c 7b71c880 ca4498cd ee08188b 1cb262a7 85128ad0
+    a7537bfa 434ef76d 28998bc0 538c855b 007bcec2 36ea4494 d0d1ca4e 86010d0b
+    b1fde076 881fd8e7 0f58ea2c 6e034fce ba0c02be 4be84a74 090815ca 7973eb05
+    3e355fcf f1224f9e fb841cf1 86cdaeda 368d57b3 408a0331 1498f396 5e40f08f
+    c037cad3 1b354ae8 eabad961 c56b8fd9 e360e7e6 60b3922e 8c661de1 9623bbb9
+    83c90e8a f54f28ae d99cddad 4b8cb67d 94a188df 8a813cc2 25875ac5 c4ff117a
+    b3e3f912 7c7d19c0 21621e3e 39cb2322 fe669446 458a19e6 7dd72735 5cf37d8a
+    5d23a778 2e610624 848701c9 1c534ee9 46aec665 602ff1d2 9906754a 5bb9ef99
+    41af2081 71501515 c4d1d1bd b37162cd 0e4cfb48 5975f256 ab41dcbc ef80548b
+    b8954518 24cddce7 1d4d876c f1777673 83af149a 8000a906 01cec885 65a4d961
+    5d65da41 5f9a1250 5a5d7d35 1e176f8c 30bb9342 e72cf0dd b5d2ccc5 b7cfbbdd
+    c2b781f3 350b85b7 9b422e6e 093c79a3 47cbef95 7672f728 1a72be39 3e030dc8
+    527be809 ded4043e bcc54793 330f0439 36395a22 77f724f4 9049078d eac37b95
+    47bc571d e2ed47fc e8051e84 64b9a78e 4b69f148 405dd105 22981bc8 4cf938d7
+    cf0e152d 8383365b ea40b907 7c469efc 098223de 7b10ff17 241db908 fdf1bdad
+    865465a6 adb0658d f8742084 4fb4c967 0bf28d17 17c4b7f8 a50a73f0 44a4053a
+    139ab2ac ffad265c 5eacb2c3 00a92eea c3e49edd b2d5fd4b ed154830 aff47572
+    5ae7b2fa 4ac3ae3d d8b51963 116e3ecc 807c743e 2abde5b2 da7e61d6 ddbcb072
+    ae2f7515 9cab1d1c a8e475ae 08808509 2afeaba0 3de89f06 906cb388 11b4dd22
+    d6ef77c2 a657edf7 ff7d4207
+h = 7358b0ea 4d3181d1
+
+k = ebe78ad0 ffded7ec 557e81db 33978ae4
+m = 772d020f e85c69a6 a2e19b46 c66a8a55 b2650b5b 05a40722 d20d5fc4 b58a35a8
+    8212f596 9b568844 302648c8 1a0ae8e5 6bcb7361 2d602186 5d75427f 9713ca9b
+    08cc0e7b 4c9f6966 4a7375d9 ea31a541 4f91f41d e1590110 84bd5f19 3918c068
+    6b6fc31f 95084621 b997d077 b93691ed 769967a9 6b0c9bbb 828d6037 5a7673da
+    baedf476 e565d6fa b88bca67 b073ae49 58a6a747 65cfbff3 22577545 4ea28698
+    11470d87 f42d621e 7395a137 6c1931b2 464a823d d4868a36 e8d40403 5a0ee632
+    5b0aaab4 8a427b75 e6cc2ae6 20114789 7faf5375 b38c24f7 fc979edd 238e60f6
+    557116e3 9bbc89a5 f12d3156 f2754e17 2fa7c00d 083fe908 2088cff7 894a6b35
+    b2b9ffcc e1d4c84a ed652808 0f955478 9fcdd055 51940521 98ebfe9f 1e672677
+    c8d643b9 8e56fca4 7e289a5b b68d9b46 26a6e3d2 a9515652 1c67f899 15bdcc94
+    35cc3c2e 5084d48e 21ca9f34 cce760f1 fc8fd607 eda3641e 46e7a132 2a0cd113
+    fe5a1df1 2b2e34dd b98d773f 573788d3 fcd89eeb 7ad21396 ca9b5ab1 27e052fa
+    a76d6da6 acbff8f2 4c4560da f05d6a2d 9a47187e d15a7770 39da66b8 b98e42ef
+    37c8f224 ebfdf7cf 7c53b432 db9f9147 70a49f54 8aa9572c d05415b8 8ab6d523
+    23663dec a11261ff 5a281ee4 a91c99de f561eb8d 94d39116 582cd4cc 909a7f50
+    6764e32e 71c446f8 bedb5b08 101d4c0e 86cd2dad a2396750 c81ca02a 45bed929
+    15b27ff6 8f5fec06 35b57665 26d67bf8 ec2bf700 58fe13fa 3ab8365c b55c9b02
+    27cd37bb 0fdaff91 5f64487f 90efffbd f4a6335d 235d19d3 8d1ee3b5 8ed6c5d1
+    dbfbaf3e 0caddcb4 7851bdce 6c093282 966d2755 20894e47 284a64bf d94a81d6
+    8e092ca0 52fa322d 72adf41d 1b45fc17 38061ccd 1ae106a1 bc09ab62 c6b636e6
+    eb1f524c 98d8d806 c46b8f5b 7aa1104a a1018f55 9f3c2c6d e70413f7 047804f4
+    18b563e8 f582eb4f c3796e02 0fb6b75f f64ed960 722a357e 1ac04bff 80c4a9e0
+    6c993ff4 adf23f57 a1f5810a 13c9b060 ba2b60df d9746830 4b76bea5 00b06305
+    f75c266e 47dc96be c3be7add c7e90f9f ff84f31f d96dc929 09d4e1d8 9d0d9217
+    41818b08 11b04920 eb95d386 0d1f3121 d399da08 24ae568a fa656214 f5981707
+    cccbf865 4bd69fc1 5274090a 4dd2ce48 174798bb bd9818b8 166e37be 8706e199
+    1f1a88e7 bbcee003 a272879e 8fa03784 5e5cd223 4c3d102f afda5f72 b6d71e83
+    b61416de 07ea0c63 447eb5ec 39487cd4 476b43e3 b7e72ba6 9f5f224b 5b47dd7f
+    a64f097e 6722bc2a 88945692 e5a3521d 9520d41e fcc64c08 95641dd1 4c90306e
+    1c41b18f ea750665 ca06fde8 64
+h = 1bdde924 e0cddc51
+
+k = eaf83e75 8eaabaaf a1beee42 df75292c
+m = 453a6424 9ca2dffd 8a884318 15045e1d 2cd6e835 93df11b0 d7bf24fc 285c2c67
+    95e15fb8 c278d2c5 fc8a4504 3254532a e2fc84c7 ec71c903 40fd876f 1e0a7bfd
+    8a00875c 6c8312fc 1fca8492 2371539b ca2cae13 96c5c708 30fb6086 24ddf278
+    17be62bb 7fb073b4 11cc6202 22e2c123 c4386ffa 4ea74978 e0668673 425ac802
+    88c65753 c0c0bb98 5247e547 eb5b13d7 6c3f5258 ac6b3176 8df3c6cb 1c845afc
+    131d132c 4e81fe74 604439bb a889e73b e1a02dd6 341dfdcc cf0b6d09 e59228ba
+    7a6a331a bede2c0d 24662a13 b0e429da 7e51a55c b6aa6dd6 fe11c13c f2a046b2
+    6f7ae504 3cb3f40e da17fb32 dee201f6 e11d3531 06cd1cf6 f6134eea aaa3867c
+    b8359aee 09a7c13b 2b0927b8 dfaeb19e 4fd628a5 a10d39ad c413b9a4 9f391b53
+    f3d89bc4 aa4ad263 a9db58a7 0230d6f5 a6f4738c 91f4b38a 17745c85 166841a1
+    d06f8b5c 7b7d605f 872bb23a ac5647ef e40aaa74 bdbb2fa2 15d66d27 7c60d1d6
+    6cb88dd7 bb87fb5b 568a0be8 4f569eda 8f187765 9a6ea5ae 7b7d391d 7ebb6ebf
+    0b568b44 6d10980c 9d10c378 0c808a78 1ca58aa2 ad15f577 fda5eee9 e61f2fff
+    4669ce95 a6b6a6d4 43f76b43 3687d877 3e484fe6 4422e8bf b097d53a 3f066d99
+    216f22f5 13a8e8f2 b6870d32 816244eb 2d6a4779 82449df4 b11ba3f2 e8321854
+    5942bd24 7edeaf39 70bf23fb 88d2ebe1 6de735e6 23609d4b 8455505e e470d2f9
+    64dc6f2c f85160fa 4e394eb7 dc0262f9 4f141feb ee7f4093 e1843bac b38cc8f6
+    8a3ac43b 1276936e 5b5655e6 52440964 abd53274 8773f3d5 5cae2811 64ef6ac8
+    fffb44f3 f1a7c38c 8b851716 8b2aa7e7 ebaaf65a 037ef5ba 96152011 1152d490
+    13da19d6 9086e234 e1af7f83 b28c6dfc 8d72a33d baa884ae e8bd05a3 415b2931
+    32df236e 77adeaac f0576c0e f50ce127 28bf4e70 6ae2fbf9 48469183 8fded887
+    f7b182ff 597418fc 6a80087d eb85d572 0a1923ee 79e201dc 8e08590f 0932e65d
+    5ff40adb d9d98557 4b49a7d9 90e7e3d6 140a3369 cd52e6b6 762debc0 d05571a1
+    950ccc0d 92650838 686fedf9 a9026b6d 8a9d66ce 953ab171 f399a1a3 75ffee6b
+    30f4aa1f f735df7c b9db4ead 19442469 52502370 543c2872 c6308035 a90abd9c
+    169366c8 ab3e5bc1 46313e17 5b931369 a868a165 17753037 94a55de7 c224243c
+    ecd64d96 cd16db63 3c641686 6db6bc2d 742f70b0 e16fc69e 38de7969 14657cbc
+    9d534d25 127e5dfd 4b835dff 82de776f d97d3dc8 6ef3c632 573495ab 91663fb5
+    bbf06f67 4d2dc137 166c7521 a4439034 cc996757 a1739949 1f013776 f405f9fa
+    fe3f5727 59c2dca6 773f6974 0eda
+h = f7dd4fe1 fefb0af2
+
+k = 517b889d c513a339 92d3fe2e ec12614f
+m = 2f706232 9fff3576 12f03858 42d4c59f aceeb577 60402c92 19723fc5 19a52efd
+    9b96eebe 00faf653 eb66c2e8 83c3e946 a673f801 351cc32b fd50fa3a d3dd3c59
+    56e31fa2 9228cbf5 9e85ca70 443388bd b00baedf a6ccc54a 5b89df18 26752e39
+    abbd02bc 6559c6b2 56b72c92 42cdde7c 334e8bab 667386ce 53253244 c382b7c9
+    0bc8f62d 75429f67 7ad3ffef 9193243e dc31d7e4 1004989b b2e33146 813a3fd3
+    d9a6266c f04e1a17 90687e03 d5776718 837f4871 291bed10 17379602 aa7a9174
+    22756682 722d7863 3116578b 26e5214a 88eefed6 d4726f4f dd929ca4 d80129f8
+    edc44016 98d9e479 777e3956 e4e00df9 afe411f2 f5544157 e4911894 54b0ed30
+    9d64b147 d2cceef5 8f20535e 804b4b52 5e246519 254a8445 85d64679 2cf54aec
+    8ff8c9ea a48dce69 6255b841 a6bcf065 1d07fc7b 83db8071 ad2bbe0a 694e2393
+    981699af 296f21fd 9603a315 74ccefec 2cd490c4 b43ea75f b69b69a9 b7bcf2fd
+    0c491534 5fd59f2f 90b10b5b e790765b 658d72f7 7c09c1fe 3319ebe7 fcdec4a5
+    a23d381a dc19e7ad 04e28e93 c039a0e8 ac8279e7 92c75173 1da534ec 6bba4cc4
+    c3de3567 380d9ded 4ed3d704 48bf5576 cb3d78af cd60b3b9 6dcca8be 024af810
+    d4b94ff0 8f403013 f0fa633a 84358387 cc816040 1db4cdb3 6befa9f5 4c1c68ec
+    c5297e54 2350afc8 fb8cfbea cee47969 212f2aa5 78372bed dfff2cd7 8bb243eb
+    9f7bc82c bbe862aa 74721384 c3321451 050c650c 036449a8 b9e5f81f bf4c800d
+    814ab851 df3a0465 c65ad05f e0cefd48 4aabf812 10d82f4a 3be97525 07bce3db
+    78f328f8 ffabd072 d0fdb377 0d178055 3055302d 00117f51 43d2dc79 8015f68b
+    a5f48cd4 100bcd79 fba48e4e 2d8db082 157e01d3 aae6e46a bc95bb16 3fb47155
+    3e8fdec2 82630ef8 0eac8b6c 9997f779 c60b0f07 1c034886 b7f09fe5 99102cbe
+    532d7829 88b3c466 0fdc176e c79766a2 156f7cb7 f1793a47 3e5d7b90 80e53b42
+    ea1bd227 af304356 2cdb635c 2ea6ae56 0b48e9e3 da0e8b3e 212c42f7 63d63276
+    b9c06e96 cc9d0547 7e90ecd5 69d7e9c4 56467719 729ed805 443060fd 720f911c
+    f055f526 ee81f419 454bbd9d 811f4ca7 147ea923 e7e71a0d 9b0dc6d6 a431b632
+    cdd6285e 13a55d7b 8df3befe 202c401a e2ee597e c870773b 76f03ad7 5e44bad4
+    12b133bf 497356ee 9c32b20f 01c1f886 4b08c865 a95b5e28 7457f871 5bf9646a
+    beee237c 908dcabe 3405b1e8 832eb265 92c80593 01d7efb1 645cf27d 9670b479
+    8ce4413f 4f8ce228 435b2ac9 4d0c69cc 9404f8e8 e682c4e4 3a34b694 19f8b9cf
+    43dab96a 0956d1f2 eb4c97c4 eba70b
+h = a2daa3ef c4802b96
+
+k = 9b85afc4 de3e2527 ed50c40b c56d52d9
+m = 2d057c19 f1ad2f13 081d118e a5cbf9fa 2f61eabb 6be5a8b8 eca1fa1c 0b3e5e62
+    316f0c7b 148ff7f2 005a58f6 324d11b1 84c87556 66e920c6 04a9d460 5ab10df3
+    47281061 0b90e0e9 7bd03391 d81d32bb 28d05d2e 14188fd8 0c6ef1b6 8eed512b
+    afd3f1de 3bc5bdde 816c8ca0 cbf0921a 8f8ec1f7 459e13dc 12d22c8a b1dc98aa
+    e2afcb3b c33429fc a20b4580 bd1643b5 9989bb6e e6b4af29 d034f7f5 76c62292
+    5826d4ad 6585704c 8a52c3dc be392a3d 9ea447bd 8161bd21 ab82ca37 4813203b
+    b3110bab fb48845a 50a74bc7 f6779af1 3a963fa8 84db95cb a431e497 e4385fd5
+    ef8331f7 e95735e3 cd87a9f3 d92e1b08 396654c7 b31cfa3d 62fe706c 8d5177f0
+    9d604105 dd6c2161 b47fc377 5fb55974 7e4640bc d4a7b9ea 724a4cb4 fe0fee78
+    2fd84299 7675fb4b 44d99f82 fa1e1dad ce24781f 6ef9bd28 d3923589 c78f5401
+    ffceb334 fa61f738 9d583511 f6e01ff0 04aae9cb a7d1f5c8 6a0b4ca0 7d4590f3
+    a1f9c6d1 65ea5bf2 e8c9a0fc b86100dd 585b9f01 3138ee4e 4fbc78c0 e89bd657
+    f36619ff e342b618 649827f7 c4552934 cd965328 9416a465 4e41349c 069fa64a
+    5b4914e1 15c77e88 90d9a419 9f380003 1f3575cf 5dacc34e 5f077cd5 28798c51
+    fdb05859 e34c94e9 6e4b614e 35a4dba9 951a784e b9b3dc02 aa9d2bd2 df766571
+    4c859f08 c03e0054 a49dd7d6 26917e8c 8cddddfb bdfe53d2 0743284e 0259843c
+    c1843770 8ce2a9f4 d77c5d6c 6d2c0b7a 6770f967 0fb0bf58 07397d10 01540d0e
+    cf071ce4 88206e16 84a45496 b78a3e51 607ad8e0 f00a8199 093b63d3 92cdaa22
+    401f1aa7 e6794f0b 172841b2 bf73c24b f0aaa413 d9e64f8c 7e2994e6 9c84ae05
+    69261cb9 28e2f885 77ce60d2 17232263 9a16e4c4 f0ab91c1 a233ef19 790cd00d
+    d0610c57 ef9ebd1e 06268068 98b7b6a0 51d0950e d17cd28a b09c23a7 05778a5b
+    f0c7b179 264170c3 0c7dc319 bc3072d3 c31ec7c1 42f90004 4da31d22 8faa4e9d
+    c2acfa72 01bcd4a8 60b8fd20 b620fcd6 7a3713ad f1d73563 79de9ff7 3ea72c5d
+    77f63d56 64dfb0c6 743e6577 9797cb08 c6802e67 ed0651e0 dd798aba ea656939
+    b59a9bfc 51247288 fc0ba7fd 8287e6a4 ec89202d f370da7e a624eb87 43eb4336
+    3f58b203 72448d02 d0644687 1088aa96 5e787193 44808ce3 0ed17c74 8a636770
+    bea6e0ab 3c0e31bb 4add5ef2 bfeca391 cb707eea 158e3c03 9d2ca8e1 13c978e3
+    de4b80be 39904143 e5a6a703 606de9dc f8004aee 1d6d02ad 844d4a64 03440d90
+    6058f431 1f479cf4 f79d802b a38927f3 7bde54fc 25b59672 df69f792 ae5c9b19
+    d40c472e 428c4e95 20476579 f0313689
+h = bfccab8e 6326592b
+
+k = a0b28006 6874c116 63285570 b878f828
+m = e32709e0 b945a0de 84c5fe7b db321e55 d87b4a35 f5c6a988 7a86d7ee ad7e7ffb
+    f47929f1 9f343a34 82c41a58 4b601f86 ed113447 66774900 8f0a9ac6 3f1d4f84
+    eca7aa9a 564075cd 06b93909 d68c507c 42f96101 a8d4008a 98684cc8 84a34397
+    28ccd6ac 19d1d1ef d65875a0 f51b35c7 9e79d995 7dfac1b4 606794a6 e67a7cdf
+    ed3957cb 0ee2da50 8991d062 65a6a156 7ae71ac5 be6975cd 96c8f18c 9f1f06b1
+    bff67bee d680024c f2a43dc0 696fe76c b5e8b468 9878620b 8e7e54ab 3feb2833
+    03da7540 afc0e081 d42d4b33 0bf72374 03d1a11f 1d30503f 72082021 bc763111
+    34299ac0 210c3589 760159f8 72d42ad9 279ac176 c7e6130e 5e1a8fe3 ad0dd322
+    840cc096 84e48636 b11f5182 ff1094f0 a0eec189 ef584db3 084fd407 fb78ddd7
+    4f2cd149 18ce709c 6199fd1c 79072820 edcab089 6221b782 93338d39 f80a7576
+    3b8b2091 7705120f 6c29a24b 250dfb48 c1aca7e9 d17b706a a0b6c1cf 6afad942
+    b3f6f9ac bb4fa7ac 8cc7a74f f1ab1b0f 67d423a1 8265f0a9 1de07fb1 37529e27
+    c04e4dd2 de6c06c8 40c48285 ec5d72fe 2a91a9fd 07ef763f 3a48eb19 ebe8648c
+    3e14f7db 73710ce1 79cc894c 337c7282 2b967543 2861c09b b1fb64fc bf8e6ba7
+    39cd9cf9 98add6bd 896ca985 4496e5ae 87331e5f 8967db87 25e6d99d f070bc78
+    275f3d61 e0604c28 52025080 c88058ad 48068617 a7088c14 472e29d4 2e6c1662
+    2195951b 8d073b64 a5c3b77d e6cba8e1 a0e66d1d 57d482e5 2e7d1e0f 0c88beda
+    f1adf178 e778b124 dc0d5210 61549a83 a8a4e499 63d2cb0a 7e25f02f 37e3eaa4
+    c414813a c231eb9f 800a847e 2ec7e1a1 d95fe31e e1966810 4934dda6 22341695
+    083a7007 7a959535 3e90d7e1 78eaef6b 97b4b5e9 2da5b5e0 576452f8 cc9116a6
+    bbabb5bd 9381f6ce 9877ebaf 309d3ac3 71829297 4edf3511 a0afb485 42d4dafa
+    efbb98cc 602aebf4 5799f63e 4f573089 ece8e9dd 62282afe d21954ab 8f447022
+    a7bc1683 77f972ca b956bd58 7494a335 9683e5c4 226bf8a4 a2da0925 282e7ddf
+    faa01017 0ce353e2 87671700 5d732433 d19b29a9 384a395c 32b18a8c f976bf28
+    570e5cc5 b3422939 2e83c38c d0c1f607 850669e3 693c1e9b 581b0b37 8d655740
+    9c973eaf 0aa0931b e8260a76 bab85b9c cf9cf0de 57af8bff 2eb9271e 284dfdf1
+    9810c167 e9d83478 db351231 861f2aea f1f56364 b2047197 815ed528 cf9e9392
+    b119dcdc 0028e2f1 e4bfe8f5 d517b18e 7ca67944 ce87deaa 1c86a21d ed019825
+    ad41fa8b b3d9abff 46642adf f93042e9 fffcfa85 efdb078b 777b95c3 e80c35fb
+    e7b8cff6 60afe7b0 fedf5af4 723318d3 9e
+h = fa38aefc d87ed1f2
+
+k = cd26bb2a 6ab1e8af 493df859 a66ec3cd
+m = 4d61af52 cee8298e 894e0e16 a2d73e6d d201e79c e96e66a9 949e2838 8a07bcae
+    7c1237be 945abd1c f89ae463 d7011858 3e465bc6 55c623c4 86a0a56d df97de7a
+    88fe6f77 d4a25c9e 96afdd88 dcd090be b37e8d34 9a356906 2e99caaf 70b5a338
+    a470c839 b04d7581 04b34e7b 7f9ee5e3 ba919729 91e1fa11 38342602 e3db495d
+    fc7da96b f9f11411 6347b95d ec3dc8d6 7a03c7ae 0abe9f94 e83ae5ff 855b4020
+    eed555fc 45fbbfd8 93c3db6b af547d88 5054f690 2eecc09f bfcc1454 2735b7d8
+    c473ed19 a1579785 1421fa52 5f999926 65f93111 76aea23b e2e3dd8d 27eb6236
+    fe0ea79f ead25d73 fd51f177 2ef62f24 ece05dd5 560093aa 038b9465 d5829c81
+    8dd6ee33 30292fa5 ca3b96e3 56eabaa0 cfacf643 2bf1a665 41755430 2090c203
+    b05c9c8f 151f3903 16ff5c70 bb24e430 b4d3b868 20320b4a 0dff2a24 73eb3adb
+    e6a8e6ea 3c89bc74 7461d816 411b1cdc 9200f296 42b56724 5d13d8c7 3b649203
+    f923a449 a7837753 db065abe eb971b10 728bd792 d1f54827 d2ca420f b5855259
+    52f4630b 947f5996 320d05f1 e142109d 856d5b69 a59e6333 53f967f6 3b0f6e4a
+    cbadd47b ea141094 e123aae5 f85784f1 c9a904b1 478bac17 ed33f346 306bc090
+    1cd1bfa9 9cedb43a b3ac5220 bcecdec5 8b678776 39397aca e0788c67 d832955f
+    7aca0d4e afa95a67 47100909 da9bff3b 2971119f 08434a94 ada2bf06 13ad07fe
+    d7ab96b1 82d3a0fb 4ac4216b 1292e555 76ff177b 2bdad75d 1617cbca 33e180d6
+    8ee7b5ce b18158f5 c433c52c 5ad46b78 ba5d20bc 85d9bd0a 2b3ab05d 083b725a
+    4f6c2edc c4c2db70 9d0ca12a a003fe00 e9d54f9d 1e769401 38f5453e 29a78110
+    2bbfc439 9d130378 c331e1c0 9c9cb4ff 8eebd9a0 878e80d3 f857d417 f8310d99
+    399dcee6 da4e3ee3 589ed501 d406eaf3 b4f70a11 6c0ee51a f0310d42 f1a5f53d
+    8b30d630 77da8e8c 9302ee73 ce3da608 dfe3a2c4 51bc9ba5 c2ab5fc5 de297860
+    4a3f10b0 e272ebf3 604ef971 a415d74f 24d9d46b 6a9154e6 7566cfd6 47f1c39c
+    ea126f21 7e4597dc c57aef98 e3915c12 3972b33e ff78d541 b690b477 cd03b6dc
+    013a2dd5 50baf91b 9f34fe2e f93da74a f5f6c3fe a97594cc f1edda9e 51683de5
+    e14482f3 39e6310d 38378173 5352432f 66e015af 913cc865 928f0f7c 339642de
+    3e44f108 8268c612 b2d75094 f5be798d 6cee56cf 84d268ac 555740c3 275d332a
+    fc20f22f c705a0ab 1cf3e1f2 caf7e21a f651589e cc030d40 103fd20e 292cb8a9
+    56e90757 eb0e5ca1 2f70044c b5b88479 720a8e2f e9566b2e d64488f7 c391410e
+    42556395 be89bf74 8b57595e 3081e924 d0a9
+h = 3c16310d cda39f7c
+
+k = 5542e2f8 b1edcdbc cf3ccdb7 0b256e60
+m = f562dc6e ecfb85ae 66eb4266 b74404df fce92b93 3e9782d8 df5d61cb 6d6cc135
+    edadc69b 95fb20f0 591025c9 5b80e5fb e1130503 052c1c7e 112eea49 1cc221f4
+    f85ed730 76094204 5d3e7e3d 277763d1 43390c40 d158e746 ea825943 1477d26f
+    5541a623 25fffc80 e9cb910b ee2f3f42 7956330a 6ad3db27 13fb55ec f95465c0
+    5a9a3313 62661887 3f53267a e048fad6 05f3b669 f5c587b9 db00be3e 6c0e653d
+    298297fc 81e536a3 39930eab a1a0cd30 1d8f4812 5b96ef43 95e5387e cab39694
+    54ccf38e 0278ad39 cf521b7d 764c6c86 66bb66bf ceb86d6a 40f40d96 81f2a4e7
+    3504b211 7a319638 9328cb32 07b391d6 6eb5d586 9153b0f6 8c9366d6 4128a8d0
+    9879baa6 d68d438e 33ab4957 bc087c11 cc050a5d b3733035 3ceb928b 75e060c0
+    dc948d94 6966cb10 f9e58e11 c437d52a 3cb7bd32 45d80f5b 86d6f741 8ace383e
+    fed063b8 942e6569 ea113fe1 797c9214 f8a52d78 afaef04e cae5788f 3d68b0f8
+    be477ddf f2918d2d 8d0be99d cc4392cb 7ca85efe 13fe6c3a eafe33a1 a82275c8
+    7e3c5f04 725a19db 854c90ba da408298 9de2af6c 444511ba ccd010a1 fad1d78d
+    079c0823 ba8f58ff 25280c5b 5790e151 52381625 61ce0283 79d18145 87ffa33a
+    18d294c9 8e557319 c3d2b11d fa1e7dba 7e779c36 e8ccc28f 4ae61477 2432b7aa
+    2e050a74 612b7874 669e75ba b319e72f 63230641 1c92830d c2b27e74 45b3fe2d
+    fe3f5eb8 919b37bc 6e935b16 5883eed7 acefeeaa acc84a30 5d8a2733 a38c3b7c
+    2fac98de 7c7c63f9 2857f94a 72859bbf 6cde79cc a0fb6b53 e43ab569 18620fea
+    9c1144b6 ae4a0cd6 2251cf02 ffe4f68a 8348ab1d aa9c2610 b8ba2ea9 90b222c0
+    899b19f7 a19a6048 0dda3251 de332b80 5e61998c ee8d5a5c 920508c1 e5bf4168
+    cdc109aa 0a56b604 3f62c285 c05dbd1c 0d554b6e f4b4d6af 1ba4ff29 39cf86ff
+    176d5b51 8782e325 9ca2bd64 221e7772 63e6c98a f7333f0b bc822831 66f309fd
+    342a1ac1 ce1ea3d7 45883a77 bb3593bb 6a825cea 43ac858c eb7cb12b 073bc553
+    dfefda68 f4b833e6 3cdb88f1 071c56a6 60e8cd8f 5c0d983f 9d79131b aacbb2b8
+    d87793ff 4c52d731 bbf0dc83 58fa8a53 4def4d02 d1bdd38a d2e81212 e4a7cf32
+    f9438ad0 bd1aef7a 5680a9d4 ebbeb8d2 ceba9a27 ec11a653 2f8e6971 31a4d869
+    bcd5919d dc73bbd7 52aebca1 b0b17e3e b1bd071b d885ff94 0464f331 ab1a89f2
+    ba25ebfa 5299a3fa 541db1cd 9031cf50 70ad0dc3 999519c6 b3d0a242 4de415db
+    a57bac8f c316fb20 3272f164 a421d821 e715685f c56d426d 3c42d512 cea6d5e9
+    9a8a4269 cbef15c8 ab4400e5 429a03bd bbce9d
+h = ca8badc7 c125b54d
+
+k = 2949c375 f04b5901 a7de2aa0 7f09bed7
+m = 6bfe08b5 e08ff127 8e090d49 970d076b a4145170 4a13fcaf 7645df2c b01aed12
+    7bb622a8 7dd2803c 801026e1 17bbe42d 669f616e 0d00bc4a 723626aa 423d2c7c
+    afd91e44 f5bc20c5 8ec9be62 98b16dc0 056998e2 e6df5165 fa7663af 0b0623e5
+    d2a5401f 8fe8f920 b8879fd2 cf612032 f71b6afe cff44fa1 3e517b39 19c86fdb
+    d7121ffc 5af746f5 2d8a6a1e 3914ccb8 edb2ab6d 5db7811d 2265b8a2 0028749f
+    b61588b7 e5f8bd21 1dc30824 149757a9 3a744fc1 5f611378 2b6e852c 42c7a757
+    af275e78 ab3a2973 881e134f 0bd7b2b8 e54b5833 9f6a52f0 4692a43a b7c64062
+    a9c85762 fb8a212a cf399c26 3503fd87 49f500d5 b7b24aa6 4bd2b128 b2487c44
+    a4a316c0 ee03b26e 080d905a b4f0542f 1baea12c fa0b2655 5892eb78 cba7547c
+    c6cd5e99 0e1cfbcd 32ab2491 df52a288 762aab21 b15098af 9754e724 658644d0
+    bfbfa9ff 1349fe34 716c8b46 74425a49 cd04ac3d d4a13469 8dd00981 fa1f6d53
+    42d23066 6faeb35a 67b67a24 ed91250c ceb7baa3 c8040f7d 2d20799a 07beeaf4
+    abc008a2 447fe6e0 6893fa06 1228efdd 0c84cba7 1ea06339 6452dc32 8365953f
+    e3658087 4567da9c 1c0a4c3d f65e5c23 e1610d22 93c5d07b 13cbc411 828ad5a2
+    94f66b76 84482480 ee5dc618 c21f041a 427434a4 16cebfcb 54d2464f 928a9f71
+    a15036e2 492b74a7 91a2df62 bf12cbfe 981f8832 ae0cfb88 0fcc4301 e9f9678b
+    f1e4b6d9 3dc2e9b2 2510e732 e62921d7 cb00565d 087cc4b5 3abef081 bade6c09
+    6012bfd5 ec389c49 93780c6a 5a94604e 9cdec3d9 0dc26554 5396fdbb 5486240c
+    26c5d795 11e4f0b6 67ba6977 28ea6d46 86998c96 a26660e0 c3d2b53c 78ac8eb4
+    e8b8971e cbdee923 07b133c7 244f5271 34c3dc4c 0f4ac1e6 a87e8069 23fa1381
+    dead151f 2b111f70 b09adfb7 0e551b9b 6e70eddd cd8755dd bedc411a c5b39f3f
+    9b96464c d4e31338 3ffce056 bb166fdf 405e6f97 4b6ba791 f0484bc8 98c28276
+    183e4253 04bfad06 c28e1889 107c66f2 33dd1d30 73cdaf25 ee8ae862 935d3b6e
+    356c8aed 05f6786d 5122659b 4edd13a5 b150fb4b 6a0408d9 70aa2ddd 48379b33
+    371aed28 34b24339 a88b1a91 c81652f6 d0549a12 013939c6 f5a738b6 47a5f14f
+    6ffe521a 300a0b09 95eabf96 73edc643 edce75c0 3bed46dd bced62d5 e17cb35f
+    e503e1a1 17fb1d4d 2050773f 255231bf 7923e539 52f91121 99545fb8 3eb5b513
+    f1c14b46 2ecd2e5c 87225a59 9b759a5e 74bf2023 a19171ac 91e2fa21 0e1edb2d
+    b98b6cd5 fac8ecc0 0809cbe6 22602666 955d8866 76cd92f9 d82f688a 61185456
+    39effa98 d2bbe5cc 0e8e9930 f02ddf96 056f9dfe
+h = 950efceb 1f59ba80
+
+k = 5ddd2093 469bdd39 1d091b00 a7147545
+m = f349949f a48d6164 79276a88 aed3d6f8 fdf5265f e9f913c5 d2a48b6a 8bc59280
+    738e2278 bd42febe 975361e2 67aafcd2 aacf8cab 292b3b3b 832c7986 a01c684f
+    892de0b2 77349f50 343b7f10 197db325 70be1b92 b93b09ba 97cda949 f049bc05
+    0255de00 ec28b8f5 1ca3508d acf3de8e 2900f8a6 94c1095c 8bb4aa92 52e619a1
+    36f46049 dd71f7d6 efa66f1b fe155d4b 5242e26b 7e6821bc c8b94ef8 e6f03fcd
+    998a191b 81e5088c bf35b7df 1cbcd914 8f4b6047 19410ea4 1d902525 937679a1
+    ae695554 96b363bc 87674e4e a4fc6159 4485f30e a7b0df10 df097070 35e0b625
+    eec12992 11315f46 a1575152 77705712 d1d324ad 6af45217 38ba228a 0ff65937
+    6ec09189 798dcf91 529db27b 6745b5a8 8c397254 b0598647 dbee59be 29895107
+    3a580c70 d02054e7 989ac1fd f0ef6982 c668a5e9 6bc49f9f f4e033f5 b99f2dde
+    65377757 54d0a6eb e01226eb 6c0c6088 e565dc14 3d10ddb7 ba34f303 6e535ad8
+    17909d8c ac13067e 3df10f11 06022d7d 9716b67e ec06820c e1be17bf 2f7838df
+    c58a7e4b 82188158 4d35f60c 2bc2ffee 68cfb9b6 8dcc94d8 7c1fa352 6a1f4ed9
+    8fc311f6 ef39a2a1 9371ad8a 85168247 4dde6f22 9264d74a ff67b696 799b128d
+    0166afb2 634e4b9e 4f3fa204 5fb98630 5d604bdf 98f45e32 6564d467 0d8bb212
+    41fbf1d1 d07fabbd 76aa46b5 7e4fe02d 5efc199b f29a08d9 5b246da0 4534350f
+    7a3ac6e6 7acfbff8 b587aafe ac5272c9 c5d835a4 02efb5e4 735c378c e71dac57
+    50551792 3f21e6ae 12faaa45 671f8932 8c21ea32 96b4b545 b4f3bbf5 16a67eaf
+    9b7f4efd ebb12ff1 6650dc39 aa871595 31979221 c97045c1 76f0b15d 572c8840
+    b9ae2ec7 e3f1c175 36a80853 02fa8d9d a850a46d c8ca99dd e72ad450 cb1b76d3
+    dd2ab5dd 6428cc92 77bb68fb c098755c 29bca783 64de873e 17e5f54c cb84cb75
+    1150ad8c 613505da 927a5fe4 a4250a23 60f507a9 094d5358 6f841c61 f205fcc9
+    7fa9f6af 417a6b58 5cf3a8df 6218e84d d5bd55ba f5e97dcd c4a6104b 4e9b994f
+    77b37603 38aa8c6f dccdf9ca e2b6bf82 be029f22 2f64b5f4 52ae6f2a 15092fd5
+    6cba5564 d5c9e8e8 80ea7e28 b285bbf7 3c18704c ce77611a ea0b7d2e 29506437
+    2864aed8 5c647958 ef7b1fa7 6c27ee24 981e27cd 9887147c e61b8e90 2d55b539
+    ab3471ad a6ea9982 62691e5c 0a007989 93c20b77 6a4407e5 d4db9ed5 a4ff9867
+    c297f5a9 6df8232d 9a2f0953 f698eebe d764d15a d81a22d7 782de8bb 0312b76c
+    ba463689 4b8d396c 323f6ce2 64d284d8 c38c3972 57b014b0 8682bd71 33f8f45c
+    f31dd3ed 5737d0b1 50f5466d ccedc9f5 88a3738b 05
+h = 715cbd5c c253707f
+
+k = 24b8ab34 39b41b2b 5d512bf8 e30f75bd
+m = 925f630c 1b739305 50cbd0bf fa2e08a9 eed1f2af b435a08c a11cc998 0cb01119
+    e2592642 70ae3a2c e1a29491 bf0922e4 7cdaba60 f3e57214 5985d152 8afee584
+    ba8e5bc5 45830405 e58b80cf f0a44df0 fafe7406 d713dfcc 8ef50aad 3d7b12b6
+    44d766c0 c8874822 18df64db 429563c1 a4fa3744 838f6a75 5d89abc3 532a9323
+    704057bb f8e22830 cfc6a566 2f717e16 bc70d8f4 f963a3d6 9e182f79 3fe52756
+    d38c4df1 e4434f92 36623600 6bd88620 2988f5dc dc19643b 906af297 087aef15
+    1602ab84 4426fa6f ce9d567d 30c9a312 6d3977d2 1e40b55d 776b7cd4 d4e0c6ad
+    3695ae00 83f8aa3f f509bcd9 09e210b3 3a5aa83c 00cd17af 7032c62e 6e63d84c
+    309d7688 4e1d8367 63001a14 5ffbe398 d711f35a 1a77d12c 861a6898 935cb2b1
+    0960edda ffd88d8c 8d0653ee a56506d4 109bb7b1 ae3596ea d0bc3ada c7e20e80
+    7289cb9a c45e5cb1 63b1a61f 3f11179a d998fbfb 36542c2a 754374fd eebeb2f9
+    b60fff15 e39294ea 6bc8802b 2ea4b471 844d3298 3fddce33 7a31aa2a 0d5e9e58
+    131157f7 7594d4bf 618e7449 b4917bf1 796c2b95 f570c7ea ab4702ba 6c496236
+    519cbc77 e6413e47 eb52201f 63daef41 8211fd6a 3074bc5f 90649094 223f9ec7
+    94729fb0 e544a3a9 98040aec 2ae71764 24c1b7a4 e4d9f4f2 3aeaf7bd 69b579c4
+    0865512d 7b01f788 0960753b aa7bffc0 b839a86d 0962993e c766135f b2febfb9
+    76dbc525 d7343b18 5f66c3b6 82d8cce4 3df0b1ae 74199f80 50c6ca88 da3d55f1
+    1e99eaf6 5037bb03 ffe04f91 64242961 5019e04b e7506832 692a2dd9 65353680
+    3a1e0e85 528201cc 40793af3 978787fd 64d03557 d51258cb 870ecc09 2bd5efcd
+    a5d0d7d0 fd7e2abe c2bfb3a5 42956eaf eef9a8f4 95a2fc6e 064049b2 4835bd4c
+    26cc601d 45babed4 1d280510 e7a3c6b4 eda7c807 675436b0 a8663863 95c3dc54
+    36c6fb5d 38c9d0dc 49e1a6f5 8e2d8e39 0f3269d7 82eb36d1 10b45d8e 9655d9e5
+    57d7c410 a2e36838 e83454f4 0a32ba78 da41593f 88a28ce4 020c2280 2315230b
+    91f0ce47 8b07e074 cb8daec5 b58ef1b3 8eda0b98 bc27bb14 2eae2e43 3caae058
+    1797bbc3 e7b9d9db c61d3d1e 74e1b955 4856ed9e ac9c7057 45522d9a 17604f86
+    a07a8e65 9b03d179 f868ff9e f134a95c f9aeb30d 2148eade 4df375b9 c901f5ed
+    131c0470 bdea66a2 bbaa328c a86123b0 15ec4781 7a776a92 6e97472a 217dc467
+    66d74269 c80a5840 515f8a65 d1a910b6 8cae305d b8a3aa05 95be1f89 268db255
+    6e42841a 487d3199 f80e7e54 9cbfa556 87514c4f 3654ae7e b40776dc 2e442fa7
+    fd76c31c 8d84fc3f 49527dab 8adfd660 200c1b04 786b
+h = 682950ca a3913f86
+
+k = b8faa81a 25674734 fe1b616b 4e338bbb
+m = 07a7fe94 665bc274 6491a7f3 de6a4aeb 13205fb8 2321ee70 b3fb7b64 cee9973d
+    fb4a2504 57195497 f2dae455 db5a8dc6 3e1145b6 6967a357 f9f09158 40802c37
+    232cf6bd 8b0e9136 fcd964a3 aaff6943 71540565 a2897b00 cc19755a 443f3178
+    b94047d1 784a1992 e234da5b 2e478ea5 d77ff468 da511abe 787edef6 4589a99b
+    139d045a 7ce64450 f3067a80 936a63f2 3e41aa53 39c74e68 9d563fc6 f1acec11
+    91b0610d 66da67b9 3bf637bd 0d938b34 7b8c03da ab77408b b2c0340b 1b81cdaa
+    817b1bea 103a7683 b8a2b99e e49479d2 eb578425 f2c3a58e f0784bde 7ef980ec
+    88bb3cc6 044fe893 c94d5e08 e5011ea6 2655ff07 6db1ccfb 948202d4 9bc3da29
+    32418bf9 505ded31 2ce49120 07483ddc 1c2d9522 ecb6fb28 824f476d 040a34a7
+    92edd226 0743ba5a d2a0a4ff 3e6a1126 12201760 074c1d1e fbd3128f abf6782a
+    6fcd544b 7a19be1f 0b0a4cca a9e982cf 92edd78e d0cd192a 27be10bf 76390e02
+    847bded8 c3e31390 6028fa90 082966a6 5a437905 83ef6f1c 07cbac54 5b1ef111
+    819bd5d0 8f46a1a9 012d3806 4a87b143 1a05fd54 02064135 2bdb25d6 5b60d705
+    19711c57 f293767d 3e2c842e 97801a57 a716c642 fd88497e afdb986e ad1bd41c
+    ba0ded89 5df18123 b8f591c0 c32827e1 a1eebfad d0d8fc67 5e822687 b3b3ce66
+    592946c6 8388f408 d35e5f4f 71f87a9f 5fc7b7e5 1bfa05a5 2d4eeab5 8dc5d9bb
+    d5f1eca3 0a156838 1012b1ec 1bf3903c f13442ce 40c7ca9e 672fb680 b9981a1c
+    6abe5b1b f3dcc3ce 712e07f4 5f052707 d2085ece badf0b1b 324ebf29 fc23e8c9
+    65359610 734137c3 cecaad8f b2929646 3a85d80b 89c45137 d8ac9b40 8e855b20
+    495e2023 68e8401c 07d08b95 417bbd47 03c2ff58 800d2bbe 74c9e8f8 b9fbaad9
+    89510f4a c5432a97 e8621ef8 a8a8c815 755ab993 03666ba7 2ae5c05f 18648896
+    e654a6f8 79aa8da7 5084525f 62f78ef6 31335a21 4d4016db 088904cc 6540809b
+    b2b469b8 07df1a03 7372b034 08cb3c13 9480fde4 aa239f3b 8d04ba09 1f534a1f
+    6f3b6ae4 6c4023b0 e75527f6 41f50a52 fa51778f a2932d8e 0faa297d 3d091e5f
+    502dfb66 b71b65bc dd63ac52 88ec3896 ac1633c3 31a2e3f1 81e816dc 1d2e8342
+    c85ca2a8 ab247235 761945e8 0f996087 05da1a78 1bfe5502 6bc75651 f36cf52c
+    60e5dfbf e13fcea8 cefbd958 5afb302e 8f62c255 f0b5bb5e a8296e6f 679ca37c
+    43a3ef98 71908c2d debf0c1a 743ae709 21a22956 6d818c33 52a0d522 4af568be
+    31b1f468 f40f8d71 28ab8565 a9122bc0 37f81782 b3a5bd10 44f23a71 c7a541ac
+    b7d040af 58bdd430 cc743410 0814d4ed 48275c92 9ccdc1
+h = 405d8b5c 2a9ee29b
+
+k = 79beabd5 b0de4648 8fe9856a 2b3245a0
+m = 4967c2ea 3c42f85d 141bf4ce 4b867c33 1d93d7b7 c5eafa53 546f6485 a4937918
+    eae43e27 8abf48fc 624845f7 bd931284 4b66c9e0 f386c569 75ee0515 39e27339
+    77bd10a2 90c9d4d2 a391ac5e 01b1b06e e614cc60 bac73ca9 0ff11a73 426d744c
+    680dd6c5 6ef0f14a 2f0428ec 5d876b85 2814b87b c761062d 354fcfdb bfca92ea
+    08bc2bb3 1b2abecb 227be4b2 31c541e7 1c40f70b 7d2d8c1d cc3be377 76ea21af
+    f75736e4 8e7e2e4c 1ba8107d 9b1e2c7a e3c84d39 d5036f71 797d3351 c9716c64
+    034f7b40 83aff181 3efaae80 6946aa74 675742a6 bd219b8d 4b83db0f c126303a
+    cf9408b5 5c15b6f9 79bb307a f2913570 4894e0a2 e744ca10 d2da5761 ee65d17d
+    14dcfed8 95f79804 05a2786f 4d8e70fb baa6093f f9e6a87b f8be45de c7ed8eb6
+    0479fa78 4a94d171 012aa151 0b04af13 0f005e94 31a39cbb 5f6b0df7 c800ec4b
+    7e08c42c fb2aeebd f32bf58f d76ee9f6 31bef5b2 0e489b3d 9eeaee9a 74b4d957
+    c9ee1aa8 e6c2e084 dec89485 7000636d 0d41b894 2b77beb9 4d270d7c 05e56bb8
+    a68d3490 adeca645 be400515 8fdcb1d9 94fba7af d6de25a3 44ebde33 724aa7b5
+    47e3d05e 30fa3855 a564d7d2 8032da17 102e6755 16941596 06e1ea16 f666097c
+    0f4b8a03 75773a8f 58a7a584 50f9f73f 584f5a40 f5f97356 5eac6a39 753dc960
+    6eecab19 9fda0772 aa520889 b71d70c1 7719a9d1 e02832a5 ec8b39ac 31903b0f
+    097cb47a 0205a9c6 e9ca2648 5490dd5c 670de8fa ef471aab c47e5e08 001aa05c
+    21d3978f 0f40ce08 0f45e290 da0fce30 fb1e1082 1d523cb2 4bddfd8e 22f3a34b
+    dc8ad261 15030473 d930629e 4fe9d376 403ba701 f850a7ba 55db76c3 49fb62f6
+    9d67409c c98e99bb ff24b912 eb845e40 2e2d2f63 b33c8969 f54b3067 22baf412
+    17484cc3 7853fce9 02bf66a0 bd9fb384 ce70fedd 312c0921 038a4ad3 17dcd5d0
+    7ec98cf3 71d1125b caae6d12 d50eec78 595a4b24 ef161401 8579d746 89dd149b
+    7197a949 d863b185 2ee288f5 807f3792 7180e1c6 b9af9f44 c3db2230 bcd2b3d3
+    15fbec94 3fa19921 0d4e5d2a 3a146f5a 4262c16f 4887c669 464162de 65a03050
+    8b77d28a 42ff43bd 4ca56af4 14df8244 1d026815 9397ea2d 6791aa44 3f490885
+    1ff13d62 8d138056 c77cb163 8b861bbc a2d4317a b6db0e54 3e0204c8 b7210786
+    66bb65bf 838eac33 13dc8047 fcff50c0 bee595f6 8ad42155 4f84fa2f 212f9bb3
+    759b39c9 ed671b3b d8bbb832 8f2e8e56 a07b5060 5948a475 521ea76b 7bb84b0e
+    87d1b78e 725c283b 3db81d44 3a7320db fc1818da 2346f75d a6d0b3f6 648e3902
+    232327a2 99e06349 ddb35c37 7727b571 8a4bac80 02f4f861
+h = bac10399 6ad1ba8c
+
+k = 5ce3362f 3003b38c 93516b0f 9d4e2ee5
+m = c699e66b d72cc44a 06443d74 1c55ec76 7bee4100 05a50ec4 37a4bdc8 8d1e6246
+    0222d085 ba9b3b9a 3200ce17 7c463c6c 58c6a42a a563d4ea 8cd76648 c0c3d726
+    cba7a132 694cbcf3 194a8f20 4969146d cc212b13 7a46cc64 76a7adfe 73330704
+    44d81a90 d9383b48 58fb67a5 43410fe8 6282207f 353ac94f 6fe12a59 3e0ef4e2
+    5664c5e7 52e2342e 9bd4357d d563d6e5 649e0f28 a52c0caa a0d987ed f28ffab9
+    fc1e2412 d10b7fd8 e2a9ef63 bdc24e94 23cc05df df8c6fb9 c09e57b4 cd7ed15c
+    daea56e2 956ce356 dd30ee34 ed50cc30 58d226c5 8e5be8b2 597cc014 f1d5071a
+    fb780f72 bf2e06f0 54aa19a0 0f4d0465 c76585a1 d637b59c 2ef8b2a0 ece0e331
+    09634817 570daa3f 67846c20 9b60af39 e5113c9e 33b923ce 0fd24101 eeec9a0c
+    cbd75a49 d1e9a21a 3aa9fef8 616a192d 581ea286 56c1b97d 217b00e2 71e28e9e
+    cd735ecc e55473e4 ed796e38 b1b2fb1f 1065306d c681eaaf bb96aa27 827ba169
+    66515db4 0b4c48b3 b1e1b980 7569fbb2 eb55bb5d 3a8488ad 95e57400 f57a3b82
+    39f56d38 bda84f12 0e38c63c f5904672 4633a794 40874994 0530c0af e2b189d0
+    e46ebdf1 996dd4a1 12b9872f 7d0e7084 e6d598d6 3e40b542 5728de55 650b982a
+    10e947e6 ddf5202a 53e3d2a3 dcd334b0 4e32f9dd 931f9761 8e42a1af efd33acc
+    520ee01b 093e6db6 cfd598ec 4f4452b7 efc39285 1b0f556a ba038828 b8a418c7
+    94814985 5d22dc2a 7219cb08 b59ec257 df7162c3 c24b9f9a 46b02928 44854667
+    2898d76f 50fc8c6b 73c99514 9d298569 93bfb67c dcef1879 befdd41b 8c74b7a5
+    dc41c536 09827fe4 55e60746 ef4d6eb2 123ae680 429e62a2 294986c2 07701812
+    538aa2a3 33f2ffbb d699d7b8 9342fe87 291a1b63 d8d23d52 cf195e8e aff63bc4
+    666394b8 c708a63e 32b50b5c 023b8936 1de70069 85574079 7780fd29 e190c1f5
+    a4883429 c58142bd c4e6b79b 3ee5d0a9 fd1b3678 1b45d98a 7fa5eb5b 8305a4be
+    ba429169 ba561a65 59894424 0c4237e5 0f6b16d2 d9027a3e 3e51e82e 9c510632
+    60bc1b48 32647247 c1e0d9d1 18192763 5906adf9 eec5c4ec 4526abea 33d59bf5
+    deab3a11 8594f4f5 81503e7d f45f702d 711dcb73 698bfd1c 37a50f05 e02534db
+    c2746a11 a0a8634a 2476da8d 5547146b 09056917 736d0183 37ec0dfa cd058ff3
+    248b5fde 13c88e01 113377e5 b7f493ac f105980a e6e7de51 794ee1bd e980667e
+    77c7ca09 1828752f bb605145 bad138ff 7ceb9547 fa47a769 bb21a926 84e7bd4b
+    d661592d 5f8b2dd8 39593544 1f9f8f8c c29213fd c4bb08a0 ebf4e6e3 fb3d49a4
+    a97b70e1 98bfe9ec dce3be76 f4f828c8 0b49cc38 b08e3cac c0
+h = 039c6e19 b17e0c9b
+
+k = 37eb58de 6ae92817 35fa621e ec0a3b73
+m = e82801d9 e8e52930 4b24678c 504eeb60 1dd7556e 85192c91 acbe86d8 c75b8922
+    ad14b2a2 3fb45d01 b1dec551 82eaba52 fbcc1220 997ad9b6 848c3c3b 0f027064
+    bd1018ab 147a840d 4adbf50e 4a92aa4d 1c2a1664 391975f8 c96e2ed6 09759db3
+    99dd198b ab326c35 91c0ede8 b0e1021e 64741fd7 2081c168 4d0350a7 7246bfde
+    525c1b90 d1f13f97 cba7ae9b 3b62c6e5 269aa747 74d3fb4d 8db5c2a2 049dfc67
+    c63f730a 331462b9 59f262a9 ce55f88f 8ab4a744 81206275 cac0641b 12fb48dd
+    3ba9eada 6b080862 708eff9c b49a458c 278097cf 041be871 d5882af0 babefbd0
+    ea62786c b003748b 25c5e7ec 3b6b8612 c58a7ebe 82b727ce a63ba4f4 03c90213
+    6ad6ac31 27dc98e4 a4880520 1182c251 1fd7f75c e60cbe6e 7093006b b7dbc270
+    419397ae 99c5caa2 7d835da2 64a55bf6 280c2eac e603434c ed54a78a 4f3e04a5
+    a1c7b5d1 ede2446d 0da95760 9f6b08de df0277fe 221cc980 273c2224 186e9280
+    874dd847 78f31344 aed2f4c1 58458f2b 3fbef755 88f5ca80 92bb0662 6a97f52d
+    05a3954b 43d0ae0b 22956e1c 8eec2424 f452b2e6 24001dba 1ff41902 c552f45b
+    b78830bc 7ce99db4 7caee693 bab62c86 23c7d1ad 6da6107f bf982507 ef36a71a
+    eba4be18 3cc043de 6bef8ea0 13c0d5f2 1e7d5cb6 84f54152 377fe7b6 66156341
+    0ca30f44 5f06e57a 05492fb8 0a00460d 40d0822b 06e78b89 7f0a3feb d10ab3ac
+    2990cd7c b3006960 e3fe9848 60cc70e3 42589f0a 6d4318ae 19d69412 600942e7
+    9b1a4a12 be60639a de96a0bd 9ac35335 ba601a02 d310d492 0cb041e3 d3cf2b51
+    0e0002cb 8632b3ba 3e63e253 e4cd64de 18e08dd4 aad289a6 d79e0dff 26106c71
+    44705349 4845f3fe 1108e1c3 db306db5 2f06c783 7d993e8f f1ae4018 dc44c4e4
+    06a228b9 d79706a0 35fa97e1 4386fefa 14557486 e609e713 d32d2150 f172ffb8
+    c854f7bf a3031edb 2b8c1156 7237b7c3 f280b355 bb5a224b 45bacb52 6b21b372
+    403cb0aa 67da2dfb 07cdfee1 1eb7b4f1 9faf1f2c 6c1ada0c c90702ba c809a9f6
+    4ae7c483 e1d64215 aa2d79d5 fcf91b78 225885f4 9954f615 bfe2ebb9 f4fbb042
+    6821f0d4 862fc376 b630d541 bf187cf0 faa95df8 a5cb695c e7c365e8 6448206f
+    8c11c456 e7cf050d 4dd72350 6ee357fb 57c9c508 e84c2778 18ea9da7 4e59d4e2
+    1c0040d6 1c84a559 39d0bc4c 21fc36dd c7f4e3c4 a0386f2f 4a981671 aeddb5de
+    82da0954 08dad037 5263def2 b6aeeb6a cab28735 3df938af a63293c5 8eeb25ea
+    e04e205c 048b5002 61902e5a 1f5d6363 b5a3ff9f 46c2136c 4bf6df00 090e9fc4
+    493b92c0 ff4012b3 88d3da3c 94179fc4 32fae3a4 af16b077 0ea2
+h = 7a42b83d 5a6718ab
+
+k = 66ec3805 d293d2e4 d5cc4bbf de48698f
+m = ae4d3cf8 e2ef7ff9 efe8f31b 5d23e5f1 169d479a ecdf7da8 8f273774 f36b2d3e
+    544ac297 56bc699f 6d481593 8bca23f3 d142fc49 43ff84fb e344e4e6 21c14c4c
+    b1098e03 b472f26f 3fc7b318 f9bf586d 28482c7d 7f81dbf6 0ea4a46f b5c66954
+    c36b99f8 3e54d56f 0d8bc5da 2fce8d80 2cdfd6d8 d6c91d42 84801330 54aa6e60
+    61e5967e 90a61ccc e51401c4 a2a2a579 80365756 f467e272 a96c5839 4900d5d4
+    2eb7ca5a 89a4b5ce be6a0ae3 534bd1e6 e87a301d 4cb7a65d 747f0a71 aef6899e
+    bfc62848 4cbecfb8 cfde88a2 869d8790 0540e96a aad705df 4b7f258a db8afc79
+    4d7665d8 6e044315 e462c7d3 24acaca1 1c1eb82b e6aaa882 00e29fc3 e0b852cf
+    2d238dd5 cbec4119 2e4e101f db009ac8 7ee0b8f3 ca314ee0 d634cd08 24e70962
+    ac4491fe 1007e6bc 2285adf2 a73ef412 f1acbf25 edee3566 60e81c4f e15e593d
+    692dab11 671e0cd3 af32065a c05a3184 8abaee20 ebb9bc09 0d3a15e1 e0b14815
+    7a776be6 3b995f88 02c1cdff b6dd64b3 678a470b 591dae90 e678bc21 0f6e98a1
+    5d7d190d 98d12017 e26c8d8a 55c84a2f 7cc9d09f 6d8c74e8 03bf5614 a5a3f23d
+    9c27c732 b02daa52 335ee604 01c194e5 e4e1a437 03d72e6e fad14c4a 1f03acc5
+    f78bfb89 23d6e1ee 5c24b49e aaf66b0e aa744ddf 576ca3d2 0f9dc54f ec171261
+    993c02d5 2638e5a6 c0901f24 f230fb22 0c1c6c85 0726b536 573db907 dd838268
+    7ef17717 d1665edf 1e65702f 784f18ab edad3415 f5c2bc2a cb743b3b 95fbf250
+    a9c5a8aa 65886dc9 6540eb66 d2d3920f 03c3c085 7e7fd01c 397e1dbf 284d0dc8
+    e0a5a8f7 f9936505 01bb9258 9b95bfae 52060bd4 5ee4a536 c652b4b9 3c0f034c
+    fe0ebb95 e4539387 5c2a38a8 ee066f11 f030af74 8dab5355 86780991 e06664c2
+    332dc9f8 e5293ddb 6e1b6dfd 41f8687b e6aa9352 5134afa7 c36ac576 3de18ac8
+    950491a1 0724fc6a a4146fe9 cc77235c e05c1033 032d0df7 2e161fcd 0c472683
+    110ce884 64788122 7671429a a3c9f27a b252e732 d45bb893 42d287a6 f81c51ea
+    d896a821 51fa5a02 f40ccba6 a4bd9304 ffc0e6ce 9e33e161 62b2712f b7fd2a5e
+    a2fd62f0 72ab17e2 536e5938 8d4a1a85 22dc54ea bf0c2aa0 bb6bc512 284ab692
+    290c5485 5bbee391 1f645489 de09741c 2e3807d9 7919e20b 8e6bd46d 2109c8cb
+    1e8cdc7a 8c16dff4 6714a34b 41a55066 251c7619 e29989bb 71e6f79d d389df85
+    6ef756c5 e89632e0 acd2b51e 1f24912e 068fea59 f9ea0252 ad2841cc 75d52c19
+    5f96b157 c79fb5de 5ea8fef3 4823991e c52f708c 48f13819 4538d171 0826698d
+    a7abeffa 1bf02fb7 cd33df9d 9fb108f6 ada55b9b b9f68a58 ad93fc
+h = 6faba00f 24df4701
+
+k = beb581db 7234ff3b 79d62072 dac446cb
+m = 7d173fd9 ca368ff5 3b0a7036 87f16c66 31d7f9da 5fcd30dd f8b1667a b56c5cf5
+    f7916dad 19b3afde e64c51fc bdcd3ed1 2d2c5e89 c174cdc5 8d1426f6 55010042
+    00a1ed6e 995bdaad 9fc213aa 4a95fc46 f632a41f 1021e7cf 60322ad3 88a92f78
+    de1936e4 8ba0f9f9 c42f658e 172e2d55 7c979aa3 215f8e3e a33f7e5c e40b77ba
+    32ef590c b55097cd a1536d33 9e8e4a36 4506c7d0 e7e52ece 831ab210 036ad293
+    2383f862 b491f4b2 f24265dd c807ca5e 35168579 b219ee69 325aa978 9d428dc5
+    5b04140c 5791931b c60f9dd7 bbe56bf3 087d54de df360bfd 0d0c61ee 4962f2e3
+    e791b3f6 66572139 d900bca5 460deb8d 1b1f1ab3 55eab046 e1aa9696 4915b3b5
+    c3de7f0e 9d76f760 eeab5c1a 1fa557c6 a414a2e5 7fc65ac1 35a44b2e 5d7da18a
+    5d235b78 4904a58f f822fb1d 706d9b4f d18e9733 a0e246fd 607aeeec eb9f3f6f
+    8ebc4b4e 7d95bc65 a919ca10 d33f02f2 aacc19c6 0051b7f2 d162a540 c1bf077d
+    339da797 58f4f3a0 a6979f5c 5c2fcb4c 81da4040 4b7c46d0 102e805a b0e646d3
+    8789b147 6d19e46f e035cf50 f7c91b5c a7fa8757 70d9c42f cfaedbdc ea96c13a
+    ab75d373 2c505288 cee41e3b 5eca0646 3bec9d5e a9bf4d10 3e646ec6 63687500
+    dee2e274 c58b9bdd 11e80421 049ab083 b8742fec 5d36a488 a4420d90 630eb9ac
+    d9014f1d 5e9b5854 4b45f46d 75cc5bf9 6f6f6ee1 f254d22d aef2e360 fda5f4b6
+    7214cbfe 0149882b e8531fb0 361186fe 15f66ecb 4a0099a0 bafb0bf7 3e7c5865
+    0bbe1f1a a8082b8e c6b54ee7 e11fc220 aa0645d8 c18f7824 266b3e33 a5ab604f
+    a23c6855 c0996037 c28226bf 0faf8183 b3f2d677 0ec7508b f46d1e92 3b9a3551
+    01325efd 52592fcc 88b3e07b 1d8b73b3 7dd08cd7 8402b11c f21bcd1a b4c94726
+    622c306f 318846e8 9126047e 1ca7f8ec 0f0b1233 d62900a8 bea5267e 69ec9c56
+    1e0fadcb a20d0665 bc3ec688 9b1c8cef b172ef79 99653474 952fac7d 6fc24a06
+    c36b621a 96016822 46727231 a41dc292 0c748798 dd6c7244 c86527b7 80307d92
+    8dc43c01 468e8bdd 7188241c 794a294a faa78f35 d77a1caf 74152706 0ccd9c7c
+    d5a30a85 89f05d2a 56bac000 80d01904 de8c59a7 42026f9a 8b5deaa5 d0ef3fe1
+    4d9291eb 82c7f142 c4e67fec 5a7fbb21 1de05ef9 f2b91156 cf7aa517 bc19c615
+    a1714d23 6ef68f66 e54fd87f 31ddf39e 2f60eaea 4618340c 66d6673f a219b7e2
+    5bfb64c9 a5d84329 5900aad9 4d42747b bb64d473 c318a6fb cb0bfb01 d3129b21
+    65ce4290 3d7bc833 29ab803a e72b352a daeaae44 70ad1e37 c5c48744 46ab7427
+    7afb8aa2 725b4f78 03d6f47c ba33406f 3a0f6626 cfec8ab5 63dad71b
+h = a8f9ed4d 19ef1a6a
+
+k = 9ead1503 6b1f3bbd 60bbdd00 1060742d
+m = 3eddddd3 bff3de6b 12be92da faa9ad22 dd5a5795 051fe3f4 eb3a79a9 f9184542
+    a5ccce59 200d66b0 be8c637e 263153ad c177f4cc f252f7a2 850e3d23 3411cb5e
+    4dfd203e adb847c8 9e2bb4bb f7b6312c 0d2281b0 d98b337d f9d80f8f 1abcd0a8
+    11cf6d73 4612c9c8 a11f79f1 6269d807 6997a186 1d26e2f5 c3a3c0a5 338fc106
+    f42acfc8 310be713 571f7a52 095bb2c0 a25b49ad c9850342 6a7373e6 508e6703
+    c19f3506 d1319c28 d5cc16d3 a538e92a f4cfc5fa 8f7abfed 688ccf70 7638ec90
+    d84848c4 3deb2e4f ab087e95 8b454c2e 7045b459 8639bf48 f9f99f07 84300dd5
+    483b55e4 50090a27 96fb925a b2cdfc88 cbd4f7e0 e4e0359f b3c68648 aeab8004
+    a8ad231e 96cec6ed bd0b51bb b9ad0b99 924d0141 352d14bf 11f51528 69478049
+    5f8bd6dc 91ff858a d49d0e08 f63a925c e50e6e40 28b105d8 188618a8 54719280
+    59da3745 bdfac1fe a0c26e98 16a8eafd 53ce2ee6 74549062 406da65e aa98d379
+    6000982c 35106c21 7f416973 547ba436 b768d980 bc35aa45 ecd88030 fcf5017a
+    2f84be85 e3623c82 43ec8604 504e9028 6ca22aad 551f1fe7 5c039990 4ad195ae
+    0facaac7 c5582fe3 7ae8545a 36803179 de22152c 685aa25b 67475e90 2eaea8a7
+    7fc14d7c aaa530a0 16f2ac31 7798a92d 2156fbe8 16561772 1fe317d4 1efdb919
+    d6554dcc 5d898da2 59d8c04f 11f0dd8f 57c8d8c9 9e508e53 3bc212a4 dbbf7a91
+    b24f16ea d05aba29 138d2e49 f4a47151 009d2fcb 07d82a97 b311ffa7 01dcf4b5
+    7df8af8c cc463415 f541bcbe 111550d8 ff739327 d443eb72 4debe239 bdb0e507
+    b1c45193 a0674753 83644693 6b1b312f 92fa2db0 f11d32ba 5985846c 6c495f30
+    9a547c87 482b4c17 14f2a3d5 17dc0886 dc51bfac b0ba61db 2a52b394 bf94979b
+    365c6dd7 ee62fdd4 da70d8e7 cf3f1349 d2f4fe77 9604eda0 12f84bc3 40222f15
+    e2009117 4f8227c7 efbe8f9e e4229f10 7edd2ca0 d2ceebc2 4306efa8 bc4cd9c4
+    d3d3c9b0 7b7aeadc 9a694900 4c042eed 0cbe7413 0795f065 9c76704e 619161e3
+    400d8ef7 2aecb647 e0c5b8c0 65208587 e8802419 d65568cc 1aa8bfd0 19256949
+    987b51ff 74ff393a 8e562c8f 96ef9da1 0a3e1a4a 0ae3ec6b dbd321f9 471d69cd
+    de58705c ea26eee2 63e4f982 6d7a2caf 3ff367db 022fe8ea 1244b53e acf2ff40
+    c1312da3 48e20962 3ab9c3d1 37f08f16 08b8ebed 95624956 93cc9327 bd749372
+    e76a16d7 dc4cf7be 240e25a5 81219c59 98a841ca d4cf5c61 afd0c729 16533cfc
+    0563ae7b 08af6b66 90d82a32 6c8f881d cbde4888 1b924bdd 69ae6865 093ab75a
+    d5b55e78 cb189976 d0d1d59c c5c36b48 7183ef21 8820f52b 9cc6f9c8 7a
+h = cffed36b 06eaa7e5
+
+k = cdf15e89 12116813 3f36d069 d5192135
+m = 36c11e6b c7266d52 e26654b2 806a7cdb 462bb9e9 252b84d0 253024f0 29c4e0b3
+    75d0aa39 467bc50a f056b0ad 2f8fd1ca d951061a ddb19c54 95f2bfff 00cd64c4
+    9c74be6f 84fed783 bdbc57d2 6846aebb 7c8b52d3 4136263b 59a0b132 1b1e95d1
+    f3987256 fd78f7f2 0ce54765 78cd64d0 a4e74816 59bc8029 cb2811be 7207386a
+    9ff29a24 bdd4f490 0f7737d1 182559fd 80471046 26a800d5 0f578ffc a63b3176
+    1c235b7f 90cbc4af a9d51dcc 77624895 145530e1 44f75e4f af240c6d b4274f77
+    1cd8184e d9cc0c7c 9d4ba769 8d8db2fa ad590850 a05eea71 a52eb933 34bbb202
+    465aa31c 8c85c947 ab4bbf30 e707775f 00fdfbe5 e0df41c6 bdefbd13 d9058ea8
+    85476931 b215bafe 18ed38be 91826d33 8447de6f bc68abd9 66c7add6 6e5ec93f
+    2644d202 07a0b63a 9ac2382f f7381b86 767e480c 896900fb 9f99becd fa7afdd8
+    5d375709 bc9d9b40 41acf0cd af43c5a0 49e242e4 53d418b3 0752abf3 26980399
+    a4eed2cf d749f0e9 d24c2212 85859a1a 866dc110 4373a9bc 4c485d4e 8f701a3c
+    030658b0 6b8b726c 8e47084d 340b8934 1d4f1b8f 3d897bc4 db62c653 c658a8a1
+    c77de489 40c28bc6 48a52810 48d9c8a8 a821a5d4 a01ee4b5 549767d6 fb61ecc7
+    c5373901 d30f697a 2c6d5b12 54ef8685 39692920 f719bd44 f3ddb14c e57d783c
+    85a54934 586b2c31 c235a67e 9d10e6ba 4b40b9c4 45f2fb68 f24b10bf 7db4de49
+    57b905ab 01a2e7bf b3b89fce e5d83110 a042fd3f 7fe9ffa9 7f63d0b3 a459a782
+    ea967474 2402e180 63a768bd 301e97f5 a891ad69 37d29566 fc636bae 07d0d997
+    68131ce0 0d5617ff ec707a2e 7882cf81 648b34ea 339e8c05 2e2ce18b 60c9fd5f
+    8bba883e 584e808c b5f47a86 62b22200 cb623b6a 64599999 ac33a583 4242bffe
+    95a85611 3f2be500 aa78d15e 19a4f9db 91c3e3db 81049870 3b5a997a 4dbcce0f
+    18567ddf b498377f 858cce87 f6a2118e eefc099a d3527072 2a4beebc 9a87a00e
+    0edf25a6 f1a50bb9 f415502c e28943e7 90b703c9 16f8f985 6489a596 b54ecf31
+    12bf05a5 d0f3d8ef ef896d38 32f4c47f 728aa2a0 8abf59b3 268ab7d0 f8d99d62
+    7e6c156f bce90855 a3b9fd1c f027399f 03507210 79ca363f 5563497b 7e8f7f8a
+    de64014d 61433eb8 bf4ac0f8 cd4561e1 bc21f22f aa9c5a92 06f2da2e dca7a426
+    e185ef34 f4b08c07 d88a18fa 0df41bc4 7f2a6d0e 83e443af 505fe2af 65b68db2
+    687e89c7 2b77cac2 6e318c29 f304a139 b09744ec a2288dcd 940351be 26b2cbf9
+    4e70bbf4 46d862fb d7a65106 002a2543 c9962c60 03144cc5 7eb50a20 bba80926
+    e2a13710 268fe80c c1171d45 de81e634 fc17406f 204bf2ec 6eb20d03 a5fb
+h = d6737bba a7cd3f57
+
+k = 9dcefb28 15774041 1cbc959a b0fa311d
+m = ed1a23e4 60cc2def 39989297 aeb55c45 40c8f02f cc3642bf de013867 ffee9e92
+    5b5d05ea bb53e1b4 32ed9d8a d54c0398 8f8fbf10 ce3354c4 3d7c1248 05676dad
+    cb955f48 eb94767b be793172 a9d3a333 449679c8 50f1644e 3334bc0d cd0d9bd1
+    592120a4 47092fbb 8e0d2b77 eaf8fe4e 77e1f4b3 89e73912 b803a20b 9ff7d00a
+    42bd9d05 4e175857 ae247c18 8c41e958 56d79f38 da5d7271 cc1a197e dd92f18d
+    22603965 d62244fe c4ec21f5 99b51fb0 52a7b4c6 ee714c81 7c8a93cc c0dbc14e
+    3323e1d3 6a62fd2b 3e5a6093 00222733 3fe4ecb9 d7eca2d1 367d23a8 9f5c6898
+    c84a5389 77f63a62 ab9d459f f1134e9a 65023d25 4d27cec0 b18e4939 2f62f69d
+    53409f58 17324c5d 9d96b172 35d8f40b dec323d2 3fd6c459 2792536b f91f9e7f
+    dc97c6ee afc76e70 4ba11ec2 8fc78487 87825f23 dbaba24d 2d250afd b11abff6
+    cb2d8e3e b2fd3a0d 4e1cd94f fa0aa5cb e11ea3f9 621f9cf4 b785a051 008ee697
+    9d140489 4d922143 da191440 670b7d5c 9ce9e035 7786325f 26484c7d 510c2c9c
+    5f990778 aa3cfdc4 172ff6ba 696aa1b1 552df842 073f9ae0 cb5aa296 6cf420a8
+    d7bb7e26 ebcbc0e6 b84a08f7 66e35f7a 02ab2a88 6809f5e3 c4d3a183 09d52bd7
+    cc296344 296812b1 1b234431 1cdee1c2 0563af55 5d15ed34 01bb1171 0f176618
+    f1326810 39f07ccd a34af6f1 ea071bb2 9acaaffa 1effb8bf 989908a8 f77b06a4
+    ed349512 5bf68af3 7f0a43e1 6f0645c1 fc56ed97 f854007e a4125987 bb1ca493
+    9c5954aa a75150e8 18d6d329 16efc8bb 6c9b755f 135a95c8 ba65c490 6638ffed
+    140831a2 ce525b23 cf8c55f8 54f88c41 60b84791 6bd2b32c 8ad12528 97e54f66
+    966ef49c b3a2e9d1 b68dd93c 1e6f68e1 0138b148 9ce26611 ec77f09f 6559c939
+    041136d2 cf73d13b 5ca0d968 cbc94b5b 8a5ecc9c 751af262 0525034f 91996f1b
+    d9a202e6 957a20b9 98e1bcc2 d30b3893 3feeec9c 22512cb8 db6e5010 0d84077f
+    615695fc e1cab4ec 4c3193f7 a2d95713 2877b9c0 290f232a 035f488f d2443bb9
+    b28a5a2c af6bd3d4 57d8f56b d95ef871 0da8cf09 e715a2b7 b976490d f5d90ab3
+    4ce1f9c8 1022c41d 8b248483 b44be4a6 91e6e259 f535d571 0e6497d9 63146629
+    0b4d5ec3 1728bcba 8da6f041 367fb0a0 01b4f257 844d33ee 6acbcd2f ebcf9835
+    630e99f1 49017889 007617ea a2969ac4 c2b96635 11d6ce8f 1c151345 a73111bf
+    e093c5d3 895e9de2 bafa82d0 02952d54 c391bd05 25e018b5 301c8925 a5546ea3
+    f6bfbd91 9114c446 1823b2b8 555f00aa e91bc339 40966e45 eabebe76 cd1d6153
+    3979ed37 113a36cb 01e9712f cf4e16b5 38a08a8c b37f1ae3 b0bb65c9 85b54a
+h = 5d080146 f56b7bab
+
+k = a8881a87 fe36b82a a1176abe d078fa15
+m = 53f73187 12628d61 a7ef9314 24334334 f9d8ca9e 34b8cada 4c7a77e1 67670cca
+    7c4afd16 6d794e96 a187dfea 2e8b54ea 39136963 32881372 dc5ac768 545cdf9a
+    fc19b456 5817ffdd eeae2ac8 7ed488f0 da4ed925 fedd5f01 bef4a5eb bb606ce1
+    714874f9 525f8232 e7b9e932 475aa381 15070c11 3312d0d0 75cda1a9 bfce67aa
+    d05e25eb fed61b8f c4c8cb8e 7914a45e 8022f42a 1a8c0e74 188d7574 76dc511f
+    dcf98c39 051ddee0 3bc9feef 75d456c7 560576df e73b2826 1c4cf14d 7e570d19
+    0e726cfa 3a2bc1d9 4554ea1e 4d366f57 1d3a1632 3d22f058 9d4277e5 a69dd764
+    14d1f653 bc253caf 23b9f97a f27aa4c9 6cdbb2bd d3301935 c4b806e5 da2a007a
+    24fef779 8d3afffd 8c2bf970 3fdde21b f5de38ba 941bcd0d 8217801c b7bd1365
+    1dc9b785 ebd4f0ae 0b86b5a5 6c18afc5 a44e2cfa 3fc1566f 2bbce483 3b1e0f03
+    9eecfe2e 09a5dfe3 26510a38 b5a07d61 b1e168e2 c86bb646 9fdf6672 150ffb57
+    6add0cc5 b6d22eab 6d020be2 9e9bd639 55d1c56d a97385ed d9ce886f ddbec80b
+    898ac110 645cf644 144e34e9 83eee205 b9d31891 5c152abd aef12a3d faac75da
+    f22b1f0d a23b72e8 152c8b60 86082d7d e2ecc0c9 d367bc5f 705ff9a4 84239a82
+    e4cef65a fe7ac770 3df0d4da 13ed1a22 7a352ea1 21a8c1bb 6cd72460 182345ce
+    e2d95404 259f84df 583660c9 225a3145 581629b3 b16b40dc dc02a9fa 669bd273
+    6f03a634 8253a65f 3ce3ac8c 1d832291 f7d6f946 e4835094 6f0a34d3 91cef859
+    f4b5ea85 a85778fa 7e1c9716 6d87d4e9 921e46cd 8727ae07 3b352ea7 f8328de4
+    d631d1bb 700bba93 f51922c4 5bda9e7a 0e7d6c63 952c686f 220d024d be442f5f
+    ed93c087 6bb70d8d 02d875db 2dea8810 c509fb18 56f9cbef 90d8a5e3 e771ac9f
+    44fd70a4 cd9ea3a5 02b1de4b fa5c1d04 23d70f0e 1f37c6e2 537890b3 4d5c46f7
+    3d516089 73d5a3c8 82683ed2 573c4cd6 5f016497 c8645019 c3b63a2f 09b75673
+    b114adef 40ec7b67 c9fb6ede 02f3e3e0 dce5dd40 650ef490 e5dddb89 162b9760
+    62c3fa42 835af31c 80ee06be f94d6efb d4d2b013 f034e3c4 c5f80801 b203a5c5
+    aa48d1e2 ff5399fd 2afb1c63 f0eaffdb ce71d65f 11e1865b 0618ff53 0f7778ba
+    6a1cf2bc fe9cae35 48ff3f7f 08cd95aa 7912e680 d476304b c9b0afa2 8059f287
+    487052f6 b1627fa9 cc6c45dd 8fc205c7 519ec286 5bcc9383 b5bfee71 0620d995
+    0d7b6028 4d139ff6 44072568 22c3367c 255f281e 14546457 dab04335 cda6e430
+    e561dc6e 4a5056cc 7a31215d 0404e410 f863fc7f 645d5176 bf983f56 7b3ac14a
+    2cd8d52d da9f0ffd 268a450e 98d16abc 47f6e6c9 ec1a19fd fd06bb97 a1837ff1
+h = 1b5f6dd2 24028923
+
+k = 10b937e4 172db782 079fc769 27341e08
+m = 6856cd00 1c28fb09 010485fe e0ad6a8c f62b0dfc cf90fba1 1e28bf2b 910d0955
+    f510cf9a bb68cb15 19acbd65 ddd57091 19207547 cc855c02 f4979dbe a6457ea2
+    fc7e8551 40bc1bf8 123ce8a0 29dae775 a5fcfba7 907e0db8 c81fb54f b5b51b98
+    5cdd4288 77cc1eff aa5991ec 6fab93f7 ad330550 9270461b 88ab1768 d9321c75
+    f2f01692 3551fafa f6bd6108 7d38fc70 aabc00d5 c9a3ec70 4652e643 95826901
+    62a9b48e dc52cd29 3f149eab 929e1166 9514f78e b0978913 11ac3edd 81ca91d8
+    6b138091 714a2811 676b27a5 a5a7bc16 cc778b2b 344b4322 976b8c42 4c4efe3a
+    e7a45ba1 2e6b9ea0 24b90b3c 5d27679c a0f40ed1 2c2bbb6b a7f180f8 67e0ed1d
+    ed6edfc7 60e0bceb 46ca9f65 63833db2 da39f939 3f97d7af a002ee28 d5dcd4c2
+    d9ed1595 120d4f21 64a923c2 8d5d19d1 b3067e6f 5126282b 53a3371a 94385d70
+    07063a2b a7056f42 d7e7ad12 bc0554e6 7512cff5 20b8f133 e9e59807 df4d238d
+    c8abb7d8 d0fd7e2d be0dfed7 656c4fe7 fb33cfc7 6898b139 3ab68830 68e5836d
+    073ddddf 3f0c9e01 e10a9f50 1615f7e7 b6765d72 61c00b9b 330006a3 81687be7
+    0bc66394 e8673984 add1797a 563eef8b d9e9f306 96e1e577 b42c96cd e422036b
+    a9447ff5 8334c554 94276bed 2e99412c 79155299 4f1d2243 e6a82132 0aa7c1f1
+    80755173 aea721c8 2d5d97bc cd92ffe2 b5008282 0c365a30 92f91c6a 13101820
+    2a733642 e7e9adf3 8ea78133 44626b32 d29e0ed1 96b166d9 4b688202 8147251c
+    e9a078d7 1a796a9e 8c16af70 c65fd4e5 38991315 962caeff eab381f6 aab84581
+    49d89459 32674503 b94e1b45 d46c35e2 76010cfb 94a8c2c1 ecc5b38f 198a0185
+    8d59bcdc 5ae536dc 0a607db9 9c54db3a 98ef75ee 60c35e47 7a6ddd90 91ae8902
+    8d0959a2 8fa88605 bd3f9e90 838c6b0c 3e661ce2 c143ea88 753b6e53 84a0f8a9
+    9633be20 c903e4b4 4c67c644 437b7a95 0769eed4 efb8b53f 8c7b42b3 dc6bb9e5
+    3974131b dafe13fe 883a01e8 0e93112f 9dc95fd3 9ff0fc5d 8c6ec527 0de14d67
+    1344e5a6 04cc6467 d5e9f7d3 b8a9cb9e 85fc5e5f 2e561d85 e2a1621b c06eee5e
+    a12b8bb4 93ad1b10 59c19794 b123d48e 8ea584ee 88a843a8 5c7cbc24 b2ddd0f7
+    d955cd1d 83d8480a ff05577e d371282b cbbc62c6 98697171 62f8fc1a 2749ebb8
+    636d9ab9 bf4129b1 b46c8c7b 86c8a777 a4b0f587 6180c536 3bdbe6e0 7f5724a1
+    cf0f55de 8ed9f680 b8480fd9 b20703df 0e4384b8 05b5d72d 8ad10cb1 cf5d2067
+    88e1a891 d09ddc8c 62fd2188 df57019e 28fd6729 dfd1ade4 fe01fcaf a4e72fe1
+    26c76158 c80318a1 b2c4a253 3e5449ac dad77259 d56d55a6 72b76f6a 6be87f3b
+    7f
+h = d0479a3c b7630578
+
+k = c63a0f85 d7eb9602 74867e16 b2cfdf7c
+m = 0d51948c 39894818 73451789 297028c8 6c01b349 f44d54f0 e511f60f 4fcbfb77
+    2de99851 e24aef96 ea2616d8 86f2ec78 47865dcc 74ef4530 adca58ef d684a457
+    56fa45e5 7898bab6 7ae5883d 75d46ca5 52be2872 67829ccf 8ff182a9 979fe15b
+    3dba013c 2f7924a1 e6b10d39 db54280d 226bd435 2da5521c f123cb30 8dc8d68c
+    3325bfbb 30f064cd 7e390c2e 54efe699 89ea1582 831c0e66 289472e9 57de9e74
+    d51ed65f c0863b8e 1136f9b5 3356bdb6 0efa6419 a5a9c48d 720f45ec 9add086a
+    44be1244 a58abdb5 564bfe3a d759da75 5a85549d 2fe3b3d5 654821c7 40e8c20d
+    2e63d131 b8b5c742 9eae2dcf 415ad5a8 7823e84b 81f48a18 ce81f74c 289bdd61
+    e3a5e130 ba904287 83eb4b2c 62226992 4a8cfee7 b0f496df e9b3cfe0 2647ac18
+    970d7822 5743a655 0cf6d856 49e47758 6979c23f 0373f66d 6f31fda3 9e652b9f
+    19a44482 83844733 5f9f3c45 979fb717 96827183 451b4446 5ac80aec 5b8be3f6
+    a356df2c b621772f 5e2adddb 62d19218 282f5c0f 1287da97 623a324d d8ddb5be
+    246a5797 c2b7ce49 478f842d 97c62c46 26ce1cff e07006b7 6a0b2857 4f08b0db
+    f1fa421f d82435ec c28e5493 2f873179 5eedcc6b 7d36d2bc bf3dfbf2 cdc14740
+    2dcea371 890b2796 560b5991 a7565bf4 89cf2990 3cb79ef8 98e9c986 4b2be1b8
+    bccada17 1e966012 a3c2e2e2 7bf9d9aa 8ca9a5ae e672bb8a 354c1cf9 2c588c6f
+    cf8fa559 1ab361fc b35c89ce 78ad75a3 6ddb560a a1b16f4d fce1422c a81b4434
+    8f713e63 3cf00bcc 304e61ad 217d1f28 5efa34fc 447c13e3 f1d3413f 2df34a4d
+    7ab2dcd0 ecf40d52 8d89d6ab e8a3bd48 9b0805bc 4ad5cba0 4e2613de 9532217c
+    d56a0fb4 87ef6cc2 2e125a02 8c24f755 971f895e fc8e5ff5 d175cc51 65ea4d72
+    63e18345 1354dba5 1f75bd19 cf6af041 c7139dde 26112a9d d305ba43 7c6fb480
+    a4c373d4 0427291c 0659efa9 c5ce9d4f 27e923dc 900b5d5d b3c72fef 02e0f195
+    7e2e64e8 a5b015bd 91e54ee7 95cfe1af 64907395 99297007 58ae1d04 5695797c
+    c48053e8 3429f7e1 dbf0cb5e e684b918 bda100fa bfc40354 172169ad 71f4e652
+    113082d3 2ee29473 8e388c29 d0557c10 dfb57b37 764b0ff3 dab9a039 2abf9065
+    b7215013 988e2e7a 21c39ee8 5a6cb519 b1459e11 ca0a4263 f7ea7e9a 8dc5799c
+    9c399e1d 56490c4a ac2df96e 739dc25a 7f909f5d 1cb5c66e 0f0ccb4e b749407d
+    ea0c084e 1e65aaa6 152c67be f01f5f11 2117a281 345f50eb 2105ac02 b5eb98db
+    21244277 8dc7b051 b661b4ca 1cf8b5db a1d08e61 60db0e4c 388eed3a 35cf905d
+    30cd4eb0 39d99d35 2792c6a7 e6d2b392 3f8e22b5 51f126a6 922d5d46 96702daa
+    8cf3
+h = 93272f75 97fdc266
+
+k = b11aeb68 78fedc29 b1a84982 389cfa6d
+m = 6d4f491e e464e52a c02a6ad5 7b9d36e7 4d09aca5 e0c1a890 03e854d2 97c42f29
+    70283e6c e3231e46 102e851c 6706066a 590fd760 0971da57 01e5d58c 9d065a73
+    fd243e01 cf75a85a 59c00f7b c91efe5c f15e319b d49dea01 1de46c5b 1c717143
+    f5390604 320fb8cb e8cace50 39937c70 1893c006 e63b5f0a eb929b93 f10e196d
+    b23ab840 d48e646e 685326e1 ff50101b 0d8c9f81 da7ebbcd b00fa5ad 01c92b89
+    00236c0c e280240f 2cde640a bbb17925 1d3ddb3f cf09d1ca b987b6e5 0e975a98
+    1a142123 457f03d4 4fab29f4 5081cbf3 38ee75bd ed2690da 0a6ae76a 248f451d
+    f070ecf8 16edd56a 2c3d5ab3 6a0e23e4 c538b3d8 20316237 43f19892 6fa650d3
+    ad3862c4 35956907 1e6c667f 30de08fe 285fbb18 a489eba9 52e9fe20 3f5f460a
+    c9c8d247 957bcad5 59431e68 57d993a2 de17d849 67ded232 5acb2b35 a8562b9f
+    2fbf5fc9 e1c2323c e191c1cd 890de690 96f09575 a52d391a dba4b1fe de9c383c
+    3a2a031a 8978d279 dfcd0b3a 292928aa c428f13a 1c3df485 9400e87b 80fe3900
+    b7cb7662 0677aa50 cb6c18bd 3badb738 67c28855 ea169532 f474ea2a 9f150ec2
+    d70eb833 d8b65db0 85e1e1ba 0de8cc8a 5cf75b3f 20df6a76 3d142d67 b544565d
+    e758ff69 8033e011 393e19aa 5cbc8def 7cffc544 2195796d fbc4300a ffc76f9f
+    ceb74718 fac4012a b29c571c 14988883 2f4e50d8 62c011f7 0cc7ab10 6e51e9fb
+    19434c20 3e1411d7 8063168e b0e4f0ff 5e5215b7 f8b2c3ad 1d2d1366 3694c1f6
+    4ca1f655 b44fcd22 be61ca7f 72e53c42 675a8e0a efc1d098 388bd3d9 e9721e1a
+    ac49308c b831001c 3327c8b3 450ec330 8b338448 683dd120 47bf5d9d 516a4456
+    93b0a699 62cbecfe e624c1f1 165e032e 62effa13 61b2c4db 93577e8a 37d13960
+    9c5cbba6 c67dcb6b 1b673739 7141aea9 fc4d0dfe d4be2141 798d0b99 296d8903
+    59371e4d 300acd16 f6dfe6ec fd2c7c8b 190cb1a2 55dac3ce eb784adb d8039017
+    6604e63c b2f789ba ae4d60b5 cc77d620 4f440fdb 94b31220 418dac68 d796483c
+    3fc024ac bf9a40e4 93f7d374 a32d98ef 91b18bb6 a75f03d3 e644e954 9635ffff
+    d034ccf3 2762f949 c98525c6 603f1bc8 e896f3d5 00b306b8 a632619a ee6f13eb
+    007582f5 8b551d5f 89677087 bca91a5d 5ce29b66 1e51844d 13b8fa1b 22304712
+    1b0ec8e0 1503af6a 40a6ffbf 91af4f70 c35fe3bf 8b8ae75f 5c39c56c 770e479a
+    526422a8 90b0a341 1ee4c62d 7b2828d0 0b95bf97 424f3f40 f82ea4c5 8a70d885
+    1f976d48 5d5b36b6 4dfbea8c bd417de7 35dbb3ab 07961bd0 13eb2842 8f2e8ea6
+    a003ac2c c02a1783 90924d8a 103c7d79 04d1946b 84af7a83 f8d6354b 054ab4dc
+    243058
+h = ade0b0ed c73a19d6
+
+k = 710ec122 4721d660 abe2125e b06213ec
+m = fa8f3ece 4f1dc45c 15e69048 a87adcd5 7a2b0508 7e84b501 7ae1c440 3d349911
+    1422626b 3ce49997 0a31f4fe cbdd438e fd7bb727 1a875191 a3941162 496c77c8
+    6bf9abed a54d8872 5bcea28f 7a59f59b 0d3f6e14 cb2b3d76 cb2ad071 c5a943a8
+    04e510a1 4e9c0d9a 7c450f94 a2585054 26c0c65a 0f025a9d a82e3bcb c0a9e838
+    6062905d 3e58492d 43f7b362 432b60d2 f83e19f6 059286ac d4f4b206 ff9f449f
+    0b0c2ad0 efca66e2 22aac47e 0b91e62b ccc4f3bb 34e60a31 5c971fdc 0f1adbc7
+    57039668 7b9b5478 89535b6b 6da81cee 22025706 f782c42a 33cae676 070c05f8
+    81136325 4fc798b2 49d021df 53bced4d cb23be6a b136dba6 1b6a0986 431abc82
+    c43810c3 bd51aeb1 0d515379 0f7dfae5 5e72874d 530571ff d5ea0546 eefa0908
+    bfd4b507 48ab314e 132f01b7 ba9d0f82 5d4b8b9d c295c73b efe70abb 42521097
+    1378fc48 a2e0956d ec31a279 d6cc33ac 49eafdd5 b76d0f1c 94f449c0 17d8d569
+    093d2b39 436f0bc3 190b96e5 4bc08dca aae496b3 1e8c6c42 d4004b82 c4efafe4
+    713445ba 0fa510fb db688c61 9638def8 a198c057 5f3c8945 b9c4ed0f 2f23b80e
+    af68618b 210108e0 091e6135 abf8dce7 2600d638 04f78cb8 1f0f8b98 3166a839
+    1c06437f 3d659fc2 c8a27257 3d672332 947b3cf5 22433280 4bcf9e05 59e32d71
+    0c703751 f2335962 6b1b77c6 28c144af 7dc3f7b7 5e41c263 74256aeb 801cfa61
+    79d043c2 4b711a28 8a0ca3ee e7634ea3 b3bb6abf 7c21817b 860992db c503533e
+    777071de db225419 e0d78387 b253c622 3c856863 87e30542 cf29bb9f f7393ae3
+    9ed6d2ca 95e692e2 30add937 b39fb3d9 500beeba 665dab50 709b09d8 91c5a5ea
+    571c373e 551dfd44 364fdfdc 05989ef3 ad1e47ee 65d70b8e 8b99042a d3234fb6
+    c4105a1a 8d9ad17f 8cb3b097 4896bd95 87e738e6 73d499fa ab7bd1b4 b6e37616
+    0abcd274 992305fb db79e125 dcaaaf0f 85300630 015de5e6 f82df57e d8156ac1
+    6ab998b1 06f365f0 fb74c977 4523374e be0b5486 c53c1a08 d6e9f682 46e06b41
+    17c006fc dfcb89dd 842eb969 8d0fbc3b 5dc5d922 85f16f89 4eda6fc8 4eecb40a
+    fcb4c645 c2d5db83 176637dd f0333455 a36ce123 235de9bd f555a045 f54da371
+    cb201f3b 9b43b117 be122ade 3dc31428 3a8c653d 58306381 03874739 e9b10b4e
+    4656adef 129e52ae 78b0cb98 1ba7fd1b 17e6dedc bd44c2e0 654cf408 08fa67db
+    be7eaf1d 270dd1d5 e6a0e7e9 87219bd9 013062ad d7255614 1549aadb 944b4fc5
+    28540a1b 71804b17 757089b4 0c05b31a e355d7db 5dd3bb49 dcc191a3 56018359
+    3fba5015 79677ec1 cb917006 5e03aaf2 b4a967be 7f62d4b9 0b322d20 44ddcc03
+    f1ab77e3
+h = 092f9e47 8ea30d98
+
+k = c8b60c7d 7114fc6b e4f16238 fd6368cd
+m = d31ba385 ba5c60ac 88a72a88 8ba5d1e2 938636d6 202e9dea 5b9750ae b2fa85d2
+    05cc36de 650984d1 057799fd acbf5f41 ca867075 1bb07b10 88e94a33 4f7e18e4
+    59f6b7ce 8693245b 835663c2 d1dc77af b9b697ac 0000d10c bdb5429d 6da24d4d
+    b3ba2294 ece062e5 85c867cf f66ff8b5 e1fad47c 1ac4294f 5f6e4b34 28d3bfe4
+    53b55d56 50b9d37d bc3b1807 2e6f8ed4 4263d624 bb32820f 6f27ff7a 7798fc0e
+    c7ba6818 dd25792c 2d8199cf d4009e37 fbbd8149 212ce9c8 fa4ab8a4 4c9527b4
+    980dc781 5ae27af6 74d5b97e d9c2d3cb a56aa75b a3add811 5db85313 7df93b2f
+    abdd9eca 3feab29f 63912131 520b5b89 dbc1a422 cf310f73 5e6a1787 e85006f1
+    d991a730 dbdeb100 3be9f89f 94392c58 deafe606 05300d8d 519709f4 b1e6d7c0
+    8389110b 40b1f198 4a2dd301 d0f13e33 0741312f c0d004d5 c5189761 498d975f
+    4ee63c50 4df81d77 3cff6a6a 7a3ac67b 7a4d7a1c 6c9ea1e7 2392c4b2 9a0ff8d4
+    a07f0150 4aeb576a fd9c5505 4b5a8767 abf81a05 4507c79e ca5b8080 50865da8
+    2bdddc69 8703a4d1 b2f62e3a 05db7a28 86dbdc50 7e1c314c bec81900 83565571
+    ca436ceb 55469308 32ccccd3 e74a7b7e 5dd47adb 31e98159 07897ed1 46fe7e2c
+    cef37221 2d154eb0 f5417be3 27359b27 4bbbb949 6172b108 ff786da7 73876f5f
+    140e303a f77c1449 a55e5fea d76664f6 4c2eabde 8c1e00ad 330def0f 94a90280
+    3833c244 49b89bd4 ed3ba0b0 a21cfbb2 3e5884ca f0ff73ec cf2708a6 60d2838b
+    68b1328d 16c75172 f9f0f285 bd99e6c3 44f8380f 2ae2c2f8 41369578 4cf12c7a
+    b22f29d9 8ebfeb65 02e94c27 af81cd5b d55679c5 c37b5560 451257c5 c5a671ae
+    3285e5cd 8af5ef43 e72e815c 5a515f86 0fce0587 4812ed5e 2d41e6f4 3d2ef6d1
+    9e9343bf a4718523 f702872e b208f632 0ec1dcac 5e11c4a1 857810b3 92b07ca9
+    96385af0 fa9e2bb6 39ef6c78 80cfeb7f 8c8dfa11 89f82bc3 83affbaa bb4ff9fa
+    ba85f57b d3aae0ee f0557b64 30d7e8c5 823ea94c 57456031 03e4e6f4 4e731a8c
+    6cf5b097 328099fb 6e9ad251 8a127859 c0a56905 75c41dcc 3b6b7732 e8cb3624
+    f13bc7c4 e1f35edd 8590731b e0f77725 33a9d28c bfab1d10 23fbe575 115e138b
+    bcec4806 d9cec4ec e2452dc1 a4dee956 60c7063d a1a818eb cca20751 2fb74b0a
+    9c5401a1 f5858c91 fd9542de 56efdcf2 bf9911e7 c15785e6 7d5a9ba6 4350e507
+    3e24dab9 4fa611eb f8ff55bb 0dceb519 22d71b86 1599b511 50554c84 de199838
+    c542fe00 af0cf527 91552a55 ad45e8f9 cd82a44e c9758171 5738da5f 7a694a4a
+    e19785f1 474443fc 638373f3 fd38a38f 4952a09b 286d041c 532c1cee 97e6d8bd
+    a7cda060 88
+h = 5df61826 add87013
+
+k = d26992ac fc0d4b23 98c63b77 ffc6a80f
+m = d5bdf8c8 f673ae74 4e6d7e1a 415373cd 68eed8f8 3ef20cbc d69c4da0 84b7b9ac
+    3f60bcf5 7d5cd107 8a19d40f 4e63bc8e 22867a3d b6f89a06 39a6cfa0 b10a5d02
+    273da1c3 a18b09d8 c555163e 875ab437 0b19237e e02a701a cf5e33e9 e23fc818
+    ffcf51a0 a6c80d3f 486fc14d 063a811d c9d00194 4337f2fa 2c65c40f 20a29b2d
+    b4e16654 322bb309 34b75b57 7eb23fcd acf84f1e 6cf7f7ad c601ffb6 91088ca7
+    a13be684 f485d761 855e3179 40ecda21 d5fbc3cc 3dd9231e 1c5a9abe eff1594d
+    cf2b6880 49f9ac05 78f86ae6 1f33d448 2d56f6ec f060a600 2e9b61e1 f2efd5a5
+    b3a475aa 0d4225d6 9f21ac1d 17ecfb0f 0f3aeeac 7aff54c3 eadf7445 11c77c3b
+    ecd7140c 196ab4c7 63d1f209 01e6d48f fecd084a ddbe69d6 9592c5fd a950f420
+    60cbdf84 18d0407f ff55d542 79c829c5 0d9e7b46 b7fc9e3a 552b7b3b ffda87ed
+    1324c66c 549d3152 a5c7c719 308dd0b4 00e82da0 55ae64df 0a7ea904 e9b82703
+    0a8f5cd5 974aa638 0f5dacac 8ebddc70 57ba1207 e98342f9 53763147 d3823bff
+    5da6fb7b b6a319f1 1e7806ca 6a288c4f c9ef44a5 fdf8dbf0 6f9f2dc8 63bc1cf4
+    56621cbb 1edef8a3 eed8779d 794b9306 0afe52dc ad69ffa7 f1e48c55 391754d6
+    8e3181bc 59af732f 5543697b 95d4e6d2 eec944b0 0548f9d7 55900166 0917b02b
+    d515ac58 3ccf17cc 77fdb20f 3706e33a 3705163a ae089bc2 c88016df 6fcb0c5c
+    ba148310 b43f6c3e b225e878 d76ef149 bdc7ce99 a097a5d1 0eaff050 de6af4e0
+    4c784ab3 b72e1147 42e1865e 7dcfd441 1a427b89 f6ab5ed8 5f5f443f b185609e
+    af3f8865 aad2530f ba6d0902 3b8e1bd2 7cabd172 aed08c3f 7ff696ea 35d78481
+    d088cdda e18bbbef c50ab322 dd4e5906 e8ec19af 090931ac 46cc9d70 1708ebb1
+    087c39f9 08c943fe 7c2e2bf0 e565012c 9f3fe181 627710e1 129ed530 6ed2fc4f
+    0575526b 9e1d78ab 9bc26f8b 90d99bb2 4ce85d99 18f7db85 ddee2720 d9d4b40e
+    2b4e961a 65574943 5f47b2c0 206788c4 a8d6f1af aecc9f54 270154db 71bd1f1c
+    9439d973 7149d38e f97e2587 f4598a3d e0534198 c8f52283 2679c255 44466116
+    5b3de9be 40781964 6754447b 1144a881 5cd18756 c0cfb137 78ae32cf b468ed97
+    147a7611 2a32031e 6aa28127 9a0c6e74 c480e220 396ae030 f07a7e68 33b5c1f7
+    e74d42f5 553732f2 13e23998 08a2e367 60ba37ff d1479132 e34a5070 7970a982
+    30658733 71fc6b41 6cfc77aa c7416b74 b4afbef2 334f85e0 4c9823da aef8b75a
+    bb47e917 45f39ac6 3a3c981b 60422d46 570771f3 aac76f8f e3a60003 b0bb6e29
+    5504a0c2 1312fd50 8fdba5ab 4667a826 0edc7803 bc4f494a 2dd7c852 b742ef91
+    2921e3f4 0314
+h = dd90a06c 57d43645
+
+k = 8db1d2a1 622970f7 4bd6bde3 da9c3fee
+m = 919bc93a 11aec6b4 7f92183b 11002263 819d2588 9b40c7c1 b3b72df2 0a507786
+    ffc29564 69eb6ff3 6a9498e9 c94a4bcd 6227253c 2f5060f9 fced3867 15a27239
+    58d04b8c 6fb8b4cb 59ac6f5d 6d55423a 5cc44fc3 63499638 ac101867 1d9ccf51
+    e66d72be 36015171 af2b6f11 e6252443 85bc8a1a b211523f 9baab3d2 04968547
+    771fa49d c6f562fc 987c62fd f9f8aa9f ff40ae64 cf676fce e9735e10 a1a3cf2e
+    3329f236 c38d7c59 8dc567f7 8a464e1c c76cecc8 6d504200 063de8a7 f08c8655
+    464a5d12 6e6cd402 8024f6cc 6e3212fa 0af92ecf 5273225b 4cda9eb1 5154cd5c
+    e634f472 dde6bd02 7a103ac6 93e0b9b8 4aec208d d2a488e2 c6b75133 b97509a4
+    e3059544 0e746b85 99cfb564 7ba54652 e4ee8d9a f46bcb01 6894a3b0 aa8dcdc1
+    b1b7cfe9 49eb8d3d 3b10b6aa 8c3ac22b de0bbe96 49b95be3 39f6ad8c 72c35993
+    174618dd 49c78366 deff2519 da8fee38 877860e9 0114970f 74965332 f58229e5
+    22b4c2a7 8ed3faa4 523943fd aa136f7b 1368f315 6da4e69f 4653d2f1 bbca3b47
+    edeb47e3 83104c80 892611a5 82580506 e0d8f842 6cb2fa26 20010d58 47815f23
+    2d004044 3554972b 56c4d73f ccb13039 ca06e994 f7be0096 37fc5386 66c2d1d6
+    8a2a7e0a 52cdb239 0cad387b 93ec35a2 15a10749 189076aa 12a0cd95 86119d29
+    e494762d b9d2f92c 4dd2a93e 68b0b815 671240a8 0980f172 90e82a47 8a49317e
+    9b7ca379 fe94a795 6ebdf3f0 75b751ad 22bae228 9cbd9012 ca7deaa6 7282583c
+    99a9672f 6aff4e75 ee75fa98 c9512465 c522bd55 4f4a46d1 fe9dc335 9f5f4df0
+    b9ed199a 6dc6bfb0 296b65e8 43207f78 63a3f487 9096716c f9d4cd99 629aef9a
+    ed694047 bb287f50 3566ca46 d063486c 567c3775 418d4045 a1b4f0dd 3c0add9f
+    4b534b45 8ea25182 f6155ce4 cf74c112 0caac0f7 37f733af 0e742406 eb0291f7
+    05d9e3c5 9d7889c4 ca6cc0e4 d73df189 e045af47 576aee90 09b1c7de 401d2a63
+    7cd6df30 0daffb1f a5c0bfa3 4d61fcac b2ca9261 3db54924 3dead6fa 630cf22e
+    32dc22b4 1446fc04 09f1638a 7d0e39d9 0e9ba29b 66e71134 529cb173 07774074
+    beea78f0 069c5ecb 887cc81f a5eba4e3 2f475170 f468a356 73a2e0f1 bede6e8e
+    1c1f9e59 c19d8a34 c03f121d 806a527c d154d645 a7a82cbf 9980295c f5162c51
+    f340ffa3 07171994 ca4bbb6b 9c91d176 5d18cef5 686fd50c b5a5bb62 8827810f
+    fe7cc9c7 56b3611d 5f60b3d1 4fe143ac 66efcfd6 532050cb 3162c6c0 dcdd7b7c
+    be134588 f2d3df0a 49564a64 b3b755af 36d50e12 3c2686d7 48d1ad3a 21ee4372
+    3707aeaa 7016fdc1 3322be01 24cf913e 6c1d4261 ddad70c9 e7b48f6b d977f229
+    30807b4e 2d6f3d
+h = 529d5829 3453a076
+
+k = f3fc0028 bed1cadd 788435c0 f5a1f87a
+m = d20fadc4 ce5f065f 00d892a2 b9a33e5f 460c5052 beeeff04 67af7fb3 640df92b
+    004a82e6 c2be5ee8 4cb3fe52 afcc853c 2a441730 8579b76f 390894df 4574abd8
+    43aec716 c8ee9a5c a6d4cbed 2fd5b43e 2056a0fe 6e6e6956 891b2768 cbe4a581
+    2bc5dc94 f4690087 5a27198e c96f9e25 7cd311f1 a9665997 e999107d 12373d0d
+    ce67cfd2 39ea12ab 7c05539d 7a229a48 272badf2 4f00001b 47c1aae8 74cff6e4
+    c3bc84ef a33c2ed8 e390f307 0f15c8a6 a44a38b3 dba77c42 5bde502e 87323f8a
+    61974bdd 3953593c 454d09da 37db6d35 da5c8411 03a3193b d3045ae0 3893576d
+    c16b8a02 50025041 fa2cf65f 8a7fbe3d 9ab4b1db 9a4bbb47 4c1edbf6 cbb38af1
+    c3af1fde 107a8377 e1be462c 4bbb042a 73310628 0a4846a0 585b2dc4 71078c56
+    ee114521 3960a22c 3d63bb23 b6c4dc96 fce886d7 108f0189 86bbf5d9 abd55071
+    2f322f24 1844a795 5fed270a 5d6a6110 782b582e 3751af7d 229a8be8 9f2af6e3
+    7b6e0034 9cfd460e 4ed8b39f a23e141d 659fbae8 9e1c8ad5 d61ad5d2 514755cb
+    189763d7 954312d9 244df467 fc81bf46 17067350 df418a8d d053ca4e 71b3baf6
+    88861e67 deb62d68 7284cff8 f2b4b585 b00a23f2 18d7e016 f775a60d 26bc4865
+    58e3f33c 7a1f80ba e1a64355 efd0e10b 5ccc8f77 7441f52d e0a52bea 6d122d2a
+    09785325 d322ffe4 b1aa6c6f 64acdccb fd3b0cba 64976137 d131e301 262b6cce
+    7aa9703a ffe5c9a7 7d42acf3 7e4960a1 eb806359 92c2b30a 364b7580 beb0be50
+    fb896de5 c6560dc0 dbcb17b6 2fbdfba0 31685046 7b793bb7 1108dcd2 102671f5
+    73e42340 90e9b590 3d29771a 53b42bed 46d42c25 6991d50e 52530692 25c77b35
+    f791986d b6ec2345 43f64a9f debf8b18 628f3845 0d789e35 049db0b8 f9ea642b
+    87a0b1a7 d50140e7 a0c92989 21389b9b a9c95b16 c9a9739e 2918f0ba 7a79ab46
+    40547953 351baa06 c40b4deb 16984727 b6307708 ee7cbf95 fde62e56 dfe40345
+    0c4518d3 8c6b2fee bbb94c3c a5900d19 667d41cb e737bdcd 9a72e6c8 12ab4b17
+    1d33a4ba be266448 8b311568 eec360ff e2cc42eb 6938b3d1 2cf9be9b ecb17186
+    9fd7732f 3d7b4404 ef906862 bbdbb6b8 ce907ca8 914db85e 0ea7164a c33b71c7
+    a1d82ec0 c79892ce 404c9a97 626f72ab c9f5bcb5 70916d40 5690088f 6a75be89
+    8f940ad8 04f41115 ab62578a ab249f27 55c5cbf0 4487fde7 bba1ede1 cad0e57e
+    03cdc2eb e44da0ff 8fc87850 4fc721bf d9533c0f c25652ad dcf53624 41159f59
+    844ae4bf 0ca63e7d d1793706 549ca09d 15a9a363 3dad7b9a d710303d 83bd764d
+    ae13aa3c 59c7dc82 2dd0d195 2fe52087 8c704b9b ccc66c93 b5070424 0eaa6f0a
+    1efd84d7 1df97906
+h = 3326d137 540ef0d3
+
+k = f368f8b1 5db7e4e1 45d53fea b30836bb
+m = 6eca8320 85705e37 5b570832 0468b7d8 90965ebb 3b27cd32 5ad8bc69 047350aa
+    73fc5e1b 08f496e7 11af2284 b99c19fa 501ff9a2 52f98452 8693d7e7 b6db7d71
+    d2630808 44b8848c 9ba5891b afb38fde 1037931d b263d249 49bfbf2e be0591e1
+    699dbdb5 e614a653 8f7320d4 314a045a a8792e3a 2c5c2286 f65f7025 4380bcc4
+    4068d17f 9ef1b929 cf7872f8 80d60926 a3cf427c 8694b896 15c22360 b10f0b15
+    d619d65f 2a49d7b1 c8dadc30 8d3589be 183dd516 35d30adf 79b4bb5e 54b0090a
+    76769fbd 406a89c6 29d6ff5c b07bdd07 5a6f90b3 c003d5cc c9901f7d a3c93755
+    9cd0992d 3b38df37 611e15c9 20f8240f 20e67b8f 5cf5feda a59e02a8 b641897b
+    ac874f8b d31fd611 bb383ec7 dd2ad729 cc44c150 41224783 5631fef8 32b26505
+    f4023d6e c4d7f1b4 4f94e647 b29641cc 6a7b6f65 b0d6e8e5 2f37d187 3dc3afa9
+    b2d2b310 8b4f0fd6 e89a18c4 20e2a5ae c4513337 2ed72ba1 3820e5a1 bd07b548
+    cb22fcc2 a4961640 52971937 0bcfb60c 14be6c19 d363378d 0eff201d 5d577284
+    764f62ea 573d38fb 51253812 74dcdd32 285695bc f0ea068c 7eb085e6 6a7545b8
+    276406f0 8f102122 df4e631d de3e0d26 e0904bdf 6184eeac 0c516ff1 08462bbd
+    12a7f405 8e33905f 06094e73 b2c9b87b 1e04260e 7374189b b0ffa953 e25fdd62
+    b44c2910 634511dc 23faca4c fe5a2a26 65aeaaef 44673619 f3fc8d6c 2d2b7b43
+    c7e66543 650c3a23 00620723 59ce7bdd 68348d05 aa5b237e 34581a53 c50c1924
+    7de02689 aee61737 ed24dbb8 e1deeb5b c5961ea1 3645af44 5127423d 4bc9d09a
+    125bdd8d b31328d5 3d91fe62 a65fabca abe4b59e 5a1b8ad1 33571ce7 3fbdcf74
+    a293f19d f8e8c9c3 064527f0 a5ff8d97 9d280717 7f77e08e cf802572 6c18795a
+    d63f4d12 25fcb4e4 624aeab7 bdb943d1 a11c5d7d 4608fbc2 500d23d3 b9ddaa90
+    9ecfe448 d06c74a0 67e27c1d 6b0015f0 c5bfbf3a 9296f472 c57431a1 8e434d3a
+    b4adbc34 30058ce5 2c3698e4 5392b209 51fba5bf f3d4cd97 989d90c2 d5b52ea0
+    6a7d1c33 300d6db7 fe9b6199 a2d31a68 b7be9ebc b81ad8ec e575de01 b85d2606
+    2d68c0b4 8f68363a ff26df13 da029151 2c0a402e 599b400e 08825fb1 5c7bde2a
+    5b83a1fd 75a3070b 639aea95 a36135a9 fdc42bc2 68e66f62 473c1e7b e6723527
+    eb21ce93 2ba459d3 5ac98454 a8b92c5d 2ef8c4f9 d765bc80 0fd72208 49621455
+    145e56f1 b66495bd 833dc714 4f4d97c7 02739cf8 c3561a3f f83dc66e 89448873
+    14cafdcd 29c1b3e1 5359abdd 4a6c55c9 48cc496f e3bb17b8 474a54ea 3f4af3f6
+    8192c737 45375f9d 79397bbf f523994c c006d76c 8b3f822b 6b007116 f7b62fb9
+    1b222fac 51904d82 52
+h = a8138ff9 9a481508
+
+k = 93ab473c 1bea31b5 b35e6cc7 dd6c3593
+m = 27f5552e af2bcfc6 af95aab1 40825d9e cca2f05c 9840d7c3 09327b31 dd9efad5
+    6bb8373d a994ac9b a162b961 3f7e1216 2c63dcd9 c0f541b4 138cf839 ab7704c0
+    10b16f50 55baea3c 3ec0e381 101b9b45 cdad6c10 7990388b cc11aa24 107947b0
+    ac4ed319 ddb60730 cca6cfe0 3c2a388a 8e8ebfca 7ac7fce9 36cb6512 437d7689
+    74a8aa62 21a20955 fdb752f2 27ef5a43 9514f553 a82e0495 13d61334 8cae6cef
+    961150be c73d6e3e ea0c76a5 b84eae9e c2042c0d 0accbd26 6bd87256 d338602b
+    43b5ae0c f5c7083c 4b7f47c1 73ec5409 10986699 2539c329 4c95ec01 b1406c9e
+    f09b476a 36f1ec3d 41da6b33 cb33fa15 8ed49369 6b0b95b4 c492ebe9 773a4fe4
+    5ef86788 23307084 ccfb8dcf dbe038f1 4ec58eb3 404602d7 c22a158b ba14848f
+    7be4d6a4 f7a451b2 3bc209dd 1a93f688 cf6f8f1f 6e6702e7 2a1207a8 93373361
+    d04a53db 2fdfe65d fc210e45 8dcca103 2a9b1a3d e7d09e4d 67c9b388 63e96452
+    5b6295f9 3ac9d603 e1370ca9 c16754b9 262377ab 5543969f bf6c921d f3fd3e5d
+    155a3796 bddf7042 8c7fdbf4 ab522172 760d89f4 03e0174b 14cce22f 06d49c21
+    71191e5d 21a5142d e76d9dcf 943bda90 27698452 fa83697f 28968330 611d284b
+    ddc064e9 4d9bcceb 3a49d178 c287d62f 2d6608c2 6939b1f5 1969d6ab fd437be6
+    f4d064d5 a195c508 3c304d36 90e93736 fc0d92c9 b86e3ec2 717bdbbe 9993bb99
+    8e693f57 83860986 63562cc6 43079799 adff6e48 71c5129b 20a39b0c 99bdea0c
+    138edfd9 ef162844 1bf1a84c f6afe567 a0e3981c a2da8ddd 73506a72 051146dc
+    f764bf73 4f4d6368 f8e34d9e 85c6885b 4f75899c 1cf53717 d4f4c955 8e2b7e03
+    1b9c9939 1b47a54b dab21e11 ad59bdd3 2f9a7662 983e654b db098bb4 f9bf2e61
+    132b4212 a0a7bdb3 64c40b1a b9e89b57 f67fbb7c 119b9ef4 6f7ae712 2423bb73
+    81b5f915 f9345651 1bb7019b edca13da 66fc632c aee8676d ce1e68db 6c5558c1
+    51044b9d cec818d9 265b16f7 4ef55c64 564d2d69 1ec24dcf 651ba7d1 5e98f375
+    e4647a29 5ab9067f 79fe805b 06e3a9fb 80b70c68 d44ba5a8 843a7ff7 0442c8f0
+    edfed7da 8c452b28 c0132fae a9a1b376 5e3ed1c9 97b5172e 5186c2bb 285f2da5
+    f6863a8e a21b7553 a1c54cef 46699805 0d79c820 82c5b2f9 b29c7de7 01beb05d
+    49df076a f62355d7 8d9d7845 4c2cab5d 97b81b10 faac93cf 01e05b83 19c7b043
+    c26811c7 d52e6d45 ae70b709 b973ac74 11762f1f b7318208 f543f303 786cd1fa
+    919b5dce 5b529cc4 147142ba f159a0e2 08674743 eb75f624 2b8f6a6c 3550d841
+    53cc3f62 2b8d6162 febd103e 411e81e3 4aebebf1 ba178fc8 9d78f1f1 f6c4da02
+    26cebbdb 66b42608 41de
+h = 6705964e ad419fed
+
+k = edfcff7c 9a31b30c 340a01b8 74125e96
+m = 24194193 6f9f7c03 07d3a54f e0446d84 9b46d6f7 9b4aa3b3 740e14fb 85dcde52
+    8cd0787f 975d80bc d94e33ff b924d8ac 187b1a0e 04fc6a8e 347af7ab 862eb3d4
+    3ae86fd3 27af89da c6e5c062 54afe555 327ab5f4 e8a0b2d2 ff41b444 7606eec2
+    a454b4a1 02d5f61d 0d66453b 23cb5eb7 7fddf6e2 2684569e 462ccf9b 5f210d72
+    cbb417da 00e52d14 e141c3cd 16464ebe 7b3d27ad 9ebc0321 506fcc30 1465193d
+    fa086e11 d383eb2c 981d3448 f289ac7e 3b79cf39 ab5d7bd5 6d12b49d 095d599d
+    77cf2adf 9ff368bc f0ff434a 4e12cfc7 f321a900 0cedeeba 17eb5faf 855ce13f
+    b3e325af 8b71ec67 a8ee54b8 38a74c76 913b0dab fdfe48f4 860c408b 6f5396bd
+    6874d545 f0be791e 916b2332 01d72388 829648ed 127d54b8 b51cdfa6 73c740e6
+    200add48 777413fa 04c2b01c 3df6ff8c 3fb3d170 3690c2b2 7651d81a 95b4ef9b
+    ab82d7fd 13468b54 a8912b50 741b0b76 01104a9a a1de22bf b4a46d81 4e71b399
+    f655cb37 3ea18207 550115ab c6c74183 b840c6ef 6d0da294 b0f3cc4b 1ca84cf3
+    7a3202a7 ef1fdfe2 6fcecf0e 54ecf6f4 ae26e30b 0df1d9fa c45073d6 23846d10
+    eacc24e2 8b1137a2 1dffa891 2293bc6c 1287815c 83a07fef 4f244bac bb3ca540
+    b2f1eb7c 6aee3f4a aa927808 0c41c924 461227d7 cfbf8220 a350cdb0 d3265a8b
+    58e1b25a 14dc0f37 b81d65c0 b68b45af a5541bd9 80d16e50 9df717a2 46326991
+    9351e8aa 090a821c 6503d1a6 16d2b9f7 ca1ca05e 779d279d a59db46a 426d148d
+    d82cd953 5ab4e83f a308658b 8216689f 6e3fc1cb 1ba95a67 1310ba15 7ba97c24
+    796a39a2 90eea58d 6d20ff1c 047df1a0 ed5d5d0e 713d9368 beef871b 768b3186
+    466b132c 1f279ae1 e057cfe6 61592fef 936e6c17 1b34d119 dfa72d6f 5b42d6ec
+    2cef7195 b6c580a5 ff4f677c 5135424c cd9faed8 65773021 4d1c8cf5 b7e61d35
+    a9c99828 7d03a601 20054b35 8a85c35a 78e5c96a 32f1704a f25c9373 35d7cbc0
+    a2a4e887 865dc6b4 6a49dec4 406f83b0 f6e5c31e a927f505 649ee5c8 49d10180
+    ee3d1ba8 ed14a92e be375778 f76956fd 5a047a59 7978cb6e 764d97e8 e3b17472
+    4f77edf5 354525c6 a6ff7847 99668f17 2bab1b65 cde1970f be1b2f4e 29000b66
+    a1f29eec 11c732ca cb8e4426 6f95d14b f1b7ca65 de7702f6 87c6b4e8 e31fff3c
+    535a74f5 c6e2518a 88c8141c 2fec329e 467ecbb2 adecb157 6095338d 87ae5556
+    bca46dde 86121347 0ce693e5 244f9263 cdd02a8d 674dfd13 df6154f6 44078668
+    2662bf17 ea290793 6db5720d bc8c3160 3d576fcc 4ddb8e16 f4d6153f 39126d9b
+    9d837e22 5931f76e fd23826b c91cd6d4 e7bd5006 a0f4f53b 84e3e86c 476bd31b
+    7f734da0 bb506a43 0dc510
+h = 7f2f37d9 b2615507
+
+k = 7164549f 2082faad 2ab8bcde 7984f046
+m = 42a2d2aa 0ec20739 50fadb77 e1bb5efb 9d12e8df 5797fe7a 50853a6f 628cc037
+    de788846 7480f1a8 55857657 a0ffc5a2 dd66138b d8947ac0 ba68cd12 1a0fe798
+    63724dda aaedcbeb a6aec936 d2fceb1d be3ef5ab 6511a550 b3f52343 e0ad2289
+    4be4cd14 86b95ce4 3178be73 885ccc77 5c911350 7c13ee05 990f241d fc500af1
+    3208b289 2cc8a257 297ae083 fdff0849 8b71f4d1 245faca6 d60a8598 fd19d049
+    f3ae5095 ff4ad11b c9d1bd97 29706dc6 9baa3bf3 40513949 4f84a613 0f430ff9
+    95f427f0 39565afe 52677de1 c537a777 1cc7300d e6a3f73c a0288986 24844381
+    b2a86adc 4ee7a32e fa190f6e 86d94b5e 62196201 a402b461 05aa236f 42f59125
+    499640ba 2c6d30d2 34432f9e d6f0a61d 29d087f5 e05280c5 49202898 67e0087d
+    53e51026 518ae36c 74827c6a dd0e86ae a45008ef 32059fcd 429081d0 8f39155a
+    6492c100 c215b8c7 f0bfdbf9 edd82f81 7ec04072 548ff855 12738047 5d584cfc
+    5f10ea09 a6cc0a4c f0a6edc3 a8972d15 82d613e8 0559638b a8332b56 f813a1c8
+    0fe59f19 a61a9aae d3a05ac6 d85d2984 1f06a94c 7a3dbac2 859bc55c fa1d322e
+    3acf7f06 0ce284be 8d16ff7d 6e7e646c 5e3b2674 7ae735d7 7cb435cc 770ea03a
+    f40d498b 48099833 1e021e1c 032347d7 091b819d 98b089e2 c36e1f49 2724fd39
+    d145ddbc c7c9c0f6 2f69928a b907ab7c b93eda13 68002c58 274e5605 300e5d1c
+    494f097b 80f540d0 06935db9 6af419e3 c86ef208 6784d35f 9136a290 52a2ca31
+    12a9f82e 13741d36 07a6e074 5db4fc91 ffacaa8c b5a8a0a8 fd2beb60 5f4a6d01
+    2ed6ef12 6ec1d601 bbe7a3ed 77adb087 44893fdf d822eab6 1444ef2e 4e7d3921
+    33257b2e 4b829a51 9952acd2 671cefa0 90bbb859 074e9fe7 21a6f2aa 22dda898
+    f5495896 14c696cf d0201bd0 ea8d9857 17d42ca9 20574874 b72478cd cf093d88
+    cf472c12 ff6420c3 1dcb576b 99e94a10 46a39d0e 35c9f113 b91cd2fc 95c718c1
+    3ad06ba2 ad548c02 4fd9454b f45d69d3 b30e95c0 064c6d93 c350a6a6 d3f8a8a2
+    3d902f08 3659d2bb be95efc4 be58d580 141cd264 009298d4 3fd7fb5a d90fad3c
+    adbae9e2 cb19e2c9 8c8acdb8 8611523c 4fe7efe3 5cc59e97 f3c98b24 0bb73f0b
+    fb66c76d c4974d3f fe4e43ee f770bf62 a5fd3fad c60ff7b1 8eb74650 ef5446ad
+    412d4094 36a95d7f c9dd6b8c c2f697cf 65bd0d02 69a956fd cec430a6 b2910b7a
+    8e755812 f8817b3c 084f7180 65a3e253 4d0de573 7fe2c895 e9398206 558c38a1
+    443860a4 9c3e57aa 26c87729 ec01f1dc 4cbfc899 2dc3603a 89e26214 03d7f5e5
+    c287570a a1e0f629 ba284383 32bca891 c5781af5 57ff328d d519e5b1 4df7505c
+    f9fa92be f8bf4fb6 6facc312
+h = fc8789a9 58113a48
+
+k = dd294fc9 af198570 f7d6da3f 39a7aa14
+m = fb9e181f 6cbec5dc 6a19165d 4f4b6b4c 0949a4c7 afc78401 a7c14fe3 2a2405d7
+    01396efb 0b460a71 7c17793e e90a6409 76c8fc49 3585bfa3 f1dcbb2d 7ff46f50
+    9e07c3ec 7b95e29b c98f4a21 7741829d 25ac3052 52c3e926 6fc344e0 e983e4d6
+    804fb698 1b7438be 88c3b418 be9a789d 16967686 e0794fde 411737cb 4bd14d30
+    e30ab762 29193133 fbc6515c 01feee2e 899a96dc 070097bd c8220579 bf2124c1
+    73199fa6 9fcc76ce afee2508 03c27e1f 0c2343d3 8cee9ce0 18ff51b9 6fa1625f
+    75cce07b e77c8e0d 787896f7 9492b169 137dbb71 17e3b091 50dc5d15 b5e5ad83
+    f5aae041 864e787e 9e8665de 69eee0ee bb718b58 67f119f9 a7077838 122d3924
+    2422ffc0 0eb86a87 4f964544 ad483fba 5e1c7e2d ec74d7ce 0cac1891 2ee29301
+    41c0e3bb e71f3f30 ce5faf4b 811f05a1 fcd120e1 e68e9faa 420c4da8 813a80ad
+    d3a506ba acecffb2 de5f8964 1bcaea3d f065301e 266da5e3 d1bcb7a6 cd04b7da
+    15424b55 70bab3e0 1a9f6e12 031135d0 4d5da069 e30acae3 c2318c9e ff93f558
+    9fb192cb e0ea892e 65a24f38 63d7b2e4 4d657ea1 04135612 6435320e 21b7c55f
+    dcdc0e3e e5f844f0 ad41db26 768c1fcc 90f8dcf8 f5434173 38dce3a4 42609399
+    7a272dfb ea88ddc3 bacf943f 35126b02 abef8146 819c0f00 a31303fd ed3fc043
+    65c067c5 f8220aa7 5d615755 bb35a6a9 3c373cc0 25f94151 979e98b6 79d3d710
+    372c4cb8 a226597e 7c78addb a123d654 06d3807d 3efca2c6 1a337032 1b92cc17
+    7f7f4313 256b077a 4766c597 40712ddd a704a031 51270f30 21c1244a 9cf0902a
+    8814da4b cf762fad 79716db2 66106ef2 1cff176c b1044669 64866a88 b1ea9583
+    22a5bfd5 d5c7d546 c96806e2 68b5013e ad66fe27 0b1704e9 3d890df2 e005bbf4
+    32d541d6 2a04270a f2db7a25 39916265 15784366 fed275b8 04ed6bac d1d6b0d4
+    7a66e4fb 0088a057 4b217af4 51a6e581 0c41c3f5 c35a7915 9c3fb156 f83b4bc5
+    76d358e4 bb958649 3b85b221 25a91319 d5835a88 c3f19c49 6de97389 1b86b5d7
+    fca16ce6 c9def080 ecebeac1 19bbf48f e953f659 0e12890a 0908eca4 c9fb9db5
+    37593b93 863ad73f e25fa7ae 904fb23d 099d98c4 c1c1193f b7d41f96 4c54b59a
+    7fa9bad4 7e649c94 43a6d767 374f1d7a 7d4aab0b 5f2578e0 ca4a25aa 7e571936
+    9d5ac997 8af4fd3c c3c28ed1 b4216e71 b5424c01 1f488216 4ef46448 67536338
+    0fdc9120 8430a93a 83e076f9 712c6d93 7130e607 7c7249ff bfdd4870 b9dc08ce
+    e2ec2152 ef33f2e0 5795ddd5 96e1ea8c e62b9c61 c24efddf b42cb7a5 2159f7f2
+    a65c8b97 0d4f9919 6c2cb05a 763295cf 4402fa5e c20d8205 8715fe96 f741448e
+    c686292b 4e2ef5a0 88515ec6 38
+h = ec017ea7 45a4e18f
+
+k = c3242a46 7270f9bc 62881a4e c407657c
+m = 82a6d578 7617689a 5771d234 d2f603aa bfdcc308 9d4d0767 a84bd726 61ef6ded
+    cdfd3349 717ddac7 a081b814 a46ed9a3 ebbe19ed d2d3e4ec 389b605c 61d07734
+    1002bf51 81f3fdbd e181c7c5 8e6c91fc 97f7eb5b dbe7084a 8e6415e6 2230e857
+    00c102b3 2f57ccb1 eb91f28d bffd1022 6e50472c 7ae8499d 6d9f2e86 1cad30d1
+    9eced5c4 29f898f9 3697fcac b1ecdf5d eb1f311f 651f7c03 11532e67 c3fdc6b1
+    403e91d9 b9525de1 6a019c54 60c210d8 701a581c 34e11f91 dbd6f3a4 ed0718de
+    1853d1c1 b87d3b56 0d509e03 916e2540 c1ff875d 1ca19efd 49f82e95 945edfdd
+    27c43b24 d3887ab1 dda08fd3 79465f92 580211bf 478843c4 e0f3eff0 116d5f3a
+    5395b808 959409a9 2336d8a7 74096dc0 ad914c7e f6409cde 07477660 434346cd
+    91c22548 cf6e6e8a 7fad14c6 471c6d2f 71c7752c 44ca4d71 a18c5415 fff659dc
+    1e79898a ccd22e09 675302e1 ea5c92c3 38a21232 fd8d6d59 e7755bd7 84992e04
+    c13a6557 2d636d2d 54282904 79d26f47 dfaf6abc 5a98bd57 a798a99c 715bed60
+    f9d6e82d 3e53610d 96911fb5 59343e66 969a9d66 4005e417 f13575d8 2372b96c
+    10a4649a 4273b8eb 9106dc45 12bf5931 fe4b35a7 9619c9ab 298186f7 f32e5ee2
+    1426a732 6539f51c 17495708 94a6bb1d 077fb517 ff793b65 f5f8abde 06185c2e
+    0b3d55ad d7b729c4 8c3cda4f 3e1c752d 5cacecb1 04f9e96e fa3443f4 76ee5b06
+    a4571448 7d480791 12549abc f3774c38 b54c6b17 c2673e21 b80ebd5a 6894b603
+    6c5fffdc 2273e170 08b6f4dc 541ab974 4c803922 492d69fd a669aac6 74300f70
+    20be87d4 be69e0c4 892b9ccb a582e0af c3c86cef 3027835e 1e03d41c 525519aa
+    0abf26a5 55be5d33 debdda0c 1d6868a8 eb1f6892 9c2415d8 76f63f06 e5f565c2
+    dcbb6b64 4e34de73 a03da107 eef01654 093212ee a56adf86 9ff14d25 acec02a5
+    ecc98994 84f48c15 a9a76abf 121d36ea 90c3badf e12ede8c 6f7d59e5 3ad3beab
+    a4ea2acf 453f98b8 a1ed2061 7c4b3e80 f49e38c4 fbfdbdb2 49bbfcbf a43cb249
+    fbe59f8b b2ca638e 105fb4e0 8ec3eb3a 8bd6990c 08ab45db 705743dd b77d4fc5
+    29b25fc5 03e8daff 497011e3 4564a9d5 c66f4f39 c67701f9 92a2761a 957ad165
+    b5c791fb 0bfb7d63 ac4a2860 029f7de1 078f46b3 3608318c dcc5ab1c 257c80a3
+    8db4b289 88546960 2c4a3327 43354c79 684b1232 8f3cd45f 928f2036 f1e78791
+    df1fa9e2 e4b26084 25d4bcaf 6abc9198 94955cc1 71b3bf71 5fca69d1 40c9bb0e
+    1144958c 97c99f2d 9c950fe2 c533535e 91700fb3 cb4a12fc a95b4669 f851bd47
+    ec18c4fb 449d2210 6954f76d 9af3cbe4 09f27d27 5db984a0 77b31de4 58591ff8
+    f356b0d9 84ac2fcc 283ea97f 0d89
+h = 51c97418 9dfb13db
+
+k = 0452988f 41f6eebe 279aa9d9 ea9e595a
+m = 10920e67 fddf605d dda11dca 846c110e b47b5192 f805c6e7 812d3a34 d2052b9f
+    78c4a192 49cebbe9 012da446 9d4fdca1 8b454ffa 3d198501 d5226fcc 2fd626ca
+    c66dfab6 529ec5d9 3feeaa26 98161862 a51d50c4 45b54a87 48d8aa22 2d72e064
+    779174c8 408a40a2 79dda5e3 0c8c1514 1f78c4fa 12a8a4d8 10fdbc37 9f98a1f4
+    9498f847 0e25084a 22964388 62c2413f 26fa9a5d 3275ac6e 9eb4ccd7 15f06c20
+    3ef431be 7180554a 6314d392 8495caa6 b3d1d477 5b578472 c23d0e08 a79af653
+    0906b322 28e2f6f6 70a0177f b98f70b5 8318349b 5bd19c7d cecae621 42f2d834
+    e02860b8 c5a0aaf1 66efa133 e4910290 c05ababe 838ad628 409cb3c9 bdb15022
+    134aec1c 4e4c6f77 53a04a2b 49e3f152 6bb3f9a2 8ff5267e 2b3ca453 f7802e1f
+    c43af7fe 0088c1aa aeb3755a 7465b02a 1b827f5e f73ba9a2 00d67de0 00cba4c9
+    0972d5eb 65a67387 8ac6aa35 c0a21f06 0f3aa9fd 952ca6e1 dc4b4d97 b8668011
+    c09ec9dc 02a097ae a2de9b5d 8f1c27a8 dcd26186 858177ec d23e3756 4822c516
+    c6d9af90 c9f1e7e4 e622ca01 aaa8db2f 1bf526cd 5f29bb69 e7dbbb29 f8b90ef3
+    76d66fd5 af1ba154 fefa5a37 535af196 c8a99033 944c8a22 477df54e 8444a2e7
+    340eb1b9 5b29818a 87ec16a1 3ca1e25a d7f76b5b 420b888e eebf48f7 66981f0b
+    ea3aa3f3 0dde8b80 39234678 162d6313 f4f29ad0 be2e324f ce31250b d2d8f58a
+    a4625f32 310ffe1b f9b81b09 0475b250 6e2dde05 dec77bce e439e001 c8d5a952
+    54d03216 aa26bfae 479dcd0b f95b9dbd 10648aaa 36d1036d 0105c7af f5bd9813
+    66c659b9 b9aed8e6 01a4c050 80ef7207 f72334af f101c123 68733904 c7fca058
+    23e7f8f3 4e085532 d660a2d9 daccbb95 a1a1644b b13327c8 264511e8 9ef9496b
+    5974bd88 f46efd74 29957a33 7ec47cf2 bd4da996 c6738fdc 3befc8f9 79a35ef6
+    3600c5ac c8165773 0700f61a 2d049427 283d43b1 d748ebd2 3ec199aa 1927fa5b
+    0607a310 137fcac8 f87c2ba4 713457fa 06038cab a647b0d7 19a22f90 8f8edd8d
+    4bbecdc4 187b14a6 03aa420c f1a8c6a9 f39ff7a1 b2b645ea 9326ac57 fa86db55
+    326f9b32 b8574b98 2264348a ebc974f2 79961ac3 289a4bb3 9cd1c8ce 72c329e1
+    b6efff24 82a6ba60 94b90df6 f73712d5 11c63b7e 2e0ed690 4ebd5076 5155c806
+    1c436a3f c940e24e 161d2d74 354924c0 6ae46b53 ecad2880 62d9ac36 4014a683
+    799b45e0 ffb6f671 f3022ebb 57439214 0f129a52 cc0f7c33 7d426787 57a8fcb1
+    0100ae84 d74e8205 2afefd0c 96b98e21 51ca2c83 294c0eac 1938494e 216aa0bd
+    881f5a44 ceab5525 f7b5bbef 6724e239 d2770713 fc2203d6 f1566d7c 14014fe3
+    abe489ef c4906442 e7d24fa2 c16a67
+h = 5c94dfc2 0f81f7dd
+
+k = 905e9ee8 36491a4a 47dc86fa d2812f9a
+m = 61804693 af9f4a19 dccd136c 0ef12863 42816baa d380c432 6c74f6b5 498b9ef1
+    ea3db3b6 5d7b86c8 6e779569 b06cfb94 8ca2d350 05124783 94811fa1 f637cfe7
+    2a6cf20e ae2c8e04 026071cf 4bf62c0b 3c14ca8f 8a902556 4c9ae5a4 d61a8fbb
+    e5a1eb74 1ea3f28f cf67aa4d c7a72ea8 4e42e024 5a01588f ab97c2cf 12754e37
+    cf37d284 90b83150 2002d2b3 cbbb77d1 1fbfd6f1 40f1f732 26cd4826 65e7f807
+    58f2552a 19667aae 049d9dcb 23c93adf 5638c94c bf9ef486 3e461208 bd0d5e3c
+    87422789 fd59f260 8dd65c4a 7051dece 59b2afb6 8bf8c8b7 95db5cec 9cb75333
+    8b6ea298 bd271f39 7c940c22 45653bd9 3b83c6ab 6ac4ecc0 81a5da9f b9b5e451
+    dabfaf31 14dbfffb 81c8dfb6 57e2cf3d ceac6b4b 30a9ac44 b25dcd4e 6e6c367e
+    f1e059d6 713a9e3f b56a48d2 08728935 d2bb9d59 326f149e 3342cb66 df9af853
+    3684feaa 025694ea 7f6c130a bfe2c42e 36284639 c93b0269 b7b0eb22 4c01dc28
+    368a723e 46f71c03 a5f69484 877bf938 37b06787 0aea8756 781c7476 1f60ab24
+    833d5b55 98d0d75a 78223d5c 936ef28c d4df5d66 67a27bab 52c3f507 61022977
+    bae4fd2b ee8c8866 4f04dbed 08187bb7 ca07a4df b095b442 c1a81591 e632c21d
+    aad817b2 ed046d55 58bbc820 ae373d7b 525c64cd 223522c3 2699347c c76e6bb0
+    60f3b988 3a5667f0 3232ca14 03fe9dbd 57396566 5d1c07e7 2edb78ee dda37949
+    ad3097b3 7495c0e3 46d32d74 7d1799ee 19837bb4 6a39db65 87d9f210 6bf7bf72
+    b4a3e6bb 068efee1 475c4de0 1757cac2 0911f375 d4b5fb72 cc50fe70 780fc25c
+    76283b0d 629ccf74 112ae431 6c18e0b1 d634b541 18f19a87 c47b3c53 f2902154
+    f6f5478b 6f33590d 4ef912f1 e88a873a 27d303d5 13f22a66 c9e60a1c 194d2708
+    dcd2f626 82f8f064 d876ff56 ce5e8e28 692df37c cb617b7b 7240e2b8 45ffc17e
+    42e6f370 4add6e51 3e0e3e2a 2aefb56f 9b55f728 f59d85cc 46754480 fe55b718
+    48ea31ac c88743ee c8e16cb6 ebaf13c4 e777f0ea 062f7eb4 246f01ba 3397aa1d
+    e7e6d576 1d508abe 92962296 b774982e cd9c92c7 cde0cac8 e86b3ae7 79b6033e
+    8ad69345 14b68495 c9e2fe45 945b085a 5ae9e215 f90da518 0b74fea3 7bee3ead
+    f619efdc 43f894d9 b39e25f2 2fcff83d 771e84c2 7b749419 be4b75b9 f6f92641
+    1343f11f d679a915 543385bd 6abff677 ddc9d53d 83876b49 e6f2c57c 7fbc47a4
+    8be06699 a801506d 7408caaf 063c9855 7c6557c3 7503456c cca84f9b 672991e7
+    8a8bf53f e196f8a9 81d5600f 7472ecd9 e91aa937 5870fa5b f5189699 ac45a2b8
+    f1f45bd3 83029639 6266cb5d 9a8f31ea 7da056f7 f9108b91 b5393090 69cfb9f5
+    14a1547b fd544e68 7eed1b19 7a4989cc
+h = a854b5b0 0157f232
+
+k = 2ed8c5e0 f9b1ecd2 70a1716e beb33963
+m = db4362f9 5bcd8c21 db454211 a714444c 274a1473 7fbc21a3 a1ce044f 235be0eb
+    516b3da5 d7cf6f30 c864e576 4c045e4b ad7d63eb ccc79436 7d12154b 85954d8a
+    3cf3f230 b6bd66c4 f29f3bd9 cd092467 24229a2b 69d6317f 0e3e91f3 67473cf8
+    86154dfe 7b507a17 dceb21f8 803072d5 df84a5de 52c671dd 6009ea20 4f55139f
+    2a1cf097 a6c79312 28413042 b2071dac 18b02727 0d559fbd 9ee166ca e8e42d5e
+    e47d17b3 fe0c1cfa 79555cbf bed58680 30f4bb9c b311aec4 6567340c 52216419
+    869a190c 8bab5101 c8d00085 8f5e3d08 a581f589 33ae6e4f b94337e3 ef6813a8
+    d8d73726 10327972 04e82841 e6c8c0b0 bb4a4247 68b8e829 b82f5557 cae87b04
+    c4629fa1 a8907988 7087024e 4573b19e 96b30886 e736eeed cb26821d 75daed82
+    5cbe0c1f eb74270d bbe4d30c e02a0bd8 be77557e 19a866e4 9262f046 cc140c06
+    99f7c053 05d94a01 1c579963 1650710b 593d4800 6e9d3f8d e8ff1b10 ba23b3b2
+    92f75adf 2b9b42ec d2e87a24 c9df3727 f7aff249 e7a8d1e5 eb7c4b1a fae6b690
+    4518e030 a7b880a3 5210086a e24bc110 5005f52c 25d428c7 20972373 cd7e1e53
+    710da70c 5bfc1778 083c3c48 29de5cdf 5a86e08a c3eb4def b8fa7efe 5767eebb
+    bdc4be96 377efd47 dfc94896 33db59ae bdd586bf 9b276bc1 29166c6a 2fe776e8
+    3ca7b7d1 5d992e16 c033b610 d26c0ba3 a61011e1 2f1c87a3 3595b8a8 a3dd856b
+    36b3339c 169c789a 120fb53e 82d16864 359804ed 508c8078 7cfcc0d6 c0b4d2c6
+    4dab7e4d 9c3bfbcc 2a1185a6 646cb4a3 cab5896b 7b82f50a cb9151a5 9b519c90
+    e269bc12 dbab2264 f4911212 410651e3 d134a3e2 5c045fa2 68f176dc 426280b9
+    3d2e82a4 bd8240bb d2cc6229 49a20215 854ffba9 8ce281f5 dabcd2b8 c9c5b70f
+    4624ea8f f65bbbf6 1d83989b 2aac64ab e66fb82c 510c7ed5 76018884 cfc078a8
+    e1ea7dc8 06daab09 bd2d1235 c3c5aa4f e72da5bd 7eca45eb 762f3f3d a1a5f9a1
+    447e391e ff5dd426 c21fc234 2195a69d 419446b4 65340c80 13941c61 33955036
+    019d0f49 0e62353b 5ebf4530 1c1a5520 b2cb1618 4bde4599 d162b243 1f2e814e
+    e2581c08 59812bec 00ccbbaa 0b72e13b 54dff475 66aa7420 77ad8172 90edda90
+    a86f0f8b 18c1bf3c 65622f63 c97bad63 5a4d9a3f 2522e41e 56123000 81443c63
+    06a63d74 6687c863 ff469922 ed2c0248 2f2ae849 5dbd66dc 7113dc9d 35a76f1f
+    790e3c43 bd8cce93 8e31c701 e3270691 eb1eb326 89389d45 5b4a68ab 9d406526
+    b49d5089 a05fb625 a6f694c4 2c5b96a7 6d286a5b f57186e1 f3d5af8c 1d538979
+    e93da3c8 e7405908 2075ffc5 4070176a 8e19f92d f02496fb 2ef1f5c7 c0792f7c
+    d1cb13df 57b2ed3d 2d1c5d44 6a415129 25
+h = ac8f0407 6844549c
+
+k = c7b66644 4325daa3 a7ab8d44 b3392151
+m = 7bd38e24 fc877537 074b65ce 860a465b 9981a58d 1e471345 e5d32923 f49ec6cf
+    84537820 85154d50 d01ef641 adebfe43 5390527e 23c6ad40 fe951c21 cb2c43f4
+    2cb6ef34 d1abcbe7 afa79891 246d967f 2fbb3bab a4f457d9 b11e5630 1d883bdd
+    f6d4029f ceb51200 074b6db1 1b17b332 3afa626c ebb3ff60 9578e577 ad6d4fe6
+    deffa599 03baa2aa 058a275c bb6e9519 430cde1e 9dbf53c1 fcc62b5f ea566be8
+    7d2767d3 8086c754 363e08b8 1f056f1d 2f848c2a 7a848664 d256dc33 9254fcc2
+    593024db 75846d22 6c559ae0 b0c0d313 8f2ddba2 701b1e43 a381cac6 b6958eef
+    93b85565 b9ae6a1a 41d28741 53bae859 70bc21d6 a6b88138 9e25decc 403e6d1c
+    de19bee0 cf2064c5 8ef49aa9 d811cbdc 013ce84f 12e178fd d2b58056 eb8a3e63
+    1ce39beb 735b2644 e20686c4 fdad89ef 7781713a 0a20ff2f abb13a65 e0ddf45e
+    29d8a583 86c1c407 9afba8e3 1a4eab04 8713a295 b5a83669 af9ab344 3674018d
+    d42aab50 23a47556 1d2551e8 e06fafab d9c6c8e4 1389423e 2cba9911 733c1db1
+    7f38710a 0bc04cdb 469709ae ee522af4 1b969003 267a2c98 1cbd1dce d9d21dea
+    c6a752ea 69f30e61 fcbc59db b60c1c4a f10d1221 5476479e 27de235b 376276bc
+    d269c578 024ddb49 48c2bbe8 01d4896f 78f9cf29 accc2999 d7d4e4ed 84010a1b
+    4cad809f 16e3d5c2 ae77e289 1e54eb7d abe6be79 9157e003 ca33aa88 263d5294
+    0dbfaeca de5e3e09 a1e2f19a 6e4edac2 e74d0db8 27048e40 462a52cf b1015ab5
+    3088fb6f 1a8ea5d1 9a6ebafa 38fcdfe5 a74aea6e 8099cc12 d4cb807b 2f3e8ac1
+    1f9b0e73 391df125 e533762a f672caf3 51189411 701a658d ff2eef71 b5845562
+    b07de3b3 b0872f87 5f8de918 2e9b55b9 f1d2c940 449bc5d9 a3137dfc 4bf85017
+    000d0c15 ab6af217 dba3a604 4172f406 28d37566 2f9b2efa 19776eba 27ed5ed3
+    0c99e062 77881847 b1d4e2c2 28afde7c 3f1c941b f9fb8164 89e0f242 d03f4726
+    f60a7a63 f7e20607 5f7174ff c924f6bc 7f9346a6 0af26863 30dc92da 7efbf690
+    a84b8399 d2f9696d 25954f6b 84d449f2 fc6191c2 e144b41c 2257d8a2 4d277e8f
+    e9f68cc7 e765d148 458a2678 ae51c649 1bd76273 9de5f620 fc1d3a1e f1a07896
+    420c1db4 b05f803d 2df00832 7407162a 5e2b7e73 4b3db8be b43eaa55 fcaa0c84
+    a1982b0b e6ab68f7 d4177f91 1b7d6a27 62e20808 b5a1a984 f636886f e8069e72
+    8b1c8cf8 21acfbb8 1fedb4e9 9809a3e6 1f0345c9 5636cf8d a7c0199a acd31341
+    e125dcd2 af337b96 068114a6 04208d11 8c3cc3e2 e741b787 6384afaf 4bc76fbf
+    9a278fec 5bda9e92 0e89e3b1 958b738b 35cc39b9 87d93eec 8d134548 e92a043f
+    bd7e3faf 443c2db8 81167db2 032299bc cbe7
+h = 2b70cca7 cb7185d6
+
+k = fbf82bee 4175d5d3 ac754a83 e39a4431
+m = 6dbf151a 36641ed2 0aeb172e 9dc8241f c347c254 3d3d252d 907edac2 effd900e
+    6733ed9e 5c010829 cc2f9630 eabb4cac f76a5584 21f073ca a92a357b 2917ddf5
+    0fc39196 b6655647 1a75a591 be5d5e7a 472844b0 b831eb00 8a90dfd1 b185f0e0
+    67e86ed8 97529081 671fae96 d3d0861f 3f93375b befd9309 63ca8596 2ade7527
+    a9dbb683 6cc11393 a777fa03 c37b08f6 3e9fded8 1f67e4d5 b08601e4 e51031ae
+    54158fe4 f8c574b8 db9f483d 50c4eb95 04022a82 6a7d1821 b2734e44 038d1281
+    fabf9e1a e0508f3a 0097944d 7ab31285 3f13c768 2a4d794c f199e33d 7fddea98
+    28a48886 4c85f7b7 ed57d7d4 d8b31a48 304ef349 f1fcc3a7 3876a15c 18324796
+    4a67373a 380c705d 40c70f25 49e7ce4e cf9081a3 3ad5bc27 d0614e8d d71ea165
+    9cd339d0 4436c4ca d5f77450 33e933a1 757dd798 8e56de1d f6d80540 98e25eae
+    9475114e 7a9a5976 7779939e 69293098 08c2b2d7 89c4d5cb 8350fb48 e849ffef
+    3779f729 1b44c696 1100cff6 a2570654 22c0c22d e91b9c76 23201d7b ab78f4e0
+    c7da43d6 10181117 a7365392 996b11f0 50cbc432 69572132 ded0ab6f d0fd09d2
+    d07625de 6b68b8b6 a58e0075 336886f0 3b507b7f c9eb1d97 73ad79fa 11bbecb2
+    adeb5e98 1a3f4563 d4e66cc8 96c66a76 05d531c3 f4d2ff10 a220bb8c 6134c38f
+    dc73df75 6005ad57 3920f6aa 787c781a 8d36c329 8b92da95 e44f6a89 e82e41c9
+    a454cbc2 f1978f24 528ea2ea dd7ea48f 3c05192f 9f618f1c 3cb41d99 3a7d13b9
+    b2feb20f 3cad337b f334e65a b96db819 9d682429 54fc4f0a a300b65b c987e47c
+    d7e72a3c aa3f69ad 6bfa723d b34a851c 96022b39 1dd83dbd 07d8f431 5cc7f1ed
+    0afdb912 22856fcc 46b95e66 e9a20ec5 3a3edaa8 4388beec b6b694e8 4a945e61
+    8a78b2dc c4de677e dea4d2a0 de111ae1 ea5dca96 b958b723 738e5e73 031b25ac
+    a9845203 43d9b94b 3f389c76 68abed5c c4385c0d 82c0093b 6052df77 aaa4ca96
+    c6794459 e7d92a81 7e03bdc6 4a76d6ae b403c90e 53756fb5 d3a09235 bc9cd909
+    543071cc a66b39f7 ea91b0b6 1e41400c f530768b 50c5a3a6 944fba82 f0794527
+    545234da c71e90e7 d8d94566 2b871c83 e0df8ff0 436c161f 747ed756 21035d9d
+    f4f6da4c e96b642e d66e8fe2 82cc3cc3 afa72bd5 31f34a53 46a45d2a 8d0ef885
+    d282fe20 ea5c799a 81e2a95a e2321ec9 39ac9ee2 208e6477 7c8aebea fc2f70bd
+    a925cf16 7be3472a 2be941d8 941ffadd bb3c3129 f88f74e8 d8146ed2 c50b4cf2
+    da6c669f 94b7a286 6e30a558 86d19b25 64276078 8e5e4060 d708ea3b 9d0da65c
+    42e03cf8 8d7a9dc4 d2b4b8e2 dac1ef0c a688ad13 f73789c8 0934edc8 e3650538
+    4bdb056e abde6b5e a6ad39b6 9c725037 86e734
+h = 3931fb87 1c57e3ae
+
+k = 59f547d3 c89f5a95 6296a929 ce4ab74c
+m = caceecfd d4946eff 8551a3a5 3f76152f 0da3f397 a1c6f706 f8b13649 84cb88a3
+    62a54103 eacb0316 951e45fb 050a4ecc 2f689f95 de69d390 2548cd8c 76e0bb39
+    4f7b04c9 0dd5f71a 5f84b4f5 9636a08b 85789a69 cec45ad2 87caa0b3 e9b83dfc
+    9ecd2f9c e2f6be24 1dbcf92a 86b6ec98 c6cbb087 0cbf82dc c837c846 cb31bb00
+    e0fb3ac9 c0316a5f 3e32d82a a6fec55e a69807e0 a6f07d63 e12942df f926ea62
+    da4ae185 95f8d0b3 172ab252 91e2efcf c8b736a4 58beaa1e 5cda6b91 6e62e82e
+    9c4a06f3 25e3dbde b2fb7677 1d01ac43 defa2313 1a9bb44b 19fea302 bb57981e
+    2c9648be 2c018f19 2a03cc02 0a30f246 7ced66bc a373a1d1 315c472c 34446ebf
+    e2212a88 917345f8 58120334 d3979f62 51a9e595 a3d53273 4fbcd645 a680799f
+    73c99300 07d67433 07ad8b59 e558f516 37353237 5afe919e c97d4bbc c5ac9e8a
+    fca3f01b 0536e2b2 06dc5999 b1543ed5 33ef3f46 0614b7e9 2b1e1d04 07a51dbb
+    59fc8e9c 3a65f2c8 fd1e8456 013eb62d 3f927a8c f901cf46 a796db92 4ac9fc10
+    04e5c359 ebc87a5c 53c38495 0cefd04f 8a125557 1a6d938d d68191d2 5ab5a173
+    669b35a2 c99ef084 1a297fd4 21a4c2a9 b84463b7 8408dbf9 32279583 a750b1cc
+    0911e2eb 90caa38e fb45cdcd 0ca04425 99660545 779b3ff4 45c0cb41 8e77a6d9
+    9ce46502 cd4b356c 8d30ca15 2f993fb9 4698c4ae f2fbd171 db4dcc5c 97d89939
+    b663a67a 0e14141b e7df1769 d9f33140 1f309cf3 a66da5da 51f54b43 1fcea027
+    46962027 9b6202ee fd27e369 5bc0e47b 42a774f8 87ed9036 52bfb39c 52dc5a3b
+    4833a907 d9809052 25d827b6 eb60306f 8f641916 a4d1fb9b c6f5d9aa 10057210
+    73e7b310 6e02b187 e803f08d 66c4022f 437d8b0c 46eec058 0cc85ae5 ec2867e8
+    a6d0f33b 44cb477b 09658f37 0d906a03 712558d1 e4e55961 46509b52 65506404
+    c4a808dd 4024db81 7497d179 191cc3f1 713d4e1f 1cb2e2d3 5cdd4dab 25be7dbd
+    be182401 cf01c279 0bf1f154 9f8b6f63 c13c7062 87a47034 0ed76671 728ab23e
+    9bed7ea4 008c8e02 ab5a9cc9 8af339bd f9ecef4c e2bdf984 dc614d1f 36f85cf8
+    daaf03d1 df2cbb6e 3de9970d 20cbfb67 4af87a49 8cb5f9eb cc4b7ef0 e4c97957
+    34bc88c9 03afdcbc 64fe5d19 01e8ee18 78473149 5bacfdf4 8fbe4508 f89fb640
+    a4515bc4 63812393 d7d1ebc0 8c895fa4 60de87a6 73b05888 fdf1282d 99a62774
+    e5ef3694 c82784df 69ceb4e7 73859807 b82d5cf1 19ca74cb 0d741c34 5c9383a3
+    af659154 ed72b6d8 1cd10121 c3217b50 4c40c79f 2c815e79 7b99ec69 57c1fcb7
+    4fabe53f b62b9691 97c31d0d a808c5d1 a83543e6 b97e76d9 c832866c b6ad00a9
+    4514a3ce 53abef9a 0f403165 25ecb9ca b5f901da
+h = 3d203470 5acbf598
+
+k = a7616d99 35c0b104 5a656a9d c8673bae
+m = 95dfd9af e5088701 e530dc23 0c73aefe c4313b57 3ee97fda 7f6376e8 77434714
+    10cf74c2 06410feb dfcf0400 60b0d4d5 00ffe987 f2c37c1c d0ecb0cd f0f5e6a6
+    25530aab 05176247 8926f4aa 3c31e8f1 238b24ad adec64c0 5f4f7d76 65d8de04
+    1b1f7862 fdc19cb6 a5734447 d935b39d a8f38a69 feba4b92 e134756d 9e64fb94
+    dc6ae25f f583b9e5 c75c6c68 5245862f 0dff48b9 dbff7914 09378379 62cc50d1
+    e0ba1375 43171c13 3907ded1 4f7716fe 9db13a26 06b0c742 6a53d776 e0868a84
+    3c947fd1 e976fc50 aaf27bd2 cc7ae9c5 2886fceb 0f0a37a9 bcdc6c95 2df73d95
+    63f25336 5004c00f 5e2c5961 55c1c764 2c307a67 4e2ae1ce 6c684e67 88a356a9
+    428dea8f c6aa3a3d f08260b8 37facaa2 0a343364 a73667c9 9a1b3bd4 fea75ccc
+    167b74ec 2d82b642 20ec1b7f 19fa9554 d712d67b 6b38aeda 4500bb06 35486957
+    2d38c1cc b1a9d7ca da4b1db8 dfcffb7b 4a927e40 7690a3f4 d34b2555 92e43cac
+    aaadde6d 966aa57d a0bcb015 6b509709 6f28fe7e 8d30efb7 68e9813d 86bb088d
+    992e9090 7007c0cf 487ec879 7ef37d06 4fe5dbb1 444fb65a bf95f290 7cc28d78
+    ce96b5f2 cc76ccfa f6d8876f 59d794e8 0d6db166 01581db7 47a6019b 21c3f591
+    3a50d5ab 1e94f496 f2ad69a2 198a6490 ea489939 02737c16 aa59615d 175af88d
+    24abf220 6bb459af 87e7afac 74418a1e 13d639d7 990427af 6945af1e 8693fb0b
+    394f8234 79b34a12 38912037 b4bc5d45 bcb40ef4 e62ce696 a7d32d35 04622b92
+    b22169f6 2c152e02 dc8c52ea a0b03fd5 794603c4 765bfd39 27b23f9b 2d53c4c0
+    33ef722b 6cacce01 3cc1ed4a 08294b0c 80406360 8b4b4fa4 bfb1ad6c 1325dd20
+    b87edb62 52998c22 96bc1e48 c33ea222 5e2ac4ee bbd9cf8c bc72f506 38fefd21
+    346310d5 7e69eb47 99673442 8e06e786 d435c570 a6acfe5d 87092780 d3b2a671
+    390d8206 945894fc bb799967 806c54ec 27a613a5 48c34bf1 546841d8 a206e18e
+    c2c4f664 7d06373a e7f5cac5 f54cd5a4 ddfaef0a 57c1ec7c 5e1ff3f6 49bfa319
+    b04f0db9 236321d1 f520bcff b199c250 fa71642d 8549c54b 66a139de c5f3cabb
+    8bbce120 4c403d6f d1f01ab5 a1972670 03692bbe a5cd55d0 152c6c18 20142fb0
+    0878b0e2 6e43fdb0 0cfb5001 b92d6d8a 5470ffc7 8e95f27e 55ac3609 384e397e
+    455d84b9 39ee642a 30910ba1 3c4d472c b14d60c1 5b54b659 6d2b34f8 f5376950
+    520073a0 0e6fcbc0 955ca6c5 cca9503f 0949519c 0080a165 f05d961a fd6c1c8d
+    5f5b0790 ab3a275b 8f91d76d fcb5c1bf 20f06c34 7367b18d 9a1bbcf0 e8189473
+    11b216ab 936a0cb1 dc0e7cb0 c04faf58 82d3e34a 27091748 f23027ee fbe4a4b1
+    ce691d49 4bf06047 6f1235a4 b7d53ab0 26e64ad4 de
+h = 18c717b4 7d3ebdb6
+
+k = dfa58b78 93559899 dfb2d029 aedda6c6
+m = defd6fa1 647befb2 f71d41e4 e395ebcc d9b22068 80549af7 d187ea03 889668fb
+    788db07e 3819bebf 79436289 c96c4ca7 ba25e7d7 4dda83b0 9328a47a e52c9fbe
+    650df833 cceb8e21 0b28986c a3d8c818 06e0e15d 0bd7761a 9e7701f7 8aa57838
+    8bbf3946 0fa8296d 262a4257 c0c9a134 05287f83 9bc33536 09cc0fc3 8077f2e9
+    b179edff 595e7fe9 9b504d29 72ca7406 0ec7ffe2 ef2d36c6 33fc5c21 50eb1b6b
+    a8a672a9 2a7c83c1 c72a2a17 948a4c05 52c29f6c 79836a8b 4e5a8923 51d8f8b8
+    c54f72ca dd308f88 08b71831 0f58c12a 2e3a4027 8de3e993 436c9bd4 e70f2546
+    c79c719a 13ccb1a7 b5cdf08c 1bcfc4c2 3d4b6e50 1c1d9b8f 0d877a25 bced6c6d
+    e63b0609 12779cb9 24476782 8c829e06 14db7184 5f5591c6 7b128e57 cb321d44
+    0509f3b6 0b596d47 315736ba 18489504 5f21f965 31e1226a ed2c49c0 df40b1c8
+    ac030b4b ea83a123 dc4c83aa 07fa86e6 85f9d5b0 7da44c5f 1ac8bcdb d9a3e373
+    84b03698 f5efd645 31fb7ede ab6ef236 ac029ef0 d8b90789 9e312ff6 871fa1c8
+    61492840 c1a4b2bc f9922173 8e984160 f4b3aefe 66f16a22 d2190a57 b9ca40aa
+    ae006c4f 91660831 f50cac90 426a45c8 fd527b69 44527f99 a75dc3ec 04bf1131
+    8553cce3 c6dc58ca 2405e5e1 a0fa1813 25a5b484 ca7bb37a e78bd823 6e57627a
+    7cad0980 b78f2a40 a929ad4c 4a6d5f15 e05779f2 a3ac42b5 3d6ee928 2b51642f
+    37719e74 8db97a5c 58aa5435 c9103985 45bba059 263d025d 3ce57324 cb297ede
+    bd0c796f f59d2c43 c7aa7a7c 49016b3c 5c5252c7 25a4fee5 4204ed72 2608d448
+    f2854c61 cbf7658c 79ae81b1 38f222c1 178efb5b 99dba039 57ed7be8 bbe9945b
+    bb564fca 26a3a229 86df694b 86e95c02 5a5bd34d 3c682727 20cd4527 7906eea6
+    a366817d 661c972a 351907bf dc8a9d75 67c910f0 6774139f 94a5af8f a2eeb565
+    fe49650b bc16027b 75ac8c8f c5f241a7 af1f1414 06ee84f6 ee071a0a ab22063d
+    39b54d2f db4d9912 71ce3361 3d6b70cb 713ac69a 1971cb40 d58b6a94 acd1cac7
+    da100c6c 28a6b58a 9cfa036f f85e6c43 fe3773db a5619a1b b0bcf7be 147ea4e2
+    adffbddb d4f130ee 64616161 41bc2c65 c5197504 1509bc6b e9a268f0 108945fc
+    481a6550 878ce0bb 53c54e20 1cd9ab04 e1cc88ce be908f1e 54452be5 58a0d4d1
+    e5ed20d1 58132610 b93d7b92 429dc14d 1b78da0c 605583c7 c5c15ee3 3c94877e
+    0c7fc204 f274e5a0 9be692fa ae21655a 0fda51e8 11188214 bb3cd0b8 c45ecfa3
+    e6ff952c fad3f220 5b8cd855 b3a3bc15 7d5eb0ff 746e40a7 bb8e1e63 2bfcf50f
+    89283325 887f7e2c 51eae826 299f6754 d0685b1e d20d5cd8 f8b2f0ca d1822251
+    b6b696ed 5258ba09 ba2fd46c 74780397 2709c42d 57e6
+h = dc2e377d d2f84f67
+
+k = 95cc0d7b 24a9ef1e 2b29b8f5 3e3ad8ed
+m = 4800f0cd f04fa67b facdc329 90811b8c 109a97fc 13bde665 766f5a03 30b49d97
+    4f9667d4 25e0187c 302d5060 4ece7aea 62573672 632c10f6 38f31c1b bc1e3e76
+    05518598 b5aa6d44 55c132b9 8334dfb8 0039b3b1 30d03da7 fc843451 4411308c
+    152903b3 9852c22d 4939d569 0b44334b 2e04a258 98444225 618eb6a3 557c2184
+    6151c720 898265ce 419b709d d1e188b3 c16ed81b 23560015 8c400138 8f711acf
+    2eaa48f2 61228a6a c53e2c5c d6e20ce6 63b85cc8 016edd92 341d0ce8 e2c85236
+    0f633ab4 b802f2a8 8301afe7 1d07dcc9 13e07953 334f30d9 c38140a1 8af3a615
+    63e6cc25 2072dd1f 89b246f8 7a7d20b6 3e7cc0bc 5e016520 04de64b8 53f19c88
+    7d45551b 8f4de3da e14f0594 f7574c37 aa3e879b 289bebfe f8b51873 64524c88
+    4bc91e57 ec705246 753a0e58 1964c274 da26f8ec 5812ecc0 e8a3a24b d877c924
+    f8f478ac 0fbc64e4 a68dc1ec 02f4b9ad 29de1ac2 e047027c 4f2ac910 f812e98b
+    9f091ff5 97cc365b 4707bacb 131954d1 d6606c92 24a4b4e5 7e07c940 1e367144
+    7079495d cbefe71c cbc902cf 62212f94 c627425d 9479e78a 01dd63f5 57719353
+    a7526084 af34e0df 5f0fabc1 e1e4c8fe 0b0fa664 1fce4fc8 7d635851 d22aaec0
+    a2367557 6e529039 46da8f16 ef624da0 1b59231c 86c2cc5d 310a67ab a3afe479
+    d8d822bd 79eac53a 1b5eef39 21c90786 af93546b 53c79d68 a2e71782 6c32073f
+    fe10f9d8 c3dafcd9 7eef3ea8 26575d81 274c7b1c f12abaf8 bac005be 07c5bac1
+    526ed49e 87c1d18f c578a4fb 08707d5c 337afb88 566aba7a 2341f232 30a73ee2
+    e07a3d97 ce5f4b24 6aeb1a85 b7e54b88 347722b7 0dc8132f 9d616d07 7f0fe722
+    feaf3077 572f1fd7 88321504 73c7f674 e2bc30a9 c0fb1d43 bf576fb0 ff654704
+    4fa88ae9 62d070cf 74eb6619 07bba708 9b1899ed 00c994e4 937ce77d 9497c1c4
+    e893c0ae 96ef8718 9ec6f3c8 cd389cba 2a4d562e 33e5b3d0 35c94add 31305d2f
+    b4adeb59 ced5d526 bc7afdc1 4bee8219 0150b9dd 62bbfa7b 7d2ba977 e7790676
+    66f600a5 a6b81e63 041a3728 42c0d2fc 983b5212 cfaacfdb 0ed79f96 c213eb1b
+    e043afff 3bf9a5f9 725cdb04 08a1d996 522f35f4 6061767c fb3b8729 3b26a645
+    177a8445 e16674db bb694399 70f1f87c c4454ac6 adddcf17 0d0e51ec d3ae14b3
+    7dc12393 2f910ef2 7c6bc7ab 3fc19326 05147bbf 66361ccd b251d280 b40c54e2
+    7ec168ec 744c7314 17596fd1 151e0b18 a25a4160 79413dc6 b1e8fe45 59a1bb09
+    b32385b0 d865023e 5700a804 cbfb360e 9c9eb3b9 5a22e677 b9717702 3220bd5f
+    ebfd785c f7957dde 7fa633a2 c0776ee6 26c3f915 ea920a29 f58fed5c ed7c0417
+    def557f5 9608eb0d 113b73d4 db9f93f1 687d4761 e3970b
+h = 469db3bd e2485858
+
+k = a9ab86ae fd0df13c dc7a6126 fca0895a
+m = 5a3bfbe5 bc496f66 4b1976c1 46112b87 e6bc1d05 7e6259c7 01cc8fc4 9154774b
+    fb15b9c1 4408f445 30b43981 84fd7bb0 ddd53b3c e90d0df4 4f7bcc3c 698e6b8c
+    3f8da5f6 719a3956 a4642d54 e478e29e 0b8df1c5 164a2269 4da23622 e290f7a0
+    14e4bba1 6a4adce4 6e4f5df9 dc282d32 b3befde1 21dacc42 2d115bf9 440a2e25
+    464425e5 d0bb0e12 85d81661 9f8cfce1 05754755 585c1286 e3b90611 18496a92
+    58b95c37 ffddf18e 696aff65 63ae5d68 a5cc1883 528bab52 4f85c1b5 5dc5723c
+    1ca8b3cc 50b22947 9955c6db 13639565 9f87a055 f33ea461 742b47de d81bff66
+    f78a21d7 630b82f4 d26ec93f 5cf4f6bf 158e452e f425be72 6aec90cc aadb5f36
+    66ec7771 a0e94b5f f2fc8757 318fb15f 67c312af 8af6c65c 897e75f5 358bfd38
+    4bb7bdc1 7aed169f 54beab54 a5524150 58081ec8 e0b3937c 5962cb5c 3ebed747
+    8187a458 7f03b2ea 81561a70 8a4f269b 29488776 7f1ec00f 11462b0d d3ff52ae
+    81497b17 5d07344f a72c0b1e 5d4207e9 c7925b3a 8495fbce 6737f4dc f2036a56
+    4178e861 d3522d61 51c8d1db 009a967e d651a6e1 938e3fe0 063e4c0a 0dc45335
+    24afd55a 43ce5e14 4524534a cdbccb53 4f228caa e1ab728f 8f430aa9 c29f4f6a
+    5e7b0902 4e486dfb 3c19efb5 7980dec7 a2b3c496 d5a48650 0e75ba24 09e00eee
+    370c33c6 2a1f785b d488e107 0acbbd13 2a41bbc0 89f2588f 9a4c163c 0e83be0a
+    1b269ab5 a97d3b72 04425a8d 3d7fb914 aaad4795 963df63b f644fae1 5a1172a3
+    2306bedc b8297540 361be00b ca4244b4 75292f46 771fd304 a8a458d6 2433e1c6
+    a834dbec c1fd6749 6e612dfb 849e6a47 2219a536 d21727a4 e1ae33c6 a08d2492
+    ea69c2ce b5cee5f0 eb1d5892 06f0e836 5ee494e4 12696b7a 8c40205f 4a584178
+    4aff8211 28c40fe7 d7ad00ea bc79d3e0 ea79761d f286ef01 f94d7acc 477666e0
+    d92e7733 9623bddb 190d8327 e1b02dfb a957b0b9 83856db5 67cb7a28 494b772d
+    51a89487 7a78fd96 c6223bb8 a7e9b18f c01d13c6 b56dc23c 15ca4ba7 72924cb4
+    97979663 bd3fefa6 77aa726b e4317cc1 f10c4697 ca315ae4 455ccb06 6624e5a5
+    84e18bfa a1b0f668 d18df891 743ac7ea b1fd960f b30afcbe 09c09c94 9c626d34
+    d0682c7e bcec598b 9ded3705 bea57aeb 47015c61 8c8e1a52 d65f686a ef81ebd8
+    9fd57079 6bd4439e 9e3bd72c 979a7af1 7f2228de 9a68a067 c0409595 29749e76
+    d95cd2cc 0306acc0 91a18b80 3ad40bf9 6a5c6977 105c718c 96874e27 cc64025e
+    8e290578 7117f7db 02daf845 a54f8a02 5846cd0d 31f2959e d1a6a3f7 36e0ad5c
+    84ed3cc4 afd16a21 3874d092 f7c38d2b 007316af adb1fd89 80f0b345 69bb4f7b
+    917b12be 484a9713 8cd6b23c 87896ba0 00cd9413 e4af3436
+h = 9c394cac 76513f08
+
+k = bf2d5499 4b09f6a7 0247e89b 711875c2
+m = 6cf3a3d3 02dfa25a 4b6ffce6 66f1fb7a 4fe984f2 be4a5c6f 83aaca71 354151a0
+    f2d6be35 f6d8f0a8 37b04797 9a80f282 66a69f80 57f10587 19a5898f 1df9c91e
+    abee172f fe60f4e9 994ab6a6 800f4448 8d3baf81 9067ae17 92643207 4136b60f
+    91d254ab a6e7289e db7523a7 a4c696ec e0fdd71f 8fc0262d 970dbe6f 345f8f95
+    9b8bb44d 9df4944a e4b79c3b 18460e1a c500d82a 487cab7c 98ad1fc0 b85e4812
+    ac5f58cf 64f99f8d a16c53a0 51d88893 641f3d02 fdddacd8 201ef5f5 9007e333
+    7554ede2 3210363e 049c008e 8c62a8c3 6e9ff3fe 15a26378 1c153bfa aaae16a6
+    c41c4695 1ab9a915 22f3be38 874fb0a7 4ecbc132 b00dfcc2 e3b1f9a8 dc42af4e
+    0a6d56d1 68ef0191 335709a7 f95a37e4 f166447f aa445737 2540ff7e 01b5b0cc
+    91212ef5 48efa5ae d8643d65 a931d31d 9fc348cf 86d87e32 19934a59 2341cfb9
+    fbfca622 a5af08c4 f832402f 65b6f332 ce35d84c 971bf01d e254286c c38e483e
+    b8802913 4c64e566 a8152889 a2e996fc 62cb8b63 996a584c 95206857 bbbd0adf
+    684aff91 8174a76b f822df99 623a4dd3 2bad845b 3bef06b6 87492623 70db9aa3
+    e2b33a64 eaba5c4d cb52179e 0df1e617 173ab487 9621ab97 89f1e2dd 7131158c
+    64282adb 845ede9e e2844caf 7690ef13 ec823a02 bfb95b07 1f1db1a6 b35147ae
+    32b0039b c51e2c25 adabae67 94a9b828 e518d35f cb8a1649 31632727 cdae660f
+    ca8de57b dcff22a7 27919bc8 ab441ee5 5485860f 41af0cc7 fe0888ec 44bc128a
+    be46e448 dfbd26b2 e352437c 569cc98c 5fa387ec 60d00729 28497a0c f9eb232a
+    45dbf24e 82f3f71c cf6810a4 b5feffeb 9904ceb3 c8e906ce 30234f65 8fb51b51
+    16ec3ece b8d673c8 ff4485f9 f822a7bb 5e4c8b85 28d6589a afce872c 297cf58a
+    57a66a83 d11afd15 93e407c1 626950b7 2dcd4183 cebafd6e 9335cfef acc35f5d
+    43d4654f 7c917a53 24104566 2e16cb44 66a60816 50930828 0a58d8b1 0a7c3ae2
+    773e5e05 6d10eed5 a64c7069 3884a262 b2c044ba ba9c06e2 b8a1e92a e38e1b53
+    e4274532 49daa8da b7be8dbe e4a9d639 a2537211 76344976 dfdad7e3 0248d0ed
+    c22c645b 22973fd4 f1fc6a82 b965fd1c 84db1a9f 2fc1766f 2bc7c4f2 6302bee1
+    8f866979 7ff11133 62957192 8d00907a 7d551e48 e28f6779 ee2212ca 17e89312
+    5566dbb9 f4f9005a 2b95de96 87bac536 9e917888 ee335467 1d7823ba 86a8379e
+    e100b0c2 21ebf41d fa53c0d0 2e89d0b8 7993ddae 44c6d2dc a2fd2d42 00b2f832
+    f489bf18 31f89076 f3f2590c c5f53643 806aff32 d2507a2f 2df7045f 2aabb5c0
+    1a6a439d 7fd8ddef 3c903550 3b9d776c 78db170a b96a3a06 1d137d23 e5423688
+    ebbc5db6 6b81e3bf e6441d98 6c589560 5683cbf3 75dc1f66 50
+h = 7116c405 2aaeeefc
+
+k = e447b629 f1b1f3ad fb605001 af5ee697
+m = bd4494c3 ce96a6a1 90a18454 f111d521 6611d11c 3bad9c01 2728ceae 843e1023
+    916e4060 a6b81e5e 04d16584 a9458747 4bff088b ed90dffe 1e473f1e 6ad09d9e
+    9f5a4ce4 b6ae38ac 6f60949e a0a9ce98 0a3c44b3 278847e5 0241ac73 bf3b20af
+    99b31800 f1e87525 10253d07 7a40e00a 95a40a1a 88a5d6f6 f7542128 66ef0632
+    6212031d 99cf82bc 3577774e 7249f23d 973d177e 53ffb119 2589b0f1 aaf62d69
+    10914a31 695e0951 10e90675 a8abc8ed 4314b086 59bd496c d79f2290 c9bf52c3
+    1df39577 709e1de0 58ce689b ad250217 ac18b8dd ba1e168c 5e39858c 65916f66
+    23815bf7 ab1d97ab ed0cb309 5958a155 184484fc 82d8405e fb5801c6 c3565b11
+    8d7190a5 4086fde8 f26aaafa f605b1cd 7169f3b0 12a3d8b2 7622b2f6 86e1d19a
+    279e121f 154b56a0 e86de5d5 af51dbf1 d93bc2fc deb57856 a2986e5f bab4e7f2
+    11148c61 2564cbea 0e2a308d 91af75f2 c78ddc8a a0f7ac5a 4b0562d3 d1ce5eaf
+    67ac093d 69047b49 3744e814 0a38471d 1d94fdc6 915faea9 034327aa 341d8e90
+    2303b210 fdabad41 09958605 39bac505 305de660 9c58ec24 4ff2327d 39546f53
+    1fea79a5 6a5759db 498f368d 499e564f 49fb37da 7bd97c42 69b0c964 0adbeec9
+    cbe18e6f 31f5e803 7b4f6f11 2821da59 d332a7a9 80d5e222 2c5f3d93 83005661
+    80e2ff64 d0b36596 0b1e5088 4d21b8cf e6f6be28 79a3523f 29a8f3db 3d9a4f2c
+    733c4934 cc2a6642 c803bfcb 3427f66d 0c8500c2 1a9c954d 9dfd2d82 b74b7509
+    a7a1489b 68390c59 9281d467 8996e9d2 6d14d7c8 98563e3c 597ca80a dca06aad
+    5edb8f44 9ad24b50 867d0bbb a295e0c0 d0751231 135f35e1 a95780d3 0256294b
+    6dcea5e4 537837e5 cb216d1a 0f146f56 0f7d32c2 3ad987c1 1800f42a a29ecb99
+    484cac66 b1c8e075 341fa9df 6779a6f2 af3a0a7e 3119bc7c 30ec94cc 02acef21
+    07077e37 2813c4b6 3894de24 91635fe5 51b18856 2a005a08 6e03738a 24d150cb
+    df8ba882 b75b0818 d1d1064f f9d7bf5f ed59d0fb 95ae6b76 98502a08 a6c3e787
+    7c5d3cbd 1d88f968 175a9cc0 163b2d60 22ac1056 0d3add36 8462b4d5 a8105dc5
+    8e617bb6 cff35ee6 3bc11224 edcd8d22 e82521da cce62dda bb14efeb 82839fe0
+    f29c16d0 21a58498 2f93b989 f06336d0 d0a98956 15751037 36de2c1a 6cb84bbb
+    d85e840c 2aca685e 186fcddf c973ec62 c10b76b5 ba902bfa fb4ee289 16b576af
+    adaa9d48 75224b4a 9d99a27f c63e4e07 d595a00d cf30bf01 2b405a1a 014a17e2
+    4417878d ee6179b3 b73f0a03 330f0029 b45f626f 38a36c6b 767fa28c 48bd5a26
+    8291fc1c 89e2c962 9aa34ad2 eef84864 d192cf7e 0831c854 676e6bcf c0004fdd
+    b2fb34dc 25758dab 04cc7852 dbbb7035 40156c7d 28926580 e52c
+h = 55788c1c d8fc4eec
+
+k = cf34543a e5cc1997 47351e3e 25d42d65
+m = f79c75f7 2141759c 144476f4 4ea20a31 d7b316fa 2897c218 3952c854 f5a5bb8c
+    c8494230 057d4301 3450c539 91d9859d c3350c5f c8b70cb4 5cbcffe1 c5f3150c
+    3103202a 8fc525b7 808b4f1a c62e4c8b 50d8e9fd 180875ab c01bbb18 0dad6aef
+    23d689d8 715c4c8b a41a1397 f0c67340 ea90411c 1ec5cb0d 67b56876 d2952425
+    5ba684bd 137f065d 1ee09f93 f5bbff95 751f2ae4 2af2d96a 1d33227f fd889ffb
+    dd3e91a6 9ca1a502 98ec13db 7cdfda00 19257319 0c221ad0 58924105 072e4c2b
+    0991871d 1b7fa713 ca7db83f 5bf25064 651b4d12 b2b8b376 f3ffd246 7851c48c
+    05e20607 1d714c12 a70fec26 b6f599bf c0351d7b 2715326f b172adf9 a151b6ff
+    bd05271e 00d1f0b3 d220bc97 5eb49aec 7ea6b40d 4fc192c0 a0ca712b bb47427e
+    dcc4170b 4fa8f5ee 91a0f36b 2b0ace25 4825c282 481db8f1 646c1bbc d1ceddc8
+    f309a40a d3349448 206ffc11 65460b64 d7fcbea5 a5cafdec 80046422 c5164ad9
+    69e586f1 49b0ef84 20a5ec01 9bf07948 e61e4a93 0c88e266 df188992 35a7ed18
+    b83663a7 8fdb9614 8abdf0ff bcd36441 1f749cc8 271817be 42dbef7b 168ca4a4
+    780718f5 f5135177 4213208e 499ea6e4 319e3480 d9c618a7 fb6326b6 a21e41fc
+    f8b2598e 5074de56 583a6507 6c5273f2 50a48de2 a3edcb50 f7267f67 5bb6dade
+    b8fb6a82 e9aaccdc 352e24d7 a695517b b9da1137 575450e6 322c44c4 c276a89e
+    5a102f01 75117c97 038721ff c3335e97 8df5ed28 3055c1e8 2dee0c89 e9f62291
+    a9dbcfe5 05382b5b b53a7fe7 2d530d9c 0218c52b 6f587ccd 5c22dc8f eb870628
+    b42e1902 74f8f9b0 36df3000 4fb1c254 811b62b4 f4bfd5d5 8ed5aefc 8ddfc83e
+    f925dc56 f7684c16 e34c39ae 6d870e11 ff89044b da5627fa f2418618 dad5c815
+    139f935c 607ef957 42af33e9 86d6fa43 c062b359 43975e46 ed8cf705 17463b9b
+    943030f4 13ac67e9 4a61a857 ce7ebc21 8b38c391 5fc9547c bd332f2e 175800ce
+    dae6f5df 08aa3875 b624f079 12d1aa9a c4e6a574 3758749f d9e56aed 0f461dc0
+    c6c6dcd5 17b7ffe6 3e5ffcb1 8dbf68fb 3dfc4726 0f61ca3c db887d07 da23e960
+    469986fa e73c7934 39cc7917 0b61ad62 c072faf1 36e64090 cb881896 2d699ff1
+    c1c26a3f 6d592977 a557be0c 28883a7d eeb0807e ad7a1169 34c24441 77069112
+    ce03f177 45144f00 25ad0022 fe1d1f37 84d96bc4 c02f977c 13a90a76 ea3f6ae1
+    66f3fcad 9bbde72e 6bb2b6ab d0fdc176 b449ff33 4b8e57eb b38db32c d6060bfd
+    babcf6fd bb3ee611 c4677d1b 83ca1455 57363b1c c4d6ac23 19d598ea 49dea4c0
+    dfd764cf a3ceb598 1c5b5c3d a18a3263 b97aa926 0554319f 35e5a115 6a61cbf0
+    134303b6 b61f0f43 06555d61 1c174b23 10ac7f40 6d93fbfc baf8ab
+h = 4fab8d65 57e9a820
+
+k = c64194c0 0726a18b c4c576a0 df088b15
+m = b03a7c63 9d3e6588 26bd954d d7448811 5a624c3f 83ee3103 1cf8114a 6aad3fc1
+    6a70b580 0579f6b3 cc24fc0a 07a4e670 dc6851c3 fb5acdfb 3e2c57f8 32439428
+    08e07c6f 178ba0b2 22343961 ca143d85 1ba8f2ec eaf95668 8e0b3b16 97d62584
+    737caa7c 1e80c59a cc8d5ffa 578c2066 fa7d3cd4 b0d0b4d6 6d5f455c 6655657b
+    608be517 ea062d51 acfd0575 93693232 6c55d070 150b86e7 f6451448 19ea353a
+    03a2132d 7be385f9 ca4d3ea4 fedab1d7 91aaf20f 8befe408 c66c0911 4a4b44fa
+    365f3663 39a014a7 e5cc9cb2 49c4454c 8b37db96 7c729076 9f88f63c f746ee1b
+    4b34cbde 9bf9bed7 138e34ea 5663ebe0 841bb9ba 31e74aa7 acaa3aad 6a4a5c48
+    b7f5f36c 6ce8602c f32ab753 c2ed4359 4aece6f4 b1bb30bb fa3d9f91 42c67307
+    e87feeb3 f901f2f1 6c533c81 0f888ff2 8e6bbe4c 14b452dc a0d3b5ce 9e559a4b
+    f259a43d 21aa531f a744cfe3 45b56768 922c1c4d cee2809c fde95a55 53c96741
+    dd28d6e7 82a5e746 d9c79564 4516e023 257aea8e d4401ece d4a1fcb2 e91c6cae
+    1a664d7c e1cac06c 6f8f3665 3f6ae2e1 bedcc106 1c513b36 2b6c19ea 8e7e8bd2
+    85aa7118 ebeba358 3e8e08a2 dda1e6bd 2c2687ed 8df80968 6f56d021 88c442c0
+    1db033b1 63edc131 b236d223 78a713f3 b2f1b1e7 de686607 87866121 2ab3ba22
+    3becfb5a 83dc1907 ec6df6cd 97768ffe 289af436 967accdf 4533b337 786900f9
+    768104d1 e5d37057 0d15906d 3ae62db5 9df6c7ea 83910f5d 255d9fbf 9831e77c
+    b5b7299b de5f3715 44b61a2e d699e155 88eb0c96 ee48df18 dc2cd3c9 bb0caa5c
+    06e03279 ae741f97 1aa133ab 1c705a66 98449e0b 960704b1 85b54d90 4747eb48
+    818b1740 f31f9cc9 3e4ee3d2 7e797199 499c33a3 3568ec9a 581d6434 035cd8cc
+    2cf394bb 0c55b92c 0d6bc958 51767065 94d16d26 24fa5087 7cf7c371 5567b027
+    b9fa9adb 2536f209 37c9cfc7 0d12d6b2 c109bbfd 12b112ce 8cd1fc96 e1fefd75
+    35d05959 3301e504 88202ef6 a43be597 44ef8f65 61c3b589 5a2a565a 0f694afd
+    ec0084bd 178984c8 2b2e503c 8b4ba6d8 1ead8984 3ce1d4a7 3a0fe62e 169dc4cd
+    78fb36a3 079d88c8 4e439b11 060659ff c3d46631 b101f05b fc84a48d 8c975ac7
+    a877a518 a77ea828 291aa5c4 87dc26fe 5b94e917 1408fe28 65bb1cb7 41c002dd
+    db793953 a9f83dca 289667fd 8ab8bb99 162a6aa5 7d3cbc67 fdf0629f 117cc819
+    e471bd23 ab0ad141 8b251baa 0354dcdf 4010f4b0 27434167 5a4fa143 6f901b01
+    d700f95f 2f5c272d 8a9c7cdb 2c0d8c9b fe58faa1 960d626e 5a14e9f3 61639e86
+    8d7b9dff ff7c5c9a d0e31049 163e2e66 35fd09b8 cd43063b afd67399 a020a046
+    920dea36 7abab4de 2f5893b6 279d82de eb3d0ebc d6407f57 0301907c
+h = b2e5c123 e013fea8
+
+k = 4e56be83 869a37e6 1cbe7ced 0a040ca2
+m = 92acf0ae 54bed67d 4eae85ff c5a20066 b1b8ecd4 3b6aed3f 889cd862 d57d3164
+    dd3c71a9 eea0535b 951cd796 cea87c0a 9964a97a 3a74103a 3c0d1d7f f3ef2f06
+    d7a96c11 64a14eef 9976106e 2c8c10da e8dc16d2 bdfd48ee f033134e fc9728bc
+    e10d479a 22cf8321 33d8b11c 7fb15e8e e69ed3dc e0c88cf9 d2cde30e e8a53d8f
+    2e845125 41e51db8 b9f1d11c 0d4d87e2 61a9d0f3 45436d1a 87462b7d 955ef8d8
+    e129ed8c e262d1fe f98707c7 4338f9d3 53e2ecd7 770de484 6078af55 85e69868
+    2504fc0b cdd1b770 c8238bd9 4c9f98f4 67722c61 2bc56c74 ac0afd1f cbf15e78
+    443c1227 52c5b1b1 af17954f 64068627 2b89ac5d 3aa4d73d 8dc95eec 5a0e02d5
+    b0bab77a 58a5b611 177f0826 7d13348e 6d744004 12e03e8b 458deddc c697a88d
+    723589e8 6f96bc58 3d79d223 a6e0fc19 f05cfa13 7f29d2dc bf1a76cd 64a53a91
+    cdd3a582 daf7c777 218a9b35 b8850aa7 cb0e05aa f6087d57 23923282 781e495a
+    cf8f2414 9618fc65 525a2259 f4b3401f 082eefee 0a1e819d 694da401 b8c02c84
+    6d79edb4 a5ae36d7 53935c47 12a6c2da b89a4503 8b0b824f fae616bd 0c55677a
+    e2c53b5e c3358e34 09204787 c5810c83 e31452ef 88bf68ef c06f9f1f 78fa1994
+    e89e3334 175d5473 33155e4d eaeee08f 90946bbc 7666abca de05c3e8 20257414
+    2229f6cc 480718bb 45347dfc c7179659 81bb62c8 63a15baf 9091434b 21b900e5
+    70df9ab7 9544be76 33971e71 3d34f838 f1da9dc4 19149169 b6d005bf 360043bd
+    8bd25cc1 513c2f81 f4441c30 9ba1c205 28efa553 b856c534 d1c51150 cdbcd139
+    db7fd44d e66d8582 812206fb e3d65636 0b1adcaa fcb8f9fa 883a6c8c f49843f2
+    e678ff73 6287f9db 4f480cd7 40364a72 6f5c53ce e9df4246 a100f4ac c3ddae82
+    16b1424e d9632667 b0a3e2a1 e06d01a2 8c29d3bf 31ca8a80 9afadbf9 db653419
+    e7d52cde 7da06223 faebe23b 42a8d4ea 61744599 69387713 57756a67 600ae6a7
+    66714a7a ae4e1138 0e720643 0fc3c4f0 507e69bd 3a328b8f be3dffc4 d6ad684c
+    08c95a33 a5c36462 4339ffdb e48ac379 293fe0ca 51aa6bb0 4b57f9e0 b949d0c1
+    bc3a20ce 1fcffbc7 8ad51429 341f4fa3 94caac71 cdc0823e 2eb141da ec1fdd11
+    dce0227e 152646a3 c0e84ee5 68e2c80f b6746542 667b5ae2 4a7cf56f 9c187803
+    f3eb3bd8 33c8762c d4fb2ed4 87805840 0f25bca8 619a0085 7de45d32 a8c2cc1a
+    8fe58f97 3759f981 67329f4c c8631ce5 bd711557 fe503850 99e913c3 bfae1d80
+    79ce20ad a92682cb 27a82f4d 54d6d61b 2d2c99b3 f72bca66 60866bf8 8066c87e
+    05644d06 6ddce398 6ffe3685 026a4853 f7fe62b9 69e8e3db 9a475958 a48bcff1
+    5b7bf72b cc6efa77 9e9914cc af4d6c3e 4ae70d8b d092e9b4 9b5ad449 87
+h = 44009a0e 627ee3cf
+
+k = 3217256c 19d1102f 7a966090 a703978b
+m = 5e92ddda 867c5494 ec0ac409 c25f8633 759b7049 058b1242 c05db613 dddf6fb2
+    af356d6c e1db7db8 cd52927f 557b7bb7 94cc921f 27454f5a 31500dd0 088c2f78
+    7fc42afc 8f4d34f5 c64b110b fc43b66b deeddc25 ec8cabe3 a047dd33 b5703aea
+    d90ffe0c d166ca2c 54566b3b d38298a3 592980fb e035cd24 eff1c2a7 d76e031e
+    ddde16d2 ebcfe370 123152a2 40084ef9 890cf011 3014417c 2f919215 ab257c65
+    5c33a5a3 32d26506 792f9847 2057ff0a 20c912b0 f04fd0be c19f7403 a43d6980
+    ee12b36a edabc0d6 63abd624 f63ae8d0 c12d03bd db312d8e 2238f362 2f1a8f12
+    c4207a5f fba66620 c287ac37 090f63ee 03d265b8 50704832 7d719ed2 376a5cf0
+    2910d8d9 99d9dc93 f29adb11 fef1fc5a 5838eeb3 7e8ee4d7 eb2ffbe4 ffe82f23
+    3a216e5d abcdb819 a8c872dc 25f49b27 4ee26eea 13313665 ebc4885f aac5409b
+    3ad3edc5 d800e054 f1d2d195 c8d7863e 8d992176 c22c2428 028dc960 5bdcfd24
+    9fa6d349 49af263f 2363e207 417ee6b2 b823623b 1d4c37c5 846564c1 01cb665d
+    71391d91 175527b3 31020748 fdcee53e 63e384b1 c7ddf550 93f263f7 a14e6a22
+    782ec67b a2b90f8f 09458cb3 3bdd4107 95718710 c6d5b1d9 46aa5757 8a8e69d8
+    6c25f7cb 5a49c9d5 2ef7dbe3 3bc4350e e81f3b52 4b805315 b31ba990 5f6fe336
+    d12b7c0c d4d5af63 f2687c01 9f74eb64 c91f489e 1e406db1 02746a91 607176f0
+    666d706b ae25eb51 a60016b2 7db13cab 7c4fed38 268ed7b1 3fd56bdf 0a42ae9a
+    592a4357 62e46962 3c623985 c379e338 9cea947c 62a2559b 38bb98f3 fff93838
+    5435c332 bcf8d1f4 33e88e30 4ac75d85 9ade1e16 f95a4f4d cd19b602 69bf0576
+    4356eccd 9acdafc2 5f2cc5b9 1b5c350a 57454627 0978e410 443fbbc2 e584ec92
+    f0cc5e38 c5996838 a23ef172 db46da27 c43bebd3 23cfef1d 055219d6 54ce99e4
+    2c07d8a9 b827094a 0a89d75e f221166c 9fe748b4 8aeda96e 2e36691c 4ca60a80
+    92dac687 33caf7e3 43a3858f 44369c1d 7955fc90 f7801a74 c7cb3be6 9c6e09e9
+    7b9c82ae ba057a16 b493213e d66bafa5 48a5d7db 62a368a1 de74fd1f 9b9f6fa4
+    4ffef5e2 9639a586 fd6fef7c 5c174070 80088981 7f6be3c6 86377e58 d741ccab
+    a2c372fb 07c82936 63ab06c4 1ed42dd1 2446ad7f ddc688a7 5712604c 29105745
+    124dba51 3dee4775 89bfd428 1ecab78b 7678f0a3 20c04189 4f0a840d e92bf1d7
+    3fb5fc59 8051ad09 c5a27840 8d4c5d27 a16cc3fa 991d6263 c0ce102f 4901ac47
+    6a788ecb ba7f01af 20c13170 c3338d10 2852252c df4c859b 3642cfc1 a06bb9ae
+    658413b2 5a0f9ece 4a0ab3d8 5ab34613 ac5deb4e 6a7bc2d7 b3b5212c 0e145c9d
+    5a840de0 fb39fc8d 5117e02d fce4489b 77844f79 d6d4e620 05a91afb 3d31
+h = 7e92d4bf 20ff2483
+
+k = 85954080 76c2971d a099bf32 187d461a
+m = 46cbc4d9 afeefb57 eca44f2c de124a80 ed787569 5d0a386b 0c92324a 5f7ae25a
+    43c42191 436f88ab 8dfc94fc 9abd5c4a 7a525b76 9b6ad73a 2c580304 44ac7eb3
+    8c8b94e7 52437d32 c9d60929 b29da9e2 46003148 c276d0b2 66616b06 f6368ddd
+    3f1c5522 5585ab2d 02e814fa 2e3f6aa0 c286ece2 045fb4c6 7ac90642 49c55369
+    2d18ef72 5d2f97df 36adecde b3825c33 428c9430 4dabf86b dfb15726 8e89d609
+    43f2a8f1 d816cc0b 8f953f3f 7f770d66 eca1a2d2 a7458843 87d29eb6 1c53e61e
+    926079d4 c6d93262 4b54e4cf d4095bff 16c86be2 522c502d 313dcb15 52814d91
+    49c6c1df cb1b5854 4ac5a199 e687785a 2705f9c7 05f4adaf 752cdb62 d77b82e5
+    96dadb6d 0c0f159e c50fb09c cadaa43e 83cc3412 abf4cb17 61089a62 5ae4c827
+    582f9ea8 0300ba5e 76c91803 f3af5b7a 02304e90 f30c9ac5 0f06f808 8ed98886
+    1e40dee9 17e4b286 09d64a67 1f7a35b9 24269667 0114df11 c998d685 7c3d0e3f
+    09d41f1e e210f965 ffc8dcaa 74dabd50 f425941c 7fd583bc be30e795 ee8f6a85
+    08f1b1be 1491b2d9 e8b8b24b 8c19ea8f 9ede969b d9cbcf1e 6800f56d 075c7b3a
+    4cb0bf7d ec7ee59b 604d0494 a0482b5e f81d4f07 e3332254 13c8527b e609d956
+    55bee0e8 cc3b89fa 4301b51f 498a17fe d6d95325 3e1bdc78 9cd1d56d 29eecc83
+    74699534 c519524d 4adb054e 324e1004 e7c141e8 6d76ac2a 7fbd7177 bd562a2a
+    171d8a5d 2ac7b05d d97ecf07 38149a54 dfc34c28 4409dba1 df123318 1dfe330e
+    1739470b 9586480b d01eb8f2 8a8a4307 0e75ad3b d77f8ce6 e671d24f 7b874a99
+    9b4c10d7 0d561c80 3c5b4e1e 88d185b1 ec722ce8 c8d467b6 873adfcf e6c911fb
+    2b896da1 96f4bdde df45ba11 26067084 bb1de36d 5e084421 028c6a64 7266d925
+    03356dbd ed66c8fa 503f3032 18c8c195 0020727d c2c0873d fea66228 bd6dd5ac
+    03deeed5 c0125abe f263c2b4 18100336 88bd65f6 913090fb a769b2bd 6132593c
+    fdb4cc8e de09edd3 2e21f3c7 dd4522cb 41f4a582 cc184cbd 2025c239 e095be9f
+    94ff3a3b 2335a9c8 b67dc785 f490433e 0856126b c66094c5 514850c6 608016c2
+    0790087b 238fdd55 6a52617c 0ffc2294 eaf6f802 6f2c419f f0cd7f58 2de6a824
+    ccdd8265 9ef5aac1 e4438622 07e37977 f1f6dd0c db0ac476 bdacca4e 77c420f4
+    c2254a52 76f7f129 36364ae0 c98ceaff 0892d449 c83a65e1 7ca16fec 046d1dc1
+    06d008dd 4c1cc404 93d35686 a1bf1a66 087516ae 09b21bbd 8155c122 84926259
+    264df0fc 4cee2add 1a527d24 f154e426 1ea885bd 79ccaa30 ee8fd2d8 cd6eb881
+    3f96ea02 46cabbd4 718257c8 60fc5be2 e41e22d2 139ed206 3888121a 735a26f8
+    cfd8cf78 0511ee26 23e0b452 30b4a5de 537624a8 157efb09 57822eba 7f96b2
+h = 1bad550f d7433caf
+
+k = 27aa08f4 104e52ae cde044f9 36d10016
+m = 4c42ce91 ff7728b4 2b70d556 6c8605d1 9b314fb4 caaa4677 e2ae360b dc64c94f
+    37af86fb 048f70ef 86ac7d31 337cc247 73b2a9e9 cbf77ac4 3a216372 e1bbfc06
+    ccac5683 c99f6d68 b503b9b5 6bed51bb b21bdb83 7f381a88 6b5408ae 82141c5a
+    5644098f cf6cb99d 4387c9f3 77a3358e c8694792 a95664dd c4de4ce7 9e070313
+    82a5c152 d3438c3e fd187aea 125197f8 e39ce938 0202a17b 35f9a79f f46d4b66
+    dd516061 9321457b 1a64e1c9 ac79f6f6 3dd37dd1 dfe2d590 12c7d5a0 c69b59ce
+    c6257a6f 93daad4d cae3abbe f45bb1c4 aaef08fd 093b48d7 d2ecbe75 c5b2ca0d
+    50a7bfd8 0cbf410b 7c3cbf74 299a0861 68e145a6 13061ac7 c30885be 8b21fc5f
+    d2bfe841 33cd3fba 666162ce 3e914ca7 4d60509d c98924ed acfec7a4 447e4de3
+    dc08d5c8 2d718333 bc7fbc7b 641566af e997af02 9afff19c 94714b4e b960c7a7
+    dabdb40f ce2a058a 07dc2bcc 91b95da0 3bf72329 b3aa2681 f3c1827f 2d5dd743
+    ed4e7c19 1f8e412d 8c1fd023 f6cdffa8 a2725f5d fa7df507 81ac4058 37568b14
+    7121fd0c 0dee9676 84586191 8425fe55 ba450225 7ee1b573 adc5e856 2119ea09
+    0b9d090b 6e363e77 f2ec1fae f9303280 5e945823 e42cbe12 390d61cd b0260ff5
+    7576d7fc 56075114 a31aa7c1 e510e673 73717c89 d8f10695 d39ad811 0ac7adca
+    a2502b87 b9657ee1 10333328 8cc648fe e7f150e3 cfa62c2d b3ce56d7 a87e9440
+    b048daf7 454de079 967d6157 079b1c46 68cd8bc6 0fa2c768 bde47efd b524a907
+    40df9083 a0b283fc 25bf09f7 b043b4d8 2ae32832 8047cc81 d180106a 3428eb06
+    f8cb0a6d fface950 d89faf23 5df29134 9f1d8251 ff36de01 12b6eadd 285024c1
+    9170eea4 f7d8290c 8e3f3611 4c79690f 47bd71a2 c569cbaa 5a3f7517 15231745
+    fea08c8a bf893fce cb6606b6 d898455a f0c05b2f 8bb16e1e 73b00d70 1b25e4f2
+    39ab2afe bb322ca5 21fe8474 9c5654d7 08bdef63 4d363692 e4bc6773 68bca47f
+    f08f0380 7e68e13f 3137e432 65f01e2d 77b5afcb 74dc4633 30aa4731 3d398f32
+    2b3b3a70 796133c6 cd4ade9d 193dd2b0 634195fe 0f8dc1d2 f372f011 a87a1454
+    1e53fed7 2c22a7f5 6a6bfc95 a87923fd 66dee94b 929c4f9e b82a717f 82141793
+    86ad5b38 143a2896 ea8d1941 9b9e02bf 989fc232 e78fa929 ed8b6aad d498d330
+    0ee81ac6 852312fd 393fa3b3 ac0361d8 df7e2a16 d06bc321 b1ea3072 bc45fca6
+    570bd90c e7383e90 a1d443c0 a40d3a6a 741311a1 7b97c2f6 423c5a55 b9648bd6
+    9242d854 baa8599f 4a5afaa0 d96a3dd1 b2756fae aa61beb9 a5e1f990 a18e4c74
+    6852a6de 0bf623f4 2e919770 e5187147 9a8a9357 76c3aad7 462e2692 e579a270
+    9f8c18e8 eeabb952 a1230d85 3e3105cd 32c0caf1 e40200e7 9f94babb cc03fe9d
+h = 6a7e2e8e 95228928
+
+k = 25576cfa 58f669ed f04b9cd9 89ebe997
+m = c926b00c de634654 cfe2a170 a1c9357b b65c47db 7bf3a1ce 459f5668 c83d8197
+    d6435b59 27a144a7 f73e4554 2c312e82 d011a171 fc4763e3 9610ce47 25e7ae08
+    b3a7c572 6396cb2b ffc42a6b 0f4add09 a64175df 5b29c4bc 705b966d 11543b56
+    442176c2 49244fd5 6f227807 3b23282c 93918f56 6c612f77 ae433847 e20cbeea
+    14c8a994 81167b3e 9988f7d8 f4802cca 771e0d7d 6a51a4d9 17895ecc 46de7719
+    7d468adf 03b51fee b891b107 a961697e 2911fb92 69fd015e 2c5eff9a 4f508182
+    a0d0a7cd a135dd19 27a7647d 0b7e70bb 50f613da 1ce047c7 b26194fb e857a462
+    c9576375 46d23b67 db23272d 216be523 52e57945 b03955fe f3af663f c9954e71
+    9d6d6156 f95e4e8f efb1a644 13f02bf7 8764e820 411b263a 96e0373e 69c163cc
+    fb04e0ca 0d7945e7 11abd906 661d47ec f0640f82 d86a85ee ee42f0a5 eb1004f5
+    9c4815d8 623aac0a 17c1278a 373fb80e f3544fe7 b54be88f 1727b504 ea3d563b
+    e3d39c21 2dd63004 7f623473 622f5a0f 32eb1c43 35eaaabb 15f04eec b672e493
+    8651805f 49c6ac81 31141941 1adf8e0b 9ce9112a 5a1433d7 0c03c24b 7b5aad5f
+    0e6a5660 4d2d61f8 5f50884d f8b8efa2 67671421 f080da9c f1256f2a 2aeafcb8
+    29ba609d 3ec5236f b392bc8b b6b86a40 b7a0fb42 c0bc072f 9c1fcc8c 68d234bf
+    37f93f20 93f84982 414c9356 33007056 babb2af1 0df04125 bcecbf38 6ef588d8
+    1cfa2f61 f7bb30cc ec5345e8 e623c1f8 5759b56b 38b18406 04a80af5 9832098b
+    ed48468b 771b4c73 45703d56 6609a8af 2133953d 76fb8451 d9ec827b 38ca66e7
+    bd7d047a 23965c15 b8727e30 55d16e3c 30580056 35b3512f 151f5ba3 be204d13
+    bf3ed418 39520e54 96d3d00c 1f638a63 702f6019 9473742b 717cc3c0 5489c2cd
+    7a6378ed 8d167e06 e2ce73d2 a68814dd 6700b8a9 6a6599ee 4d41c849 cac541d0
+    0f0e0cf8 9ae2f34d a5720701 99d6e259 db8542d0 bd78e7d2 5de8c849 0e343a90
+    0b0feb9a 75f37195 33f98e8d fadcbb4b 1cde73c8 d58c9013 1001aaf3 71ce6418
+    c328c379 4aad1da1 c2a0fe71 1a2a4714 0bfeb553 92c240f0 037cf1f8 0f68a93a
+    e5f85c94 2100bf22 b32d42f4 6c025618 7cb94b41 653a9f0a 14117154 b0872da8
+    4754836c 07c1f021 8060ffe5 278d13b4 ebc4ff96 c4a511b5 2d6283aa 17449724
+    d906f39a 58d1f3d2 87f351fa e1607c76 4ad28555 28324121 609c3fe3 5bd10145
+    4c130a8e c210750e 19dd5662 59cae986 cfdb9a5b d55666c5 8049af39 ae60cc44
+    55410b60 26b1e47a ba9bbced 24c35b6d 89229bf2 a9db152e 6863b920 83928e2a
+    9f590afd 3a46b6ec 12069750 c95785f7 b51e4ff9 a0e73110 54f50723 dd1120fc
+    4515b2b6 3abe602a 723657ca b6b03204 f54f5ab0 60819031 69bca320 a6ada3d8
+    d1
+h = c009131d a353485e
+
+k = 41df47a8 1e34e074 f6966556 5c3ab470
+m = b596cbf2 f9e4f496 cd5dba93 f79f3a9c 65d3c5ce 0245bdb2 8c43d21a 1ce3044a
+    e999c618 60bb555d 54194120 9f8a38a2 1223fdc9 ddf23ec2 04c7adb3 3c3937ad
+    77453233 0a8cd728 a8e7de37 a764ef9b aed20096 a2304c4b 4b2f32cf 6e71803c
+    1a1b6bb5 4f2921cc 3ac13ed3 fb98378a c22387a6 a9f5350d 017bac69 07e58dce
+    67bb521a 54b739e1 b6e66fec 89e28e12 75b5ee67 33517e1b fb1a8343 efddd087
+    3cf463ca 6ad311e7 6fedcb2e 9b8042ce a7936c0d 87e56e26 c3185dd6 63f5f312
+    584ef100 410f9c89 a1fe8f14 cc3e8bf1 0137678a 41efc39a a386eb08 32f2f455
+    9f2fbf31 c956cd5b 25c901a3 51b85c88 834eeab5 b3c55fdf b8433ade 3c17d16f
+    7d17001d 1904f079 cef15d14 f4a5f5e1 76c7fa33 00ca5a67 5bdb0724 23601eb9
+    10efd6c7 2c3ad2e9 6f7722fd be6d0537 40417afc bf5b6598 e331265b 8adf9910
+    52f4f51a c6268616 c27dc62c 353c22ae ba32da58 5a5c9ba8 c001f327 d80c9499
+    4baa36a3 5ad4f3ff efd4b3d3 02ad32e3 884c9176 ba8b2850 f347b6f5 ae468e22
+    7af05a8f 4265510d c191519f 61557251 7142704c 255dd8b6 774e9010 83be1915
+    7a362293 0803c818 9ad33679 401815db f5a79d13 d9f6ae9d dfb14100 05720ee3
+    f164e4a8 f8c61819 423c3eb2 8b38362a f0e71080 416b093b 4491cdcf cb8c69c3
+    aed6530c a944635a 8d2bc632 75ac1d9e 58eafae7 71b55e9d 0fa6d959 dc4b5e6f
+    e428877c 07fb09b5 235fdce3 b8ed6e8c 9a1cc6a6 8d99feae 7871c734 333152d0
+    f9b1d562 39dc7280 462e948d a52bb238 be4e55d7 3cc87584 9e1959ce 299741e1
+    343896f4 8e9f13e0 9cd58d37 f2bb7210 294907c0 8ba9dc75 409996fb a0f42b7e
+    6b11b17f bedd49dd 75f2544f 592c1460 f0d601ee ce458411 a962d5f5 5820a798
+    e5a34ee7 9bd9e6a6 c4df3621 9718b705 3bc4f4b8 44ea5295 9975c929 3a8c2da4
+    e5284bf2 78a6f86f 260690ea d2cb74af 83df38c7 1f696045 694bb403 c5134cb7
+    a9c3261f d73f6382 2bcd7ca2 532dac15 e2ddbab5 3c150474 5939fa75 599e396a
+    3b9ec86b 441aff16 66b2ac67 7173347e 4c6c79ae 91512906 976b1a06 1ef11064
+    ce469426 8e1abd8c 641242df baf58707 7aef2a11 d12dd779 21ba892a 57f0a188
+    ff8e11c5 5d80323b 902c742d d131e66b f144ce70 961d1cb6 6163bf3b 483fb418
+    1b46e6a7 9a9d2d69 f592f447 1d46f81c da0ad1cb e2797ab0 251c471f 36c8a679
+    c19a89db ccfd6882 09e797d7 763822ff 26324bf9 7b1c6de7 6da38f12 7f41f268
+    4c131e9b 513cc3ab 82a9e5b5 5845e1bf 88fb989d 390e5407 d04d1d22 49d42d4d
+    3b9106d6 15977bc6 2c746a57 de125f13 2b3a3c9c cee20a55 a1c1d73b 29cef995
+    597ef3e3 26808685 d90e403e a3ee20e1 783950ce 2c74c79f dd5573c2 b8ea9ffa
+    f639
+h = 8862ef81 6356f92b
+
+k = fc5364f8 b36403b6 2cf042fc 48faaa39
+m = 4da115bf 09f4000e da13efb0 3aade920 c8a7ae52 905386ef 0ec01f9c c72549a0
+    c6a1e5ca 927e22f6 38ec9e58 4f13791d 85b38606 0281a2c1 a239f49c 4dbd96ec
+    996ebe49 119edf6e 4011784c ccc8b10b 95ff6e62 09d0a079 9faee931 a3487e35
+    b54c5d22 d9bba5de 4d713278 d1a8c146 1ce5cdac b4e521cf aae0c0cc c21ca263
+    a74daf77 3623ed68 8873f246 0e06df0e 487968ef 76f95d2b e2be3766 14230d01
+    f36a2d66 797f9d16 9cb903be 38083f3b 45d07e97 9cc58919 edcbac3d 41662b74
+    78b618a8 d2c1d158 e85fb8f4 29c92b9d e8b072f2 9b5b3d0a 0b64a010 d082d5d6
+    981d13c2 adef39ea 122e7c0b e5e73afe 39437da6 ca9c42ce eaaf06d1 b8763916
+    cd08a3f5 1fc6eedc 8f82eb7e c9ad20b4 2234d537 bc474d03 418036a9 2e8b2501
+    cd974330 a89ed906 bb50e5b5 86640e7f 2b756122 ec25efad 56106f83 f9260d1e
+    7cd494ed e611529c 2faec826 56c0b488 46f9ec62 5f71b962 7a08d32a 416c00ae
+    cd82a651 d12d0d39 4ce82f7a a1d8dec5 bfb3848d 50938d5b 040284dc 245ee8c6
+    59a2a76f 8ba64480 baae1531 192d7fad fda9e65c e2d235f6 183c51cb 4373e68f
+    3edd7341 f136ad13 60998eb6 0ced67dc 06ee2bfe f5a29219 d121c1ae 33c08017
+    d8f22956 275129d8 f1843512 2451d9ca 227166ae 05c6f407 71d2a102 e9c08369
+    3f62b6d0 e3dcc5f0 7bc4b0c3 a61acf04 355de6a3 61ecf2dd 6109940d 701d617e
+    3ca3f515 126b438b 9aca921b d59158b3 5d195f9d d887675a 4a379467 5706461f
+    c98f15c5 146ebe60 a4c6e8e3 463dc51a 6a516076 6cffb398 8a1e58d7 c9acef10
+    a4d3b1d5 78e34877 d23d2968 68103fda e6b4367d d035aa14 20bc20c8 238309d1
+    9955fb9d d88ba345 a8b5734b d41b1f12 32c8883b 325befcf 0ad6d740 36e072a3
+    3eefe554 5e6f37bf 22ca522b d40a2b36 8142451f 039dc223 8ff93478 bb8ca22c
+    772f1e1f fd7b0eae 8a5fd744 99b31e83 6b10b46f 440fd4b4 e12d75c2 c0bef5b7
+    e79f6045 416db99c 704b285c d398bf98 6e281fda 28b7e8a8 57a4af89 e4ed63e4
+    ac858b84 b3126dd1 e72659e3 c1fa7a81 74e3e85a 3770f82c 8a6d066f d9db541b
+    edeed248 c65f199d 8b0b0dc1 717bf615 43c58c83 6ddc0ce5 54db2439 f976d1e5
+    e0b29b3c e935ade8 0e9a1de7 4165f093 76e40c2c af925564 2b219762 12214011
+    d40b9a29 a1bf4ec1 bbef61b0 781fcf8d a1b18302 8a6b6c4b 80e73b69 f169b098
+    ff6e853c 76d63912 042ae5c0 5418b450 1d14646a 7d3b976f fc019a57 bce387a8
+    dd3294c2 d2658509 bbe336a7 1f4773b2 cce9ac20 982f227d 84aced08 c9440ab3
+    95c4d9cb a0c98a05 255f67bf 66112092 16a2c182 e6645d8d 3748f3af 5259ca2e
+    36f9d884 ac1355b6 41c83ed9 ab4cf371 99d2e62b 2e2f8278 abecd501 04c40295
+    11a05d
+h = 31972b24 c2ada757
+
+k = 14e5ecb1 b9e8fb94 4646af54 979dbc06
+m = 5d2c8b06 0e22885c ba3e6705 d1354801 c800c16d a4cdab06 f3209a0c edbb50f1
+    36151aa5 b59b2815 692057b3 b41ff9a5 d6369ead 4316c0de e333e155 a7b1cef6
+    b6d30ce5 c8dcf31e 232019d3 29db287b 23d7fdf9 7f6789e1 2abc88b0 0dc608e7
+    dede07c5 04a10d56 9426788a 5fd442d4 1fb3c113 07f03d02 f83a7b24 da90f2fe
+    bb88b478 8b09a3c4 248b74a1 53985231 cd7c9a39 31911bb7 b45b6263 4fd89be7
+    369748a2 6b966495 2ca3a00b 644c4aa6 ce3cbff0 2bc18b7f 7d9eb79c a1120b0f
+    6f282e28 651c4c31 a687f4c4 a1bf6514 fb73df3c 8feda37c 56ca2927 31dd9f86
+    80f84edf b576793c d8ebabcc b82a859d 78ee84b5 806a6d14 0230a76e 52d14933
+    a030880d 02f8e4cb cb876f77 ec03408a 5a01edb1 2441e0d0 f65085f1 434bc1d9
+    6934654c c73cc429 0b29ccf1 3ddf7601 967ed922 f4a29bc8 805f5e87 72285a49
+    e39e3b89 e9a15d6f 700466f5 ad2a93bb 9e15a666 9abc5af5 cdad3f20 054c1b45
+    535e23d6 4f7112ab 737601de 726425f7 7f9293d0 188db0b0 58e79613 6a6ed8f4
+    e06d7a8f fd3b7b9e 0ad4e511 b44b7784 14293756 027d6076 2673165d dbd12107
+    5c50d60c 6524f869 742ed5c1 52cfb382 423a545b d2b7f7b8 9e87941d 691225e2
+    f0f2df4e 2d4df97b e73b4fe2 63fbc0c1 16a57c36 b5cf591d 81342467 9aa7c5ad
+    122c179c 9e877859 1f48d30e 2a3e6c96 116895db 75bbc4f1 a413be55 30551e2d
+    97e8c6d1 33e3f03d 347c21aa 98c68ea6 702b44a6 f111f263 3913b0b2 12712870
+    925d28e1 f04cdcba e82ff787 4b8ce2a7 27d05bbd 89f11c07 0e227ac5 dad9276f
+    b1d9c060 14abde13 549ad66a 42344674 596d88c6 fc3459f0 b404a78f a539b203
+    38bd28b1 cb9de6e9 95890b8b 12005e65 948ed345 bf585db4 c91da9d6 398353b7
+    47e1df74 797259fe 53158375 28c16c34 704efce3 e39faf86 8e6cf917 ba2d207a
+    954ada84 8393a5bb f2feefcb 0709ea2a e0d0fd53 5564fe78 a846c4fb 89d39199
+    fda7098f 5b27f36b bc45c967 011b0843 41707d91 22c911d8 8f54eb68 22206858
+    44ef8fa2 61f5ee9d 31ec6f98 333b3459 26bb761e 9f392399 efac02d9 f1375b9e
+    af035bfb 70b0365b e15b691e b2eb6ea6 0c5f1a0c fca09480 017fcd5e 956f0387
+    8247c757 332ae9da 3415c0fd ea456426 844d4887 1b7be47b d0f4a4ee 109a36ae
+    0f2ea106 e29e24e3 33a6df48 5a63fbeb 3956e30d c29b1e2c 4de386ea 6127a7e5
+    4587a3a7 14684ea8 b008ffff f4b1def1 dc81e87b c9e7d1ec 0cf32ee0 f14bf2c1
+    a768f3a2 39331e7b 277599df a505f74d b02aa56a 2022b569 cf3a2880 d906245e
+    7f6c5e5e d51398cf 530f11c8 90d335dc f7b0e419 5effec02 6b973760 7dc819a0
+    e81fa26c 4bb47638 6534c9ac 3d5b54bf 85a51f1f f32c90d2 f10da1f9 413f7329
+    7cc95dc9
+h = 363592ae 338bfa0a
+
+k = fe7f431c 3c39710a cd592fad 9f569ee0
+m = df1c55c6 b56ed471 a8fadded c39a04b4 6d47e382 c619df1d 72b2c7ee e537520b
+    93dfbf9e 993dc4f7 685f34bf 6f4c932a 8dbea6dd eef7ab31 5a24bca5 6149b415
+    16aa1850 28183ec9 1d0dacf2 475b0414 be57d182 397477b4 e81fb698 d8a48c7a
+    be95969d d772a45a 5f9639bc 8324e654 d4fac0b9 c400720c 1d140016 4f7f836c
+    6c829019 f31a7b9f c238ac0a acf3afc1 dd4f3218 a5366f8e 351a5f36 46b5e7f3
+    e0d88ccf 4f46eb24 64bdbdac a8eddf56 07569f6c 52f72a0b 4ae1a75c 70813ce0
+    af0f668a 22baa7c7 6b2a544f 3eb46bf9 33b1f0fc 4432b7c4 4eb2b590 409a9cab
+    139baf70 89eaa633 962d74dc aa854690 562fccd5 b49b6bc8 9d4275f5 be97f402
+    644c3df7 a00971e0 97050f07 d79d618b bf8cc780 74aec0a9 78a5a891 21b9f14f
+    5dc2cb79 cd59c3f6 e94f5af6 5c3b9485 08db5fab f46e62ff b3421473 e5746c43
+    d5ed3315 b4c306a4 e2ccc758 679bf5cc a9338ff4 aaa2c027 2fd7381c fd994e74
+    d0165198 c5d5f8a7 0539b97c 48965516 73fc3087 bf2c1765 0b37580b 682aed15
+    05c9c506 0a4bd453 beaf36e8 8dd9fa50 0c39fe00 f69f0c0a e70bff0a ddb52046
+    a50c24c4 d6db5b77 b8ee27b5 44cb1d65 bded6000 6058d021 0d5a4cb9 94d56f58
+    4b2312eb 67b46495 e0b14681 7dbf3cb7 fedf283b cb93ff94 cea28fbd 59c3c019
+    54a82d09 176f086f e06b8366 21f30f55 2192f3ab e671673a f4a146dd 1401b6da
+    1b92d53f a62c37c3 5a9fe76f 52d52428 2dac0b71 cb20773b b620c325 a94bcb79
+    f6889275 f4549235 d888eb60 2341d358 f5c4d1c5 5d20f272 fe7e361a 6770f107
+    92ee78cb fda9c86a 75300651 71b8e4b1 66e3896c 70cb64f5 00f6a26f c1481ced
+    4faf9b97 67093cdb f216235f 6ee8f82c 94b51005 35879c57 3759d841 a29d12d7
+    5e84522d fc4e4a57 0d23da76 15c21080 7db697e6 a4a519c8 d067ddf0 3ee41fff
+    7b9cb568 f4c1548f 90ce3f08 5b8ab827 6fc12061 c0c779d5 f2e31c6e 1bf8f25e
+    816927f7 08bccf16 f0a24e6b db86b31f a6a97aed 86379c1b a6562aa3 e40c9002
+    d5c534c1 ee008dba ed856911 1b774022 8241e190 555dee5a 9cb23782 e364acd7
+    e72d6c65 4f6669ee de163df0 f4ec838d 78054f9c 1073becd e960a1e7 207c89ea
+    b89f8064 ffc95066 9fd0ab00 091f0b80 b3969aee cbac20ea 3d9b7f50 dffd26ca
+    152e5f6a f74f1855 6ad25ca5 280ebccf 2da6f3db db04bcee 03993248 80014331
+    c08dd9a0 b8b85381 60290acc 5d62021b 6b8817e2 dfe59f44 f6617451 a5fa4c79
+    6b8c5f32 1571ecb1 269c6169 7b64c6cb 0a5bd1b7 f48e78aa 462ce04f 9d9f3b18
+    aaa56ca4 3882300d 0e1e03a1 cc24f7a8 d72de174 6c7ab1a4 24e65b3b a8545919
+    8dc54cb7 cac5db3e 42e46f28 86abb1f1 94c932de 348384cb 5599c092 668b80ca
+    db735789 eb
+h = f34a8fdc f8884e4a
+
+k = 6089d81f 3afbae2c 20894ce6 304d603a
+m = 42fc4bc0 e70b9f30 6d3c0b17 fa1a42c2 da661eaa 5de5173b 0090611b 9471f601
+    abac9280 1dbf95a3 1f180fb5 b6789597 8714cbe1 8c0a2989 8153d26c b448ac0c
+    1a9901c4 8d176722 161b4422 21fa81b9 3cdb4e26 644dfbe6 eea27004 5300fb39
+    d36d93aa 47de3602 915c6040 cbd1bf3f 03bf338b c2eece8c ef201072 8d040818
+    5f06d806 cea50a50 16991a21 e0ec55ae fe33478c d16a47b3 5e38856e 4879cf8f
+    f09ffce1 c94ea187 f97224c9 38ff81b3 a7a3a349 ca4242c6 effc3f3f 51469a4b
+    9e620b78 c8b6f90e de5e4cad 1822436e 556502a8 e2523a3b a6a0a761 e793695c
+    10dbd2d9 3f8ff5c3 5b9540c7 b82dde31 d8c4703b 54e57d71 644dcaf9 3a2a0127
+    91a83e67 7673d93f a0cc01c6 7622d462 ac4af4f9 f581840b 1752e296 5ecaf9d3
+    11a0d402 f448d504 33d71693 56eb2a05 2ada951e b7976542 a830a48a 450c2ac9
+    3113d706 a5676de4 6b7d233a 7a8cbc69 38c7ce0f ddc5531a 59f4ea38 e69ce1a2
+    62a15d18 936a132a 9f242f16 d91bf643 a60e3517 22fc1958 ae2e0a9a 4206469d
+    a44e18e2 3cdcbc5a 45dbf5be 4dca6f90 78d02a06 aa447a96 ff933d90 fb215cf1
+    6b66cd96 51ca8c7c 60f115fc 77496665 209771e1 e4dece80 7f8f41b4 c1860820
+    44a81175 19ae9a1d 99e1c32b b915584c 0ad7f23e 5cfe08a3 9f04f357 5550171f
+    984f387a 9d6b1faf 332a6362 68c97000 d081180b 1dbadb97 6292ab99 a16d6d01
+    fa3985d9 a17725d5 2f21c2bc 90ffa9c7 c2154bc8 c527f917 b70e6a13 48ba8cfe
+    b1c05f30 d085d939 c6704736 695c7d86 289b485b fc8a5c8a ebd4dca9 84abf3f3
+    9e3cdeb6 1edbbe41 0ece72a5 bfcb05d1 2244df0b 29dcd72c 48b5c01b 2116402e
+    68a7945b 3488c466 ad0f4647 807278da b751dd85 1b74121b 9dd36593 f3a9eff0
+    b447c1e2 4fc951ba fa0a4b46 8f6e32e2 1172bcdb 456934e7 f0068c49 dacb744a
+    4b616771 fcc1f5a0 44b6b8e3 87a6b935 2469cf39 a1cdfee8 e87f9554 886fb554
+    e5846fd4 64aca598 94948894 363c5560 7f9d535d 4e0383dc 7c868b36 d5f9568b
+    392ffb04 9d81e62d 17cea737 41c6bdc7 bd1e4ca7 25e77de8 167fc12a d5d5e838
+    843e7b65 f18169c0 50ae1ae5 51e835af 908fbd5d 4142af06 2fd0096a 68a6042a
+    d194573a 315ad835 c215c58a 1b71e5cb 707b7ec2 9ee0a068 a65a10e7 7911d9b8
+    31883177 ffed524f 8bd7b254 653d79a8 a6820b52 d143ae25 47b9f0fa 3e60ff5e
+    89058fb6 007ce1d8 b5659faf 8058f6e7 e72ea098 9f7ca5b8 0054b94b 8c8d89c5
+    65b4f630 0245d85c ebfad338 2f2731f3 c911d246 d12f457e ea2dc320 61a9f501
+    0202b89a ec9b0a0a 6003bf3a 5c0a0a3d 0cc4b767 56909860 a23f043f 5913d443
+    40a6d4ce d1f81111 9f4c23e8 a5559a03 21e41916 76510bde 307ee78e 84901a4d
+    01127d51 f462
+h = b8de7def 828aa10f
+
+k = 796aebb4 60f94e69 782dac15 a1ddd775
+m = 2dd50ffd 9a300240 148b57a3 3ecd38dc 9c0ab191 44405728 2c670575 9783b0a9
+    5da01f67 31ed8f47 77795eb7 dadf6837 af7a1463 d11df23a 8046881c 5e1a7a41
+    02fac93f 0a805d9b 6d47b6a5 20773b48 20bc5bb4 52f5e78b e2a46a52 079525bc
+    a38b4a34 9ae36674 978956b5 5b593787 553034ff c80be353 f448ec4d 7a1a2a04
+    7766c31f 6a596c16 9d1ebf15 306d7171 7d9cbf1a 278d00c3 b701bb75 5a3dad58
+    7b0a6155 83bc5cb0 96362436 def121ce da414c59 4e4f6387 7aea4246 a64d3b87
+    e55dc00f 3bad3e3a 76f50699 9ae1a9f9 279d9199 b779ac63 7a529307 ff6ad0a9
+    e79ca206 96aaac87 7242187c a3bfd5f7 915d8d98 c5e8046c 30f0f152 61887c06
+    455bc71b 382956a3 6b7247e7 e7d309aa 56f498a7 580da2a0 fdf03790 f71fb9ee
+    1d30d9d6 638617fe 95753eb3 217cd773 177667bc 5c2d12b4 ba490243 e76754b4
+    5069f847 7bcc7ea1 b6e2162e 97b43854 beef3b07 3116468f 62d7fd36 a6cc1cfb
+    7bc06922 f1067c59 3b26a5b5 5a34b950 2b2c4afc 04e85d5f 9094e9ec b7a0de4e
+    8782acb2 eefc7386 f7b96cfb d9ddc8f5 563e050c 356b3270 815f1e52 cbe1571c
+    115d5ff7 b596e5bd 6e6f14e8 4f790918 5cee0cc4 809c189f e4556de7 4fb20736
+    995845f8 3351630c a0ed1b18 b41c5a2b e4e26224 5656f5e8 2ed495bb 51975b12
+    9865605a bfa4f444 2ded4fc8 b2e8f3ed b8c1cb9d e61995f1 f7c78b62 ed935602
+    39a4d4dc 6bc34a1d 8a33cf70 010f828f f77b464b cdf98b3d c3de0546 b92ef748
+    2fbe6503 c834cf5c 324facf3 8d7c553d daa61224 58620269 96312ef8 1a353886
+    ca0684a3 0dc90f8e bee036ff d440dfa7 78eebdff c9ea6742 7aee66f9 c32fbdcf
+    ad32b37d 7d55d487 9ecb5695 e7bb0b45 2d7c15cc 5a7d5a19 3a827013 1cfe5540
+    a4ff108a 86b6ca38 cc95d4e4 2df6f8a9 60b55cf3 1e0aa041 b2183b44 20c4c224
+    acb7a8dd 9324de30 58c084cc 59bd9ed6 f0841da1 b0d1478e 75a0971d 9dcb7449
+    c42cdaf3 2bcb2051 11bc22be 12a3932c 86c31ab8 6ec63994 c1f94bf3 963abbc2
+    dd79f0a8 ce89f7e1 c650903e 352722cd ff3c9638 5a1dfabd febe4b24 96927d89
+    c797dc8d c852c068 81d52f56 06d2ba1a 17097c7e 227e46a8 3a206beb 51ccde23
+    25b4c470 db988cfa 6a5010c3 e0f9d5ba e0213b6e e7307a5f ed36ed19 7cea35a4
+    9e6d62cd 1f70bf66 8d7f459d fdd94a4d a46833b8 6bbd9fbf 27d1edb0 6644f573
+    186e279f 085eaccf 77ebd72f a187578b 6a6c1e34 98d0caa3 23bb46ce e337aa47
+    20f27d94 2cac4cc0 bd9ae433 6a3061e2 99618385 752debed 7b8f2796 8fef793e
+    20b25515 d7f5cd04 8aa1de61 2fd9ac0d 3545ee7e 8ff867c8 ea10b78d 1048b695
+    4af1e8c3 9fd29e45 44668016 1c517fa6 89251d9e ab3bcf90 56ae1d59 c8ee691b
+    93f1f199 4738b4
+h = 9846e14d 6e204ce1
+
+k = ea5de9bb 64cf5102 d5996def e54325b1
+m = 9ac7b71b 2685b0ea 989bf19d 5c200247 1fd4c6d7 0465d28f 438a4c1b cdd41a37
+    9112502a 3edcd849 457d5a56 adf02edd fe2bf25b 2d452b8b f917c702 cb1c3dfe
+    6c1154be cf4a97be c3d5e3bd 92e8259b ea1198a3 ff925388 613b9cb9 10ab6465
+    ed5ef07e 4414407c eebca7f8 6baf1df6 606c8504 7af82e64 8f73cfab 0a770d58
+    e1278c0b 854afa70 83120e23 aafd1fdb 514fac07 4686f716 21e08bf9 d16461b9
+    d6344289 af2846e4 88994486 588308c7 5ff3f0fe 65586995 6049aa88 993758b4
+    4a20c0c7 380c8718 f78d8b76 eebaf198 ac4e20f1 e8880522 fd9aaf17 da0c1632
+    b8c4fe1d ea812bbd 9ba8e578 b46f39a7 3fc4e45d 31c98f1f 7b91c4c2 b4057f58
+    fdee403e 860e67a9 2bd3bbf7 7a9eca95 857e1ffd ac6e89fc 12b6bd98 d68de8a0
+    aa73732e 90ea6a23 b1bfdaa6 6196b404 3eb9a590 796445f1 ac853ae9 becfb792
+    8c5c5379 a248f990 3a7f54f0 4693f26f 31beb4f3 7be6efe0 a5111869 6102f389
+    d7e9d3b6 98c2c818 bd8a69ba 64e9fc91 c1492c56 e358af7d d5cb3c31 f108fa65
+    faa6a047 388e0b59 c63fa824 0bdcb46b a7e187e9 3575bb7b 8fae109e 836cf7fb
+    88d9df31 b6fd5e7d 18476659 c597b0c6 55b6a065 02966fd4 cd0e249d 6510e6e3
+    f3b9d411 78d5b8c8 202d9ca9 387cf447 0b38734b 87ae63c0 a77c57a8 18a2ea4a
+    38a305b6 0e939c61 0eb61bb9 39b37351 31d9c9a2 5c893371 9ff5bc18 f6920d18
+    061adca0 c93d5ab2 775b55b2 6ac2099b 53298476 98d1cd84 c13cc24d c7778640
+    1d9f7bf3 0aeadcc2 99e5fdfe 482a86e3 457e7641 1467ee4c 5673ba07 7d6b600b
+    205e282e c44c6aec fee21d43 cf96ce0c 24c1d50c 4c9b0bdb 9593239d 77742057
+    c8116eaf 0f1d9453 64df1b3b ed43ee6b 7b685ae6 44c58519 6a521690 61db5288
+    8f076bc4 a6e1bd63 a83a6ab6 4ef0db6a 1a1adf66 b86873ff 77a466ed f5064ce9
+    de98a1e1 4d5e1f0d df369906 ddce8f9b 760515d8 3a4f00f9 13f7633d 7bcfe8e6
+    d2bbd5a2 8fdfaa6b 6355f25e 9afce6ad 7cd22bec 80b76237 6327089b 6c19cebe
+    6c067920 c915eb3f ef07f1b6 8bdc86a5 bee244a4 7698ffed 13a8feaa 3dda4765
+    187ad4ca d786fcbf 78b94559 06348fee 4cf95ba1 328e901a 24fb6ace 5595e470
+    ed5ab791 dcfc54f0 2ab85d3b 45762c44 4ee62aa3 c63c18e3 654b686c 9eef7304
+    ac437a07 e8c1bfec 158a09d7 bc9ed0c3 87bd6ad4 c4171187 3cf93a80 27ebf903
+    e6f1e48b 8cf67674 8779d750 bb567ca9 ea8ee4bb 9f80cc54 1db02bc5 efbd38e1
+    4531c301 c250a7a9 1f8778d5 068e7f1f cbe2ec24 af385b60 4e7b1965 cfaabde4
+    b70f849d 0b1ef1eb 516634ef ab9c837f bf959e4d d37469e7 e47cfa87 f0435fde
+    d3c07786 8fd23465 18948fa4 d5fc587e 64ffb8be 92cca022 e8733471 0d3ea35b
+    556e5e35 144161d2
+h = a3d9f409 0a49e2d6
+
+k = ca89199c cc58cf93 4228b85b 22edc3f0
+m = 73817bda ebbc5854 bcaa43eb 9323d719 d1947c21 7138fe98 1e5367bb 2c3ff262
+    a5f84a7a ea9fb304 d1a9514f f9c5a056 2801aa46 094108a0 177e81da 41c21e90
+    ce2581cf f3b7999a 90000d9b 5aac28bb 291162af 698412b2 a322b72b fc193bff
+    d3d525f9 613c071f 491e15b4 c81374fc 803b2861 b3a35dc1 4178a7be a1b1fb19
+    b6548f14 f1644017 332c5000 c8e7b452 f27b4474 28314ed5 04628172 7e2ab445
+    3a50fc9f 462fb84f 07b16e0b 5f76459c 5cdd7bec 3edbed10 52f76157 bae10edc
+    810c0c22 9fbd56de 02ed9bf6 ff9ec9ba b58ae1c6 e855fbff b1234d8d 8e5af36f
+    b502762f ed8c5134 c469a3c1 ee3c5224 287ee377 5e572c28 ebf0a029 36bf03f1
+    0e2c7de4 97c3d400 999b34aa eb2e0f74 28326d98 efeef178 29934f05 4435bf2a
+    92fd6982 12cacf48 e6322c1c c46ef3e6 9ec71973 0cbdf8d0 f7ff88c7 a843c71b
+    9e7185f4 bd25e4ed cfe8fa94 b56b0344 d59715fe 5b67f222 1fc061d9 68409042
+    9609afa7 9eefbea7 1fe93bfc 64e884d2 d0439088 58debe22 42cef601 089b966f
+    338ca871 baa1888a 34675294 319530a0 8342b342 d376d3f8 22f261b8 10270c3a
+    b57230a3 4720fe2c 8bd10505 9e4468ac 22112e28 35fd7d66 eecb4afc 19c706b4
+    00b92bc4 89b93f1b cbe9db90 39260b3f 267d204b 424e36e9 1df51f37 40f110a4
+    80bfa922 a4eb5a4b c9ed35d9 1249006f 97f32562 5252620b 3aa48ebb 7422efbc
+    cf9bdf31 d48ff652 953e494f 6169ad9f b488912e cb8359e8 8077d7aa f6351f9c
+    d9a85f2c 1b23f414 44935cf0 4d31eae6 524e3ee1 108673a7 fc76ea31 4ce6eeb5
+    8fdaa5e3 6b436a73 f67f5e38 af025d58 c7415636 7fc5ff77 9d00a4fa ee1da332
+    539d8a5d e247d470 0fde76b0 39eae5f9 cb910b7e 2ff7330d 56250475 25dc69db
+    bb8ae6bd b96598ab e39bb38c f7895980 69a01587 60717036 fc621d2b 113b42a2
+    0f6facdf 73d3c8d4 8e65263d c34190dc 785f3261 65cf4585 df65b132 8d23c707
+    ce1fb014 340ed962 7672ac97 fbcb94d2 9b55f02d 3a0bbbd6 1ac32cda c9e4cf98
+    2c64d708 515f15ed 4b334837 4e4d0861 017e3d72 c08577d6 185e5843 1da68311
+    ca68e7cb ffa1c7ec fb145ffb 9a98bec2 2ab1ba71 20a26743 d333ca96 57a6d9bf
+    c4b8df9f fa4a74bb aa558ad7 3713f264 b4ee6217 1f36cd76 ae73c75f 2e635cd3
+    2b9c8d8f 386fea6d b609e1fb 99b55d2e 6a8529c8 74a1a673 fd2ee284 cd9ffad0
+    d6f67f59 656038e6 0c9b6a37 3045bc6e 5b99724d b8204501 74d9b3de c5d2b07e
+    f9ce12af b0c3c219 fdb39e9c b6bfa4d0 083fde6d 6e4840e7 c6d8032c b2210958
+    9cd60382 1af1c8f7 dfaa0f5b 6714cbec 6c40f478 c0f71395 210bd56b 5edece05
+    b5818b21 05e86217 da60e39d 03b5c39c 4f36f1fe e048fe32 876f05cd ba8e8ed4
+    7a1aca45 1e72801b dc
+h = 253ba9f1 88472855
+
+k = ef32d6ab 68f064d8 66ff4753 8abc8e25
+m = 37b571f5 db5ff7b1 4067b820 49db6b2d 2ebc5bab ccb61a82 9ecf52ea 125b7f7d
+    e2e72219 7a966876 3a1ed0a3 bd8de326 79e83551 78f037cf 8a7c9660 a1f1d7f7
+    cf98895f 4994fda8 25e87bbd 23f2f028 14b37617 f3394fdc 8c4f9ffb ef310809
+    b10f0624 9c798dc5 fcd7927f ca06e182 6adbbbf2 4d81de8c 5bda5af2 7554bbbb
+    99ee818f 2e34cd7d 9c9186b0 a351d8f5 388f220e b3e085cb f47f45db 5c63cc3c
+    21d6d638 20f19e2e 3e8df149 5b8c3d64 0d4c358f 0cdb1126 b789892c c1719f4f
+    fec53117 7a28d1b7 22d50aa0 4a11c8e7 6e5b9fc1 d7c10733 67d460bd efabe552
+    16d1e6ae 9f8a39bc 47189da7 7e1b553c cd5ce19c 3be7c024 0a2749ee 28b4ff31
+    bfd3b629 44c57cde da5b345d 1a599f74 587cdcaf 6659eebf f068a3e6 17fad897
+    23e47579 eba7679e 2a6c49af 26e223c1 d133013f 4ce5ef66 ecf9707e d29792f5
+    821a45ee 2da88465 37947d70 9271056e c8849651 c19dacfc ca4c150c 933471e8
+    de1d0976 2f5def09 c3e39059 f4c342be 00d9fa8e b9d674a5 a9ffd823 d7c3f2f9
+    d33cd80e f17237f6 ac87b93e 3100d1e5 9414b888 5b541b48 6e4c5cb8 bfdb9265
+    b83e30ff 1de2b82f 1af4b8b5 247fba32 26913d08 e146573e 1dba20da cadc2eb2
+    b345bac9 ea73ffe9 16a95ec1 a4b4b263 f9b80931 0defd0a6 13b3f748 b09bff9a
+    b36de62c 51d730ed 0e5a62e3 a898d167 4a0da0e6 47514265 f1c388f8 818cd6bf
+    1ecdb59b 2fbda6b5 4a71033a ca5bc444 f27c457d 3c1b877b 4f2ff508 3c1cfdb9
+    2ae49904 ccb4d03d f918b236 12528149 5ecb1ad1 18764c81 1b45ecab 29dc5b8c
+    8e891853 bdde172a de073e10 09ba7b8e dfdc47c1 a6e76b04 b6f8b6e7 b6788475
+    c3d51a1e 22d3fdcb 919a1ab2 99c27b51 315e01b4 95b9fbef 8c7e1b34 7f289166
+    ff9e42aa bcaf57d2 5a7d3717 c0bc5a02 e71a9786 40197ff9 edceeb0a f4628cd9
+    4407ca4f 1952ba30 6c9c8373 b08a550d cf0132d5 735bb36a fdbad10f 0732a9df
+    b36cccc4 693479e9 c9a632bb f383650d 66b60316 1ddb01d7 af3944ee 200e5702
+    5cac2a96 67d0b862 ed1c4d89 bb6fd2e1 81c7a28e 135da0ce ad8c3bbb b19a0c39
+    323a1018 805b3a55 37463530 b32bbecc 672d527a 4941ef4a f1b2c92b c99b0382
+    75842aa3 836eef66 1f1a4590 080e51f9 2e68e1f5 e14be331 73a06c46 630eabaa
+    d01d4986 91d30c2f 27a02754 2729acd6 010db261 6dc1586c ce73f2b8 18792ae2
+    9e5e6f17 85b2b5a9 e3d3bd03 e808c7b9 f003bed0 19cbf027 7b003b27 c261080b
+    cfc7bbe0 14b4a1d0 9506a1e1 9dd0f754 155e6545 e36e155d 8242732a b341c093
+    b94617c8 25aeec67 beb9dfb7 dddebe23 3f9b30da 9ff85891 a9a0c594 48aa86a0
+    a993c071 4f558fd6 fd1c5e40 77f5d6be eb39375e e8706260 90d61763 2527a3b5
+    e3c17f36 8ffdf697 2dd2
+h = 8d55dc98 21574b6d
+
+k = cce06f88 ef865ec5 51116a3f cca23565
+m = b6495813 ffc8990c 83a54ce8 d9c6430f 1a04d0ed f5c02a8a 82120284 2ce22677
+    fcab40c3 b38179db 33f23283 652b3fbc ed4d0723 58e92eaf 2d535c14 661abc81
+    19758431 d042c796 8b7b1b03 ea9b2927 eb94f21c e59df885 3d39c566 8e8b0251
+    329ced63 499486b4 542e18df c177dc0e ff2654c7 d35c4a90 acb79d89 c52b24d1
+    8cf228dc c620951a f29fe517 22f2495f 1d148e6d 9160bab9 d90f2377 7324360b
+    4c1e011a a6b72206 3505283d 1aa32ee9 5c53323f b8550eb5 ce2030c5 a4e83b29
+    1a4eff3e 340b106f 1d1ce940 00be471f 675ac2ef d010d471 a7948ff5 e29850a2
+    7ce2e26a 579d5432 69a03185 72652611 1fce85c5 01c66873 c2196f83 4e779a31
+    c26fc0ca 290177d7 32ef6059 fc93af61 8066de3f 8ee059b0 8610c8a1 2f7870d1
+    78956628 3901ea98 2058150f 638d3f2f 403e4357 4910293b d479254a a025976a
+    86d8e46f 546c15d4 6661b730 01334c51 76109124 a6de5650 58f841b0 7f3b20de
+    5947dc89 c1807f3f 46ec045b 6cda78ca 822816c0 ace08aa7 317f7857 aaf7deca
+    08c6bcb7 f9926710 34ff312b 53fcf679 fc259283 2d232239 d0a2df37 66f4da64
+    d054b830 89d10f22 29ee3fc4 414caf40 adf45299 37641ed4 93717b87 f7b78965
+    e5b7b831 93cfb6c5 cc8fc035 d6cb0e8f c3aa6967 716b09f2 f4a04c80 bc164798
+    8224d13d 0325d6f4 f8cc68e0 1666423b 1f8a0fbd dcc74e2d 80a1c8e5 5e730518
+    bf8d846e 3499e86f 922cda82 ad3f5e42 ea664fcc 8989d552 c1257192 8c30c5d6
+    e4823dd1 b85dea56 cbda3429 d2639c10 0e32268b 699c3a7a dd8b0d30 1bd61287
+    11964bad e46bebe3 689ef9e7 eb17b848 9a06ad96 852786af 04746cf3 acb5505a
+    6d12b41a 094bf459 8551b253 7b242ea1 08a199cb 72a23af9 4a31d0f6 994cc0ab
+    d76fa8e7 69b830a4 54d5e3e7 4d5c0143 d23ca9e9 9ce984f8 45cf01bf 5de04781
+    6bdb2e74 cbe9f0f7 79faa491 63f76585 11666fe7 0ab2c29a 0a4ef338 bb085b37
+    5c353adb c4666e74 f21af9e7 9af34c9e 1f7b5ccd 71d22638 ff695453 8a51b506
+    b383b4fe 9b29321f 52cf994c 574ad063 f4c011b9 4ae0650b bce70256 a49ffefc
+    650eec0c 6979ad8b e18b9da6 cff575ec 17b12b9d 38889a69 37b4ea4c eeff1b25
+    ec75a453 cd912a48 bcba85c6 6d1ff1ec 4a30b4ce 86338f12 8d51929e 23ec0cb5
+    6c5a536d 2e8dd53f d9bbc47b a84fb898 f4f69db1 06ee98ab e078fe9e 6189f83f
+    33103d76 4df99354 cfd50c3e 05b21f34 af331d20 2ca25193 64513c25 dc71ca37
+    bdc88fa5 7ad56e87 60b4e318 398f71f6 5658528d 2afbaf93 e5ae5ece 3e295062
+    a7b2c0c4 8763bbf4 7ce366b9 213a3a33 ae95d411 7f59774f 31a2b2dd e5218f9b
+    c0e2d718 9d986ec8 0db340a9 29ec4c3f b6f067a9 e53d4501 b87c55c3 97d9067b
+    011ccbb0 b4a6739e 431fc5
+h = c047622d 8d869111
+
+k = 0df79d3e 0afcc4bc e4f6dc68 e315bb39
+m = 04f6f474 0e8e74c8 d31dc5e2 fc9420fd 4a3dcd8d 5bb84cc3 6823edd5 c6616b3e
+    562acc3c eec77dc9 ce9ae244 ab32caf2 420de5e5 78b01abb a6d06b40 1125b1b7
+    256da524 7a8a75fd 6502228a 0e0e0cff 032db29b 241cb971 d001b4bb a76c002a
+    7bd9ff32 fdcbb8e3 4263975b ce1a92bf e60a74bf 609781bd dc0c5004 5445148f
+    8bdcbe44 a2d67eda dff9a632 bb43833d 07fab639 04a5c108 05f76025 f0753957
+    73d6274b efccfa0b 99b5525e 388b174f 924dd647 1271b8fd 5abf04d1 0dfd844f
+    26acb706 efdda83a 00187bc6 02f3fdb8 ca56ddbc 9ff26c22 5fdecf39 79328bab
+    552f4a30 5ca572dc 08a1410e 07e59461 befe8b0e d9dd4178 4782c84e 1c61723f
+    2521cc53 6d46cbf8 e6314261 45212590 ac50fa2f 9a1b1362 f3f098e0 728600a8
+    4202419d 1c6b1241 60f0c92c ad2670a5 23f8e0f5 f0763e4a 8a6771dc 42654f76
+    d7ff1c4a c2d6dec9 f632f598 7471314b 7d52ecae c354eda1 547ddcce e725c239
+    ef95ec30 ba947705 a2f23411 76975f72 f5a27335 ede2c4e9 d41e6c57 84e4bd6f
+    e0d84e73 ae00b64e fc4175ce 716d6199 b5f5c4be 10bf3d39 fe2cdf10 b6b50879
+    ab4a824b 01bdc91c 16d21e3d 4cb66328 77d03051 39d2bf9c 7710b1fc afd0d70c
+    0789c9fc d16f4994 03185ace 6c381d56 9ffa38a5 021cad48 35a2db65 f9aa546e
+    f0f1c32f 1507792f 45de8264 790b2107 bcfabfa1 9f33172b 1987250b 2bbe459f
+    3c98fd3d b15b1a43 8eb67447 5beec252 b1568f6e 2572cf66 7d5dcde9 a9ead609
+    17391bc4 bbdf16cc f0403db0 4d4ae5d7 c8a6bfb8 f9966395 c1e24cab 1c24add5
+    335884d1 c53e600f e9f16e88 d7a2dbdf 2b775b9a f3c1028c f484bdfc 9d3de2d2
+    060fd45c 93d9431b 92007e99 8492870a 980aefe0 165d0d6a 536431f5 5560690c
+    d831dd11 f15ef8ee e532e5dc 5e4e3532 6cfb1f3e aba76ae7 20b12a59 12de7be8
+    d6f26ea3 5649f4e4 4971ea45 c00a4f22 472bc8e5 48098ecd 958caf18 839840d7
+    9409cc51 51b64ecd 08a1ed07 5123f054 7cc4d246 c18254e0 1dc78eff 204bddfc
+    ac7756bc f67ff7ff 2e607b3e 422ecf54 20b84b0a 3453d517 b678b305 8dd35200
+    2d8b38c6 3d88c580 a9d15069 6adaab24 71f73bce 857f451b 359aae02 87e73339
+    a3b63a82 69b4c526 621e82f6 8c1be492 82352f83 cc0d1be2 190150d9 ddd236c2
+    e2099640 436cdd2f 5d3dca33 cba6c30a ec5fe861 7cbd3662 f927c032 e26c4c57
+    f95d765b c5783bcf 92adb6ae c3bdc700 e35e2b61 e208921e ecb44b2c c1f56d14
+    052768f1 eaa19561 bff747eb 65b15159 de160e0f 38162d84 5352f290 6bcd53f6
+    d14a5629 61e5db6f faa0ec27 6b071675 c948bd69 9b4e53bf 7b89afee a787c2be
+    2311a7a7 bd59ab28 34c355cd 1ee9954b b36ad62a 916415b4 b5199fdd 09bdecb4
+    992731b9 afb4fb83 72e470cb
+h = 2f08b74a c70796ea
+
+k = 75bd44fb 112c442c 49822e78 7177b46b
+m = e22270f1 132f7d80 045aab43 6308fecd 5a05f4bc 8a31db51 8912646f 65ba416d
+    17eb3e30 60667817 bd16f66a 1663d596 42448809 b7ee1c74 125952eb 23488673
+    d0e41837 cab98300 67bb5444 ceedcb9f a28d2c08 45ca9518 4d9df498 4afb2e73
+    09065002 0c25d4ec e75b6a8d a958434d 19b2706b 71725187 06927ef3 9a85e951
+    fdbbc589 b9028200 bbc53afc 1749f1e8 4734899c 0f2c6b9c 850ee50d 41efdcd5
+    e0c648af 2b95f01b 10d02486 051f13cf 93970b87 5b112fb8 c1186f43 c817c3c1
+    60dfec6e 3e18c516 73932065 8ca7316e 2e13b15b 18fd96f2 423899b3 7adf59c4
+    db84d4a0 c25d42da 1565c60a d96e4309 63f6d508 64667118 11875efe 92d9e0a4
+    0fab52f2 61d3e047 217592af 237cc754 34b410ff b8e306b7 35b04b1b b7dff102
+    fa9e0ff4 2bdbcc8f fa3bd2df 44f5e879 766bc0bd 0a0bfb20 8ad7341e bf18c127
+    e83097e1 c9bca2e7 53b6ceb0 e3a670b4 113cc97a 47e19b81 db5c8a68 9d489bd0
+    25c9b340 118d2963 09f00270 b5caaddc 21ee4ec4 7d7158f4 54162083 d529c5ae
+    3b7f79f3 0511bcc5 0ab45912 7ef5a19f d4ad8de4 8426f815 16a2f4cd b0aae233
+    23ecdf20 c9f41d03 4170e6d1 3a4018fa 30ced092 c009c3f0 b70500ec a58b6688
+    43465932 882738df 6e5de723 871874aa 1ff3b55d d2f0e201 ef5fc434 58b999c1
+    d17fcb00 5f35c092 92877a5e ab9c7ad6 0f2bb3e9 b1de3479 af361c82 23231622
+    4df2cc30 7440a9f7 e3a368ec c71e6601 3aba1f57 f6065f15 29544866 d08681f2
+    5c77d0de c5577b70 6676a92a cbe756be 28770355 f4ef609d 6ae890a9 ddd8e6b7
+    ff02d7b4 4b2e12ed d31bd2a5 4ef18804 4b69cf32 c61d59af 461603b6 aa32019d
+    f22d3c18 13e63300 fa66e623 98e6aee7 9b050651 b3f505da eaba63e3 185510de
+    785fa953 7dff47f5 796f40bc a3d6d74f c7b2f05c 66d0a875 655f45b9 aeeb3acd
+    832370f2 c7fb21b1 ee48f0f7 1ec3db14 1aa74d1a d6b96f11 2d070d09 1eb3e05b
+    5b1bb2c1 b64ef718 a5ef52ae bad92ae1 9bb38ec5 91dbc359 62e66be4 3f08c650
+    3a8ff948 b905a996 bafb3111 3a9c9dcd 20ca1bf2 0e1f1383 f0a89903 0997bf6f
+    6b987567 eaed2d18 1596a0cd 39624778 98d92487 8e1b37e0 153dd8ec 4a9ac502
+    10b237ef cf9e1a9d a064e680 a9d0db3c 4e916bf5 e273d41b 9e6abe35 a94493bb
+    f5ebc64c 57ca07ba 3fa6e350 68900d7b 93d578eb 5aea35f1 e88b686f 31625e04
+    89392802 f96c43a2 585dcb6c ee88d96b 5c6c7a5e 4c1fdc62 2921322f be8609ec
+    e6635abc b912295c bf3489da b79634b3 e1c2d436 1219b7b9 6b1a56a0 c024e8a8
+    381f4d23 2008a86d 1a4bc5cd 6ad0a665 ceccdfe3 67607f37 d191ed48 b6e10fd2
+    7826a796 a9f2f372 23310d5b 0a7c03f8 3e8f3f57 be30c216 a93a8296 23ef7230
+    fc6d432f 88577bdb 13ef90a3 3d
+h = 0a74fc20 b6028ba8
+
+k = 927a89cb d60c6157 7af2f79a 5ab28f34
+m = b0424ee6 faf52e10 bb65ab25 1d95b9eb 1e9dce1e 35ab172b dc5f0b3e e889f3b0
+    324348a0 ffba352e dee15b87 63dce303 f1e65089 d5ccc0ea d79a7391 f751b050
+    a17247d3 ddd09c20 35289191 4529227d 8dfa2560 fb1bf885 b3ef1b7a 94865c4f
+    da56489e 10516a77 e35fef0b b4c9e52f 336805da af9f9408 338c56de c5c4adf5
+    53284fdd 9c13a3d1 1327fd3d 336cdbfa 376e749a 53d46cdd 2482eda8 90b3640c
+    1e7e8b15 959c3b91 541f3cd6 189a7b38 ad3e98dd a41320d9 ff604ee2 dd650686
+    28b2db03 c110a98d 45575ee7 a15072a4 eb109b6c 0696fdf2 796ecb26 8736a2c0
+    9493c243 d2d7c250 45af6e67 32d7ab75 dda62bed de7679eb dbcc203a 2013a36d
+    8f60b9a6 9a7ad756 2867956c 3b2ba8b2 a47ab2c6 6178910a 9ae13142 728a7d25
+    3099653b 65c7c432 bdfb4b94 d17798b0 cdf8617b 026929f0 24f19f51 0f53039a
+    1700f136 72cada91 40d5d640 ef66cba4 2f3f81c3 e2c244f0 710b2c9d 3e03cf0c
+    b3014bc5 4699d9a7 84838c60 f8ee441c f9f1902e 380ff5e4 784aa7df bdd6559b
+    082f195f c51a2b03 1584b337 e396187a da11d03c f2104fea ad25d07e 5cfcecfb
+    6f8c8af7 4e82e00a 405635a7 11bcdf98 20e1589f c0663f27 f220ed98 1aa0def9
+    1215f861 809ac158 a8710895 c898874c 814aac88 4cf0315f c4d896cf 9f2e698e
+    962e0d94 f5409cf2 acc80d28 b2b1e0f4 4c3254e2 a2ef9f65 c65ea3dd 7b4d49c7
+    39760311 d0d4f3e4 9515d269 da894152 f023d1c3 80953c98 35c7d552 29fb85f2
+    5bc57bdf 824f7ad2 cf523dfe 7ccf45cc 1e8d28e0 5b4968bb abfae3e1 eee169a6
+    4ae46f1e 4eb05f22 b77c20e7 e681f3ae 429df651 55d186c5 c467ed2f 4bb8f1cc
+    eacf8653 ec3bfdd2 406bf9f4 a5c634ba 28da2632 902443e1 71b85381 f1299790
+    56890506 7e113780 90775b9f a016240b 431af137 aef500c5 98a315a6 bf1f9c10
+    d26ed1bb d0dcf323 7bebe7fa 8c5ee0c9 ac1e6f89 f13d65cb dc7ba8cc e00c8212
+    b852f16f a5d15517 1126b5e5 91986b14 761ed29e 495d79c0 a7cf3dbd 11877fa3
+    57f4a8db 40551723 af2c093c 8dd1bdf9 0dc770a3 cf1bfa7f 7f09c680 57fe84d5
+    3a4a3d1b 8229015c 5f720801 4179902b c290528a aa3c3786 6bf89f66 8b4cff3d
+    a674f65d 737f1530 22b103dd 783da450 a154b3d9 30a85e33 ff4db422 ef800f05
+    59f8a4b0 580062b5 b0195a1e da495894 33ded24b eea22291 7a6f6a8e 1dc1af9b
+    89791f35 41c55eb8 af11b184 1a75a6fa f30bca90 7f44b80d b38a5955 7b34c1e6
+    ae101ab2 37b83560 cdf47334 92311a6a 7d74f91d 12f0015b 0bbcfa2c 0d1a22ac
+    d55c23ff 821b1941 2ed88d55 442626a6 39b2c493 8beaea63 9b73b98e c54c2161
+    975f1eaa 0d04266c 48dcdf23 2c0995a1 50666678 1beb09c4 823bfd02 be83012e
+    2191a575 7b32665c 444d6697 4c93
+h = 70a720bf 36444791
+
+k = 3935e2c8 2c53a996 507dddc6 d6956162
+m = c8e50b18 e34934e7 7d261f81 91c8cb21 540f46f7 a12ab710 2080f232 acfee9f3
+    d379de03 c7e9ce51 534d647e 0b2946ee 618510d0 5e082124 658cd255 1856dff5
+    e5014fe3 42e4284d 697bd24a 09aaa9b5 b281e150 ff6438b1 9101c2a0 45d192b1
+    c7ae33bc d6a9faf6 af1a018a 9a1bcd3f 1c8eb26d 12f5327c 9dce8967 ac0e4ba6
+    7e637e99 7359309e 72a8fa51 46057604 7703bf78 03328497 0d1e9e7d e5169475
+    a6b6ed34 b3b051b0 f52eec01 021379de f007dcfd c6e3d717 e653b02e b3e6dc71
+    615c24e7 19d6bd03 38f52f0c 1c46b012 fe15c91a 18207589 557bc491 9e633787
+    7b7aa3a3 72af131b a6cdadbb 5b5ea6d6 89c70c1f 95d58183 bcf8845d d5580494
+    aa25ae51 35ac2ea3 d4f175d6 93d163fc ec15d8e2 fe759dda 26a55d23 c05f51f2
+    60f11ee2 a787f212 a2a19532 378b5e2c 7d854726 9cc04f67 d4e6e1ac 05aca000
+    ba9b7de7 8871a1d9 69f3057a 2ca59776 46561997 c8df9591 3fe162fc 53884bc5
+    894872af 70985be2 8e1a1728 a8bb1e19 ac9506d0 bd69c396 ff4f5c67 00cab0d3
+    b79516af 5f079dac 145cb8c8 c3fcb843 cb5511cf d636ce37 723040f5 04e9645b
+    f4aa4df4 1ce2f061 3ecb56b4 477e1445 8e73863f 7b08eee2 135a58cd 091c7e38
+    f3b253f2 b63f5ef7 19e92a40 761f177f 4ab84531 a980f7a4 aaf69344 4fc348c9
+    d6422342 36077d37 4c255d57 b6fc0d1e 497ec29d 62ed9f90 1dc33d8d 42aae594
+    ae2b5521 7bb70ae6 5df98cd9 1c746626 717fd5b8 e9efe861 8b8d815e 3742bed1
+    cd47b788 d580c24c a0bed424 424c0096 1dbe4630 97b5f70f 38220c87 079dce8c
+    f47bd1d6 614bc756 e1d3346f cb88dfe1 1b5cda12 6c078379 197c2141 8d7ff172
+    279fbd62 23014e4a 814851c6 65ad5842 1228fcf9 503dd281 72951a0d 7dcf353a
+    267f54ae 7aa58545 c91ce06a fc68ffd2 950bf499 cfe80d00 029c2dcc 00959673
+    791c0986 6dbc2ba8 86eb7951 06347d26 2c7a5db0 128de625 09ff5f34 61b0a32c
+    f71e5e27 96b82637 a8a1051a 05f74287 7844e313 9d2f623c 592fd476 3fec9b99
+    57e53fd5 f76bdd70 4891c875 b00b1ad7 7c2c1299 b70a878f 1cdc0274 3ac451fc
+    43854112 28af522c f958b01f fc516596 fdccb2e8 8689ceb9 07d95800 27844761
+    9bb63792 5b11f4d5 f9bd7980 f60faf42 92079ad7 2e6cbbc9 222f0233 def00d66
+    78eee8a6 2f2211aa 036e26db aed1679b eb1dbf91 a09d229c ed92d9b9 9ff6525d
+    ae2d732a 1d268ef9 6ca88ee1 6b3a3228 89ba061a b432e48e 424ad256 818de9d4
+    e07d28be 490f88c9 fa346c9b b4d8bf7b 374cb10b 1d1b2a8b f5744166 9f65a28f
+    919a4c96 32d7689c 692b38b2 8e0bb7bc 516f0838 f69522f7 853aa10d 72ba34e3
+    3e7f05dc 465a59d2 7172e9e6 c393081f b116f73b ef2aba08 b4b8fe70 cf27551a
+    1b4a848a ab7d64de 55d0e717 0caeec
+h = 639276bc 1c5a3c21
+
+k = 88cf82e5 3c8e17bc ac859a9c f72eb596
+m = c9bce1d8 3ea59662 b1e8dd81 8497ff85 fe82bec2 46db1550 8fc58dbd 5477b877
+    20b539cb 39c16a2a e334308e 5bec3fdb 983dbd67 98449c92 8e1c0842 87ea3333
+    1706155d f5ea1daf 4228a547 79ca8320 da703df3 7197bbe1 d131a207 536aafa7
+    1824fd0e 660bedaf cdad5e0a e0f9d22b 2ffd03a5 22edee1e a920e0ca e33d2ba6
+    59f541f1 527b21e8 ef310d32 6604e2e1 30221f17 93fece67 3b09c359 a484083a
+    c20e3a4c 74b206cb 1f47d77e 07efc214 e07571e3 5e140831 39ce4af2 dc3daa97
+    62e0c220 d2717948 3607a2cd f6f0de1d 352eb18e b9475738 28b91a7d b5e241e4
+    c2e22ef4 1fd1769b 06ad951c 6ab0dc1c 67208760 c23d23aa 7d04027c aac17792
+    03d81861 4e0edf8a e6eabd9b 30bc2dd2 f9a33959 c9d7787f 6b92e772 cfbb8fff
+    9e3a1b80 5cd63100 43cd4473 e798a42e 7baf4c6d 94329fca 1320a401 8b95e0b2
+    a1cced5e 998f3c77 9c969a85 eccc2a63 da1f0cfa 87f3b312 90eed5bd ccb1f58b
+    e406526f c1c46c2b 9bf07792 e1f16943 d0ca1910 66757607 47be0827 9a1fbf28
+    d23f52a7 02412c01 666e8bcf 3061d7c4 3744bca1 b9abb669 ecdd5e6b 49ecf340
+    dca6da8d 6a17c713 70580587 a2540170 db38b1b3 364a8eb4 3b0e326d c899dfa1
+    0075ed4f 69aaf4c5 a9ffd543 9dc7ef18 454d639e 020120c0 8f1bb142 cfecefb1
+    048f4255 1f8c00d9 e20c3564 1d22eca5 b3749442 b6aa5bd8 e59c6474 c76555a8
+    3e78d230 2025148c 92f1516b 97cf1b98 abd7f5b0 aa614bb7 0a40ed2a 2f8099d7
+    cb15ae9b 2a60824d 96fda25a 5f7d6f05 9130a020 26b7d1a0 801c8742 92a97299
+    cffadb09 f61d129a 066ebc31 1eb941a6 b269629f e43d67ca a935c138 e1666d1e
+    6219e241 7dcee283 2cb08791 9000dbf8 28ba2cf0 985025de f41e2253 8312dba8
+    9529551b b3817d43 b1d00824 b3acd12e 28313dff e851229c e6fe09ce 00d3c9fb
+    808a6ca3 366a76b4 a53c4507 d57fc3e1 a6e7f424 2cb69764 ed6406e3 b54c8e24
+    7c90ac05 7bc92704 15295efb e3304ec5 8aeac2c8 0f7f5454 0b5878c0 da1f4ff1
+    eae37a59 6957da31 76b95ac5 dbd152df b0039210 d6d0cd93 327b2b37 0a7e612c
+    8d4188a1 2ac7e781 27a3b127 4373fec3 b29182e7 9fd80884 e32d7769 ea3c9d3b
+    e788bdb7 3f619d53 95406770 642d8dd0 58a59e4b 1a5e347d 8034a92a 9095b7b4
+    ac7cd4e4 ef4719a5 894f1d00 d36e0006 f46496ef bc22cffc 57c05c0f 2b609314
+    4bb4a100 42ee0183 c4c73870 e3a64c74 8fba000a 784fc976 50a5dc53 ea3f4d3c
+    396b4359 d93a63c1 ef5dc7ec 0ec8f0aa 12381bc0 6bc489ee 7fe5c17f 60d9565a
+    8fb29329 131d5f81 71ede207 cd6020d1 e8a67e95 757b33d6 09313811 86658bee
+    08c79da6 11199a9f 1adfa0c5 0bee308b 0191d153 785fa8e6 285d6858 1a2ab965
+    747495d9 ec9fdf63 28c2e1bf d5b4e330
+h = 2688337d 8cb71ff8
+
+k = f48257fa 1d654dc4 18a4941c f2cc103d
+m = d03a2a06 565e1d67 34186ab2 92605bd8 4ea6fd3f 176dd291 96546c27 f5ff5963
+    27226579 e8acba78 fbcf9cb7 71b80307 c0011380 b1ebda1e 7de75e0c d3d9723d
+    06c10a45 e45bbd4a 25a8414f d1c13d41 357e08c3 4234dc85 14c4d9ec b99669d7
+    042f752a c678e090 0191c4a0 bead6c2b 22c1e78f 83f2f83d 299bb225 98257605
+    c2761dc7 d5b9c142 c86ed031 efada0e4 8de9257d 507b48df a5313e4e 106a4b76
+    188fd35e be004dc6 c421783e cec1a21a 3841e617 500a5bb1 c444ef66 1ec010d0
+    05b5c085 54d9c541 de3409df 97ad7e64 5a3520cc 06d039e8 98813b3b 487650f0
+    c5b502bf 75dce18a 2feca2d8 8eb52579 0985c66c 84a4d99c 2457fb4e c61c04a6
+    10988e3e d130c705 193c8c3d 78a2422a 8c6a3a9a 50c4fffa 970a793f 43fa858a
+    ec601232 c87f3b85 e6c79646 bfa8d667 3cfc54b7 ca5783ee 84ab937c 2e3aa5a1
+    339b2bf1 f2fdf23c 6a3c08fa 780ffd26 a545cc4c 1701dd65 d0cd5aa9 4aeadb1e
+    1653a783 1d39ee4b eef23ea0 1f6ffa70 48cf2743 629087b5 353249e8 584332c0
+    41efed20 34a2ade0 5bd81526 1c557494 2e00058d 69c9ddca 4ade2fd6 7d68278f
+    f9191c61 71206854 3ff06785 34b21aac 513c00d4 3676eb85 2311e874 cfa5e4bf
+    e1411d0e f9f79716 9b0436ed 1fcd7054 9856b980 4f96ff8b 701ce2fd 857494d0
+    507ac21f d448aada e08741dd 3836f676 104d4b51 223fedfa 789fe0ee 8f1888b1
+    b057375d 54c3134d c4aa02d4 de2b2d71 b778bf1e 0b8bf8df b24bd0b6 c4664d21
+    2fb1e160 3c556af9 18e529ec 3bd3d8d7 17b580cc d6c771b1 a93fcf2e 1395620a
+    b8fe6261 2e9d6582 1c33647a dec50e21 897ad9b2 140e83ef e27f946e 2746247e
+    67bca9e5 bd76d898 0c9a180c a4860a0f c171f9c4 d42d268e f1dc3538 a15c59ec
+    32a2e0e0 679afe61 5471fd11 bb657dbc 6f7eb418 2f9fe516 47a703f7 14ee853b
+    19999a8d 3e56347a 2a332448 18aad037 d2930766 ead0c24a 7cf44fc9 a57c00e2
+    d42d10f8 ea6d6ed6 94285f0d 8266a2e8 024e0514 91178a76 097dce8e 0b83e052
+    d0637898 d76080ae cbc2bc1d e53a0b9a dedf0855 7b5f8886 1396942f 6c820ff2
+    697d98e7 c0fc0152 f0d8916b 84a48753 12151b3b a479065a 8d795b1b 87d3e0fb
+    9732c3ba 9673c63b 037ce55b 9c867918 55893478 017c7fab e37a9cb0 79badf3e
+    e464d80a 0be8bdd6 fee49193 655da917 c36f9991 4948f501 a67b7313 d2e90006
+    c02b950c 7c77ca4b 7120e08e 7b9fff4c 677b6751 183b656b 01649d1c e1cf1ddb
+    97d6fd71 06bae2d8 d8c5cedf 261f7c03 fa5397de d0a43282 29f82def b94c4b11
+    fe86ec34 182d517d f3b8d8ca 4aedd21a 9fdd9016 ec9f97a4 95ec2099 85379cb9
+    0d073f1a a71259b5 1085c05e df519302 9416eabf 6958c7d5 827c13e4 671c5246
+    82f6b903 b2a217eb 50f7d75f 4a1afe40 ad
+h = 7ae7b531 d29144dc
+
+k = 341b60c5 2150e55a 6c5f2c5d 874e456f
+m = cc90792c 744c60d4 4b0b60ca 4b927fc4 bae647a8 28d5fbc2 9d68901a 8e4da66e
+    8f3972f4 1b108840 2ab2ab8e 529384eb fe9922fd d41330e9 1e7c0410 053a2ece
+    794d4fe7 918afa2f 6db1a413 b915ff34 8c3d206a eecb3650 a7180b8a ccdc9c0e
+    a513a00f bffe05dd 9e16011d 2ab0a573 4e115c6b 409b09ed 21934106 8bfabc9f
+    ad8341a0 3ab94a23 26bffd96 e12d64d0 8407d804 d02407f1 93289ba3 3645c976
+    7b5f9c0d 8075d1af 77bc9fb1 364f2b51 ff802fc3 59e0f2aa 80cbf99f f2069f6a
+    b4bdb5f5 65fa0ca7 8b957344 2469c850 6ef4d425 1fa356eb 9db5bdc9 6742a365
+    46b466dd 41177060 a4ffb6aa 55dde2c9 6f2ee924 3f0e6e0a 8214ca9e 24d4dbe8
+    8c9f7ac7 d6c4239f b673979d 47e9f533 82db9cd4 3ab1482a d0a4ee96 de758c35
+    422ea837 5f89acaa ae132013 051c5c6f d72c792e 14c8cb30 294b1df8 04ef35f4
+    fca1a16d 7a7924d9 cb8d2950 a33c1eef 6238686d 77e1ff38 593686cb 484fa9c9
+    50221972 69f5b223 d7416838 69a6d8e5 bf21a97d e0063c3e 12af71b3 6e8fe21f
+    ccbe064b 7e32de28 7c8ae53d fb8ae7fd ac683166 bb49400c 46f863d3 f9a6ca17
+    a6c73592 fb638ffb 23207ece 564c5d66 9219d485 163f095f 47177abe 77e5ec41
+    72902e1a 247dc48d 9b3be44d a6af1595 087fdbf0 4fd0bdc1 d242c2fd 6e410d3f
+    6fbe9eca 2021f184 5b33939b e644e1dc 0b9fb7be 2a03626d 44c7c9e2 4ea7cc20
+    ee7c797d 9e64ca04 0869d0f2 6ed6003f 15d58f4f 3b9c8fae b0b1ca39 6b0f7fe6
+    5f4b9982 f95006bc d0fb2db3 aec967bf 98575f56 91704d7b f3c388ed b34a884c
+    dc87d0e4 b923d690 5ea8412d 42692e80 ab11cb8b 5ac2239c f6688101 c93c05de
+    39a9b16a b8e3145a 3c15f493 21639610 50c7eacd 6728cb34 13296e27 3421c7bb
+    b46a071b e31aae30 6dfe22f6 a36c8628 5c416d6f 5d020ca0 e1e2079d cc11ece2
+    aa80fa69 4bf13432 f1e1046f 27ec192b ce529cf2 f96aeb48 e09ef226 7363b9ad
+    7001e3d0 f9267c65 8898cfca 7c1196f7 bea3a433 c4276f29 7c9561e7 92eb09fc
+    532748de fc18ea27 43934daa c635747a 090eb9ce 43a9941f f5b4e9eb 514f6cb7
+    bfc48d21 c939d229 442578b7 39b43a00 98471f70 2c1c081c 15dc0a0c f61681b7
+    5b90b384 d777274c 913a1db4 c1b974f3 b3334b2b bb7508e7 8445b343 5dec2042
+    8d0f5e78 2cd23f2a c33e8d70 9cd7723f c3473f74 0fe58285 fde436de 48e15eea
+    f27cba43 16ce81e4 d274ff3b 2f968b55 33941eb7 0bfc9540 19d7c239 e6d724cb
+    62ba2ee8 3ac7350d 47f91632 3b496a54 d3da2368 54ca5bc8 baed9ad4 523b3315
+    10c5cdde 637c0dcb 08c16ae1 ca1daacd df744efe 179f7ea8 27514836 144a91a9
+    6a67e8f6 a2c2e94b 32a00697 8fcbedb5 66f9af9c 12ce46c4 80bfa242 74835c81
+    60550d72 1b20ff17 a2adfad0 4c74321c 1267
+h = 4d0c72b2 863d554c
+
+k = 8fc5e5c2 79e77587 f773171e 4791af24
+m = c8a3cfb4 0264a27d 9963368a e11dc36d e473b9af 3289c04b 543b5d6e f1bbc7a7
+    0d8e9305 de8e0e26 a7960ff2 20897028 aecc2b1b fd0e34bc c4483c4c 22c8fbe8
+    4ed8bb29 3f123831 2d7e6940 ff00ed13 5489cd36 28647241 ab7a80b2 ffa6bb82
+    04e5267b 557b58d3 49b341db 58782a8a f3eaf65c ada4d794 5248b0b9 a212a8e4
+    c030871f 305efc47 3ec4ed90 60b9140d 3ac1448a df848709 da81e1af 574ebfaa
+    61b7b06d ea0fe593 0bb98af3 f64d5221 4dc0de02 80dd0c7c ac42736a 0d6169cb
+    ed9ed0b9 ce9967f9 933d15ad 2f418c34 3aafb9dc e2990e86 678061c3 a69406da
+    6a7511a4 9476a3f9 0cb72b2f a79e113e d8b81882 f04ad7eb 54c595b1 eb1b73d1
+    2a68e46a 528bd5e3 e91a5b7d 38320b54 55e99924 8f11c643 5412e5fe 8ce6a568
+    bf5634a6 33c4e35d 5288bdd1 f24bcfde c779f4fc 264d7ba1 45a1de89 e82d1584
+    218933a3 5a050e42 77471dcc d34083fd 99a86323 c50ea8cc 6b018b6c 2702a8ee
+    20251b42 c0a0e721 f145549f f63b88d6 5ca38df0 4e2b6e44 caee03a5 94d62c29
+    10bc25ab 44243050 a9935a01 02701f23 611f3f68 18f358ee 3e307d9b 230cb121
+    1f4ebcac a41b592d 78817267 406d2ea3 eea8713c f3cb23ff c4c4a361 cde0183e
+    1815b09b c77fafdb abf761cb 9b362311 24ef293e d2d9e592 98ea2251 c41e2f32
+    7943b33c 7449c793 97cf4f20 180eb054 8227ed1c ab344870 ef6da3c4 da8f0b5d
+    3924f5d2 42122986 ac59a721 2292b109 75cd1ca8 ad25460c 0e588882 5fdbdc4e
+    7f0a7be4 73d96982 678eb9a0 519e9229 6abcaf4e 1283dacc 15bfefa1 f3e5684d
+    cd145948 e6e16ab9 cf91f849 7e732b6f 081afc1d c754c34d a7f2afc3 93ce0ed2
+    242c10e1 b72d4be8 c0cf5599 93f61ae4 bfa576bf c12baf40 e15b6ded 30a901b2
+    b19c85f2 4f6ae82e cb82f8bd b1b20b62 6872d888 d6efe898 3c3d296c 1692eeed
+    c2e24aa5 2d4fade0 4f0d86f3 b0804408 7e9c6c8d 293bcc5c a97e1f8e 208269a4
+    af37cab2 7cd09563 c4862de5 fea751e5 5c975ce8 62d95b9e f77df7d8 ac0d80dc
+    612e7bcb 715fa5fd 3328d998 aef9d07d e94d550d 150e5ff5 8cf5b757 1d388e2a
+    73037cb1 d32fdeda c04f45c2 6e0a0b78 db1ea571 b2372036 351ffc19 182b0ef2
+    fca11e3b 707791ad 3c60345a 92459ab7 c3ae159d b87b6db0 caf223bf 00052ee0
+    cd6d6cb4 639b4cf7 5dab2af9 bffdefb6 4449230f cc0ec283 0f0b7a54 fb35bec6
+    f0a6a0b9 c2f1884d 67817535 18053de9 c90e166f 988db16b 8df26f3b b031010d
+    ae4e6307 b7aa1d48 c6cede00 e15bf2ad aa57ad09 73f4ba8d 0d78d83d be9a9540
+    35e14dc0 6bc20f74 507e5159 26d1eb2b 65304715 94c102c7 5b74889f 900c5e79
+    bf2c978b d2b51bf0 f3f03ac2 2382967e 2e09435f 10f23e2a f1338dc7 aa75221b
+    98ac023a ce13df8e 4fcd4bf4 1921718f 630fd7
+h = ece6d333 c7175dba
+
+k = 6e4376fd 05a53981 79f44930 c2a016f8
+m = eeb4ba81 de27e443 1f940793 5eb0be0a 1b3d9a74 ec22fbe4 84dd5ebd e19ecc86
+    6c4e43e5 d5a0ef89 017f9d0f a4604157 3c456d97 4a83c048 998cd8fc 4122888f
+    fd9b39d7 a571b9a6 f073e2e6 27d2807c aa30c5bf 92fa48a0 96db4d85 737f2fa8
+    26f754c8 78c77cc0 dd7fe400 31e150f7 54a5de3d 9693ce1d ff785dca f29b6ac5
+    de25357f b99262ee a3dab5b2 f6ba3e4f 5fdc1474 5a35275c c9592c5c b64dbc70
+    634771a4 8879cdaf 2814c0a1 fbf2d27d 043544e4 7a27163e bb982aa9 d9d7ae92
+    895a45b9 b816b10e 04e6a91a e8766dde ae701e7a 38cbf72b 0d5e56c1 77e5dfb6
+    bef76e59 a4499d89 73c5e6d9 e810069f 2f664ae9 6394e540 736f0784 b67d9669
+    90a0c009 7e72a57a fb2b106e a169833c e375703d a0d6eb60 f20f6ed5 5a37977d
+    8aa42717 c5201d8f 1d82bd6f 40ee07ff 6c1533a5 c723e0db 2bd2ff60 f581554a
+    aa8de24b 733f10d6 0358369c 354558f7 4d8fcf76 9d0939ab afedb5d8 fdf096a8
+    ebb98641 0994c550 79053fd4 28de4a4e 48ea732a f029ad7e cbf42e56 bf46b399
+    b82aecb0 007a4614 5f039f7d 7b9ec2c2 816e7f84 e51ad24b 8506420f 29e9851e
+    dd11c079 2c7a9c67 be9d2fa5 a96f6beb b38bafb6 b4191bc2 cb65db57 4c3c26ee
+    996595ab 892fb32e 108c73e5 09b4a804 f8affa6d 7d545842 750983f0 5af363db
+    1d58cfb6 8b6fa8b0 1546a44d 3c9c18dd 786d5761 ff9a95e7 ec67bba8 08a9b707
+    0b756e61 9ee791ac 33254b9b caebf625 6154e2ce 943000d9 929094a3 19120c5c
+    5815f23f bf5901eb ca155caa d353bb97 2eaef468 519813bb 8afbb5e2 d1320ae1
+    b14bbbae 0fbf149b 31c58996 7840f098 b6e92d1f 1e3d3143 8823ad34 06ab9e21
+    d6f5aafd 6cddbdf3 edeeec60 4036e18d f639c36c b762e82f 9d1f7ea1 b119d9c7
+    d7b37ddc 48c86680 56307106 94174f8e dad84419 61c09f98 794be1fb b3c74819
+    7dce3d9b 96147efd 0a54a303 e2584c7d 689c6571 279fffc9 1b756fa2 5b7e0a87
+    a48d9c3c 4bc33386 c3f82f1f bb2f9d87 05f45fef 15ebdf99 6eab52d7 9894714a
+    2aec7f42 d1cba7f1 8d582d1d ea8cd0f7 871cfb1c e31633e0 767f416f 6cce548d
+    e7d14a28 20c7bfa5 71340e63 ffab0f01 6a391fa8 fc0789c2 8c0116d2 8a98062e
+    7f235cdc 948e2824 17993a98 e90774b5 d3276123 2492a657 fd27ee08 1191d4e5
+    3fc7dc62 1bb9ab87 a3386af2 36606678 41bdbdf1 7596a2f1 41e73694 e2ef9135
+    81edb9af 5c07779a 53d3c712 fca9ee46 e6a817cf 111fae34 7581d912 ec54f1e9
+    7dc4a06e e18493e9 67026665 9eb42eb4 6477f1c0 7817cfe0 4f83d42d f7014cfd
+    adc4a71d 7e29e06f bff2c8a2 b4e75e49 422e436b e61e4d18 c3c0b28d 31428e46
+    1aa610ad 80686a54 d663f4a2 47117761 51bdfbad 5f2253d9 cb6f1621 0a531530
+    613d6edb 1cb2af77 3654ed06 d9fb99ba 257cf955
+h = fffcf960 ddaf6086
+
+k = e485fb35 9a0fe29b 34657885 3f6d5dce
+m = f574d2db 1a30a9da 0d89c90f 2b5a7e10 7ba982d9 06266c67 ee1d6e17 e0744b1d
+    77e164c8 41e78575 f7ef808b a8026082 c37e2338 243f91a7 906d97e4 2e8e5ea3
+    e6f31c33 7213554c 8f35c9f9 0a242bc6 b684f7ab 4ac05539 46b8b2be b2b6ca7d
+    1862121e c7c28bb4 071c511b afbb1743 abe206d5 2381566c e1b1ae8d 102f77ea
+    2a9abed9 0142bf14 7e447bc4 9e973150 6a2577ef d5b7cead 1864f1d4 8fbf927d
+    f2b6e6e0 d702f03e fc4873f6 284cc68c e45c0814 eb019b18 b6bcc279 14f4b2b1
+    3f08f67d bbb30a02 ea760d9d 2c907f0f 0efd5fb7 b5161324 607f873a c95e6da5
+    82e9590b e9c9f8f0 8dfbd780 b60cb1f9 f23bf697 9e44d98e 2fbead95 ac92e833
+    92612894 8f26653d f76a780d fb2e2486 f8f121e9 ac1e4da9 79cd4891 b2709439
+    58bffd6e 8fc8c1d9 df1fa76a e37433ee e02a910a f303497d 057562e9 1f3ab387
+    9160aba3 9d2be08e effcb5b7 0d1bcc8a 962c27e8 fb42c834 9a85d45e 36bbc64c
+    571a0752 b8027a1e c7c123f9 e5a40ad1 788c6cf1 e2156c55 ba9f2048 84d163ae
+    b33ccb9c cd09f8da d32e6f8c e05a7bf9 0f52fea7 081aa515 3e611cec 808b1da9
+    ef4bcacf b56700e8 015bdae4 472a5326 7d8d8741 8b6d9d17 584e55fd 8add39fe
+    003f9f3d d3a2e065 1e9421c8 cd46fe1c 1066fb8b d91b0766 8b982757 231c185c
+    0361e7af adc21465 077fec2f 06cd02f8 e00b4909 d09e3a19 a74492b5 3ec1f405
+    e3056a7d 246e2c7e c4ba65de 3cf206d1 619319ec 67934605 52f6656f 151379fc
+    af8fdf6f 5e4d43e4 615e1812 9c340949 e5ffda00 2305779a bfe1b173 76b2b467
+    6d006296 fdc47d75 c3763b1a 460c01ef daba3a48 516436fc a8e95704 34196b2c
+    ea1b0dd9 1567b7b9 36742dc8 5b3f0068 fa9a9eec c16fda99 16159376 84119c79
+    8388fb3f 81bfd67c ce62716c 3cc0e34a 2232c043 16f58bb5 6936cb98 9271ec46
+    692bae18 dcdaba2b 531515d8 7adf20c7 b21a3b8a 3b089bd9 25417055 a72f4739
+    54d919dd 29fdaaef f51c3b4f d870ff8f a2286506 60a54145 d8710020 a5f9e55d
+    dc61351e 0a53d787 80abeb3a 767eab90 ade9b192 3a46c78b e644c84c 53ef1b8a
+    74fec962 db9f3f97 3e590142 d394d189 40cfc68c 9677b15f 1a7bf9ce 1252b0f1
+    8ac5bdde 286c0df4 b6827cb3 2f2ea2d8 8f477034 919cfc5f 06ba8266 68177e8b
+    d2c4aa04 c34499ea ea7a39aa b6e34118 441c08d7 bdf51c8e ad5751c3 dbed5d17
+    9dd4bbf0 5d9ed460 7cce0717 0bc1c32b e035a174 40d47e08 163b0b68 28260d37
+    b58c1de9 e3a4232d 76537f15 0802ad9b d009d43c f93ffbf0 c0eb16d3 f2d7173b
+    5a12d544 93dda9c1 099d0e18 932b685f 35433a06 896237d1 09481db7 1236e762
+    8e6e678b 6e3b2cbd 4f234081 2af194ba 4132fe88 5bb80d3e 1dca0a7b cfbe9979
+    4f75e08e 64b2bca4 525a5500 9a1b6045 1f898f9e 33
+h = 7e3a15f0 0c4aec43
+
+k = 5db82501 468c4ac5 c601991e bb3dd617
+m = 73b03621 4a7f1549 c3d8ec48 74dd774d c95e4c9a 476c87f2 8d013b4f c9d5bba1
+    c46392a9 cf20ddd4 1e798342 49432e2a 46078a8f 0b5de924 1d55e68b 6729fd77
+    255753e0 8b2b1394 1ca23321 7c87f326 c48fb790 70042f82 457127ea dfbfc138
+    5e1c679f 356a279e 6a6f2914 e04cf2aa efc71ba2 7d1b94f7 ca42b568 580f027f
+    afef96f4 3b009c2a 04fdb09f 74d5cd4f fa7151ba d3f2131b 40285e08 e39c8448
+    f89a19d7 e593b921 cab74bc1 817d9873 e8b60a16 cb182288 587cbc73 d623c86d
+    2f85f38f a43c53f9 c7f17257 671c97dd acaeba25 c48690f3 ec92acf3 70196712
+    d104948a f43e9777 7770e0cf 463aef59 3e7dc90e bb1b9b8d 0ec92c06 c8e98403
+    f167ff05 0f2b7f12 57f58f27 3291248f cc0ee103 d29fbfad b6b1d6fe 333db4f5
+    93577734 ff4d84ed 6ecd8669 130dc4d0 f4b0d983 3ee05d26 3435f1b1 45913998
+    a8f9aa11 9b07f26f 52ca496b e56ffada c20319e6 1d069705 ceb17b68 084c6d79
+    5dbcfd39 449dc2e2 00558834 752caf11 f4f0edfa cb58f5e4 89558a4d bc5e7fd0
+    86193309 44d97af0 449c5426 7faa5005 a4e641ee bc037da0 414627c1 1c80d684
+    a230cce9 92921e0b 5eede0a9 f235d440 949d88c4 f55c8a2c 23ea452d e86c8635
+    7f1a9966 9ff23a88 f415b205 93abdd23 562d8356 dd648e87 417cc62a 333fd4d9
+    38676c76 1b80713a ebb9c363 feb0afed ff2b58c6 78a552f6 dccf8593 47f4d5f6
+    3b2b6c58 dffbf398 468cfe84 1c097b28 8e94d8cc 6dfbe1fd 4d6d5bfd add4f80c
+    8039f809 403b5bf6 9f82b939 7032e568 b3946bde fdce3478 def3c508 2a06c6dc
+    d5d7b706 fc4ef414 52c6d7e7 b3f6aaf1 c769bdca 53f39652 e3ef128e 8cbf0a61
+    0c27453f 619011df cc1ac740 321160f9 82349ed5 ec1825d9 7859a506 0ed636a6
+    6e5faa9a f6f83c9f aa5d0e0e 8260ddd9 9d73a328 07f7511e 16efddc4 aaafc4dd
+    19684e16 8557218e 92970773 dd724bd1 9e51465e 72e546fb 432f5f11 5ca7497d
+    42b18d25 c6b6f769 47a31e82 38d5e585 1b986a6d 595a5a49 ab5c8670 725d7f80
+    ee8375f7 d2d64051 a9948757 e127590c ba58c5ff 61728b6e fb4144af 6a4329b2
+    02137845 a5320ae9 25d61fe2 75459b6f b9f6c14c 5d2e4da4 7637aef6 4f88dc3b
+    b207820d 8272c77b 8fe84c24 3755ae05 00ef64c6 fc7e1555 884f185d 9d4f0552
+    ab3414ae c1704da8 2366d10f d7ce413f 72562917 9de02ff3 8601ae0e b58b33c7
+    35051664 9c3eeb6a 61a21e6b 63eda69b cd36ecc6 097df2be 957dd56e 76af9999
+    9e153c74 d7315c86 7a98d866 e09b104f 589c6515 97ad5d5e 877c1a5d 524f9ce7
+    6c0933f3 c3b4652d 7159a6d1 12c75579 1f57bd6d af5b278c 4b4f6a70 4f9ef866
+    51b63db2 e4747f37 10654185 3248f63d 78d348de 340c8e40 93e26d76 3bd07870
+    680f05c1 d0f122f3 09bc105f d362f1ce 407d5143 80ee
+h = 83ca292b 1ea5c525
+
+k = 5069526d b7bb4c96 126ef877 488254e6
+m = cc5d5f4e d0064bc3 cccce90e 4ec914db 9443e158 880bb8ca 55fbf1a3 24c65a64
+    863a9380 40d4771c de6bd459 f10ab1d5 11e2306c f29bc433 90d2bc9a cbbc316f
+    e4b5e0fe bdd38cf5 72213343 580477ec 0143920c 899eaa4c eed35baa 2e8446f8
+    9f9b9e7e 7126e859 8a00dc98 8d4bf070 e37e4401 7bba788c 50f27c27 8994778a
+    b979b6da 70aab576 1d31ea5b 825c686a 6d2a2ab6 ce9642ac 7bfd0df6 91133826
+    3e39e95b aaa2ce80 28d3bfb0 530641f7 623acc2d a713259f 83809714 c023cc33
+    6bc4dc35 99ec4089 99ab6ffa ec1c187c c4f1aa1c b985cefb 294d22c1 bbb9ad1b
+    9983d0d5 7393610e f91ccbaf 0ce58480 cc5fee60 c684904d c5ff7c1f d0bd8602
+    ad9dce93 ae3857b2 c8126aff bbf041dd da0987df 7f469452 27395b91 2bcfaf81
+    ed734520 04674428 0a2334c0 b4e31499 90a18e2c 74d8df9e 477f4bca c0a535be
+    5bbe2442 299af187 d82d31fc 83b9d896 975a82c2 803c6a80 cabd0a7d 011b0b29
+    0c73c404 f1b4fe6f ebc875ba 019fa77d c12a67e7 a8b05b0e 8384a51f 2e6af85b
+    2369d686 b799119d 0973040a f5a93edd 5f377eef d6d6d27e 1d3cabd9 4373ea2d
+    21151085 6ffec420 621377ea 9786ac69 09a08abb 9a31e503 9f5fb116 de7bb7b2
+    9198730b fa2e7efd d51e198e 6b8ecf95 c6b48f41 6062ecfc 80cdf083 569d01ae
+    16460775 9321008f ed3260cb 9826f736 78d009f0 77ebc398 32fa6dd8 71c6c8c6
+    7b010f0b ece6a968 c0cf6b19 154b9bf6 5b6802b8 c876b237 34f9a65e 38ec0330
+    cdfbfeb6 aeafc668 65fc9218 283a5cc9 d5899a5d cf2e9ec7 f17bf8af c49afb87
+    88d8fa38 dc8d75f5 d2505b20 e8f33c9a 7ce926c2 f4478d96 308529ae 5e8b52de
+    537c9b2d ea2f5043 ff213a7d 2541a991 8710bb35 5a145b40 21678069 ac3b986e
+    67fba89a 5f278f71 66589024 7b7b6dfd a19801aa f339ced9 00591af8 3c0ce6d8
+    76d4e48e bdfcf8c7 85f8ed5c 4c43187e a03e837f 5007a553 0f7e5272 bca7aed7
+    045d7a93 9f85d76b 86db89bb 98945686 7530701d 4afb7c0e 209d4e67 c22ef339
+    3e3d784e 405c6c06 1df2fb1f ea25cd44 88d1309b 6337e486 872a126e c8ebc9b3
+    804f7405 faf73343 fb0273d7 e4337645 6f90e857 e2617380 9e0678e9 de09757c
+    7ba5f50a f17e558d 9dccf796 1183e662 208eb0f7 16a3064a fdc26713 3b6255ad
+    a3600a84 03ce2c2c bc3329d3 1406538b e402a4ed 54f1a2e4 348e87cb ac9adbe0
+    b0dc0a1d ab524ac3 16551d7c acba7a8f d7a46e8a c8978389 ac14524c cfbb26d1
+    1ff99f4b 320fa08c 6456e77d a54d1562 d91adb82 51f4a00e 8b842bf1 386a8ed4
+    de9e01fe 68dcca7a ca37a3ab 9947449e 54c1643e b1256d4e 72c39861 bb11f06f
+    9b174a10 0a4da20f e9ab9c3c 29b59b2b 39249974 edd5057e df51d522 2e1c5ae5
+    0e1c1691 1150de08 8d48b32d b86e9146 6a1826e2 e33e28
+h = e3a102a7 677f609b
+
+k = 0322f656 29297966 a08809e5 6a355f33
+m = 4545f040 6961feeb ee3e39e6 53f8900e a1ce8eda 7f5d9f6e b28c5829 dbf19803
+    b73b79b1 a80d529a f508c9d1 52ac12ef e5b1d2d1 ca88b462 e29db3aa 02d5e17e
+    d3474e30 6b7a58c1 4a238a87 ab844e5b 7f719ef8 057f4b11 b29dd39a 62d9d75c
+    31e9b916 1bf351b6 5d5f54da 92a61613 525b44aa f3fe73ef 49f37de7 30d964e9
+    c65ac573 2686110f b234e615 601fc1a3 fea487be 18364bc6 22abdd6f ff126d3d
+    0b50d76c 2fb94988 06108935 dae9009e 087e6ec6 ed02ab5b 579c8e4e 29f532c9
+    4e417c90 bb98a597 521244a6 c6f0bcf8 2d0654ed ca691d42 2f208a36 0022f06e
+    1859f374 c56892f9 8e72c3f6 a10ce783 06186fcb c7539384 d767075d 9c95c712
+    a1bf9512 8315ffbe c6619c3d e1dad2a4 fbfd2ad2 4e3b6147 059c9902 15169c7e
+    4b88de04 cecf4757 048e27b6 55e66fa4 c25f66a6 1ce5c34c b30e11d7 5d09b488
+    fc683100 6b6349a8 502a5916 a7f9f6a0 b2f8f154 3dda3e8b 71c7eee8 5c18df56
+    b5dbdfee 2875b99d 32463d62 d3ecb695 c135e18c d9c72c5e d5db5aab 4634df5a
+    3d4802c5 85bd7c99 7d8c0523 67abcfde 4b9932e0 08d57e31 b3ebb0ac 7adf1a53
+    b643f570 09ec5545 4f8af3b8 6b755fdb 2af19d90 89e445d4 3042ccea bb1d7093
+    db308f65 5e94663e 6213fae4 04d91ed3 36bba4f9 ff03d13f fcd2e722 e6cabc63
+    1e543167 c60086d9 d5a0ad95 399cf71f be42d227 b3b14dde d60402a7 69f99c91
+    d954c07e e408b9e5 fabfa71e a9f7f1ed 614dd91f 9b722b87 3877f229 4980129d
+    f4849df5 0d8ec9e7 6a6184b2 6122102a 889a5a95 786b3d73 a6bd70b2 e9554046
+    a0619364 858c4f74 7a5604da 8f9c9d3e edff62d1 2e5c6f1e ae4836a6 3dd1d619
+    5dfb23b6 1c9ce3b5 f0646303 77f2939a 5d484488 5f4d45e6 622a1835 50ffd50c
+    bcb573b0 20b3c15e b09ae809 40adcba4 4a9ce610 a1a03763 e0faad57 ea575375
+    4c340e61 7ab31a09 a23bf88c 490725d6 179ce80d 4379f19c 15a7c7fd 8d06d487
+    b3b08c2b 570571be b19fec13 01b3b203 e5c78aa6 1ac515b0 eca21199 8422e052
+    ed5ab383 5e827703 d7ae2e23 1d1aa836 19083b25 7eb15442 fa8da4e8 19a1926a
+    ab66c3ff 96306aeb 95713c5c 4e38c914 e732dd4d 70db865d ecc87f79 4bded460
+    4c8e86d1 c123d023 fcd17a53 52507e3a 2f46bf24 b7a1ac13 136bfbf0 c65f8c65
+    94c5b1b5 3995b0f7 92505de4 32e46a92 a12cec17 adaa93b0 724508cc f3b57e29
+    2d070c71 4ba26116 4ab9ad55 70a405f6 c77c5bc3 675be046 75680c71 71c5657a
+    4ece5f80 25437ccc a384db96 a8e9fa9e 37773747 6077786c 0d6e66cf 10b49280
+    3de70574 72562334 18c896c3 fea11509 92367e20 0ee41249 81ea1b3c 4cc1b3df
+    cedf4d75 1c6331f4 53fadeb4 9d553177 c0888161 4e6c9e22 05b739df ff60e3b4
+    deedd972 3b285bf1 a776e404 f83216ef ce48f6c2 a4f9eca2
+h = 04f28742 ba71efed
+
+k = 8d88538e cbcb3cf5 ff739032 99b3ed25
+m = 5e09c2fc 6c373886 77349684 fc92ba51 6bb9ec8c bc5f7edc feb20fc2 ad4c05ee
+    2dd8c4c4 078e063b 3b233930 d72f20b4 db866548 d4bcef3f 9c8179d3 146f83f3
+    4288d972 50b53b26 d1f9796c 9f5d2f69 0a49ec2c b9663e6f 06b09653 0e511c9d
+    d6cf8b65 ba94e928 6ddbdee9 e597d28d ddd0986e b7784089 21dfaa3d 5dfe7325
+    778f1407 efa28e50 b5cdfa33 9e309569 77e3cd44 db474c94 bbaa626a 99f92a98
+    6bfa2570 4d0aa737 066252bb e9aa913d 4ecdfc42 17a8ef7a 1d8259e2 ab6b62fd
+    3ea79ca7 2f01a8ee de8e64a5 927a1913 1e087cb9 5ed1a335 e03edeaa 6be7cca9
+    c52d166b 7984fa8b c7e48853 5dfa6e59 5b7cb78c add189b2 2ea65728 bbd10287
+    e1c4a378 1039e4ec 5e814a29 2a4217c7 e998a5f8 b0f017ca 12d0b954 b52af2f1
+    23104eb5 316b5a66 c8b7af55 58213a6d 4a50d667 a344ceac 74ea7387 ec2a80a2
+    1b67cda8 8cd54a22 54266904 dbba7ee6 6aab5657 7e3a0a89 f8ae308d 2c4b67a7
+    dd69db24 137c6351 4f83ff84 b7237b72 c3fa2c13 ed3404ed c680d27a 8a38db0f
+    4a753972 b9917a96 193ece9e 5b794c54 5f7d939b f69af0ae da5808e0 b29fe96b
+    7dd50f98 4a573d25 5b0a45eb b1ef099f afbe9470 650903ef 135c3962 80f1ae93
+    1f793ae0 40db0b2e cf7c31b5 9a1834c5 9ae7d91f ea28df0e 35c78314 824600b9
+    2886c4b7 132cb3db cc8822f4 e6d26ae9 1fbb7b0b 344b4802 47237c58 7cae67df
+    36489c60 29d06930 8e9f0944 08764df1 dec94bdd e71db61e c4d5025c 61982589
+    21e83773 78636558 e4b0f356 bb515430 a6d48121 8a301321 c0de944c 8ff79018
+    f2420387 e252771c ccbdddad 7035e7d3 eac8720b 57d3e4ec 459b8bf8 1da2aac0
+    e509fe33 a1e32285 e6255737 69b9c0a1 01672f6b 971b75f2 ecd99c9a dfa48209
+    76fb4a85 271e5351 8c37fb72 23e2c5fe dfedf9e5 32548353 0a12f387 497e9edc
+    4c6aafa6 8f71d741 9ddac671 3428a8f5 953ed120 3414b122 335b0523 7f344337
+    0b5a9c13 2a9e027a 31b103cc 437945c5 cf235655 216a724e 78b68ae2 020e18ce
+    3c135e7d 8139664d 166affb1 94c41ad4 8da609bf 863fb764 08ce9814 0552e587
+    33cf7c34 104ddc23 25b6f668 59dbbc38 99bc948d 980979e2 72f362ec a03be38a
+    bad88ff0 28a376e1 724b5382 90bf44c9 1787235b 2fe3fa43 8d2fd971 419749b5
+    01651487 dd61fb99 6ddd5bda 87bbd78f ba1e016e 80944f58 f481381f c9527b67
+    90559738 2601dd3a f9aec63b 57195620 ea56111f 5975c249 2ae4d274 3c3b9bba
+    3aa7885f d80ef9b9 aa3124d7 8302165d bbb891f2 2ac47bb7 c6fbbb21 3a040128
+    68442129 ec2a779c ac5c819c 726a4882 0743b09e 572e3d33 2d208f44 e5c1b8b3
+    efa8ff81 b4b76cf3 b0de5e3e 03a16704 6e776f05 4dca57c3 64a4015a b15d0a76
+    f32bb32c 6df083cd 3d194e7e fc132b57 37662792 c1dc29e2 1f
+h = d5190748 920e3818
+
+k = 3548b696 97bc7c31 f2c1f762 c24cc86c
+m = f9b7ac64 3cc368cf 1da346ea be7ddd79 a89f6242 1eb9a9fd 46070310 1ae8a20c
+    b4bbd159 3b0030bf 52ec3c31 84e78c14 02c9dede 047b49c8 44c24768 ca68906a
+    91ecf5b0 deb26875 f2178234 5fab4089 b824aa27 38797c8e 15f6f43b 07fce5f5
+    144828da e170a647 bae49c9b 0b74c588 2a902a0e be990716 d38b9b7e d7ecc6de
+    04d51186 fd5ebba8 244838d9 40a01cbe d9fb9442 6f2d7b8a d981aab2 0c3b54ca
+    21b39e79 4a01f8f7 723cbc2a fa9aef9e 35eb428b cc67a01f e97b3344 b5e11548
+    47039a72 f4961b1b c8c2d2e6 f99ddf0b 5eddb928 eda1d721 483a74a5 b8b39cac
+    1325eee0 74573c79 20095f12 809c8899 2cbe75fc 7283d143 a5ec9750 a24de536
+    6e55200f 5f04ec41 d6e9e593 1a0fce81 3b13ce7b 86d2d5e3 759b8c19 62dfdaed
+    1706a193 2f69bc17 2e7cd718 1016fd4e 53a94d02 45ab9907 f2be6077 7a4d15b0
+    8eeab9b2 1a93e4ef c69629c3 d34af87f 1d5b5c3f 3892296f 4a78f658 a6047061
+    2091c01f 85d0fcc9 9d0487d6 44bb060f 6c6d56e9 5ef3126d 8da7088b fe8883d9
+    78b253bf 555538e0 004c19df b6082bac c83d2933 02f1b92d 73fa42ce 6a99df26
+    926390e1 5186387c d560ce31 de2c7aa3 086d361f ea9c38d4 eedee638 88dffac0
+    9da71283 fa7d85c9 204234d2 ce13b6a6 378ed38f b42462e8 f026a5de f954e842
+    c903f4e6 5dd362cc fc8bb600 2a857380 80826ead c0be24d0 5a4a776b 478b85bd
+    b5474cba 453de4ad 0490252a 52247ab8 ca649225 10291218 217b147f e28a3ad1
+    cfd44b16 c791e400 b89f417e 536a3706 4da77992 ca6cb762 b92ff959 05e15ee7
+    87367899 f9183af2 562b0605 bff806bd bfc6e2c3 30587f21 c662c267 e12c026c
+    8338b20a 63ec0a37 b6f79fae 412f7727 6329f80c 967c730f 23282947 46bf7c1f
+    0dfd2411 6f0d1661 5821cab9 32c66aff c1c4653b 5322df06 a1a027a5 f1040f0e
+    cccc63fb 127fe666 eed0393d b0beebd0 01ff5157 aecf2da1 5114cbec 8a400775
+    4377e8a3 4eb4aea5 eddfd032 15496bad 38473c72 5149736c 909887e8 9981c016
+    79885851 0fa90c67 4c175f1e 538db4c0 f931fe2b 951752b6 18ed0836 102053eb
+    97c4c5c8 9c801e39 46d69109 6092fa0c f734a412 e53dfc52 28c9a146 2d917944
+    20f8b0ba 6a6ffa50 455f161f f2659417 df451280 f2e22e16 afa054b7 832b6b65
+    e87120e6 85e1233c ecaa8228 efa01c6f 7e46b84f 31807555 b32c299e 21fb4770
+    7205262c 92654481 57901bfb affdcc19 091ffa41 9eeb9e93 f8f52c06 91f57da5
+    c4b773a7 035fc03a 96c98166 137aa4b9 157acb82 a10948c0 47b07d2f 6e56a683
+    2ae93904 31164224 e039176c 1b928a59 c5c2fc20 5b07465c 487b5915 b9fdd696
+    5bfcfa92 2b05a056 50c19641 b531125d 0fd42f20 35700a3d d8cedd12 a264b21c
+    281b0b68 7d06eb96 10bd8fc9 a577c032 f5bc9263 ce0b6783 f93b
+h = ee1abbd1 454ceb07
+
+k = c5453164 4544240a 2ead2600 978271f1
+m = dca24fa6 0218a461 8a5d389b b9f54115 b2905eb4 4523c425 8ba18cf5 9fe31077
+    51b8a5bc 337202f5 08760958 7cc96aa0 b0a055e3 41b50f1f db210d0d 2f47430e
+    fd485b6b bc5ba171 33fdc88b 37b87281 227f8b8a a49f3100 cedcd76f 67d8c2de
+    2776a8cf 47743253 71152b80 ee17c1bd 0e7ae0a3 126f486f 3d9d61b7 a5122c3b
+    5411018b 512dc97f b73fb96f 269c49a7 760ffc41 6e17b008 7ac8fa49 03e9f286
+    6915ba5e 2ba46326 5e75eae9 e8384c22 1f9fcfba e27f4943 85afdf46 ff35e713
+    6d317ed6 38c9993f a1f01475 56ec157c b83521ee 8175d6c9 21d71ae0 eb9eb296
+    30cd9e13 d15a9825 02f2e1a6 e9dd23f6 5fca789e 040b4929 540e1a6a a2c343a2
+    d3fac2de 1364ab57 58b54515 bfa7704e 4058a484 0ea35862 93260b1f 7cedef3d
+    b2d0f57c 2a48116f 86da688a 8995a04a b3dfb63c 71afed3a 72767f7a 4d3d7883
+    1bef2355 e04cd373 2ab1c8d8 99286127 311717fa 2b7e168f 5a14318a 1463a36d
+    4b90c2b3 b304db25 d47c7893 8127f325 16627184 a4343907 1c3eae4d 1651f7e0
+    379d90c5 727ae912 86a1743e 4fd88202 ef779292 668562cd 2858f1cc 402f4a58
+    3188eb97 92f66357 4f6393bb 79040002 d67c6967 f76d4ae8 23a2e834 f31e8c08
+    02e6da20 5254f8e3 1b822ecf 93e08ee9 042f3e04 36c14242 e98c3e16 42c3e79f
+    f8d114b8 81e69cca c322e79e adfddf9f 67f7f66c f0804ae9 3922511c e55af3b3
+    b6f52552 8785bb41 71da7c89 a532ed85 8359f75e 340a555a c77f8582 be80d5e3
+    7d791186 5252a08f dbfedba7 7537936b 2f582c7b 2d8b9e55 eef6d12c 5303579c
+    b356e22b edbc52d1 6f51aa8f eda03a1b 4672b5d0 927a9a1e 8a98a942 64b42e52
+    ee84a05a acc76812 7a650a20 58f82d40 d0570b39 aa8e8a5d 687c8838 65422797
+    2f4f1d79 2507314f 4876cd64 473ae0b7 f5bc041e 9cfdacd4 a221ad7d c771076a
+    fd1d8589 6202fa5f b4589406 9b8400a4 e82f1489 6fdc3904 305b1763 dd924628
+    b5b50c37 821aca1c a68bedce e1c87176 790e7c72 9daed549 0f0bca6e a33b310e
+    e11f9791 4c3abce2 b8a823e2 5c54df93 da197d10 1f741b81 315de6a9 056935d3
+    e52842cd b0b6843d 0d36fc2a d89627e1 da40ce2b a298ac9a 5b9b6941 624842f2
+    72052c9e 17d0a1ba c437bde9 1160e3b1 a03a253a f46f3423 352bcf77 459861c6
+    c71bb90c da259599 94f615a5 227f28ce a09c391e 018faba8 431cd7a6 c829005a
+    b0c5c60e 134c480a e971dcac 7b218301 513662c4 6b0b5f21 b86244f5 cc7c64b0
+    d7fe2989 b947cef7 28a0ee63 11be8124 0d7d5f1b f2c0f2ed 38048b5f 0633bd77
+    94cb1e10 a0adda04 ee65b3e0 bcc8bd17 7a68fd97 5be794ca d955bb98 b8aa09f0
+    52e1843c f57c3404 074f6c57 39adaf39 d9e4a24e 462f5c86 ec968a7c 0de1b9d4
+    e9da30fb 42e4ac15 324c52af c487a1dc 1502e123 4aa3918c 8691bf
+h = 8525d453 91ec9552
+
+k = 3180f825 20d50999 356eb54a cd0b7dc4
+m = c6bccb95 2c41077a 98bc7fd2 b8d3ae23 0733bc06 58125cda b03d566b c9e2e2ab
+    9a31d093 c92b2622 38dc0aed e32a0b97 150595cf 287d55b9 aa642831 ad4520fd
+    a9f4e9eb db0f308e 1d3f85e4 e2ea1a12 d27b1c4f a4e5ae19 b1d16d5b f91156c8
+    3a6a762e 09719789 6b489039 d3b09008 39dcb71a 6823bad4 381e262a 6d0c02fc
+    d4d03dc4 7879d433 819d6858 f1ea0025 7d5dca02 66120bda 6017a1f9 a0554f50
+    e3450870 7af2fc75 8a51ca70 40070ac9 840b78da 00f04ad2 5983df5e e1358254
+    04092c0b 2863590b aab39514 79236efa 5b791650 eb61148c b0d5d919 cd30ecee
+    6526c8a3 ee86c7ab c81424a4 f033dcf4 57ff8914 5dcb4002 074d9419 c7aa1c56
+    63f5c692 0e2bfbe0 950e6dcc 9541c932 0799a3c3 79544e0b 9a104bf6 875ca5a5
+    232f4dd2 3595bfc1 6ce4afa6 c16ff023 03467007 90c9798f a0c9ab21 e01bfc19
+    c24f63b2 56bc7142 e199b83e 0e239b71 cbd667d9 37eaa54a 75722849 0bbf0dc3
+    8c37df50 3166e831 3c6d7dac cea73512 deda24ca aedae542 f2a99014 de1315ad
+    a3ff4a1e fd6297ee d40c5691 063640fe fc6f5969 07b700e7 84597b4d 3d231afa
+    5c1e4d6e 09fbb295 351d7f0a 979f0550 d67ce485 64440025 85632f96 044db85b
+    e3706f45 b9255b33 a1a27ff0 4655b10c 2a1525e4 5aa77f9c 0f074ddc 2c7ae43a
+    82185631 6a8b7858 92b16d7f ff63c059 35283e30 5e0dfe13 85174b53 510d1a77
+    693343bd 8cc99341 70a3c1cd fd8fc536 28dcba84 2b5811eb 82117130 f6b56daf
+    8cefabe9 7b0910b1 41c1c2de 0fb7a5f6 d2d03d52 2e2b625b b5346ee0 ebb22619
+    98cc7db8 b00d79b8 ed2366f0 b2128a68 d8966c93 2ad79e12 d365ad74 2f9d30c2
+    63224cc1 94d191e2 43e49ef9 32c728ea d47616d1 c3ead809 8abb07c0 67ebaab5
+    da6e6708 daaf2ca1 1d596de9 f71940d5 c1083107 63cc9592 5797790f 465eb4ab
+    25aa5c2e 913f1831 4c10ac57 27607995 0bac5a63 d96fb16d 2eba0771 8e7f2cf4
+    2eef90d6 b8e43e09 6828c03f c421f21f 921da0a6 42e16327 c39d4541 59fc9f16
+    7e894045 61d009f5 b63c3575 4fd67526 da4677be 5e1881cb b1b0d6dc d12ca5d9
+    b56196b4 3f3ee89b 27b9ded9 c944bb7a 98d2e365 60522c39 9f4933d7 eee6b38f
+    6601f233 7bb2e393 a6d0dfa8 cbac07fc 622a025f c4a28deb bb7384bd 2ed2cd0c
+    91d3f155 15cc1e0c f86c7211 1583b45a 6de23062 ae9c6890 fb1771ea 3b8eacfa
+    ebedbc10 115745de d45cd210 36f1e437 dcb1d46c b1f62d09 e321f2c3 7dea8523
+    5f7153bb 96bcfb09 7d703b54 847d94c4 0ab89c94 c95a8b19 06c7279b 522d6fd9
+    cf17886a 5f685373 c8193976 1fdfde2e 50c506fb 0af9f756 723701c3 30e6347e
+    be81196a b6727b45 1cfd318b a0875462 befb7d72 610e2b65 3b5ac517 63b41c3e
+    b8d69db8 91065c3e cb223164 17eb0d61 acd2c307 2481384f 99632108
+h = 09de5fdb 48ffe0bc
+
+k = 3f008481 ec17533f ecd144f2 442861ce
+m = 54b6d280 2223063d c52c2a4a caa7a5d3 7207553f 652d03ba 1ffe1787 3724bcfa
+    342a960e 08c05989 2b79ee1b fe834419 96732830 6d4ff4fb f664d2b1 2c95ca54
+    dbb11ee6 02451b5a 5f4c0ed1 bfd33ec9 00aef7df a239c692 d447963d d159a9d6
+    e0a773e1 da757a7d c403d5e5 adc8955a 7e97d5bf 6108ed0a 3498233e 9613bd6f
+    ff670d4b f1eb364b 4bf938bd 003bc654 5d16f1e0 397ec163 dfa45828 1b4c4c92
+    a35382ff 97a6e694 d7b197bf bf937017 d1759183 1ec5451a b9054574 cc723cae
+    f9f3b934 7b118158 af648712 4ba039c5 fdab93ec 8ff2c86f 0454a8a3 acc99f34
+    4f4cf4b2 d227f5c1 f7e50d5a ce1d55e9 913512bb 3c43ee41 b27de523 1823dc25
+    e2d2ac57 1892aabc fe07b62d 6d7353c0 0fff3345 9850e213 c2f698d8 37ccffd9
+    d61f41a9 41cdf899 92e7da8d 6fce1069 eebbb05a f4ed5482 7208fa24 d1d33b4b
+    2935a5cd 53338f64 206aed4a 7beaa79e 81031002 3e2e0dc1 9da6804f 0768162b
+    27193aa0 b59b52e8 4df707dd 075c330a f129c373 e5b1f36d 0f99b0fa edb61a9d
+    278cf0d9 e2f04503 d991ab72 c47fb35c 0ee56e40 1232015f 0accd8c4 0c7eea9b
+    d2e2439e 75dd6e66 89400e39 208b2b93 54c5b789 63672d15 dda6708d 3f757b8a
+    8c994c0f a17c5f03 d3d54425 846b5e26 87e04fb2 5cf97840 7fff3dd5 6f1aba1b
+    d2547fdc 8dfc7ac3 f48ddc73 bb475266 cdd5b0a7 702147ba 49d3985a f5d0e964
+    abc0d2b2 291c2bb4 3545681f cc9d7c96 17fe9fe5 bb8ea411 f6ba9644 8b75ce66
+    57bf4116 cf67830c 9f6a2847 62e0f770 84fcf40c 7b48fcd9 eccdee4a 8cb3bbda
+    98247427 f77c19ec ef7402a1 9893dd23 3d55e33f 90a9ca47 38f191aa 3479e8a2
+    f37f91ab f9327665 e799d7bd ba95fce5 8636a486 97454311 1e394d5f 41c0c4f5
+    b802c771 d59d0d36 228a37da 45b0fa5e 4a0fc61f 76329f72 c1e5b04b 3ae71a96
+    fe1508fe b4fc6cf4 9e32887e 372694c3 22c4d070 97824701 c75094f3 2ee32906
+    b1691009 f664b1f3 d116defa d73ee0ca 9233df9c 48e4024f 86ed28e4 0eabf99f
+    61661a9d 8cdc69a7 4a34426f 13db0cf4 7b5056ed 53f42f72 3279b556 de5a2537
+    1745a454 38eec4d2 e0e35127 d352d677 f967e77f 4b7c6067 1aae3889 6327aa35
+    3ddb2d27 00a32feb 63666312 d7846a3f 314f070e bf01476e f5992f58 fd399019
+    a8499a50 10a49086 b8f655d0 8eff7414 6e83c96f 151075b1 86d7690e 68d69e8f
+    8c7e0b54 6e05c86c c0a6e505 851a49df fde50ba1 aed9970c 7d2ead9f 3f079891
+    a3cd809b 7c0197af 76b2dc9b 40047507 41e13928 dc518392 2e43d6b6 0cc27f1e
+    5e5bde06 122cab5f d9a027da c9f7acc4 7aca453d 125de678 8ed4963c bcb77e18
+    71e1e959 84224292 bc2f5f73 2b0fb1aa e1ecf760 3641299f 65fbc868 ddcac9e7
+    bb45390a b61dd6c7 3d789661 29c0beb8 348d49fa 647d2a9b b553fc5f f7
+h = 264879be d0e5fb3f
+
+k = 7daf8100 7166ed17 ab3d90db 59ccb67d
+m = c0e13be3 dd632685 d4d2aa7d 64ebcc86 5b430d08 39c2920c 30873a5c 1972619b
+    2f7a9283 12f4f157 043b4139 2f413e40 7a9dfc27 a81f32d5 c355eb67 e3eb6b41
+    92a308b7 1e729559 1a10d1f8 4adf7e01 349040c0 851f5435 fcdd6f8a 0d1b340f
+    733097a0 bac9956e 0c0dfd2d 2aa79f1d 96ea6c54 7dbd3b02 2a23dd61 355d933e
+    172401e0 0600628c fe505863 29a8fba7 a0ca8c84 8914a658 e8a38793 9f2392b8
+    8a249af3 3bf5714a 8115e6bd 2d72d273 eeb22af8 7a69ec25 328ef4fe 16eae1f3
+    6e630429 c7e4eac1 f5bc82b8 dfaeec9e 3409bcd7 50e56b4a 8bed09ad fe150d2d
+    630307e3 32ce0148 4fcef32f ea56e318 395d7106 ca427981 be2d3f4b b2acd964
+    2c7a74c2 4a8c3037 4e843050 c433a071 3d785607 d0f02f30 6e2576f8 e4445f0c
+    66ff6467 57f236e5 e376f971 876d0a3e f326abee 5557c6b1 64648361 6a3bbed0
+    fbb38161 a3bfbd52 bca03238 92415a67 4d388cf1 bb2075ab 5ef3741f a7ff206b
+    ac6c23a2 c5d0293a e2ec1346 765d9a11 342559df 0ccfb665 dbc689a1 54a5d8bb
+    0cbc558d d93e5577 8371e811 e2a2e922 ffb8fb84 3b87d9cc 5eedb4a6 417bda5c
+    7ccfe65e 1afccb41 266b72ae 9a469a00 3d922182 2ab55bb3 6b6befae 6d830893
+    1240861d 179b2161 33c0d5d0 3ef5ac9b de9b4a6e c2c754c9 1a22f971 bad9c1b6
+    22f4b7fc 0e389d42 14855b96 a39caa30 2f5f7e07 458ad83f d1c06ce4 7c3f64de
+    27a25ea5 55e565d2 713af55b d50d0124 4c0aaaae d5d67091 e78b0aa0 9e5fa230
+    1bdab598 0eaf5541 40e3d60b 6570b915 1dfffd6e c48831d7 72a4565f 89a053b1
+    3af058c2 1a148d09 13642ac8 d4ee4496 75ad4f0f 5c9ec63a ecfcf3d5 1c2908f1
+    19b2c0f7 29af251c 0e88defa 73b02bf4 11698cdc 81b3be28 7a1e1f1b 56fd79c6
+    a7f551ef adf084bc 32acee37 e2a1a819 bc997152 da557476 b8712db6 1f643066
+    ecc827aa e7fe2b05 119a5d00 f63507c6 556f5f45 6c54d41a bad0817d c17a11d6
+    f8c80770 83e84bde 54e99573 097603a3 6094bacc bb6dc144 c6c0bbab 048b9ebd
+    9f02aac3 c0e48f9a 5d8a7869 c0fc8f4c 2ea07f5c da3168da 4c27e59a 6899b489
+    c02d8211 cea6fc42 c2abd0ea 55a822ff dc22b6e1 5e481c2d 58565f3b 7c135706
+    098bbb9c ede6989a 8d64cf80 e468c0bb 1e3a0448 9f80e68f 080668f3 890073f4
+    3ddc1bb1 5ab460ed e7fa1308 7abcf16a b4784bdb 5a2ec83a b74e8c26 4da15128
+    ab72451e 3f78717b bd74b30e 77af77d4 699cb7ad 4ef4fb1b fdf16496 a641cac8
+    5152aa67 f5ff3923 978fab30 0549f202 a8ee8d25 1861184b 747a5560 978ba759
+    6dcc3d5e 1d0837fa 0592a100 8b983061 fddb2289 9242ed83 ec33791f f58b3c38
+    27804b9b f3b6bf7b b7b26898 c33483f7 6eb92120 f2a7a241 c59667cb 5fa30e63
+    7174d1d5 b30101c4 e3cfd058 16ec5e9f 083f0d2a cb169293 8229a414 c102
+h = c2aff6fc d9cac466
+
+k = 82db83fd 79db0aae 7b889eb2 5efba943
+m = eb2a8847 493717f4 6859f98e b06017a4 63774211 a29693d7 0a26f860 08d4a8e4
+    eca608af 2a03e564 52a2ce25 904db7c6 c55da7ad 64307eee 444c2fc0 89c12c43
+    69d634d7 d9b03283 925988b8 ce4652da ed0bb3af 18442f76 1bcb9aca 7c5bbb52
+    67485c93 99ff3b23 4394f301 d8eb8349 b5b1914c 77ca88c1 94943515 240e9866
+    932bbc31 5f04346f a317f218 b734a610 bd3e79a8 082945de 8732aefa fc6a50da
+    959cbd56 17a9dcdb fcd7c471 61067c53 2ba341dc 9727c093 1c70891e 3dc9056d
+    8b31cdb5 9b08bdf9 8fc6b101 fce4e317 ee0df9f6 7ae89537 9a4d0791 67a9ecc4
+    8d72b245 fe24d1d1 5f530071 8a8f61fb dc8f2a86 aa4a9611 0be326f5 3ef356dc
+    4f2beae5 0869bc8b c1ab044d 94de6c9c de0dcbf3 53c21567 bc4ae699 6cb7abc2
+    1e51d489 22a89365 ee4802c3 7e27b8a6 91d89edf 2fd1643e bfb56a04 5237c45a
+    3ea6bc9d 92e789e9 13a12f06 437726f8 b0cd3c01 00df3123 fc41039b 4af7a7c7
+    815fb8ad 18305767 40e5f3e7 4e71dcaf 146c57e2 1e9773ca d28544a8 76286619
+    19d0b177 4b1908c8 e04b5599 281292dd be6a4ed8 f19b9a51 0d93e678 818ac4a5
+    7b891884 30f942b2 b78cf48f 702cf618 f0902d6c db703932 6a4c29c5 ad7a323a
+    e9f330dd fa9f7ef6 f2679ebe 41037338 03911ed3 e133837b 3db02899 82a59b28
+    67f99994 90d98f25 df051c22 037111d0 d2317e18 0f374fb9 d2b67e3f a2277664
+    93a1d95f 211e0097 a609e3ec 1170f75d ae362eeb 23a6da1d 1ddfd836 f825f7b3
+    2e751414 6774611b 2df56693 99e971a8 1758ce18 240c3f4b 0e159e67 96e1108e
+    1b3a3f5f 3360bfb7 9c52ab3e 552b415f fbfbb55b b8a2bb06 fcda585e 0219e98c
+    cda5771c 56029023 559ebb75 562ab21f 48888dcb 1939aeb4 aa2e8fa1 28e13090
+    255786cf b434b9b9 558d4ec3 5275db6d 90a8c2f0 88114a36 5d114b7d a5cc19ee
+    075ced11 1eed7335 37a5a974 332a5a51 2120a98f 43ffdf6d 02a576d0 c4c95a0c
+    c9108264 cd55fb4c 6c36d3e3 e37388f0 2921ec0d 510b9ca3 468fa71a d3c5a2f5
+    ea1ed80f 70359641 1e258b81 26652869 ac70f09e 64c3b1c0 25b5f46e 77f17582
+    9862af85 5564f77e 601f9da0 d01b5ae6 a19e3bc3 9b04e740 a26488fe 2c79b965
+    cf0f1d7a 330a8c5f 28ece534 ae74c2e2 b8e44ddd 84641dcc 45cbd1e9 c2a88a64
+    d743a7af d92677e9 7886a10c a4736ba0 824755b8 e37bedde a0a999d8 f436d208
+    6ee73b61 8ff4f840 e926efe8 9d4cead2 a68855dd 12db17db 23d7dd59 ef55f6a9
+    343c71fe 5f5e741c 1d27cb4a b6886298 cc8b2b52 1869bfe9 1c359be3 98c0712d
+    3627bdc0 cea8e18c 1be2cd18 3af08233 774b0cba 0e675437 e1fd2f01 f3c43f28
+    65e04556 0be76af8 76b2b384 a265510f 21892340 4bbc8d29 239cd0eb 8b82e076
+    7de877f6 249bbd32 ff54d262 9b80ec22 e9f08dc8 de4cae32 ef60f8fc 8f1556
+h = d73dbf3e 31aa3fd8
+
+k = 59eb9397 bdc399d5 29e6c4e6 072866fa
+m = 70f49e60 b457d9e3 5e7f6051 411e5384 ba083d86 efd93e38 25796130 eb80a6d0
+    bc933646 c08b8505 fa82da35 10960782 42c6003c 0408fdf6 b862106a 7ffa1bd8
+    3fba490c a0e0c152 6dfed3a4 8e94c5e0 365d4711 d6164d69 9dfcb993 d090cef4
+    df726f85 beee8e9b 930832a9 ccb430a8 90660133 a4d782dc c39f184a 39c11233
+    df13c86f 982d7f22 e4227c8c 5a5d9dc9 77119284 5f38da3c b2949547 1bb09b92
+    e1492586 0b738de2 d672bd80 1fa5aa2c 96b0eac9 a0958a19 d72d03dd 1d81c3c0
+    d0cc99a1 d3c25e69 cc63e64f 24b4fd91 0b81c9dd 9362278a 72344f72 21348997
+    39fca89d 50279c11 3d43c736 73ab6959 6c7436b6 b0dcd89b 5b8dd053 034e406a
+    ff1d1292 57f3363d ce9a4a50 7fd8221a 166cf134 ff1e5291 41e3cb76 a7b25930
+    872b715d 18053a41 069b0bad 2fa88295 9f8003ea b65afdc8 ca06cd7d e513efa2
+    8da4f801 b083cd07 594a4dc2 e81980a4 afe67b0f db2c04d7 53dcde35 8aaf2e4f
+    d52cd815 3a235ba3 e63ce198 f50549a9 3f499650 d03dc59c 2c125a57 bec25f76
+    cc0d4d6f b2951769 f749a664 59d8f5d9 471e26a0 9a50ac15 d718ec27 9aff3b41
+    e83cfcc8 301da9b5 187e2d18 102d771f 3107d993 480efba4 a271a2bc fea27eb3
+    c4152930 3b54c63d ac099243 1f56a172 8c85f4b9 60666dc6 7b6c52f1 ae917d61
+    89c874b2 062f1fac c1433556 cffce154 9e23aa9a 0fa48c8e 216f87aa 8d06be98
+    868b7251 5b8c653c a165fec1 914f4477 72a8cce0 5d8276fe 29b1805b 8fa4b83b
+    a27197ab a8c04443 d02c0ce3 ad31f8bc bb7ca3f0 de85187b f47f6aeb 9e36ec6b
+    727ea0ae 19b76cf7 255c36b0 34aeefef facbd4c7 2265e708 63203ce3 2e7bdcc3
+    81395ce3 12372283 8d8b5b7a 6074e6a4 f452ac66 32c674a8 d725cae9 c2937935
+    dc3eead5 7485e4c4 c910d86c 7956e5b4 1867ec58 e2fbb8ca 338bdbe3 1798bac2
+    1dc690b8 1b223535 c5f8dfe8 9564c731 218b0176 d8f59060 f64c7fcf baf89fdd
+    42c41cf3 1195b274 62dfcdb8 c93c20bf 7e6d235f 8a7b13bf ee32f04d fb149ac2
+    b4913112 dc4b584c 7e99d17e 614dbea4 e436a5c9 901a4c74 47266429 aad47079
+    0b4df313 14e3e3f5 87b3fb35 dbe997b3 9694b1cc 4db540a1 05272d3c 1dbe316a
+    f950e194 76d6447a efa3fac0 bbfb18ba fbbd0ffc ffcd483c 6473c50a 0c9ed7ac
+    781eade4 24c691eb af732b57 c106c5b2 1b56edec d7250acd 3b9b05d3 ad8c4f1e
+    92638899 ddc95843 1079c91f 723b1acd 6808e90b e7bacf9e 7bb0451e 6e8a155d
+    21c677d0 a12fa428 26ca5b83 781d558e f74af406 46abc255 b82406db 6e10be2d
+    3cc2ff8b 37a80d90 4c147bec 774a05b8 eb25a006 ebd07507 72d5f5fb b0a3f11d
+    bc8187ba 4b69409c 4d10c2ef 09aaf4e8 c925aab6 7c7d8204 39b08c19 2d9ca8d9
+    29e57407 69b5ad0e 62e9bfa9 fa959ee7 6eb819e5 c3184ebd 3f3eb3ca c66e17fb
+h = 7b56e464 8c9b31be
index 5a2f1f7338a74a1f38b1a223c41615fba8a9e54c..34a1897f5ecd1583be00d18f08972d03693a460e 100644 (file)
@@ -35,6 +35,14 @@ AT_CHECK([BUILDDIR/t/hash.t SRCDIR/t/crc32.tests], [0], [ignore], [ignore])
 
 AT_CLEANUP
 
+## siphash
+AT_SETUP([hash: siphash])
+AT_KEYWORDS([hash siphash])
+
+AT_CHECK([BUILDDIR/t/hash.t SRCDIR/t/siphash.tests], [0], [ignore], [ignore])
+
+AT_CLEANUP
+
 ## unihash
 AT_SETUP([hash: unihash])
 AT_KEYWORDS([hash unihash])
index 6b7468d70bea905cb1809bc2478eb4a21c76af13..e310de0f7239c95e8775708cadef799dd5ce583c 100644 (file)
@@ -199,11 +199,31 @@ dependent on any unproven assumptions (unlike many `proofs' of
 cryptographic security, which actually reduce the security of some
 construction to the security of its components).  It's just a fact.
 .
+.SS "Practical issues"
+The implementation of
+.B unihash
+uses a (fairly large) table precomputed from the key.
+When a message is hashed,
+some of the message data
+and internal state of the hashing operation
+are leaked to other processes on the same hardware
+through the processor cache
+and other stateful microarchitectural features.
+It's possible for an adversary to determine the hashing key
+by observing this leakage.
+This is unlikely to be a major concern
+since local processes have other, more effective ways to deny service;
+but if is then
+.BR siphash (3)
+may be more appropriate.
+See that manual page for a comparison of the two.
+.
 .\"--------------------------------------------------------------------------
 .SH SEE ALSO
 .
-.BR unihash-mkstatic (3),
+.BR unihash-mkstatic (1),
 .BR crc32 (3),
+.BR siphash (3),
 .BR mLib (3).
 .
 .\"--------------------------------------------------------------------------
diff --git a/m4/mdw-probe-fltfmt.m4 b/m4/mdw-probe-fltfmt.m4
new file mode 100644 (file)
index 0000000..736e871
--- /dev/null
@@ -0,0 +1,310 @@
+dnl -*-autoconf-*-
+
+### SYNOPSIS
+###
+###   mdw_PROBE_FLTFMT
+###
+### DESCRIPTION
+###
+###   Attempts to determine the target system's floating-point formats.
+###   The macros `FLT_FORMAT', `DBL_FORMAT', and `LDBL_FORMAT' are defined if
+###   the corresponding formats are recognized.  The values of these macros
+###   are a bitmask:
+###
+###    * `FLTFMT_ORGMASK' is a bitmask covering the `organization' field,
+###      which identifies the organization which defined the format.
+###
+###        -- `FLTFMT_IEEE' identifies IEEE 754.
+###        -- `FLTFMT_INTEL' identifies Intel.
+###
+###     * `FLTFMT_TYPEMASK' is a bitmask covering the `type' field, which
+###      must be interpreted together with the organization field to
+###      determine the format.
+###
+###        -- `FLTFMT_IEEE_F32' is the IEEE 754 `binary32' format.
+###        -- `FLTFMT_IEEE_F64' is the IEEE 754 `binary64' format.
+###        -- `FLTFMT_IEEE_F128' is the IEEE 754 `binary128' format.
+###        -- `FLTFMT_INTEL_F80' is the Intel x87 80-bit double-extended
+###           format.
+###
+###     * `FLTFMT_ENDMASK' is a bitmask covering the `endian' field, which
+###      describes the byte ordering convention used.
+###
+###        -- `FLTFMT_LE' means little-endian format.
+###
+###        -- `FLTFMT_BE' means big-endian format.
+###
+###        -- `FLTFMT_ARME' means `Acorn's ridiculous mixed-endian' format,
+###           used by the ARM FPA, which stored the a `binary64' value as
+###           two 32-bit words, most significant word first, but with the
+###           individual words stored in little-endian byte order.
+###
+###      Other conventions exist and support for them may be added later.
+###
+###   Finally, there are predefined values for relevant combinations of
+###   format codes and byte orderings:
+###
+###     * `FLTFMT_IEEE_F32_LE' and `FLTFMT_IEEE_F32_BE';
+###     * `FLTFMT_IEEE_F64_LE' and `FLTFMT_IEEE_F64_BE';
+###     * `FLTFMT_IEEE_F128_LE' and `FLTFMT_IEEE_F128_BE';
+###     * `FLTFMT_INTEL_F80_LE' and `FLTFMT_INTEL_F80_BE'.
+###
+###   (I don't know of anything which uses Intel's double-extended format in
+###   big-endian order, but it was easy enough to check for.  The IEEE
+###   formats are used on ARM64 and z/Architecture with opposite byte order.)
+###
+###   This macro works correctly when cross-compiling.
+###
+### LICENSE
+###
+###   Copyright (c) 2024 Mark Wooding <mdw@distorted.org.uk>
+###
+###   This program is free software: you can redistribute it and/or modify it
+###   under the terms of the GNU General Public License as published by the
+###   Free Software Foundation, either version 2 of the License, or (at your
+###   option) any later version.
+###
+###   This program is distributed in the hope that it will be useful, but
+###   WITHOUT ANY WARRANTY; without even the implied warranty of
+###   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+###   General Public License for more details.
+###
+###   You should have received a copy of the GNU General Public License along
+###   with this program. If not, see <http://www.gnu.org/licenses/>.
+###
+###   In particular, no exception to the GPL is granted regarding generated
+###   `configure' scripts which are the output of Autoconf.
+
+dnl Principle of operation:
+dnl
+dnl The essential trick here lies in finding floating-point numbers whose
+dnl encoding, in various formats of interest, happen to be recognizable
+dnl diagnostic text strings.  The structure definitions provide some space
+dnl for framing text which allows us to scrape the resulting diagnostic
+dnl strings from the object file.
+dnl
+dnl IEEE formats conveniently don't impose any restrictions on the contents
+dnl of the fraction field because there's a hidden bit.  The Intel x87
+dnl double-extended format makes the most significant bit explicit, and also
+dnl expects normalization, which means that the top bit of the fraction bytes
+dnl must be set, so everything gets quite ugly.  Worse, the actual data is 10
+dnl bytes long, but it sits in a 16-byte field to force alignment in vectors,
+dnl with the result that there are unavoidably zero bytes in our diagnostic
+dnl output.  Different tools respond to these differently; e.g., GNU sed(1)
+dnl just writes out the zero bytes like they were any other character, while
+dnl Busybox sed(1) terminates the output line.  As a result, we have to be
+dnl rather more flexible about matching this than I'd really like.  (Messing
+dnl about with compiler-specific hacks for structure packing won't help here
+dnl because the analysis code still has to cope with compilers which don't
+dnl have those hacks.)
+
+# Serial 1
+AC_COPYRIGHT([
+Portions copyright (c) 2024 Mark Wooding.
+
+This configure script is free software: you can redistribute it and/or
+modify it under he terms of the GNU General Public License as published
+by the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.])
+
+AC_DEFUN([mdw_PROBE_FLTFMT],
+  [AC_CACHE_CHECK([floating-point representations], [mdw_cv_fltfmt],
+     [mdw_fltfmt=nil mdw_dblfmt=nil mdw_ldblfmt=nil
+      AC_LINK_IFELSE([AC_LANG_SOURCE([
+
+/* The following program is copyright (c) 2024 Mark Wooding.  It is free
+ * software: you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software Foundation,
+ * either version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@%:@include <float.h>
+
+@%:@define DEFFLTDIAG(ty, type)                                                \
+  struct fltdiag_@%:@@%:@ty { char top@<:@48@:>@; type x; char tail@<:@4@:>@; }
+
+DEFFLTDIAG(flt, float);
+
+static const struct fltdiag_flt flt_ieee_f32 = {
+  "\0\0\0\0\0\0\0\0\n@@@ mdw-probe-fltfmt float ieee-f32 = >",
+  781.0352,
+  "<\n\0\0"
+};
+@%:@define DO_FLT_IEEE_F32 DO(flt_ieee_f32)
+
+DEFFLTDIAG(dbl, double);
+
+@%:@if DBL_MAX_10_EXP > 40
+static const struct fltdiag_dbl dbl_ieee_f64 = {
+  "\0\0\0\0\0\0\0\n@@@ mdw-probe-fltfmt double ieee-f64 = >",
+  1.5839800103804824e40,
+  "<\n\0\0"
+};
+@%:@  define DO_DBL_IEEE_F64 DO(dbl_ieee_f64)
+@%:@else
+@%:@  define DO_DBL_IEEE_F64
+@%:@endif
+
+DEFFLTDIAG(ldbl, long double);
+
+@%:@if LDBL_MAX_10_EXP > 40
+static const struct fltdiag_ldbl ldbl_ieee_f64 = {
+  "\0\0\n@@@ mdw-probe-fltfmt long-double ieee-f64 = >",
+  1.5839800103804824e40,
+  "<\n\0\0"
+};
+@%:@  define DO_LDBL_IEEE_F64 DO(ldbl_ieee_f64)
+@%:@else
+@%:@  define DO_LDBL_IEEE_F64
+@%:@endif
+
+@%:@if LDBL_MAX_10_EXP > 1257
+static const struct fltdiag_ldbl ldbl_ieee_f128 = {
+  "\0\n@@@ mdw-probe-fltfmt long-double ieee-f128 = >",
+  1.6487728650847311136108983312706536e+1257L,
+  "<\n\0\0"
+};
+@%:@  define DO_LDBL_IEEE_F128 DO(ldbl_ieee_f128)
+@%:@else
+@%:@  define DO_LDBL_IEEE_F128
+@%:@endif
+
+@%:@if LDBL_MAX_10_EXP > 793
+static const struct fltdiag_ldbl ldbl_intel_f80 = {
+  "\0\n@@@ mdw-probe-fltfmt long-double intel-f80 = >",
+  1.2806567921142816197e+793L,
+  "<\n\0\0"
+};
+@%:@  define DO_LDBL_INTEL_F80 DO(ldbl_intel_f80)
+@%:@else
+@%:@  define DO_LDBL_INTEL_F80
+@%:@endif
+
+@%:@include <stdio.h>
+int main(void)
+{
+@%:@define DO(var) fwrite(&var, sizeof(var), 1, stdout)
+  DO_FLT_IEEE_F32;
+  DO_DBL_IEEE_F64;
+  DO_LDBL_IEEE_F64;
+  DO_LDBL_IEEE_F128;
+  DO_LDBL_IEEE_F128;
+  DO_LDBL_INTEL_F80;
+@%:@undef DO
+  return (0);
+}
+])],
+       [sed -n "/^@@@ mdw-probe-fltfmt @<:@^ @:>@* @<:@^ @:>@* = >/p" \
+                conftest$EXEEXT >conftest.out
+        while read _at _tag ty fmt _eq diag; do
+          case $ty,$fmt,$diag in
+            "float,ieee-f32,>ABCD<") mdw_fltfmt=ieee-f32-le ;;
+            "float,ieee-f32,>DCBA<") mdw_fltfmt=ieee-f32-be ;;
+            "double,ieee-f64,>ABCDEFGH<") mdw_dblfmt=ieee-f64-le ;;
+            "double,ieee-f64,>EFGHABCD<") mdw_dblfmt=ieee-f64-arme ;;
+            "double,ieee-f64,>HGFEDCBA<") mdw_dblfmt=ieee-f64-be ;;
+            "long-double,ieee-f64,>ABCDEFGH<") mdw_ldblfmt=ieee-f64-le ;;
+            "long-double,ieee-f64,>HGFEDCBA<") mdw_ldblfmt=ieee-f64-be ;;
+            "long-double,ieee-f128,>ABCDEFGHIJKLMNOP<")
+              mdw_ldblfmt=ieee-f128-le ;;
+            "long-double,ieee-f128,>PONMLKJIHGFEDCBA<")
+              mdw_ldblfmt=ieee-f128-be ;;
+            "long-double,intel-f80,>ABCDEFGÈIJ" | \
+            "long-double,intel-f80,>ABCDEFGÈIJ"*"<")
+              mdw_ldblfmt=intel-f80-le ;;
+            "long-double,intel-f80,>JIÈGFEDCBA" | \
+            "long-double,intel-f80,>JIÈGFEDCBA"*"<")
+              mdw_ldblfmt=intel-f80-be ;;
+          esac
+        done <conftest.out])
+      mdw_cv_fltfmt="float=$mdw_fltfmt"
+      mdw_cv_fltfmt="$mdw_cv_fltfmt double=$mdw_dblfmt"
+      mdw_cv_fltfmt="$mdw_cv_fltfmt long-double=$mdw_ldblfmt"])
+
+   AC_DEFINE([FLTFMT_ENDMASK], [0x0300],
+       [mask for byte ordering])
+   AC_DEFINE([FLTFMT_LE], [0x0000],
+       [little-endian floating-point storage])
+   AC_DEFINE([FLTFMT_BE], [0x0100],
+       [big-endian floating-point storage])
+   AC_DEFINE([FLTFMT_ARME], [0x0200],
+       [Acorn's ridiculous mixed-endian floating-point storage])
+
+   AC_DEFINE([FLTFMT_ORGMASK], [0xfc00],
+       [mask for floating-point organization id])
+   AC_DEFINE([FLTFMT_TYPEMASK], [0x00ff],
+       [mask for floating-point format type])
+
+   AC_DEFINE([FLTFMT_UNKNOWN], [0x0000],
+       [unrecognized floating-point format])
+
+   AC_DEFINE([FLTFMT_IEEE], [0x0400],
+       [floating-point organization id for IEEE 754])
+   AC_DEFINE([FLTFMT_IEEE_F32], [FLTFMT_IEEE | 5],
+       [IEEE 754 `binary32' format])
+   AC_DEFINE([FLTFMT_IEEE_F32_LE], [(FLTFMT_IEEE_F32 | FLTFMT_LE)],
+       [IEEE `binary32' format, little-endian])
+   AC_DEFINE([FLTFMT_IEEE_F32_BE], [(FLTFMT_IEEE_F32 | FLTFMT_BE)],
+       [IEEE `binary32' format, big-endian])
+   AC_DEFINE([FLTFMT_IEEE_F64], [FLTFMT_IEEE | 6],
+       [IEEE 754 `binary32' format])
+   AC_DEFINE([FLTFMT_IEEE_F64_LE], [(FLTFMT_IEEE_F64 | FLTFMT_LE)],
+       [IEEE `binary64' format, little-endian])
+   AC_DEFINE([FLTFMT_IEEE_F64_ARME], [(FLTFMT_IEEE_F64 | FLTFMT_ARME)],
+       [IEEE `binary64' format, Acorn ridiculous mixed-endian])
+   AC_DEFINE([FLTFMT_IEEE_F64_BE], [(FLTFMT_IEEE_F64 | FLTFMT_BE)],
+       [IEEE `binary64' format, big-endian])
+   AC_DEFINE([FLTFMT_IEEE_F128], [FLTFMT_IEEE | 7],
+       [IEEE 754 `binary32' format])
+   AC_DEFINE([FLTFMT_IEEE_F128_LE], [(FLTFMT_IEEE_F128 | FLTFMT_LE)],
+       [IEEE `binary128' format, little-endian])
+   AC_DEFINE([FLTFMT_IEEE_F128_BE], [(FLTFMT_IEEE_F128 | FLTFMT_BE)],
+       [IEEE `binary128' format, big-endian])
+
+   AC_DEFINE([FLTFMT_INTEL], [0x0800],
+       [floating-point organization id for Intel])
+   AC_DEFINE([FLTFMT_INTEL_F80], [FLTFMT_INTEL | 80],
+       [Intel x87 double-extended format])
+   AC_DEFINE([FLTFMT_INTEL_F80_LE], [(FLTFMT_INTEL_F80 | FLTFMT_LE)],
+       [Intel x86 double-extended format, little-endian])
+   AC_DEFINE([FLTFMT_INTEL_F80_BE], [(FLTFMT_INTEL_F80 | FLTFMT_BE)],
+       [Intel x87 double-extended format, big-endian])
+
+   AH_TEMPLATE([FLT_FORMAT],
+       [floating point format for `float' type])
+   AH_TEMPLATE([DBL_FORMAT],
+       [floating point format for `double' type])
+   AH_TEMPLATE([LDBL_FORMAT],
+       [floating point format for `long double' type])
+
+   for w in $mdw_cv_fltfmt; do
+     ty=${w%=*} fmt=${w@%:@*=}
+     case $ty in
+       float) var=FLT ;;
+       double) var=DBL ;;
+       long-double) var=LDBL ;;
+       *) AC_MSG_ERROR([unexpected floating-point type \`$ty']) ;;
+     esac
+     case $fmt in
+       nil) value=UNKNOWN ;;
+       ieee-f32-le) value=IEEE_F32_LE ;;
+       ieee-f32-be) value=IEEE_F32_BE ;;
+       ieee-f64-le) value=IEEE_F64_LE ;;
+       ieee-f64-arme) value=IEEE_F64_ARME ;;
+       ieee-f64-be) value=IEEE_F64_BE ;;
+       ieee-f128-le) value=IEEE_F128_LE ;;
+       ieee-f128-be) value=IEEE_F128_BE ;;
+       intel-f80-le) value=INTEL_F80_LE ;;
+       intel-f80-be) value=INTEL_F80_BE ;;
+       *) AC_MSG_ERROR([unexpected floating-point format \`$fmt']) ;;
+     esac
+     AC_DEFINE_UNQUOTED([${var}_FORMAT], [FLTFMT_$value])
+   done])
index 28330df3a55eb9fa5400c17b8b1e86f8cd8671ab..a9195bd9e32c37e30f3781fe4a554a79aa5eaa12 100644 (file)
 .
 .\"--------------------------------------------------------------------------
 .TH alloc 3mLib "8 May 1999" "Straylight/Edgeware" "mLib utilities library"
-.\" @xmalloc
-.\" @xrealloc
-.\" @xstrdup
-.\" @xfree
 .\" @x_alloc
+.\" @x_allocv
+.\" @X_NEW
+.\" @X_NEWV
 .\" @x_strdup
 .\" @x_realloc
+.\" @x_reallocv
+.\" @X_RENEWV
 .\" @x_free
 .
+.\" @xmalloc
+.\" @xmallocv
+.\" @XNEW
+.\" @XNEWV
+.\" @xstrdup
+.\" @xrealloc
+.\" @xreallocv
+.\" @XRENEWV
+.\" @xfree
+.
 .\"--------------------------------------------------------------------------
 .SH NAME
 alloc \- mLib low-level memory allocation
@@ -49,13 +60,26 @@ alloc \- mLib low-level memory allocation
 .B "#include <mLib/alloc.h>"
 .PP
 .BI "void *x_alloc(arena *" a ", size_t " sz );
+.BI "void *x_allocv(arena *" a ", size_t " n ", size_t " sz );
+.BI "X_NEW(" type " *" p ", arena *" a );
+.BI "X_NEWV(" type " *" p ", arena *" a ", size_t " n );
+.BI "void *x_allocv(arena *" a ", size_t " n ", size_t " sz );
 .BI "char *x_strdup(arena *" a ", const char *" s );
 .BI "void *x_realloc(arena *" a ", void *" p ", size_t " sz ", size_t " osz );
+.ta \w'\fBvoid *x_reallocv('u
+.BI "void *x_reallocv(arena *" a ", void *" p ,
+.BI "  size_t " n ", size_t " on ", size_t " sz );
+.BI "X_RENEWV(" type " *" p ", arena *" a ", size_t " n ", size_t " on );
 .BI "void x_free(arena *" a ", void *" p );
 .PP
 .BI "void *xmalloc(size_t " sz );
-.BI "void *xrealloc(void *" p ", size_t " sz ", size_t " osz );
+.BI "void *xmallocv(size_t " n ", size_t " sz );
+.BI "XNEW(" type " *" p );
+.BI "XNEWV(" type " *" p ", size_t " n );
 .BI "char *xstrdup(const char *" s );
+.BI "void *xrealloc(void *" p ", size_t " sz ", size_t " osz );
+.BI "void *xreallocv(void *" p ", size_t " n ", size_t " on ", size_t " sz );
+.BI "XRENEWV(" type " *" p ", size_t " n ", size_t " on );
 .BI "void xfree(void *" p );
 .fi
 .
@@ -69,7 +93,9 @@ exception is raised.
 .PP
 The functions
 .BR x_alloc ,
+.BR x_allocv ,
 .BR x_realloc ,
+.BR x_reallocv ,
 .BR x_strdup
 and
 .BR x_free
@@ -87,16 +113,55 @@ releases a block.
 is supplied for orthogonality's sake: it's equivalent to calling the
 .BR A_FREE (3)
 macro.)
+The
+.B x_allocv
+and
+.B x_reallocv
+functions
+allocate space for arrays.
+They check for potential overflow before proceeding.
+.PP
+The
+.B X_NEW
+macro sets a pointer
+.I p
+to point to freshly allocated memory large enough for the type that
+.I p
+points to;
+The
+.B X_NEWV
+macro sets
+.I p
+to point to freshly allocated memory large enough for
+.I n
+elements, each of the type that
+.I p
+points to.
+The
+.B X_RENEWV
+resizes the block that
+.I p
+points to, so that it now has space for
+.I n
+elements of the appropriate type, having previously had space for
+.I on
+elements;
 .PP
 The
 .BR xmalloc ,
+.BR xmallocv ,
+.BR XNEW ,
+.BR XNEWV ,
 .BR xrealloc ,
+.BR xreallocv ,
+.BR XRENEWV ,
 .BR xstrdup
 and
 .BR xfree
 macros are provided as a convenient interface to failsafe memory
 allocation from the current arena
 .BR arena_global (3).
+.PP
 .
 .\"--------------------------------------------------------------------------
 .SH "SEE ALSO"
index e71ead40c73b56652711932e9367346995033b9b..8a62617a3641059d400bfc01265cf8343b04a2c8 100644 (file)
 
 /*----- Functions and macros ----------------------------------------------*/
 
-/* --- @x_alloc@ --- *
+/* --- @x_alloc@, @x_allocn@ --- *
  *
  * Arguments:  @arena *a@ = pointer to underlying arena
- *             @size_t sz@ = size of block to allocate
+ *             @size_t n@ = number of elements to allocate (for @x_allocv@)
+ *             @size_t sz@ = size of elements to allocate
  *
  * Returns:    Pointer to allocated block.
  *
- * Use:                Allocates memory.  If there's not enough memory, the
- *             exception @EXC_NOMEM@ is thrown.
+ * Use:                The @x_allocn@ function allocates memory for @n@ elements of
+ *             @sz@ bytes each (or, perhaps, %%\emph{vice versa}).  The
+ *             @x_alloc@ function is the same, but with @n@ fixed equal
+ *             to 1.  If there's not enough memory, the exception
+ *             @EXC_NOMEM@ is thrown.
  */
 
 void *x_alloc(arena *a, size_t sz)
 {
-  void *p = A_ALLOC(a, sz);
-  if (!p)
-    THROW(EXC_NOMEM);
-  return (p);
+  void *p;
+
+  p = A_ALLOC(a, sz);
+    if (!p) THROW(EXC_NOMEM);
+    else return (p);
+}
+
+void *x_allocv(arena *a, size_t n, size_t sz)
+{
+  void *p;
+
+  p = A_ALLOCV(a, n, sz);
+    if (!p) THROW(EXC_NOMEM);
+    else return (p);
 }
 
 /* --- @x_strdup@ --- *
@@ -74,32 +88,48 @@ void *x_alloc(arena *a, size_t sz)
 
 char *x_strdup(arena *a, const char *s)
 {
-  size_t sz = strlen(s) + 1;
-  char *p = x_alloc(a, sz);
-  memcpy(p, s, sz);
+  char *p; size_t sz;
+
+  sz = strlen(s) + 1; p = x_alloc(a, sz); memcpy(p, s, sz);
   return (p);
 }
 
-/* --- @x_realloc@ --- *
+/* --- @x_realloc@, @x_reallocv@ --- *
  *
  * Arguments:  @arena *a@ = pointer to underlying arena
  *             @void *p@ = pointer to a block of memory
- *             @size_t sz@ = new size desired for the block
- *             @size_t osz@ = size of the old block
+ *             @size_t n@ = new number of elements (for @x_reallocv@)
+ *             @size_t on@ = old  number of elements (for @x_reallocv@)
+ *             @size_t sz@ = size of elements (for @x_reallocv@) or new
+ *                     block size (for @x_realloc@)
+ *             @size_t osz@ = size of the old block (for @x_realloc@)
  *
  * Returns:    Pointer to the resized memory block (which is almost
  *             certainly not in the same place any more).
  *
  * Use:                Resizes a memory block.  If there's not enough memory, the
  *             exception @EXC_NOMEM@ is thrown.
+ *
+ *             The @x_reallocv@ function adjusts a block which currently has
+ *             space for @on@ elements each of size @sz@, so that it now has
+ *             enough space for @n@ elements, preserving the initial @min(n,
+ *             on)@ elements.  The @x_realloc@ function is the same, but
+ *             with @sz@ fixed equal to 1, and @n@ and @on@ renamed to @sz@
+ *             and @osz@ for historical reasons.
  */
 
 void *x_realloc(arena *a, void *p, size_t sz, size_t osz)
 {
   p = A_REALLOC(a, p, sz, osz);
-  if (!p)
-    THROW(EXC_NOMEM);
-  return (p);
+    if (!p) THROW(EXC_NOMEM);
+    else return (p);
+}
+
+void *x_reallocv(arena *a, void *p, size_t n, size_t on, size_t sz)
+{
+  p = A_REALLOCV(a, p, n, on, sz);
+    if (!p) THROW(EXC_NOMEM);
+    else return (p);
 }
 
 /* --- @x_free@ --- *
@@ -116,17 +146,20 @@ void (x_free)(arena *a, void *p) { x_free(a, p); }
 
 /*----- Old functions for the standard arena ------------------------------*/
 
-/* --- @xmalloc@ --- *
+/* --- @xmalloc@, @xmallocv@ --- *
  *
- * Arguments:  @size_t sz@ = size of block to allocate
+ * Arguments:  @size_t n@ = number of elements to allocate (for @xmallocv@)
+ *             @size_t sz@ = size of block to allocate
  *
  * Returns:    Pointer to allocated block.
  *
- * Use:                Allocates memory.  If there's not enough memory, the
- *             exception @EXC_NOMEM@ is thrown.
+ * Use:                Allocates memory for @n@ elements each of size @sz@.  For
+ *             @xmalloc@, @n@ is fixed equal to 1.  If there's not enough
+ *             memory, the exception @EXC_NOMEM@ is thrown.
  */
 
 void *(xmalloc)(size_t sz) { return xmalloc(sz); }
+void *(xmallocv)(size_t n, size_t sz) { return xmallocv(n, sz); }
 
 /* --- @xstrdup@ --- *
  *
@@ -141,21 +174,33 @@ void *(xmalloc)(size_t sz) { return xmalloc(sz); }
 
 char *(xstrdup)(const char *s) { return xstrdup(s); }
 
-/* --- @xrealloc@ --- *
+/* --- @xrealloc@, @xreallocv@ --- *
  *
  * Arguments:  @void *p@ = pointer to a block of memory
- *             @size_t sz@ = new size desired for the block
- *             @size_t osz@ = size of the old block
+ *             @size_t n@ = new number of elements (for @xreallocv@)
+ *             @size_t on@ = old  number of elements (for @xreallocv@)
+ *             @size_t sz@ = size of elements (for @xreallocv@) or new
+ *                     block size (for @xrealloc@)
+ *             @size_t osz@ = size of the old block (for @xrealloc@)
  *
  * Returns:    Pointer to the resized memory block (which is almost
  *             certainly not in the same place any more).
  *
  * Use:                Resizes a memory block.  If there's not enough memory, the
  *             exception @EXC_NOMEM@ is thrown.
+ *
+ *             The @xreallocv@ function adjusts a block which currently has
+ *             space for @on@ elements each of size @sz@, so that it now has
+ *             enough space for @n@ elements, preserving the initial @min(n,
+ *             on)@ elements.  The @xrealloc@ function is the same, but
+ *             with @sz@ fixed equal to 1, and @n@ and @on@ renamed to @sz@
+ *             and @osz@ for historical reasons.
  */
 
 void *(xrealloc)(void *p, size_t sz, size_t osz)
-{ return xrealloc(p, sz, osz); }
+  { return xrealloc(p, sz, osz); }
+void *(xreallocv)(void *p, size_t n, size_t on, size_t sz)
+  { return xreallocv(p, n, on, sz); }
 
 /* --- @xfree@ --- *
  *
index 234918148e49413d2a501a75bbefc1ce24a75513..8a5c364bf434e8a8ea69bc12a1c8a4a429ec79d4 100644 (file)
 
 /*----- Functions and macros ----------------------------------------------*/
 
-/* --- @x_alloc@ --- *
+/* --- @x_alloc@, @x_allocv@ --- *
  *
  * Arguments:  @arena *a@ = pointer to underlying arena
- *             @size_t sz@ = size of block to allocate
+ *             @size_t n@ = number of elements to allocate (for @x_allocv@)
+ *             @size_t sz@ = size of elements to allocate
  *
  * Returns:    Pointer to allocated block.
  *
- * Use:                Allocates memory.  If there's not enough memory, the
- *             exception @EXC_NOMEM@ is thrown.
+ * Use:                The @x_allocv@ function allocates memory for @n@ elements of
+ *             @sz@ bytes each (or, perhaps, %%\emph{vice versa}).  The
+ *             @x_alloc@ function is the same, but with @n@ fixed equal
+ *             to 1.  If there's not enough memory, the exception
+ *             @EXC_NOMEM@ is thrown.
  */
 
 extern void *x_alloc(arena */*a*/, size_t /*sz*/);
+extern void *x_allocv(arena */*a*/, size_t /*n*/, size_t /*sz*/);
+
+/* --- @X_NEW@, @X_NEWV@ --- *
+ *
+ * Arguments:  @type *p@ = a pointer to allocate
+ *             @arena *a@ = pointer to underlying arena
+ *             @size_t n@ = number of elements
+ *
+ * Returns:    ---
+ *
+ * Use:                Set @p@ to point to a freshly allocate block large enough for
+ *             @n@ elements each of the type pointed to by @p@.
+ */
+
+#define X_NEW(p, a) do { (p) = x_alloc((a), sizeof(*(p))); } while (0)
+#define X_NEWV(p, a, n)                                                        \
+       do { (p) = x_allocv((a), (n), sizeof(*(p))); } while (0)
 
 /* --- @x_strdup@ --- *
  *
@@ -69,22 +90,51 @@ extern void *x_alloc(arena */*a*/, size_t /*sz*/);
 
 extern char *x_strdup(arena */*a*/, const char */*s*/);
 
-/* --- @x_realloc@ --- *
+/* --- @x_realloc@, @x_reallocv@ --- *
  *
  * Arguments:  @arena *a@ = pointer to underlying arena
  *             @void *p@ = pointer to a block of memory
- *             @size_t sz@ = new size desired for the block
- *             @size_t osz@ = size of the old block
+ *             @size_t n@ = new number of elements (for @x_reallocv@)
+ *             @size_t on@ = old  number of elements (for @x_reallocv@)
+ *             @size_t sz@ = size of elements (for @x_reallocv@) or new
+ *                     block size (for @x_realloc@)
+ *             @size_t osz@ = size of the old block (for @x_realloc@)
  *
  * Returns:    Pointer to the resized memory block (which is almost
  *             certainly not in the same place any more).
  *
  * Use:                Resizes a memory block.  If there's not enough memory, the
  *             exception @EXC_NOMEM@ is thrown.
+ *
+ *             The @x_reallocv@ function adjusts a block which currently has
+ *             space for @on@ elements each of size @sz@, so that it now has
+ *             enough space for @n@ elements, preserving the initial @min(n,
+ *             on)@ elements.  The @x_realloc@ function is the same, but
+ *             with @sz@ fixed equal to 1, and @n@ and @on@ renamed to @sz@
+ *             and @osz@ for historical reasons.
  */
 
 extern void *x_realloc(arena */*a*/, void */*p*/,
                       size_t /*sz*/, size_t /*osz*/);
+extern void *x_reallocv(arena */*a*/, void */*p*/,
+                       size_t /*n*/, size_t /*on*/, size_t /*sz*/);
+
+/* --- @X_RENEWV@ --- *
+ *
+ * Arguments:  @type *p@ = a pointer to allocate
+ *             @arena *a@ = pointer to underlying arena
+ *             @size_t n, on@ = new and existing numbers of elements
+ *
+ * Returns:    ---
+ *
+ * Use:                Adjust @p@ to point to a new block of memory with space for
+ *             @n@ elements of the type pointed to by @p@, on the assumption
+ *             that @p@ is either null or currently points to a block with
+ *             space for @on@ elements.
+ */
+
+#define X_RENEWV(p, a, n, on)                                          \
+       do { (p) = x_reallocv((a), (p), (n), (on), sizeof(*(p))); } while (0)
 
 /* --- @x_free@ --- *
  *
@@ -101,18 +151,36 @@ extern void x_free(arena */*a*/, void */*p*/);
 
 /*----- Old functions for the standard arena ------------------------------*/
 
-/* --- @xmalloc@ --- *
+/* --- @xmalloc@, @xmallocv@ --- *
  *
- * Arguments:  @size_t sz@ = size of block to allocate
+ * Arguments:  @size_t n@ = number of elements to allocate (for @xmallocv@)
+ *             @size_t sz@ = size of block to allocate
  *
  * Returns:    Pointer to allocated block.
  *
- * Use:                Allocates memory.  If there's not enough memory, the
- *             exception @EXC_NOMEM@ is thrown.
+ * Use:                Allocates memory for @n@ elements each of size @sz@.  For
+ *             @xmalloc@, @n@ is fixed equal to 1.  If there's not enough
+ *             memory, the exception @EXC_NOMEM@ is thrown.
  */
 
 extern void *xmalloc(size_t /*sz*/);
+extern void *xmallocv(size_t /*n*/, size_t /*sz*/);
 #define xmalloc(sz) x_alloc(arena_global, (sz))
+#define xmallocv(n, sz) x_allocv(arena_global, (n), (sz))
+
+/* --- @XNEW@, @XNEWV@ --- *
+ *
+ * Arguments:  @type *p@ = a pointer to allocate
+ *             @size_t n@ = number of elements
+ *
+ * Returns:    ---
+ *
+ * Use:                Set @p@ to point to a freshly allocate block large enough for
+ *             @n@ elements each of the type pointed to by @p@.
+ */
+
+#define XNEW(p) X_NEW(p, arena_global);
+#define XNEWV(p, n) X_NEWV(p, arena_global, n);
 
 /* --- @xstrdup@ --- *
  *
@@ -128,21 +196,50 @@ extern void *xmalloc(size_t /*sz*/);
 extern char *xstrdup(const char */*s*/);
 #define xstrdup(p) x_strdup(arena_global, (p))
 
-/* --- @xrealloc@ --- *
+/* --- @xrealloc@, @xreallocv@ --- *
  *
  * Arguments:  @void *p@ = pointer to a block of memory
- *             @size_t sz@ = new size desired for the block
- *             @size_t osz@ = size of the old block
+ *             @size_t n@ = new number of elements (for @xreallocv@)
+ *             @size_t on@ = old  number of elements (for @xreallocv@)
+ *             @size_t sz@ = size of elements (for @xreallocv@) or new
+ *                     block size (for @xrealloc@)
+ *             @size_t osz@ = size of the old block (for @xrealloc@)
  *
  * Returns:    Pointer to the resized memory block (which is almost
  *             certainly not in the same place any more).
  *
  * Use:                Resizes a memory block.  If there's not enough memory, the
  *             exception @EXC_NOMEM@ is thrown.
+ *
+ *             The @xreallocv@ function adjusts a block which currently has
+ *             space for @on@ elements each of size @sz@, so that it now has
+ *             enough space for @n@ elements, preserving the initial @min(n,
+ *             on)@ elements.  The @xrealloc@ function is the same, but
+ *             with @sz@ fixed equal to 1, and @n@ and @on@ renamed to @sz@
+ *             and @osz@ for historical reasons.
  */
 
 extern void *xrealloc(void */*p*/, size_t /*sz*/, size_t /*osz*/);
+extern void *xreallocv(void */*p*/,
+                      size_t /*n*/, size_t /*on*/, size_t /*sz*/);
 #define xrealloc(p, sz, osz) x_realloc(arena_global, (p), (sz), (osz))
+#define xreallocv(p, sz, osz, n) x_reallocv(arena_global,              \
+                                           (p), (sz), (osz), (n))
+
+/* --- @XRENEWV@ --- *
+ *
+ * Arguments:  @type *p@ = a pointer to allocate
+ *             @size_t n, on@ = new and existing numbers of elements
+ *
+ * Returns:    ---
+ *
+ * Use:                Adjust @p@ to point to a new block of memory with space for
+ *             @n@ elements of the type pointed to by @p@, on the assumption
+ *             that @p@ is either null or currently points to a block with
+ *             space for @on@ elements.
+ */
+
+#define XRENEWV(p, n, on) X_RENEWV((p), arena_global, (n), (on))
 
 /* --- @xfree@ --- *
  *
index 11aa30832bd2ba261146257081322e7d017bfdee..09207fa6d7a8f7b708763e045d53d749081f5f99 100644 (file)
 .TH arena 3mLib "3 June 2000" "Straylight/Edgeware" "mLib utilities library"
 .\" @arena_global
 .\" @arena_stdlib
+.
 .\" @arena_fakemalloc
-.\" @a_alloc
-.\" @a_realloc
-.\" @a_free
+.
+.\" @ALLOCV_SAFE_P
+.\" @NEWV_SAFE_P
+.
 .\" @A_ALLOC
+.\" @A_ALLOCV
+.\" @A_NEW
+.\" @A_NEWV
 .\" @A_REALLOC
+.\" @A_RENEWV
 .\" @A_FREE
 .
+.\" @a_alloc
+.\" @a_allocv
+.\" @a_realloc
+.\" @a_reallocv
+.\" @a_free
+.
 .\"--------------------------------------------------------------------------
 .SH "NAME"
 arena \- control of memory allocation
@@ -68,12 +80,28 @@ arena \- control of memory allocation
 .BI "void *arena_fakerealloc(arena *" a ", void *" p ,
 .BI "  size_t " sz ", size_t " osz );
 .PP
+.BI "int ALLOCV_SAFE_P(size_t " n ", size_t " sz );
+.BI "int NEWV_SAFE_P(" type " *" p ", size_t " n );
+.PP
 .BI "void *a_alloc(arena *" a ", size_t " sz );
+.BI "void *a_allocv(arena *" a ", size_t " n ", size_t " sz );
 .BI "void *a_realloc(arena *" a ", void *" p ", size_t " sz ", size_t " osz );
+.ta \w'\fBvoid a_reallocv('u
+.BI "void *a_reallocv(arena *" a ", void *" p ,
+.BI "  size_t " n ", size_t " on ", size_t " sz );
 .BI "void a_free(arena *" a );
 .PP
 .BI "void *A_ALLOC(arena *" a ", size_t " sz );
+.BI "void *A_ALLOCV(arena *" a ", size_t " n ", size_t " sz );
+.BI "void A_NEW(" type " *" p ", arena *" a );
+.BI "void A_NEWV(" type " *" p ", arena *" a ", size_t " n );
 .BI "void *A_REALLOC(arena *" a ", void *" p ", size_t " sz ", size_t " osz );
+.ta \w'\fBvoid A_REALLOCV('u
+.BI "void *A_REALLOCV(arena *" a ", void *" p ,
+.BI "  size_t " n ", size_t " on ", size_t " sz );
+.ta \w'\fBvoid A_RENEWV('u
+.BI "void A_RENEWV(" type " *" q ", " type " *" p ", arena *" a ,
+.BI "  size_t " n ", size_t " on ", size_t " sz );
 .BI "void A_FREE(arena *" a );
 .fi
 .
@@ -119,6 +147,68 @@ function has an extra argument
 specifying the old size of the block.  This is for the benefit of arena
 handlers which can't easily find the old block's size.
 .PP
+The macro
+.B ALLOCV_SAFE_P
+returns nonzero if the product
+.IR n "\ \(mu\ " sz
+is representable in type
+.B size_t
+and zero otherwise;
+i.e., it returns true if it would be safe to try to allocate
+.IR n "\ \(mu\ " sz
+bytes.
+The macro
+.BR A_ALLOCV
+allocates space for an array of
+.I n
+elements each of size
+.IR sz ,
+somewhat like
+.BR calloc (3),
+except that
+.B A_ALLOCV
+does not clear the allocated memory.
+Likewise, the macro
+.B A_REALLOCV
+resizes the block pointed to by
+.IR p ,
+which previously had space for
+.I on
+elements of size
+.IR sz ,
+so that it now has enough space for
+.I n
+elements,
+returning the new block address.
+There are also function-call equivalents of these macros.
+.PP
+Finally, the macro
+.B A_NEW
+sets its argument
+.I p
+to point to a freshly allocated block of memory
+large enough for the type that
+.I p
+points to,
+or to null if allocation failed.
+The macro
+.B A_NEWV
+sets
+.I p
+to point to memory large enough for
+.I n
+elements, each of the type that
+.I p
+points to.
+The macro
+.B A_RENEWV
+sets
+.I q
+to point to memory large enough for
+.I n
+elements, each of the type that
+.I p
+points to.
 .
 .SS "Defining new arenas"
 An
index 82f6cd6c1a20c994cabc4d37ebdd19de9e7fda7b..fad4fa9e4bc0eab6ad0c94597b42d01d83a27ac2 100644 (file)
@@ -58,6 +58,20 @@ extern arena arena_stdlib;           /* Arena based on @malloc@/@free@ */
 
 /*----- Functions provided ------------------------------------------------*/
 
+/* --- @ALLOCV_SAFE_P@, @NEWV_SAFE_P@ ---
+ *
+ * Arguments:  @type *p@ = pointer to a vector (for @NEWV_SAFE_P@; not
+ *                     evaluated)
+ *             @size_t n@ = number of elements
+ *             @size_t sz@ = element size (for @ALLOCV_SAFE_P@)
+ *
+ * Returns:    Nonzero if the product of @n@ and @sz@ (or @sizeof(*p)@) is
+ *             representable in type @size_t@.
+ */
+
+#define ALLOCV_SAFE_P(n, sz) ((n) <= (size_t)-1/(sz))
+#define NEWV_SAFE_P(p, n) (ALLOCV_SAFE_P((n), sizeof(*(p))))
+
 /* --- @arena_fakerealloc@ --- *
  *
  * Arguments:  @arena *a@ = pointer to arena block
@@ -77,14 +91,30 @@ extern void *arena_fakerealloc(arena */*a*/, void */*p*/,
 /* --- Useful macros --- */
 
 #define A_ALLOC(a, sz) (((a)->ops->alloc)((a), (sz)))
-#define A_REALLOC(a, p, sz, osz) (((a)->ops->realloc)((a), (p), (sz), (osz)))
+#define A_ALLOCV(a, n, sz)                                             \
+       (ALLOCV_SAFE_P((n), (sz)) ? ((a)->ops->alloc)((a), (n)*(sz)) : 0)
+#define A_NEW(p, a) do { (p) = A_ALLOC((a), sizeof(*(p))); } while (0)
+#define A_NEWV(p, a, n)                                                        \
+       do { (p) = A_ALLOCV((a), (n), sizeof(*(p))); } while (0)
+#define A_REALLOC(a, p, sz, osz)                                       \
+       (((a)->ops->realloc)((a), (p), (sz), (osz)))
+#define A_REALLOCV(a, p, n, on, sz)                                    \
+       (ALLOCV_SAFE_P((n), (sz)) ?                                     \
+               ((a)->ops->realloc)((a), (p), (n)*(sz), (on)*(sz)) : 0)
+#define A_RENEWV(q, p, a, n, on) do {                                  \
+       (q) = !sizeof((*(p)) = (*(q))) +                                \
+             A_REALLOCV((a), (p), (n), (on), sizeof(*(p)));            \
+} while (0)
 #define A_FREE(a, p) (((a)->ops->free)((a), (p)))
 
 /* --- Simple function equivalents --- */
 
 extern void *a_alloc(arena */*a*/, size_t /*sz*/);
+extern void *a_allocv(arena */*a*/, size_t /*n*/, size_t /*sz*/);
 extern void *a_realloc(arena */*a*/, void */*p*/,
                       size_t /*sz*/, size_t /*osz*/);
+extern void *a_reallocv(arena */*a*/, void */*p*/,
+                       size_t /*n*/, size_t /*on*/, size_t /*sz*/);
 extern void a_free(arena */*a*/, void */*p*/);
 
 /*----- That's all, folks -------------------------------------------------*/
index bd3904ac5874b06766c82cccbb8f1808c41c00a4..401bc86f7e2c9b58202cd2897b7873a281a8d0a7 100644 (file)
@@ -32,6 +32,8 @@
 .\" @GROWBUF_SIZE
 .\" @GROWBUF_EXTEND
 .\" @GROWBUF_REPLACE
+.\" @GROWBUF_RENEWV
+.\" @GROWBUF_REPLACEV
 .
 .\"--------------------------------------------------------------------------
 .SH NAME
@@ -43,15 +45,25 @@ growbuf \- extend buffers efficiently
 .nf
 .B "#include <mLib/growbuf.h>"
 .PP
-.BI "GROWBUF_SIZE(size_t " sz ", size_t " want ", " \c
-.BI "size_t " init ", size_t " granule ");"
+.ta \w'\fBvoid GROWBUF_SIZE('u
+.BI "void GROWBUF_SIZE(" type ", " type " &" sz ", " type " " want ,
+.BI "  " type " " init ", " type " " granule ");"
 .PP
-.ds mT \fBGROWBUF_EXTEND(
-.BI "\*(mTarena *" a ", " type " *" buf ", size_t " sz ", size_t " want ","
-.BI "\h'\w'\*(mT'u'size_t " init ", size_t " granule ");"
-.ds mT \fBGROWBUF_REPLACE(
-.BI "\*(mTarena *" a ", " type " *" buf ", size_t " sz ", size_t " want ","
-.BI "\h'\w'\*(mT'u'size_t " init ", size_t " granule ");"
+.ta \w'\fBvoid GROWBUF_EXTEND('u
+.BI "\fBvoid GROWBUF_EXTEND(" type ", arena *" a ", " type " *&" buf ,
+.BI "  " type " &" sz ", " type " " want ,
+.BI "  " type " " init ", " type " " granule ");"
+.ta \w'\fBvoid GROWBUF_REPLACE('u
+.BI "\fBvoid GROWBUF_REPLACE(" type ", arena *" a ", " type " *&" buf ,
+.BI "  " type " &" sz ", " type " " want ,
+.BI "  " type " " init ", " type " " granule ");"
+.PP
+.ta \w'\fBvoid GROWBUF_RENEWV('u
+.BI "\fBvoid GROWBUF_RENEWV(" type ", arena *" a ", " type " *&" buf ,
+.BI "  " type " &" sz ", " type " " want ", " type " " init ");"
+.ta \w'\fBvoid GROWBUF_REPLACEV('u
+.BI "\fBvoid GROWBUF_REPLACEV(" type ", arena *" a ", " type " *&" buf ,
+.BI "  " type " &" sz ", " type " " want ", " type " " init ");"
 .fi
 .
 .\"--------------------------------------------------------------------------
@@ -123,6 +135,19 @@ The
 macro is similar, except that it
 .I discards
 the existing buffer contents if the buffer needs to be adjusted.
+.PP
+The
+.B GROWBUF_RENEWV
+macro is the same as
+.B GROWBUF_EXTEND
+except that it implicitly uses
+.BI "sizeof(*" buf )
+as its
+.IR granule ;
+the
+.B GROWBUF_REPLACEV
+macro is similarly like
+.BR GROWBUF_REPLACE .
 .
 .\"--------------------------------------------------------------------------
 .SH "SEE ALSO"
index ec78bcda1136afa0bd7a7d4485ef1371a30fc06f..f829f91e8fd28107267014cde0bfdf4cd7dc0d5c 100644 (file)
 
 /*----- Macros provided ---------------------------------------------------*/
 
-/* --- @GROWBUF_LIMIT@ --- *
+/* --- @GROWBUF__LIMIT@ --- *
  *
- * Arguments:  @size_t granule@ = allocation granule
+ * Arguments:  @szty@ = an unsigned type
+ *             @size_t granule@ = allocation granule
  *
- * Returns:    The largest number %$n$% such that the total size of %$n$%
+ * Returns:    The largest number %$n$% such that %$n$% is representable in
+ *             a value of the given @szty@ and the total size of %$n$%
  *             objects, each of size @granule@, can be represented in a
- *             @size_t@.
+ *             value of type @size_t@.
  */
 
-#define GROWBUF_LIMIT(granule) (~(size_t)0/(granule))
+#define GROWBUF__LIMIT(szty, granule)                                  \
+       (~(szty)0 < ~(size_t)0/(granule) ?                              \
+        ~(szty)0 : ~(size_t)0/(granule))
 
 /* --- @GROWBUF_SIZE@ --- *
  *
- * Arguments:  @size_t sz@ = the current size (updated)
- *             @size_t want@ = the desired minimum size
- *             @size_t init@ = a suitable initial size
- *             @size_t granule@ = the allocation granule size
+ * Arguments:  @szty@ = an unsigned type
+ *             @szty sz@ = the current size (updated)
+ *             @szty want@ = the desired minimum size
+ *             @szty init@ = a suitable initial size
+ *             @szty granule@ = the allocation granule size
  *
  * Returns:    ---
  *
  *             positive size at least as large as @want@.
  */
 
-#define GROWBUF_SIZE(sz, want, init, granule) do {                     \
-  size_t _sz_ = (sz), _want_ = (want);                                 \
+#define GROWBUF_SIZE(szty, sz, want, init, granule) do {               \
+  szty _sz_ = (sz), _want_ = (want);                                   \
                                                                        \
-  assert(_want_ < GROWBUF_LIMIT(granule)/2);                           \
+  assert(_want_ < GROWBUF__LIMIT(szty, granule)/2);                    \
   if (!_sz_) _sz_ = (init);                                            \
   while (_sz_ < _want_) _sz_ *= 2;                                     \
   (sz) = _sz_;                                                         \
 
 /* --- @GROWBUF_EXTEND@, @GROWBUF_REPLACE@ --- *
  *
- * Arguments:  @arena *a@ = pointer to an arena
+ * Arguments:  @szty@ = an unsigned type
+ *             @arena *a@ = pointer to an arena
  *             @type *buf@ = pointer to some buffer, possibly null (updated)
- *             @size_t sz@ = current buffer size (updated)
- *             @size_t want@ = desired minimum size
- *             @size_t init@ = a suitable initial size
+ *             @szty sz@ = current buffer size (updated)
+ *             @szty want@ = desired minimum size
+ *             @szty init@ = a suitable initial size
  *             @size_t granule@ = the allocation granule size
  *
  * Returns:    ---
  *             @GROWBUF_REPLACE@ discards the existing contents.
  */
 
-#define GROWBUF_EXTEND(a, buf, sz, want, init, granule) do {           \
-  size_t _sz0 = (sz), _sz = _sz0, _want = (want), _gr = (granule);     \
+#define GROWBUF_EXTEND(szty, a, buf, sz, want, init, granule) do {     \
+  szty _sz0 = (sz), _sz = _sz0, _want = (want);                                \
+  size_t _gr = (granule);                                              \
   void *_p = (buf);                                                    \
   arena *_a = (a);                                                     \
                                                                        \
   if (_sz < _want) {                                                   \
-    GROWBUF_SIZE(_sz, _want, init, _gr);                               \
+    GROWBUF_SIZE(szty, _sz, _want, init, _gr);                         \
     if (!_p) _p = x_alloc(_a, _sz*_gr);                                        \
     else _p = x_realloc(_a, _p, _sz*_gr, _sz0*_gr);                    \
     (buf) = _p; (sz) = _sz;                                            \
   }                                                                    \
 } while (0)
 
-#define GROWBUF_REPLACE(a, buf, sz, want, init, granule) do {          \
-  size_t _sz0 = (sz), _sz = _sz0, _want = (want), _gr = (granule);     \
+#define GROWBUF_REPLACE(szty, a, buf, sz, want, init, granule) do {    \
+  szty _sz0 = (sz), _sz = _sz0, _want = (want);                                \
+  size_t _gr = (granule);                                              \
   void *_p = (buf);                                                    \
   arena *_a = (a);                                                     \
                                                                        \
   if (_sz < _want) {                                                   \
-    GROWBUF_SIZE(_sz, want, init, _gr);                                        \
+    GROWBUF_SIZE(szty, _sz, want, init, _gr);                          \
     if (_p) x_free(_a, _p);                                            \
     _p = x_alloc(_a, _sz*_gr);                                         \
     (buf) = _p; (sz) = _sz;                                            \
   }                                                                    \
 } while (0)
 
+/* --- @GROWBUF_RENEWV@, @GROWBUF_REPLACEV@ --- *
+ *
+ * Arguments:  @szty@ = an unsigned type
+ *             @arena *a@ = pointer to an arena
+ *             @type *buf@ = pointer to some buffer, possibly null (updated)
+ *             @szty sz@ = current buffer size (updated)
+ *             @szty want@ = desired minimum size
+ *             @szty init@ = a suitable initial size
+ *
+ * Returns:    ---
+ *
+ * Use:                These are the same as @GROWBUF_EXTEND@ and @GROWBUF_REPLACE@,
+ *             except that the @granule@ is implicitly taken as
+ *             @sizeof(*buf)@.
+ *
+ *             @GROWBUF_RENEWV@ preserves the contents of the buffer;
+ *             @GROWBUF_REPLACEV@ discards the existing contents.
+ */
+
+#define GROWBUF_RENEWV(szty, a, buf, sz, want, init)                   \
+  GROWBUF_EXTEND(szty, a, buf, sz, want, init, sizeof(*buf))
+
+#define GROWBUF_REPLACEV(szty, a, buf, sz, want, init)                 \
+  GROWBUF_REPLACE(szty, a, buf, sz, want, init, sizeof(*buf))
+
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus
index 4260ad01932d18fa7d0718c11dc886625e02db50..d90e5a57c0a4eb1246f4e354d5982d0cc6a49e21 100644 (file)
@@ -31,7 +31,6 @@
 .TH pool 3mLib "7 July 2000" "Straylight/Edgeware" "mLib utilities library"
 .\" @pool_alloc
 .\" @pool_strdup
-.\" @pool_init
 .\" @pool_create
 .\" @pool_destroy
 .\" @pool_sub
@@ -64,7 +63,6 @@ pool \- resource pool management
 .B "   ..."
 .B "} pool_file;"
 .PP
-.BI "void pool_init(pool *" p ", arena *" a );
 .BI "pool *pool_create(arena *" a );
 .BI "pool *pool_sub(pool *" p );
 .BI "void pool_destroy(pool *" p );
@@ -119,11 +117,6 @@ of avoiding memory leaks.
 A new root pool is created using
 .BR pool_create ,
 passing it an arena from which it can allocate large memory blocks.
-Alternatively, you can allocate a
-.B pool
-structure from somewhere and initialize it by passing its address and an
-arena to
-.BR pool_init .
 .PP
 A subpool is created by calling
 .BR pool_sub ,
@@ -134,10 +127,7 @@ Pools are destroyed by passing them to
 Pools created by
 .B pool_create
 are completely destroyed, since the memory containing the pool structure
-is allocated from the pool itself.  Subpools and pools allocated by the
-caller and initialized by
-.BR pool_init ,
-on the other hand, are
+is allocated from the pool itself.  Subpools, on the other hand, are
 allocated from a parent pool, and may be reused after being `destroyed'.
 .
 .SS "Memory allocation"
index 69e852d6b264d7e88dd9b61627d40fc7e652514a..8d124d47e3d224b2c22a141e56c50bf7b16b3fcd 100644 (file)
 
 /*----- Header files ------------------------------------------------------*/
 
+#include "config.h"
+
 #include <string.h>
 
+#ifdef HAVE_VALGRIND_VALGRIND_H
+#  include <valgrind/valgrind.h>
+#  include <valgrind/memcheck.h>
+#  define VG(x) x
+#else
+#  define VG(x)
+#endif
+
 #include "align.h"
 #include "alloc.h"
 #include "arena.h"
 #include "pool.h"
 
+/*----- Constants ---------------------------------------------------------*/
+
+#define REDZONE_SIZE (2*ALIGNOF(union align))
+
 /*----- Main code ---------------------------------------------------------*/
 
 /* --- @doalloc@ --- *
@@ -41,6 +55,7 @@
  * Arguments:  @arena *a@ = pointer to arena to allocate memory from
  *             @pool_chunk **cc@ = pointer to chunk list
  *             @size_t sz@ = size of memory wanted
+ *             @unsigned f@ = flags (@PF_...@)
  *
  * Returns:    Pointer to the allocated block.
  *
  *             during pool creation, hence the slightly bizarre interface.
  */
 
-static void *doalloc(arena *a, pool_chunk **cc, size_t sz)
+static void *doalloc(arena *a, pool_chunk **cc, size_t sz, unsigned f)
 {
   pool_chunk *c;
   void *p;
   size_t csz, ssz;
+  size_t redsz = VG( f&PF_VALGRIND ? REDZONE_SIZE : ) 0;
+  VG( size_t sz0 = sz; )
 
   /* --- See if there's enough space --- *
    *
@@ -60,12 +77,11 @@ static void *doalloc(arena *a, pool_chunk **cc, size_t sz)
    * in the first chunk there isn't enough space anywhere.
    */
 
-  ALIGN(sz);
+  ALIGN(sz); sz += redsz;
   c = *cc;
   if (c && c->left >= sz) {
-    p = c->p;
-    c->p += sz;
-    c->left -= sz;
+    p = c->p; VG( if (f&PF_VALGRIND) VALGRIND_MEMPOOL_ALLOC(c, p, sz0); )
+    c->p += sz; c->left -= sz;
     *cc = c->next;
   }
 
@@ -77,19 +93,21 @@ static void *doalloc(arena *a, pool_chunk **cc, size_t sz)
   else {
     ssz = sizeof(pool_chunk);
     ALIGN(ssz);
-    csz = (ssz + sz + POOL_CHUNKSZ - 1); csz -= csz % POOL_CHUNKSZ;
+    csz = (ssz + redsz + sz + POOL_CHUNKSZ - 1); csz -= csz % POOL_CHUNKSZ;
     c = x_alloc(a, csz);
-    p = (char *)c + ssz;
-    c->p = (char *)p + sz;
-    c->left = csz - ssz - sz;
+    p = (unsigned char *)c + ssz + redsz;
+    VG( if (f&PF_VALGRIND) {
+         VALGRIND_CREATE_MEMPOOL(c, REDZONE_SIZE, 0);
+         VALGRIND_MEMPOOL_ALLOC(c, p, sz0);
+       } )
+    c->p = (unsigned char *)p + sz;
+    c->left = csz - ssz - redsz - sz;
   }
 
   /* --- Move this chunk in the list so that it's sorted --- */
 
-  while (*cc && (*cc)->left > c->left)
-    cc = &(*cc)->next;
-  c->next = *cc;
-  *cc = c;
+  while (*cc && (*cc)->left > c->left) cc = &(*cc)->next;
+  c->next = *cc; *cc = c;
 
   /* --- Done --- */
 
@@ -108,9 +126,7 @@ static void *doalloc(arena *a, pool_chunk **cc, size_t sz)
  */
 
 void *pool_alloc(pool *p, size_t sz)
-{
-  return (doalloc(p->pa, &p->c, sz));
-}
+  { return (doalloc(p->pa, &p->c, sz, p->f)); }
 
 /* --- @pool_strdup@ --- *
  *
@@ -125,7 +141,8 @@ void *pool_alloc(pool *p, size_t sz)
 char *pool_strdup(pool *p, const char *s)
 {
   size_t sz = strlen(s) + 1;
-  char *pp = doalloc(p->pa, &p->c, sz);
+  char *pp = doalloc(p->pa, &p->c, sz, p->f);
+
   memcpy(pp, s, sz);
   return (pp);
 }
@@ -135,32 +152,14 @@ char *pool_strdup(pool *p, const char *s)
 static void *palloc(arena *a, size_t sz)
 {
   pool *p = (pool *)a;
-  return (doalloc(p->pa, &p->c, sz));
+
+  return (doalloc(p->pa, &p->c, sz, p->f));
 }
 
 static void pfree(arena *a, void *p) { return; } /* Trivial */
 
 static arena_ops pool_ops = { palloc, arena_fakerealloc, pfree, 0 };
 
-/* --- @pool_init@ --- *
- *
- * Arguments:  @pool *p@ = pointer to the pool structure to initialize
- *             @arena *a@ = pointer to an arena to allocate memory from
- *
- * Returns:    ---
- *
- * Use:                Initializes a chunk of memory as a resource pool which is not
- *             a child of any other resource pool.
- */
-
-void pool_init(pool *p, arena *a)
-{
-  p->a.ops = &pool_ops;
-  p->c = 0;
-  p->r = 0;
-  p->pa = a;
-}
-
 /* --- @pool_create@ --- *
  *
  * Arguments:  @arena *a@ = pointer to an arena to allocate memory from
@@ -174,9 +173,13 @@ void pool_init(pool *p, arena *a)
 pool *pool_create(arena *a)
 {
   pool_chunk *c = 0;
-  pool *p = doalloc(a, &c, sizeof(pool));
-  pool_init(p, a);
-  p->c = c;
+  pool *p;
+  unsigned f = 0;
+
+  VG( if (RUNNING_ON_VALGRIND) f |= PF_VALGRIND; )
+  p = doalloc(a, &c, sizeof(pool), f);
+  p->c = c; p->r = 0; p->pa = a; p->f = f;
+  p->a.ops = &pool_ops;
   return (p);
 }
 
@@ -216,11 +219,10 @@ void pool_destroy(pool *p)
    * the pool block itself will be left around.
    */
 
-  a = p->pa;
-  c = p->c;
-  p->c = 0;
+  a = p->pa; c = p->c; p->c = 0;
   while (c) {
     cc = c->next;
+    VG( if (p->f&PF_VALGRIND) VALGRIND_DESTROY_MEMPOOL(c); )
     x_free(a, c);
     c = cc;
   }
index 5a843ab582e9415678a16ad24761ac898242dc8b..e401be3d82dba2cddc6fab9f8ed5aa6a69b55f66 100644 (file)
@@ -50,7 +50,7 @@
 
 typedef struct pool_chunk {
   struct pool_chunk *next;             /* Next memory chunk in the chain */
-  char *p;                             /* Free area in this chunk */
+  unsigned char *p;                    /* Free area in this chunk */
   size_t left;                         /* Amount of memory left */
 } pool_chunk;
 
@@ -64,6 +64,8 @@ typedef struct pool {
   pool_chunk *c;                       /* Pointer to memory chunk list */
   pool_resource *r;                    /* Pointer to resource list */
   arena *pa;                           /* Arena for real allocation */
+  unsigned f;                          /* Flags */
+#define PF_VALGRIND 1u                 /*   Special valgrind hacks active */
 } pool;
 
 typedef struct pool_file {
index 1abfeddcdfeebe1aa64804270b670540a5b98ae3..185be3af3a3b463f10df1e973015d85563e302c9 100644 (file)
--- a/mem/sub.c
+++ b/mem/sub.c
@@ -56,6 +56,8 @@
 
 /*----- Header files ------------------------------------------------------*/
 
+#include "config.h"
+
 /* --- ANSI headers --- */
 
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 
+/* --- External headers --- */
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+#  include <valgrind/valgrind.h>
+#  include <valgrind/memcheck.h>
+#  define VG(x) x
+#else
+#  define VG(x)
+#endif
+
 /* --- Local headers --- */
 
 #include "arena.h"
 
 /* #define SUBARENA_TRIVIAL */
 
+#define REDZONE_SIZE (2*SUB_GRANULE)
+
 /*----- Static variables --------------------------------------------------*/
 
 static size_t sizes[SUB_BINS];
+VG( static unsigned flags; )
+#define SF_VALGRIND 1u
 
 /*----- Global variables --------------------------------------------------*/
 
@@ -89,6 +105,13 @@ typedef struct sub_link {
   size_t sz;
 } sub_link;
 
+#else
+
+union sub_header {
+  void *next;
+  union align _a;
+};
+
 #endif
 
 /*----- Main code ---------------------------------------------------------*/
@@ -110,10 +133,10 @@ void subarena_create(subarena *s, arena *a)
   s->bin[0] = 0;
 #else
   size_t i;
-  if (!sizes[1])
-    sub_init();
-  for (i = 0; i < SUB_BINS; i++)
-    s->bin[i] = 0;
+
+  if (!sizes[1]) sub_init();
+  for (i = 0; i < SUB_BINS; i++) s->bin[i] = 0;
+  VG( VALGRIND_CREATE_MEMPOOL(s, REDZONE_SIZE, 0); )
 #endif
   s->a = a;
 }
@@ -143,16 +166,10 @@ void subarena_destroy(subarena *s)
 
 #else
 
-  size_t i;
-  for (i = 0; i < SUB_BINS; i++) {
-    void *p = s->bin[i];
-    while (p) {
-      void *q = p;
-      p = *(void **)q;
-      A_FREE(s->a, q);
-    }
-    s->bin[i] = 0;
-  }
+  union sub_header *p, *q;
+
+  for (p = s->bin[0]; p; p = q) { q = p->next; A_FREE(s->a, p); }
+  VG( VALGRIND_DESTROY_MEMPOOL(s); )
 
 #endif
 }
@@ -176,67 +193,53 @@ void *subarena_alloc(subarena *s, size_t sz)
   sub_link *l;
   void *p;
 
-  if (!s->a)
-    subarena_create(s, arena_global);
+  if (!s->a) subarena_create(s, arena_global);
 
-  if ((l = a_alloc(s->a, sizeof(*l))) == 0)
-    return (0);
-  if ((p = a_alloc(s->a, sz)) == 0) {
-    a_free(s->a, l);
-    return (0);
-  }
-  l->p = p;
-  l->sz = sz;
-  l->next = s->bin[0];
-  s->bin[0] = l;
+  if ((l = a_alloc(s->a, sizeof(*l))) == 0) return (0);
+  if ((p = a_alloc(s->a, sz)) == 0) { a_free(s->a, l); return (0); }
+  l->p = p; l->sz = sz; l->next = s->bin[0]; s->bin[0] = l;
   return (p);
 
 #else
 
-  int bin;
-  void *p;
+  unsigned char *p, *q;
+  union sub_header *h;
+  size_t bin, chsz, redsz;
 
   /* --- Ensure that everything is initialized --- */
 
-  if (!s->a)
-    subarena_create(s, arena_global);
+  if (!s->a) subarena_create(s, arena_global);
 
   /* --- Handle oversize blocks --- */
 
   bin = SUB_BIN(sz);
   if (bin >= SUB_BINS) {
-    void *p = A_ALLOC(s->a, sz);
-    if (!p)
-      THROW(EXC_NOMEM);
+    p = A_ALLOC(s->a, sz); if (!p) THROW(EXC_NOMEM);
     return (p);
   }
 
   /* --- If the bin is empty, find some memory --- */
 
   if (!s->bin[bin]) {
-    char *p, *q;
-
-    p = A_ALLOC(s->a, sizes[bin]);
-    if (!p)
-      THROW(EXC_NOMEM);
-    q = p + sizes[bin];
-
-    sz = SUB_BINSZ(bin);
-
-    q -= sz;
-    *(void **)q = 0;
-
-    while (q > p) {
-      q -= sz;
-      *(void **)q = q + sz;
-    }
-
-    s->bin[bin] = p;
+    redsz = 0; VG( if (flags&SF_VALGRIND) redsz = REDZONE_SIZE; )
+    chsz = SUB_BINSZ(bin) + redsz;
+    h = A_ALLOC(s->a, sizes[bin]); if (!h) THROW(EXC_NOMEM);
+    h->next = s->bin[0]; s->bin[0] = h;
+    p = (unsigned char *)(h + 1);
+    q = (unsigned char *)h + sizes[bin] - redsz - chsz; *(void **)q = 0;
+    while (q > p) { q -= chsz; *(void **)q = q + chsz; }
+    s->bin[bin] = q;
+    VG( VALGRIND_MAKE_MEM_NOACCESS(p, sizes[bin]); )
   }
 
   /* --- Extract the first block in the list --- */
 
   p = s->bin[bin];
+  VG( if (flags&SF_VALGRIND) {
+       VALGRIND_MAKE_MEM_DEFINED(p, sizeof(void *));
+       s->bin[bin] = *(void **)p;
+       VALGRIND_MEMPOOL_ALLOC(s, p, sz);
+      } else )
   s->bin[bin] = *(void **)p;
   return (p);
 
@@ -260,25 +263,20 @@ void subarena_free(subarena *s, void *p, size_t sz)
 
   sub_link *lh = s->bin[0], **l, *ll;
 
-  for (l = &lh; *l && (*l)->p != p; l = &(*l)->next)
-    ;
-  ll = *l;
-  assert(ll);
-  assert(ll->sz == sz);
+  for (l = &lh; *l && (*l)->p != p; l = &(*l)->next) ;
+  ll = *l; assert(ll); assert(ll->sz == sz);
   *l = ll->next;
-  a_free(s->a, ll);
-  a_free(s->a, p);
-  s->bin[0] = lh;
+  a_free(s->a, ll); a_free(s->a, p); s->bin[0] = lh;
 
 #else
 
-  int bin = SUB_BIN(sz);
+  size_t bin = SUB_BIN(sz);
 
   if (bin >= SUB_BINS)
     A_FREE(s->a, p);
   else {
-    *(void **)p = s->bin[bin];
-    s->bin[bin] = p;
+    *(void **)p = s->bin[bin]; s->bin[bin] = p;
+    VG( if (flags&SF_VALGRIND) VALGRIND_MEMPOOL_FREE(s, p); )
   }
 
 #endif
@@ -321,13 +319,21 @@ void (sub_free)(void *p, size_t sz) { sub_free(p, sz); }
 void sub_init(void)
 {
 #ifndef SUBARENA_TRIVIAL
+  size_t n, sz;
   int i;
 
+  /* Find out if we're running under Valgrind --- */
+
+  VG( if (RUNNING_ON_VALGRIND) flags |= SF_VALGRIND; )
+
   /* --- Initialize the sizes bins --- */
 
   for (i = 1; i < SUB_BINS; i++) {
-    sizes[i] = ((SUB_CHUNK + SUB_BINSZ(i) - 1) /
-                    SUB_BINSZ(i) * SUB_BINSZ(i));
+    sz = SUB_BINSZ(i);
+    n = (SUB_CHUNK + sz - 1)/sz;
+    sz = sizeof(union sub_header) + n*sz;
+    VG( if (flags&SF_VALGRIND) sz += (n + 1)*REDZONE_SIZE; )
+    sizes[i] = sz;
   }
 #endif
 }
index b48e835a8d972e53f4565aaa276cff5805c18d3d..1dddd194b1f10217e0d9856b96d889f320697421 100644 (file)
--- a/mem/sub.h
+++ b/mem/sub.h
@@ -68,7 +68,7 @@
  * All blocks allocated by the binner are a multiple of this size.
  */
 
-#define SUB_GRANULE sizeof(union align)
+#define SUB_GRANULE (ALIGNOF(union align))
 
 /* --- Finding the right bin for a given size --- *
  *
  * block wanted; result is the bin index.
  */
 
-#define SUB_BIN(x) (((x) + SUB_GRANULE - 1) / SUB_GRANULE)
+#define SUB_BIN(x) (((x) + SUB_GRANULE - 1)/SUB_GRANULE)
 
 /* --- Convert a bin back to the block size --- *
  *
  * This gives the size of block contained in a given bin.
  */
 
-#define SUB_BINSZ(x) ((x) * SUB_GRANULE)
+#define SUB_BINSZ(x) ((x)*SUB_GRANULE)
 
 /* --- Number of bins required --- */
 
-#define SUB_BINS (SUB_MAXBIN / SUB_GRANULE + 1)
+#define SUB_BINS (SUB_MAXBIN/SUB_GRANULE + 1)
 
 /*----- Data structures ---------------------------------------------------*/
 
index 1f61c02ee53367a8e7e61366b67cc936e39680b7..5b5b625c777a197e79c10bf89b3143c2b42ff7d9 100644 (file)
 
 #include "bits.h"
 #include "buf.h"
-#include "maths.h"
+#include "fltfmt.h"
 
-/*----- Formatting primitives ---------------------------------------------*/
-
-/* We use the IEEE 754 `binary64' format.  Briefly:
- *
- *   * The top bit is the sign %$s$%: 0 encodes %$s = +1$%, and 1 encodes
- *     %$s = -1$%..  The format is signed-magnitude, so everything else is
- *     the same for positive and negative numbers.
- *
- *   * The next eleven bits are the biased exponent %$e$%.
- *
- *   * The remaining 52 bits are the significand %$m$%.
- *
- * If %$0 < e < 2047$% then the encoding represents the normal number
- * %$s \cdot (1 + m/2^{52}) \cdot 2^{e-1023}$%.
- *
- * If %$e = 0$% and %$m = 0$% then the encoding represents positive or
- * negative zero.
- *
- * If %$e = 0$% and %$m \ne 0$% then the encoding represents a subnormal
- * number %$s \cdot m/2^{52} \cdot 2^{-1022}$%.
- *
- * If %$e = 2047$% and %$m = 0$% then the encoding represents positive or
- * negative infinity.
- *
- * If %$e = 2047$% and %$m \ne 0$% then the encoding represents a NaN.  If
- * the most significant bit of %$m$% is set then this is a quiet NaN;
- * otherwise it's a signalling NaN.
- */
+/*----- External functions ------------------------------------------------*/
 
-/* --- @k64_to_f64@ --- *
+/* --- @buf_getf{32,64}{,l,b} --- *
  *
- * Arguments:  @double *x_out@ = where to put the result
- *             @kludge64 k@ = a 64-bit encoding of a floating-point value
+ * Arguments:  @buf *b@ = a buffer to read from
+ *             @float *x_out@, @double *x_out@ = where to put the result
  *
- * Returns:    Zero on success, @-1@ on failure.
+ * Returns:    Zero on success, %$-1$% on failure (and the buffer is
+ *             broken).
  *
- * Use:                Decodes @k@ as a `binary64' value.  See `buf_getf64' for the
- *             caveats.
+ * Use:                Get an IEEE Binary32 or Binary64 value from the buffer.
+ *             Conversion is performed using the `fltfmt' machinery, with
+ *             the usual round-to-nearest/ties-to-even rounding mode.
  */
 
-static int k64_to_f64(double *x_out, kludge64 k)
+int buf_getf32(buf *b, float *x_out)
 {
-  uint32 lo, hi, t;
-  int s, e; double x;
-
-  /* We're using the IEEE 754 `binary64' format: see `float_to_k64' above. */
-
-  /* Pick the encoded number apart. */
-  hi = HI64(k); lo = LO64(k);
-  s = (hi >> 31)&1; e = (hi >> 20)&0x07ff; t = hi&0x000fffff;
-
-  /* Deal with various special cases. */
-  if (e == 2047) {
-    /* Maximum exponent indicates (positive or negative) infinity or NaN. */
-
-    if (t || lo) {
-      /* It's a NaN.  We're not going to be picky about which one.  If we
-       * can't represent it then we'll just have to fail.
-       */
-
-#ifdef NAN
-      x = NAN;
-#else
-      return (-1);
-#endif
-    } else {
-      /* It's an infinity.  If we don't have one of those to hand, then pick
-       * something really big.
-       */
-
-#ifdef INFINITY
-    x = s ? -INFINITY : INFINITY;
-#else
-    x = s ? -DBL_MAX : DBL_MAX;
-#endif
-    }
-  } else {
-    /* It's a finite number, though maybe it's weird in some way. */
-
-    if (e == 0) {
-      /* Minimum exponent indicates zero or a subnormal number.  The
-       * subnormal exponent is a sentinel value that shouldn't be taken
-       * literally, so we should fix that.  If the number is actually zero
-       * then the exponent won't matter much so don't bother checking.
-       */
-
-      e = 1;
-    } else {
-      /* It's a normal number.  In which case there's an implicit bit which
-       * we can now set.
-       */
-
-      t |= 0x00100000;
-    }
-
-    /* All that remains is to stuff the significant and exponent into a
-     * floating point number.  We'll have to do this in pieces, and we'll
-     * lean on the floating-point machinery to do rounding correctly.
-     */
-    x = ldexp(t, e - 1043) + ldexp(lo, e - 1075);
-    if (s) x = -x;
-  }
-
-  /* And we're done. */
-  *x_out = x; return (0);
-}
+  const octet *p;
 
-/* --- @f64_to_k64@ --- *
- *
- * Arguments:  @double x@ = a floating-point number
- *
- * Returns:    A 64-bit encoding of @x@.
- *
- * Use:                Encodes @x@ as a `binary64' value.  See `buf_putf64' for the
- *             caveats.
- */
+  p = buf_get(b, 4); if (!p) return (-1);
+  fltfmt_f32btoflt(x_out, p, FLTRND_NEAREVEN); return (0);
+}
 
-static kludge64 f64_to_k64(double x)
+int buf_getf32l(buf *b, float *x_out)
 {
-  kludge64 k;
-  uint32 lo, hi, t;
-  int e; double m;
-
-  /* Some machinery before we start. */
-
-  if (NANP(x)) {
-    /* A NaN. */
-    hi = 0x7ff80000; lo = 0;
-  } else if (INFP(x)) {
-    /* Positive or negative infinity. */
-    hi = NEGP(x) ? 0xfff00000 : 0x7ff00000; lo = 0;
-  } else if (x == 0) {
-    /* Positive or negative zero. */
-    hi = NEGP(x) ? 0x80000000 : 0; lo = 0;
-  } else {
-    /* A normal or subnormal number.  Now we have to do some actual work. */
-
-    /* Let's get the sign dealt with so we don't have to worry about it any
-     * more.
-     */
-    if (!NEGP(x)) hi = 0;
-    else { x = -x; hi = 0x80000000; }
-
-    /* Now we start on the value.  The first thing to do is to split off the
-     * exponent.  Our number will be %$m \cdot 2^e$%, with %$1/2 \le m < 1$%.
-     */
-    m = frexp(x, &e);
-
-    /* If our number is too big, we'll round it to infinity.  This will
-     * happen if %$x \ge 2^{1024}$%, i.e., if %$e > 1024$%.
-     */
-    if (e > 1024)
-      { hi |= 0x7ff00000; lo = 0; }
-    else {
-      /* Our number is sufficiently small that we can represent it at least
-       * approximately (though maybe we'll have to flush it to zero).  The
-       * next step, then, is to pull the significand bits out.
-       */
-
-      /* Determine the correct exponent to store.  We're not going to bias it
-       * yet, but this is where we deal with subnormal numbers.  Our number
-       * is normal if %$x \ge 2^{-1022}$%, i.e., %$e > -1022$%.  In this
-       * case, there's an implicit bit which we'll clear.  Otherwise, if it's
-       * subnormal, we'll scale our floating-point number so that the
-       * significand will look right when we extract it, and adjust the
-       * exponent so that, when we're finally done, it will have the correct
-       * sentinel value.
-       */
-      if (e > -1022) m -= 0.5;
-      else { m = ldexp(m, 1021 + e); e = -1022; }
-
-      /* Now we pull out the 53 bits of the significand.   This will, in
-       * general, leave a tail which we address through rounding.  Scale it
-       * up so that we end up with %$0 \le m' < 2$%; then we round up if
-       * %$m > 1$%, or if %$m = 1$% and the low bit of the significand is
-       * set.
-       */
-      t = ldexp(m, 21); m -= ldexp(t, -21);
-      lo = ldexp(m, 53); m -= ldexp(lo, -53);
-      m = ldexp(m, 54);
-
-      /* Round the number if necessary. */
-      if (lo&1 ? m >= 1.0 : m > 1)
-       { lo = U32(lo + 1); if (!lo) t++; }
-
-      /* Now we just put the pieces together.  Note that our %$e$% is one
-       * greater than it should be, because our implicit bit should have
-       * been the unit bit not the 1/2 bit.
-       */
-      hi |= ((uint32)(e + 1022) << 20) | t;
-    }
-  }
-
-  /* Convert to external format and go home. */
-  SET64(k, hi, lo); return (k);
+  const octet *p;
+
+  p = buf_get(b, 4); if (!p) return (-1);
+  fltfmt_f32ltoflt(x_out, p, FLTRND_NEAREVEN); return (0);
 }
 
-/*----- External functions ------------------------------------------------*/
+int buf_getf32b(buf *b, float *x_out)
+{
+  const octet *p;
 
-/* --- @buf_getf64{,l,b} --- *
- *
- * Arguments:  @buf *b@ = a buffer to read from
- *             @double *x_out@ = where to put the result
- *
- * Returns:    Zero on success, @-1@ on failure (and the buffer is broken).
- *
- *             If the system supports NaNs, then any encoded NaN is returned
- *             as the value of @NAN@ in @<math.h>@; otherwise, this function
- *             reports failure.
- *
- *             In general, values are rounded to the nearest available
- *             value, in the way that the system usually rounds.  If the
- *             system doesn't support infinities, then any encoded infinity
- *             is reported as the largest-possible-magnitude finite value
- *             instead.
- */
+  p = buf_get(b, 4); if (!p) return (-1);
+  fltfmt_f32ltoflt(x_out, p, FLTRND_NEAREVEN); return (0);
+}
+
+int (dbuf_getf32)(dbuf *db, float *x_out)
+  { return (dbuf_getf32(db, x_out)); }
+int (dbuf_getf32l)(dbuf *db, float *x_out)
+  { return (dbuf_getf32l(db, x_out)); }
+int (dbuf_getf32b)(dbuf *db, float *x_out)
+  { return (dbuf_getf32b(db, x_out)); }
 
 int buf_getf64(buf *b, double *x_out)
 {
-  kludge64 k;
+  const octet *p;
 
-  if (buf_getk64(b, &k)) return (-1);
-  if (k64_to_f64(x_out, k)) { b->f |= BF_BROKEN; return (-1); }
-  return (0);
+  p = buf_get(b, 8); if (!p) return (-1);
+  fltfmt_f64btodbl(x_out, p, FLTRND_NEAREVEN); return (0);
 }
 
 int buf_getf64l(buf *b, double *x_out)
 {
-  kludge64 k;
+  const octet *p;
 
-  if (buf_getk64l(b, &k)) return (-1);
-  if (k64_to_f64(x_out, k)) { b->f |= BF_BROKEN; return (-1); }
-  return (0);
+  p = buf_get(b, 8); if (!p) return (-1);
+  fltfmt_f64ltodbl(x_out, p, FLTRND_NEAREVEN); return (0);
 }
 
 int buf_getf64b(buf *b, double *x_out)
 {
-  kludge64 k;
+  const octet *p;
 
-  if (buf_getk64b(b, &k)) return (-1);
-  if (k64_to_f64(x_out, k)) { b->f |= BF_BROKEN; return (-1); }
-  return (0);
+  p = buf_get(b, 8); if (!p) return (-1);
+  fltfmt_f64ltodbl(x_out, p, FLTRND_NEAREVEN); return (0);
 }
 
 int (dbuf_getf64)(dbuf *db, double *x_out)
@@ -285,31 +111,73 @@ int (dbuf_getf64l)(dbuf *db, double *x_out)
 int (dbuf_getf64b)(dbuf *db, double *x_out)
   { return (dbuf_getf64b(db, x_out)); }
 
-/* --- @buf_putf64{,l,b} --- *
+/* --- @buf_putf{32,64}{,l,b} --- *
  *
  * Arguments:  @buf *b@ = a buffer to write to
  *             @double x@ = a number to write
  *
- * Returns:    Zero on success, @-1@ on failure (and the buffer is broken).
- *
- *             On C89, this function can't detect negative zero so these
- *             will be silently written as positive zero.
+ * Returns:    Zero on success, %$-1$% on failure (and the buffer is
+ *             broken).
  *
- *             This function doesn't distinguish NaNs.  Any NaN is written
- *             as a quiet NaN with all payload bits zero.
- *
- *             A finite value with too large a magnitude to be represented
- *             is rounded to the appropriate infinity.  Other finite values
- *             are rounded as necessary, in the usual IEEE 754 round-to-
- *             nearest-or-even way.
+ * Use:                Get an IEEE Binary32 or Binary64 value from the buffer.
+ *             Conversion is performed using the `fltfmt' machinery, with
+ *             the usual round-to-nearest/ties-to-even rounding mode.
  */
 
+int buf_putf32(buf *b, float x)
+{
+  octet *p;
+
+  p = buf_get(b, 4); if (!p) return (-1);
+  fltfmt_flttof32b(p, x, FLTRND_NEAREVEN); return (0);
+}
+
+int buf_putf32l(buf *b, float x)
+{
+  octet *p;
+
+  p = buf_get(b, 4); if (!p) return (-1);
+  fltfmt_flttof32l(p, x, FLTRND_NEAREVEN); return (0);
+}
+
+int buf_putf32b(buf *b, float x)
+{
+  octet *p;
+
+  p = buf_get(b, 4); if (!p) return (-1);
+  fltfmt_flttof32b(p, x, FLTRND_NEAREVEN); return (0);
+}
+
+int (dbuf_putf32)(dbuf *db, float x)
+  { return (dbuf_putf32(db, x)); }
+int (dbuf_putf32l)(dbuf *db, float x)
+  { return (dbuf_putf32l(db, x)); }
+int (dbuf_putf32b)(dbuf *db, float x)
+  { return (dbuf_putf32b(db, x)); }
+
 int buf_putf64(buf *b, double x)
-  { return (buf_putk64(b, f64_to_k64(x))); }
+{
+  octet *p;
+
+  p = buf_get(b, 8); if (!p) return (-1);
+  fltfmt_dbltof64b(p, x, FLTRND_NEAREVEN); return (0);
+}
+
 int buf_putf64l(buf *b, double x)
-  { return (buf_putk64l(b, f64_to_k64(x))); }
+{
+  octet *p;
+
+  p = buf_get(b, 8); if (!p) return (-1);
+  fltfmt_dbltof64l(p, x, FLTRND_NEAREVEN); return (0);
+}
+
 int buf_putf64b(buf *b, double x)
-  { return (buf_putk64b(b, f64_to_k64(x))); }
+{
+  octet *p;
+
+  p = buf_get(b, 8); if (!p) return (-1);
+  fltfmt_dbltof64b(p, x, FLTRND_NEAREVEN); return (0);
+}
 
 int (dbuf_putf64)(dbuf *db, double x)
   { return (dbuf_putf64(db, x)); }
index 88934c9f23ce44ffaf2d25f04bc5d1298969dc81..67cc30e93977e0ad2d1548cfc9227fbf304699e2 100644 (file)
@@ -146,7 +146,7 @@ int buf_tryextend(buf *b, size_t sz)
 
   db = (dbuf *)b; len = DBLEN(db); want = sz + len;
   if (db->sz < want) {
-    GROWBUF_EXTEND(db->a, db->_b.base, db->sz, want, 64, 1);
+    GROWBUF_EXTEND(size_t, db->a, db->_b.base, db->sz, want, 64, 1);
     db->_b.p = db->_b.base + len;
   }
   db->_b.limit = db->_b.base + db->sz;
index 33dc6ff4df0c6c53ec4e8ac981d9d5169660a858..2cfffa9a7cf2e554b3bd1389ed5f80e83c03e921 100644 (file)
@@ -610,27 +610,26 @@ BUF_DOSUFFIXES(BUF_DECL_PUTSTR_)
 #define dbuf_putstr64b(db, p) (buf_putstr64b(DBUF_BUF(db), (p)))
 #define dbuf_putstrz(db, p) (buf_putstrz(DBUF_BUF(db), (p)))
 
-/* --- @{,d}buf_getf64{,l,b} --- *
+/* --- @buf_getf{32,64}{,l,b} --- *
  *
- * Arguments:  @buf *b@ = pointer to a buffer block
- *             @double *x_out@ = where to put the result
- *
- * Returns:    Zero on success, @-1@ on failure (and the buffer is broken).
+ * Arguments:  @buf *b@ = a buffer to read from
+ *             @float *x_out@, @double *x_out@ = where to put the result
  *
- *             If the system supports NaNs, then any encoded NaN is returned
- *             as the value of @NAN@ in @<math.h>@; otherwise, this function
- *             reports failure.
+ * Returns:    Zero on success, %$-1$% on failure (and the buffer is
+ *             broken).
  *
- *             In general, values are rounded to the nearest available
- *             value, in the way that the system usually rounds.  If the
- *             system doesn't support infinities, then any encoded infinity
- *             is reported as the largest-possible-magnitude finite value
- *             instead.
+ * Use:                Get an IEEE Binary32 or Binary64 value from the buffer.
+ *             Conversion is performed using the `fltfmt' machinery, with
+ *             the usual round-to-nearest/ties-to-even rounding mode.
  */
 
-extern int buf_getf64(buf */*b*/, double */*x_out*/);
-extern int buf_getf64l(buf */*b*/, double */*x_out*/);
-extern int buf_getf64b(buf */*b*/, double */*x_out*/);
+extern int buf_getf32(buf */*b*/, float */*x_out*/);
+extern int buf_getf32l(buf */*b*/, float */*x_out*/);
+extern int buf_getf32b(buf */*b*/, float */*x_out*/);
+#define dbuf_getf32(db, x_out) (buf_getf32(DBUF_BUF(db), (x_out)))
+#define dbuf_getf32l(db, x_out) (buf_getf32l(DBUF_BUF(db), (x_out)))
+#define dbuf_getf32b(db, x_out) (buf_getf32b(DBUF_BUF(db), (x_out)))
+
 extern int dbuf_getf64(dbuf */*db*/, double */*x_out*/);
 extern int dbuf_getf64l(dbuf */*db*/, double */*x_out*/);
 extern int dbuf_getf64b(dbuf */*db*/, double */*x_out*/);
@@ -638,28 +637,26 @@ extern int dbuf_getf64b(dbuf */*db*/, double */*x_out*/);
 #define dbuf_getf64l(db, x_out) (buf_getf64l(DBUF_BUF(db), (x_out)))
 #define dbuf_getf64b(db, x_out) (buf_getf64b(DBUF_BUF(db), (x_out)))
 
-/* --- @{,d}buf_putf64{,l,b} --- *
+/* --- @buf_putf{32,64}{,l,b} --- *
  *
- * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
+ * Arguments:  @buf *b@ = a buffer to write to
  *             @double x@ = a number to write
  *
- * Returns:    Zero on success, @-1@ on failure (and the buffer is broken).
+ * Returns:    Zero on success, %$-1$% on failure (and the buffer is
+ *             broken).
  *
- *             On C89, this function can't detect negative zero so these
- *             will be silently written as positive zero.
- *
- *             This function doesn't distinguish NaNs.  Any NaN is written
- *             as a quiet NaN with all payload bits zero.
- *
- *             A finite value with too large a magnitude to be represented
- *             is rounded to the appropriate infinity.  Other finite values
- *             are rounded as necessary, in the usual IEEE 754 round-to-
- *             nearest-or-even way.
+ * Use:                Get an IEEE Binary32 or Binary64 value from the buffer.
+ *             Conversion is performed using the `fltfmt' machinery, with
+ *             the usual round-to-nearest/ties-to-even rounding mode.
  */
 
-extern int buf_putf64(buf */*b*/, double /*x*/);
-extern int buf_putf64l(buf */*b*/, double /*x*/);
-extern int buf_putf64b(buf */*b*/, double /*x*/);
+extern int buf_putf32(buf */*b*/, float /*x*/);
+extern int buf_putf32l(buf */*b*/, float /*x*/);
+extern int buf_putf32b(buf */*b*/, float /*x*/);
+#define dbuf_putf32(db, x) (buf_putf32(DBUF_BUF(db), (x)))
+#define dbuf_putf32l(db, x) (buf_putf32l(DBUF_BUF(db), (x)))
+#define dbuf_putf32b(db, x) (buf_putf32b(DBUF_BUF(db), (x)))
+
 extern int dbuf_putf64(dbuf */*db*/, double /*x*/);
 extern int dbuf_putf64l(dbuf */*db*/, double /*x*/);
 extern int dbuf_putf64b(dbuf */*db*/, double /*x*/);
index 0b6c2238b663e5e2349525b804168e6a05f6404d..4ef01c5e22fa7276c7b7dbcec6d7d6ef6ccb52ba 100644 (file)
@@ -113,7 +113,7 @@ void *da_ensure(da_base *b, void *v, size_t sz, size_t n)
    */
 
   nsz = b->sz + b->off;
-  GROWBUF_SIZE(nsz, rq, DA_INITSZ, sz);
+  GROWBUF_SIZE(size_t, nsz, rq, DA_INITSZ, sz);
 
   /* --- Reallocate the block --- *
    *
@@ -221,7 +221,7 @@ void *da_shunt(da_base *b, void *v, size_t sz, size_t n)
    */
 
   nsz = b->sz + b->off;
-  GROWBUF_SIZE(nsz, rq, DA_INITSZ, sz);
+  GROWBUF_SIZE(size_t, nsz, rq, DA_INITSZ, sz);
 
   /* --- Reallocate the block --- *
    *
index eee34cca0fea984bb1e581db0251a9255703a85f..69c90f9c7328affdb6e7579f61dbda60ac2d7527 100644 (file)
@@ -92,7 +92,10 @@ void dstr_reset(dstr *d) { DRESET(d); }
  */
 
 void dstr_ensure(dstr *d, size_t sz)
-  { GROWBUF_EXTEND(d->a, d->buf, d->sz, d->len + sz, DSTR_INITSZ, 1); }
+{
+  GROWBUF_EXTEND(size_t, d->a, d->buf, d->sz, d->len + sz,
+                DSTR_INITSZ, 1);
+}
 
 /* --- @dstr_putc@ --- *
  *
index d4df9b7ce074882b2a1b45e5bcdf2496d210c174..de0ab2bcb09384c8216fe5052b315905a58431a5 100644 (file)
@@ -56,7 +56,7 @@ void hash_create(hash_table *t, size_t n)
   hash_base **v;
 
   t->a = arena_global;
-  t->v = x_alloc(t->a, n * sizeof(hash_base *));
+  X_NEWV(t->v, t->a, n);
   t->mask = n - 1;
   for (v = t->v; n; v++, n--)
     *v = 0;
index a727bbf38de65e0eea5b342382d73c8ad4a04712..33eccceef9bf3b42ad16ceb6e9021d95faa7a3ce 100644 (file)
@@ -68,7 +68,7 @@ int main(void)
       if (!n)
        puts("*EMPTY*");
       else {
-       v = malloc(n * sizeof(*v));
+       v = calloc(n, sizeof(*v));
        if (!v) {
          puts("*NOMEM*");
          continue;
index eb67e608b70ae942626cbe545d638cd10927c4fe..7f6c652861bcabb63de27092731bc069a3638bec 100644 (file)
 #include "dstr.h"
 #include "macros.h"
 #include "report.h"
+
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-types.h"
 
 /*----- Static variables --------------------------------------------------*/
 
@@ -101,12 +104,11 @@ static PRINTF_LIKE(1, 2) void prepare(const char *fmt, ...)
 
 int main(int argc, char *argv[])
 {
-  struct tvec_test test;
   int argpos;
 
   tvec_parseargs(argc, argv, &tvstate, &argpos, &tvec_adhocconfig);
   if (argpos < argc) die(2, "no input files expected");
-  tvec_adhoc(&tvstate, &test);
+  tvec_adhoc(&tvstate);
 
   TESTGROUP("basics") {
     TEST_KNOWN(("Hello, world!"), "Hello, world!");
index dfc2391220e1562bfb79fbf2311cc58d96e99159..1862a8742028028ccd114979f124ded7dfe8a646 100644 (file)
@@ -65,7 +65,7 @@ int main(void)
       if (!n)
        puts("*EMPTY*");
       else {
-       v = malloc(n * sizeof(*v));
+       v = calloc(n, sizeof(*v));
        if (!v) {
          puts("*NOMEM*");
          continue;
index 15a4a2c3b4d92d85c4b62e8c35f64b7d4e3614af..b890628029699442ef7f03b4c71d97034a9326cc 100644 (file)
@@ -42,6 +42,7 @@
 #include <sys/un.h>
 
 #include "fdpass.h"
+#include "macros.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -68,7 +69,7 @@ ssize_t fdpass_send(int sock, int fd, const void *p, size_t sz)
   struct cmsghdr *cmsg;
 #endif
 
-  iov.iov_base = (/*unconst*/ void *)p;
+  iov.iov_base = UNCONST(void, p);
   iov.iov_len = sz;
   msg.msg_name = 0;
   msg.msg_namelen = 0;
index e4cb2603207fc8c27b25140b41b3bbba0e9e63ff..ed483bbe054ac29168f595bd103f1a8ed698cd35 100644 (file)
@@ -32,6 +32,7 @@
 
 #include <unistd.h>
 
+#include "alloc.h"
 #include "mdup.h"
 
 /*----- Data structures ---------------------------------------------------*/
@@ -376,7 +377,7 @@ int mdup(mdup_fd *v, size_t n)
    * way.
    */
 
-  if ((vv = malloc(sizeof(*vv) * n)) == 0)
+  if (!NEWV_SAFE_P(vv, n) || (vv = malloc(n*sizeof(*vv))) == 0)
     return (-1);
 
   dhead = 0;
index 3fe03f6519f7be686d63fd4d7576456f44ffa3bd..fabb0d7199a9d53197e96664a7c33e66a5e95a28 100644 (file)
@@ -48,6 +48,9 @@ LIBMANS                       += testrig.3
 
 ## New `tvec' testing framework.
 pkginclude_HEADERS     += tvec.h
+pkginclude_HEADERS     += tvec-adhoc.h
+pkginclude_HEADERS     += tvec-output.h
+pkginclude_HEADERS     += tvec-types.h
 libtest_la_SOURCES     += tvec-core.c
 libtest_la_SOURCES     += tvec-output.c
 libtest_la_SOURCES     += tvec-types.c
@@ -60,21 +63,24 @@ EXTRA_DIST          += tvec-env.3.in
 EXTRA_DIST             += tvec-tyimpl.3.in
 EXTRA_DIST             += tvec-output.3.in
 LIBMANS                        += tvec.3
-LIBMANS                        += tvec-types.3
 LIBMANS                        += tvec-adhoc.3
-LIBMANS                        += tvec-main.3
 LIBMANS                        += tvec-env.3
-LIBMANS                        += tvec-tyimpl.3
+LIBMANS                        += tvec-main.3
 LIBMANS                        += tvec-output.3
+LIBMANS                        += tvec-tyimpl.3
+LIBMANS                        += tvec-types.3
 
+pkginclude_HEADERS     += tvec-bench.h
 libtest_la_SOURCES     += tvec-bench.c
 EXTRA_DIST             += tvec-bench.3.in
 LIBMANS                        += tvec-bench.3
 
+pkginclude_HEADERS     += tvec-remote.h
 libtest_la_SOURCES     += tvec-remote.c
 EXTRA_DIST             += tvec-remote.3.in
 LIBMANS                        += tvec-remote.3
 
+pkginclude_HEADERS     += tvec-timeout.h
 libtest_la_SOURCES     += tvec-timeout.c
 EXTRA_DIST             += tvec-timeout.3.in
 LIBMANS                        += tvec-timeout.3
index 3e63da8bf86866827fb0891b867ad7b97ff56f93..b4fc4290cc37dd693984772a59d99e6e2658df2d 100644 (file)
@@ -67,6 +67,7 @@ bench \- low-level benchmarking tools
 .B "#define BTF_T1 ..."
 .B "struct bench_timerops {"
 .BI "  void (*describe)(struct bench_timer *" bt ", dstr *" d );
+.BI "  int (*preflight)(struct bench_timer *" bt );
 .ta 2n +\w'\fBint (*now)('u
 .BI "  int (*now)(struct bench_timer *" bt ,
 .BI "          struct bench_time *" t_out ", unsigned " f );
@@ -151,6 +152,16 @@ must always point to the timer object itself.
 .IB tm ->ops->describe( tm ", " d)
 Write a description of the timer to the dynamic string
 .IR d .
+.TPc
+.IB tm ->ops->preflight( tm )
+Ensure that the timer is in working order,
+and perform any necessary per-thread or per-process setup.
+Return zero if the
+.B now
+function is likely to work properly
+when called from the same thread
+in the near future;
+otherwise return \-1.
 .TP
 .IB tm ->ops->now( tm ", " t_out ", " f )
 Store the current time in
index 9cb84e5e1eb8e9c99b1c6e1cb57627b2f8569cc8..2ac63b44cf3c444c53b67189b8dd8d7f46868d09 100644 (file)
@@ -32,6 +32,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <math.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -39,6 +40,7 @@
 #include <time.h>
 
 #include "alloc.h"
+#include "arena.h"
 #include "bench.h"
 #include "bits.h"
 #include "dstr.h"
 #  include <cpuid.h>
 #  define CPUID_1D_TSC (1u << 4)
 #  define CPUID_1xD_TSCP (1u << 27)
+#  define USE_X86_RDTSC 1
 #endif
 
 #if defined(HAVE_LINUX_PERF_EVENT_H) && defined(HAVE_UINT64)
+#  include <sys/syscall.h>
 #  include <sys/types.h>
 #  include <unistd.h>
 #  include <linux/perf_event.h>
-#  include <asm/unistd.h>
+#  ifdef HAVE_VALGRIND_VALGRIND_H
+#    include <valgrind/valgrind.h>
+#  endif
+#  define USE_LINUX_PERFEVENT 1
 #  if GCC_VERSION_P(4, 5) && (defined(__i386__) || defined(__x86_64__))
 #    include <sys/mman.h>
+#    define USE_LINUX_PERFEVRDPMC 1
 #  endif
 #endif
 
@@ -67,20 +75,31 @@ enum { CLK, CY, NTIMER };
 
 struct timer {
   struct bench_timer _t;
+  arena *a;
   const struct timer_ops *ops[NTIMER]; /* subtimers for clock and cycles */
   union {
+#ifdef USE_X86_RDTSC
     unsigned tscaux;                   /* `ia32_tsc_aux' for `ldtscp' */
+#endif
+#ifdef USE_LINUX_PERFEVENT
     int fd;                            /* vanilla `perf_event_open' */
-    struct { const volatile void *map; size_t sz; } pmc; /* `perf_event_open'
-                                        * with `rdpmc' */
+#endif
+#ifdef USE_LINUX_PERFEVRDPMC
+    struct {                           /* `perf_event_open' with `rdpmc' */
+      const volatile void *map; size_t sz; /* memory-mapped info */
+      pid_t owner;                     /*   owning thread id */
+    } pmc;
+#endif
   } u_cy;                              /* state for cycle measurement */
 };
 
 struct timer_ops {
   const char *name;                    /* timer name */
   unsigned f;                          /* flags */
-#define TF_SECRET 1u                   /*   don't try this automatically */
+/* ... @BTF_...OK@ flags */            /*   expected results */
+#define TF_SECRET 16u                  /*   don't try this automatically */
   int (*init)(struct timer */*t*/);    /* initialization function */
+  int (*preflight)(struct timer */*t*/); /* preflight checks */
   int (*now)(struct timer */*t*/,      /* read current */
             struct bench_time */*t_out*/, unsigned /*f*/);
   void (*diff)(struct timer */*t*/,    /* difference */
@@ -119,8 +138,6 @@ static PRINTF_LIKE(1, 2) void debug(const char *fmt, ...)
   }
 }
 
-/*----- Difference utilities ----------------------------------------------*/
-
 #ifdef HAVE_UINT64
 #  define FLOATK64(k) ((double)(k).i)
 #else
@@ -143,19 +160,25 @@ static void diff_ts(struct timer *t, struct bench_timing *delta_inout,
                    const struct bench_time *t0, const struct bench_time *t1)
 {
   unsigned f = t0->f&t1->f;
-  kludge64 k;
+  kludge64 delta_s;
+  uint32 delta_ns;
 
   if (f&BTF_TIMEOK) {
 
-    /* Calculate the integer difference in seconds. */
-    SUB64(k, t1->t.ts.s, t0->t.ts.s);
+    /* Calculate the integer differences in seconds and nanoseconds
+     * independently.  To avoid underflow, though, add a second's worth of
+     * nanoseconds which we'll subtract off later.
+     */
+    SUB64(delta_s, t1->t.ts.s, t0->t.ts.s);
+    delta_ns = t1->t.ts.ns + NS_PER_S - t0->t.ts.ns;
+
+    /* Hack if they're both equal. */
+    if (ZERO64(delta_s) && !delta_ns) delta_ns = 1;
 
-    /* And apply the nanoseconds difference.  To prevent underflow,
-     * pre-emptively borrow one from the integer difference.
+    /* And apply the nanoseconds difference.  To prevent underflow, pre-
+     * emptively borrow one from the integer difference.
      */
-    delta_inout->t =
-      FLOATK64(k) - 1.0 +
-      (t1->t.ts.ns + NS_PER_S - t0->t.ts.ns)/(double)NS_PER_S;
+    delta_inout->t = FLOATK64(delta_s) - 1.0 + delta_ns/(double)NS_PER_S;
 
     /* Done. */
     delta_inout->f |= BTF_TIMEOK;
@@ -178,16 +201,51 @@ static void diff_cycles(struct timer *t, struct bench_timing *delta_inout,
                        const struct bench_time *t1)
 {
   unsigned f = t0->f&t1->f;
-  kludge64 k;
+  kludge64 delta_cy;
 
   if (f&BTF_CYOK) {
-    SUB64(k, t1->cy, t0->cy); delta_inout->cy = FLOATK64(k);
+    SUB64(delta_cy, t1->cy, t0->cy); delta_inout->cy = FLOATK64(delta_cy);
+    if (!delta_inout->cy) delta_inout->cy = 1;
     delta_inout->f |= BTF_CYOK;
   }
 }
 
 #undef FLOATK64
 
+/* --- @normalize@ --- *
+ *
+ * Arguments:  @double *x_inout@ = address of a value to normalize
+ *             @const char **unit_out@ = address to store unit prefix
+ *             @double scale@ = scale factor for unit steps
+ *
+ * Returns:    ---
+ *
+ * Use:                Adjust @*x_inout@ by a power of @scale@, and set @*unit_out@
+ *             so that printing the two reflects the original value with an
+ *             appropriate SI unit scaling.  The @scale@ should be 1024 for
+ *             binary quantities, most notably memory sizes, or 1000 for
+ *             other quantities.
+ */
+
+static void normalize(double *x_inout, const char **unit_out, double scale)
+{
+  static const char
+    *const nothing = "",
+    *const big[] = { "k", "M", "G", "T", "P", "E", 0 },
+    *const little[] = { "m", "µ", "n", "p", "f", "a", 0 };
+  const char *const *u;
+  double x = *x_inout;
+
+  if (x < 1)
+    for (u = little, x *= scale; x < 1 && u[1]; u++, x *= scale);
+  else if (x >= scale)
+    for (u = big, x /= scale; x >= scale && u[1]; u++, x /= scale);
+  else
+    u = &nothing;
+
+  *x_inout = x; *unit_out = *u;
+}
+
 /*----- The null timer ----------------------------------------------------*/
 
 /* This is a timer which does nothing, in case we don't have any better
@@ -197,6 +255,7 @@ static void diff_cycles(struct timer *t, struct bench_timing *delta_inout,
 static int null_init(struct timer *t) { return (0); }
 static int null_now(struct timer *t, struct bench_time *t_out, unsigned f)
   { return (0); }
+static int null_preflight(struct timer *t) { return (0); }
 static void null_diff(struct timer *t, struct bench_timing *delta_inout,
                      const struct bench_time *t0,
                      const struct bench_time *t1)
@@ -204,7 +263,8 @@ static void null_diff(struct timer *t, struct bench_timing *delta_inout,
 static void null_teardown(struct timer *t) { ; }
 
 static const struct timer_ops null_ops =
-  { "null", 0, null_init, null_now, null_diff, null_teardown };
+  { "null", 0,
+    null_init, null_preflight, null_now, null_diff, null_teardown };
 #define NULL_ENT &null_ops,
 
 /*----- The broken clock --------------------------------------------------*/
@@ -216,7 +276,8 @@ static const struct timer_ops null_ops =
 static int broken_init(struct timer *t) { return (-1); }
 
 static const struct timer_ops broken_ops =
-  { "broken", TF_SECRET, broken_init, null_now, null_diff, null_teardown };
+  { "broken", TF_SECRET,
+    broken_init, null_preflight, null_now, null_diff, null_teardown };
 #define BROKEN_ENT &broken_ops,
 
 /*----- Linux performance counters ----------------------------------------*/
@@ -249,7 +310,7 @@ static int perfevent_open(void)
   attr.exclude_kernel = 1;
   attr.exclude_hv = 1;
 
-  fd = syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0);
+  fd = syscall(SYS_perf_event_open, &attr, 0, -1, -1, 0);
   if (fd < 0) {
     debug("couldn't open perf event: %s", strerror(errno));
     return (-1);
@@ -276,22 +337,19 @@ static void perfevent_teardown(struct timer *t)
 
 static int perfevent_init(struct timer *t)
 {
-  struct bench_time tm;
   int fd = -1, rc;
 
-  fd = perfevent_open(); if (!fd) { rc = -1; goto end; }
-
-  t->u_cy.fd = fd; tm.f = 0; perfevent_now(t, &tm, 0);
-  if (!(tm.f&BTF_CYOK)) { rc = -1; goto end; }
-  fd = -1; rc = 0;
+  fd = perfevent_open(); if (fd < 0) { rc = -1; goto end; }
+  t->u_cy.fd = fd; fd = -1; rc = 0;
 end:
   if (fd != -1) close(fd);
   return (rc);
 }
 
 static const struct timer_ops perfevent_ops =
-  { "linux-perf-read-hw-cycles", 0,
-    perfevent_init, perfevent_now, diff_cycles, perfevent_teardown };
+  { "linux-perf-read-hw-cycles", BTF_CYOK,
+    perfevent_init, null_preflight, perfevent_now,
+    diff_cycles, perfevent_teardown };
 #define PERFEVENT_VANILLA_CYENT &perfevent_ops,
 
 #  if GCC_VERSION_P(4, 5) && (defined(__i386__) || defined(__x86_64__))
@@ -369,31 +427,33 @@ static void perfevrdpmc_diff(struct timer *t,
                             const struct bench_time *t0,
                             const struct bench_time *t1)
 {
+  unsigned long long delta_ns;
   unsigned f = t0->f&t1->f;
 
   if (f&BTF_TIMEOK) {
-    delta_inout->t = (t1->t.rawns.i - t0->t.rawns.i)/(double)NS_PER_S;
+    delta_ns = t1->t.rawns.i - t0->t.rawns.i; if (!delta_ns) delta_ns = 1;
+    delta_inout->t = delta_ns/(double)NS_PER_S;
     delta_inout->f |= BTF_TIMEOK;
   }
 
   if (f&BTF_CYOK) {
     delta_inout->cy = t1->cy.i - t0->cy.i;
+    if (!delta_inout->cy) delta_inout->cy = 1;
     delta_inout->f |= BTF_CYOK;
   }
 }
 
+static void perfevrdpmc_unmap
+  (const volatile struct perf_event_mmap_page *map, size_t mapsz)
+  { if (map) munmap(UNQUALIFY(struct perf_event_mmap_page, map), mapsz); }
+
 static void perfevrdpmc_teardown(struct timer *t)
-  { munmap((/*unconst unvolatile*/ void *)t->u_cy.pmc.map, t->u_cy.pmc.sz); }
+  { perfevrdpmc_unmap(t->u_cy.pmc.map, t->u_cy.pmc.sz); }
 
-static int perfevrdpmc_cyinit(struct timer *t)
+static int perfevrdpmc_setup(struct timer *t)
 {
   const volatile struct perf_event_mmap_page *map = 0;
-  unsigned a, b, c, d, q0, q1, f;
-  int pgsz, mapsz, fd = -1, rc;
-
-  /* We need `rdtsc' to do the passage-of-time measurement. */
-  if (!__get_cpuid(1, &a, &b, &c, &d) || !(d&CPUID_1D_TSC))
-    { debug("no `rdtsc' instrunction"); return (-1); }
+  int pgsz, mapsz = 0, fd = -1, rc;
 
   /* The rules say we must allocate %$1 + 2^n$% pages, so we need to know how
    * big a page is.
@@ -413,42 +473,56 @@ static int perfevrdpmc_cyinit(struct timer *t)
       return (-1);
     }
 
-  /* Check that it's revealed the necessary information. */
-  q0 = map->lock;
-  __atomic_thread_fence(__ATOMIC_ACQ_REL);
-  for (;;) {
-    f = 0;
-    if (map->cap_user_time) f |= BTF_TIMEOK;
-    if (map->cap_user_rdpmc) f |= BTF_CYOK;
-    __atomic_thread_fence(__ATOMIC_ACQ_REL);
-    q1 = map->lock;
-    if (q0 == q1) break;
-    q0 = q1;
-  }
-  if (!(f&BTF_TIMEOK))
-    { debug("kernel refused user time measurement"); rc = -1; goto end; }
-  if (!(f&BTF_TIMEOK))
-    { debug("kernel refused user cycle measurement"); rc = -1; goto end; }
-
-  /* All done.  We can close the descriptor here: the mapping will keep the
-   * performance-measurement machinery alive.
-   */
-  t->u_cy.pmc.map = map; t->u_cy.pmc.sz = mapsz; map = 0; rc = 0;
+  t->u_cy.pmc.map = map; t->u_cy.pmc.sz = mapsz; map = 0;
+  t->u_cy.pmc.owner = syscall(SYS_gettid); rc = 0;
 end:
   if (fd != -1) close(fd);
-  if (map) munmap((/*unconst unvolatile*/ void *)map, mapsz);
+  perfevrdpmc_unmap(map, mapsz);
   return (rc);
 }
 
+static int perfevrdpmc_preflight(struct timer *t)
+{
+  if (!t->u_cy.pmc.map) { debug("retry perf event map setup"); goto reopen; }
+  if (t->u_cy.pmc.owner != syscall(SYS_gettid)) {
+    debug("pid changed: reopen perf event map");
+    perfevrdpmc_unmap(t->u_cy.pmc.map, t->u_cy.pmc.sz);
+    t->u_cy.pmc.map = 0; goto reopen;
+  }
+  return (0);
+
+reopen:
+  if (perfevrdpmc_setup(t)) return (-1);
+  return (0);
+}
+
+static int perfevrdpmc_cyinit(struct timer *t)
+{
+  unsigned a, b, c, d;
+
+#  ifdef HAVE_VALGRIND_VALGRIND_H
+  /* Valgrind doesn't like `rdpmc' instructions, so just bail. */
+  if (RUNNING_ON_VALGRIND) return (-1);
+#  endif
+
+  /* We need `rdtsc' to do the passage-of-time measurement. */
+  if (!__get_cpuid(1, &a, &b, &c, &d) || !(d&CPUID_1D_TSC))
+    { debug("no `rdtsc' instrunction"); return (-1); }
+
+  /* Set things up. */
+  if (perfevrdpmc_setup(t)) return (-1);
+  return (0);
+}
+
 static const struct timer_ops perfevrdpmc_cyops =
-  { "linux-x86-perf-rdpmc-hw-cycles", 0,
-    perfevrdpmc_cyinit, perfevrdpmc_now,
+  { "linux-x86-perf-rdpmc-hw-cycles", BTF_TIMEOK | BTF_CYOK,
+    perfevrdpmc_cyinit, perfevrdpmc_preflight, perfevrdpmc_now,
     perfevrdpmc_diff, perfevrdpmc_teardown };
 
 static int perfevrdpmc_clkinit(struct timer *t)
 {
-  if (t->ops[CLK] != &perfevrdpmc_cyops) {
-    debug("linux-x86-perf-rdpmc-hw-cycles not set as cycle subtimer");
+  if (t->ops[CY] != &perfevrdpmc_cyops) {
+    debug("`linux-x86-perf-rdpmc-hw-cycles' not set as cycle subtimer");
     return(-1);
   }
   return (0);
@@ -456,7 +530,7 @@ static int perfevrdpmc_clkinit(struct timer *t)
 
 static const struct timer_ops perfevrdpmc_clkops =
   { "linux-x86-perf-rdpmc-hw-cycles", 0,
-    perfevrdpmc_clkinit, null_now,
+    perfevrdpmc_clkinit, null_preflight, null_now,
     null_diff, null_teardown };
 
 #    define PERFEVENT_RDPMC_CLKENT &perfevrdpmc_clkops,
@@ -524,11 +598,13 @@ static int x86rdtscp_init(struct timer *t)
 }
 
 static const struct timer_ops x86rdtsc_ops =
-  { "x86-rdtsc", 0,
-    x86rdtsc_init, x86rdtsc_now, diff_cycles, null_teardown };
+  { "x86-rdtsc", BTF_CYOK,
+    x86rdtsc_init, null_preflight, x86rdtsc_now,
+    diff_cycles, null_teardown };
 static const struct timer_ops x86rdtscp_ops =
-  { "x86-rdtscp", 0,
-    x86rdtscp_init, x86rdtscp_now, diff_cycles, null_teardown };
+  { "x86-rdtscp", BTF_CYOK,
+    x86rdtscp_init, null_preflight,
+    x86rdtscp_now, diff_cycles, null_teardown };
 
 #  define X86RDTSC_CYENT &x86rdtscp_ops, &x86rdtsc_ops,
 #else
@@ -553,17 +629,9 @@ static int gettime_now(struct timer *t, struct bench_time *t_out, unsigned f)
   t_out->f |= BTF_TIMEOK; return (0);
 }
 
-static int gettime_init(struct timer *t)
-{
-  struct bench_time tm;
-
-  tm.f = 0; gettime_now(t, &tm, 0); if (!tm.f&BTF_TIMEOK) return (-1);
-  return (0);
-}
-
 static const struct timer_ops gettime_ops =
-  { "posix-thread-cputime", 0,
-    gettime_init, gettime_now, diff_ts, null_teardown };
+  { "posix-thread-cputime", BTF_TIMEOK,
+    null_init, null_preflight, gettime_now, diff_ts, null_teardown };
 
 #  define GETTIME_CLKENT &gettime_ops,
 #else
@@ -592,24 +660,19 @@ static void clock_diff(struct timer *t, struct bench_timing *delta_inout,
                        const struct bench_time *t0,
                        const struct bench_time *t1)
 {
+  clock_t delta_clk;
   unsigned f = t0->f&t1->f;
 
   if (f&BTF_TIMEOK) {
-    delta_inout->t = (t1->t.clk - t0->t.clk)/(double)CLOCKS_PER_SEC;
+    delta_clk = t1->t.clk - t0->t.clk; if (!delta_clk) delta_clk = 1;
+    delta_inout->t = delta_clk/(double)CLOCKS_PER_SEC;
     delta_inout->f |= BTF_TIMEOK;
   }
 }
 
-static int clock_init(struct timer *t)
-{
-  struct bench_time tm;
-
-  tm.f = 0; clock_now(t, &tm, 0); if (!tm.f&BTF_TIMEOK) return (-1);
-  return (0);
-}
-
 static const struct timer_ops clock_ops =
-  { "stdc-clock", 0, clock_init, clock_now, clock_diff, null_teardown };
+  { "stdc-clock", BTF_TIMEOK, null_init, null_preflight, clock_now,
+    clock_diff, null_teardown };
 
 #define CLOCK_CLKENT &clock_ops,
 
@@ -633,8 +696,8 @@ static const struct timertab {
   const char *env;
   const struct timer_ops *const *opstab;
 } timertab[] = {
-  { "clock", "MLIB_BENCH_CLKTIMER", clktab },
-  { "cycle", "MLIB_BENCH_CYCLETIMER", cytab }
+  { "clock",   "MLIB_BENCH_CLKTIMER",          clktab },
+  { "cycle",   "MLIB_BENCH_CYCLETIMER",        cytab }
 };
 
 /* --- @find_timer@ --- *
@@ -676,9 +739,31 @@ static const struct timer_ops *find_timer(const char *name, size_t sz,
 static int try_timer(struct timer *t,
                     const struct timer_ops *ops, unsigned tm)
 {
-  if (ops->init(t)) return (-1);
+  struct bench_time t0, t1;
+  struct bench_timing delta;
+  int rc;
+  unsigned f = 0;
+#define f_teardown 1u
+
+  if (ops->init(t)) { rc = -1; goto end; }
+  f |= f_teardown;
+
+  if (ops->preflight(t)) { rc = -1; goto end; }
+  t0.f = t1.f = 0;
+  do {
+    while (ops->now(t, &t0, BTF_T0));
+  } while (ops->now(t, &t1, BTF_T1));
+  delta.f = 0; ops->diff(t, &delta, &t0, &t1);
+  if ((ops->f ^ delta.f)&BTF_ANY) { rc = -1; goto end; }
+
   debug("selected %s timer `%s'", timertab[tm].what, ops->name);
-  t->ops[tm] = ops; return (0);
+  t->ops[tm] = ops; f &= ~f_teardown; rc = 0;
+
+end:
+  if (f&f_teardown) ops->teardown(t);
+  return (rc);
+
+#undef f_teardown
 }
 
 /* --- @select_timer@ --- *
@@ -730,6 +815,15 @@ static void timer_describe(struct bench_timer *tm, dstr *d)
   }
 }
 
+static int timer_preflight(struct bench_timer *tm)
+{
+  struct timer *t = (struct timer *)tm;
+  unsigned i;
+
+  for (i = 0; i < NTIMER; i++) if (t->ops[i]->preflight(t)) return (-1);
+  return (0);
+}
+
 static int timer_now(struct bench_timer *tm,
                     struct bench_time *t_out, unsigned f)
 {
@@ -761,11 +855,11 @@ static void timer_destroy(struct bench_timer *tm)
   if (!t) return;
   for (i = 0; i < NTIMER; i++)
     if (t->ops[i]) t->ops[i]->teardown(t);
-  xfree(t);
+  x_free(t->a, t);
 }
 
 static const struct bench_timerops timer_ops =
-  { timer_describe, timer_now, timer_diff, timer_destroy };
+  { timer_describe, timer_preflight, timer_now, timer_diff, timer_destroy };
 
 /* --- @bench_createtimer@ --- *
  *
@@ -822,7 +916,7 @@ struct bench_timer *bench_createtimer(const char *config)
        for (i = 0; i < NTIMER; i++) {
          printf("%s timers:", timertab[i].what);
          for (tt = timertab[i].opstab; *tt; tt++)
-           if (!((*tt)->f)&TF_SECRET) printf(" %s", (*tt)->name);
+           if (!((*tt)->f&TF_SECRET)) printf(" %s", (*tt)->name);
          putchar('\n');
        }
        goto next_config;
@@ -861,7 +955,7 @@ struct bench_timer *bench_createtimer(const char *config)
   }
 
   /* All seems well.  Allocate the timer object. */
-  t = xmalloc(sizeof(*t));
+  XNEW(t); t->a = arena_global;
   for (i = 0; i < NTIMER; i++) t->ops[i] = 0;
 
   /* Try to set up the subtimers. */
@@ -925,7 +1019,7 @@ end:
 void bench_destroy(struct bench_state *b)
   { if (b->tm) { b->tm->ops->destroy(b->tm); b->tm = 0; } }
 
-/* --- @do_nothing@ --- *
+/* --- @spin@ --- *
  *
  * Arguments:  @unsigned long n@ = iteration count
  *             @void *ctx@ = context pointer (ignored)
@@ -936,70 +1030,37 @@ void bench_destroy(struct bench_state *b)
  *             the benchmarking state.
  */
 
-static void do_nothing(unsigned long n, void *ctx)
+static void spin(unsigned long n, void *ctx)
   { while (n--) RELAX; }
 
-/* --- @measure@ --- *
- *
- * Arguments:  @struct bench_state *b@ = bench state
- *             @struct bench_timing *delta_out@ = where to leave the timing
- *             @bench_fn *fn@ = function to measure
- *             @void *ctx@ = context for the function
- *             @double n@ = number of iterations
- *
- * Returns:    ---
- *
- * Use:                Run the function @n@ times, and report how long it took.
- *
- *             This function deals with retrying the measurements if the
- *             timer reports a temporary failure, and all of the
- *             difficulties if @n@ is too large to fit in a machine integer.
- */
-
-static void measure(struct bench_state *b, struct bench_timing *delta_out,
-                   bench_fn *fn, void *ctx, double n)
-{
-  struct bench_timer *tm = b->tm;
-  struct bench_time t0, t1;
-  unsigned long n0, n1;
-  double R = ULONG_MAX;
-
-  if (n <= R) {
-    n0 = n;
-    do {
-      while (tm->ops->now(tm, &t0, BTF_T0));
-      fn(n0, ctx);
-    } while (tm->ops->now(tm, &t1, BTF_T1));
-  } else {
-    n1 = n/R; n0 = n - n1*R;
-    do {
-      while (tm->ops->now(tm, &t0, BTF_T0));
-      while (n1--) fn(ULONG_MAX, ctx);
-      fn(n0, ctx);
-    } while (tm->ops->now(tm, &t1, BTF_T1));
-  }
-  tm->ops->diff(tm, delta_out, &t0, &t1);
-}
-
 /* --- @bench_calibrate@ --- *
  *
  * Arguments:  @struct bench_state *b@ = bench state
+ *             @unsigned f@ = calibration flags
  *
  * Returns:    Zero on success, %$-1$% if calibration failed.
  *
  * Use:                Calibrate the benchmark state, so that it can be used to
  *             measure performance reasonably accurately.
+ *
+ *             Calibration will take into account how the subject code is
+ *             going to be located.  If you're going to use @BENCH_MEASURE@
+ *             to measure a piece of literal code, then leave @f@ zero.  If
+ *             the code to be measured is going to be executed via an
+ *             indirect branch, e.g., through the @measure@ function, then
+ *             set @BTF_INDIRECT@.
  */
 
 #define T_CLB 0.0625                   /* calibration time limit */
 
-int bench_calibrate(struct bench_state *b)
+int bench_calibrate(struct bench_state *b, unsigned f)
 {
   struct linreg lr_clk = LINREG_INIT, lr_cy = LINREG_INIT;
+  struct bench_timer *tm = b->tm;
   struct bench_timing delta;
   double n, r;
-  bench_fn *fn = LAUNDER(&do_nothing);
-  unsigned i, f = BTF_ANY;
+  unsigned i, tf = BTF_ANY;
+  BENCH_TIMELOOP_DECLS;
   int rc;
 
   /* The model here is that a timing loop has a fixed overhead as we enter
@@ -1011,8 +1072,17 @@ int bench_calibrate(struct bench_state *b)
   /* If we've already calibrated then there's nothing to do. */
   if (b->f&BTF_CLB) return (b->f&BTF_ANY ? 0 : -1);
 
-  /* Exercise the inner loop a few times to educate the branch predictor. */
-  for (i = 0; i < 50; i++) measure(b, &delta, fn, 0, 10000);
+  /* Run the timer preflight check. */
+  if (tm->ops->preflight(tm)) { rc = -1; goto end; }
+
+  /* Exercise the inner loop a few times to educate the branch predictor.
+   * This is only useful if we're executing via an indirect call.
+   */
+  if (f&BTF_INDIRECT) {
+    for (i = 0; i < 50; i++)
+      BENCH_TIMELOOP_TAG(setup, b, &delta, 10000)
+       LAUNDER(&spin)(_bench_n, 0);
+  }
 
   /* Now we measure idle loops until they take sufficiently long -- or we run
    * out of counter.
@@ -1022,12 +1092,17 @@ int bench_calibrate(struct bench_state *b)
   for (;;) {
 
     /* Measure @n@ iterations of the idle loop. */
-    measure(b, &delta, fn, 0, n); f &= delta.f;
-    if (!(f&BTF_TIMEOK)) { rc = -1; goto end; }
+    if (f&BTF_INDIRECT)
+      BENCH_TIMELOOP_TAG(calibrate, b, &delta, n)
+       LAUNDER(&spin)(_bench_n, 0);
+    else
+      BENCH_TIMELOOP_TAG(calibrate, b, &delta, n)
+       while (_bench_n--) RELAX;
+    tf &= delta.f; if (!(tf&BTF_TIMEOK)) { rc = -1; goto end; }
 
     /* Register the timings with the regression machinery. */
     linreg_update(&lr_clk, n, delta.t);
-    if (!(f&BTF_CYOK))
+    if (!(tf&BTF_CYOK))
       debug("  n = %10.0f; t = %12g s", n, delta.t);
     else {
       linreg_update(&lr_cy, n, delta.cy);
@@ -1047,7 +1122,7 @@ int bench_calibrate(struct bench_state *b)
    */
   linreg_fit(&lr_clk, &b->clk.m, &b->clk.c, &r);
   debug("clock overhead = (%g n + %g) s (r = %g)", b->clk.m, b->clk.c, r);
-  if (f&BTF_CYOK) {
+  if (tf&BTF_CYOK) {
     linreg_fit(&lr_cy, &b->cy.m, &b->cy.c, &r);
     debug("cycle overhead = (%g n + %g) cy (r = %g)", b->cy.m, b->cy.c, r);
   }
@@ -1055,41 +1130,75 @@ int bench_calibrate(struct bench_state *b)
   /* We're done. */
   rc = 0;
 end:
-  b->f |= f | BTF_CLB;                 /* no point trying again */
+  b->f |= tf | BTF_CLB;                        /* no point trying again */
   return (rc);
 }
 
-/* --- @bench_measure@ --- *
+/* --- @bench_preflight@ --- *
  *
  * Arguments:  @struct bench_state *b@ = benchmark state
- *             @struct bench_timing *t_out@ = where to leave the timing
- *             @double base@ = number of internal units per call
- *             @bench_fn *fn@, @void *ctx@ = benchmark function to run
  *
- * Returns:    Zero on success, %$-1$% if timing failed.
+ * Returns:    Zero on success, %$-1$% on failure.
  *
- * Use:                Measure a function.  The function @fn@ is called adaptively
- *             with an iteration count @n@ set so as to run for
- *             approximately @b->target_s@ seconds.
+ * Use:                Prepares for benchmarking on the current thread.  Current
+ *             checks are that the timer is calibrated and that it can
+ *             successfully measure time; the timer preflight is also run.
  *
- *             The result is left in @*t_out@, with @t_out->n@ counting the
- *             final product of the iteration count and @base@ (which might,
- *             e.g., reflect the number of inner iterations the function
- *             performs, or the number of bytes it processes per iteration).
+ *             Users are unlikely to find this function useful: it's called
+ *             automatically by the @BENCH_MEASURE@ macro and the
+ *             @bench_measure@ function.
  */
 
-int bench_measure(struct bench_state *b, struct bench_timing *t_out,
-                 double base, bench_fn *fn, void *ctx)
+int bench_preflight(struct bench_state *b)
 {
-  double n, nn;
+  struct bench_timer *tm = b->tm;
 
-  /* Make sure the state is calibrated and usable. */
-  if (!(b->f&BTF_CLB) && bench_calibrate(b)) return (-1);
+  if (!(b->f&BTF_CLB)) return (-1);
   if (!(b->f&BTF_TIMEOK)) return (-1);
+  if (tm->ops->preflight(tm)) return (-1);
+  debug("measuring...");
+  return (0);
+}
+
+/* --- @bench_adapt@ --- *
+ *
+ * Arguments:  @struct bench_state *b@ = benchmark state
+ *             @double *n_inout@ = number of iterations, updated
+ *             @const struct bench_timing *t@ = timing from the previous run
+ *
+ * Returns:    Nonzero if the measurement is sufficient; zero to run again.
+ *
+ * Use:                This function determines a suitable number of iterations of a
+ *             benchmark function to perform next.  It is used in a loop
+ *             such as the following.
+ *
+ *                     @double n = 1.0;@
+ *                     @struct bench_timing t;@
+ *
+ *                     @do {@
+ *                       (run @n@ iterations; set @t@ to the timing)
+ *                     @} while (!bench_adapt(b, &n, &t));@
+ *
+ *             On entry, @*n_inout@ should be the number of iterations
+ *             performed by the previous pass, and @*t@ the resulting time;
+ *             the @BTF_TIMEOK@ flag must be set @t->f@.  If the timing is
+ *             sufficient -- @t->t@ is sufficiently close to @b->target_s@
+ *             -- then the function returns nonzero to indicate that
+ *             measurement is complete.  Otherwise, it sets @*n_inout@ to a
+ *             new, larger iteration count and returns zero to indicate that
+ *             a further pass is necessary.
+ */
 
-  /* Main adaptive measurement loop.
-   *
-   * Suppose the timer loop %$n$% iterations in %$t$% seconds.  Our ideal
+int bench_adapt(struct bench_state *b,
+               double *n_inout, const struct bench_timing *t)
+{
+  double n = *n_inout, nn;
+
+  /* Dump the results for debugging. */
+  if (!(t->f&BTF_CYOK)) debug("  n = %10.0f; t = %12g", n, t->t);
+  else debug("  n = %10.0f; t = %12g, cy = %10.0f", n, t->t, t->cy);
+
+  /* Suppose the timer loop %$n$% iterations in %$t$% seconds.  Our ideal
    * time is %$T$% seconds.  If %$t \ge T/\sqrt{2}$%, we're happy.
    * Otherwise, we need to scale up the iteration count.  The obvious next
    * choice is %$n' = n T/t$%.  Alas, rounding is a problem: if
@@ -1099,36 +1208,136 @@ int bench_measure(struct bench_state *b, struct bench_timing *t_out,
    * hand, if %$T/t < 1 + 1/n$% then %$t (n + 1)/n > T$%, so just trying
    * again with %$n' = n + 1$% iterations will very likely work.
    */
-  debug("measuring..."); n = 1.0;
-  for (;;) {
-    measure(b, t_out, fn, ctx, n); t_out->f &= b->f;
-    if (!(t_out->f&BTF_TIMEOK)) return (-1);
-    if (!(t_out->f&BTF_CYOK))
-      debug("  n = %10.0f; t = %12g", n, t_out->t);
-    else
-      debug("  n = %10.0f; t = %12g, cy = %10.0f", n, t_out->t, t_out->cy);
+  if (t->t >= 0.707*b->target_s) return (1);
+  nn = n*b->target_s/t->t; modf(nn, &nn);
+  *n_inout = nn > n ? nn : n + 1;
+  return (0);
+}
 
-    if (t_out->t >= 0.707*b->target_s) break;
-    nn = n*b->target_s/t_out->t;
-    if (n > ULONG_MAX || nn > (unsigned long)n + 1) n = nn;
-    else n++;
-  }
+/* --- @bench_adjust@ --- *
+ *
+ * Arguments:  @struct bench_state *b@ = benchmark state
+ *             @struct bench_timing *t_inout@ = timing to adjust
+ *             @double n@ = number of external iterations performed
+ *             @double base@ = number of internal operations per external
+ *                     iteration
+ *
+ * Returns:    ---
+ *
+ * Use:                Adjusts a raw timing, as captured by @BENCH_TIMELOOP@,
+ *             according to the calibration data captured in @b@.
+ *             On exit, the timing data is updated, and @t->n@ is set to the
+ *             product @n*base@.
+ */
+
+void bench_adjust(struct bench_state *b,
+                 struct bench_timing *t_inout, double n, double base)
+{
 
   /* Adjust according to the calibration. */
-  t_out->t -= n*b->clk.m + b->clk.c;
-  if (t_out->f&BTF_CYOK) t_out->cy -= n*b->cy.m + b->cy.c;
+  t_inout->t -= n*b->clk.m + b->clk.c;
+  if (t_inout->f&BTF_CYOK) t_inout->cy -= n*b->cy.m + b->cy.c;
 
   /* Report the results, if debugging. */
-  if (!(t_out->f&BTF_CYOK)) debug("  adjusted t' = %12g", t_out->t);
-  else debug("  adjusted t = %12g, cy = %10.0f", t_out->t, t_out->cy);
-  if (!(t_out->f&BTF_CYOK))
-    debug("  %g s per op; %g ops/s", t_out->t/n, n/t_out->t);
+  if (!(t_inout->f&BTF_CYOK)) debug("  adjusted t' = %12g", t_inout->t);
+  else debug("  adjusted t' = %12g, cy' = %10.0f", t_inout->t, t_inout->cy);
+  if (!(t_inout->f&BTF_CYOK))
+    debug("  %g s per iter; %g iters/s", t_inout->t/n, n/t_inout->t);
   else
-    debug("  %g s (%g cy) per op; %g ops/s",
-         t_out->t/n, t_out->cy/n, n/t_out->t);
+    debug("  %g s (%g cy) per iter; %g iters/s",
+         t_inout->t/n, t_inout->cy/n, n/t_inout->t);
 
   /* All done. */
-  t_out->n = n*base; return (0);
+  t_inout->n = n*base;
+}
+
+/* --- @bench_measure@ --- *
+ *
+ * Arguments:  @struct bench_state *b@ = benchmark state
+ *             @struct bench_timing *t_out@ = where to leave the timing
+ *             @double base@ = number of internal units per call
+ *             @bench_fn *fn@, @void *ctx@ = benchmark function to run
+ *
+ * Returns:    Zero on success, %$-1$% if timing failed.
+ *
+ * Use:                Measure a function.  The function @fn@ is called adaptively
+ *             with an iteration count @n@ set so as to run for
+ *             approximately @b->target_s@ seconds.
+ *
+ *             The result is left in @*t_out@, with @t_out->n@ counting the
+ *             final product of the iteration count and @base@ (which might,
+ *             e.g., reflect the number of inner iterations the function
+ *             performs, or the number of bytes it processes per iteration).
+ *
+ *             To get useful results, the benchmark state should have been
+ *             calibrated for indirect calling -- i.e., with @BTF_INDIRECT@.
+ */
+
+int bench_measure(struct bench_state *b, struct bench_timing *t_out,
+                 double base, bench_fn *fn, void *ctx)
+{
+  BENCH_MEASURE_DECLS;
+  int rc;
+
+  BENCH_MEASURE_TAG(bench_measure, b, rc, t_out, base)
+    fn(_bench_n, ctx);
+  return (rc);
+}
+
+/*----- Reporting ---------------------------------------------------------*/
+
+/* --- @bench_report@ --- *
+ *
+ * Arguments:  @const struct gprintf_ops *gops, void *gp@ = output formatter
+ *             @unsigned unit@ = unit processed by the benchmark function
+ *             @const struct bench_timing *t@ = benchmark result
+ *
+ * Returns:    ---
+ *
+ * Use:                Format, to the output identified by @gops@ and @go@, a
+ *             human-readable report of the benchmarking result @t@.  No
+ *             newline is appended.
+ *
+ *             The output format is subject to change in later versions.
+ */
+
+void bench_report(const struct gprintf_ops *gops, void *go,
+                 unsigned unit, const struct bench_timing *t)
+{
+  double scale, x, n = t->n;
+  const char *u, *what, *whats;
+
+  assert(t->f&BTF_TIMEOK);
+
+  switch (unit) {
+    case BTU_OP:
+      gprintf(gops, go, "%.0f iterations ", n);
+      what = "op"; whats = "ops"; scale = 1000;
+      break;
+    case BTU_BYTE:
+      x = n; normalize(&x, &u, 1024); gprintf(gops, go, "%.3f %sB ", x, u);
+      what = whats = "B"; scale = 1024;
+      break;
+    default:
+      assert(0);
+  }
+
+  x = t->t; normalize(&x, &u, 1000);
+  gprintf(gops, go, "in %.3f %ss", x, u);
+  if (t->f&BTF_CYOK) {
+    x = t->cy; normalize(&x, &u, 1000);
+    gprintf(gops, go, " (%.3f %scy)", x, u);
+  }
+  gprintf(gops, go, ": ");
+
+  x = n/t->t; normalize(&x, &u, scale);
+    gprintf(gops, go, "%.3f %s%s/s", x, u, whats);
+  x = t->t/n; normalize(&x, &u, 1000);
+    gprintf(gops, go, ", %.3f %ss/%s", x, u, what);
+  if (t->f&BTF_CYOK) {
+    x = t->cy/n; normalize(&x, &u, 1000);
+      gprintf(gops, go, " (%.3f %scy/%s)", x, u, what);
+  }
 }
 
 /*----- That's all, folks -------------------------------------------------*/
index 24845840a5e91c4cec68f8a2993c47a6edee8038..3756247a16be18e1b07ab5204e6e6b90213775a6 100644 (file)
 
 /*----- Header files ------------------------------------------------------*/
 
+#include <limits.h>
 #include <time.h>
 
 #ifndef MLIB_BITS_H
 #  include "bits.h"
 #endif
 
+#ifndef MLIB_CONTROL_H
+#  include "control.h"
+#endif
+
 #ifndef MLIB_DSTR_H
 #  include "dstr.h"
 #endif
 
+#ifndef MLIB_GPRINTF_H
+#  include "gprintf.h"
+#endif
+
 /*----- Data structures ---------------------------------------------------*/
 
 struct bench_time {
@@ -70,6 +79,12 @@ struct bench_timerops {
   void (*describe)(struct bench_timer */*bt*/, dstr */*d*/);
     /* Write a description of the timer to @d@. */
 
+  int (*preflight)(struct bench_timer */*bt*/);
+    /* Return zero if timer is ready to go, or %$-1$% otherwise.  The @now@
+     * function will only be called following a successful @preflight@ on the
+     * same thread.
+     */
+
   int (*now)(struct bench_timer */*bt*/, struct bench_time */*t_out*/,
              unsigned /*f*/);
 #define BTF_T0 0u                      /* fetching first time of a pair */
@@ -101,6 +116,175 @@ struct bench_state {
 typedef void bench_fn(unsigned long /*n*/, void */*ctx*/);
   /* Run the benchmark @n@ times, given a context pointer @ctx@. */
 
+enum {
+  BTU_OP,                             /* counting operations of some kind */
+  BTU_BYTE,                            /* counting bytes (@rbuf >= 0@) */
+  BTU_LIMIT                            /* (number of units) */
+};
+
+/*----- Macros ------------------------------------------------------------*/
+
+/* --- @BENCH_TIMELOOP_DECLS@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Use:                Expands to the declarations needed by @BENCH_TIMELOOP_TAG@.
+ *             These should be at block scope, not at toplevel.
+ */
+
+#define BENCH_TIMELOOP_DECLS                                           \
+  struct bench_timer *_bench_tm;                                       \
+  struct bench_time _bench_t0, _bench_t1;                              \
+  unsigned long _bench_n, _bench_n1
+
+/* --- @BENCH_TIMELOOP_TAG@ --- *
+ *
+ * Arguments:  @tag@ = control structure tag
+ *             @struct bench_state *b@ = benchmark state
+ *             @struct bench_timing *delta_out@ = where to put the result
+ *             @double n@ = number of iterations
+ *
+ * Returns:    ---
+ *
+ * Use:                @BENCH_TIMELOOP_TAG(tag, b, delta_out, n) stmt@ runs @stmt@
+ *             @n@ times, capturing the time and/or CPU cycles taken in
+ *             @*delta_out@.  The iteration count must be no more than the
+ *             %%\emph{square}%% of @ULONG_MAX@.  If @stmt@ executes a free
+ *             @break@ statement, then the containing loop -- which ust
+ *             exist -- is exited.
+ *
+ *             This macro is not intended to be used directly by users: it
+ *             is used internally by @bench_calibrate@ and @BENCH_MEASURE@.
+ */
+
+#define BENCH_TIMELOOP_TAG(tag, b, delta_out, n)                       \
+  MC_BEFORE(tag##__benchtl_setup, {                                    \
+    double _R = ULONG_MAX; double _n = (n);                            \
+                                                                       \
+    _bench_tm = (b)->tm;                                               \
+    if (_n <= _R) { _bench_n1 = 0; _bench_n = _n; }                    \
+    else { _bench_n1 = _n/_R; _bench_n = _n - _R*_bench_n1; }          \
+  })                                                                   \
+  MC_TARGET(tag##__benchtl_break, { break; })                          \
+  MC_AFTER(tag##__benchtl_end, {                                       \
+    _bench_tm->ops->diff(_bench_tm, (delta_out), &_bench_t0, &_bench_t1); \
+  })                                                                   \
+  MC_DOWHILE(tag##__benchtl_countdown, _bench_n1--)                    \
+    MC_AFTER(tag##__benchtl_post, { _bench_n = ULONG_MAX; })           \
+    MC_DOWHILE(tag##__benchtl_t1,                                      \
+              _bench_tm->ops->now(_bench_tm, &_bench_t1, BTF_T1))      \
+      MC_WRAP(tag##__benchtl_t0,                                       \
+       { while (_bench_tm->ops->now(_bench_tm, &_bench_t0, BTF_T0)) ; }, \
+       { ; },                                                          \
+       { MC_GOTARGET(tag##__benchtl_break); })
+
+/* --- @BENCH_MEASURE_DECLS@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Use:                Expands to the declarations needed by @BENCH_MEASURE@.
+ *             These should be at block scope, not at toplevel.
+ */
+
+#define BENCH_MEASURE_DECLS                                            \
+  struct bench_state *_bench_b;                                                \
+  struct bench_timing *_bench_t;                                       \
+  double _bench_nn;                                                    \
+  BENCH_TIMELOOP_DECLS
+
+/* --- @BENCH_MEASURE@, @BENCH_MEASURE_TAG@ --- *
+ *
+ * Arguments:  @tag@ = control structure tag
+ *             @struct bench_state *b@ = benchmark state
+ *             @int &rc@ = where to put the result code (zero on success,
+ *                     %$-1$% on failure)
+ *             @struct bench_timing *t_out@ = where to put the result
+ *             @double base@ = number of operations per external iteration
+ *
+ * Returns:    ---
+ *
+ * Use:                @BENCH_MEASURE(b, rc, delta_out, n) stmt@ measures the
+ *             execution of @stmt@.
+ *
+ *             The statement should perform @_bench_n@ iterations of some
+ *             operation.  It will be invoked multiple times, with varying
+ *             iteration counts, so as to run for approximately
+ *             @b->target_s@ seconds.
+ *
+ *             On success, the resulting timing is left in @*t_out@, with
+ *             @t_out->n@ holding the product of the final iteration count
+ *             and @base@, and @rc@ is set to zero.  If the timer fails, or
+ *             if @stmt@ invokes a free @break@ statement, then @rc@ is set
+ *             to %$-1$%.
+ *
+ *             The macro @BENCH_MEASURE_TAG@ is the same, except that it
+ *             allows an explicit control-structure tag to be set so that it
+ *             can be used within larger control structure macros.
+ */
+
+#define BENCH_MEASURE_TAG(tag, b, rc, t_out, base)                     \
+  MC_BEFORE(tag##__benchmsr_setup, {                                   \
+    _bench_b = (b); _bench_t = (t_out); _bench_nn = 1.0;               \
+    if (bench_preflight(_bench_b)) MC_GOTARGET(tag##__benchmsr_fail);  \
+  })                                                                   \
+  MC_TARGET(tag##__benchmsr_done,                                      \
+    { bench_adjust(_bench_b, _bench_t, _bench_nn, (base)); (rc) = 0; }) \
+  MC_TARGET(tag##__benchmsr_fail, { (rc) = -1; })                      \
+  for (;;)                                                             \
+    MC_WRAP(tag##__benchmsr_loop,                                      \
+      { ; },                                                           \
+      { _bench_t->f &= _bench_b->f;                                    \
+       if (!(_bench_t->f&BTF_TIMEOK)) MC_GOTARGET(tag##__benchmsr_fail); \
+       if (bench_adapt(_bench_b, &_bench_nn, _bench_t))                \
+         MC_GOTARGET(tag##__benchmsr_done);                            \
+      },                                                               \
+      { MC_GOTARGET(tag##__benchmsr_fail); })                          \
+    BENCH_TIMELOOP_TAG(tag##__benchmsr_time, _bench_b, _bench_t, _bench_nn)
+
+#define BENCH_MEASURE(b, rc, t_out, base)                              \
+  BENCH_MEASURE_TAG(bench_measure, b, rc, t_out, base)
+
+/* --- @BENCHMARK_DECLS@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Use:                Expands to the declarations needed by @BENCHMARK_TAG@.
+ *             These should be at block scope, not at toplevel.
+ */
+
+#define BENCHMARK_DECLS                                                        \
+  struct bench_timing _bench_tm;                                       \
+  int _bench_rc;                                                       \
+  BENCH_MEASURE_DECLS
+
+/* --- @BENCHMARK_TAG@ --- *
+ *
+ * Arguments:  @tag@ = control structure tag
+ *             @struct bench_state *b@ = benchmark state
+ *             @struct gprintf_ops *gops, void *go@ = output formatter
+ *             @unsigned unit@ = unit being measured (@BTU_...@ code)
+ *             @double base@ = number of units per external iteration
+ *
+ * Returns:    ---
+ *
+ * Use:                @BENCHMARK_TAG(tag, b, gops, go, unit, base) stmt@ measures
+ *             the execution of @stmt@ and writes a report to an output
+ *             formatter.  The @stmt@ should run @_bench_n@ iterations of
+ *             the operation to be measured.
+ *
+ *             No tagless version of this macro is provided, because it is
+ *             expected to be useful primarily in the construction of
+ *             higher-level macros.
+ */
+
+#define BENCHMARK_TAG(tag, b, gops, go, unit, base)                    \
+  MC_AFTER(tag##__benchmark_after, {                                   \
+    if (_bench_rc) gprintf((gops), (go), "FAILED");                    \
+    else bench_report((gops), (go), _bench_b, (unit), &_bench_tm);     \
+  })                                                                   \
+  BENCH_MEASURE_TAG(tag##__benchmark_measure,                          \
+                   (b), _bench_rc, &_bench_tm, (base))
+
 /*----- Functions provided ------------------------------------------------*/
 
 /* --- @bench_createtimer@ --- *
@@ -156,14 +340,100 @@ extern void bench_destroy(struct bench_state */*b*/);
 /* --- @bench_calibrate@ --- *
  *
  * Arguments:  @struct bench_state *b@ = bench state
+ *             @unsigned f@ = calibration flags
  *
  * Returns:    Zero on success, %$-1$% if calibration failed.
  *
  * Use:                Calibrate the benchmark state, so that it can be used to
  *             measure performance reasonably accurately.
+ *
+ *             Calibration will take into account how the subject code is
+ *             going to be located.  If you're going to use @BENCH_MEASURE@
+ *             to measure a piece of literal code, then leave @f@ zero.  If
+ *             the code to be measured is going to be executed via an
+ *             indirect branch, e.g., through the @measure@ function, then
+ *             set @BTF_INDIRECT@.
  */
 
-extern int bench_calibrate(struct bench_state */*b*/);
+#define BTF_INDIRECT 1u
+extern int bench_calibrate(struct bench_state */*b*/, unsigned /*f*/);
+
+/* --- @bench_preflight@ --- *
+ *
+ * Arguments:  @struct bench_state *b@ = benchmark state
+ *
+ * Returns:    Zero on success, %$-1$% on failure.
+ *
+ * Use:                Prepares for benchmarking on the current thread.  Current
+ *             checks are that the timer is calibrated and that it can
+ *             successfully measure time; the timer preflight is also run.
+ *
+ *             Users are unlikely to find this function useful: it's called
+ *             automatically by the @BENCH_MEASURE@ macro and the
+ *             @bench_measure@ function.
+ */
+
+extern int bench_preflight(struct bench_state */*b*/);
+
+/* --- @bench_adapt@ --- *
+ *
+ * Arguments:  @struct bench_state *b@ = benchmark state
+ *             @double *n_inout@ = number of iterations, updated
+ *             @const struct bench_timing *t@ = timing from the previous run
+ *
+ * Returns:    Nonzero if the measurement is sufficient; zero to run again.
+ *
+ * Use:                This function determines a suitable number of iterations of a
+ *             benchmark function to perform next.  It is used in a loop
+ *             such as the following.
+ *
+ *                     @double n = 1.0;@
+ *                     @struct bench_timing t;@
+ *
+ *                     @do {@
+ *                       (run @n@ iterations; set @t@ to the timing)
+ *                     @} while (!bench_adapt(b, &n, &t));@
+ *
+ *             On entry, @*n_inout@ should be the number of iterations
+ *             performed by the previous pass, and @*t@ the resulting time;
+ *             the @BTF_TIMEOK@ flag must be set @t->f@.  If the timing is
+ *             sufficient -- @t->t@ is sufficiently close to @b->target_s@
+ *             -- then the function returns nonzero to indicate that
+ *             measurement is complete.  Otherwise, it sets @*n_inout@ to a
+ *             new, larger iteration count and returns zero to indicate that
+ *             a further pass is necessary.
+ *
+ *             Users are unlikely to find this function useful: it's called
+ *             automatically by the @BENCH_MEASURE@ macro and the
+ *             @bench_measure@ function.
+ */
+
+extern int bench_adapt(struct bench_state */*b*/, double */*n_inout*/,
+                      const struct bench_timing */*t*/);
+
+/* --- @bench_adjust@ --- *
+ *
+ * Arguments:  @struct bench_state *b@ = benchmark state
+ *             @struct bench_timing *t_inout@ = timing to adjust
+ *             @double n@ = number of external iterations performed
+ *             @double base@ = number of internal operations per external
+ *                     iteration
+ *
+ * Returns:    ---
+ *
+ * Use:                Adjusts a raw timing, as captured by @BENCH_TIMELOOP@,
+ *             according to the calibration data captured in @b@.
+ *             On exit, the timing data is updated, and @t->n@ is set to the
+ *             product @n*base@.
+ *
+ *             Users are unlikely to find this function useful: it's called
+ *             automatically by the @BENCH_MEASURE@ macro and the
+ *             @bench_measure@ function.
+ */
+
+extern void bench_adjust(struct bench_state */*b*/,
+                        struct bench_timing */*t_inout*/,
+                        double /*n*/, double /*base*/);
 
 /* --- @bench_measure@ --- *
  *
@@ -188,6 +458,27 @@ extern int bench_measure(struct bench_state */*b*/,
                         struct bench_timing */*t_out*/,
                         double /*base*/, bench_fn */*fn*/, void */*ctx*/);
 
+/*----- Reporting ---------------------------------------------------------*/
+
+/* --- @bench_report@ --- *
+ *
+ * Arguments:  @const struct gprintf_ops *gops, void *gp@ = output formatter
+ *             @unsigned unit@ = unit processed by the benchmark function
+ *             @const struct bench_timing *t@ = benchmark result
+ *
+ * Returns:    ---
+ *
+ * Use:                Format, to the output identified by @gops@ and @go@, a
+ *             human-readable report of the benchmarking result @t@.  No
+ *             newline is appended.
+ *
+ *             The output format is subject to change in later versions.
+ */
+
+extern void bench_report(const struct gprintf_ops */*gops*/, void */*go*/,
+                        unsigned /*unit*/,
+                        const struct bench_timing */*t*/);
+
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus
index 71b9f6bdf73f78916106ca3238e6ac91abc9d684..eae66f872bf8e41f2c0faebb5789954b6cfef769 100644 (file)
@@ -38,4 +38,9 @@ testex_SOURCES                += testex.c
 testex_SOURCES         += exfunc.c
 testex_SOURCES         += example.h
 
+noinst_PROGRAMS                += adhoc
+adhoc_SOURCES           =
+
+adhoc_SOURCES          += adhoc.c
+
 ###----- That's all, folks --------------------------------------------------
diff --git a/test/example/adhoc.c b/test/example/adhoc.c
new file mode 100644 (file)
index 0000000..fbaa69f
--- /dev/null
@@ -0,0 +1,125 @@
+/* -*-c-*-
+ *
+ * Demonstration of ad-doc testing
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <limits.h>
+#include <stdio.h>
+
+#include "macros.h"
+#include "report.h"
+#include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-bench.h"
+#include "tvec-types.h"
+
+/*----- Main code ---------------------------------------------------------*/
+
+/* Stupid but traditional recursive Fibonacci. */
+static unsigned long recfib(unsigned n)
+  { return (n <= 1 ? n : recfib(n - 1) + recfib(n - 2)); }
+
+/* Slightly less stupid but still traditional iterative Fibonacci. */
+static unsigned long iterfib(unsigned n)
+{
+  unsigned long u, v, t;
+
+  for (u = 0, v = 1; n--; t = v, v = u, u += t);
+  return (u);
+}
+
+/* Sadly nontraditional intelligent Fibonacci. */
+static unsigned long expfib(unsigned n)
+{
+  unsigned long a, b, u, v, t;
+
+  /* We work in %$\Q(\phi)$%, where %$\phi^2 = \phi + 1$%.  I claim that
+   * %$\phi^k = F_k \phi + F_{k-1} \pmod f(\phi))$%.  Proof by induction:
+   * note that * %$F_{-1} = F_1 - F_0 = 1$%, so %$\phi^0 = 1 = {}$%
+   * %$F_0 \phi + F_{-1}$%; and %$\phi^{k+1} = F_k \phi^2 + {}$%
+   * %$F_{k-1} \phi = F_k (\phi + 1) + F_{k-1} \phi = (F_k + {}$%
+   * %$F_{k-1} \phi + F_k = F_{k+1} \phi + F_k$% as claimed.
+   *
+   * Now, notice that %$(a \phi + b) (c \phi + d) = a c \phi^2 + {}$%
+   * $%(a d + b c) \phi + b d = a c (\phi + 1) + (a d + b c) \phi + {}$%
+   * %$b d = (a c + a d + b c) \phi + (a c + b d)$%.  In particular,
+   * %$(u \phi + v)^2 \equiv (u^2 + 2 u v) \phi + (u^2 + v^2)$%.
+   */
+  a = 0, b = 1; u = 1, v = 0;
+  if (n)
+    for (;;) {
+      if (n%2) { t = a*u; a = t + a*v + b*u; b = t + b*v; }
+      n /= 2; if (!n) break;
+      t = u*u; u = t + 2*u*v; v = t + v*v;
+    }
+  return (a);
+}
+
+int main(int argc, char *argv[])
+{
+  struct tvec_state tvstate;
+  int argpos;
+  unsigned long i, a, b, t;
+
+  tvec_parseargs(argc, argv, &tvstate, &argpos, &tvec_adhocconfig);
+  if (argpos < argc) die(2, "no input files expected");
+  tvec_adhoc(&tvstate);
+
+#if (ULONG_MAX/65536 >> 16) >= 0xffffffff
+#  define FIBLIMIT 94               /* F_94 = 19740274219868223167 > 2^64 */
+#else
+#  define FIBLIMIT 48                  /* F_48 = 4807526976 > 2^32 */
+#endif
+
+  TVEC_TESTGROUP(&tvstate, "fib-test") {
+    for (i = 0, a = 0, b = 1; i < FIBLIMIT; i++, t = b, b = a, a += t)
+      TVEC_TEST(&tvstate) {
+       if (i < 40) TVEC_CLAIMEQ_UINT(&tvstate, a, recfib(i));
+       TVEC_CLAIMEQ_UINT(&tvstate, a, iterfib(i));
+       TVEC_CLAIMEQ_UINT(&tvstate, a, expfib(i));
+      }
+  }
+
+  TVEC_TESTGROUP(&tvstate, "fib-bench") {
+    TVEC_BENCHMARK_DECLS;
+
+    if (tvec_benchprep(&tvstate, &tvec_benchstate, 0)) break;
+
+    TVEC_BENCHMARK("recfib, n = 40", &tvstate, tvec_benchstate, BTU_OP, 1)
+      while (_bench_n--) ADMIRE(recfib(40));
+    TVEC_BENCHMARK("iterfib, n = " STR(FIBLIMIT),
+                  &tvstate, tvec_benchstate, BTU_OP, 1)
+      while (_bench_n--) ADMIRE(iterfib(FIBLIMIT));
+    TVEC_BENCHMARK("expfib, n = " STR(FIBLIMIT),
+                  &tvstate, tvec_benchstate, BTU_OP, 1)
+      while (_bench_n--) ADMIRE(expfib(FIBLIMIT));
+  }
+
+  return (tvec_end(&tvstate));
+}
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/test/example/parse-machine b/test/example/parse-machine
new file mode 100644 (file)
index 0000000..34e375c
--- /dev/null
@@ -0,0 +1,29 @@
+#! /usr/bin/perl
+###
+### Demonstration of how to parse the `machine' output format
+###
+### (c) 2024 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the mLib utilities library.
+###
+### mLib is free software: you can redistribute it and/or modify it under
+### the terms of the GNU Library General Public License as published by
+### the Free Software Foundation; either version 2 of the License, or (at
+### your option) any later version.
+###
+### mLib is distributed in the hope that it will be useful, but WITHOUT
+### ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+### FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+### License for more details.
+###
+### You should have received a copy of the GNU Library General Public
+### License along with mLib.  If not, write to the Free Software
+### Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+### USA.
+
+package 
+
+###----- That's all, folks --------------------------------------------------
index c8db11432cfe7edd056c04a99e79470f80daaf26..dd9fb9ee726a6c31d3a7c765d96086691276477b 100644 (file)
@@ -28,6 +28,7 @@
 /*----- Header files ------------------------------------------------------*/
 
 #include "tvec.h"
+#include "tvec-types.h"
 
 #include "example.h"
 
@@ -48,9 +49,6 @@ enum {
 
 /*----- Addition test -----------------------------------------------------*/
 
-void test_add(const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
-  { out[RZ].v.i = add(in[RX].v.i, in[RY].v.i); }
-
 static const struct tvec_regdef add_regs[] = {
   { "x",       &tvty_int,      RX,     0,              { &tvrange_int } },
   { "y",       &tvty_int,      RY,     0,              { &tvrange_int } },
@@ -58,8 +56,11 @@ static const struct tvec_regdef add_regs[] = {
   TVEC_ENDREGS
 };
 
-#define ADD_TEST                                                       \
-  { "add",     add_regs,       0,              test_add }
+void test_add(const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
+  { out[RZ].v.i = add(in[RX].v.i, in[RY].v.i); }
+
+static const struct tvec_test add_test =
+  { "add",     add_regs,       0,              test_add };
 
 /*----- Greeting test -----------------------------------------------------*/
 
@@ -78,15 +79,15 @@ static const struct tvec_regdef greet_regs[] = {
   TVEC_ENDREGS
 };
 
-#define GREET_TEST                                                     \
-  { "greet",   greet_regs,     0,              test_greet }
+static const struct tvec_test greet_test =
+  { "greet",   greet_regs,     0,              test_greet };
 
 /*----- Main program ------------------------------------------------------*/
 
-static const struct tvec_test tests[] = {
-  ADD_TEST,
-  GREET_TEST,
-  TVEC_ENDTESTS
+static const struct tvec_test *const tests[] = {
+  &add_test,
+  &greet_test,
+  0
 };
 
 static const struct tvec_config test_config =
index 2f15779d5532aab15f6644354b66e63952945e79..a86f23022055453b3c77d103767a936601f8ebf0 100644 (file)
 
 /*----- Header files ------------------------------------------------------*/
 
-#include "tv.h"
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-remote.h"
+#include "tvec-timeout.h"
+#include "tvec-types.h"
 
 #include <sys/select.h>
 #include <sys/time.h>
 
+#include "tv.h"
+
 /*----- Register definitions ----------------------------------------------*/
 
 static const struct tvec_iassoc ienum_assocs[] = {
@@ -63,7 +68,7 @@ static const struct tvec_passoc penum_assocs[] = {
   { 0 }
 };
 
-#if __STDC_VERSION__x >= 199901
+#if __STDC_VERSION__ >= 199901
 #  define DSGINIT(x) x
 #else
 #  define DSGINIT(x)
@@ -214,7 +219,7 @@ static void common_run(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
 static void common_after(struct tvec_state *tv, void *ctx)
   { struct test_context *tctx = ctx; tctx->f = 0; }
 
-static const struct tvec_env common_testenv = {
+static const struct tvec_env common_env = {
   sizeof(struct test_context),
   common_setup, common_findvar,
   0, common_run, common_after,
@@ -223,6 +228,14 @@ static const struct tvec_env common_testenv = {
 
 /*----- Single-type copy tests --------------------------------------------*/
 
+#define COPYREG(name, i, ty, argslot, argval)                          \
+static DSGINIT(const) struct tvec_regdef name##_copyregs[] = {         \
+  { #name, &tvty_##ty, RVOUT, 0, DSGINIT({ .argslot = argval }) },     \
+  { 0 }                                                                        \
+};
+TYPEREGS(COPYREG)
+#undef COPYREG
+
 static void test_copy_simple
   (const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
   { out->v = in->v; }
@@ -258,16 +271,26 @@ static void test_copy_buffer
 #define test_copy_fltish test_copy_simple
 #define test_copy_dur test_copy_simple
 
-#define COPYREG(name, i, ty, argslot, argval)                          \
-       static DSGINIT(const) struct tvec_regdef name##_copyregs[] = {  \
-         { #name, &tvty_##ty, RVOUT, 0, DSGINIT({ .argslot = argval }) }, \
-         { 0 }                                                         \
-       };
-TYPEREGS(COPYREG)
-#undef COPYREG
+#define COPYTEST(name, i, ty, argslot, argval)                         \
+static const struct tvec_test copy_##name##_test =                     \
+  { "copy-" #name, name##_copyregs, &common_env, test_copy_##name };
+TYPEREGS(COPYTEST)
+#undef COPYTEST
 
 /*----- Single-type serialization tests -----------------------------------*/
 
+#define SERREG(name, i, ty, argslot, argval)                           \
+static DSGINIT(const) struct tvec_regdef name##_serregs[] = {          \
+  { #name,     &tvty_##ty,     RV,     0,                              \
+                                     DSGINIT({ .argslot = argval }) }, \
+  { "buf",     &tvty_bytes,    RSEROUT, 0 },                           \
+  { "rc",      &tvty_int,      RRC,    TVRF_OPT,                       \
+                                                   { &tvrange_int } }, \
+  TVEC_ENDREGS                                                         \
+};
+TYPEREGS(SERREG)
+#undef SERREG
+
 static void setup_regdef(struct tvec_regdef *rd, unsigned i,
                         struct tvec_state *tv)
 {
@@ -279,6 +302,14 @@ found:
   rd[0] = *r; rd[1].name = 0;
 }
 
+static void before_single_serialize(struct tvec_state *tv, void *ctx)
+{
+  if (!(tv->in[RRC].f&TVRF_LIVE)) {
+    tv->in[RRC].v.i = 0; tv->in[RRC].f |= TVRF_LIVE;
+    tv->out[RRC].f |= TVRF_LIVE;
+  }
+}
+
 static void test_single_serialize
   (const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
 {
@@ -289,8 +320,8 @@ static void test_single_serialize
   int rc;
 
   setup_regdef(rd, RV, tv);
-  rc = tvec_serialize(tv->in, DBUF_BUF(&b), rd, NREG,
-                     sizeof(struct tvec_reg));
+  rc = tvec_serialize(tv->in, DBUF_BUF(&b), rd,
+                     0, 0, NREG, sizeof(struct tvec_reg));
   out[RRC].v.i = rc;
   if (rc)
     out[RSEROUT].f &= ~TVRF_LIVE;
@@ -300,6 +331,45 @@ static void test_single_serialize
   }
 }
 
+static const struct tvec_env single_serialize_env = {
+  sizeof(struct test_context),
+  common_setup, common_findvar,
+  before_single_serialize, common_run, common_after,
+  0
+};
+#define SERTEST(name, i, ty, argslot, argval)                          \
+static const struct tvec_test serialize_##name##_test =                        \
+  { "serialize-" #name, name##_serregs,                                        \
+    &single_serialize_env, test_single_serialize };
+TYPEREGS(SERTEST)
+#undef SERTEST
+
+#define DESERREG(name, i, ty, argslot, argval)                         \
+static DSGINIT(const) struct tvec_regdef name##_deserregs[] = {                \
+  { "buf",     &tvty_bytes,    RSER,   0 },                            \
+  { #name,     &tvty_##ty,     RVOUT,  0,                              \
+                                     DSGINIT({ .argslot = argval }) }, \
+  { "left",    &tvty_uint,     RLEFT,  TVRF_OPT,                       \
+                                                  { &tvrange_size } }, \
+  { "rc",      &tvty_int,      RRC,    TVRF_OPT,                       \
+                                                   { &tvrange_int } }, \
+  TVEC_ENDREGS                                                         \
+};
+TYPEREGS(DESERREG)
+#undef DESERREG
+
+static void before_single_deserialize(struct tvec_state *tv, void *ctx)
+{
+  if (!(tv->in[RRC].f&TVRF_LIVE)) {
+    tv->in[RRC].v.i = 0; tv->in[RRC].f |= TVRF_LIVE;
+    tv->out[RRC].f |= TVRF_LIVE;
+  }
+  if (!(tv->in[RLEFT].f&TVRF_LIVE)) {
+    tv->in[RLEFT].v.u = 0; tv->in[RLEFT].f |= TVRF_LIVE;
+    tv->out[RLEFT].f |= TVRF_LIVE;
+  }
+}
+
 static void test_single_deserialize
   (const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
 {
@@ -311,67 +381,58 @@ static void test_single_deserialize
 
   setup_regdef(rd, RV, tv);
   buf_init(&b, in[RSER].v.bytes.p, in[RSER].v.bytes.sz);
-  rc = tvec_deserialize(tv->out, &b, rd, NREG, sizeof(struct tvec_reg));
+  rc = tvec_deserialize(tv->out, &b, rd,
+                       0, 0, NREG, sizeof(struct tvec_reg));
   out[RRC].v.i = rc;
   if (rc) out[RVOUT].f &= ~TVRF_LIVE;
 }
 
-#define SERREG(name, i, ty, argslot, argval)                           \
-       static DSGINIT(const) struct tvec_regdef name##_serregs[] = {   \
-         { #name,      &tvty_##ty,     RV,     0,                      \
-                                     DSGINIT({ .argslot = argval }) }, \
-         { "buf",      &tvty_bytes,    RSEROUT, 0 },                   \
-         { "rc",       &tvty_int,      RRC,    TVRF_OPT,               \
-                                                   { &tvrange_int } }, \
-         TVEC_ENDREGS                                                  \
-       };                                                              \
-       static DSGINIT(const) struct tvec_regdef name##_deserregs[] = { \
-         { "buf",      &tvty_bytes,    RSER,   0 },                    \
-         { #name,      &tvty_##ty,     RVOUT,  0,                      \
-                                     DSGINIT({ .argslot = argval }) }, \
-         { "left",     &tvty_uint,     RLEFT,  TVRF_OPT,               \
-                                                  { &tvrange_size } }, \
-         { "rc",       &tvty_int,      RRC,    TVRF_OPT,               \
-                                                   { &tvrange_int } }, \
-         TVEC_ENDREGS                                                  \
-       };
-TYPEREGS(SERREG)
-#undef SERREG
+static const struct tvec_env single_deserialize_env = {
+  sizeof(struct test_context),
+  common_setup, common_findvar,
+  before_single_deserialize, common_run, common_after,
+  0
+};
+#define DESERTEST(name, i, ty, argslot, argval)                                \
+static const struct tvec_test deserialize_##name##_test =              \
+  { "deserialize-" #name, name##_deserregs,                            \
+    &single_deserialize_env, test_single_deserialize };
+TYPEREGS(DESERTEST)
+#undef DESERTEST
 
-static void before_single_serialize(struct tvec_state *tv, void *ctx)
-{
-  if (!(tv->in[RRC].f&TVRF_LIVE)) {
-    tv->in[RRC].v.i = 0; tv->in[RRC].f |= TVRF_LIVE;
-    tv->out[RRC].f |= TVRF_LIVE;
-  }
-}
+/*----- Multi-type serialization test -------------------------------------*/
 
-static void before_single_deserialize(struct tvec_state *tv, void *ctx)
+static const struct tvec_iassoc reg_assocs[] = {
+  { "none",            -1 },
+#define DEFASSOC(name, i, ty, argslot, argval) { #name, i },
+  TYPEREGS(DEFASSOC)
+#undef DEFASSOC
+  { 0,                 0 }
+};
+static const struct tvec_ienuminfo reg_enum = { "reg", reg_assocs, 0 };
+
+static DSGINIT(const) struct tvec_regdef multi_serialize_regs[] = {
+#define DEFREG(name, i, ty, argslot, argval)                           \
+  { #name,     &tvty_##ty,     i,      TVRF_OPT,                       \
+                                     DSGINIT({ .argslot = argval }) },
+  TYPEREGS(DEFREG)
+#undef DEFREG
+
+  { "rc",      &tvty_int,      RRC,    TVRF_OPT,       { &tvrange_int } },
+  { "serialized", &tvty_bytes, RSEROUT, TVRF_OPT },
+  { "sabotage",        &tvty_ienum,    RSAB,   TVRF_OPT,       { &reg_enum } },
+
+  TVEC_ENDREGS
+};
+
+static void before_multi_serialize(struct tvec_state *tv, void *ctx)
 {
   if (!(tv->in[RRC].f&TVRF_LIVE)) {
     tv->in[RRC].v.i = 0; tv->in[RRC].f |= TVRF_LIVE;
     tv->out[RRC].f |= TVRF_LIVE;
   }
-  if (!(tv->in[RLEFT].f&TVRF_LIVE)) {
-    tv->in[RLEFT].v.u = 0; tv->in[RLEFT].f |= TVRF_LIVE;
-    tv->out[RLEFT].f |= TVRF_LIVE;
-  }
 }
 
-static const struct tvec_env single_serialize_testenv = {
-  sizeof(struct test_context),
-  common_setup, common_findvar,
-  before_single_serialize, common_run, common_after,
-  0
-}, single_deserialize_testenv = {
-  sizeof(struct test_context),
-  common_setup, common_findvar,
-  before_single_deserialize, common_run, common_after,
-  0
-};
-
-/*----- Multi-type serialization test -------------------------------------*/
-
 static void test_multi_serialize
   (const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
 {
@@ -382,7 +443,7 @@ static void test_multi_serialize
   dbuf b = DBUF_INIT;
 
   if (tvec_serialize(tv->in, DBUF_BUF(&b), tv->test->regs,
-                    NTY, sizeof(struct tvec_reg)))
+                    0, 0, NTY, sizeof(struct tvec_reg)))
     { out[RRC].v.i = -1; goto end; }
   tvec_allocbytes(&out[RSEROUT].v, DBLEN(&b));
   memcpy(out[RSEROUT].v.bytes.p, DBBASE(&b), DBLEN(&b));
@@ -390,7 +451,7 @@ static void test_multi_serialize
   buf_flip(DBUF_BUF(&b));
 
   if (tvec_deserialize(tv->out, DBUF_BUF(&b), tv->test->regs,
-                      NTY, sizeof(struct tvec_reg)))
+                      0, 0, NTY, sizeof(struct tvec_reg)))
     { out[RRC].v.i = -2; goto end; }
   if (BLEFT(&b._b))
     { out[RRC].v.i = -3; goto end; }
@@ -408,8 +469,7 @@ static void test_multi_serialize
     } else if (rd->ty == &tvty_penum)
       rv->p = rv->p
        ? 0
-       : (/*unconst*/ void *)
-       ((const struct tvec_penuminfo *)rd->arg.p)->av[0].p;
+       : UNCONST(void, ((const struct tvec_penuminfo *)rd->arg.p)->av[0].p);
     else if (rd->ty == &tvty_text)
       { if (rv->text.sz) rv->text.p[0] ^= 1; }
     else if (rd->ty == &tvty_bytes)
@@ -421,46 +481,25 @@ end:
   dbuf_destroy(&b);
 }
 
-static const struct tvec_iassoc reg_assocs[] = {
-  { "none",            -1 },
-#define DEFASSOC(name, i, ty, argslot, argval) { #name, i },
-  TYPEREGS(DEFASSOC)
-#undef DEFASSOC
-  { 0,                 0 }
-};
-static const struct tvec_ienuminfo reg_enum = { "reg", reg_assocs, 0 };
-
-static DSGINIT(const) struct tvec_regdef multi_serialize_regs[] = {
-#define DEFREG(name, i, ty, argslot, argval)                           \
-  { #name,     &tvty_##ty,     i,      TVRF_OPT,                       \
-                                     DSGINIT({ .argslot = argval }) },
-  TYPEREGS(DEFREG)
-#undef DEFREG
-
-  { "rc",      &tvty_int,      RRC,    TVRF_OPT,       { &tvrange_int } },
-  { "serialized", &tvty_bytes, RSEROUT, TVRF_OPT },
-  { "sabotage",        &tvty_ienum,    RSAB,   TVRF_OPT,       { &reg_enum } },
-
-  TVEC_ENDREGS
-};
-
-static void before_multi_serialize(struct tvec_state *tv, void *ctx)
-{
-  if (!(tv->in[RRC].f&TVRF_LIVE)) {
-    tv->in[RRC].v.i = 0; tv->in[RRC].f |= TVRF_LIVE;
-    tv->out[RRC].f |= TVRF_LIVE;
-  }
-}
-
-static const struct tvec_env multi_serialize_testenv = {
+static const struct tvec_env multi_serialize_env = {
   sizeof(struct test_context),
   common_setup, common_findvar,
   before_multi_serialize, common_run, common_after,
   0
 };
+static const struct tvec_test multi_serialize_test =
+  { "multi", multi_serialize_regs, &multi_serialize_env,
+    test_multi_serialize };
 
 /*----- Crash test --------------------------------------------------------*/
 
+static const struct tvec_regdef crash_regs[] = {
+  { "crash",   &tvty_ienum,    RSAB,   0,              { &tvenum_bool } },
+  { "x",       &tvty_uint,     RV,     0,              { &tvrange_uint } },
+  { "z",       &tvty_uint,     RVOUT,  0,              { &tvrange_uint } },
+  TVEC_ENDREGS
+};
+
 static void test_crash(const struct tvec_reg *in, struct tvec_reg *out,
                       void *ctx)
 {
@@ -468,18 +507,19 @@ static void test_crash(const struct tvec_reg *in, struct tvec_reg *out,
   if (in[RSAB].v.i) abort();
 }
 
-static const struct tvec_remotefork crash_testenv =
+static const struct tvec_remotefork crash_env =
   { TVEC_REMOTEFORK(0, 0) };
+static const struct tvec_test crash_test =
+  { "crash",   crash_regs,     &crash_env._env, test_crash };
 
-static const struct tvec_regdef crash_regs[] = {
-  { "crash",   &tvty_ienum,    RSAB,   0,              { &tvenum_bool } },
-  { "x",       &tvty_uint,     RV,     0,              { &tvrange_uint } },
-  { "z",       &tvty_uint,     RVOUT,  0,              { &tvrange_uint } },
+/*----- Sleep test --------------------------------------------------------*/
+
+static const struct tvec_regdef sleep_regs[] = {
+  { "time",    &tvty_duration, RV,     0,              { &tvflt_nonneg } },
+  { "z",       &tvty_float,    RVOUT,  0,              { &tvflt_nonneg } },
   TVEC_ENDREGS
 };
 
-/*----- Sleep test --------------------------------------------------------*/
-
 static void test_sleep(const struct tvec_reg *in, struct tvec_reg *out,
                       void *ctx)
 {
@@ -501,34 +541,24 @@ static void test_sleep(const struct tvec_reg *in, struct tvec_reg *out,
 
 static const struct tvec_timeoutenv sleep_subenv =
   { TVEC_TIMEOUTINIT(ITIMER_REAL, 0.25) };
-static const struct tvec_remotefork sleep_testenv =
+static const struct tvec_remotefork sleep_env =
   { TVEC_REMOTEFORK(&sleep_subenv._env, 0) };
-
-static const struct tvec_regdef sleep_regs[] = {
-  { "time",    &tvty_duration, RV,     0,              { &tvflt_nonneg } },
-  { "z",       &tvty_float,    RVOUT,  0,              { &tvflt_nonneg } },
-  TVEC_ENDREGS
-};
+static const struct tvec_test sleep_test =
+  { "sleep",   sleep_regs,     &sleep_env._env, test_sleep };
 
 /*----- Front end ---------------------------------------------------------*/
 
-static const struct tvec_test tests[] = {
-  { "multi",   multi_serialize_regs, &multi_serialize_testenv,
-                                               test_multi_serialize },
+static const struct tvec_test *const tests[] = {
+  &multi_serialize_test,
+  &sleep_test,
+  &crash_test,
 
 #define DEFSINGLE(name, i, ty, argslot, argval)                                \
-  { "copy-" #name, name##_copyregs,    &common_testenv, test_copy_##name }, \
-  { "serialize-" #name, name##_serregs,        &single_serialize_testenv, \
-                                               test_single_serialize }, \
-  { "deserialize-" #name, name##_deserregs, &single_deserialize_testenv, \
-                                               test_single_deserialize },
+  &copy_##name##_test, &serialize_##name##_test, &deserialize_##name##_test,
   TYPEREGS(DEFSINGLE)
 #undef DEFSINGLE
 
-  { "crash",   crash_regs,     &crash_testenv._env, test_crash },
-  { "sleep",   sleep_regs,     &sleep_testenv._env, test_sleep },
-
-  TVEC_ENDTESTS
+  0
 };
 
 static const struct tvec_config testconfig = {
@@ -538,7 +568,7 @@ static const struct tvec_config testconfig = {
 
 int main(int argc, char *argv[])
 {
-#if __STDC_VERSION__x < 199901
+#if __STDC_VERSION__ < 199901
 #  define POKE(name, i, ty, argslot, argval)                           \
        multi_serialize_regs[i].arg.argslot = argval;                   \
        name##_copyregs->arg.argslot = argval;                          \
index 8b994d3af11150cff5272d6cbd7d761b36dddb00..e8e71dccae83f145398b0db1ec0c34e9035fff95 100644 (file)
@@ -55,7 +55,7 @@ tvec-adhoc \- ad-hoc testing with the test vector framework
 .SH SYNOPSIS
 .
 .nf
-.B "#include <mLib/tvec.h>"
+.B "#include <mLib/tvec-adhoc.h>"
 .PP
 .BI "const struct tvec_config tvec_adhocconfig;"
 .BI "void tvec_adhoc(struct tvec_state *" tv ", struct tvec_test *" t );
diff --git a/test/tvec-adhoc.h b/test/tvec-adhoc.h
new file mode 100644 (file)
index 0000000..6dd83bc
--- /dev/null
@@ -0,0 +1,244 @@
+/* -*-c-*-
+ *
+ * Test-vector framework ad-hoc testing interface
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_TVEC_ADHOC_H
+#define MLIB_TVEC_ADHOC_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <stdarg.h>
+
+#ifndef MLIB_TVEC_H
+#  include "tvec.h"
+#endif
+
+/*----- Data structures ---------------------------------------------------*/
+
+extern const struct tvec_config tvec_adhocconfig;
+  /* A special @struct tvec_config@ to use for programs which perform ad-hoc
+   * testing.
+   */
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @tvec_adhoc@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *
+ * Returns:    ---
+ *
+ * Use:                Begin ad-hoc testing, i.e., without reading a file of
+ *             test-vector data.
+ *
+ *             The other functions in this section assume that @tvec_adhoc@
+ *             has been called.
+ */
+
+extern void tvec_adhoc(struct tvec_state */*tv*/);
+
+/* --- @tvec_begingroup@, @TVEC_BEGINGROUP@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const char *name@ = name for this test group
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *
+ * Returns:    ---
+ *
+ * Use:                Begin an ad-hoc test group with the given name.  The @file@
+ *             and @lno@ can be anything, but it's usually best if they
+ *             refer to the source code performing the test: the macro
+ *             @TVEC_BEGINGROUP@ does this automatically.
+ */
+
+extern void tvec_begingroup(struct tvec_state */*tv*/, const char */*name*/,
+                           const char */*file*/, unsigned /*lno*/);
+#define TVEC_BEGINGROUP(tv, name)                                      \
+       do tvec_begingroup(tv, name, __FILE__, __LINE__); while (0)
+
+/* --- @tvec_endgroup@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *
+ * Returns:    ---
+ *
+ * Use:                End an ad-hoc test group.  The statistics are updated and the
+ *             outcome is reported to the output formatter.
+ */
+
+extern void tvec_endgroup(struct tvec_state */*tv*/);
+
+/* --- @TVEC_TESTGROUP@, @TVEC_TESTGROUP_TAG@ --- *
+ *
+ * Arguments:  @tag@ = label-disambiguation tag
+ *             @const struct tvec_state *tv = test-vector state
+ *             @const char *name@ = test-group name
+ *
+ * Returns:    ---
+ *
+ * Use:                Control-structure macro: @TVEC_TESTGROUP(tv, name) stmt@
+ *             establishes a test group with the given @name@ (attributing
+ *             it to the source file and lie number), executes @stmt@, and
+ *             ends the test group.  If @stmt@ invokes @break@ then the test
+ *             group is skipped.  @TVEC_TESTGROUP_TAG@ is the same, with an
+ *             additional @tag@ argument for use in higher-level macros.
+ */
+
+#define TVEC_TESTGROUP_TAG(tag, tv, name)                              \
+       MC_WRAP(tag##__around,                                          \
+         { TVEC_BEGINGROUP(tv, name); },                               \
+         { tvec_endgroup(tv); },                                       \
+         { if (!((tv)->f&TVSF_SKIP)) tvec_skipgroup(tv, 0);            \
+           tvec_endgroup(tv); })
+#define TVEC_TESTGROUP(tv, name) TVEC_TESTGROUP_TAG(grp, tv, name)
+
+/* --- @tvec_begintest@, @TVEC_BEGINTEST@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *
+ * Returns:    ---
+ *
+ * Use:                Begin an ad-hoc test case.  The @file@ and @lno@ can be
+ *             anything, but it's usually best if they refer to the source
+ *             code performing the test: the macro @TVEC_BEGINGROUP@ does
+ *             this automatically.
+ */
+
+extern void tvec_begintest(struct tvec_state */*tv*/,
+                          const char */*file*/, unsigned /*lno*/);
+#define TVEC_BEGINTEST(tv)                                             \
+       do tvec_begintest(tv, __FILE__, __LINE__); while (0)
+
+/* --- @tvec_endtest@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *
+ * Returns:    ---
+ *
+ * Use:                End an ad-hoc test case,  The statistics are updated and the
+ *             outcome is reported to the output formatter.
+ */
+
+extern void tvec_endtest(struct tvec_state */*tv*/);
+
+/* --- @TVEC_TEST@, @TVEC_TEST_TAG@ --- *
+ *
+ * Arguments:  @tag@ = label-disambiguation tag
+ *             @struct tvec_test *t@ = space for a test definition
+ *
+ * Returns:    ---
+ *
+ * Use:                Control-structure macro: @TVEC_TEST(tv) stmt@ begins a test
+ *             case, executes @stmt@, and ends the test case.  If @stmt@
+ *             invokes @break@ then the test case is skipped.
+ *             @TVEC_TEST_TAG@ is the same, with an additional @tag@ argumet
+ *             for use in higher-level macros.
+ */
+
+#define TVEC_TEST_TAG(tag, tv)                                         \
+       MC_WRAP(tag##__around,                                          \
+         { TVEC_BEGINTEST(tv); },                                      \
+         { tvec_endtest(tv); },                                        \
+         { if ((tv)->f&TVSF_ACTIVE) tvec_skip((tv), 0);                \
+           tvec_endtest(tv); })
+#define TVEC_TEST(tv) TVEC_TEST_TAG(test, tv)
+
+/* --- @tvec_claim@, @tvec_claim_v@, @TVEC_CLAIM@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @int ok@ = a flag
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *msg@, @va_list *ap@ = message to report on
+ *                     failure
+ *
+ * Returns:    The value @ok@.
+ *
+ * Use:                Check that a claimed condition holds, as (part of) a test.
+ *             If no test case is underway (i.e., if @TVSF_OPEN@ is reset in
+ *             @tv->f@), then a new test case is begun and ended.  The
+ *             @file@ and @lno@ are passed to the output formatter to be
+ *             reported in case of a failure.  If @ok@ is nonzero, then
+ *             nothing else happens; so, in particular, if @tvec_claim@
+ *             established a new test case, then the test case succeeds.  If
+ *             @ok@ is zero, then a failure is reported, quoting @msg@.
+ *
+ *             The @TVEC_CLAIM@ macro is similar, only it (a) identifies the
+ *             file and line number of the call site automatically, and (b)
+ *             implicitly quotes the source text of the @ok@ condition in
+ *             the failure message.
+ */
+
+extern PRINTF_LIKE(5, 6)
+  int tvec_claim(struct tvec_state */*tv*/, int /*ok*/,
+                const char */*file*/, unsigned /*lno*/,
+                const char */*msg*/, ...);
+extern int tvec_claim_v(struct tvec_state */*tv*/, int /*ok*/,
+                       const char */*file*/, unsigned /*lno*/,
+                       const char */*msg*/, va_list */*ap*/);
+#define TVEC_CLAIM(tv, cond)                                           \
+       (tvec_claim(tv, !!(cond), __FILE__, __LINE__, "%s untrue", #cond))
+
+/* --- @tvec_claimeq@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const struct tvec_regty *ty@ = register type
+ *             @const union tvec_misc *arg@ = register type argument
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if the input and output values of register 0 are
+ *             equal, zero if they differ.
+ *
+ * Use:                Check that the input and output values of register 0 are
+ *             equal (according to the register type @ty@).  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped.
+ *
+ *             This function is not expected to be called directly, but
+ *             through type-specific wrapper functions or macros such as
+ *             @TVEC_CLAIMEQ_INT@.
+ */
+
+extern int tvec_claimeq(struct tvec_state */*tv*/,
+                       const struct tvec_regty */*ty*/,
+                       const union tvec_misc */*arg*/,
+                       const char */*file*/, unsigned /*lno*/,
+                       const char */*expr*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index ffd7e8db9ea387d9fbc1f2f36bf44d047bccde5d..40bdc5e6f6095d4c11d420136f11e1496e764fcf 100644 (file)
@@ -31,6 +31,8 @@
 .TH tvec-bench 3mLib "11 March 2024" "Straylight/Edgeware" "mLib utilities library"
 .\" @TVEC_BENCHENV
 .\" @TVEC_BENCHINIT
+.\" @tvec_benchstate
+.\" @tvec_benchoutputfallback
 .\" @tvec_benchreport
 .
 .\"--------------------------------------------------------------------------
@@ -41,7 +43,7 @@ tvec-bench \- benchmarking with the test vector framework
 .SH SYNOPSIS
 .
 .nf
-.B "#include <mLib/tvec.h>"
+.B "#include <mLib/tvec-bench.h>"
 .PP
 .ta 2n
 .B "struct tvec_benchenv {"
@@ -51,15 +53,25 @@ tvec-bench \- benchmarking with the test vector framework
 .B "   int riter, rbuf;"
 .B "   const struct tvec_env *env;"
 .B "};"
-.B "struct bench_state *tvec_benchstate;"
 .B "#define TVEC_BENCHENV ..."
 .B "#define TVEC_BENCHINIT ..."
+.PP
+.B "struct bench_state *tvec_benchstate;"
+.PP
+.B "#define TVEC_BENCHOUTEXT ""tvec-bench"""
 .B "enum {"
 .B "   TVBU_OP = ...,"
 .B "   TVBU_BYTE = ...,"
 .B "   ...,"
 .B "   TVBU_LIMIT"
 .B "};"
+.B "struct tvec_benchoutops {"
+.BI "  void (*" bbench ")(struct tvec_output *" o ", unsigned " unit );
+.ta 2n +\w'\fBvoid (*\,\fIebench\/\fB)('u
+.BI "  void (*" ebench ")(struct tvec_output *" o ", unsigned " unit ,
+.BI "          const struct bench_timing *" tm );
+.B "};"
+.B "extern const struct tvec_benchoutops tvec_benchoutputfallback;"
 .PP
 .ta \w'\fBvoid tvec_benchreport('u
 .BI "void tvec_benchreport(const struct gprintf_ops *" gops ", void *" go ,
index 22bd2e3ce570c9efb46d2c3fd06e4338a8b2cfaa..c4e123d50c0c7ebab93afdd9787703e4797eac6b 100644 (file)
 /*----- Header files ------------------------------------------------------*/
 
 #include "bench.h"
+
 #include "tvec.h"
+#include "tvec-bench.h"
+#include "tvec-output.h"
+#include "tvec-types.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
@@ -45,165 +49,186 @@ struct benchrun {
 
 struct bench_state *tvec_benchstate;   /* common benchmarking state */
 
-/*----- Utilities ---------------------------------------------------------*/
+/*----- Output utilities --------------------------------------------------*/
 
-/* --- @normalize@ --- *
+/* --- @tvec_benchreport@ --- *
  *
- * Arguments:  @double *x_inout@ = address of a value to normalize
- *             @const char **unit_out@ = address to store unit prefix
- *             @double scale@ = scale factor for unit steps
+ * Arguments:  @const struct gprintf_ops *gops@ = print operations
+ *             @void *go@ = print destination
+ *             @unsigned unit@ = the unit being measured (@TVBU_...@)
+ *             @unsigned style@ = output style (@TVSF_...@)
+ *             @const struct bench_timing *t@ = the benchmark result
  *
  * Returns:    ---
  *
- * Use:                Adjust @*x_inout@ by a power of @scale@, and set @*unit_out@
- *             so that printing the two reflects the original value with an
- *             appropriate SI unit scaling.  The @scale@ should be 1024 for
- *             binary quantities, most notably memory sizes, or 1000 for
- *             other quantities.
+ * Use:                Formats a report about the benchmark performance.  This
+ *             function is intended to be called on by an output
+ *             @ebench@ function.
  */
 
-static void normalize(double *x_inout, const char **unit_out, double scale)
+void tvec_benchreport(const struct gprintf_ops *gops, void *go,
+                     unsigned unit, unsigned style,
+                     const struct bench_timing *t)
 {
-  static const char
-    *const nothing = "",
-    *const big[] = { "k", "M", "G", "T", "P", "E", 0 },
-    *const little[] = { "m", "µ", "n", "p", "f", "a", 0 };
-  const char *const *u;
-  double x = *x_inout;
-
-  if (x < 1)
-    for (u = little, x *= scale; x < 1 && u[1]; u++, x *= scale);
-  else if (x >= scale)
-    for (u = big, x /= scale; x >= scale && u[1]; u++, x /= scale);
-  else
-    u = &nothing;
-
-  *x_inout = x; *unit_out = *u;
+  if (!t) {
+    if (style&TVSF_RAW) gprintf(gops, go, "FAILED");
+    else gprintf(gops, go, "benchmark FAILED");
+  } else if (!(style&TVSF_RAW))
+    bench_report(gops, go, unit, t);
+  else {
+    switch (unit) {
+      case BTU_OP: gprintf(gops, go, "ops=%.0f", t->n); break;
+      case BTU_BYTE: gprintf(gops, go, "bytes=%.0f", t->n); break;
+      default: assert(0);
+    }
+    gprintf(gops, go, " sec=%.6g", t->t);
+    if (t->f&BTF_CYOK) gprintf(gops, go, " cy=%.0f", t->cy);
+  }
 }
 
-/* --- @benchloop_...@ --- *
+/*----- Default output implementation -------------------------------------*/
+
+/* --- @fallback_bbench@ --- *
  *
- * Arguments:  @unsigned long n@ = iteration count
- *             @void *ctx@ = benchmark running context
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct fallback_output@
+ *             @const char *desc@ = adhoc test description
+ *             @unsigned unit@ = measurement unit (@TVBU_...@)
  *
  * Returns:    ---
  *
- * Use:                Run various kinds of benchmarking loops.
+ * Use:                Report that a benchmark has started.
+ *
+ *             The fallback implementation does nothing here.  All of the
+ *             reporting happens in @fallback_ebench@.
+ */
+
+static void fallback_bbench(struct tvec_output *o,
+                           const char *desc, unsigned unit)
+  { ; }
+
+/* --- @fallback_ebench@ --- *
  *
- *               * The @..._outer_...@ functions call the underlying
- *                 function @n@ times in a loop; by contrast, the
- *                 @..._inner_...@ functions set a register value to the
- *                 chosen iteration count and expect the underlying function
- *                 to perform the loop itself.
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct fallback_output@
+ *             @const char *desc@ = adhoc test description
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
+ *             @const struct bench_timing *t@ = measurement
  *
- *               * The @..._direct@ functions just call the underlying test
- *                 function directly (though still through an `indirect
- *                 jump' instruction); by contrast, the @..._indirect@
- *                 functions invoke a subsidiary environment's @run@
- *                 function, which adds additional overhead.
+ * Returns:    ---
+ *
+ * Use:                Report a benchmark's results
+ *
+ *             The fallback implementation just delegates to the default
+ *             benchmark reporting to produce a line written through the
+ *             standard @report@ output operation.
  */
 
-static void benchloop_outer_direct(unsigned long n, void *ctx)
+static void fallback_ebench(struct tvec_output *o,
+                           const char *desc, unsigned unit,
+                           const struct bench_timing *t)
 {
-  struct benchrun *r = ctx;
-  tvec_testfn *fn = r->fn; void *tctx = r->ctx;
-  const struct tvec_reg *in = r->in; struct tvec_reg *out = r->out;
+  struct tvec_fallbackoutput *fo = (struct tvec_fallbackoutput *)o;
+  struct tvec_state *tv = fo->tv;
+  const struct tvec_regdef *rd;
+  dstr d = DSTR_INIT;
+  unsigned f = 0;
+#define f_any 1u
 
-  while (n--) fn(in, out, tctx);
-}
+  /* Build the identification string. */
+  dstr_putf(&d, "%s ", tv->test->name);
+  if (desc)
+    DPUTS(&d, desc);
+  else
+    for (rd = tv->test->regs; rd->name; rd++)
+      if (rd->f&TVRF_ID) {
+       if (f&f_any) DPUTS(&d, ", ");
+       else f |= f_any;
+       dstr_putf(&d, "%s = ", rd->name);
+       rd->ty->dump(&TVEC_REG(tv, in, rd->i)->v, rd, TVSF_COMPACT,
+                    &dstr_printops, &d);
+      }
+  DPUTS(&d, ": ");
 
-static void benchloop_inner_direct(unsigned long n, void *ctx)
-  { struct benchrun *r = ctx; *r->n = n; r->fn(r->in, r->out, r->ctx); }
+  /* Report the benchmark results. */
+  tvec_benchreport(&dstr_printops, &d, unit, 0, t);
+  DPUTZ(&d);
 
-static void benchloop_outer_indirect(unsigned long n, void *ctx)
-{
-  struct benchrun *r = ctx;
-  struct tvec_state *tv = r->tv;
-  void (*run)(struct tvec_state *, tvec_testfn, void *) = r->env->run;
-  tvec_testfn *fn = r->fn; void *tctx = r->ctx;
+  /* Write the result. */
+  tvec_info(tv, "%s", d.buf);
+  DDESTROY(&d);
 
-  while (n--) run(tv, fn, tctx);
+#undef f_any
 }
 
-static void benchloop_inner_indirect(unsigned long n, void *ctx)
-  { struct benchrun *r = ctx; *r->n = n; r->env->run(r->tv, r->fn, r->ctx); }
+const struct tvec_benchoutops tvec_benchoutputfallback =
+  { fallback_bbench, fallback_ebench };
 
-/*----- Output utilities --------------------------------------------------*/
+/*----- Benchmark environment scaffolding ---------------------------------*/
 
-/* --- @tvec_benchreport@ --- *
+/* --- @tvec_benchprep@ --- *
  *
- * Arguments:  @const struct gprintf_ops *gops@ = print operations
- *             @void *go@ = print destination
- *             @unsigned unit@ = the unit being measured (~TVBU_...@)
- *             @unsigned style@ = output style (@TVSF_...@)
- *             @const struct bench_timing *tm@ = the benchmark result
+ * Arguments:  @struct tvec_state *tv@ = test vector state
+ *             @struct bench_state **bst_inout@ = benchmark state (updated)
+ *             @unsigned f@ = calibration flags
  *
- * Returns:    ---
+ * Returns:    Zero on success, %$-1$% on failure.
  *
- * Use:                Formats a report about the benchmark performance.  This
- *             function is intended to be called on by an output
- *             @ebench@ function.
+ * Use:                If @*bst_inout@ is null then allocate and initialize a fresh
+ *             benchmark state with a default timer, and @*bst_inout@ is
+ *             updated to point to the fresh state.  The storage for the
+ *             state was allocated using the test vector state's arena.
+ *
+ *             If the benchmark state hasn't been calibrated, then this is
+ *             done, passing @f@ to @bench_calibrate@.
+ *
+ *             On failure, the test group is skipped, reporting a suitable
+ *             message, and %$-1$% is returned.  If a fresh benchmark state
+ *             was allocated, but calibration failed, the state is
+ *             %%\emph{not}%% released.
  */
 
-void tvec_benchreport(const struct gprintf_ops *gops, void *go,
-                     unsigned unit, unsigned style,
-                     const struct bench_timing *tm)
+int tvec_benchprep(struct tvec_state *tv,
+                  struct bench_state **bst_inout, unsigned f)
 {
-  double scale, x, n = tm->n;
-  const char *u, *what, *whats;
+  dstr d = DSTR_INIT;
+  struct bench_timer *bt;
+  struct bench_state *b;
+  int rc;
 
-  if (!tm) {
-    if (style&TVSF_RAW) gprintf(gops, go, "FAILED");
-    else gprintf(gops, go, "benchmark FAILED");
-    return;
+  /* Set up the benchmarking state if it hasn't been done before. */
+  if (*bst_inout)
+    b = *bst_inout;
+  else {
+    bt = bench_createtimer(0);
+      if (!bt)
+       { tvec_skipgroup(tv, "failed to create timer"); goto timer_failed; }
+    X_NEW(b, tv->a); bench_init(b, bt); *bst_inout = b;
   }
 
-  assert(tm->f&BTF_TIMEOK);
-
-  switch (unit) {
-    case TVBU_OP:
-      if (style&TVSF_RAW) gprintf(gops, go, "ops=%.0f", n);
-      else gprintf(gops, go, "%.0f iterations ", n);
-      what = "op"; whats = "ops"; scale = 1000;
-      break;
-    case TVBU_BYTE:
-      if (style&TVSF_RAW)
-       gprintf(gops, go, "bytes=%.0f", n);
-      else {
-       x = n;
-       normalize(&x, &u, 1024); gprintf(gops, go, " %.3f %sB ", x, u);
-      }
-      what = whats = "B"; scale = 1024;
-      break;
-    default:
-      abort();
-  }
+  /* If the timer isn't calibrated yet then do that now. */
+  if (!(b->f&BTF_CLB)) {
+    b->tm->ops->describe(b->tm, &d);
+    tvec_notice(tv, "calibrating timer `%s'...", d.buf);
+    if (bench_calibrate(b, f))
+      { tvec_skipgroup(tv, "failed to calibrate timer"); goto timer_failed; }
+  } else if (!(b->f&BTF_ANY))
+    { tvec_skipgroup(tv, "timer broken"); goto timer_failed; }
 
-  if (style&TVSF_RAW) {
-    gprintf(gops, go, " sec=%.6g", tm->t);
-    if (tm->f&BTF_CYOK) gprintf(gops, go, " cy=%.0f", tm->cy);
-    return;
-  }
+  rc = 0; goto end;
 
-  x = tm->t; normalize(&x, &u, 1000);
-  gprintf(gops, go, "in %.3f %ss", x, u);
-  if (tm->f&BTF_CYOK) {
-    x = tm->cy; normalize(&x, &u, 1000);
-    gprintf(gops, go, " (%.3f %scy)", x, u);
-  }
-  gprintf(gops, go, ": ");
-
-  x = n/tm->t; normalize(&x, &u, scale);
-  gprintf(gops, go, "%.3f %s%s/s", x, u, whats);
-  x = tm->t/n; normalize(&x, &u, 1000);
-  gprintf(gops, go, ", %.3f %ss/%s", x, u, what);
-  if (tm->f&BTF_CYOK) {
-    x = tm->cy/n; normalize(&x, &u, 1000);
-    gprintf(gops, go, " (%.3f %scy/%s)", x, u, what);
-  }
-}
+timer_failed:
+  /* Give a `helpful' hint if the timer didn't work. */
+  if (!getenv("MLIB_BENCH_DEBUG"))
+    tvec_notice(tv, "set `MLIB_BENCH_DEBUG=t' in the environment "
+               "for more detail");
+  rc = -1;
+  goto end;
 
-/*----- Benchmark environment scaffolding ---------------------------------*/
+end:
+  dstr_destroy(&d);
+  return (rc);
+}
 
 /* --- @tvec_benchsetup@ --- *
  *
@@ -232,49 +257,12 @@ void tvec_benchsetup(struct tvec_state *tv, const struct tvec_env *env,
   struct tvec_benchctx *bc = ctx;
   const struct tvec_benchenv *be = (const struct tvec_benchenv *)env;
   const struct tvec_env *subenv = be->env;
-  struct bench_timer *bt;
-  dstr d = DSTR_INIT;
 
-  /* Basic initialization. */
   bc->be = be; bc->bst = 0; bc->subctx = 0;
-
-  /* Set up the benchmarking state if it hasn't been done before. */
-  if (be->bst && *be->bst)
-    bc->bst = *be->bst;
-  else {
-    bt = bench_createtimer(0);
-    if (!bt)
-      { tvec_skipgroup(tv, "failed to create timer"); goto timer_failed; }
-    bc->bst = xmalloc(sizeof(*bc->bst)); bench_init(bc->bst, bt);
-    *be->bst = bc->bst;
-  }
-
-  /* If the timer isn't calibrated yet then do that now. */
-  if (!(bc->bst->f&BTF_CLB)) {
-    bc->bst->tm->ops->describe(bc->bst->tm, &d);
-    tvec_notice(tv, "calibrating timer `%s'...", d.buf);
-    if (bench_calibrate(bc->bst))
-      { tvec_skipgroup(tv, "failed to calibrate timer"); goto timer_failed; }
-  } else if (!(bc->bst->f&BTF_ANY))
-    { tvec_skipgroup(tv, "timer broken"); goto timer_failed; }
-
-  /* Save the default target time. */
-  bc->dflt_target = bc->bst->target_s;
-
-  /* Initialize the subordinate environment. */
-end:
-  if (subenv && subenv->ctxsz) bc->subctx = xmalloc(subenv->ctxsz);
+  if (!tvec_benchprep(tv, be->bst, BTF_INDIRECT))
+    { bc->bst = *be->bst; bc->dflt_target = bc->bst->target_s; }
+  if (subenv && subenv->ctxsz) bc->subctx = x_alloc(tv->a, subenv->ctxsz);
   if (subenv && subenv->setup) subenv->setup(tv, subenv, bc, bc->subctx);
-
-  /* All done. */
-  dstr_destroy(&d);
-  return;
-
-timer_failed:
-  if (!getenv("MLIB_BENCH_DEBUG"))
-    tvec_notice(tv, "set `MLIB_BENCH_DEBUG=t' in the environment "
-               "for more detail");
-  goto end;
 }
 
 /* --- @tvec_benchfindvar@, @setvar@ --- *
@@ -363,58 +351,46 @@ void tvec_benchrun(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
   struct tvec_benchctx *bc = ctx;
   const struct tvec_benchenv *be = bc->be;
   const struct tvec_env *subenv = be->env;
-  const struct tvec_regdef *rd;
   struct tvec_output *o = tv->output;
-  struct bench_timing tm;
-  struct benchrun r;
-  bench_fn *loopfn;
+  struct tvec_fallbackoutput fo;
+  const struct tvec_benchoutops *bo;
+  BENCH_MEASURE_DECLS;
+  struct bench_timing t;
+  unsigned long *n;
   unsigned unit;
-  dstr d = DSTR_INIT;
   double base;
-  unsigned f = 0;
-#define f_any 1u
-
-  /* Fill in the easy parts of the run context. */
-  r.tv = tv; r.env = subenv; r.ctx = bc->subctx;
-  r.in = tv->in; r.out = tv->out; r.fn = fn;
-
-  /* Decide on the run function to select. */
-  if (be->riter >= 0) {
-    r.n = &TVEC_REG(tv, in, be->riter)->v.u;
-    loopfn = subenv && subenv->run ?
-      benchloop_inner_indirect : benchloop_inner_direct;
-  } else {
-    r.n = 0;
-    loopfn = subenv && subenv->run ?
-      benchloop_outer_indirect : benchloop_outer_direct;
-  }
+  int rc;
 
   /* Decide on the kind of unit and the base count. */
   base = be->niter;
-  if (be->rbuf < 0) unit = TVBU_OP;
-  else { unit = TVBU_BYTE; base *= TVEC_REG(tv, in, be->rbuf)->v.bytes.sz; }
-
-  /* Construct a description of the test using the identifier registers. */
-  for (rd = tv->test->regs; rd->name; rd++)
-    if (rd->f&TVRF_ID) {
-      if (f&f_any) dstr_puts(&d, ", ");
-      else f |= f_any;
-      dstr_putf(&d, "%s = ", rd->name);
-      rd->ty->dump(&TVEC_REG(tv, in, rd->i)->v, rd,
-                  TVSF_COMPACT, &dstr_printops, &d);
-    }
-  DPUTZ(&d);
+  if (be->rbuf < 0) unit = BTU_OP;
+  else { unit = BTU_BYTE; base *= TVEC_REG(tv, in, be->rbuf)->v.bytes.sz; }
 
-  /* Run the benchmark. */
-  o->ops->bbench(o, d.buf, unit);
-  if (bench_measure(bc->bst, &tm, base, loopfn, &r))
-    o->ops->ebench(o, d.buf, unit, 0);
-  else
-    o->ops->ebench(o, d.buf, unit, &tm);
+  /* Find the output operations and report the start. */
+  bo = tvec_outputext(tv, &o, &fo,
+                     TVEC_BENCHOUTEXT, &tvec_benchoutputfallback);
+  bo->bbench(o, 0, unit);
 
-  dstr_destroy(&d);
+  /* Run the benchmark. */
+  if (be->riter >= 0) {
+    n = &TVEC_REG(tv, in, be->riter)->v.u;
+    if (subenv && subenv->run)
+      BENCH_MEASURE(bc->bst, rc, &t, base)
+       { *n = _bench_n; subenv->run(tv, fn, bc->subctx); }
+    else
+      BENCH_MEASURE(bc->bst, rc, &t, base)
+       { *n = _bench_n; fn(tv->in, tv->out, bc->subctx); }
+  } else {
+    if (subenv && subenv->run)
+      BENCH_MEASURE(bc->bst, rc, &t, base)
+       while (_bench_n--) subenv->run(tv, fn, bc->subctx);
+    else
+      BENCH_MEASURE(bc->bst, rc, &t, base)
+       while (_bench_n--) fn(tv->in, tv->out, bc->subctx);
+  }
 
-#undef f_any
+  /* Report the outcome. */
+  bo->ebench(o, 0, unit, rc ? 0 : &t);
 }
 
 /* --- @tvec_benchafter@ --- *
@@ -461,13 +437,13 @@ void tvec_benchteardown(struct tvec_state *tv, void *ctx)
   be = bc->be; subenv = be->env;
 
   /* Tear down any subsidiary environment. */
-  if (subenv && subenv->teardown)
-    subenv->teardown(tv, bc->subctx);
+  if (subenv && subenv->teardown) subenv->teardown(tv, bc->subctx);
+  if (bc->subctx) x_free(tv->a, bc->subctx);
 
   /* If the benchmark state was temporary, then dispose of it. */
   if (bc->bst) {
     if (be->bst) bc->bst->target_s = bc->dflt_target;
-    else { bench_destroy(bc->bst); xfree(bc->bst); }
+    else { bench_destroy(bc->bst); x_free(tv->a, bc->bst); }
   }
 }
 
diff --git a/test/tvec-bench.h b/test/tvec-bench.h
new file mode 100644 (file)
index 0000000..4125e11
--- /dev/null
@@ -0,0 +1,243 @@
+/* -*-c-*-
+ *
+ * Test-vector framework benchmark extension
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_TVEC_BENCH_H
+#define MLIB_TVEC_BENCH_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#ifndef MLIB_BENCH_H
+#  include "bench.h"
+#endif
+
+#ifndef MLIB_CONTROL_H
+#  include "control.h"
+#endif
+
+#ifndef MLIB_GPRINTF_H
+#  include "gprintf.h"
+#endif
+
+#ifndef MLIB_TVEC_H
+#  include "tvec.h"
+#endif
+
+#ifndef MLIB_TVEC_OUTPUT_H
+#  include "tvec-output.h"
+#endif
+
+/*----- Test environment --------------------------------------------------*/
+
+struct tvec_benchenv {
+  /* Benchmark environment definition. */
+
+  struct tvec_env _env;                        /* benchmarking is an environment */
+  struct bench_state **bst;            /* benchmark state anchor or null */
+  unsigned long niter;                 /* iterations done per unit */
+  int riter, rbuf;                     /* iterations and buffer registers */
+  const struct tvec_env *env;          /* subordinate environment */
+};
+
+struct tvec_benchctx {
+  /* Benchmark environment context; private. */
+
+  const struct tvec_benchenv *be;      /* environment configuration */
+  struct bench_state *bst;             /* benchmark state */
+  double dflt_target;                  /* default time in seconds */
+  unsigned f;                          /* flags */
+#define TVBF_SETTRG 1u                 /*   set `@target' */
+#define TVBF_SETMASK (TVBF_SETTRG))    /*   mask of @TVBF_SET...@ */
+  void *subctx;                                /* subordinate environment context */
+};
+
+/* --- Environment implementation --- *
+ *
+ * The following special variables are supported.
+ *
+ *   * %|@target|% is the (approximate) number of seconds to run the
+ *     benchmark.
+ *
+ * Unrecognized variables are passed to the subordinate environment, if there
+ * is one.  Other events are passed through to the subordinate environment.
+ */
+
+extern tvec_envsetupfn tvec_benchsetup;
+extern tvec_envfindvarfn tvec_benchfindvar;
+extern tvec_envbeforefn tvec_benchbefore;
+extern tvec_envrunfn tvec_benchrun;
+extern tvec_envafterfn tvec_benchafter;
+extern tvec_envteardownfn tvec_benchteardown;
+
+#define TVEC_BENCHENV                                                  \
+  { sizeof(struct tvec_benchctx),                                      \
+    tvec_benchsetup,                                                   \
+    tvec_benchfindvar,                                                 \
+    tvec_benchbefore,                                                  \
+    tvec_benchrun,                                                     \
+    tvec_benchafter,                                                   \
+    tvec_benchteardown }
+#define TVEC_BENCHINIT TVEC_BENCHENV, &tvec_benchstate
+
+/*----- Benchmark output extension ----------------------------------------*/
+
+#define TVEC_BENCHOUTEXT "tvec-bench"
+
+struct tvec_benchoutops {
+  /* Output extension for benchmarking.  The name for this extension is
+   * %|tvec-bench|%.
+   */
+
+  void (*bbench)(struct tvec_output */*o*/,
+                const char */*desc*/, unsigned /*unit*/);
+    /* Begin a benchmark.  If the description @desc@ is null -- which it will
+     * be unless we're doing adhoc testing, then the output driver should
+     * label its benchmark output, e.g., by dumping the values of the input
+     * registers marked @TVRF_ID@.  The @unit@ is one of the @BTU_...@
+     * constants explaining what sort of thing is being measured.
+     */
+
+  void (*ebench)(struct tvec_output */*o*/,
+                const char */*desc*/, unsigned /*unit*/,
+                const struct bench_timing */*t*/);
+    /* End a benchmark.  The @unit@ argument is as for @bbench@.  If @tm@ is
+     * zero then the measurement failed; otherwise @tm->n@ counts total
+     * number of things (operations or bytes, as indicated by @unit@)
+     * processed in the indicated time.
+     */
+};
+
+extern const struct tvec_benchoutops tvec_benchoutputfallback;
+  /* Fallback operations for benchmark output.  The @o@ argument is a pointer
+   * to a @struct tvec_fallbackoutput@.
+   */
+
+/*----- Global variables --------------------------------------------------*/
+
+extern struct bench_state *tvec_benchstate; /* default benchmark state */
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @TVEC_BENCHMARK@, @TVEC_BENCHMARK_TAG@ --- *
+ *
+ * Arguments:  @const char *desc@ = a description of the benchmark
+ *             @struct bench_state **bst_inout@ = benchmark state (updated)
+ *             @unsigned unit@ = unit being measured (@BTU_...@ code)
+ *             @double base@ = number of units per external iteration
+ *
+ * Returns:    ---
+ *
+ * Use:
+ */
+
+#define TVEC_BENCHMARK_DECLS                                           \
+  struct tvec_state *_tvbench_tv;                                      \
+  struct tvec_fallbackoutput _tvbench_fo;                              \
+  const struct tvec_benchoutops *_tvbench_bo;                          \
+  struct tvec_output *_tvbench_o;                                      \
+  const char *_tvbench_desc;                                           \
+  unsigned _tvbench_unit;                                              \
+  struct bench_timing _tvbench_tm;                                     \
+  int _tvbench_rc;                                                     \
+  BENCH_MEASURE_DECLS
+
+#define TVEC_BENCHMARK_TAG(tag, desc, tv, bst, unit, base)             \
+  MC_BEFORE(tag##__tvbench_setup, {                                    \
+    _tvbench_tv = (tv);                                                        \
+    _tvbench_bo = tvec_outputext(_tvbench_tv, &_tvbench_o, &_tvbench_fo, \
+                                TVEC_BENCHOUTEXT,                      \
+                                &tvec_benchoutputfallback);            \
+    _tvbench_desc = (desc); _tvbench_unit = (unit);                    \
+    TVEC_BEGINTEST(_tvbench_tv);                                       \
+    _tvbench_bo->bbench(_tvbench_o, _tvbench_desc, _tvbench_unit);     \
+  })                                                                   \
+  MC_AFTER(tag##__tvbench_report, {                                    \
+    _tvbench_bo->ebench(_tvbench_o, _tvbench_desc, _tvbench_unit,      \
+                       _tvbench_rc ? 0 : &_tvbench_tm);                \
+    tvec_endtest(_tvbench_tv);                                         \
+  })                                                                   \
+  BENCH_MEASURE_TAG(tag##__tvbench_measure, (bst),                     \
+                   _tvbench_rc, &_tvbench_tm, (base))
+
+#define TVEC_BENCHMARK(desc, tv, bst, unit, base)                      \
+  TVEC_BENCHMARK_TAG(tvec_bench, desc, tv, bst, unit, base)
+
+/* --- @tvec_benchprep@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test vector state
+ *             @struct bench_state **bst_inout@ = benchmark state (updated)
+ *             @unsigned f@ = calibration flags
+ *
+ * Returns:    Zero on success, %$-1$% on failure.
+ *
+ * Use:                If @*bst_inout@ is null then allocate and initialize a fresh
+ *             benchmark state with a default timer, and @*bst_inout@ is
+ *             updated to point to the fresh state.  The storage for the
+ *             state was allocated using the test vector state's arena.
+ *
+ *             If the benchmark state hasn't been calibrated, then this is
+ *             done, passing @f@ to @bench_calibrate@.
+ *
+ *             On failure, the test group is skipped, reporting a suitable
+ *             message, and %$-1$% is returned.  If a fresh benchmark state
+ *             was allocated, but calibration failed, the state is
+ *             %%\emph{not}%% released.
+ */
+
+extern int tvec_benchprep(struct tvec_state */*tv*/,
+                         struct bench_state **/*bst_inout*/,
+                         unsigned /*f*/);
+
+/* --- @tvec_benchreport@ --- *
+ *
+ * Arguments:  @const struct gprintf_ops *gops@ = print operations
+ *             @void *go@ = print destination
+ *             @unsigned unit@ = the unit being measured (@BTU_...@)
+ *             @unsigned style@ = output style (@TVSF_...@)
+ *             @const struct bench_timing *t@ = the benchmark result
+ *
+ * Returns:    ---
+ *
+ * Use:                Formats a report about the benchmark performance.  This
+ *             function is intended to be called on by an output @ebench@
+ *             function.
+ */
+
+extern void tvec_benchreport
+  (const struct gprintf_ops */*gops*/, void */*go*/,
+   unsigned /*unit*/, unsigned /*style*/, const struct bench_timing */*tm*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index d2a08c38adf8e4f93586bf2b7fadf39c4f68de6b..45a76ea13779ac456509846090064def9ed2a99c 100644 (file)
 
 #include "alloc.h"
 #include "growbuf.h"
+#include "macros.h"
+
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-output.h"
+#include "tvec-types.h"
 
 /*----- Output ------------------------------------------------------------*/
 
@@ -85,19 +90,25 @@ void tvec_report_v(struct tvec_state *tv, unsigned level,
   if (level >= TVLEV_ERR) tv->f |= TVSF_ERROR;
 }
 
-/* --- @tvec_error@, @tvec_notice@ --- *
+/* --- @tvec_error@, @tvec_notice@, @tvec_info@ --- *
  *
  * Arguments:  @struct tvec_state *tv@ = test-vector state
  *             @const char *msg@, @va_list ap@ = error message
  *
- * Returns:    The @tvec_error@ function returns @-1@ as a trivial
+ * Returns:    The @tvec_error@ function returns %$-1$% as a trivial
  *             convenience; @tvec_notice@ does not return a value.
  *
- * Use:                Report an error or a notice.  Errors are distinct from test
+ * Use:                Report a message.  Errors are distinct from test
  *             failures, and indicate that a problem was encountered which
  *             compromised the activity of testing.  Notices are important
  *             information which doesn't fit into any other obvious
- *             category.
+ *             category.  Information is anything else, and is a reasonable
+ *             fallback for writing unstructured information in the absence
+ *             of dedicated support in an output driver.
+ *
+ *             These functions are simple convenience wrappers around
+ *             @tvec_report@.  Use @tvec_report_v@ directly if you have a
+ *             captured @va_list@ of arguments to format.
  */
 
 int tvec_error(struct tvec_state *tv, const char *msg, ...)
@@ -115,6 +126,48 @@ void tvec_notice(struct tvec_state *tv, const char *msg, ...)
   va_start(ap, msg); tvec_report_v(tv, TVLEV_NOTE, msg, &ap); va_end(ap);
 }
 
+void tvec_info(struct tvec_state *tv, const char *msg, ...)
+{
+  va_list ap;
+
+  va_start(ap, msg); tvec_report_v(tv, TVLEV_INFO, msg, &ap); va_end(ap);
+}
+
+/* --- @tvec_outputext@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @struct tvec_output **o_out@ = output object
+ *             @struct tvec_fallbackoutput *fo@ = fallback output
+ *                     (uninitialized)
+ *             @const char *ext@ = extension name
+ *             @const void *fops@ = fallback operations
+ *
+ * Returns:    An output extension operations table.
+ *
+ * Use:                Calls the output driver's @extend@ function, passing @ext@ as
+ *             the extension name.  If the output driver recognizes the
+ *             extension, then @*o_out@ is set to the output driver object
+ *             and the driver's extension-operations table is returned.
+ *             Otherwise, a fallback output object is constructed in @*fo@,
+ *             @*o_out@ is set to @&fo->_o@, and @fops@ is returned.  In
+ *             this way, a call to an extension function, passing @*o_out@
+ *             as the output object, will either call the output driver's
+ *             extension implementation or the fallback implementation as
+ *             required.
+ */
+
+const void *tvec_outputext(struct tvec_state *tv, struct tvec_output **o_out,
+                          struct tvec_fallbackoutput *fo,
+                          const char *ext, const void *fops)
+{
+  const void *ops;
+  struct tvec_output *o = tv->output;
+
+  ops = o->ops->extend(o, ext);
+  if (!ops) { fo->_o.ops = 0; fo->tv = tv; o = &fo->_o; ops = fops; }
+  *o_out = o; return (ops);
+}
+
 /*----- Test processing ---------------------------------------------------*/
 
 /* --- @tvec_skipgroup@, @tvec_skipgroup_v@ --- *
@@ -862,7 +915,7 @@ static void begin_test_group(struct tvec_state *tv, struct groupstate *g)
   tv->f &= ~(TVSF_SKIP | TVSF_MUFFLE);
   tvec_initregs(tv);
   for (i = 0; i < TVOUT_LIMIT; i++) tv->curr[i] = 0;
-  if (env && env->ctxsz) g->ctx = xmalloc(env->ctxsz);
+  if (env && env->ctxsz) g->ctx = x_alloc(tv->a, env->ctxsz);
   if (env && env->setup) env->setup(tv, env, 0, g->ctx);
 }
 
@@ -922,7 +975,7 @@ static void end_test_group(struct tvec_state *tv, struct groupstate *g)
   if (tv->f&TVSF_OPEN) check(tv, g);
   if (!(tv->f&TVSF_SKIP)) report_group(tv);
   env = t->env; if (env && env->teardown) env->teardown(tv, g->ctx);
-  tvec_releaseregs(tv); tv->test = 0; xfree(g->ctx); g->ctx = 0;
+  tvec_releaseregs(tv); tv->test = 0; x_free(tv->a, g->ctx); g->ctx = 0;
 }
 
 /* --- @core_findvar@, @core_setvar@ --- *
@@ -1003,7 +1056,7 @@ static const struct tvec_vardef *core_findvar
 int tvec_read(struct tvec_state *tv, const char *infile, FILE *fp)
 {
   dstr d = DSTR_INIT;
-  const struct tvec_test *test;
+  const struct tvec_test *const *tt;
   const struct tvec_env *env;
   const struct tvec_regdef *rd;
   const struct tvec_vardef *vd = 0; void *varctx;
@@ -1041,8 +1094,8 @@ int tvec_read(struct tvec_state *tv, const char *infile, FILE *fp)
        ch = getc(tv->fp); if (ch != ']') tvec_syntax(tv, ch, "`]'");
 
        /* Find the matching test definition. */
-       for (test = tv->cfg.tests; test->name; test++)
-         if (STRCMP(d.buf, ==, test->name)) goto found_test;
+       for (tt = tv->cfg.tests; *tt; tt++)
+         if (STRCMP(d.buf, ==, (*tt)->name)) goto found_test;
 
        /* There wasn't one.  Report the error.  Muffle errors about the
         * contents of this section because they won't be interesting.
@@ -1055,7 +1108,7 @@ int tvec_read(struct tvec_state *tv, const char *infile, FILE *fp)
        tvec_flushtoeol(tv, 0);
 
        /* Set up the new test group. */
-       tv->test = test; begin_test_group(tv, &g);
+       tv->test = *tt; begin_test_group(tv, &g);
        break;
 
       case '\n':
@@ -1186,7 +1239,7 @@ int tvec_read(struct tvec_state *tv, const char *infile, FILE *fp)
              if (vd->regsz <= sizeof(rbuf))
                r = &rbuf;
              else {
-               GROWBUF_REPLACE(&arena_stdlib, r_alloc, rsz, vd->regsz,
+               GROWBUF_REPLACE(size_t, tv->a, r_alloc, rsz, vd->regsz,
                                8*sizeof(void *), 1);
                r = r_alloc;
              }
@@ -1230,7 +1283,7 @@ end:
   /* Clean up. */
   tv->infile = 0; tv->fp = 0;
   dstr_destroy(&d);
-  xfree(r_alloc);
+  x_free(tv->a, r_alloc);
   return (rc);
 
 #undef rlive
@@ -1258,9 +1311,9 @@ void tvec_begin(struct tvec_state *tv_out,
   tv_out->f = 0;
 
   assert(config->nrout <= config->nreg);
-  tv_out->cfg = *config;
-  tv_out->in = xmalloc(tv_out->cfg.nreg*tv_out->cfg.regsz);
-  tv_out->out = xmalloc(tv_out->cfg.nrout*tv_out->cfg.regsz);
+  tv_out->cfg = *config; tv_out->a = arena_global;
+  tv_out->in = x_allocv(tv_out->a, tv_out->cfg.nreg, tv_out->cfg.regsz);
+  tv_out->out = x_allocv(tv_out->a, tv_out->cfg.nrout, tv_out->cfg.regsz);
   for (i = 0; i < tv_out->cfg.nreg; i++) {
     TVEC_REG(tv_out, in, i)->f = 0;
     if (i < tv_out->cfg.nrout) TVEC_REG(tv_out, out, i)->f = 0;
@@ -1291,12 +1344,17 @@ int tvec_end(struct tvec_state *tv)
 
   if (tv->test) tvec_releaseregs(tv);
   tv->output->ops->destroy(tv->output);
-  xfree(tv->in); xfree(tv->out);
+  x_free(tv->a, tv->in); x_free(tv->a, tv->out);
   return (rc);
 }
 
 /*----- Serialization and deserialization ---------------------------------*/
 
+#define FOREACH_CANDIDATE(rd, regs, mask, want, nr)                    \
+       for (rd = (regs); rd->name; rd++)                               \
+         if (!(rd->i < (nr) && (rd->f&(mask)) == (want))) /* skip */;  \
+         else
+
 /* --- @tvec_serialize@ --- *
  *
  * Arguments:  @const struct tvec_reg *rv@ = vector of registers
@@ -1304,6 +1362,7 @@ int tvec_end(struct tvec_state *tv)
  *             @const struct tvec_regdef *regs@ = vector of register
  *                     descriptions, terminated by an entry with a null
  *                     @name@ slot
+ *             @unsigned mask, want@ = flag-based selection
  *             @unsigned nr@ = number of entries in the @rv@ vector
  *             @size_t regsz@ = true size of each element of @rv@
  *
@@ -1318,6 +1377,7 @@ int tvec_end(struct tvec_state *tv)
 
 int tvec_serialize(const struct tvec_reg *rv, buf *b,
                   const struct tvec_regdef *regs,
+                  unsigned mask, unsigned want,
                   unsigned nr, size_t regsz)
 {
   unsigned char *bitmap;
@@ -1325,17 +1385,19 @@ int tvec_serialize(const struct tvec_reg *rv, buf *b,
   const struct tvec_regdef *rd;
   const struct tvec_reg *r;
 
-  bitoff = BLEN(b);
-  for (rd = regs, nbits = 0; rd->name; rd++, nbits++);
-  bitsz = (nbits + 7)/8;
+  nbits = 0; FOREACH_CANDIDATE(rd, regs, mask, want, nr) nbits++;
+  if (!nbits) return (0);
+  bitoff = BLEN(b); bitsz = (nbits + 7)/8;
 
   bitmap = buf_get(b, bitsz); if (!bitmap) return (-1);
   memset(bitmap, 0, bitsz);
-  for (rd = regs, i = 0; rd->name; rd++, i++) {
-    if (rd->i >= nr) continue;
-    r = TVEC_GREG(rv, rd->i, regsz); if (!(r->f&TVRF_LIVE)) continue;
-    bitmap = BBASE(b) + bitoff; bitmap[i/8] |= 1 << i%8;
-    if (rd->ty->tobuf(b, &r->v, rd)) return (-1);
+  i = 0; FOREACH_CANDIDATE(rd, regs, mask, want, nr) {
+    r = TVEC_GREG(rv, rd->i, regsz);
+    if (r->f&TVRF_LIVE) {
+      bitmap = BBASE(b) + bitoff; bitmap[i/8] |= 1 << i%8;
+      if (rd->ty->tobuf(b, &r->v, rd)) return (-1);
+    }
+    i++;
   }
   return (0);
 }
@@ -1347,6 +1409,7 @@ int tvec_serialize(const struct tvec_reg *rv, buf *b,
  *             @const struct tvec_regdef *regs@ = vector of register
  *                     descriptions, terminated by an entry with a null
  *                     @name@ slot
+ *             @unsigned mask, want@ = flag-based selection
  *             @unsigned nr@ = number of entries in the @rv@ vector
  *             @size_t regsz@ = true size of each element of @rv@
  *
@@ -1361,11 +1424,13 @@ int tvec_serialize(const struct tvec_reg *rv, buf *b,
  *             slot, and set the @TVRF_LIVE@ flag on the register.  See
  *             @tvec_serialize@ for a description of the format.
  *
- *             Failure results only from a failing register type handler.
+ *             Failure results only from an input too small for the initial
+ *             bitmap or a failing register type handler.
  */
 
 int tvec_deserialize(struct tvec_reg *rv, buf *b,
                     const struct tvec_regdef *regs,
+                    unsigned mask, unsigned want,
                     unsigned nr, size_t regsz)
 {
   const unsigned char *bitmap;
@@ -1373,20 +1438,24 @@ int tvec_deserialize(struct tvec_reg *rv, buf *b,
   const struct tvec_regdef *rd;
   struct tvec_reg *r;
 
-  for (rd = regs, nbits = 0; rd->name; rd++, nbits++);
+  nbits = 0; FOREACH_CANDIDATE(rd, regs, mask, want, nr) nbits++;
+  if (!nbits) return (0);
   bitsz = (nbits + 7)/8;
 
   bitmap = buf_get(b, bitsz); if (!bitmap) return (-1);
-  for (rd = regs, i = 0; rd->name; rd++, i++) {
-    if (rd->i >= nr) continue;
-    if (!(bitmap[i/8]&(1 << i%8))) continue;
-    r = TVEC_GREG(rv, rd->i, regsz);
-    if (rd->ty->frombuf(b, &r->v, rd)) return (-1);
-    r->f |= TVRF_LIVE;
+  i = 0; FOREACH_CANDIDATE(rd, regs, mask, want, nr) {
+    if (bitmap[i/8]&(1 << i%8)) {
+      r = TVEC_GREG(rv, rd->i, regsz);
+      if (rd->ty->frombuf(b, &r->v, rd)) return (-1);
+      r->f |= TVRF_LIVE;
+    }
+    i++;
   }
   return (0);
 }
 
+#undef FOREACH_CANDIDATE
+
 /*----- Ad-hoc testing ----------------------------------------------------*/
 
 static const struct tvec_regdef no_regs = { 0, 0, 0, 0, { 0 } };
@@ -1397,23 +1466,24 @@ static void fakefn(const struct tvec_reg *in, struct tvec_reg *out, void *p)
 /* --- @tvec_adhoc@ --- *
  *
  * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @struct tvec_test *t@ = space for a test definition
  *
  * Returns:    ---
  *
  * Use:                Begin ad-hoc testing, i.e., without reading a file of
  *             test-vector data.
  *
- *             The structure at @t@ will be used to record information about
- *             the tests underway, which would normally come from a static
- *             test definition.  The other functions in this section assume
- *             that @tvec_adhoc@ has been called.
+ *             The other functions in this section assume that @tvec_adhoc@
+ *             has been called.
  */
 
-void tvec_adhoc(struct tvec_state *tv, struct tvec_test *t)
+void tvec_adhoc(struct tvec_state *tv)
 {
-  t->name = "<unset>"; t->regs = &no_regs; t->env = 0; t->fn = fakefn;
-  tv->cfg.tests = t;
+  tv->adhoc_test.name = "<unset>";
+  tv->adhoc_test.regs = &no_regs;
+  tv->adhoc_test.env = 0;
+  tv->adhoc_test.fn = fakefn;
+  tv->adhoc_tests[0] = &tv->adhoc_test; tv->adhoc_tests[1] = 0;
+  tv->cfg.tests = tv->adhoc_tests;
 }
 
 /* --- @tvec_begingroup@ --- *
@@ -1433,9 +1503,7 @@ void tvec_adhoc(struct tvec_state *tv, struct tvec_test *t)
 void tvec_begingroup(struct tvec_state *tv, const char *name,
                     const char *file, unsigned lno)
 {
-  struct tvec_test *t = (/*unconst*/ struct tvec_test *)tv->cfg.tests;
-
-  t->name = name; tv->test = t;
+  tv->adhoc_test.name = name; tv->test = &tv->adhoc_test;
   tv->infile = file; tv->lno = tv->test_lno = lno;
   begin_test_group(tv, 0);
 }
@@ -1486,8 +1554,6 @@ static void adhoc_claim_setup(struct tvec_state *tv,
                              const struct tvec_regdef *regs,
                              const char *file, unsigned lno)
 {
-  struct tvec_test *t = (/*unconst*/ struct tvec_test *)tv->test;
-
   ck->f = 0;
 
   if (!(tv->f&TVSF_OPEN))
@@ -1495,15 +1561,13 @@ static void adhoc_claim_setup(struct tvec_state *tv,
 
   ck->saved_file = tv->infile; if (file) tv->infile = file;
   ck->saved_lno = tv->test_lno; if (file) tv->test_lno = lno;
-  t->regs = regs ? regs : &no_regs;
+  tv->adhoc_test.regs = regs ? regs : &no_regs;
 }
 
 static void adhoc_claim_teardown(struct tvec_state *tv,
                                 struct adhoc_claim *ck)
 {
-  struct tvec_test *t = (/*unconst*/ struct tvec_test *)tv->test;
-
-  t->regs = &no_regs;
+  tv->adhoc_test.regs = &no_regs;
   tv->infile = ck->saved_file; tv->test_lno = ck->saved_lno;
 
   if (ck->f&ACF_FRESH) tvec_endtest(tv);
index 8508bd65e19221bde5b51c444fd169a50efa14e1..048950d4712e67aa360fbd0c28f425b158269ef0 100644 (file)
@@ -80,6 +80,7 @@ tvec-env \- test vector framework environments
 .B "};"
 .B "struct tvec_state {"
 .B "   unsigned f;"
+.B "   arena *a;"
 .B "   struct tvec_config cfg;"
 .B "   struct tvec_reg *in, *out;"
 .B "   const struct tvec_test *test;"
index b08dea2650fa2304711b34b066d9fe872d983d9e..cf46bbf303c882d868aa92b2747ebaafa7a69910 100644 (file)
 #include "mdwopt.h"
 #include "quis.h"
 #include "report.h"
+
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-bench.h"
+#include "tvec-types.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
index df19648ea5a3ec80ee735e879808b87f86d54a69..951e02a467266443dbe65bbd067b466b5aa46b43 100644 (file)
@@ -52,6 +52,8 @@ tvec-output \- test vector framework output driver interface
 .PP
 .B "struct tvec_state {"
 .B "   unsigned f;"
+.B "   arena *a;"
+.B "   struct tvec_config cfg;"
 .B "   const struct tvec_test *test;"
 .B "   unsigned curr[TVOUT_LIMIT], all[TVOUT_LIMIT], grps[TVOUT_LIMIT];"
 .B "   ..."
@@ -81,10 +83,7 @@ tvec-output \- test vector framework output driver interface
 .BI "          unsigned " disp ", const union tvec_regval *" rv ,
 .BI "          const struct tvec_regdef *" rd );
 .BI "  void (*" etest ")(struct tvec_output *" o ", unsigned " outcome );
-.BI "  void (*" bbench ")(struct tvec_output *" o ", unsigned " unit );
-.ta 2n +\w'\fBvoid (*\,\fIebench\/\fB)('u
-.BI "  void (*" ebench ")(struct tvec_output *" o ", unsigned " unit ,
-.BI "          const struct bench_timing *" tm );
+.BI "  void (*" extend ")(struct tvec_output *" o ", const char *" name );
 .ta 2n +\w'\fBvoid (*\,\fIreport\/\fB)('u
 .BI "  void (*" report ")(struct tvec_output *" o ", unsigned " level ,
 .BI "          const char *" msg ", va_list *" ap );
index 46c34420613eb22d7d02ede744569c3cef332e4d..4e2ea64582ede7a8af21564807b740a27ff4fe72 100644 (file)
 #include "macros.h"
 #include "quis.h"
 #include "report.h"
+
 #include "tvec.h"
+#include "tvec-bench.h"
+#include "tvec-output.h"
 
 /*----- Common machinery --------------------------------------------------*/
 
@@ -117,6 +120,40 @@ static int register_maxnamelen(const struct tvec_state *tv)
   return (maxlen);
 }
 
+/* --- @print_ident@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @unsigned style@ = style to use for register dumps
+ *             @const struct gprintf_ops *gops@ = output operations
+ *             @void *go@ = output state
+ *
+ * Returns:    ---
+ *
+ * Use:                Write a benchmark identification to the output.
+ */
+
+static void print_ident(struct tvec_state *tv, unsigned style,
+                       const struct gprintf_ops *gops, void *go)
+{
+  const struct tvec_regdef *rd;
+  unsigned f = 0;
+
+#define f_any 1u
+
+  for (rd = tv->test->regs; rd->name; rd++)
+    if (rd->f&TVRF_ID) {
+      if (!(f&f_any)) f |= f_any;
+      else if (style&TVSF_RAW) gops->putch(go, ' ');
+      else gprintf(gops, go, ", ");
+      gprintf(gops, go, "%s", rd->name);
+      if (style&TVSF_RAW) gops->putch(go, '=');
+      else gprintf(gops, go, " = ");
+      rd->ty->dump(&TVEC_REG(tv, in, rd->i)->v, rd, style, gops, go);
+    }
+
+#undef f_any
+}
+
 /*----- Output layout -----------------------------------------------------*/
 
 /* We have two main jobs in output layout: trimming trailing blanks; and
@@ -451,6 +488,7 @@ static int layout_string(struct layout *lyt, const char *p, size_t sz)
 #define HA_LOCSEP (HFG(BLUE))          /* location separator `:' */
 #define HA_ERR (HFG(MAGENTA) | HAF_BOLD) /* error messages */
 #define HA_NOTE (HFG(YELLOW))          /* notices */
+#define HA_INFO 0                      /* information */
 #define HA_UNKLEV (HFG(WHITE) | HBG(RED) | HAF_BOLD) /* unknown level */
 #define HA_UNSET (HFG(YELLOW))         /* register not set */
 #define HA_FOUND (HFG(RED))            /* incorrect output value */
@@ -469,6 +507,7 @@ static int layout_string(struct layout *lyt, const char *p, size_t sz)
 struct human_output {
   struct tvec_output _o;               /* output base class */
   struct tvec_state *tv;               /* stashed testing state */
+  arena *a;                            /* arena for memory allocation */
   struct layout lyt;                   /* output layout */
   char *outbuf; size_t outsz;          /* buffer for formatted output */
   dstr scoreboard;                     /* history of test group results */
@@ -671,7 +710,7 @@ static int human_nwritef(void *go, size_t maxsz, const char *p, ...)
   va_list ap;
 
   va_start(ap, p);
-  n = gprintf_memputf(&h->outbuf, &h->outsz, maxsz, p, ap);
+  n = gprintf_memputf(h->a, &h->outbuf, &h->outsz, maxsz, p, ap);
   va_end(ap);
   if (layout_string(&h->lyt, h->outbuf, n)) return (-1);
   return (n);
@@ -682,8 +721,8 @@ static const struct gprintf_ops human_printops =
 
 /* --- @human_bsession@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *             @struct tvec_state *tv@ = the test state producing output
  *
  * Returns:    ---
@@ -737,8 +776,8 @@ static void report_unusual(struct human_output *h,
 
 /* --- @human_esession@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *
  * Returns:    Suggested exit code.
  *
@@ -790,8 +829,8 @@ static int human_esession(struct tvec_output *o)
 
 /* --- @human_bgroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *
  * Returns:    ---
  *
@@ -812,8 +851,8 @@ static void human_bgroup(struct tvec_output *o)
 
 /* --- @human_skipgroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *             @const char *excuse@, @va_list *ap@ = reason for skipping the
  *                     group, or null
  *
@@ -843,8 +882,8 @@ static void human_skipgroup(struct tvec_output *o,
 
 /* --- @human_egroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *
  * Returns:    ---
  *
@@ -878,8 +917,8 @@ static void human_egroup(struct tvec_output *o)
 
 /* --- @human_btest@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *
  * Returns:    ---
  *
@@ -947,8 +986,8 @@ static void human_report_location(struct human_output *h, FILE *fp,
 
 /* --- @human_outcome@, @human_skip@, @human_fail@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *             @unsigned attr@ = attribute to apply to the outcome
  *             @const char *outcome@ = outcome string to report
  *             @const char *detail@, @va_list *ap@ = a detail message
@@ -986,8 +1025,8 @@ static void human_fail(struct tvec_output *o,
 
 /* --- @human_dumpreg@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *             @unsigned disp@ = register disposition
  *             @const union tvec_regval *rv@ = register value
  *             @const struct tvec_regdef *rd@ = register definition
@@ -1023,8 +1062,8 @@ static void human_dumpreg(struct tvec_output *o,
 
 /* --- @human_etest@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *             @unsigned outcome@ = the test outcome
  *
  * Returns:    ---
@@ -1054,62 +1093,10 @@ static void human_etest(struct tvec_output *o, unsigned outcome)
   }
 }
 
-/* --- @human_bbench@ --- *
- *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
- *
- * Returns:    ---
- *
- * Use:                Report that a benchmark has started.
- *
- *             The human driver just prints the start of the benchmark
- *             report.
- */
-
-static void human_bbench(struct tvec_output *o,
-                        const char *ident, unsigned unit)
-{
-  struct human_output *h = (struct human_output *)o;
-  struct tvec_state *tv = h->tv;
-
-  clear_progress(h);
-  gprintf(&human_printops, h, "%s %s: ", tv->test->name, ident);
-  if (h->f&HOF_TTY) fflush(h->lyt.fp);
-}
-
-/* --- @human_ebench@ --- *
- *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
- *             @const struct bench_timing *tm@ = measurement
- *
- * Returns:    ---
- *
- * Use:                Report a benchmark's results
- *
- *             The human driver just delegates to the default benchmark
- *             reporting, via the layout machinery.
- */
-
-static void human_ebench(struct tvec_output *o,
-                        const char *ident, unsigned unit,
-                        const struct bench_timing *tm)
-{
-  struct human_output *h = (struct human_output *)o;
-
-  tvec_benchreport(&human_printops, h, unit, 0, tm);
-  layout_char(&h->lyt, '\n');
-}
-
 /* --- @human_report@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *             @unsigned level@ = message level (@TVLEV_...@)
  *             @const char *msg@, @va_list *ap@ = format string and
  *                     arguments
@@ -1163,14 +1150,89 @@ static void human_report(struct tvec_output *o, unsigned level,
   }
   if (f&f_progress) show_progress(h);
 
+  dstr_destroy(&d);
+
 #undef f_flush
 #undef f_progress
 }
 
+/* --- @human_bbench@ --- *
+ *
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
+ *             @const char *desc@ = adhoc test description
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
+ *
+ * Returns:    ---
+ *
+ * Use:                Report that a benchmark has started.
+ *
+ *             The human driver just prints the start of the benchmark
+ *             report.
+ */
+
+static void human_bbench(struct tvec_output *o,
+                        const char *desc, unsigned unit)
+{
+  struct human_output *h = (struct human_output *)o;
+  struct tvec_state *tv = h->tv;
+
+  clear_progress(h);
+  gprintf(&human_printops, h, "%s ", tv->test->name);
+  if (desc) gprintf(&human_printops, h, "%s", desc);
+  else print_ident(tv, TVSF_COMPACT, &human_printops, h);
+  gprintf(&human_printops, h, ": ");
+  if (h->f&HOF_TTY) fflush(h->lyt.fp);
+}
+
+/* --- @human_ebench@ --- *
+ *
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
+ *             @const char *desc@ = adhoc test description
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
+ *             @const struct bench_timing *t@ = measurement
+ *
+ * Returns:    ---
+ *
+ * Use:                Report a benchmark's results.
+ *
+ *             The human driver just delegates to the default benchmark
+ *             reporting, via the layout machinery.
+ */
+
+static void human_ebench(struct tvec_output *o,
+                        const char *desc, unsigned unit,
+                        const struct bench_timing *t)
+{
+  struct human_output *h = (struct human_output *)o;
+
+  tvec_benchreport(&human_printops, h, unit, 0, t);
+  layout_char(&h->lyt, '\n');
+}
+
+static const struct tvec_benchoutops human_benchops =
+  { human_bbench, human_ebench };
+
+/* --- @human_extend@ --- *
+ *
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
+ *             @const char *name@ = extension name
+ *
+ * Returns:    A pointer to the extension implementation, or null.
+ */
+
+static const void *human_extend(struct tvec_output *o, const char *name)
+{
+  if (STRCMP(name, ==, TVEC_BENCHOUTEXT)) return (&human_benchops);
+  else return (0);
+}
+
 /* --- @human_destroy@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     human_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct human_output@
  *
  * Returns:    ---
  *
@@ -1184,16 +1246,14 @@ static void human_destroy(struct tvec_output *o)
   destroy_layout(&h->lyt,
                 h->lyt.fp == stdout || h->lyt.fp == stderr ? 0 : DLF_CLOSE);
   dstr_destroy(&h->scoreboard);
-  xfree(h->outbuf); xfree(h);
+  x_free(h->a, h->outbuf); x_free(h->a, h);
 }
 
 static const struct tvec_outops human_ops = {
   human_bsession, human_esession,
   human_bgroup, human_skipgroup, human_egroup,
   human_btest, human_skip, human_fail, human_dumpreg, human_etest,
-  human_bbench, human_ebench,
-  human_report,
-  human_destroy
+  human_report, human_extend, human_destroy
 };
 
 /* --- @tvec_humanoutput@ --- *
@@ -1215,7 +1275,7 @@ struct tvec_output *tvec_humanoutput(FILE *fp)
   struct human_output *h;
   const char *p;
 
-  h = xmalloc(sizeof(*h)); h->_o.ops = &human_ops;
+  XNEW(h); h->a = arena_global; h->_o.ops = &human_ops;
   h->f = 0; h->attr = 0;
 
   init_layout(&h->lyt, fp, 0);
@@ -1249,6 +1309,7 @@ struct tvec_output *tvec_humanoutput(FILE *fp)
 struct machine_output {
   struct tvec_output _o;               /* output base class */
   struct tvec_state *tv;               /* stashed testing state */
+  arena *a;                            /* arena for memory allocation */
   FILE *fp;                            /* output stream */
   char *outbuf; size_t outsz;          /* buffer for formatted output */
   unsigned grpix, testix;              /* group and test indices */
@@ -1325,7 +1386,7 @@ static int machine_nwritef(void *go, size_t maxsz, const char *p, ...)
   va_list ap;
 
   va_start(ap, p);
-  n = gprintf_memputf(&m->outbuf, &m->outsz, maxsz, p, ap);
+  n = gprintf_memputf(m->a, &m->outbuf, &m->outsz, maxsz, p, ap);
   va_end(ap);
   return (machine_writem(m, m->outbuf, n));
 }
@@ -1348,7 +1409,7 @@ static void machine_maybe_quote(struct machine_output *m, const char *p)
   const char *q;
 
   for (q = p; *q; q++)
-    if (!ISPRINT(*q)) goto quote;
+    if (!ISPRINT(*q) || ISSPACE(*q)) goto quote;
   fputs(p, m->fp); return;
 quote:
   putc('"', m->fp); machine_writem(m, p, strlen(p)); putc('"', m->fp);
@@ -1356,8 +1417,8 @@ quote:
 
 /* --- @machine_bsession@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *             @struct tvec_state *tv@ = the test state producing output
  *
  * Returns:    ---
@@ -1400,8 +1461,8 @@ static void machine_show_stats(struct machine_output *m,
 
 /* --- @machine_esession@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *
  * Returns:    Suggested exit code.
  *
@@ -1428,8 +1489,8 @@ static int machine_esession(struct tvec_output *o)
 
 /* --- @machine_bgroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *
  * Returns:    ---
  *
@@ -1453,8 +1514,8 @@ static void machine_bgroup(struct tvec_output *o)
 
 /* --- @machine_skipgroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *             @const char *excuse@, @va_list *ap@ = reason for skipping the
  *                     group, or null
  *
@@ -1472,7 +1533,7 @@ static void machine_skipgroup(struct tvec_output *o,
   struct machine_output *m = (struct machine_output *)o;
   struct tvec_state *tv = m->tv;
 
-  fputs("BGROUP ", m->fp);
+  fputs("SKIPGRP ", m->fp);
   machine_maybe_quote(m, tv->test->name);
   if (excuse) {
     fputs(" \"", m->fp);
@@ -1484,8 +1545,8 @@ static void machine_skipgroup(struct tvec_output *o,
 
 /* --- @machine_egroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *
  * Returns:    ---
  *
@@ -1499,15 +1560,17 @@ static void machine_egroup(struct tvec_output *o)
   struct machine_output *m = (struct machine_output *)o;
   struct tvec_state *tv = m->tv;
 
-  fputs("EGROUP ", m->fp); machine_maybe_quote(m, tv->test->name);
-  putc(' ', m->fp); machine_show_stats(m, tv->curr);
-  putc('\n', m->fp);
+  if (!(tv->f&TVSF_SKIP)) {
+    fputs("EGROUP ", m->fp); machine_maybe_quote(m, tv->test->name);
+    putc(' ', m->fp); machine_show_stats(m, tv->curr);
+    putc('\n', m->fp);
+  }
 }
 
 /* --- @machine_btest@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *
  * Returns:    ---
  *
@@ -1533,12 +1596,18 @@ static void machine_btest(struct tvec_output *o) { ; }
 
 static void machine_report_location(struct machine_output *m,
                                    const char *file, unsigned lno)
-  { machine_maybe_quote(m, file); fprintf(m->fp, ":%u", lno); }
+{
+  if (file) {
+    putc(' ', m->fp);
+    machine_maybe_quote(m, file);
+    fprintf(m->fp, ":%u", lno);
+  }
+}
 
 /* --- @machine_outcome@, @machine_skip@, @machine_fail@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *             @const char *outcome@ = outcome string to report
  *             @const char *detail@, @va_list *ap@ = a detail message
  *             @const char *excuse@, @va_list *ap@ = reason for skipping the
@@ -1555,7 +1624,7 @@ static void machine_outcome(struct tvec_output *o, const char *outcome,
   struct machine_output *m = (struct machine_output *)o;
   struct tvec_state *tv = m->tv;
 
-  fprintf(m->fp, "%s %u ", outcome, m->testix);
+  fprintf(m->fp, "%s %u", outcome, m->testix);
   machine_report_location(m, tv->infile, tv->test_lno);
   if (detail)
     { putc(' ', m->fp); vgprintf(&machine_printops, m, detail, ap); }
@@ -1571,8 +1640,8 @@ static void machine_fail(struct tvec_output *o,
 
 /* --- @machine_dumpreg@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *             @unsigned disp@ = register disposition
  *             @const union tvec_regval *rv@ = register value
  *             @const struct tvec_regdef *rd@ = register definition
@@ -1581,10 +1650,9 @@ static void machine_fail(struct tvec_output *o,
  *
  * Use:                Dump a register.
  *
- *             The TAP driver applies highlighting to mismatching output
+ *             The machine driver applies highlighting to mismatching output
  *             registers, but otherwise delegates to the register type
- *             handler and the layout machinery.  The result is that the
- *             register dump is marked as a comment and indented.
+ *             handler.
  */
 
 static void machine_dumpreg(struct tvec_output *o,
@@ -1606,7 +1674,8 @@ static void machine_dumpreg(struct tvec_output *o,
   }
 
   if (f&f_reg) fprintf(m->fp, "%s = ", rd->name);
-  rd->ty->dump(rv, rd, TVSF_RAW, &file_printops, m->fp);
+  if (!rv) fputs("#unset", m->fp);
+  else rd->ty->dump(rv, rd, TVSF_RAW, &file_printops, m->fp);
   if (f&f_nl) putc('\n', m->fp);
 
 #undef f_reg
@@ -1615,16 +1684,16 @@ static void machine_dumpreg(struct tvec_output *o,
 
 /* --- @machine_etest@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *             @unsigned outcome@ = the test outcome
  *
  * Returns:    ---
  *
  * Use:                Report that a test has finished.
  *
- *             The TAP driver reports the outcome of the test, if that's not
- *             already decided.
+ *             The machine driver reports the outcome of the test, if that's
+ *             not already decided.
  */
 
 static void machine_etest(struct tvec_output *o, unsigned outcome)
@@ -1638,93 +1707,109 @@ static void machine_etest(struct tvec_output *o, unsigned outcome)
   m->testix++; m->f &= ~MF_BENCH;
 }
 
+/* --- @machine_report@ --- *
+ *
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
+ *             @unsigned level@ = message level (@TVLEV_...@)
+ *             @const char *msg@, @va_list *ap@ = format string and
+ *                     arguments
+ *
+ * Returns:    ---
+ *
+ * Use:                Report a message to the user.
+ *
+ *             Each report level has its own output tag
+ */
+
+static void machine_report(struct tvec_output *o, unsigned level,
+                          const char *msg, va_list *ap)
+{
+  struct machine_output *m = (struct machine_output *)o;
+  struct tvec_state *tv = m->tv;
+  const char *p;
+
+  for (p = tvec_strlevel(level); *p; p++) putc(TOUPPER(*p), m->fp);
+  machine_report_location(m, tv->infile, tv->lno);
+  fputs(" \"", m->fp); vgprintf(&machine_printops, m, msg, ap);
+  putc('"', m->fp);
+  putc('\n', m->fp);
+}
+
 /* --- @machine_bbench@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
+ *             @const char *desc@ = adhoc test description
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
  *
  * Returns:    ---
  *
  * Use:                Report that a benchmark has started.
  *
- *             The TAP driver does nothing here.  All of the reporting
+ *             The machine driver does nothing here.  All of the reporting
  *             happens in @machine_ebench@.
  */
 
 static void machine_bbench(struct tvec_output *o,
-                          const char *ident, unsigned unit)
+                          const char *desc, unsigned unit)
   { ; }
 
 /* --- @machine_ebench@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
- *             @const struct bench_timing *tm@ = measurement
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
+ *             @const char *desc@ = adhoc test description
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
+ *             @const struct bench_timing *t@ = measurement
  *
  * Returns:    ---
  *
- * Use:                Report a benchmark's results
+ * Use:                Report a benchmark's results.
  *
- *             The TAP driver just delegates to the default benchmark
- *             reporting, via the layout machinery so that the result is
- *             printed as a comment.
+ *             The machine driver prints the result as a `BENCH' output
+ *             line, in raw format.
  */
 
 static void machine_ebench(struct tvec_output *o,
-                          const char *ident, unsigned unit,
-                          const struct bench_timing *tm)
+                          const char *desc, unsigned unit,
+                          const struct bench_timing *t)
 {
   struct machine_output *m = (struct machine_output *)o;
   struct tvec_state *tv = m->tv;
 
-  fprintf(m->fp, "BENCH %u ", m->testix);
+  fprintf(m->fp, "BENCH %u", m->testix);
   machine_report_location(m, tv->infile, tv->test_lno);
-  fprintf(m->fp, " %s: ", ident);
-  tvec_benchreport(&file_printops, m->fp, unit, TVSF_RAW, tm);
+  putc(' ', m->fp);
+  if (desc) machine_maybe_quote(m, desc);
+  else print_ident(tv, TVSF_RAW, &file_printops, m->fp);
+  fputs(": ", m->fp);
+  tvec_benchreport(&file_printops, m->fp, unit, TVSF_RAW, t);
   putc('\n', m->fp); m->f |= MF_BENCH;
 }
 
-/* --- @machine_report@ --- *
- *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
- *             @unsigned level@ = message level (@TVLEV_...@)
- *             @const char *msg@, @va_list *ap@ = format string and
- *                     arguments
- *
- * Returns:    ---
+static const struct tvec_benchoutops machine_benchops =
+  { machine_bbench, machine_ebench };
+
+/* --- @machine_extend@ --- *
  *
- * Use:                Report a message to the user.
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
+ *             @const char *name@ = extension name
  *
- *             Messages are reported as comments, so that they can be
- *             accumulated by the reader.  An error will cause a later
- *             bailout or, if we crash before then, a missing plan line,
- *             either of which will cause the reader to report a serious
- *             problem.
+ * Returns:    A pointer to the extension implementation, or null.
  */
 
-static void machine_report(struct tvec_output *o, unsigned level,
-                          const char *msg, va_list *ap)
+static const void *machine_extend(struct tvec_output *o, const char *name)
 {
-  struct machine_output *m = (struct machine_output *)o;
-  const char *p;
-
-  for (p = tvec_strlevel(level); *p; p++) putc(TOUPPER(*p), m->fp);
-  putc(' ', m->fp);
-  putc('"', m->fp);
-  vgprintf(&machine_printops, m, msg, ap);
-  putc('"', m->fp);
-  putc('\n', m->fp);
+  if (STRCMP(name, ==, TVEC_BENCHOUTEXT)) return (&machine_benchops);
+  else return (0);
 }
 
 /* --- @machine_destroy@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     machine_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct machine_output@
  *
  * Returns:    ---
  *
@@ -1736,16 +1821,14 @@ static void machine_destroy(struct tvec_output *o)
   struct machine_output *m = (struct machine_output *)o;
 
   if (m->fp != stdout && m->fp != stderr) fclose(m->fp);
-  xfree(m->outbuf); xfree(m);
+  x_free(m->a, m->outbuf); x_free(m->a, m);
 }
 
 static const struct tvec_outops machine_ops = {
   machine_bsession, machine_esession,
   machine_bgroup, machine_skipgroup, machine_egroup,
   machine_btest, machine_skip, machine_fail, machine_dumpreg, machine_etest,
-  machine_bbench, machine_ebench,
-  machine_report,
-  machine_destroy
+  machine_report, machine_extend, machine_destroy
 };
 
 /* --- @tvec_machineoutput@ --- *
@@ -1762,8 +1845,8 @@ struct tvec_output *tvec_machineoutput(FILE *fp)
 {
   struct machine_output *m;
 
-  m = xmalloc(sizeof(*m)); m->_o.ops = &machine_ops;
-  m->fp = fp; m->outbuf = 0; m->outsz = 0; m->testix = 0;
+  XNEW(m); m->a = arena_global; m->_o.ops = &machine_ops;
+  m->f = 0; m->fp = fp; m->outbuf = 0; m->outsz = 0; m->testix = 0;
   return (&m->_o);
 }
 
@@ -1772,6 +1855,7 @@ struct tvec_output *tvec_machineoutput(FILE *fp)
 struct tap_output {
   struct tvec_output _o;               /* output base class */
   struct tvec_state *tv;               /* stashed testing state */
+  arena *a;                            /* arena for memory allocation */
   struct layout lyt;                   /* output layout */
   char *outbuf; size_t outsz;          /* buffer for formatted output */
   unsigned grpix, testix;              /* group and test indices */
@@ -1820,7 +1904,7 @@ static int tap_nwritef(void *go, size_t maxsz, const char *p, ...)
   va_list ap;
 
   va_start(ap, p);
-  n = gprintf_memputf(&t->outbuf, &t->outsz, maxsz, p, ap);
+  n = gprintf_memputf(t->a, &t->outbuf, &t->outsz, maxsz, p, ap);
   va_end(ap);
   if (layout_string(&t->lyt, t->outbuf, n)) return (-1);
   return (n);
@@ -1831,8 +1915,8 @@ static const struct gprintf_ops tap_printops =
 
 /* --- @tap_bsession@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *             @struct tvec_state *tv@ = the test state producing output
  *
  * Returns:    ---
@@ -1854,8 +1938,8 @@ static void tap_bsession(struct tvec_output *o, struct tvec_state *tv)
 
 /* --- @tap_esession@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *
  * Returns:    Suggested exit code.
  *
@@ -1885,8 +1969,8 @@ static int tap_esession(struct tvec_output *o)
 
 /* --- @tap_bgroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *
  * Returns:    ---
  *
@@ -1909,8 +1993,8 @@ static void tap_bgroup(struct tvec_output *o)
 
 /* --- @tap_skipgroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *             @const char *excuse@, @va_list *ap@ = reason for skipping the
  *                     group, or null
  *
@@ -1935,8 +2019,8 @@ static void tap_skipgroup(struct tvec_output *o,
 
 /* --- @tap_egroup@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *
  * Returns:    ---
  *
@@ -1958,8 +2042,8 @@ static void tap_egroup(struct tvec_output *o)
 
 /* --- @tap_btest@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *
  * Returns:    ---
  *
@@ -1975,8 +2059,8 @@ static void tap_btest(struct tvec_output *o)
 
 /* --- @tap_outcome@, @tap_skip@, @tap_fail@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *             @const char *head, *tail@ = outcome strings to report
  *             @const char *detail@, @va_list *ap@ = a detail message
  *             @const char *excuse@, @va_list *ap@ = reason for skipping the
@@ -2017,8 +2101,8 @@ static void tap_fail(struct tvec_output *o, const char *detail, va_list *ap)
 
 /* --- @tap_dumpreg@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *             @unsigned disp@ = register disposition
  *             @const union tvec_regval *rv@ = register value
  *             @const struct tvec_regdef *rd@ = register definition
@@ -2050,8 +2134,8 @@ static void tap_dumpreg(struct tvec_output *o,
 
 /* --- @tap_etest@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *             @unsigned outcome@ = the test outcome
  *
  * Returns:    ---
@@ -2074,59 +2158,10 @@ static void tap_etest(struct tvec_output *o, unsigned outcome)
   }
 }
 
-/* --- @tap_bbench@ --- *
- *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
- *
- * Returns:    ---
- *
- * Use:                Report that a benchmark has started.
- *
- *             The TAP driver does nothing here.  All of the reporting
- *             happens in @tap_ebench@.
- */
-
-static void tap_bbench(struct tvec_output *o,
-                      const char *ident, unsigned unit)
-  { ; }
-
-/* --- @tap_ebench@ --- *
- *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
- *             @const struct bench_timing *tm@ = measurement
- *
- * Returns:    ---
- *
- * Use:                Report a benchmark's results
- *
- *             The TAP driver just delegates to the default benchmark
- *             reporting, via the layout machinery so that the result is
- *             printed as a comment.
- */
-
-static void tap_ebench(struct tvec_output *o,
-                      const char *ident, unsigned unit,
-                      const struct bench_timing *tm)
-{
-  struct tap_output *t = (struct tap_output *)o;
-  struct tvec_state *tv = t->tv;
-
-  set_layout_prefix(&t->lyt, "    ## ");
-  gprintf(&tap_printops, t, "%s %s: ", tv->test->name, ident);
-  tvec_benchreport(&tap_printops, t, unit, 0, tm);
-  layout_char(&t->lyt, '\n');
-}
-
 /* --- @tap_report@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *             @unsigned level@ = message level (@TVLEV_...@)
  *             @const char *msg@, @va_list *ap@ = format string and
  *                     arguments
@@ -2157,10 +2192,22 @@ static void tap_report(struct tvec_output *o, unsigned level,
   layout_char(&t->lyt, '\n');
 }
 
+/* --- @tap_extend@ --- *
+ *
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
+ *             @const char *name@ = extension name
+ *
+ * Returns:    A pointer to the extension implementation, or null.
+ */
+
+static const void *tap_extend(struct tvec_output *o, const char *name)
+  { return (0); }
+
 /* --- @tap_destroy@ --- *
  *
- * Arguments:  @struct tvec_output *o@ = output sink, secretly a @struct
- *                     tap_output@
+ * Arguments:  @struct tvec_output *o@ = output sink, secretly a
+ *                      @struct tap_output@
  *
  * Returns:    ---
  *
@@ -2173,16 +2220,14 @@ static void tap_destroy(struct tvec_output *o)
 
   destroy_layout(&t->lyt,
                 t->lyt.fp == stdout || t->lyt.fp == stderr ? 0 : DLF_CLOSE);
-  xfree(t->outbuf); xfree(t);
+  x_free(t->a, t->outbuf); x_free(t->a, t);
 }
 
 static const struct tvec_outops tap_ops = {
   tap_bsession, tap_esession,
   tap_bgroup, tap_skipgroup, tap_egroup,
   tap_btest, tap_skip, tap_fail, tap_dumpreg, tap_etest,
-  tap_bbench, tap_ebench,
-  tap_report,
-  tap_destroy
+  tap_report, tap_extend, tap_destroy
 };
 
 /* --- @tvec_tapoutput@ --- *
@@ -2211,7 +2256,7 @@ struct tvec_output *tvec_tapoutput(FILE *fp)
 {
   struct tap_output *t;
 
-  t = xmalloc(sizeof(*t)); t->_o.ops = &tap_ops;
+  XNEW(t); t->a = arena_global; t->_o.ops = &tap_ops;
   init_layout(&t->lyt, fp, 0);
   t->outbuf = 0; t->outsz = 0;
   return (&t->_o);
@@ -2229,7 +2274,7 @@ struct tvec_output *tvec_tapoutput(FILE *fp)
  *             writing on @fp@.  The policy is subject to change, but
  *             currently the `human' output format is selected if @fp@ is
  *             interactive (i.e., if @isatty(fileno(fp))@ is true), and
- *             otherwise the `tap' format is used.
+ *             otherwise the `machine' format is used.
  */
 
 struct tvec_output *tvec_dfltout(FILE *fp)
@@ -2238,7 +2283,7 @@ struct tvec_output *tvec_dfltout(FILE *fp)
 
   if (ttyp == -1) ttyp = isatty(fileno(fp));
   if (ttyp) return (tvec_humanoutput(fp));
-  else return (tvec_tapoutput(fp));
+  else return (tvec_machineoutput(fp));
 }
 
 /*----- That's all, folks -------------------------------------------------*/
diff --git a/test/tvec-output.h b/test/tvec-output.h
new file mode 100644 (file)
index 0000000..38ba039
--- /dev/null
@@ -0,0 +1,194 @@
+/* -*-c-*-
+ *
+ * Test-vector framework output machinery
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_TVEC_OUTPUT_H
+#define MLIB_TVEC_OUTPUT_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#ifndef MLIB_TVEC_H
+#  include "tvec.h"
+#endif
+
+/*----- Data structures ---------------------------------------------------*/
+
+struct tvec_state;
+
+struct tvec_output {
+  /* An output formatter. */
+
+  const struct tvec_outops *ops;       /* pointer to operations */
+};
+
+enum {
+  /* Register output dispositions. */
+
+  TVRD_INPUT,                          /* input-only register */
+  TVRD_OUTPUT,                         /* output-only (input is dead) */
+  TVRD_MATCH,                          /* matching (equal) registers */
+  TVRD_FOUND,                          /* mismatching output register */
+  TVRD_EXPECT,                         /* mismatching input register */
+  TVRD_LIMIT                           /* (number of dispositions) */
+};
+
+struct tvec_fallbackoutput {
+  /* Dummy fallback output driver.  This may be useful for fallback output
+   * driver implementations.
+   */
+
+  struct tvec_output _o;
+  struct tvec_state *tv;
+};
+
+struct tvec_outops {
+  /* Output operations. */
+
+  void (*bsession)(struct tvec_output */*o*/, struct tvec_state */*tv*/);
+    /* Begin a test session.  The output driver will probably want to
+     * save @tv@, because this isn't provided to any other methods.
+     */
+
+  int (*esession)(struct tvec_output */*o*/);
+    /* End a session, and return the suggested exit code. */
+
+  void (*bgroup)(struct tvec_output */*o*/);
+    /* Begin a test group.  The test group description is @tv->test@. */
+
+  void (*skipgroup)(struct tvec_output */*o*/,
+                   const char */*excuse*/, va_list */*ap*/);
+    /* The group is being skipped; @excuse@ may be null or a format
+     * string explaining why.  The @egroup@ method will not be called
+     * separately.
+     */
+
+  void (*egroup)(struct tvec_output */*o*/);
+    /* End a test group.  At least one test was attempted or @skipgroup@
+     * would have been called instead.  If @tv->curr[TVOUT_LOSE]@ is nonzero
+     * then the test group as a whole failed; otherwise it passed.
+     */
+
+  void (*btest)(struct tvec_output */*o*/);
+    /* Begin a test case. */
+
+  void (*skip)(struct tvec_output */*o*/,
+              const char */*excuse*/, va_list */*ap*/);
+    /* The test case is being skipped; @excuse@ may be null or a format
+     * string explaining why.  The @etest@ function will still be called (so
+     * this works differently from @skipgroup@ and @egroup@).  A test case
+     * can be skipped at most once, and, if skipped, it cannot fail.
+     */
+
+  void (*fail)(struct tvec_output */*o*/,
+              const char */*detail*/, va_list */*ap*/);
+    /* The test case failed.
+     *
+     * The output driver should preferably report the filename (@infile@) and
+     * line number (@test_lno@, not @lno@) for the failing test.
+     *
+     * The @detail@ may be null or a format string describing detail about
+     * how the failing test was run which can't be determined from the
+     * registers; a @detail@ is usually provided when (and only when) the
+     * test environment potentially invokes the test function more than once.
+     *
+     * A single test case can fail multiple times!
+     */
+
+  void (*dumpreg)(struct tvec_output */*o*/,
+                 unsigned /*disp*/, const union tvec_regval */*rv*/,
+                 const struct tvec_regdef */*rd*/);
+    /* Dump a register.  The `disposition' @disp@ explains what condition the
+     * register is in; see @tvec_dumpreg@ and the @TVRD_...@ codes.  The
+     * register value is at @rv@, and its definition, including its type, at
+     * @rd@.  Note that this function may be called on virtual registers
+     * which aren't in either of the register vectors or mentioned by the
+     * test description.  It may also be called with @rv@ null, indicating
+     * that the register is not live.
+     */
+
+  void (*etest)(struct tvec_output */*o*/, unsigned /*outcome*/);
+    /* The test case concluded with the given @outcome@ (one of the
+     * @TVOUT_...@ codes.
+     */
+
+  void (*report)(struct tvec_output */*o*/, unsigned /*level*/,
+                const char */*msg*/, va_list */*ap*/);
+    /* Report a message.  The driver should ideally report the filename
+     * (@infile@) and line number (@lno@) prompting the error.
+     */
+
+  const void *(*extend)(struct tvec_output */*o*/, const char */*name*/);
+    /* Return a pointer to the output driver's implementation of the
+     * extension @name@, or null.  Typically, the implementation will be a
+     * structure of function pointers, though the details are necessarily
+     * extension-specific.
+     */
+
+  void (*destroy)(struct tvec_output */*o*/);
+    /* Release any resources acquired by the driver. */
+};
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @tvec_outputext@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @struct tvec_output **o_out@ = output object
+ *             @struct tvec_fallbackoutput *fo@ = fallback output
+ *                     (uninitialized)
+ *             @const char *ext@ = extension name
+ *             @const void *fops@ = fallback operations
+ *
+ * Returns:    An output extension operations table.
+ *
+ * Use:                Calls the output driver's @extend@ function, passing @ext@ as
+ *             the extension name.  If the output driver recognizes the
+ *             extension, then @*o_out@ is set to the output driver object
+ *             and the driver's extension-operations table is returned.
+ *             Otherwise, a fallback output object is constructed in @*fo@,
+ *             @*o_out@ is set to @&fo->_o@, and @fops@ is returned.  In
+ *             this way, a call to an extension function, passing @*o_out@
+ *             as the output object, will either call the output driver's
+ *             extension implementation or the fallback implementation as
+ *             required.
+ */
+
+extern const void *tvec_outputext(struct tvec_state */*tv*/,
+                                 struct tvec_output **/*o_out*/,
+                                 struct tvec_fallbackoutput */*fo*/,
+                                 const char */*ext*/, const void */*fops*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index aa735bf275903422c6017a4263f8298d776c9b5f..09a01acef3f944e240d3584596cd5cfe270b0c2b 100644 (file)
@@ -48,7 +48,7 @@ tvec-remote \- test vector framework remote invocation
 .SH SYNOPSIS
 .
 .nf
-.B "#include <mLib/tvec.h>"
+.B "#include <mLib/tvec-remote.h>"
 .PP
 .ta \w'\fBtypedef int tvec_connectfn('u
 .BI "typedef int tvec_connectfn(pid_t *" kid_out ", int *" infd_out ,
index 3087d1bf77f1b3e36d4458d98f769475f07c2077..bcbfad0d3af27b380417b1c90621a55633b69916 100644 (file)
 #include "lbuf.h"
 #include "mdup.h"
 #include "quis.h"
+
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-bench.h"
+#include "tvec-output.h"
+#include "tvec-remote.h"
+#include "tvec-types.h"
 
 /*----- Preliminaries -----------------------------------------------------*/
 
@@ -111,7 +117,8 @@ static void close_comms(struct tvec_remotecomms *rc)
 
 /* --- @release_comms@ --- *
  *
- * Arguments:  @struct tvec_remotecomms *rc@ = communication state
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @struct tvec_remotecomms *rc@ = communication state
  *
  * Returns:    ---
  *
@@ -120,8 +127,8 @@ static void close_comms(struct tvec_remotecomms *rc)
  *             @close_comms@.
  */
 
-static void release_comms(struct tvec_remotecomms *rc)
-  { close_comms(rc); xfree(rc->bin); DBDESTROY(&rc->bout); }
+static void release_comms(struct tvec_state *tv, struct tvec_remotecomms *rc)
+  { close_comms(rc); x_free(tv->a, rc->bin); DBDESTROY(&rc->bout); }
 
 /* --- @setup_comms@ --- *
  *
@@ -379,7 +386,7 @@ static int receive_buffered(struct tvec_state *tv,
   if (rc->binlen - rc->binoff >= want) return (RECV_OK);
 
   /* If the buffer is too small then we must grow it. */
-  GROWBUF_EXTEND(&arena_stdlib, rc->bin, rc->binsz, want, RECVBUFSZ, 1);
+  GROWBUF_EXTEND(size_t, tv->a, rc->bin, rc->binsz, want, RECVBUFSZ, 1);
 
   /* Shunt the unused existing material to the start of the buffer. */
   memmove(rc->bin, rc->bin + rc->binoff, rc->binlen - rc->binoff);
@@ -493,9 +500,9 @@ static int remote_recv(struct tvec_state *tv, struct tvec_remotecomms *rc,
 #define TVPK_FAIL      0x0108u         /* <-- flag: u8, detail: str16 */
 #define TVPK_DUMPREG   0x010au         /* <-- ri: u16; disp: u16;
                                         *     flag: u8, rv: value */
-#define TVPK_BBENCH    0x010cu         /* <-- ident: str32; unit: u16 */
-#define TVPK_EBENCH    0x010eu         /* <-- ident: str32; unit: u16;
-                                        *     flags: u16; n, t, cy: f64 */
+#define TVPK_BBENCH    0x010cu         /* <-- unit: u16, ident: regs */
+#define TVPK_EBENCH    0x010eu         /* <-- unit: u16; flags: u16;
+                                        *     n, t, cy: f64 */
 
 /*----- Server ------------------------------------------------------------*/
 
@@ -577,7 +584,7 @@ int tvec_remoteserver(int infd, int outfd, const struct tvec_config *config)
   unsigned i;
   buf b;
   dstr d = DSTR_INIT;
-  const struct tvec_test *t;
+  const struct tvec_test *t, *const *tt;
   void *p; size_t sz;
   const struct tvec_env *env = 0;
   const struct tvec_vardef *vd = 0; void *varctx;
@@ -645,9 +652,11 @@ int tvec_remoteserver(int infd, int outfd, const struct tvec_config *config)
        if (BLEFT(&b)) goto bad;
 
        /* Find the group given its name. */
-       for (t = srvtv.cfg.tests; t->name; t++)
+       for (tt = srvtv.cfg.tests; *tt; tt++) {
+         t = *tt;
          if (strlen(t->name) == sz && MEMCMP(t->name, ==, p, sz))
            goto found_group;
+       }
        rc = ioerr(&srvtv, &srvrc, "unknown test group `%.*s'",
                   (int)sz, (char *)p);
        goto end;
@@ -658,7 +667,7 @@ int tvec_remoteserver(int infd, int outfd, const struct tvec_config *config)
        if (env && env->setup == tvec_remotesetup)
          env = ((struct tvec_remoteenv *)env)->r.env;
        if (!env || !env->ctxsz) ctx = 0;
-       else ctx = xmalloc(env->ctxsz);
+       else ctx = x_alloc(srvtv.a, env->ctxsz);
        if (env && env->setup) env->setup(&srvtv, env, 0, ctx);
 
        /* Initialize the registers. */
@@ -707,7 +716,7 @@ int tvec_remoteserver(int infd, int outfd, const struct tvec_config *config)
              if (vd->regsz <= sizeof(rbuf))
                r = &rbuf;
              else {
-               GROWBUF_REPLACE(&arena_stdlib, r_alloc, rsz, vd->regsz,
+               GROWBUF_REPLACE(size_t, srvtv.a, r_alloc, rsz, vd->regsz,
                                8*sizeof(void *), 1);
                r = r_alloc;
              }
@@ -731,7 +740,7 @@ int tvec_remoteserver(int infd, int outfd, const struct tvec_config *config)
 
              /* Parse the packet payload. */
              if (tvec_deserialize(srvtv.in, &b, srvtv.test->regs,
-                                  srvtv.cfg.nreg, srvtv.cfg.regsz))
+                                  0, 0, srvtv.cfg.nreg, srvtv.cfg.regsz))
                goto bad;
              if (BLEFT(&b)) goto bad;
 
@@ -794,7 +803,7 @@ int tvec_remoteserver(int infd, int outfd, const struct tvec_config *config)
        /* Tear down the environment and release other resources. */
        if (env && env->teardown) env->teardown(&srvtv, ctx);
        tvec_releaseregs(&srvtv);
-       xfree(ctx); srvtv.test = 0; env = 0; ctx = 0;
+       x_free(srvtv.a, ctx); srvtv.test = 0; env = 0; ctx = 0;
 
        /* Report completion. */
        QUEUEPK(&srvtv, &srvrc, QF_FORCE, TVPK_EGROUP | TVPF_ACK);
@@ -812,9 +821,9 @@ end:
   /* Clean up and return. */
   if (env && env->teardown) env->teardown(&srvtv, ctx);
   if (vd) vd->def.ty->release(&r->v, &vd->def);
-  xfree(ctx); xfree(r_alloc);
+  x_free(srvtv.a, ctx); x_free(srvtv.a, r_alloc);
   if (srvtv.test) tvec_releaseregs(&srvtv);
-  release_comms(&srvrc); tvec_end(&srvtv);
+  release_comms(&srvtv, &srvrc); tvec_end(&srvtv);
   return (rc ? 2 : 0);
 
 bad:
@@ -1008,11 +1017,41 @@ found:
 static void remote_etest(struct tvec_output *o, unsigned outcome)
   { ; }
 
+/* --- @remote_report@ --- *
+ *
+ * Arguments:  @struct tvec_output *o@ = output sink (ignored)
+ *             @unsigned level@ = message level (@TVLEV_...@)
+ *             @const char *msg@, @va_list *ap@ = format string and
+ *                     arguments
+ *
+ * Returns:    ---
+ *
+ * Use:                Report a message to the user.
+ *
+ *             The remote driver sends a @TVPK_REPORT@ packet to its
+ *             client.  If its attempt to transmit the packet fails, then
+ *             the message is written to the standard error stream instead,
+ *             in the hope that this will help it be noticed.
+ */
+
+static void remote_report(struct tvec_output *o, unsigned level,
+                         const char *msg, va_list *ap)
+{
+  QUEUEPK(&srvtv, &srvrc, 0, TVPK_REPORT) {
+    dbuf_putu16l(&srvrc.bout, level);
+    dbuf_vputstrf16l(&srvrc.bout, msg, ap);
+  } else {
+    fprintf(stderr, "%s %s: ", QUIS, tvec_strlevel(level));
+    vfprintf(stderr, msg, *ap);
+    fputc('\n', stderr);
+  }
+}
+
 /* --- @remote_bbench@ --- *
  *
  * Arguments:  @struct tvec_output *o@ = output sink (ignored)
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
+ *             @const char *desc@ = adhoc test description, must be null
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
  *
  * Returns:    ---
  *
@@ -1022,34 +1061,36 @@ static void remote_etest(struct tvec_output *o, unsigned outcome)
  */
 
 static void remote_bbench(struct tvec_output *o,
-                         const char *ident, unsigned unit)
+                         const char *desc, unsigned unit)
 {
+  assert(!desc);
   QUEUEPK(&srvtv, &srvrc, 0, TVPK_BBENCH) {
-    dbuf_putstr32l(&srvrc.bout, ident);
     dbuf_putu16l(&srvrc.bout, unit);
+    tvec_serialize(srvtv.in, DBUF_BUF(&srvrc.bout), srvtv.test->regs,
+                  TVRF_ID, TVRF_ID, srvtv.cfg.nreg, srvtv.cfg.regsz);
   }
 }
 
 /* --- @remote_ebench@ --- *
  *
  * Arguments:  @struct tvec_output *o@ = output sink (ignored)
- *             @const char *ident@ = identifying register values
- *             @unsigned unit@ = measurement unit (@TVBU_...@)
- *             @const struct bench_timing *tm@ = measurement
+ *             @const char *desc@ = adhoc test description, must be null
+ *             @unsigned unit@ = measurement unit (@BTU_...@)
+ *             @const struct bench_timing *t@ = measurement
  *
  * Returns:    ---
  *
- * Use:                Report a benchmark's results
+ * Use:                Report a benchmark's results.
  *
  *             The remote driver sends a @TVPK_EBENCH@ packet to its client.
  */
 
 static void remote_ebench(struct tvec_output *o,
-                         const char *ident, unsigned unit,
+                         const char *desc, unsigned unit,
                          const struct bench_timing *t)
 {
+  assert(!desc);
   QUEUEPK(&srvtv, &srvrc, 0, TVPK_EBENCH) {
-    dbuf_putstr32l(&srvrc.bout, ident);
     dbuf_putu16l(&srvrc.bout, unit);
     if (!t || !(t->f&BTF_ANY))
       dbuf_putu16l(&srvrc.bout, 0);
@@ -1062,34 +1103,21 @@ static void remote_ebench(struct tvec_output *o,
   }
 }
 
-/* --- @remote_report@ --- *
+static const struct tvec_benchoutops remote_benchops =
+  { remote_bbench, remote_ebench };
+
+/* --- @remote_extend@ --- *
  *
  * Arguments:  @struct tvec_output *o@ = output sink (ignored)
- *             @unsigned level@ = message level (@TVLEV_...@)
- *             @const char *msg@, @va_list *ap@ = format string and
- *                     arguments
- *
- * Returns:    ---
- *
- * Use:                Report a message to the user.
+ *             @const char *name@ = extension name
  *
- *             The remote driver sends a @TVPK_REPORT@ packet to its
- *             client.  If its attempt to transmit the packet fails, then
- *             the message is written to the standard error stream instead,
- *             in the hope that this will help it be noticed.
+ * Returns:    A pointer to the extension implementation, or null.
  */
 
-static void remote_report(struct tvec_output *o, unsigned level,
-                         const char *msg, va_list *ap)
+static const void *remote_extend(struct tvec_output *o, const char *name)
 {
-  QUEUEPK(&srvtv, &srvrc, 0, TVPK_REPORT) {
-    dbuf_putu16l(&srvrc.bout, level);
-    dbuf_vputstrf16l(&srvrc.bout, msg, ap);
-  } else {
-    fprintf(stderr, "%s %s: ", QUIS, tvec_strlevel(level));
-    vfprintf(stderr, msg, *ap);
-    fputc('\n', stderr);
-  }
+  if (STRCMP(name, ==, TVEC_BENCHOUTEXT)) return (&remote_benchops);
+  else return (0);
 }
 
 /* --- @remote_destroy@ --- *
@@ -1110,9 +1138,7 @@ static const struct tvec_outops remote_ops = {
   remote_bsession, remote_esession,
   remote_bgroup, remote_skipgroup, remote_egroup,
   remote_btest, remote_skip, remote_fail, remote_dumpreg, remote_etest,
-  remote_bbench, remote_ebench,
-  remote_report,
-  remote_destroy
+  remote_report, remote_extend, remote_destroy
 };
 
 /*----- Pseudoregister definitions ----------------------------------------*/
@@ -1354,13 +1380,15 @@ enum {
 static int handle_packets(struct tvec_state *tv, struct tvec_remotectx *r,
                          unsigned f, uint16 end, buf *b_out)
 {
-  struct tvec_output *o = tv->output;
+  struct tvec_output *o;
   uint16 pk, u, v;
   const char *p; size_t n;
   dstr d = DSTR_INIT;
   buf *b = b_out;
   const struct tvec_regdef *rd;
   struct bench_timing bt;
+  const struct tvec_benchoutops *bo;
+  struct tvec_fallbackoutput fo;
   struct tvec_reg *reg = 0; size_t rsz = 0;
   unsigned i;
   int rc;
@@ -1476,7 +1504,7 @@ static int handle_packets(struct tvec_state *tv, struct tvec_remotectx *r,
        if (!rc)
          tvec_dumpreg(tv, v, 0, rd);
        else {
-         GROWBUF_REPLACE(&arena_stdlib, reg, rsz, tv->cfg.regsz,
+         GROWBUF_REPLACE(size_t, tv->a, reg, rsz, tv->cfg.regsz,
                          8*sizeof(void *), 1);
          rd->ty->init(&reg->v, rd);
          rc = rd->ty->frombuf(b, &reg->v, rd);
@@ -1490,24 +1518,26 @@ static int handle_packets(struct tvec_state *tv, struct tvec_remotectx *r,
       case TVPK_BBENCH:
        /* A report that we're starting a benchmark.  Pass this along. */
 
-       p = buf_getmem32l(b, &n); if (!p) goto bad;
        if (buf_getu16l(b, &u)) goto bad;
+       if (tvec_deserialize(tv->in, b, tv->test->regs,
+                            TVRF_ID, TVRF_ID, tv->cfg.nreg, tv->cfg.regsz))
+         goto bad;
        if (BLEFT(b)) goto bad;
-       if (u >= TVBU_LIMIT) {
+       if (u >= BTU_LIMIT) {
          rc = ioerr(tv, &r->rc, "unit code %u out of range", u);
          goto end;
        }
 
-       DRESET(&d); DPUTM(&d, p, n); DPUTZ(&d);
-       o->ops->bbench(o, d.buf, u);
+       bo = tvec_outputext(tv, &o, &fo,
+                           TVEC_BENCHOUTEXT, &tvec_benchoutputfallback);
+       bo->bbench(o, 0, u);
        break;
 
       case TVPK_EBENCH:
        /* A report that a benchmark completed.  Pass this along. */
 
-       p = buf_getmem32l(b, &n); if (!p) goto bad;
        if (buf_getu16l(b, &u) || buf_getu16l(b, &v)) goto bad;
-       if (u >= TVBU_LIMIT) {
+       if (u >= BTU_LIMIT) {
          rc = ioerr(tv, &r->rc, "unit code %u out of range", u);
          goto end;
        }
@@ -1515,9 +1545,11 @@ static int handle_packets(struct tvec_state *tv, struct tvec_remotectx *r,
        if ((v&BTF_TIMEOK) && buf_getf64l(b, &bt.t)) goto bad;
        if ((v&BTF_CYOK) && buf_getf64l(b, &bt.cy)) goto bad;
        if (BLEFT(b)) goto bad;
+       bt.f = v;
 
-       DRESET(&d); DPUTM(&d, p, n); DPUTZ(&d);
-       o->ops->ebench(o, d.buf, u, v&BTF_ANY ? &bt : 0);
+       bo = tvec_outputext(tv, &o, &fo,
+                           TVEC_BENCHOUTEXT, &tvec_benchoutputfallback);
+       bo->ebench(o, 0, u, v&BTF_ANY ? &bt : 0);
        break;
 
       default:
@@ -1530,7 +1562,7 @@ static int handle_packets(struct tvec_state *tv, struct tvec_remotectx *r,
 
 end:
   DDESTROY(&d);
-  xfree(reg);
+  x_free(tv->a, reg);
   return (rc);
 bad:
   rc = malformed(tv, &r->rc); goto end;
@@ -1707,12 +1739,27 @@ end:
  */
 
 #define DCF_KILL 0x0100u
+#define DCF_QUITOK 0200u
 static void disconnect_remote(struct tvec_state *tv,
                              struct tvec_remotectx *r, unsigned f)
 {
+  union tvec_regval rv;
+  dstr d = DSTR_INIT;
+
   if (r->kid > 0 && (f&DCF_KILL)) kill(r->kid, SIGTERM);
   close_comms(&r->rc);
-  drain_errfd(tv, r, f | ERF_CLOSE); reap_kid(tv, r);
+  drain_errfd(tv, r, f | ERF_CLOSE);
+  if (r->kid >= 0) {
+    reap_kid(tv, r);
+    if (!(f&ERF_SILENT) &&
+       (!(f&DCF_QUITOK) || (r->exit != TVXST_EXIT &&
+                            r->exit != TVXST_DISCONN))) {
+      rv.u = r->exit;
+      tvty_flags.dump(&rv, &exit_var.def, TVSF_COMPACT, &dstr_printops, &d);
+      tvec_error(tv, "remote connection closed with status %s", d.buf);
+    }
+  }
+  dstr_destroy(&d);
 }
 
 /* --- @connect_remote@ --- *
@@ -1892,7 +1939,7 @@ void tvec_remotesetup(struct tvec_state *tv, const struct tvec_env *env,
   if (connect_remote(tv, r))
     tvec_skipgroup(tv, "failed to connect to test backend");
   reset_vars(r);
-  if (subenv && subenv->ctxsz) r->subctx = xmalloc(subenv->ctxsz);
+  if (subenv && subenv->ctxsz) r->subctx = x_alloc(tv->a, subenv->ctxsz);
   else r->subctx = 0;
   if (subenv && subenv->setup) subenv->setup(tv, subenv, r, r->subctx);
 }
@@ -2046,8 +2093,8 @@ void tvec_remoterun(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
 
   /* Send the command to the server and handle output. */
   QUEUEPK(tv, &r->rc, QF_FORCE, TVPK_TEST)
-    tvec_serialize(tv->in, DBUF_BUF(&r->rc.bout),
-                  tv->test->regs, tv->cfg.nreg, tv->cfg.regsz);
+    tvec_serialize(tv->in, DBUF_BUF(&r->rc.bout), tv->test->regs,
+                  0, 0, tv->cfg.nreg, tv->cfg.regsz);
   else { goto fail; }
   rc = handle_packets(tv, r, RCVF_ALLOWEOF, TVPK_TEST | TVPF_ACK, &b);
 
@@ -2165,13 +2212,13 @@ void tvec_remoteteardown(struct tvec_state *tv, void *ctx)
   buf b;
 
   if (subenv && subenv->teardown) subenv->teardown(tv, r->subctx);
-  xfree(r->subctx);
+  x_free(tv->a, r->subctx);
   if (r->rc.outfd >= 0) {
     QUEUEPK(tv, &r->rc, QF_FORCE, TVPK_EGROUP);
     if (!handle_packets(tv, r, RCVF_ALLOWEOF, TVPK_EGROUP | TVPF_ACK, &b))
       if (BLEFT(&b)) malformed(tv, &r->rc);
   }
-  disconnect_remote(tv, r, 0); release_comms(&r->rc);
+  disconnect_remote(tv, r, DCF_QUITOK); release_comms(tv, &r->rc);
   DDESTROY(&r->prgwant); DDESTROY(&r->progress);
 }
 
diff --git a/test/tvec-remote.h b/test/tvec-remote.h
new file mode 100644 (file)
index 0000000..c9bb092
--- /dev/null
@@ -0,0 +1,296 @@
+/* -*-c-*-
+ *
+ * Test-vector framework remote testing extension
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_TVEC_REMOTE_H
+#define MLIB_TVEC_REMOTE_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <stddef.h>
+
+#include <sys/types.h>
+
+#ifndef MLIB_BUF_H
+#  include "buf.h"
+#endif
+
+#ifndef MLIB_DSTR_H
+#  include "dstr.h"
+#endif
+
+#ifndef MLIB_LBUF_H
+#  include "lbuf.h"
+#endif
+
+#ifndef MLIB_TVEC_H
+#  include "tvec.h"
+#endif
+
+/*----- Test environment --------------------------------------------------*/
+
+struct tvec_remoteenv;
+
+typedef int tvec_connectfn(pid_t */*kid_out*/, int */*infd_out*/,
+                          int */*outfd_out*/, int */*errfd_out*/,
+                          struct tvec_state */*tv*/,
+                          const struct tvec_remoteenv */*env*/);
+  /* A connection function.  On entry, @tv@ holds the test-vector state, and
+   * @env@ is the test group's remote environment structure, which will
+   * typically really be some subclass of @struct tvec_remoteenv@ containing
+   * additional parameters for establishing the child process.
+   *
+   * On successful completion, the function stores input and output
+   * descriptors (which need not be distinct) in @*infd_out@ and
+   * @*outfd_out@, and returns zero; if it creates a child process, it should
+   * additionally store the child's process-id in @*kid_out@ and store in
+   * @*errfd_out@ a descriptor from which the child's error output can be
+   * read.  On error, the function should report an appropriate message via
+   * @tvec_error@ and return %$-1$%.
+   */
+
+struct tvec_remoteenv_slots {
+  /* Additional slots for the remote-environment base class. */
+
+  tvec_connectfn *connect;             /* connection function */
+  const struct tvec_env *env;          /* subordinate environment */
+  unsigned dflt_reconn;                        /* default reconnection */
+};
+
+struct tvec_remoteenv {
+  /* Remote environment base class instance structure. */
+
+  struct tvec_env _env;
+  struct tvec_remoteenv_slots r;
+};
+
+struct tvec_remotefork_slots {
+  /* Additional slots for the remote-environment forking class. */
+
+  const struct tvec_test **tests;      /* child tests (or null) */
+};
+
+struct tvec_remotefork {
+  /* Remote environment forking class instance structure. */
+
+  struct tvec_env _env;
+  struct tvec_remoteenv_slots r;
+  struct tvec_remotefork_slots f;
+};
+
+struct tvec_remoteexec_slots {
+  /* Additional slots for the remote-environment exec class. */
+
+  const char *const *args;             /* command line to execute */
+};
+
+struct tvec_remoteexec {
+  /* Remote environment exec class instance structure. */
+
+  struct tvec_env _env;
+  struct tvec_remoteenv_slots r;
+  struct tvec_remoteexec_slots x;
+};
+
+union tvec_remoteenv_subclass_kludge {
+  /* Pointless union to engage the common-prefix rule. */
+
+  struct tvec_env _env;
+  struct tvec_remoteenv renv;
+  struct tvec_remotefork fork;
+  struct tvec_remoteexec exec;
+};
+
+struct tvec_remotecomms {
+  /* Remote communications state; private. */
+
+  int infd, outfd;                     /* input and output descriptors */
+  dbuf bout;                           /* output buffer */
+  unsigned char *bin;                  /* input buffer */
+  size_t binoff, binlen, binsz;                /* input offset, length, and size */
+  size_t t;                            /* temporary offset */
+  unsigned f;                          /* flags */
+#define TVRF_BROKEN 0x0001u            /*   communications have failed */
+};
+#define TVEC_REMOTECOMMS_INIT { -1, -1, DBUF_INIT, 0, 0, 0, 0, 0, 0 }
+
+struct tvec_remotectx {
+  /* Remote environment context; private. */
+
+  struct tvec_state *tv;               /* test vector state */
+  struct tvec_remotecomms rc;          /* communication state */
+  const struct tvec_remoteenv *re;     /* environment configuration */
+  void *subctx;                                /* subenvironment context */
+  struct tvec_vardef vd;               /* temporary variable definition */
+  unsigned ver;                                /* protocol version */
+  pid_t kid;                           /* child process id */
+  int errfd;                           /* child stderr descriptor */
+  lbuf errbuf;                         /* child stderr line buffer */
+  dstr prgwant, progress;              /* progress: wanted/reported */
+  unsigned exwant, exit;               /* exit status wanted/reported */
+#define TVRF_RCNMASK 0x0300u           /*   reconnection behaviour: */
+#define TVRCN_DEMAND 0x0000u           /*     connect on demand */
+#define TVRCN_SKIP 0x0100u             /*     skip unless connected */
+#define TVRCN_FORCE 0x0200u            /*     force reconnection */
+#define TVRF_MUFFLE 0x0400u            /*   muffle child stderr */
+#define TVRF_SETEXIT 0x0800u           /*   set `@exit' */
+#define TVRF_SETPRG 0x1000u            /*   set `@progress' */
+#define TVRF_SETRCN 0x2000u            /*   set `@reconnect' */
+#define TVRF_SETMASK (TVRF_SETEXIT | TVRF_SETPRG | TVRF_SETRCN)
+                                       /*   mask of @TVTF_SET...@ */
+};
+
+/* Exit status.
+ *
+ * We don't use the conventional encoding returned by the @wait@(2) family of
+ * system calls because it's too hard for our flags type to decode.  Instead,
+ * we use our own encoding.
+ *
+ * The exit code or signal number ends up in the `value' field in the low 12
+ * bits; bit 12 is set if the value field holds a signal, and it if holds an
+ * exit code.  Bits 13--15 hold a code which describes the status of a child
+ * process or connection.
+ */
+#define TVXF_VALMASK 0x0fffu           /* value (exit code or signal) */
+#define TVXF_SIG 0x1000u               /* value is signal, not exit code */
+#define TVXF_CAUSEMASK 0xe000u         /* mask for cause bits */
+#define TVXST_RUN 0x0000u              /*   still running */
+#define TVXST_EXIT 0x2000u             /*   child exited */
+#define TVXST_KILL 0x4000u             /*   child killed by signal */
+#define TVXST_CONT 0x6000u             /*   child continued (?) */
+#define TVXST_STOP 0x8000u             /*   child stopped (?) */
+#define TVXST_DISCONN 0xa000u          /*   disconnected */
+#define TVXST_UNK 0xc000u              /*   unknown */
+#define TVXST_ERR 0xe000u            /*   local error prevented diagnosis */
+
+/* --- Environment implementation --- *
+ *
+ * The following special variables are supported.
+ *
+ *   * %|@exit|% is the expected exit status; see @TVXF_...@ and @TVXST_...@.
+ *
+ *   * %|progress|% is the expected progress token when the test completes.
+ *     On successful completion, this will be %|%DONE|%; it's %|%RUN|% on
+ *     entry to the test function, but that can call @tvec_setprogress@ to
+ *     change it.
+ *
+ *   * %|reconnect|% is a reconnection policy; see @TVRCN_...@.
+ *
+ * Unrecognized variables are passed to the remote server, as are the
+ * environment events.  As a convenience for @fork@-based remote execution,
+ * If the outermost environment in the server's test definition has
+ * @tvec_remotesetup@ as its @setup@ function, then its subordinate
+ * environment is used instead.
+ */
+
+extern tvec_envsetupfn tvec_remotesetup;
+extern tvec_envfindvarfn tvec_remotefindvar;
+extern tvec_envbeforefn tvec_remotebefore;
+extern tvec_envrunfn tvec_remoterun;
+extern tvec_envafterfn tvec_remoteafter;
+extern tvec_envteardownfn tvec_remoteteardown;
+
+#define TVEC_REMOTEENV                                                 \
+  { sizeof(struct tvec_remotectx),                                     \
+    tvec_remotesetup,                                                  \
+    tvec_remotefindvar,                                                        \
+    tvec_remotebefore,                                                 \
+    tvec_remoterun,                                                    \
+    tvec_remoteafter,                                                  \
+    tvec_remoteteardown }
+
+extern tvec_connectfn tvec_fork, tvec_exec;
+
+#define TVEC_REMOTEFORK(subenv, tests)                                 \
+       TVEC_REMOTEENV, { tvec_fork, subenv }, { tests }
+
+#define TVEC_REMOTEEXEC(subenv, args)                                  \
+       TVEC_REMOTEENV, { tvec_exec, subenv }, { args }
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @tvec_setprogress@, @tvec_setprogress_v@ --- *
+ *
+ * Arguments:  @const char *status@ = progress status token format
+ *             @va_list ap@ = argument tail
+ *
+ * Returns:    ---
+ *
+ * Use:                Reports the progress of a test execution to the client.
+ *
+ *             The framework makes use of tokens beginning with %|%|%:
+ *
+ *               * %|%IDLE|%: during the top-level server code;
+ *
+ *               * %|%SETUP|%: during the enclosing environment's @before@
+ *                 function;
+ *
+ *               * %|%RUN|%: during the environment's @run@ function, or the
+ *                 test function; and
+ *
+ *               * %|%DONE|%: during the enclosing environment's @after@
+ *                 function.
+ *
+ *             The intent is that a test can use the progress token to check
+ *             that a function which is expected to crash does so at the
+ *             correct point, so it's expected that more complex test
+ *             functions and/or environments will set their own progress
+ *             tokens to reflect what's going on.
+ */
+
+extern PRINTF_LIKE(1, 2) int tvec_setprogress(const char */*status*/, ...);
+extern int tvec_setprogress_v(const char */*status*/, va_list */*ap*/);
+
+/* --- @tvec_remoteserver@ --- *
+ *
+ * Arguments:  @int infd@, @int outfd@ = input and output file descriptors
+ *             @const struct tvec_config *config@ = test configuration
+ *
+ * Returns:    Suggested exit code.
+ *
+ * Use:                Run a test server, reading packets from @infd@ and writing
+ *             responses and notifications to @outfd@, and invoking tests as
+ *             described by @config@.
+ *
+ *             This function is not particularly general purpose.  It
+ *             expects to `take over' the process, and makes use of private
+ *             global variables.
+ */
+
+extern int tvec_remoteserver(int /*infd*/, int /*outfd*/,
+                            const struct tvec_config */*config*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index 16fd5219e3caeb884c88b8aec3ee73729e655c6a..e7b48db706aee5ad6eb95571c20f02cdbaa673f8 100644 (file)
@@ -40,7 +40,7 @@ tvec-timeout \- test vector framework timeouts
 .SH SYNOPSIS
 .
 .nf
-.B "#include <mLib/tvec.h>"
+.B "#include <mLib/tvec-timeout.h>"
 .PP
 .ta 2n
 .B "struct tvec_timeoutenv {"
index f1b0b0c3ef373165a8acb056378445e999ca746a..c22724d022fa0a1fd45256f99fc18467efedd3d1 100644 (file)
@@ -36,6 +36,8 @@
 #include <unistd.h>
 
 #include "tvec.h"
+#include "tvec-timeout.h"
+#include "tvec-types.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -72,8 +74,8 @@ void tvec_timeoutsetup(struct tvec_state *tv, const struct tvec_env *env,
 
   reset(tc);
 
-  tc->subctx = 0;
-  if (subenv && subenv->ctxsz) tc->subctx = xmalloc(subenv->ctxsz);
+  if (subenv && subenv->ctxsz) tc->subctx = x_alloc(tv->a, subenv->ctxsz);
+  else tc->subctx = 0;
   if (subenv && subenv->setup) subenv->setup(tv, subenv, tc, tc->subctx);
 }
 
@@ -243,6 +245,7 @@ void tvec_timeoutteardown(struct tvec_state *tv, void *ctx)
 
   /* Just call the subsidiary environment. */
   if (subenv && subenv->teardown) subenv->teardown(tv, tc->subctx);
+  x_free(tv->a, tc->subctx);
 }
 
 /*----- That's all, folks -------------------------------------------------*/
diff --git a/test/tvec-timeout.h b/test/tvec-timeout.h
new file mode 100644 (file)
index 0000000..4c21d89
--- /dev/null
@@ -0,0 +1,103 @@
+/* -*-c-*-
+ *
+ * Test-vector framework timeout extension
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_TVEC_TIMEOUT_H
+#define MLIB_TVEC_TIMEOUT_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <sys/time.h>
+
+#ifndef MLIB_TVEC_H
+#  include "tvec.h"
+#endif
+
+/*----- Test environment --------------------------------------------------*/
+
+struct tvec_timeoutenv {
+  /* Timeout environment definition. */
+
+  struct tvec_env _env;
+  int timer;                           /* the timer (@ITIMER_...@) */
+  double t;                            /* time to wait (in seconds) */
+  const struct tvec_env *env;          /* subsidiary environment */
+};
+
+struct tvec_timeoutctx {
+  /* Timeout environment context; private. */
+
+  const struct tvec_timeoutenv *te;    /* saved environment description */
+  int timer;                           /* timer code (as overridden) */
+  double t;                            /* time to wait (as overridden) */
+  unsigned f;                          /* flags */
+#define TVTF_SETTMO 1u                 /*   set `@timeout' */
+#define TVTF_SETTMR 2u                 /*   set `@timer' */
+#define TVTF_SETMASK (TVTF_SETTMO | TVTF_SETTMR)
+                                       /*   mask of @TVTF_SET...@ */
+  void *subctx;                                /* subordinate environment context */
+};
+
+/* --- Environment implementation --- *
+ *
+ * The following special variables are supported.
+ *
+ *   * %|@timeout|% is the duration to wait before killing the process.
+ *
+ *   * %|@timer|% is the timer to use to measure the duration.
+ *
+ * Unrecognized variables are passed to the subordinate environment, if there
+ * is one.  Other events are passed through to the subordinate environment.
+ */
+
+extern tvec_envsetupfn tvec_timeoutsetup;
+extern tvec_envfindvarfn tvec_timeoutfindvar;
+extern tvec_envbeforefn tvec_timeoutbefore;
+extern tvec_envrunfn tvec_timeoutrun;
+extern tvec_envafterfn tvec_timeoutafter;
+extern tvec_envteardownfn tvec_timeoutteardown;
+
+#define TVEC_TIMEOUTENV                                                        \
+       { sizeof(struct tvec_timeoutctx),                               \
+         tvec_timeoutsetup,                                            \
+         tvec_timeoutfindvar,                                          \
+         tvec_timeoutbefore,                                           \
+         tvec_timeoutrun,                                              \
+         tvec_timeoutafter,                                            \
+         tvec_timeoutteardown }
+#define TVEC_TIMEOUTINIT(timer, t) TVEC_TIMEOUTENV, timer, t
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index a3f931ee84a4af16a09800131c63157840a55b14..72d569f2f848672ec7359b80cbe8bf42454b3624 100644 (file)
@@ -106,7 +106,7 @@ tvec-types \- test vector framework provided register types
 .SH SYNOPSIS
 .
 .nf
-.B "#include <mLib/tvec.h>"
+.B "#include <mLib/tvec-types.h>"
 .PP
 .B "const struct tvec_regty tvty_int, tvty_uint;"
 .PP
index dc70dbd4c45ee08360c279eaea5453ed7ef7a44f..8d07ea82b4df21dc43721e8055cbacec0394c992 100644 (file)
 #  include "hex.h"
 #include "dstr.h"
 #include "maths.h"
+
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-types.h"
 
 /*----- Preliminary utilities ---------------------------------------------*/
 
@@ -166,11 +169,11 @@ static int signed_from_buf(buf *b, long *i_out)
   return (0);
 }
 
-/* --- @check_unsigned_range@, @check_signed_range@ --- *
+/* --- @check_signed_range@, @check_unsigned_range@ --- *
  *
- * Arguments:  @unsigned long u@ or @long i@ = an integer
- *             @const struct tvec_urange *ur@ or
- *                     @const struct tvec_irange *ir@ = range specification,
+ * Arguments:  @long i@ or @unsigned long u@ = an integer
+ *             @const struct tvec_irange *ir@ or
+ *                     @const struct tvec_urange *ur@ = range specification,
  *                     or null
  *             @struct tvec_state *tv@ = test vector state
  *             @const char *what@ = description of value
@@ -185,10 +188,35 @@ static int check_signed_range(long i,
                              const struct tvec_irange *ir,
                              struct tvec_state *tv, const char *what)
 {
-  if (ir && (ir->min > i || i > ir->max)) {
-    tvec_error(tv, "%s %ld out of range (must be in [%ld .. %ld])",
-              what, i, ir->min, ir->max);
-    return (-1);
+  long ii, aa, m;
+
+  if (ir) {
+    if (ir->min > i || i > ir->max) {
+      tvec_error(tv, "%s %ld out of range (must be in [%ld .. %ld])",
+                what, i, ir->min, ir->max);
+      return (-1);
+    }
+    m = ir->m; if (m > 0) m = -m;
+    if (m && m != -1) {
+      /* Reduce both the integer and the intended residue to the canonical
+       * interval [0, m).  This is more awkward than it should be because C
+       * (following CPU designs) adopted an unhelpful definition of integer
+       * division when the dividend is negative.
+       *
+       * Note that I've canonicalized the divisor to be %%\emph{negative}%%,
+       * because in two's-complement arithmetic, the absolute value of the
+       * most negative representable value is not itself representable.  The
+       * residue modulo the most negative value will itself be representable.
+       */
+
+      ii = i%m; if (ii < 0) ii -= m;
+      aa = ir->a%m; if (aa < 0) aa -= m;
+      if (ii != aa) {
+       tvec_error(tv, "%s %ld == %ld =/= %ld (mod %ld)",
+                  what, i, ii, ir->a, ir->m);
+       return (-1);
+      }
+    }
   }
   return (0);
 }
@@ -197,10 +225,22 @@ static int check_unsigned_range(unsigned long u,
                                const struct tvec_urange *ur,
                                struct tvec_state *tv, const char *what)
 {
-  if (ur && (ur->min > u || u > ur->max)) {
-    tvec_error(tv, "%s %lu out of range (must be in [%lu .. %lu])",
-              what, u, ur->min, ur->max);
-    return (-1);
+  unsigned long uu;
+
+  if (ur) {
+    if (ur->min > u || u > ur->max) {
+      tvec_error(tv, "%s %lu out of range (must be in [%lu .. %lu])",
+                what, u, ur->min, ur->max);
+      return (-1);
+    }
+    if (ur->m && ur->m != 1) {
+      uu = u%ur->m;
+      if (uu != ur->a%ur->m) {
+       tvec_error(tv, "%s %lu == %lu =/= %lu (mod %lu)",
+                  what, u, uu, ur->a, ur->m);
+       return (-1);
+      }
+    }
   }
   return (0);
 }
@@ -587,12 +627,12 @@ static void format_floating(const struct gprintf_ops *gops, void *go,
      *
      * So that's why we have this.
      *
-     * I'm going to assume that @n = DBL_MANT_DIG@ is sufficiently small that
-     * we can calculate this without ending up on the wrong side of an
+     * I'm going to assume that @n = DBL_MANT_DIG@ is sufficiently small
+     * that we can calculate this without ending up on the wrong side of an
      * integer boundary.
      *
-     * In C11, we have @DBL_DECIMAL_DIG@, which should be the same value only
-     * as a constant.  Except that modern compilers are more than clever
+     * In C11, we have @DBL_DECIMAL_DIG@, which should be the same value
+     * only as a constant.  Except that modern compilers are more than clever
      * enough to work out that this is a constant anyway.
      *
      * This is sometimes an overestimate: we'll print out meaningless digits
@@ -603,7 +643,11 @@ static void format_floating(const struct gprintf_ops *gops, void *go,
      * something else in difficult situations).
      */
 
+#ifdef DBL_DECIMAL_DIG
+    prec = DBL_DECIMAL_DIG;
+#else
     prec = ceil(DBL_MANT_DIG*log(FLT_RADIX)/log(10)) + 1;
+#endif
     gprintf(gops, go, "%.*g", prec, x);
   }
 }
@@ -679,7 +723,11 @@ static int parse_floating(double *x_out, const char **q_out, const char *p,
 
     /* Parse the number using the system parser. */
     olderr = errno; errno = 0;
+#if __STDC_VERSION__ >= 199901
     x = strtod(p, &q);
+#else
+    x = strtold(p, &q);
+#endif
     if (q_out) *q_out = q;
     else if (*q) { tvec_syntax(tv, *q, "end-of-line"); rc = -1; goto end; }
     if (errno && (errno != ERANGE || (x > 0 ? -x : x) == HUGE_VAL)) {
@@ -696,8 +744,10 @@ static int parse_floating(double *x_out, const char **q_out, const char *p,
     rc = -1; goto end;
   }
 
-  if (fi && ((!(fi->f&TVFF_NOMIN) && x < fi->min) ||
-            (!(fi->f&TVFF_NOMAX) && x > fi->max))) {
+  if (fi &&
+      ((!(fi->f&TVFF_NOMIN) && x < fi->min) ||
+       (!(fi->f&TVFF_NOMAX) && x > fi->max)) &&
+      !(INFP(x) && (fi->f&(NEGP(x) ? TVFF_NEGINFOK : TVFF_POSINFOK)))) {
     dstr_puts(&d, "floating-point number ");
     format_floating(&dstr_printops, &d, x);
     dstr_puts(&d, " out of range (must be in ");
@@ -874,6 +924,36 @@ static void format_char(const struct gprintf_ops *gops, void *go, int ch)
   }
 }
 
+/* --- @fill_pattern@ --- *
+ *
+ * Arguments:  @void *p@ = destination pointer
+ *             @size_t sz@ = destination buffer size
+ *             @const void *pat@ = pointer to pattern
+ *             @size_t patsz@ = pattern size
+ *
+ * Returns:    ---
+ *
+ * Use:                Fill the destination buffer with as many copies of the
+ *             pattern as will fit, followed by as many initial bytes of the
+ *             pattern will fit in the remaining space.
+ */
+
+static void fill_pattern(void *p, size_t sz, const void *pat, size_t patsz)
+{
+  unsigned char *q = p;
+
+  if (patsz == 1)
+    memset(q, *(unsigned char *)pat, sz);
+  else {
+    if (sz > patsz) {
+      memcpy(q, pat, patsz); pat = q; q += patsz; sz -= patsz;
+      while (sz > patsz)
+       { memcpy(q, pat, patsz); q += patsz; sz -= patsz; patsz *= 2; }
+    }
+    memcpy(q, pat, sz);
+  }
+}
+
 /* --- @maybe_format_unsigned_char@, @maybe_format_signed_char@ --- *
  *
  * Arguments:  @const struct gprintf_ops *gops@ = print operations
@@ -1175,6 +1255,7 @@ static int flush_codec(codec *cdc, dstr *d, struct tvec_state *tv)
  *             If the initial buffer pointer is non-null and sufficiently
  *             large, then it will be reused; otherwise, it is freed and a
  *             fresh, sufficiently large buffer is allocated and returned.
+ *             This buffer unconditionally uses the standard-library arena.
  */
 
 #define RCSF_NESTED 1u
@@ -1273,11 +1354,9 @@ static int read_compound_string(void **p_inout, size_t *sz_inout,
          if (sz) {
            if (n > (size_t)-1/sz)
              { rc = tvec_error(tv, "repeat size out of range"); goto end; }
-           dstr_ensure(&d, n*sz);
-           if (sz == 1)
-             { memset(d.buf + d.len, *(unsigned char *)pp, n); d.len += n; }
-           else
-             for (; n--; d.len += sz) memcpy(d.buf + d.len, pp, sz);
+           n *= sz;
+           dstr_ensure(&d, n);
+           fill_pattern(d.buf + d.len, n, pp, sz); d.len += n;
          }
          xfree(pp); pp = 0;
        }
@@ -1321,7 +1400,7 @@ done:
   if (cdc && flush_codec(cdc, &d, tv)) { rc = -1; goto end; }
   cdc = 0;
   if (*sz_inout <= d.len)
-    { xfree(*p_inout); *p_inout = xmalloc(d.len + 1); }
+    { free(*p_inout); *p_inout = x_alloc(&arena_stdlib, d.len + 1); }
   p = *p_inout; memcpy(p, d.buf, d.len); p[d.len] = 0; *sz_inout = d.len;
   rc = 0;
 
@@ -1542,22 +1621,22 @@ const struct tvec_regty tvty_uint = {
 
 /* Predefined integer ranges. */
 const struct tvec_irange
-  tvrange_schar = { SCHAR_MIN, SCHAR_MAX },
-  tvrange_short = { SHRT_MIN, SHRT_MAX },
-  tvrange_int = { INT_MIN, INT_MAX },
-  tvrange_long = { LONG_MIN, LONG_MAX },
-  tvrange_sbyte = { -128, 127 },
-  tvrange_i16 = { -32768, +32767 },
-  tvrange_i32 = { -2147483648, 2147483647 };
+  tvrange_schar = { SCHAR_MIN, SCHAR_MAX, 0, 0 },
+  tvrange_short = { SHRT_MIN, SHRT_MAX, 0, 0 },
+  tvrange_int = { INT_MIN, INT_MAX, 0, 0 },
+  tvrange_long = { LONG_MIN, LONG_MAX, 0, 0 },
+  tvrange_sbyte = { -128, 127, 0, 0 },
+  tvrange_i16 = { -32768, +32767, 0, 0 },
+  tvrange_i32 = { -2147483648, 2147483647, 0, 0 };
 const struct tvec_urange
-  tvrange_uchar = { 0, UCHAR_MAX },
-  tvrange_ushort = { 0, USHRT_MAX },
-  tvrange_uint = { 0, UINT_MAX },
-  tvrange_ulong = { 0, ULONG_MAX },
-  tvrange_size = { 0, (size_t)-1 },
-  tvrange_byte = { 0, 255 },
-  tvrange_u16 = { 0, 65535 },
-  tvrange_u32 = { 0, 4294967295 };
+  tvrange_uchar = { 0, UCHAR_MAX, 0, 0 },
+  tvrange_ushort = { 0, USHRT_MAX, 0, 0 },
+  tvrange_uint = { 0, UINT_MAX, 0, 0 },
+  tvrange_ulong = { 0, ULONG_MAX, 0, 0 },
+  tvrange_size = { 0, (size_t)-1, 0, 0 },
+  tvrange_byte = { 0, 255, 0, 0 },
+  tvrange_u16 = { 0, 65535, 0, 0 },
+  tvrange_u32 = { 0, 4294967295, 0, 0 };
 
 /* --- @tvec_claimeq_int@ --- *
  *
@@ -1771,8 +1850,14 @@ static int tobuf_float(buf *b, const union tvec_regval *rv,
  */
 
 static int frombuf_float(buf *b, union tvec_regval *rv,
-                      const struct tvec_regdef *rd)
-  { return (buf_getf64l(b, &rv->f)); }
+                        const struct tvec_regdef *rd)
+{
+  double t;
+  int rc;
+
+  rc = buf_getf64l(b, &t); if (!rc) rv->f = t;
+  return (rc);
+}
 
 /* --- @parse_float@ --- *
  *
@@ -1843,6 +1928,10 @@ const struct tvec_regty tvty_float = {
 
 /* Predefined floating-point ranges. */
 const struct tvec_floatinfo
+  tvflt_float = { TVFF_EXACT | TVFF_INFOK | TVFF_NANOK,
+                 -FLT_MAX, FLT_MAX, 0.0 },
+  tvflt_double = { TVFF_EXACT | TVFF_INFOK | TVFF_NANOK,
+                  -DBL_MAX, DBL_MAX, 0.0 },
   tvflt_finite = { TVFF_EXACT, -DBL_MAX, DBL_MAX, 0.0 },
   tvflt_nonneg = { TVFF_EXACT, 0, DBL_MAX, 0.0 };
 
@@ -2105,7 +2194,7 @@ const struct tvec_regty tvty_duration = {
 /* --- @tvec_claimeqish_duration@ --- *
  *
  * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @double to, t1@ = two durations
+ *             @double t0, t1@ = two durations
  *             @unsigned f@ = flags (@TVFF_...@)
  *             @double delta@ = maximum tolerable difference
  *             @const char *file@, @unsigned @lno@ = calling file and line
@@ -2275,7 +2364,7 @@ static int frombuf_penum(buf *b, union tvec_regval *rv,
 
   for (pa = pei->av, n = 0; pa->tag; pa++, n++);
   if (signed_from_buf(b, &i)) return (-1);
-  if (0 <= i && i < n) rv->p = (/*unconst*/ void *)pei->av[i].p;
+  if (0 <= i && i < n) rv->p = UNCONST(void, pei->av[i].p);
   else if (i == -1) rv->p = 0;
   else { buf_break(b); return (-1); }
   return (0);
@@ -2339,7 +2428,7 @@ static int frombuf_penum(buf *b, union tvec_regval *rv,
                          { rc = -1; goto end; }
 
 #define LITSTR_PTR     "`#nil'"
-#define FOUND_PTR      rv->p = (/*unconst*/ void *)a->p;
+#define FOUND_PTR      rv->p = UNCONST(void, a->p);
 #define MISSING_PTR    if (STRCMP(d.buf, ==, "#nil"))                  \
                          rv->p = 0;                                    \
                        else {                                          \
@@ -2527,7 +2616,7 @@ const struct tvec_ienuminfo tvenum_cmp =
 #define GET_INT(e) (e)
 #define GET_UINT(e) (e)
 #define GET_FLT(e) (e)
-#define GET_PTR(e) ((/*unconst*/ void *)(e))
+#define GET_PTR(e) (UNCONST(void, (e)))
 TVEC_MISCSLOTS(DEFCLAIM)
 #undef DEFCLAIM
 #undef GET_INT
@@ -2652,8 +2741,9 @@ static void dump_flags(const union tvec_regval *rv,
     }
 
   if (v&m) gprintf(gops, go, "%s0x%0*lx", sep, hex_width(v), v&m);
+  else if (!v && m == ~0ul) gprintf(gops, go, "0");
 
-  if (m != ~0ul && !(style&(TVSF_COMPACT | TVSF_RAW)))
+  if (!(style&(TVSF_COMPACT | TVSF_RAW)))
     gprintf(gops, go, " ; = 0x%0*lx", hex_width(rv->u), rv->u);
 }
 
@@ -3044,11 +3134,11 @@ static void init_bytes(union tvec_regval *rv, const struct tvec_regdef *rd)
 
 static void release_text(union tvec_regval *rv,
                         const struct tvec_regdef *rd)
-  { xfree(rv->text.p); }
+  { free(rv->text.p); }
 
 static void release_bytes(union tvec_regval *rv,
                          const struct tvec_regdef *rd)
-  { xfree(rv->bytes.p); }
+  { free(rv->bytes.p); }
 
 /* --- @eq_text@, @eq_bytes@ --- *
  *
@@ -3153,10 +3243,23 @@ static int frombuf_bytes(buf *b, union tvec_regval *rv,
 static int check_string_length(size_t sz, const struct tvec_urange *ur,
                               struct tvec_state *tv)
 {
-  if (ur && (ur->min > sz || sz > ur->max))
-    return (tvec_error(tv,
-                      "invalid string length %lu; must be in [%lu .. %lu]",
-                      (unsigned long)sz, ur->min, ur->max));
+  unsigned long uu;
+
+  if (ur) {
+    if  (ur->min > sz || sz > ur->max) {
+      tvec_error(tv, "invalid string length %lu; must be in [%lu .. %lu]",
+                (unsigned long)sz, ur->min, ur->max);
+      return (-1);
+    }
+    if (ur->m && ur->m != 1) {
+      uu = sz%ur->m;
+      if (uu != ur->a%ur->m) {
+       tvec_error(tv, "invalid string length %lu == %lu =/= %lu (mod %lu)",
+                  (unsigned long)sz, uu, ur->a, ur->m);
+       return (-1);
+      }
+    }
+  }
   return (0);
 }
 
@@ -3326,6 +3429,7 @@ static void dump_bytes(const union tvec_regval *rv,
   if (!rv->text.sz) { dump_empty("bytes", style, gops, go); return; }
 
   if (style&(TVSF_COMPACT | TVSF_RAW)) {
+    if (style&TVSF_RAW) gprintf(gops, go, "bytes:");
     while (p < l) gprintf(gops, go, "%02x", *p++);
     return;
   }
@@ -3387,8 +3491,8 @@ int tvec_claimeq_text(struct tvec_state *tv,
                      const char *p1, size_t sz1,
                      const char *file, unsigned lno, const char *expr)
 {
-  tv->out[0].v.text.p = (/*unconst*/ char *)p0; tv->out[0].v.text.sz = sz0;
-  tv->in[0].v.text.p =(/*unconst*/ char *) p1; tv->in[0].v.text.sz = sz1;
+  tv->out[0].v.text.p = UNCONST(char, p0); tv->out[0].v.text.sz = sz0;
+  tv->in[0].v.text.p =UNCONST(char, p1); tv->in[0].v.text.sz = sz1;
   return (tvec_claimeq(tv, &tvty_text, 0, file, lno, expr));
 }
 
@@ -3412,10 +3516,8 @@ int tvec_claimeq_textz(struct tvec_state *tv,
                       const char *p0, const char *p1,
                       const char *file, unsigned lno, const char *expr)
 {
-  tv->out[0].v.text.p = (/*unconst*/ char *)p0;
-    tv->out[0].v.text.sz = strlen(p0);
-  tv->in[0].v.text.p = (/*unconst*/ char *)p1;
-    tv->in[0].v.text.sz = strlen(p1);
+  tv->out[0].v.text.p = UNCONST(char, p0); tv->out[0].v.text.sz = strlen(p0);
+  tv->in[0].v.text.p = UNCONST(char, p1); tv->in[0].v.text.sz = strlen(p1);
   return (tvec_claimeq(tv, &tvty_text, 0, file, lno, expr));
 }
 
@@ -3443,10 +3545,8 @@ int tvec_claimeq_bytes(struct tvec_state *tv,
                       const void *p1, size_t sz1,
                       const char *file, unsigned lno, const char *expr)
 {
-  tv->out[0].v.bytes.p = (/*unconst*/ void *)p0;
-    tv->out[0].v.bytes.sz = sz0;
-  tv->in[0].v.bytes.p = (/*unconst*/ void *)p1;
-    tv->in[0].v.bytes.sz = sz1;
+  tv->out[0].v.bytes.p = UNCONST(void, p0); tv->out[0].v.bytes.sz = sz0;
+  tv->in[0].v.bytes.p = UNCONST(void, p1); tv->in[0].v.bytes.sz = sz1;
   return (tvec_claimeq(tv, &tvty_bytes, 0, file, lno, expr));
 }
 
@@ -3473,14 +3573,16 @@ int tvec_claimeq_bytes(struct tvec_state *tv,
 
 void tvec_alloctext(union tvec_regval *rv, size_t sz)
 {
-  if (rv->text.sz <= sz) { xfree(rv->text.p); rv->text.p = xmalloc(sz + 1); }
-  rv->text.sz = sz;
+  if (rv->text.sz <= sz)
+    { free(rv->text.p); rv->text.p = x_alloc(&arena_stdlib, sz + 1); }
+  memset(rv->text.p, '?', sz); rv->text.sz = sz;
 }
 
 void tvec_allocbytes(union tvec_regval *rv, size_t sz)
 {
-  if (rv->bytes.sz < sz) { xfree(rv->bytes.p); rv->bytes.p = xmalloc(sz); }
-  rv->bytes.sz = sz;
+  if (rv->bytes.sz < sz)
+    { free(rv->bytes.p); rv->bytes.p = x_alloc(&arena_stdlib, sz); }
+  memset(rv->bytes.p, '?', sz); rv->bytes.sz = sz;
 }
 
 /*----- Buffer type -------------------------------------------------------*/
@@ -3515,7 +3617,7 @@ static void init_buffer(union tvec_regval *rv, const struct tvec_regdef *rd)
 
 static void release_buffer(union tvec_regval *rv,
                           const struct tvec_regdef *rd)
-  { if (rv->buf.p) xfree(rv->buf.p - rv->buf.off); }
+  { if (rv->buf.p) free(rv->buf.p - rv->buf.off); }
 
 /* --- @eq_buffer@ --- *
  *
@@ -3673,6 +3775,7 @@ static void dump_buffer(const union tvec_regval *rv,
                        unsigned style,
                        const struct gprintf_ops *gops, void *go)
 {
+  if (style&TVSF_RAW) gprintf(gops, go, "buffer:");
   format_size(gops, go, rv->buf.sz, style);
   if (rv->buf.m) {
     gprintf(gops, go, style&(TVSF_COMPACT | TVSF_RAW) ? "@" : " @ ");
@@ -3682,7 +3785,7 @@ static void dump_buffer(const union tvec_regval *rv,
       format_size(gops, go, rv->buf.a, style);
     }
   }
-  if (!(style&TVSF_COMPACT)) {
+  if (!(style&(TVSF_COMPACT | TVSF_RAW))) {
     gprintf(gops, go, " ; = %lu", (unsigned long)rv->buf.sz);
     if (rv->buf.m) {
       gprintf(gops, go, " @ %lu", (unsigned long)rv->buf.m);
@@ -3736,12 +3839,12 @@ void tvec_allocbuffer(union tvec_regval *rv)
 {
   unsigned char *p; size_t n;
 
-  if (rv->buf.p) xfree(rv->buf.p - rv->buf.off);
+  if (rv->buf.p) free(rv->buf.p - rv->buf.off);
 
   if (rv->buf.m < 2) {
-    rv->buf.p = xmalloc(rv->buf.sz); rv->buf.off = 0;
+    rv->buf.p = x_alloc(&arena_stdlib, rv->buf.sz); rv->buf.off = 0;
   } else {
-    p = xmalloc(rv->buf.sz + rv->buf.m - 1);
+    p = x_alloc(&arena_stdlib, rv->buf.sz + rv->buf.m - 1);
     n = (size_t)p%rv->buf.m;
     rv->buf.off = (rv->buf.a - n + rv->buf.m)%rv->buf.m;
     rv->buf.p = p + rv->buf.off;
diff --git a/test/tvec-types.h b/test/tvec-types.h
new file mode 100644 (file)
index 0000000..60f81d4
--- /dev/null
@@ -0,0 +1,876 @@
+/* -*-c-*-
+ *
+ * Test-vector framework basic register types
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_TVEC_TYPES_H
+#define MLIB_TVEC_TYPES_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#ifndef MLIB_TVEC_H
+#  include "tvec.h"
+#endif
+
+/*----- Integer types: signed and unsigned --------------------------------*/
+
+/* Integers may be input in decimal, hex, binary, or octal, following
+ * approximately usual conventions.
+ *
+ *   * Signed integers may be preceded with a `+' or `-' sign.
+ *
+ *   * Decimal integers are just a sequence of decimal digits `0' ... `9'.
+ *
+ *   * Octal integers are a sequence of digits `0' ... `7', preceded by `0o'
+ *     or `0O'.
+ *
+ *   * Hexadecimal integers are a sequence of digits `0' ... `9', `a'
+ *     ... `f', or `A' ... `F', preceded by `0x' or `0X'.
+ *
+ *   * Radix-B integers are a sequence of digits `0' ... `9', `a' ... `f', or
+ *     `A' ... `F', each with value less than B, preceded by `Br' or `BR',
+ *     where 0 < B < 36 is expressed in decimal without any leading `0' or
+ *     internal underscores `_'.
+ *
+ *   * A digit sequence may contain internal underscore `_' separators, but
+ *     not before or after all of the digits; and two consecutive `_'
+ *     characters are not permitted.
+ */
+
+extern const struct tvec_regty tvty_int, tvty_uint;
+
+/* The @arg.p@ slot may be null or a pointer to @struct tvec_irange@ or
+ * @struct tvec_urange@ as appropriate.  The bounds are inclusive; use, e.g.,
+ * @LONG_MAX@ explicitly if one or the other bound is logically inapplicable.
+ * If %$m$% is nonzero, then the value must additionally be congruent to
+ * %$a$% modulo %$m$%.
+ */
+struct tvec_irange { long min, max, m, a; };
+struct tvec_urange { unsigned long min, max, m, a; };
+
+/* Bounds corresponding to common integer types. */
+extern const struct tvec_irange
+  tvrange_schar, tvrange_short, tvrange_int, tvrange_long,
+  tvrange_sbyte, tvrange_i16, tvrange_i32;
+extern const struct tvec_urange
+  tvrange_uchar, tvrange_ushort, tvrange_uint, tvrange_ulong, tvrange_size,
+  tvrange_byte, tvrange_u16, tvrange_u32;
+
+/* --- @tvec_claimeq_int@, @TVEC_CLAIMEQ_INT@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @long i0, i1@ = two signed integers
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @i0@ and @i1@ are equal, otherwise zero.
+ *
+ * Use:                Check that values of @i0@ and @i1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @i0@ is printed as the output
+ *             value and @i1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_INT@ macro is similar, only it (a) identifies
+ *             the file and line number of the call site automatically, and
+ *             (b) implicitly quotes the source text of the @i0@ and @i1@
+ *             arguments in the failure message.
+ */
+
+extern int tvec_claimeq_int(struct tvec_state */*tv*/,
+                           long /*i0*/, long /*i1*/,
+                           const char */*file*/, unsigned /*lno*/,
+                           const char */*expr*/);
+#define TVEC_CLAIMEQ_INT(tv, i0, i1)                                   \
+       (tvec_claimeq_int(tv, i0, i1, __FILE__, __LINE__, #i0 " /= " #i1))
+
+/* --- @tvec_claimeq_uint@, @TVEC_CLAIMEQ_UINT@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @unsigned long u0, u1@ = two unsigned integers
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @u0@ and @u1@ are equal, otherwise zero.
+ *
+ * Use:                Check that values of @u0@ and @u1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @u0@ is printed as the output
+ *             value and @u1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_UINT@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @u0@ and @u1@ arguments in the failure message.
+ */
+
+extern int tvec_claimeq_uint(struct tvec_state */*tv*/,
+                           unsigned long /*u0*/, unsigned long /*u1*/,
+                           const char */*file*/, unsigned /*lno*/,
+                           const char */*expr*/);
+#define TVEC_CLAIMEQ_UINT(tv, u0, u1)                                  \
+       (tvec_claimeq_uint(tv, u0, u1, __FILE__, __LINE__, #u0 " /= " #u1))
+
+/*----- Size type ---------------------------------------------------------*/
+
+/* A size is an unsigned integer followed by an optional unit specifier
+ * consisting of an SI unit prefix and (optionally) the letter `B'.
+ */
+
+extern const struct tvec_regty tvty_size;
+
+/* --- @tvec_claimeq_size@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @unsigned long sz0, sz1@ = two sizes
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @sz0@ and @sz1@ are equal, otherwise zero.
+ *
+ * Use:                Check that values of @u0@ and @u1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @u0@ is printed as the output
+ *             value and @u1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_SIZE@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @u0@ and @u1@ arguments in the failure message.
+ */
+
+int tvec_claimeq_size(struct tvec_state *tv,
+                     unsigned long sz0, unsigned long sz1,
+                     const char *file, unsigned lno, const char *expr);
+#define TVEC_CLAIMEQ_UINT(tv, u0, u1)                                  \
+       (tvec_claimeq_uint(tv, u0, u1, __FILE__, __LINE__, #u0 " /= " #u1))
+
+/*----- Floating-point type -----------------------------------------------*/
+
+/* Floating-point values are either NaN (%|#nan|%, if supported by the
+ * platform); positive or negative infinity (%|#inf|%, %|+#inf|%, or
+ * %|#+inf|% (preferring the last), and %|-#inf|% or %|#-inf|% (preferring
+ * the latter), if supported by the platform); or a number in strtod(3)
+ * syntax.
+ *
+ * The comparison rules for floating-point numbers are complex: see
+ * @tvec_claimeqish_float@ for details.
+ */
+
+extern const struct tvec_regty tvty_float;
+
+struct tvec_floatinfo {
+  /* Details about acceptable floating-point values. */
+
+  unsigned f;                          /* flags (@TVFF_...@ bits) */
+#define TVFF_NOMIN 0x0001              /*   ignore @min@ (allow -∞) */
+#define TVFF_NOMAX 0x0002              /*   ignore @max@ (allow +∞) */
+#define TVFF_NANOK 0x0004              /*   permit NaN */
+#define TVFF_NEGINFOK 0x0008           /*   permit -∞, check finite */
+#define TVFF_POSINFOK 0x0010           /*   permit +∞, check finite */
+#define TVFF_INFOK (TVFF_NEGINFOK | TVFF_POSINFOK) /* permit Â±âˆž */
+#define TVFF_EQMASK 0x0f00             /*   how to compare */
+#define TVFF_EXACT 0x0000              /*     must equal exactly */
+#define TVFF_ABSDELTA 0x0100           /*     must be within @delta@ */
+#define TVFF_RELDELTA 0x0200           /*     diff < @delta@ fraction */
+  double min, max;                     /* smallest/largest value allowed */
+  double delta;                                /* maximum tolerable difference */
+};
+
+extern const struct tvec_floatinfo
+  tvflt_float, tvflt_double, tvflt_finite, tvflt_nonneg;
+
+/* --- @tvec_claimeqish_float@, @TVEC_CLAIMEQISH_FLOAT@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @double f0, f1@ = two floating-point numbers
+ *             @unsigned f@ = flags (@TVFF_...@)
+ *             @double delta@ = maximum tolerable difference
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @f0@ and @f1@ are sufficiently close, otherwise
+ *             zero.
+ *
+ * Use:                Check that values of @f0@ and @f1@ are sufficiently close.
+ *             As for @tvec_claim@ above, a test case is automatically begun
+ *             and ended if none is already underway.  If the values are
+ *             too far apart, then @tvec_fail@ is called, quoting @expr@,
+ *             and the mismatched values are dumped: @f0@ is printed as the
+ *             output value and @f1@ is printed as the input reference.
+ *
+ *             The details for the comparison are as follows.
+ *
+ *               * A NaN value matches any other NaN, and nothing else.
+ *
+ *               * An infinity matches another infinity of the same sign,
+ *                 and nothing else.
+ *
+ *               * If @f&TVFF_EQMASK@ is @TVFF_EXACT@, then any
+ *                 representable number matches only itself: in particular,
+ *                 positive and negative zero are considered distinct.
+ *                 (This allows tests to check that they land on the correct
+ *                 side of branch cuts, for example.)
+ *
+ *               * If @f&TVFF_EQMASK@ is @TVFF_ABSDELTA@, then %$x$% matches
+ *                 %$y$% when %$|x - y| < \delta$%.
+ *
+ *               * If @f&TVFF_EQMASK@ is @TVFF_RELDELTA@, then %$x$% matches
+ *                 %$y$% when %$|1 - x/y| < \delta$%.  (Note that this
+ *                 criterion is asymmetric.  Write %$x \approx_\delta y$%
+ *                 if and only if %$|1 - x/y < \delta$%.  Then, for example,
+ *                 if %$y/(1 + \delta) < x < y (1 - \delta)$%, then
+ *                 %$x \approx_\delta y$%, but %$y \not\approx_\delta x$%.)
+ *
+ *             The @TVEC_CLAIM_FLOAT@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @f0@ and @f1@ arguments (and @delta@) in the failure
+ *             message.
+ */
+
+extern int tvec_claimeqish_float(struct tvec_state */*tv*/,
+                                double /*f0*/, double /*f1*/,
+                                unsigned /*f*/, double /*delta*/,
+                                const char */*file*/, unsigned /*lno*/,
+                                const char */*expr*/);
+#define TVEC_CLAIMEQISH_FLOAT(tv, f0, f1, f, delta)                    \
+       (tvec_claimeqish_float(tv, f0, f1, f, delta, __FILE__, __LINE__, \
+                              #f0 " /= " #f1 " (+/- " #delta ")"))
+
+/* --- @tvec_claimeq_float@, @TVEC_CLAIMEQ_FLOAT@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @double f0, f1@ = two floating-point numbers
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @f0@ and @u1@ are identical, otherwise zero.
+ *
+ * Use:                Check that values of @f0@ and @f1@ are identical.  The
+ *             function is exactly equivalent to @tvec_claimeqish_float@
+ *             with @f == TVFF_EXACT@; the macro is similarly like
+ *             @TVEC_CLAIMEQISH_FLOAT@ with @f == TVFF_EXACT@, except that
+ *             it doesn't bother to quote a delta.
+ */
+
+extern int tvec_claimeq_float(struct tvec_state */*tv*/,
+                             double /*f0*/, double /*f1*/,
+                             const char */*file*/, unsigned /*lno*/,
+                             const char */*expr*/);
+#define TVEC_CLAIMEQ_FLOAT(tv, f0, f1)                                 \
+       (tvec_claimeq_float(tv, f0, f1, __FILE__, __LINE__, #f0 " /= " #f1))
+
+/*----- Durations ---------------------------------------------------------*/
+
+/* A duration measures a time interval in seconds.  The input format consists
+ * of a nonnegative decimal floating-point number in @strtod@ format followed
+ * by an optional unit specification.
+ */
+
+extern const struct tvec_regty tvty_duration;
+
+/* --- @tvec_parsedurunit@ --- *
+ *
+ * Arguments:  @double *scale_out@ = where to leave the scale
+ *             @const char **p_inout@ = input unit string, updated
+ *
+ * Returns:    Zero on success, %$-1$% on error.
+ *
+ * Use:                If @*p_inout@ begins with a unit string followed by the end
+ *             of the string or some non-alphanumeric character, then store
+ *             the corresponding scale factor in @*scale_out@, advance
+ *             @*p_inout@ past the unit string, and return zero.  Otherwise,
+ *             return %$-1$%.
+ */
+
+extern int tvec_parsedurunit(double */*scale_out*/,
+                            const char **/*p_inout*/);
+
+/* --- @tvec_claimeqish_duration@, @TVEC_CLAIMEQISH_DURATION@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @double t0, t1@ = two durations
+ *             @unsigned f@ = flags (@TVFF_...@)
+ *             @double delta@ = maximum tolerable difference
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @t0@ and @t1@ are sufficiently close, otherwise
+ *             zero.
+ *
+ * Use:                Check that values of @t0@ and @t1@ are sufficiently close.
+ *             This is essentially the same as @tvec_claimeqish_float@, only
+ *             it dumps the values as durations on a mismatch.
+ *
+ *             The @TVEC_CLAIM_FLOAT@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @t0@ and @t1@ arguments (and @delta@) in the failure
+ *             message.
+ */
+
+extern int tvec_claimeqish_duration(struct tvec_state */*tv*/,
+                                   double /*t0*/, double /*t1*/,
+                                   unsigned /*f*/, double /*delta*/,
+                                   const char */*file*/, unsigned /*lno*/,
+                                   const char */*expr*/);
+#define TVEC_CLAIMEQISH_DURATION(tv, t0, t1, f, delta)                 \
+       (tvec_claimeqish_duration(tv, t0, t1, f, delta, __FILE__, __LINE__, \
+                              #t0 " /= " #t1 " (+/- " #delta ")"))
+
+/* --- @tvec_claimeq_duration@, @TVEC_CLAIMEQ_DURATION@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @double t0, t1@ = two durations
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @t0@ and @t1@ are identical, otherwise zero.
+ *
+ * Use:                Check that values of @t0@ and @t1@ are identical.  The
+ *             function is exactly equivalent to @tvec_claimeqish_duration@
+ *             with @f == TVFF_EXACT@; the macro is similarly like
+ *             @TVEC_CLAIMEQISH_DURATION@ with @f == TVFF_EXACT@, except
+ *             that it doesn't bother to quote a delta.
+ */
+
+int tvec_claimeq_duration(struct tvec_state */*tv*/,
+                         double /*t0*/, double /*t1*/,
+                         const char */*file*/, unsigned /*lno*/,
+                         const char */*expr*/);
+#define TVEC_CLAIMEQ_DURATION(tv, t0, t1)                                      \
+       (tvec_claimeq_float(tv, t0, t1, __FILE__, __LINE__, #t0 " /= " #t1))
+
+/*----- Enumerated types --------------------------------------------------*/
+
+/* An enumeration describes a set of values of some underlying type, each of
+ * which has a symbolic name.  Values outside of the defined set can occur --
+ * on output, because of bugs in the tested code, or on input to test
+ * handling of unexpected values.
+ *
+ * There is a distinct enumerated type for each of the branches of
+ * @tvec_misc@.  In the following, we write @t@ for the type code, which is
+ * @i@ for signed integer, @u@ for unsigned integer, @f@ for floating-point,
+ * and @p@ for pointer.
+ *
+ * On input, an enumerated value may be given by name or as a literal value.
+ * For enumerations based on numeric types, the literal values can be written
+ * in the same syntax as the underlying values.  For enumerations based on
+ * pointers, the only permitted literal is %|#nil|%, which denotes a null
+ * pointer.  On output, names are preferred (with the underlying value given
+ * in a comment).
+ */
+
+#define DEFENUMTY(tag, ty, slot)                                       \
+       extern const struct tvec_regty tvty_##slot##enum;
+TVEC_MISCSLOTS(DEFENUMTY)
+#undef DEFENUMTY
+
+/* A @struct tvec_tassoc@ associates a string tag with a value. */
+#define DEFASSOC(tag_, ty, slot)                                       \
+       struct tvec_##slot##assoc { const char *tag; ty slot; };
+TVEC_MISCSLOTS(DEFASSOC)
+#undef DEFASSOC
+
+#define TVEC_ENDENUM { 0, 0 }
+
+/* Information about an enumerated type. */
+#define DEFINFO(tag, ty, slot)                                         \
+       struct tvec_##slot##enuminfo {                                  \
+         const char *name;             /* type name for diagnostics */ \
+         const struct tvec_##slot##assoc *av; /* name/value mappings */ \
+         EXTRA_##tag##_INFOSLOTS       /* type-specific extra info */  \
+       };
+
+#define EXTRA_INT_INFOSLOTS                                            \
+       const struct tvec_irange *ir;   /* allowed range of raw values */
+
+#define EXTRA_UINT_INFOSLOTS                                           \
+       const struct tvec_urange *ur;   /* allowed range of raw values */
+
+#define EXTRA_FLT_INFOSLOTS                                            \
+       const struct tvec_floatinfo *fi; /* range and matching policy */
+
+#define EXTRA_PTR_INFOSLOTS            /* (nothing) */
+
+TVEC_MISCSLOTS(DEFINFO)
+
+#undef EXTRA_INT_INFOSLOTS
+#undef EXTRA_UINT_INFOSLOTS
+#undef EXTRA_FLT_INFOSLOTS
+#undef EXTRA_PTR_INFOSLOTS
+
+#undef DEFINFO
+
+/* Standard enumerations. */
+extern const struct tvec_ienuminfo tvenum_bool;
+extern const struct tvec_ienuminfo tvenum_cmp;
+
+/* --- @tvec_claimeq_tenum@, @TVEC_CLAIMEQ_TENUM@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const struct tvec_typeenuminfo *ei@ = enumeration type info
+ *             @ty t0, t1@ = two values
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @t0@ and @t1@ are equal, otherwise zero.
+ *
+ * Use:                Check that values of @t0@ and @t1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @t0@ is printed as the output
+ *             value and @t1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_TENUM@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @t0@ and @t1@ arguments in the failure message.
+ */
+
+#define DECLCLAIM(tag, ty, slot)                                       \
+       extern int tvec_claimeq_##slot##enum                            \
+         (struct tvec_state */*tv*/,                                   \
+          const struct tvec_##slot##enuminfo */*ei*/,                  \
+          ty /*t0*/, ty /*t1*/,                                        \
+          const char */*file*/, unsigned /*lno*/, const char */*expr*/);
+TVEC_MISCSLOTS(DECLCLAIM)
+#undef DECLCLAIM
+#define TVEC_CLAIMEQ_IENUM(tv, ei, i0, i1)                             \
+       (tvec_claimeq_ienum(tv, ei, i0, i1,                             \
+                           __FILE__, __LINE__, #i0 " /= " #i1))
+#define TVEC_CLAIMEQ_UENUM(tv, ei, u0, u1)                             \
+       (tvec_claimeq_uenum(tv, ei, u0, u1,                             \
+                           __FILE__, __LINE__, #u0 " /= " #u1))
+#define TVEC_CLAIMEQ_FENUM(tv, ei, f0, f1)                             \
+       (tvec_claimeq_fenum(tv, ei, f0, f1,                             \
+                           __FILE__, __LINE__, #f0 " /= " #f1))
+#define TVEC_CLAIMEQ_PENUM(tv, ei, p0, p1)                             \
+       (tvec_claimeq_penum(tv, ei, p0, p1,                             \
+                           __FILE__, __LINE__, #p0 " /= " #p1))
+
+/*----- Flags type --------------------------------------------------------*/
+
+/* A flags value packs a number of fields into a single nonnegative integer.
+ * Symbolic names are associated with the possible values of the various
+ * fields; more precisely, each name is associated with a value and a
+ * covering bitmask.
+ *
+ * The input syntax is a sequence of items separated by `%|||%' signs.  Each
+ * item may be the symbolic name of a field value, or a literal unsigned
+ * integer.  The masks associated with the given symbolic names must be
+ * disjoint.  The resulting numerical value is simply the bitwise OR of the
+ * given values.
+ *
+ * On output, the table of symbolic names and their associated values and
+ * masks is repeatedly scanned, in order, to find disjoint matches -- i.e.,
+ * entries whose value matches the target value in the bit positions
+ * indicated by the mask, and whose mask doesn't overlap with any previously
+ * found matches; the names are then output, separated by `%|||%'.  Any
+ * remaining nonzero bits not covered by any of the matching masks are output
+ * as a single literal integer, in hex.
+ */
+
+extern const struct tvec_regty tvty_flags;
+
+struct tvec_flag {
+  /* Definition of a single flag or bitfield value.
+   *
+   * Each named setting comes with a value @v@ and a mask @m@; the mask
+   * should cover all of the value bits, i.e., @(v&~m) == 0@.
+   */
+
+  const char *tag;                     /* name */
+  unsigned long m, v;                  /* mask and value */
+};
+
+#define TVEC_ENDFLAGS { 0, 0, 0 }
+
+struct tvec_flaginfo {
+  /* Information about a flags type. */
+
+  const char *name;                    /* type name for diagnostics  */
+  const struct tvec_flag *fv;          /* name/mask/value mappings */
+  const struct tvec_urange *range;     /* permitted range for literals */
+};
+
+/* --- @tvec_claimeq_flags@, @TVEC_CLAIMEQ_FLAGS@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const struct tvec_flaginfo *fi@ = flags type info
+ *             @unsigned long f0, f1@ = two values
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @f0@ and @f1@ are equal, otherwise zero.
+ *
+ * Use:                Check that values of @f0@ and @f1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @f0@ is printed as the output
+ *             value and @f1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_FLAGS@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @f0@ and @f1@ arguments in the failure message.
+ */
+
+extern int tvec_claimeq_flags(struct tvec_state */*tv*/,
+                             const struct tvec_flaginfo */*fi*/,
+                             unsigned long /*f0*/, unsigned long /*f1*/,
+                             const char */*file*/, unsigned /*lno*/,
+                             const char */*expr*/);
+#define TVEC_CLAIMEQ_FLAGS(tv, fi, f0, f1)                             \
+       (tvec_claimeq_flags(tv, fi, f0, f1,                             \
+                           __FILE__, __LINE__, #f0 " /= " #f1))
+
+/*----- Character type ----------------------------------------------------*/
+
+/* A character value holds a character, as read by @fgetc@.  The special
+ * @EOF@ value can also be represented.
+ *
+ * On input, a character value can be given by symbolic name, with a leading
+ * `%|#|%'; or a character or `%|\|%'-escape sequence, optionally in single
+ * quotes.
+ *
+ * The following escape sequences and character names are recognized.
+ *
+ *   * `%|#eof|%' is the special end-of-file marker.
+ *
+ *   * `%|#nul|%' is the NUL character, sometimes used to terminate strings.
+ *
+ *   * `%|bell|%', `%|bel|%', `%|ding|%', or `%|\a|%' is the BEL character
+ *     used to ring the terminal bell (or do some other thing to attract the
+ *     user's attention).
+ *
+ *   * %|#backspace|%, %|#bs|%, or %|\b|% is the backspace character, used to
+ *     move the cursor backwords by one cell.
+ *
+ *   * %|#escape|% %|#esc|%, or%|\e|% is the escape character, used to
+ *     introduce special terminal commands.
+ *
+ *   * %|#formfeed|%, %|#ff|%, or %|\f|% is the formfeed character, used to
+ *     separate pages of text.
+ *
+ *   * %|#newline|%, %|#linefeed|%, %|#lf|%, %|#nl|%, or %|\n|% is the
+ *     newline character, used to terminate lines of text or advance the
+ *     cursor to the next line (perhaps without returning it to the start of
+ *     the line).
+ *
+ *   * %|#return|%, %|#carriage-return|%, %|#cr|%, or %|\r|% is the
+ *     carriage-return character, used to return the cursor to the start of
+ *     the line.
+ *
+ *   * %|#tab|%, %|#horizontal-tab|%, %|#ht|%, or %|\t|% is the tab
+ *     character, used to advance the cursor to the next tab stop on the
+ *     current line.
+ *
+ *   * %|#vertical-tab|%, %|#vt|%, %|\v|% is the vertical tab character.
+ *
+ *   * %|#space|%, %|#spc|% is the space character.
+ *
+ *   * %|#delete|%, %|#del|% is the delete character, used to erase the most
+ *     recent character.
+ *
+ *   * %|\'|% is the single-quote character.
+ *
+ *   * %|\\|% is the backslash character.
+ *
+ *   * %|\"|% is the double-quote character.
+ *
+ *   * %|\NNN|% or %|\{NNN}|% is the character with code NNN in octal.  The
+ *     NNN may be up to three digits long.
+ *
+ *   * %|\xNN|% or %|\x{NN}|% is the character with code NNN in hexadecimal.
+ */
+
+extern const struct tvec_regty tvty_char;
+
+/* --- @tvec_claimeq_char@, @TVEC_CLAIMEQ_CHAR@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @int ch0, ch1@ = two character codes
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if @ch0@ and @ch1@ are equal, otherwise zero.
+ *
+ * Use:                Check that values of @ch0@ and @ch1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @ch0@ is printed as the output
+ *             value and @ch1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_CHAR@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @ch0@ and @ch1@ arguments in the failure message.
+ */
+
+extern int tvec_claimeq_char(struct tvec_state */*tv*/,
+                            int /*ch0*/, int /*ch1*/,
+                            const char */*file*/, unsigned /*lno*/,
+                            const char */*expr*/);
+#define TVEC_CLAIMEQ_CHAR(tv, c0, c1)                                  \
+       (tvec_claimeq_char(tv, c0, c1, __FILE__, __LINE__, #c0 " /= " #c1))
+
+/*----- Text and binary string types --------------------------------------*/
+
+/* A string is a sequence of octets.  Text and binary strings differ
+ * primarily in presentation: text strings are shown as raw characters where
+ * possible; binary strings are shown as hex dumps with an auxiliary text
+ * display.  Storage for strings always uses the standard C library
+ * allocator, though applications will probably need to call @malloc@ or
+ * @free@ only rarely.
+ *
+ * The input format for both kinds of strings is basically the same: a
+ * `compound string', consisting of
+ *
+ *   * single-quoted strings, which are interpreted entirely literally, but
+ *     can't contain single quotes or newlines;
+ *
+ *   * double-quoted strings, in which `%|\|%'-escapes are interpreted as for
+ *     characters;
+ *
+ *   * character names, marked by an initial `%|#|%' sign;
+ *
+ *   * special tokens marked by an initial `%|!|%' sign; or
+ *
+ *   * barewords interpreted according to the current coding scheme.
+ *
+ * The special tokens are
+ *
+ *   * `%|!bare|%', which causes subsequent sequences of barewords to be
+ *     treated as plain text;
+ *
+ *   * `%|!hex|%', `%|!base32|%', `%|!base64|%', which cause subsequent
+ *     barewords to be decoded in the requested manner.
+ *
+ *   * `%|!repeat|% %$n$% %|{|% %%\textit{string}%% %|}|%', which includes
+ *     %$n$% copies of the (compound) string.
+ *
+ * The only difference between text and binary strings is that the initial
+ * coding scheme is %|bare|% for text strings and %|hex|% for binary strings.
+ *
+ * Either kind of string can contain internal nul characters.  A trailing nul
+ * is appended -- beyond the stated input length -- to input strings as a
+ * convenience to test functions.  Test functions may include such a nul
+ * character on output but this is not checked by the equality test.
+ *
+ * A @struct tvec_urange@ may be supplied as an argument: the length of the
+ * string (in bytes) will be checked against the permitted range.
+ */
+
+extern const struct tvec_regty tvty_text, tvty_bytes;
+
+/* --- @tvec_alloctext@, @tvec_allocbytes@ --- *
+ *
+ * Arguments:  @union tvec_regval *rv@ = register value
+ *             @size_t sz@ = required size
+ *
+ * Returns:    ---
+ *
+ * Use:                Allocated space in a text or binary string register.  If the
+ *             current register size is sufficient, its buffer is left
+ *             alone; otherwise, the old buffer, if any, is freed and a
+ *             fresh buffer allocated.  These functions are not intended to
+ *             be used to adjust a buffer repeatedly, e.g., while building
+ *             output incrementally: (a) they will perform badly, and (b)
+ *             the old buffer contents are simply discarded if reallocation
+ *             is necessary.  Instead, use a @dbuf@ or @dstr@.
+ *
+ *             The @tvec_alloctext@ function sneakily allocates an extra
+ *             byte for a terminating zero.  The @tvec_allocbytes@ function
+ *             doesn't do this.
+ */
+
+extern void tvec_alloctext(union tvec_regval */*rv*/, size_t /*sz*/);
+extern void tvec_allocbytes(union tvec_regval */*rv*/, size_t /*sz*/);
+
+/* --- @tvec_claimeq_text@, @TVEC_CLAIMEQ_TEXT@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const char *p0@, @size_t sz0@ = first string with length
+ *             @const char *p1@, @size_t sz1@ = second string with length
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if the strings at @p0@ and @p1@ are equal, otherwise
+ *             zero.
+ *
+ * Use:                Check that strings at @p0@ and @p1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @p0@ is printed as the output
+ *             value and @p1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_TEXT@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @ch0@ and @ch1@ arguments in the failure message.
+ */
+
+extern int tvec_claimeq_text(struct tvec_state */*tv*/,
+                            const char */*p0*/, size_t /*sz0*/,
+                            const char */*p1*/, size_t /*sz1*/,
+                            const char */*file*/, unsigned /*lno*/,
+                            const char */*expr*/);
+#define TVEC_CLAIMEQ_TEXT(tv, p0, sz0, p1, sz1)                                \
+       (tvec_claimeq_text(tv, p0, sz0, p1, sz1, __FILE__, __LINE__,    \
+                          #p0 "[" #sz0 "] /= " #p1 "[" #sz1 "]"))
+
+/* --- @tvec_claimeq_textz@, @TVEC_CLAIMEQ_TEXTZ@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const char *p0, *p1@ = two strings to compare
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if the strings at @p0@ and @p1@ are equal, otherwise
+ *             zero.
+ *
+ * Use:                Check that strings at @p0@ and @p1@ are equal, as for
+ *             @tvec_claimeq_string@, except that the strings are assumed
+ *             null-terminated, so their lengths don't need to be supplied
+ *             explicitly.  The macro is similarly like @TVEC_CLAIMEQ_TEXT@.
+ */
+
+extern int tvec_claimeq_textz(struct tvec_state */*tv*/,
+                             const char */*p0*/, const char */*p1*/,
+                             const char */*file*/, unsigned /*lno*/,
+                             const char */*expr*/);
+#define TVEC_CLAIMEQ_TEXTZ(tv, p0, p1)                                 \
+       (tvec_claimeq_textz(tv, p0, p1, __FILE__, __LINE__, #p0 " /= " #p1))
+
+/* --- @tvec_claimeq_bytes@, @TVEC_CLAIMEQ_BYTES@ --- *
+ *
+ * Arguments:  @struct tvec_state *tv@ = test-vector state
+ *             @const void *p0@, @size_t sz0@ = first string with length
+ *             @const void *p1@, @size_t sz1@ = second string with length
+ *             @const char *file@, @unsigned @lno@ = calling file and line
+ *             @const char *expr@ = the expression to quote on failure
+ *
+ * Returns:    Nonzero if the strings at @p0@ and @p1@ are equal, otherwise
+ *             zero.
+ *
+ * Use:                Check that binary strings at @p0@ and @p1@ are equal.  As for
+ *             @tvec_claim@ above, a test case is automatically begun and
+ *             ended if none is already underway.  If the values are
+ *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
+ *             mismatched values are dumped: @p0@ is printed as the output
+ *             value and @p1@ is printed as the input reference.
+ *
+ *             The @TVEC_CLAIM_STRING@ macro is similar, only it (a)
+ *             identifies the file and line number of the call site
+ *             automatically, and (b) implicitly quotes the source text of
+ *             the @ch0@ and @ch1@ arguments in the failure message.
+ */
+
+extern int tvec_claimeq_bytes(struct tvec_state */*tv*/,
+                              const void */*p0*/, size_t /*sz0*/,
+                              const void */*p1*/, size_t /*sz1*/,
+                              const char */*file*/, unsigned /*lno*/,
+                              const char */*expr*/);
+#define TVEC_CLAIMEQ_BYTES(tv, p0, sz0, p1, sz1)                       \
+       (tvec_claimeq(tv, p0, sz0, p1, sz1, __FILE__, __LINE__,         \
+                     #p0 "[" #sz0 "] /= " #p1 "[" #sz1 "]"))
+
+/*----- Buffer type -------------------------------------------------------*/
+
+/* Buffer registers are primarily used for benchmarking.  Only a buffer's
+ * allocation parameters are significant: its contents are ignored on
+ * comparison and output, and unspecified on input.
+ *
+ * The input format gives the buffer's size, and an optional alignment
+ * specification, in the form %|SZ [`@' M [`+' A]]|%.  Each of %|SZ|%, %|M|%
+ * and %|A|% are sizes, as an integer, optionally suffixed with a unit `kB',
+ * `MB', `GB', `TB', `PB', `EB', `ZB', `YB' (with or without the `B')
+ * denoting a power of 1024.  The %|SZ|% gives the (effective) buffer size.
+ * %|M|% is the `alignment quantum' and %|A|% is the `alignment offset'; both
+ * default to zero, but if %|M|% is nonzero then the start of the buffer is
+ * aligned such that it is %|A|% more than a multiple of %|M|% bytes.  Note
+ * that %|M|% need not be a power of two, though this is common.
+ *
+ * Units other than `B' are used on output only when the size would be
+ * expressed exactly.
+ *
+ * Buffers are %%\emph{not}%% allocated by default.  In benchmarks, this is
+ * best done in a @before@ function.
+ *
+ * No @claimeq@ functions or macros are provided for buffers because they
+ * don't seem very useful.
+ */
+
+extern const struct tvec_regty tvty_buffer;
+
+/* --- @tvec_initbuffer@ --- *
+ *
+ * Arguments:  @union tvec_regval *rv@ = register value
+ *             @const union tvec_regval *ref@ = reference buffer
+ *             @size_t sz@ = size to allocate
+ *
+ * Returns:    ---
+ *
+ * Use:                Initialize the alignment parameters in @rv@ to match @ref@,
+ *             and the size to @sz@.
+ */
+
+extern void tvec_initbuffer(union tvec_regval */*rv*/,
+                           const union tvec_regval */*ref*/, size_t /*sz*/);
+
+/* --- @tvec_allocbuffer@ --- *
+ *
+ * Arguments:  @union tvec_regval *rv@ = register value
+ *
+ * Returns:    ---
+ *
+ * Use:                Allocate @sz@ bytes to the buffer and fill the space with a
+ *             distinctive pattern.
+ */
+
+extern void tvec_allocbuffer(union tvec_regval */*rv*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index 6c2e2edce65b5167ca7e0ea0f9fc693b13549b70..389bd15b97168374b5060e7f4de600cff2c833f3 100644 (file)
 .
 .\"--------------------------------------------------------------------------
 .TH tvec 3mLib "11 March 2024" "Straylight/Edgeware" "mLib utilities library"
-.
-.\"--------------------------------------------------------------------------
-.SH NAME
-tvec \- test vector framework
 .\" @tvec_begin
 .\" @tvec_end
 .\" @tvec_read
@@ -41,6 +37,10 @@ tvec \- test vector framework
 .\" @tvec_dfltoutput
 .
 .\"--------------------------------------------------------------------------
+.SH NAME
+tvec \- test vector framework
+.
+.\"--------------------------------------------------------------------------
 .SH SYNOPSIS
 .nf
 .B "#include <mLib/tvec.h>"
@@ -247,7 +247,8 @@ the values for the output registers are
 against which the test function's outputs are to be checked.
 .PP
 The test function is called with two vectors of registers,
-one containing input values for the test function to read,
+one containing input values for the test function to read
+and also reference output values,
 and another for output values that the test function should write;
 and a
 .I context
@@ -297,20 +298,100 @@ input and reference output values
 for a single test.
 The
 .I reg
-name in an assignment must match the name of an active register;
+name in an assignment must match the name
+of an active register or a
+.I "special variable" ;
 the corresponding
 .I value
-is stored in the named register.
+is stored in the named register or variable.
+.PP
+A register which has been assigned a value is said to be
+.IR live ;
+otherwise, it is
+.IR dead .
+By default, every active register must be live for a test to proceed;
+but a register definition can mark its register as
+.I optional
+or
+.IR may-be-unset .
+An optional register need not be assigned a value explicitly;
+instead, the register is left dead.
+A may-be-unset register must be mentioned,
+but a distinctive syntax
+.IP
+.IB reg " *"
+.PP
+(with no colon or equals sign)
+says that the register should be left dead.
+Optional registers are suitable for cases where
+there is an obvious default value
+which would otherwise be mentioned frequently in input files.
+May-be-unset registers are mostly useful as outputs,
+where the output is not always set,
+e.g., in error cases,
+but where omitting a value in the usual case is likely a mistake.
 .PP
 A test environment fits in between
 the framework and the test function.
 It can establish hook functions which are called
-at various stages during the test group.
+at various points throughout a test group
+(at the start and and, and before and after each test).
+It can define special variables
+which can be set from the input file using assignments.
+And, finally, it can take on the responsibility
+of running the test function.
+The registers will have been set up already,
+based on the assignments in the input file,
+but the environment can modify them.
+It must also check the test function's output
+against the reference values,
+though there are functions provided for doing this.
+The environment can choose to run the test function once,
+multiple times, or, indeed, not at all.
+When it calls the test function, it can provide a context pointer,
+with whatever additional information might be useful:
+this usually involves coordination
+between the environment and the test function.
+It is the test environment's responsibility
+to check the outputs returned by the test function
+and to report on mismatches,
+but there are functions provided by the framework
+to do the heavy lifting.
+.PP
+The following are examples of what test environments can do.
 .hP \*o
-The
-.I setup
-hook is called once at the start of the test group.
+It can fill in default values for optional dead registers.
+For example, if a function returnns error codes,
+then you can save reptition in the input file
+by marking the error-code output register optional
+and letting it default to the `success' value in a test environment.
+.hP \*o
+It can run the test function mulitple times.
+For example, a test of functions like
+.BR strcmp (3)
+might run the test twice,
+first with its operands as supplied by the input file,
+and then again with the operands swapped
+and the opposite expected result.
+A test for bignum addition could verify commutativity
+by checking both that
+.IR x "\ + \ " y "\ =\ " z
+and that
+.IR y "\ + \ " x "\ =\ " z \fR.
+Similarly, a subtraction test could check both that
+.IR x "\ \- \ " y "\ =\ " z
+and that
+.IR y "\ \- \ " x "\ =\ \-" z \fR.
 .hP \*o
 The
-.I teardown
-hook is called once at the end of the test group.   
+.BR tvec-remote (3),
+.BR tvec-timeout (3),
+and
+.BR tvec-bench (3)
+extensions all slot in as test environments.
+Sadly,
+.BR tvec-bench (3)
+requires support from the output protocol
+in order to format benchmark results properly;
+apart from that,
+these three facilities are pure extensions
index 3c7884ce8765de37d949c592601feab7fb42d51a..2ddaf617cbea2c1a926e7df1488e66e2ae43e735 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
-#ifndef MLIB_BUF_H
-#  include "buf.h"
+#ifndef MLIB_ARENA_H
+#  include "arena.h"
 #endif
 
-#ifndef MLIB_CONTROL_H
-#  include "control.h"
+#ifndef MLIB_BUF_H
+#  include "buf.h"
 #endif
 
-#ifndef MLIB_BUF_H
+#ifndef MLIB_DSTR_H
 #  include "dstr.h"
 #endif
 
 #  include "gprintf.h"
 #endif
 
-#ifndef MLIB_LBUF_H
-#  include "lbuf.h"
-#endif
-
 #ifndef MLIB_MACROS_H
 #  include "macros.h"
 #endif
@@ -441,10 +437,11 @@ struct tvec_test {
   const struct tvec_env *env;          /* environment to run test in */
   tvec_testfn *fn;                     /* test function */
 };
-#define TVEC_ENDTESTS { 0, 0, 0, 0 }
 
 /*----- Test state --------------------------------------------------------*/
 
+struct tvec_output;
+
 enum {
   /* Possible test outcomes. */
 
@@ -458,7 +455,7 @@ enum {
 struct tvec_config {
   /* An overall test configuration. */
 
-  const struct tvec_test *tests;       /* the tests to be performed */
+  const struct tvec_test *const *tests;        /* the tests to be performed */
   unsigned nrout, nreg;                        /* number of output/total regs */
   size_t regsz;                                /* size of a register */
 };
@@ -477,6 +474,9 @@ struct tvec_state {
 #define TVSF_XFAIL 0x0100u             /*   test expected to fail */
 #define TVSF_MUFFLE 0x0200u            /*   muffle errors */
 
+  /* Memory allocation.  Read-only for all callers. */
+  arena *a;
+
   /* Test configuration.  Read-only for all callers. */
   struct tvec_config cfg;              /* test configuration */
 
@@ -492,12 +492,16 @@ struct tvec_state {
   /* Test scoreboard.  Available to output formatters. */
   unsigned curr[TVOUT_LIMIT], all[TVOUT_LIMIT], grps[TVOUT_LIMIT];
 
-  /* Output machinery. */
+  /* Output machinery.  Read-only for environments. */
   struct tvec_output *output;          /* output formatter */
 
   /* Input machinery.  Available to type parsers. */
   const char *infile; unsigned lno, test_lno; /* input file name, line */
   FILE *fp;                            /* input file stream */
+
+  /* Adhoc testing state.  Private. */
+  struct tvec_test adhoc_test;
+  const struct tvec_test *adhoc_tests[];
 };
 
 /* @TVEC_REG(tv, vec, i)@
@@ -508,141 +512,6 @@ struct tvec_state {
  */
 #define TVEC_REG(tv, vec, i) TVEC_GREG((tv)->vec, (i), (tv)->cfg.regsz)
 
-/*----- Output formatting -------------------------------------------------*/
-
-struct tvec_output {
-  /* An output formatter. */
-  const struct tvec_outops *ops;       /* pointer to operations */
-};
-
-enum {
-  /* Register output dispositions. */
-
-  TVRD_INPUT,                          /* input-only register */
-  TVRD_OUTPUT,                         /* output-only (input is dead) */
-  TVRD_MATCH,                          /* matching (equal) registers */
-  TVRD_FOUND,                          /* mismatching output register */
-  TVRD_EXPECT,                         /* mismatching input register */
-  TVRD_LIMIT                           /* (number of dispositions) */
-};
-
-#define TVEC_LEVELS(_)                                                 \
-       _(NOTE, "notice", 4)                                            \
-       _(ERR, "ERROR", 8)
-enum {
-#define TVEC_DEFLEVEL(tag, name, val) TVLEV_##tag = val,
-  TVEC_LEVELS(TVEC_DEFLEVEL)
-#undef TVEC_DEFLEVEL
-  TVLEV_LIMIT
-};
-
-/* Benchmarking details. */
-enum {
-  TVBU_OP,                            /* counting operations of some kind */
-  TVBU_BYTE,                           /* counting bytes (@rbuf >= 0@) */
-  TVBU_LIMIT                           /* (number of units) */
-};
-struct bench_timing;    /* include <mLib/bench.h> for the real definition */
-
-struct tvec_outops {
-  /* Output operations. */
-
-  void (*bsession)(struct tvec_output */*o*/, struct tvec_state */*tv*/);
-    /* Begin a test session.  The output driver will probably want to
-     * save @tv@, because this isn't provided to any other methods.
-     */
-
-  int (*esession)(struct tvec_output */*o*/);
-    /* End a session, and return the suggested exit code. */
-
-  void (*bgroup)(struct tvec_output */*o*/);
-    /* Begin a test group.  The test group description is @tv->test@. */
-
-  void (*skipgroup)(struct tvec_output */*o*/,
-                   const char */*excuse*/, va_list */*ap*/);
-    /* The group is being skipped; @excuse@ may be null or a format
-     * string explaining why.  The @egroup@ method will not be called
-     * separately.
-     */
-
-  void (*egroup)(struct tvec_output */*o*/);
-    /* End a test group.  At least one test was attempted or @skipgroup@
-     * would have been called instead.  If @tv->curr[TVOUT_LOSE]@ is nonzero
-     * then the test group as a whole failed; otherwise it passed.
-     */
-
-  void (*btest)(struct tvec_output */*o*/);
-    /* Begin a test case. */
-
-  void (*skip)(struct tvec_output */*o*/,
-              const char */*excuse*/, va_list */*ap*/);
-    /* The test case is being skipped; @excuse@ may be null or a format
-     * string explaining why.  The @etest@ function will still be called (so
-     * this works differently from @skipgroup@ and @egroup@).  A test case
-     * can be skipped at most once, and, if skipped, it cannot fail.
-     */
-
-  void (*fail)(struct tvec_output */*o*/,
-              const char */*detail*/, va_list */*ap*/);
-    /* The test case failed.
-     *
-     * The output driver should preferably report the filename (@infile@) and
-     * line number (@test_lno@, not @lno@) for the failing test.
-     *
-     * The @detail@ may be null or a format string describing detail about
-     * how the failing test was run which can't be determined from the
-     * registers; a @detail@ is usually provided when (and only when) the
-     * test environment potentially invokes the test function more than once.
-     *
-     * A single test case can fail multiple times!
-     */
-
-  void (*dumpreg)(struct tvec_output */*o*/,
-                 unsigned /*disp*/, const union tvec_regval */*rv*/,
-                 const struct tvec_regdef */*rd*/);
-    /* Dump a register.  The `disposition' @disp@ explains what condition the
-     * register is in; see @tvec_dumpreg@ and the @TVRD_...@ codes.  The
-     * register value is at @rv@, and its definition, including its type, at
-     * @rd@.  Note that this function may be called on virtual registers
-     * which aren't in either of the register vectors or mentioned by the
-     * test description.  It may also be called with @rv@ null, indicating
-     * that the register is not live.
-     */
-
-  void (*etest)(struct tvec_output */*o*/, unsigned /*outcome*/);
-    /* The test case concluded with the given @outcome@ (one of the
-     * @TVOUT_...@ codes.
-     */
-
-  void (*bbench)(struct tvec_output */*o*/,
-                const char */*ident*/, unsigned /*unit*/);
-    /* Begin a benchmark.  The @ident@ is a formatted string identifying the
-     * benchmark based on the values of the input registered marked
-     * @TVRF_ID@; the output driver is free to use this or come up with its
-     * own way to identify the test, e.g., by inspecting the register values
-     * for itself.  The @unit@ is one of the @TVBU_...@ constants explaining
-     * what sort of thing is being measured.
-     */
-
-  void (*ebench)(struct tvec_output */*o*/,
-                const char */*ident*/, unsigned /*unit*/,
-                const struct bench_timing */*tm*/);
-    /* End a benchmark.  The @ident@ and @unit@ arguments are as for
-     * @bbench@.  If @tm@ is zero then the measurement failed; otherwise
-     * @tm->n@ counts total number of things (operations or bytes, as
-     * indicated by @unit@) processed in the indicated time.
-     */
-
-  void (*report)(struct tvec_output */*o*/, unsigned /*level*/,
-                const char */*msg*/, va_list */*ap*/);
-    /* Report a message.  The driver should ideally report the filename
-     * (@infile@) and line number (@lno@) prompting the error.
-     */
-
-  void (*destroy)(struct tvec_output */*o*/);
-    /* Release any resources acquired by the driver. */
-};
-
 /*----- Session lifecycle -------------------------------------------------*/
 
 /* --- @tvec_begin@ --- *
@@ -692,11 +561,6 @@ extern int tvec_read(struct tvec_state */*tv*/,
 
 /*----- Command-line interface --------------------------------------------*/
 
-extern const struct tvec_config tvec_adhocconfig;
-  /* A special @struct tvec_config@ to use for programs which perform ad-hoc
-   * testing.
-   */
-
 /* --- @tvec_parseargs@ --- *
  *
  * Arguments:  @int argc@ = number of command-line arguments
@@ -955,496 +819,6 @@ extern PRINTF_LIKE(2, 3)
 extern void tvec_check_v(struct tvec_state */*tv*/,
                         const char */*detail*/, va_list */*ap*/);
 
-/*----- Ad-hoc testing ----------------------------------------------------*/
-
-/* --- @tvec_adhoc@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @struct tvec_test *t@ = space for a test definition
- *
- * Returns:    ---
- *
- * Use:                Begin ad-hoc testing, i.e., without reading a file of
- *             test-vector data.
- *
- *             The structure at @t@ will be used to record information about
- *             the tests underway, which would normally come from a static
- *             test definition.  The other functions in this section assume
- *             that @tvec_adhoc@ has been called.
- */
-
-extern void tvec_adhoc(struct tvec_state */*tv*/, struct tvec_test */*t*/);
-
-/* --- @tvec_begingroup@, @TVEC_BEGINGROUP@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const char *name@ = name for this test group
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *
- * Returns:    ---
- *
- * Use:                Begin an ad-hoc test group with the given name.  The @file@
- *             and @lno@ can be anything, but it's usually best if they
- *             refer to the source code performing the test: the macro
- *             @TVEC_BEGINGROUP@ does this automatically.
- */
-
-extern void tvec_begingroup(struct tvec_state */*tv*/, const char */*name*/,
-                           const char */*file*/, unsigned /*lno*/);
-#define TVEC_BEGINGROUP(tv, name)                                      \
-       do tvec_begingroup(tv, name, __FILE__, __LINE__); while (0)
-
-/* --- @tvec_endgroup@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *
- * Returns:    ---
- *
- * Use:                End an ad-hoc test group.  The statistics are updated and the
- *             outcome is reported to the output formatter.
- */
-
-extern void tvec_endgroup(struct tvec_state */*tv*/);
-
-/* --- @TVEC_TESTGROUP@, @TVEC_TESTGROUP_TAG@ --- *
- *
- * Arguments:  @tag@ = label-disambiguation tag
- *             @const struct tvec_state *tv = test-vector state
- *             @const char *name@ = test-group name
- *
- * Returns:    ---
- *
- * Use:                Control-structure macro: @TVEC_TESTGROUP(tv, name) stmt@
- *             establishes a test group with the given @name@ (attributing
- *             it to the source file and lie number), executes @stmt@, and
- *             ends the test group.  If @stmt@ invokes @break@ then the test
- *             group is skipped.  @TVEC_TESTGROUP_TAG@ is the same, with an
- *             additional @tag@ argument for use in higher-level macros.
- */
-
-#define TVEC_TESTGROUP_TAG(tag, tv, name)                              \
-       MC_WRAP(tag##__around,                                          \
-         { TVEC_BEGINGROUP(tv, name); },                               \
-         { tvec_endgroup(tv); },                                       \
-         { if (!((tv)->f&TVSF_SKIP)) tvec_skipgroup(tv, 0);            \
-           tvec_endgroup(tv); })
-#define TVEC_TESTGROUP(tv, name) TVEC_TESTGROUP_TAG(grp, tv, name)
-
-/* --- @tvec_begintest@, @TVEC_BEGINTEST@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *
- * Returns:    ---
- *
- * Use:                Begin an ad-hoc test case.  The @file@ and @lno@ can be
- *             anything, but it's usually best if they refer to the source
- *             code performing the test: the macro @TVEC_BEGINGROUP@ does
- *             this automatically.
- */
-
-extern void tvec_begintest(struct tvec_state */*tv*/,
-                          const char */*file*/, unsigned /*lno*/);
-#define TVEC_BEGINTEST(tv)                                             \
-       do tvec_begintest(tv, __FILE__, __LINE__); while (0)
-
-/* --- @tvec_endtest@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *
- * Returns:    ---
- *
- * Use:                End an ad-hoc test case,  The statistics are updated and the
- *             outcome is reported to the output formatter.
- */
-
-extern void tvec_endtest(struct tvec_state */*tv*/);
-
-/* --- @TVEC_TEST@, @TVEC_TEST_TAG@ --- *
- *
- * Arguments:  @tag@ = label-disambiguation tag
- *             @struct tvec_test *t@ = space for a test definition
- *
- * Returns:    ---
- *
- * Use:                Control-structure macro: @TVEC_TEST(tv) stmt@ begins a test
- *             case, executes @stmt@, and ends the test case.  If @stmt@
- *             invokes @break@ then the test case is skipped.
- *             @TVEC_TEST_TAG@ is the same, with an additional @tag@ argumet
- *             for use in higher-level macros.
- */
-
-#define TVEC_TEST_TAG(tag, tv)                                         \
-       MC_WRAP(tag##__around,                                          \
-         { TVEC_BEGINTEST(tv); },                                      \
-         { tvec_endtest(tv); },                                        \
-         { if ((tv)->f&TVSF_ACTIVE) tvec_skip((tv), 0);                \
-           tvec_endtest(tv); })
-#define TVEC_TEST(tv) TVEC_TEST_TAG(test, tv)
-
-/* --- @tvec_claim@, @tvec_claim_v@, @TVEC_CLAIM@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @int ok@ = a flag
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *msg@, @va_list *ap@ = message to report on
- *                     failure
- *
- * Returns:    The value @ok@.
- *
- * Use:                Check that a claimed condition holds, as (part of) a test.
- *             If no test case is underway (i.e., if @TVSF_OPEN@ is reset in
- *             @tv->f@), then a new test case is begun and ended.  The
- *             @file@ and @lno@ are passed to the output formatter to be
- *             reported in case of a failure.  If @ok@ is nonzero, then
- *             nothing else happens; so, in particular, if @tvec_claim@
- *             established a new test case, then the test case succeeds.  If
- *             @ok@ is zero, then a failure is reported, quoting @msg@.
- *
- *             The @TVEC_CLAIM@ macro is similar, only it (a) identifies the
- *             file and line number of the call site automatically, and (b)
- *             implicitly quotes the source text of the @ok@ condition in
- *             the failure message.
- */
-
-extern PRINTF_LIKE(5, 6)
-  int tvec_claim(struct tvec_state */*tv*/, int /*ok*/,
-                const char */*file*/, unsigned /*lno*/,
-                const char */*msg*/, ...);
-extern int tvec_claim_v(struct tvec_state */*tv*/, int /*ok*/,
-                       const char */*file*/, unsigned /*lno*/,
-                       const char */*msg*/, va_list */*ap*/);
-#define TVEC_CLAIM(tv, cond)                                           \
-       (tvec_claim(tv, !!(cond), __FILE__, __LINE__, "%s untrue", #cond))
-
-/* --- @tvec_claimeq@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const struct tvec_regty *ty@ = register type
- *             @const union tvec_misc *arg@ = register type argument
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if the input and output values of register 0 are
- *             equal, zero if they differ.
- *
- * Use:                Check that the input and output values of register 0 are
- *             equal (according to the register type @ty@).  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped.
- *
- *             This function is not expected to be called directly, but
- *             through type-specific wrapper functions or macros such as
- *             @TVEC_CLAIMEQ_INT@.
- */
-
-extern int tvec_claimeq(struct tvec_state */*tv*/,
-                       const struct tvec_regty */*ty*/,
-                       const union tvec_misc */*arg*/,
-                       const char */*file*/, unsigned /*lno*/,
-                       const char */*expr*/);
-
-/*----- Benchmarking ------------------------------------------------------*/
-
-struct tvec_benchenv {
-  struct tvec_env _env;                        /* benchmarking is an environment */
-  struct bench_state **bst;            /* benchmark state anchor or null */
-  unsigned long niter;                 /* iterations done per unit */
-  int riter, rbuf;                     /* iterations and buffer registers */
-  const struct tvec_env *env;          /* subordinate environment */
-};
-
-struct tvec_benchctx {
-  const struct tvec_benchenv *be;      /* environment configuration */
-  struct bench_state *bst;             /* benchmark state */
-  double dflt_target;                  /* default time in seconds */
-  unsigned f;                          /* flags */
-#define TVBF_SETTRG 1u                 /*   set `@target' */
-#define TVBF_SETMASK (TVBF_SETTRG))    /*   mask of @TVBF_SET...@ */
-  void *subctx;                                /* subsidiary environment context */
-};
-
-extern struct bench_state *tvec_benchstate;
-
-/* --- Environment implementation --- *
- *
- * The following special variables are supported.
- *
- *   * %|@target|% is the (approximate) number of seconds to run the
- *     benchmark.
- *
- * Unrecognized variables are passed to the subordinate environment, if there
- * is one.  Other events are passed through to the subsidiary environment.
- */
-
-extern tvec_envsetupfn tvec_benchsetup;
-extern tvec_envfindvarfn tvec_benchfindvar;
-extern tvec_envbeforefn tvec_benchbefore;
-extern tvec_envrunfn tvec_benchrun;
-extern tvec_envafterfn tvec_benchafter;
-extern tvec_envteardownfn tvec_benchteardown;
-
-#define TVEC_BENCHENV                                                  \
-  { sizeof(struct tvec_benchctx),                                      \
-    tvec_benchsetup,                                                   \
-    tvec_benchfindvar,                                                 \
-    tvec_benchbefore,                                                  \
-    tvec_benchrun,                                                     \
-    tvec_benchafter,                                                   \
-    tvec_benchteardown }
-#define TVEC_BENCHINIT TVEC_BENCHENV, &tvec_benchstate
-
-/* --- @tvec_benchreport@ --- *
- *
- * Arguments:  @const struct gprintf_ops *gops@ = print operations
- *             @void *go@ = print destination
- *             @unsigned unit@ = the unit being measured (~TVBU_...@)
- *             @unsigned style@ = output style (@TVSF_...@)
- *             @const struct bench_timing *tm@ = the benchmark result
- *
- * Returns:    ---
- *
- * Use:                Formats a report about the benchmark performance.  This
- *             function is intended to be called on by an output @ebench@
- *             function.
- */
-
-extern void tvec_benchreport
-  (const struct gprintf_ops */*gops*/, void */*go*/,
-   unsigned /*unit*/, unsigned /*style*/, const struct bench_timing */*tm*/);
-
-/*----- Remote execution --------------------------------------------------*/
-
-struct tvec_remoteenv;
-
-struct tvec_remotecomms {
-  int infd, outfd;                     /* input and output descriptors */
-  dbuf bout;                           /* output buffer */
-  unsigned char *bin;                  /* input buffer */
-  size_t binoff, binlen, binsz;                /* input offset, length, and size */
-  size_t t;                            /* temporary offset */
-  unsigned f;                          /* flags */
-#define TVRF_BROKEN 0x0001u            /*   communications have failed */
-};
-#define TVEC_REMOTECOMMS_INIT { -1, -1, DBUF_INIT, 0, 0, 0, 0, 0, 0 }
-
-struct tvec_remotectx {
-  struct tvec_state *tv;               /* test vector state */
-  struct tvec_remotecomms rc;          /* communication state */
-  const struct tvec_remoteenv *re;     /* environment configuration */
-  void *subctx;                                /* subenvironment context */
-  struct tvec_vardef vd;               /* temporary variable definition */
-  unsigned ver;                                /* protocol version */
-  pid_t kid;                           /* child process id */
-  int errfd;                           /* child stderr descriptor */
-  lbuf errbuf;                         /* child stderr line buffer */
-  dstr prgwant, progress;              /* progress: wanted/reported */
-  unsigned exwant, exit;               /* exit status wanted/reported */
-#define TVRF_RCNMASK 0x0300u           /*   reconnection behaviour: */
-#define TVRCN_DEMAND 0x0000u           /*     connect on demand */
-#define TVRCN_SKIP 0x0100u             /*     skip unless connected */
-#define TVRCN_FORCE 0x0200u            /*     force reconnection */
-#define TVRF_MUFFLE 0x0400u            /*   muffle child stderr */
-#define TVRF_SETEXIT 0x0800u           /*   set `@exit' */
-#define TVRF_SETPRG 0x1000u            /*   set `@progress' */
-#define TVRF_SETRCN 0x2000u            /*   set `@reconnect' */
-#define TVRF_SETMASK (TVRF_SETEXIT | TVRF_SETPRG | TVRF_SETRCN)
-                                       /*   mask of @TVTF_SET...@ */
-};
-
-typedef int tvec_connectfn(pid_t */*kid_out*/, int */*infd_out*/,
-                          int */*outfd_out*/, int */*errfd_out*/,
-                          struct tvec_state */*tv*/,
-                          const struct tvec_remoteenv */*env*/);
-  /* A connection function.  On entry, @tv@ holds the test-vector state, and
-   * @env@ is the test group's remote environment structure, which will
-   * typically really be some subclass of @struct tvec_remoteenv@ containing
-   * additional parameters for establishing the child process.
-   *
-   * On successful completion, the function stores input and output
-   * descriptors (which need not be distinct) in @*infd_out@ and
-   * @*outfd_out@, and returns zero; if it creates a child process, it should
-   * additionally store the child's process-id in @*kid_out@ and store in
-   * @*errfd_out@ a descriptor from which the child's error output can be
-   * read.  On error, the function should report an appropriate message via
-   * @tvec_error@ and return %$-1$%.
-   */
-
-struct tvec_remoteenv_slots {
-  tvec_connectfn *connect;             /* connection function */
-  const struct tvec_env *env;          /* subsidiary environment */
-  unsigned dflt_reconn;                        /* default reconnection */
-};
-
-struct tvec_remoteenv {
-  struct tvec_env _env;
-  struct tvec_remoteenv_slots r;
-};
-
-struct tvec_remotefork_slots {
-  const struct tvec_test *tests;       /* child tests (or null) */
-};
-
-struct tvec_remotefork {
-  struct tvec_env _env;
-  struct tvec_remoteenv_slots r;
-  struct tvec_remotefork_slots f;
-};
-
-struct tvec_remoteexec_slots {
-  const char *const *args;             /* command line to execute */
-};
-
-struct tvec_remoteexec {
-  struct tvec_env _env;
-  struct tvec_remoteenv_slots r;
-  struct tvec_remoteexec_slots x;
-};
-
-union tvec_remoteenv_subclass_kludge {
-  struct tvec_env _env;
-  struct tvec_remoteenv renv;
-  struct tvec_remotefork fork;
-  struct tvec_remoteexec exec;
-};
-
-/* Exit status.
- *
- * We don't use the conventional encoding returned by the @wait@(2) family of
- * system calls because it's too hard for our flags type to decode.  Instead,
- * we use our own encoding.
- *
- * The exit code or signal number ends up in the `value' field in the low 12
- * bits; bit 12 is set if the value field holds a signal, and it if holds an
- * exit code.  Bits 13--15 hold a code which describes the status of a child
- * process or connection.
- */
-#define TVXF_VALMASK 0x0fffu           /* value (exit code or signal) */
-#define TVXF_SIG 0x1000u               /* value is signal, not exit code */
-#define TVXF_CAUSEMASK 0xe000u         /* mask for cause bits */
-#define TVXST_RUN 0x0000u              /*   still running */
-#define TVXST_EXIT 0x2000u             /*   child exited */
-#define TVXST_KILL 0x4000u             /*   child killed by signal */
-#define TVXST_CONT 0x6000u             /*   child continued (?) */
-#define TVXST_STOP 0x8000u             /*   child stopped (?) */
-#define TVXST_DISCONN 0xa000u          /*   disconnected */
-#define TVXST_UNK 0xc000u              /*   unknown */
-#define TVXST_ERR 0xe000u            /*   local error prevented diagnosis */
-
-/* Remote environment. */
-extern tvec_envsetupfn tvec_remotesetup;
-extern tvec_envfindvarfn tvec_remotefindvar;
-extern tvec_envbeforefn tvec_remotebefore;
-extern tvec_envrunfn tvec_remoterun;
-extern tvec_envafterfn tvec_remoteafter;
-extern tvec_envteardownfn tvec_remoteteardown;
-#define TVEC_REMOTEENV                                                 \
-  { sizeof(struct tvec_remotectx),                                     \
-    tvec_remotesetup,                                                  \
-    tvec_remotefindvar,                                                        \
-    tvec_remotebefore,                                                 \
-    tvec_remoterun,                                                    \
-    tvec_remoteafter,                                                  \
-    tvec_remoteteardown }
-
-/* --- @tvec_setprogress@, @tvec_setprogress_v@ --- *
- *
- * Arguments:  @const char *status@ = progress status token format
- *             @va_list ap@ = argument tail
- *
- * Returns:    ---
- *
- * Use:                Reports the progress of a test execution to the client.
- *
- *             The framework makes use of tokens beginning with %|%|%:
- *
- *               * %|%IDLE|%: during the top-level server code;
- *
- *               * %|%SETUP|%: during the enclosing environment's @before@
- *                 function;
- *
- *               * %|%RUN|%: during the environment's @run@ function, or the
- *                 test function; and
- *
- *               * %|%DONE|%: during the enclosing environment's @after@
- *                 function.
- *
- *             The intent is that a test can use the progress token to check
- *             that a function which is expected to crash does so at the
- *             correct point, so it's expected that more complex test
- *             functions and/or environments will set their own progress
- *             tokens to reflect what's going on.
- */
-
-extern PRINTF_LIKE(1, 2) int tvec_setprogress(const char */*status*/, ...);
-extern int tvec_setprogress_v(const char */*status*/, va_list */*ap*/);
-
-/* --- @tvec_remoteserver@ --- *
- *
- * Arguments:  @int infd@, @int outfd@ = input and output file descriptors
- *             @const struct tvec_config *config@ = test configuration
- *
- * Returns:    Suggested exit code.
- *
- * Use:                Run a test server, reading packets from @infd@ and writing
- *             responses and notifications to @outfd@, and invoking tests as
- *             described by @config@.
- *
- *             This function is not particularly general purpose.  It
- *             expects to `take over' the process, and makes use of private
- *             global variables.
- */
-
-extern int tvec_remoteserver(int /*infd*/, int /*outfd*/,
-                            const struct tvec_config */*config*/);
-
-extern tvec_connectfn tvec_fork, tvec_exec;
-
-#define TVEC_REMOTEFORK(subenv, tests)                                 \
-       TVEC_REMOTEENV, { tvec_fork, subenv }, { tests }
-
-#define TVEC_REMOTEEXEC(subenv, args)                                  \
-       TVEC_REMOTEENV, { tvec_exec, subenv }, { args }
-
-/*----- Timeouts ----------------------------------------------------------*/
-
-struct tvec_timeoutenv {
-  struct tvec_env _env;
-  int timer;                           /* the timer (@ITIMER_...@) */
-  double t;                            /* time to wait (in seconds) */
-  const struct tvec_env *env;          /* subsidiary environment */
-};
-
-struct tvec_timeoutctx {
-  const struct tvec_timeoutenv *te;    /* saved environment description */
-  int timer;                           /* timer code (as overridden) */
-  double t;                            /* time to wait (as overridden) */
-  unsigned f;                          /* flags */
-#define TVTF_SETTMO 1u                 /*   set `@timeout' */
-#define TVTF_SETTMR 2u                 /*   set `@timer' */
-#define TVTF_SETMASK (TVTF_SETTMO | TVTF_SETTMR)
-                                       /*   mask of @TVTF_SET...@ */
-  void *subctx;
-};
-
-extern tvec_envsetupfn tvec_timeoutsetup;
-extern tvec_envfindvarfn tvec_timeoutfindvar;
-extern tvec_envbeforefn tvec_timeoutbefore;
-extern tvec_envrunfn tvec_timeoutrun;
-extern tvec_envafterfn tvec_timeoutafter;
-extern tvec_envteardownfn tvec_timeoutteardown;
-#define TVEC_TIMEOUTENV                                                        \
-       { sizeof(struct tvec_timeoutctx),                               \
-         tvec_timeoutsetup,                                            \
-         tvec_timeoutfindvar,                                          \
-         tvec_timeoutbefore,                                           \
-         tvec_timeoutrun,                                              \
-         tvec_timeoutafter,                                            \
-         tvec_timeoutteardown }
-#define TVEC_TIMEOUTINIT(timer, t) TVEC_TIMEOUTENV, timer, t
-
 /*----- Output functions --------------------------------------------------*/
 
 /* --- @tvec_strlevel@ --- *
@@ -1470,13 +844,24 @@ extern const char *tvec_strlevel(unsigned /*level*/);
  *             @TVLEV_ERR@ or higher force a nonzero exit code.
  */
 
+#define TVEC_LEVELS(_)                                                 \
+       _(INFO, "info", 3)                                              \
+       _(NOTE, "notice", 4)                                            \
+       _(ERR, "ERROR", 8)
+enum {
+#define TVEC_DEFLEVEL(tag, name, val) TVLEV_##tag = val,
+  TVEC_LEVELS(TVEC_DEFLEVEL)
+#undef TVEC_DEFLEVEL
+  TVLEV_LIMIT
+};
+
 extern PRINTF_LIKE(3, 4)
   void tvec_report(struct tvec_state */*tv*/, unsigned /*level*/,
                   const char */*msg*/, ...);
 extern void tvec_report_v(struct tvec_state */*tv*/, unsigned /*level*/,
                          const char */*msg*/, va_list */*ap*/);
 
-/* --- @tvec_error@, @tvec_notice@ --- *
+/* --- @tvec_error@, @tvec_notice@, @tvec_info@ --- *
  *
  * Arguments:  @struct tvec_state *tv@ = test-vector state
  *             @const char *msg@, @va_list ap@ = error message
@@ -1484,17 +869,25 @@ extern void tvec_report_v(struct tvec_state */*tv*/, unsigned /*level*/,
  * Returns:    The @tvec_error@ function returns %$-1$% as a trivial
  *             convenience; @tvec_notice@ does not return a value.
  *
- * Use:                Report an error or a notice.  Errors are distinct from test
+ * Use:                Report a message.  Errors are distinct from test
  *             failures, and indicate that a problem was encountered which
  *             compromised the activity of testing.  Notices are important
  *             information which doesn't fit into any other obvious
- *             category.
+ *             category.  Information is anything else, and is a reasonable
+ *             fallback for writing unstructured information in the absence
+ *             of dedicated support in an output driver.
+ *
+ *             These functions are simple convenience wrappers around
+ *             @tvec_report@.  Use @tvec_report_v@ directly if you have a
+ *             captured @va_list@ of arguments to format.
  */
 
 extern PRINTF_LIKE(2, 3)
   int tvec_error(struct tvec_state */*tv*/, const char */*msg*/, ...);
 extern PRINTF_LIKE(2, 3)
   void tvec_notice(struct tvec_state */*tv*/, const char */*msg*/, ...);
+extern PRINTF_LIKE(2, 3)
+  void tvec_info(struct tvec_state */*tv*/, const char */*msg*/, ...);
 
 /* --- @tvec_unkregerr@ --- *
  *
@@ -1587,7 +980,7 @@ extern struct tvec_output *tvec_tapoutput(FILE */*fp*/);
  *             writing on @fp@.  The policy is subject to change, but
  *             currently the `human' output format is selected if @fp@ is
  *             interactive (i.e., if @isatty(fileno(fp))@ is true), and
- *             otherwise the `tap' format is used.
+ *             otherwise the `machine' format is used.
  */
 
 extern struct tvec_output *tvec_dfltout(FILE */*fp*/);
@@ -1597,18 +990,19 @@ extern struct tvec_output *tvec_dfltout(FILE */*fp*/);
 /* Serialization format.
  *
  * The `candidate register definitions' are those entries @r@ in the @regs@
- * vector whose index @r.i@ is strictly less than @nr@.  The `selected
- * register definitions' are those candidate register definitions @r@ for
- * which the indicated register @rv[r.i]@ has the @TVRF_LIVE@ flag set.  The
- * serialized output begins with a header bitmap: if there are %$n$%
- * candidate register definitions then the header bitmap consists of %$\lceil
- * n/8 \rceil$% bytes.  Bits are ordered starting from the least significant
- * bit of the first byte, end ending at the most significant bit of the final
- * byte.  The bit corresponding to a candidate register definition is set if
- * and only if that register defintion is selected.  The header bitmap is
- * then followed by the serializations of the selected registers -- i.e., for
- * each selected register definition @r@, the serialized value of register
- * @rv[r.i]@ -- simply concatenated together, with no padding or alignment.
+ * vector whose index @r.i@ is strictly less than @nr@ and where
+ * @r.f&mask == want@* .  The `selected register definitions' are those
+ * candidate register definitions @r@ for which the indicated register
+ * @rv[r.i]@ has the @TVRF_LIVE@ flag set.  The serialized output begins with
+ * a header bitmap: if there are %$n$% candidate register definitions then
+ * the header bitmap consists of %$\lceil n/8 \rceil$% bytes.  Bits are
+ * ordered starting from the least significant bit of the first byte, end
+ * ending at the most significant bit of the final byte.  The bit
+ * corresponding to a candidate register definition is set if and only if
+ * that register defintion is selected.  The header bitmap is then followed
+ * by the serializations of the selected registers -- i.e., for each selected
+ * register definition @r@, the serialized value of register @rv[r.i]@ --
+ * simply concatenated together, with no padding or alignment.
  */
 
 /* --- @tvec_serialize@ --- *
@@ -1618,6 +1012,7 @@ extern struct tvec_output *tvec_dfltout(FILE */*fp*/);
  *             @const struct tvec_regdef *regs@ = vector of register
  *                     descriptions, terminated by an entry with a null
  *                     @name@ slot
+ *             @unsigned mask, want@ = flag-based selection
  *             @unsigned nr@ = number of entries in the @rv@ vector
  *             @size_t regsz@ = true size of each element of @rv@
  *
@@ -1632,6 +1027,7 @@ extern struct tvec_output *tvec_dfltout(FILE */*fp*/);
 
 extern int tvec_serialize(const struct tvec_reg */*rv*/, buf */*b*/,
                          const struct tvec_regdef */*regs*/,
+                         unsigned /*mask*/, unsigned /*want*/,
                          unsigned /*nr*/, size_t /*regsz*/);
 
 /* --- @tvec_deserialize@ --- *
@@ -1641,6 +1037,7 @@ extern int tvec_serialize(const struct tvec_reg */*rv*/, buf */*b*/,
  *             @const struct tvec_regdef *regs@ = vector of register
  *                     descriptions, terminated by an entry with a null
  *                     @name@ slot
+ *             @unsigned mask, want@ = flag-based selection
  *             @unsigned nr@ = number of entries in the @rv@ vector
  *             @size_t regsz@ = true size of each element of @rv@
  *
@@ -1655,11 +1052,13 @@ extern int tvec_serialize(const struct tvec_reg */*rv*/, buf */*b*/,
  *             slot, and set the @TVRF_LIVE@ flag on the register.  See
  *             @tvec_serialize@ for a description of the format.
  *
- *             Failure results only from a failing register type handler.
+ *             Failure results only from an input too small for the initial
+ *             bitmap or a failing register type handler.
  */
 
 extern int tvec_deserialize(struct tvec_reg */*rv*/, buf */*b*/,
                            const struct tvec_regdef */*regs*/,
+                           unsigned /*mask*/, unsigned /*want*/,
                            unsigned /*nr*/, size_t /*regsz*/);
 
 /*----- Input utilities ---------------------------------------------------*/
@@ -1803,827 +1202,6 @@ extern int tvec_readword_v(struct tvec_state */*tv*/, dstr */*d*/,
                           const char **/*p_inout*/, const char */*delims*/,
                           const char */*expect*/, va_list */*ap*/);
 
-/*----- Integer types: signed and unsigned --------------------------------*/
-
-/* Integers may be input in decimal, hex, binary, or octal, following
- * approximately usual conventions.
- *
- *   * Signed integers may be preceded with a `+' or `-' sign.
- *
- *   * Decimal integers are just a sequence of decimal digits `0' ... `9'.
- *
- *   * Octal integers are a sequence of digits `0' ... `7', preceded by `0o'
- *     or `0O'.
- *
- *   * Hexadecimal integers are a sequence of digits `0' ... `9', `a'
- *     ... `f', or `A' ... `F', preceded by `0x' or `0X'.
- *
- *   * Radix-B integers are a sequence of digits `0' ... `9', `a' ... `f', or
- *     `A' ... `F', each with value less than B, preceded by `Br' or `BR',
- *     where 0 < B < 36 is expressed in decimal without any leading `0' or
- *     internal underscores `_'.
- *
- *   * A digit sequence may contain internal underscore `_' separators, but
- *     not before or after all of the digits; and two consecutive `_'
- *     characters are not permitted.
- */
-
-extern const struct tvec_regty tvty_int, tvty_uint;
-
-/* The @arg.p@ slot may be null or a pointer to @struct tvec_irange@ or
- * @struct tvec_urange@ as appropriate.  The bounds are inclusive; use, e.g.,
- * @LONG_MAX@ explicitly if one or the other bound is logically inapplicable.
- */
-struct tvec_irange { long min, max; };
-struct tvec_urange { unsigned long min, max; };
-
-/* Bounds corresponding to common integer types. */
-extern const struct tvec_irange
-  tvrange_schar, tvrange_short, tvrange_int, tvrange_long,
-  tvrange_sbyte, tvrange_i16, tvrange_i32;
-extern const struct tvec_urange
-  tvrange_uchar, tvrange_ushort, tvrange_uint, tvrange_ulong, tvrange_size,
-  tvrange_byte, tvrange_u16, tvrange_u32;
-
-/* --- @tvec_claimeq_int@, @TVEC_CLAIMEQ_INT@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @long i0, i1@ = two signed integers
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @i0@ and @i1@ are equal, otherwise zero.
- *
- * Use:                Check that values of @i0@ and @i1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @i0@ is printed as the output
- *             value and @i1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_INT@ macro is similar, only it (a) identifies
- *             the file and line number of the call site automatically, and
- *             (b) implicitly quotes the source text of the @i0@ and @i1@
- *             arguments in the failure message.
- */
-
-extern int tvec_claimeq_int(struct tvec_state */*tv*/,
-                           long /*i0*/, long /*i1*/,
-                           const char */*file*/, unsigned /*lno*/,
-                           const char */*expr*/);
-#define TVEC_CLAIMEQ_INT(tv, i0, i1)                                   \
-       (tvec_claimeq_int(tv, i0, i1, __FILE__, __LINE__, #i0 " /= " #i1))
-
-/* --- @tvec_claimeq_uint@, @TVEC_CLAIMEQ_UINT@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @unsigned long u0, u1@ = two unsigned integers
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @u0@ and @u1@ are equal, otherwise zero.
- *
- * Use:                Check that values of @u0@ and @u1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @u0@ is printed as the output
- *             value and @u1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_UINT@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @u0@ and @u1@ arguments in the failure message.
- */
-
-extern int tvec_claimeq_uint(struct tvec_state */*tv*/,
-                           unsigned long /*u0*/, unsigned long /*u1*/,
-                           const char */*file*/, unsigned /*lno*/,
-                           const char */*expr*/);
-#define TVEC_CLAIMEQ_UINT(tv, u0, u1)                                  \
-       (tvec_claimeq_uint(tv, u0, u1, __FILE__, __LINE__, #u0 " /= " #u1))
-
-/*----- Size type ---------------------------------------------------------*/
-
-/* A size is an unsigned integer followed by an optional unit specifier
- * consisting of an SI unit prefix and (optionally) the letter `B'.
- */
-
-extern const struct tvec_regty tvty_size;
-
-/* --- @tvec_claimeq_size@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @unsigned long sz0, sz1@ = two sizes
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @sz0@ and @sz1@ are equal, otherwise zero.
- *
- * Use:                Check that values of @u0@ and @u1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @u0@ is printed as the output
- *             value and @u1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_SIZE@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @u0@ and @u1@ arguments in the failure message.
- */
-
-int tvec_claimeq_size(struct tvec_state *tv,
-                     unsigned long sz0, unsigned long sz1,
-                     const char *file, unsigned lno, const char *expr);
-#define TVEC_CLAIMEQ_UINT(tv, u0, u1)                                  \
-       (tvec_claimeq_uint(tv, u0, u1, __FILE__, __LINE__, #u0 " /= " #u1))
-
-/*----- Floating-point type -----------------------------------------------*/
-
-/* Floating-point values are either NaN (%|#nan|%, if supported by the
- * platform); positive or negative infinity (%|#inf|%, %|+#inf|%, or
- * %|#+inf|% (preferring the last), and %|-#inf|% or %|#-inf|% (preferring
- * the latter), if supported by the platform); or a number in strtod(3)
- * syntax.
- *
- * The comparison rules for floating-point numbers are complex: see
- * @tvec_claimeqish_float@ for details.
- */
-
-extern const struct tvec_regty tvty_float;
-
-struct tvec_floatinfo {
-  /* Details about acceptable floating-point values. */
-
-  unsigned f;                          /* flags (@TVFF_...@ bits) */
-#define TVFF_NOMIN 1u                  /*   ignore @min@ (allow -inf) */
-#define TVFF_NOMAX 2u                  /*   ignore @max@ (allow +inf) */
-#define TVFF_NANOK 4u                  /*   permit NaN */
-#define TVFF_EQMASK 0xf0               /*   how to compare */
-#define TVFF_EXACT 0x00                        /*     must equal exactly */
-#define TVFF_ABSDELTA 0x10             /*     must be within @delta@ */
-#define TVFF_RELDELTA 0x20             /*     diff < @delta@ fraction */
-  double min, max;                     /* smallest/largest value allowed */
-  double delta;                                /* maximum tolerable difference */
-};
-
-extern const struct tvec_floatinfo tvflt_finite, tvflt_nonneg;
-
-/* --- @tvec_claimeqish_float@, @TVEC_CLAIMEQISH_FLOAT@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @double f0, f1@ = two floating-point numbers
- *             @unsigned f@ = flags (@TVFF_...@)
- *             @double delta@ = maximum tolerable difference
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @f0@ and @f1@ are sufficiently close, otherwise
- *             zero.
- *
- * Use:                Check that values of @f0@ and @f1@ are sufficiently close.
- *             As for @tvec_claim@ above, a test case is automatically begun
- *             and ended if none is already underway.  If the values are
- *             too far apart, then @tvec_fail@ is called, quoting @expr@,
- *             and the mismatched values are dumped: @f0@ is printed as the
- *             output value and @f1@ is printed as the input reference.
- *
- *             The details for the comparison are as follows.
- *
- *               * A NaN value matches any other NaN, and nothing else.
- *
- *               * An infinity matches another infinity of the same sign,
- *                 and nothing else.
- *
- *               * If @f&TVFF_EQMASK@ is @TVFF_EXACT@, then any
- *                 representable number matches only itself: in particular,
- *                 positive and negative zero are considered distinct.
- *                 (This allows tests to check that they land on the correct
- *                 side of branch cuts, for example.)
- *
- *               * If @f&TVFF_EQMASK@ is @TVFF_ABSDELTA@, then %$x$% matches
- *                 %$y$% when %$|x - y| < \delta$%.
- *
- *               * If @f&TVFF_EQMASK@ is @TVFF_RELDELTA@, then %$x$% matches
- *                 %$y$% when %$|1 - x/y| < \delta$%.  (Note that this
- *                 criterion is asymmetric.  Write %$x \approx_\delta y$%
- *                 if and only if %$|1 - x/y < \delta$%.  Then, for example,
- *                 if %$y/(1 + \delta) < x < y (1 - \delta)$%, then
- *                 %$x \approx_\delta y$%, but %$y \not\approx_\delta x$%.)
- *
- *             The @TVEC_CLAIM_FLOAT@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @f0@ and @f1@ arguments (and @delta@) in the failure
- *             message.
- */
-
-extern int tvec_claimeqish_float(struct tvec_state */*tv*/,
-                                double /*f0*/, double /*f1*/,
-                                unsigned /*f*/, double /*delta*/,
-                                const char */*file*/, unsigned /*lno*/,
-                                const char */*expr*/);
-#define TVEC_CLAIMEQISH_FLOAT(tv, f0, f1, f, delta)                    \
-       (tvec_claimeqish_float(tv, f0, f1, f, delta, __FILE__, __LINE__, \
-                              #f0 " /= " #f1 " (+/- " #delta ")"))
-
-/* --- @tvec_claimeq_float@, @TVEC_CLAIMEQ_FLOAT@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @double f0, f1@ = two floating-point numbers
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @f0@ and @u1@ are identical, otherwise zero.
- *
- * Use:                Check that values of @f0@ and @f1@ are identical.  The
- *             function is exactly equivalent to @tvec_claimeqish_float@
- *             with @f == TVFF_EXACT@; the macro is similarly like
- *             @TVEC_CLAIMEQISH_FLOAT@ with @f == TVFF_EXACT@, except that
- *             it doesn't bother to quote a delta.
- */
-
-extern int tvec_claimeq_float(struct tvec_state */*tv*/,
-                             double /*f0*/, double /*f1*/,
-                             const char */*file*/, unsigned /*lno*/,
-                             const char */*expr*/);
-#define TVEC_CLAIMEQ_FLOAT(tv, f0, f1)                                 \
-       (tvec_claimeq_float(tv, f0, f1, __FILE__, __LINE__, #f0 " /= " #f1))
-
-/*----- Durations ---------------------------------------------------------*/
-
-/* A duration measures a time interval in seconds.  The input format consists
- * of a nonnegative decimal floating-point number in @strtod@ format followed
- * by an optional unit specification.
- */
-
-extern const struct tvec_regty tvty_duration;
-
-/* --- @tvec_parsedurunit@ --- *
- *
- * Arguments:  @double *scale_out@ = where to leave the scale
- *             @const char **p_inout@ = input unit string, updated
- *
- * Returns:    Zero on success, %$-1$% on error.
- *
- * Use:                If @*p_inout@ begins with a unit string followed by the end
- *             of the string or some non-alphanumeric character, then store
- *             the corresponding scale factor in @*scale_out@, advance
- *             @*p_inout@ past the unit string, and return zero.  Otherwise,
- *             return %$-1$%.
- */
-
-extern int tvec_parsedurunit(double */*scale_out*/,
-                            const char **/*p_inout*/);
-
-/* --- @tvec_claimeqish_duration@, @TVEC_CLAIMEQISH_DURATION@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @double to, t1@ = two durations
- *             @unsigned f@ = flags (@TVFF_...@)
- *             @double delta@ = maximum tolerable difference
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @t0@ and @t1@ are sufficiently close, otherwise
- *             zero.
- *
- * Use:                Check that values of @t0@ and @t1@ are sufficiently close.
- *             This is essentially the same as @tvec_claimeqish_float@, only
- *             it dumps the values as durations on a mismatch.
- *
- *             The @TVEC_CLAIM_FLOAT@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @t0@ and @t1@ arguments (and @delta@) in the failure
- *             message.
- */
-
-extern int tvec_claimeqish_duration(struct tvec_state */*tv*/,
-                                   double /*t0*/, double /*t1*/,
-                                   unsigned /*f*/, double /*delta*/,
-                                   const char */*file*/, unsigned /*lno*/,
-                                   const char */*expr*/);
-#define TVEC_CLAIMEQISH_DURATION(tv, t0, t1, f, delta)                 \
-       (tvec_claimeqish_duration(tv, t0, t1, f, delta, __FILE__, __LINE__, \
-                              #t0 " /= " #t1 " (+/- " #delta ")"))
-
-/* --- @tvec_claimeq_duration@, @TVEC_CLAIMEQ_DURATION@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @double t0, t1@ = two durations
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @t0@ and @t1@ are identical, otherwise zero.
- *
- * Use:                Check that values of @t0@ and @t1@ are identical.  The
- *             function is exactly equivalent to @tvec_claimeqish_duration@
- *             with @f == TVFF_EXACT@; the macro is similarly like
- *             @TVEC_CLAIMEQISH_DURATION@ with @f == TVFF_EXACT@, except
- *             that it doesn't bother to quote a delta.
- */
-
-int tvec_claimeq_duration(struct tvec_state */*tv*/,
-                         double /*t0*/, double /*t1*/,
-                         const char */*file*/, unsigned /*lno*/,
-                         const char */*expr*/);
-#define TVEC_CLAIMEQ_DURATION(tv, t0, t1)                                      \
-       (tvec_claimeq_float(tv, t0, t1, __FILE__, __LINE__, #t0 " /= " #t1))
-
-/*----- Enumerated types --------------------------------------------------*/
-
-/* An enumeration describes a set of values of some underlying type, each of
- * which has a symbolic name.  Values outside of the defined set can occur --
- * on output, because of bugs in the tested code, or on input to test
- * handling of unexpected values.
- *
- * There is a distinct enumerated type for each of the branches of
- * @tvec_misc@.  In the following, we write @t@ for the type code, which is
- * @i@ for signed integer, @u@ for unsigned integer, @f@ for floating-point,
- * and @p@ for pointer.
- *
- * On input, an enumerated value may be given by name or as a literal value.
- * For enumerations based on numeric types, the literal values can be written
- * in the same syntax as the underlying values.  For enumerations based on
- * pointers, the only permitted literal is %|#nil|%, which denotes a null
- * pointer.  On output, names are preferred (with the underlying value given
- * in a comment).
- */
-
-#define DEFENUMTY(tag, ty, slot)                                       \
-       extern const struct tvec_regty tvty_##slot##enum;
-TVEC_MISCSLOTS(DEFENUMTY)
-#undef DEFENUMTY
-
-/* A @struct tvec_tassoc@ associates a string tag with a value. */
-#define DEFASSOC(tag_, ty, slot)                                       \
-       struct tvec_##slot##assoc { const char *tag; ty slot; };
-TVEC_MISCSLOTS(DEFASSOC)
-#undef DEFASSOC
-
-#define TVEC_ENDENUM { 0, 0 }
-
-/* Information about an enumerated type. */
-#define DEFINFO(tag, ty, slot)                                         \
-       struct tvec_##slot##enuminfo {                                  \
-         const char *name;             /* type name for diagnostics */ \
-         const struct tvec_##slot##assoc *av; /* name/value mappings */ \
-         EXTRA_##tag##_INFOSLOTS       /* type-specific extra info */  \
-       };
-
-#define EXTRA_INT_INFOSLOTS                                            \
-       const struct tvec_irange *ir;   /* allowed range of raw values */
-
-#define EXTRA_UINT_INFOSLOTS                                           \
-       const struct tvec_urange *ur;   /* allowed range of raw values */
-
-#define EXTRA_FLT_INFOSLOTS                                            \
-       const struct tvec_floatinfo *fi; /* range and matching policy */
-
-#define EXTRA_PTR_INFOSLOTS            /* (nothing) */
-
-TVEC_MISCSLOTS(DEFINFO)
-
-#undef EXTRA_INT_INFOSLOTS
-#undef EXTRA_UINT_INFOSLOTS
-#undef EXTRA_FLT_INFOSLOTS
-#undef EXTRA_PTR_INFOSLOTS
-
-#undef DEFINFO
-
-/* Standard enumerations. */
-extern const struct tvec_ienuminfo tvenum_bool;
-extern const struct tvec_ienuminfo tvenum_cmp;
-
-/* --- @tvec_claimeq_tenum@, @TVEC_CLAIMEQ_TENUM@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const struct tvec_typeenuminfo *ei@ = enumeration type info
- *             @ty t0, t1@ = two values
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @t0@ and @t1@ are equal, otherwise zero.
- *
- * Use:                Check that values of @t0@ and @t1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @t0@ is printed as the output
- *             value and @t1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_TENUM@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @t0@ and @t1@ arguments in the failure message.
- */
-
-#define DECLCLAIM(tag, ty, slot)                                       \
-       extern int tvec_claimeq_##slot##enum                            \
-         (struct tvec_state */*tv*/,                                   \
-          const struct tvec_##slot##enuminfo */*ei*/,                  \
-          ty /*t0*/, ty /*t1*/,                                        \
-          const char */*file*/, unsigned /*lno*/, const char */*expr*/);
-TVEC_MISCSLOTS(DECLCLAIM)
-#undef DECLCLAIM
-#define TVEC_CLAIMEQ_IENUM(tv, ei, i0, i1)                             \
-       (tvec_claimeq_ienum(tv, ei, i0, i1,                             \
-                           __FILE__, __LINE__, #i0 " /= " #i1))
-#define TVEC_CLAIMEQ_UENUM(tv, ei, u0, u1)                             \
-       (tvec_claimeq_uenum(tv, ei, u0, u1,                             \
-                           __FILE__, __LINE__, #u0 " /= " #u1))
-#define TVEC_CLAIMEQ_FENUM(tv, ei, f0, f1)                             \
-       (tvec_claimeq_fenum(tv, ei, f0, f1,                             \
-                           __FILE__, __LINE__, #f0 " /= " #f1))
-#define TVEC_CLAIMEQ_PENUM(tv, ei, p0, p1)                             \
-       (tvec_claimeq_penum(tv, ei, p0, p1,                             \
-                           __FILE__, __LINE__, #p0 " /= " #p1))
-
-/*----- Flags type --------------------------------------------------------*/
-
-/* A flags value packs a number of fields into a single nonnegative integer.
- * Symbolic names are associated with the possible values of the various
- * fields; more precisely, each name is associated with a value and a
- * covering bitmask.
- *
- * The input syntax is a sequence of items separated by `%|||%' signs.  Each
- * item may be the symbolic name of a field value, or a literal unsigned
- * integer.  The masks associated with the given symbolic names must be
- * disjoint.  The resulting numerical value is simply the bitwise OR of the
- * given values.
- *
- * On output, the table of symbolic names and their associated values and
- * masks is repeatedly scanned, in order, to find disjoint matches -- i.e.,
- * entries whose value matches the target value in the bit positions
- * indicated by the mask, and whose mask doesn't overlap with any previously
- * found matches; the names are then output, separated by `%|||%'.  Any
- * remaining nonzero bits not covered by any of the matching masks are output
- * as a single literal integer, in hex.
- */
-
-extern const struct tvec_regty tvty_flags;
-
-struct tvec_flag {
-  /* Definition of a single flag or bitfield value.
-   *
-   * Each named setting comes with a value @v@ and a mask @m@; the mask
-   * should cover all of the value bits, i.e., @(v&~m) == 0@.
-   */
-
-  const char *tag;                     /* name */
-  unsigned long m, v;                  /* mask and value */
-};
-
-#define TVEC_ENDFLAGS { 0, 0, 0 }
-
-struct tvec_flaginfo {
-  /* Information about a flags type. */
-
-  const char *name;                    /* type name for diagnostics  */
-  const struct tvec_flag *fv;          /* name/mask/value mappings */
-  const struct tvec_urange *range;     /* permitted range for literals */
-};
-
-/* --- @tvec_claimeq_flags@, @TVEC_CLAIMEQ_FLAGS@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const struct tvec_flaginfo *fi@ = flags type info
- *             @unsigned long f0, f1@ = two values
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @f0@ and @f1@ are equal, otherwise zero.
- *
- * Use:                Check that values of @f0@ and @f1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @f0@ is printed as the output
- *             value and @f1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_FLAGS@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @f0@ and @f1@ arguments in the failure message.
- */
-
-extern int tvec_claimeq_flags(struct tvec_state */*tv*/,
-                             const struct tvec_flaginfo */*fi*/,
-                             unsigned long /*f0*/, unsigned long /*f1*/,
-                             const char */*file*/, unsigned /*lno*/,
-                             const char */*expr*/);
-#define TVEC_CLAIMEQ_FLAGS(tv, fi, f0, f1)                             \
-       (tvec_claimeq_flags(tv, fi, f0, f1,                             \
-                           __FILE__, __LINE__, #f0 " /= " #f1))
-
-/*----- Character type ----------------------------------------------------*/
-
-/* A character value holds a character, as read by @fgetc@.  The special
- * @EOF@ value can also be represented.
- *
- * On input, a character value can be given by symbolic name, with a leading
- * `%|#|%'; or a character or `%|\|%'-escape sequence, optionally in single
- * quotes.
- *
- * The following escape sequences and character names are recognized.
- *
- *   * `%|#eof|%' is the special end-of-file marker.
- *
- *   * `%|#nul|%' is the NUL character, sometimes used to terminate strings.
- *
- *   * `%|bell|%', `%|bel|%', `%|ding|%', or `%|\a|%' is the BEL character
- *     used to ring the terminal bell (or do some other thing to attract the
- *     user's attention).
- *
- *   * %|#backspace|%, %|#bs|%, or %|\b|% is the backspace character, used to
- *     move the cursor backwords by one cell.
- *
- *   * %|#escape|% %|#esc|%, or%|\e|% is the escape character, used to
- *     introduce special terminal commands.
- *
- *   * %|#formfeed|%, %|#ff|%, or %|\f|% is the formfeed character, used to
- *     separate pages of text.
- *
- *   * %|#newline|%, %|#linefeed|%, %|#lf|%, %|#nl|%, or %|\n|% is the
- *     newline character, used to terminate lines of text or advance the
- *     cursor to the next line (perhaps without returning it to the start of
- *     the line).
- *
- *   * %|#return|%, %|#carriage-return|%, %|#cr|%, or %|\r|% is the
- *     carriage-return character, used to return the cursor to the start of
- *     the line.
- *
- *   * %|#tab|%, %|#horizontal-tab|%, %|#ht|%, or %|\t|% is the tab
- *     character, used to advance the cursor to the next tab stop on the
- *     current line.
- *
- *   * %|#vertical-tab|%, %|#vt|%, %|\v|% is the vertical tab character.
- *
- *   * %|#space|%, %|#spc|% is the space character.
- *
- *   * %|#delete|%, %|#del|% is the delete character, used to erase the most
- *     recent character.
- *
- *   * %|\'|% is the single-quote character.
- *
- *   * %|\\|% is the backslash character.
- *
- *   * %|\"|% is the double-quote character.
- *
- *   * %|\NNN|% or %|\{NNN}|% is the character with code NNN in octal.  The
- *     NNN may be up to three digits long.
- *
- *   * %|\xNN|% or %|\x{NN}|% is the character with code NNN in hexadecimal.
- */
-
-extern const struct tvec_regty tvty_char;
-
-/* --- @tvec_claimeq_char@, @TVEC_CLAIMEQ_CHAR@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @int ch0, ch1@ = two character codes
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if @ch0@ and @ch1@ are equal, otherwise zero.
- *
- * Use:                Check that values of @ch0@ and @ch1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @ch0@ is printed as the output
- *             value and @ch1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_CHAR@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @ch0@ and @ch1@ arguments in the failure message.
- */
-
-extern int tvec_claimeq_char(struct tvec_state */*tv*/,
-                            int /*ch0*/, int /*ch1*/,
-                            const char */*file*/, unsigned /*lno*/,
-                            const char */*expr*/);
-#define TVEC_CLAIMEQ_CHAR(tv, c0, c1)                                  \
-       (tvec_claimeq_char(tv, c0, c1, __FILE__, __LINE__, #c0 " /= " #c1))
-
-/*----- Text and binary string types --------------------------------------*/
-
-/* A string is a sequence of octets.  Text and binary strings differ
- * primarily in presentation: text strings are shown as raw characters where
- * possible; binary strings are shown as hex dumps with an auxiliary text
- * display.
- *
- * The input format for both kinds of strings is basically the same: a
- * `compound string', consisting of
- *
- *   * single-quoted strings, which are interpreted entirely literally, but
- *     can't contain single quotes or newlines;
- *
- *   * double-quoted strings, in which `%|\|%'-escapes are interpreted as for
- *     characters;
- *
- *   * character names, marked by an initial `%|#|%' sign;
- *
- *   * special tokens marked by an initial `%|!|%' sign; or
- *
- *   * barewords interpreted according to the current coding scheme.
- *
- * The special tokens are
- *
- *   * `%|!bare|%', which causes subsequent sequences of barewords to be
- *     treated as plain text;
- *
- *   * `%|!hex|%', `%|!base32|%', `%|!base64|%', which cause subsequent
- *     barewords to be decoded in the requested manner.
- *
- *   * `%|!repeat|% %$n$% %|{|% %%\textit{string}%% %|}|%', which includes
- *     %$n$% copies of the (compound) string.
- *
- * The only difference between text and binary strings is that the initial
- * coding scheme is %|bare|% for text strings and %|hex|% for binary strings.
- *
- * Either kind of string can contain internal nul characters.  A trailing nul
- * is appended -- beyond the stated input length -- to input strings as a
- * convenience to test functions.  Test functions may include such a nul
- * character on output but this is not checked by the equality test.
- *
- * A @struct tvec_urange@ may be supplied as an argument: the length of the
- * string (in bytes) will be checked against the permitted range.
- */
-
-extern const struct tvec_regty tvty_text, tvty_bytes;
-
-/* --- @tvec_alloctext@, @tvec_allocbytes@ --- *
- *
- * Arguments:  @union tvec_regval *rv@ = register value
- *             @size_t sz@ = required size
- *
- * Returns:    ---
- *
- * Use:                Allocated space in a text or binary string register.  If the
- *             current register size is sufficient, its buffer is left
- *             alone; otherwise, the old buffer, if any, is freed and a
- *             fresh buffer allocated.  These functions are not intended to
- *             be used to adjust a buffer repeatedly, e.g., while building
- *             output incrementally: (a) they will perform badly, and (b)
- *             the old buffer contents are simply discarded if reallocation
- *             is necessary.  Instead, use a @dbuf@ or @dstr@.
- *
- *             The @tvec_alloctext@ function sneakily allocates an extra
- *             byte for a terminating zero.  The @tvec_allocbytes@ function
- *             doesn't do this.
- */
-
-extern void tvec_alloctext(union tvec_regval */*rv*/, size_t /*sz*/);
-extern void tvec_allocbytes(union tvec_regval */*rv*/, size_t /*sz*/);
-
-/* --- @tvec_claimeq_text@, @TVEC_CLAIMEQ_TEXT@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const char *p0@, @size_t sz0@ = first string with length
- *             @const char *p1@, @size_t sz1@ = second string with length
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if the strings at @p0@ and @p1@ are equal, otherwise
- *             zero.
- *
- * Use:                Check that strings at @p0@ and @p1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @p0@ is printed as the output
- *             value and @p1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_TEXT@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @ch0@ and @ch1@ arguments in the failure message.
- */
-
-extern int tvec_claimeq_text(struct tvec_state */*tv*/,
-                            const char */*p0*/, size_t /*sz0*/,
-                            const char */*p1*/, size_t /*sz1*/,
-                            const char */*file*/, unsigned /*lno*/,
-                            const char */*expr*/);
-#define TVEC_CLAIMEQ_TEXT(tv, p0, sz0, p1, sz1)                                \
-       (tvec_claimeq_text(tv, p0, sz0, p1, sz1, __FILE__, __LINE__,    \
-                          #p0 "[" #sz0 "] /= " #p1 "[" #sz1 "]"))
-
-/* --- @tvec_claimeq_textz@, @TVEC_CLAIMEQ_TEXTZ@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const char *p0, *p1@ = two strings to compare
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if the strings at @p0@ and @p1@ are equal, otherwise
- *             zero.
- *
- * Use:                Check that strings at @p0@ and @p1@ are equal, as for
- *             @tvec_claimeq_string@, except that the strings are assumed
- *             null-terminated, so their lengths don't need to be supplied
- *             explicitly.  The macro is similarly like @TVEC_CLAIMEQ_TEXT@.
- */
-
-extern int tvec_claimeq_textz(struct tvec_state */*tv*/,
-                             const char */*p0*/, const char */*p1*/,
-                             const char */*file*/, unsigned /*lno*/,
-                             const char */*expr*/);
-#define TVEC_CLAIMEQ_TEXTZ(tv, p0, p1)                                 \
-       (tvec_claimeq_textz(tv, p0, p1, __FILE__, __LINE__, #p0 " /= " #p1))
-
-/* --- @tvec_claimeq_bytes@, @TVEC_CLAIMEQ_BYTES@ --- *
- *
- * Arguments:  @struct tvec_state *tv@ = test-vector state
- *             @const void *p0@, @size_t sz0@ = first string with length
- *             @const void *p1@, @size_t sz1@ = second string with length
- *             @const char *file@, @unsigned @lno@ = calling file and line
- *             @const char *expr@ = the expression to quote on failure
- *
- * Returns:    Nonzero if the strings at @p0@ and @p1@ are equal, otherwise
- *             zero.
- *
- * Use:                Check that binary strings at @p0@ and @p1@ are equal.  As for
- *             @tvec_claim@ above, a test case is automatically begun and
- *             ended if none is already underway.  If the values are
- *             unequal, then @tvec_fail@ is called, quoting @expr@, and the
- *             mismatched values are dumped: @p0@ is printed as the output
- *             value and @p1@ is printed as the input reference.
- *
- *             The @TVEC_CLAIM_STRING@ macro is similar, only it (a)
- *             identifies the file and line number of the call site
- *             automatically, and (b) implicitly quotes the source text of
- *             the @ch0@ and @ch1@ arguments in the failure message.
- */
-
-extern int tvec_claimeq_bytes(struct tvec_state */*tv*/,
-                              const void */*p0*/, size_t /*sz0*/,
-                              const void */*p1*/, size_t /*sz1*/,
-                              const char */*file*/, unsigned /*lno*/,
-                              const char */*expr*/);
-#define TVEC_CLAIMEQ_BYTES(tv, p0, sz0, p1, sz1)                       \
-       (tvec_claimeq(tv, p0, sz0, p1, sz1, __FILE__, __LINE__,         \
-                     #p0 "[" #sz0 "] /= " #p1 "[" #sz1 "]"))
-
-/*----- Buffer type -------------------------------------------------------*/
-
-/* Buffer registers are primarily used for benchmarking.  Only a buffer's
- * allocation parameters are significant: its contents are ignored on
- * comparison and output, and unspecified on input.
- *
- * The input format gives the buffer's size, and an optional alignment
- * specification, in the form %|SZ [`@' M [`+' A]]|%.  Each of %|SZ|%, %|M|%
- * and %|A|% are sizes, as an integer, optionally suffixed with a unit `kB',
- * `MB', `GB', `TB', `PB', `EB', `ZB', `YB' (with or without the `B')
- * denoting a power of 1024.  The %|SZ|% gives the (effective) buffer size.
- * %|M|% is the `alignment quantum' and %|A|% is the `alignment offset'; both
- * default to zero, but if %|M|% is nonzero then the start of the buffer is
- * aligned such that it is %|A|% more than a multiple of %|M|% bytes.  Note
- * that %|M|% need not be a power of two, though this is common.
- *
- * Units other than `B' are used on output only when the size would be
- * expressed exactly.
- *
- * Buffers are %%\emph{not}%% allocated by default.  In benchmarks, this is
- * best done in a @before@ function.
- *
- * No @claimeq@ functions or macros are provided for buffers because they
- * don't seem very useful.
- */
-
-extern const struct tvec_regty tvty_buffer;
-
-/* --- @tvec_initbuffer@ --- *
- *
- * Arguments:  @union tvec_regval *rv@ = register value
- *             @const union tvec_regval *ref@ = reference buffer
- *             @size_t sz@ = size to allocate
- *
- * Returns:    ---
- *
- * Use:                Initialize the alignment parameters in @rv@ to match @ref@,
- *             and the size to @sz@.
- */
-
-extern void tvec_initbuffer(union tvec_regval */*rv*/,
-                           const union tvec_regval */*ref*/, size_t /*sz*/);
-
-/* --- @tvec_allocbuffer@ --- *
- *
- * Arguments:  @union tvec_regval *rv@ = register value
- *
- * Returns:    ---
- *
- * Use:                Allocate @sz@ bytes to the buffer and fill the space with a
- *             distinctive pattern.
- */
-
-extern void tvec_allocbuffer(union tvec_regval */*rv*/);
-
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus
index f3f33d5f729b733f95494f22b63a0e1156ea992a..de0e0fa07ad5e3bdf1788f50e32a01eaf36da0b8 100644 (file)
@@ -38,7 +38,7 @@
 .\" @traceopt
 .\" @NTRACE
 .\" @T
-.\" IF_TRACING
+.\" @IF_TRACING
 .
 .\"--------------------------------------------------------------------------
 .SH "NAME"
index fe5a4a3448edf10765907c7405e397fb85816d6e..46a8dd74b6131c5941507ba25a285553df434a44 100644 (file)
@@ -78,6 +78,16 @@ check_PROGRAMS               += t/exc.t
 t_exc_t_SOURCES                 = t/exc-test.c
 t_exc_t_LDFLAGS                 = -static
 
+## Floating-point formatt conversion.
+pkginclude_HEADERS     += fltfmt.h
+libutils_la_SOURCES    += fltfmt.c fltfmt-convert.c
+##EXTRA_DIST           += fltfmt.3.in
+##LIBMANS              += fltfmt.3
+
+check_PROGRAMS         += t/fltfmt.t
+t_fltfmt_t_SOURCES      = t/fltfmt-test.c
+t_fltfmt_t_LDFLAGS      = -static
+
 ## Generalized formatting.
 pkginclude_HEADERS     += gprintf.h
 libutils_la_SOURCES    += gprintf.c
index 196c8a2a662b9fa90d7840b2c20f9f3730604f9c..9d2e65492f7d59469f270454db4c53f9e5e5d01e 100644 (file)
   extern "C" {
 #endif
 
+/*----- Header files ------------------------------------------------------*/
+
+#include <stddef.h>
+
 /*----- Data structures ---------------------------------------------------*/
 
 union align {
   int i;
   long l;
   double d;
+  long double ld;
   void *p;
   void (*f)(void *);
   struct notexist *s;
+#if __STDC_VERSION__ >= 201112
+  max_align_t m;
+#endif
 };
 
 /*----- Macros provided ---------------------------------------------------*/
 
+#if __STDC_VERSION__ >= 201112
+#  define ALIGNOF(ty) _Alignof(ty)
+#else
+#  define ALIGNOF(ty) (offsetof(struct { unsigned char _x; ty _y; }, _y))
+#endif
+
 #define ALIGN(sz) do {                                                 \
-  sz += sizeof(union align) - 1;                                       \
-  sz -= sz % sizeof(union align);                                      \
+  (sz) += ALIGNOF(union align) - 1;                                    \
+  (sz) -= (sz)%ALIGNOF(union align);                                   \
 } while (0)
 
 /*----- That's all, folks -------------------------------------------------*/
index 28a26225d004135c2d47b7d266fbb2b067aeb256..2e22c98cb3616b7be4fb6a76a5c914f37ec83ed0 100644 (file)
 .
 .\"--------------------------------------------------------------------------
 .TH bits 3mLib "20 June 1999" "Straylight/Edgeware" "mLib utilities library"
-.\" octet
-.\" uint16
-.\" uint24
-.\" uint32
-.\" uint64
-.\" kludge64
-.\"
-.\" MASK_8
-.\" MASK_16
-.\" MASK_16_L
-.\" MASK_16_B
-.\" MASK_24
-.\" MASK_24_L
-.\" MASK_24_B
-.\" MASK_32
-.\" MASK_32_L
-.\" MASK_32_B
-.\" MASK_64
-.\" MASK_64_L
-.\" MASK_64_B
-.\"
-.\" SZ_8
-.\" SZ_16
-.\" SZ_16_L
-.\" SZ_16_B
-.\" SZ_24
-.\" SZ_24_L
-.\" SZ_24_B
-.\" SZ_32
-.\" SZ_32_L
-.\" SZ_32_B
-.\" SZ_64
-.\" SZ_64_L
-.\" SZ_64_B
-.\"
-.\" TY_8
-.\" TY_16
-.\" TY_16_L
-.\" TY_16_B
-.\" TY_24
-.\" TY_24_L
-.\" TY_24_B
-.\" TY_32
-.\" TY_32_L
-.\" TY_32_B
-.\" TY_64
-.\" TY_64_L
-.\" TY_64_B
-.\"
-.\" DOUINTSZ
-.\" DOUINTCONV
-.\"
+.\" @octet
+.\" @uint16
+.\" @uint24
+.\" @uint32
+.\" @uint64
+.\" @kludge64
+.
+.\" @MASK_8
+.\" @MASK_16
+.\" @MASK_16_L
+.\" @MASK_16_B
+.\" @MASK_24
+.\" @MASK_24_L
+.\" @MASK_24_B
+.\" @MASK_32
+.\" @MASK_32_L
+.\" @MASK_32_B
+.\" @MASK_64
+.\" @MASK_64_L
+.\" @MASK_64_B
+.
+.\" @SZ_8
+.\" @SZ_16
+.\" @SZ_16_L
+.\" @SZ_16_B
+.\" @SZ_24
+.\" @SZ_24_L
+.\" @SZ_24_B
+.\" @SZ_32
+.\" @SZ_32_L
+.\" @SZ_32_B
+.\" @SZ_64
+.\" @SZ_64_L
+.\" @SZ_64_B
+.
+.\" @TY_8
+.\" @TY_16
+.\" @TY_16_L
+.\" @TY_16_B
+.\" @TY_24
+.\" @TY_24_L
+.\" @TY_24_B
+.\" @TY_32
+.\" @TY_32_L
+.\" @TY_32_B
+.\" @TY_64
+.\" @TY_64_L
+.\" @TY_64_B
+.
+.\" @DOUINTSZ
+.\" @DOUINTCONV
+.
 .\" @U8
 .\" @U16
 .\" @U24
 .\" @U32
 .\" @U64
 .\" @U64_
-.\"
+.
 .\" @LSL8
 .\" @LSR8
 .\" @LSL16
 .\" @LSR64
 .\" @LSL64_
 .\" @LSR64_
-.\"
+.
 .\" @ROL8
 .\" @ROR8
 .\" @ROL16
 .\" @ROR64
 .\" @ROL64_
 .\" @ROR64_
-.\"
-.\" ENDSWAP16
-.\" ENDSWAP32
-.\" ENDSWAP64
-.\"
-.\" BTOH16
-.\" LTOH16
-.\" HTOB16
-.\" HTOL16
-.\" BTOH32
-.\" LTOH32
-.\" HTOB32
-.\" HTOL32
-.\" BTOH64
-.\" LTOH64
-.\" HTOB64
-.\" HTOL64
-.\"
-.\" RAW8
-.\" RAW16
-.\" RAW32
-.\" RAW64
-.\"
+.
+.\" @ENDSWAP16
+.\" @ENDSWAP32
+.\" @ENDSWAP64
+.
+.\" @BTOH16
+.\" @LTOH16
+.\" @HTOB16
+.\" @HTOL16
+.\" @BTOH32
+.\" @LTOH32
+.\" @HTOB32
+.\" @HTOL32
+.\" @BTOH64
+.\" @LTOH64
+.\" @HTOB64
+.\" @HTOL64
+.
+.\" @RAW8
+.\" @RAW16
+.\" @RAW32
+.\" @RAW64
+.
 .\" @GETBYTE
 .\" @PUTBYTE
-.\"
+.
 .\" @LOAD8
 .\" @STORE8
-.\"
+.
 .\" @LOAD16_L
 .\" @LOAD16_B
 .\" @LOAD16
 .\" @STORE16_L
 .\" @STORE16_B
 .\" @STORE16
-.\"
+.
 .\" @LOAD24_L
 .\" @LOAD24_B
 .\" @LOAD24
 .\" @STORE24_L
 .\" @STORE24_B
 .\" @STORE24
-.\"
+.
 .\" @LOAD32_L
 .\" @LOAD32_B
 .\" @LOAD32
 .\" @STORE32_L
 .\" @STORE32_B
 .\" @STORE32
-.\"
+.
 .\" @LOAD64_L
 .\" @LOAD64_B
 .\" @LOAD64
 .\" @STORE64_L
 .\" @STORE64_B
 .\" @STORE64
-.\"
+.
 .\" @LOAD64_L_
 .\" @LOAD64_B_
 .\" @LOAD64_
 .\" @STORE64_L_
 .\" @STORE64_B_
 .\" @STORE64_
-.\"
+.
 .\" @SET64
 .\" @X64
 .\" @ASSIGN64
 .\" @HI64
 .\" @LO64
 .\" @GET64
+.\" @SETBYTE64
 .\" @AND64
 .\" @OR64
 .\" @XOR64
@@ -267,6 +268,7 @@ and
 .BI "uint32 HI64(kludge64" x );
 .BI "uint32 LO64(kludge64" x );
 .IB ty " GET64(" ty ", kludge64 " x );
+.BI "void SETBYTE64(kludge64 &" z ", octet " x ", unsigned " j );
 .BI "void AND64(kludge64 &" d ", kludge64 " x ", kludge64 " y );
 .BI "void OR64(kludge64 &" d ", kludge64 " x ", kludge64 " y );
 .BI "void XOR64(kludge64 &" d ", kludge64 " x ", kludge64 " y );
@@ -681,6 +683,17 @@ of
 .I x
 is too large.
 .TP
+.BI SETBYTE( z ", " x ", " j )
+Store the value
+.I x
+in byte
+.I j
+of
+.IR z ,
+which is assumed to be initially zero.
+Bytes are numbered with the least significant being byte zero and the
+most significant being byte 7.
+.TP
 .BI AND64( d ", " x ", " y )
 Set
 .I d
index 87058e26967a96c3f9d20a2768c4b8624613ccf2..295584519d03b20a24dd737f762433f2c5aab79f 100644 (file)
@@ -202,13 +202,13 @@ typedef unsigned char octet, uint8;
 
 /* --- Type coercions --- */
 
-#define U8(x) ((octet)((x) & MASK8))
-#define U16(x) ((uint16)((x) & MASK16))
-#define U24(x) ((uint24)((x) & MASK24))
-#define U32(x) ((uint32)((x) & MASK32))
+#define U8(x) ((octet)((x)&MASK8))
+#define U16(x) ((uint16)((x)&MASK16))
+#define U24(x) ((uint24)((x)&MASK24))
+#define U32(x) ((uint32)((x)&MASK32))
 
 #ifdef HAVE_UINT64
-#  define U64(x) ((uint64)(x) & MASK64)
+#  define U64(x) ((uint64)(x)&MASK64)
 #  define U64_(d, x) ((d).i = U64(x).i)
 #else
 #  define U64_(d, x) ((d).hi = U32((x).hi), (d).lo = U32((x).lo))
@@ -216,23 +216,23 @@ typedef unsigned char octet, uint8;
 
 /* --- Safe shifting macros --- */
 
-#define LSL8(v, s) U8(U8(v) << ((s) & 7u))
-#define LSR8(v, s) U8(U8(v) >> ((s) & 7u))
-#define LSL16(v, s) U16(U16(v) << ((s) & 15u))
-#define LSR16(v, s) U16(U16(v) >> ((s) & 15u))
-#define LSL24(v, s) U24(U24(v) << ((s) % 24u))
-#define LSR24(v, s) U24(U24(v) >> ((s) % 24u))
-#define LSL32(v, s) U32(U32(v) << ((s) & 31u))
-#define LSR32(v, s) U32(U32(v) >> ((s) & 31u))
+#define LSL8(v, s) U8(U8(v) << ((s)&7u))
+#define LSR8(v, s) U8(U8(v) >> ((s)&7u))
+#define LSL16(v, s) U16(U16(v) << ((s)&15u))
+#define LSR16(v, s) U16(U16(v) >> ((s)&15u))
+#define LSL24(v, s) U24(U24(v) << ((s)%24u))
+#define LSR24(v, s) U24(U24(v) >> ((s)%24u))
+#define LSL32(v, s) U32(U32(v) << ((s)&31u))
+#define LSR32(v, s) U32(U32(v) >> ((s)&31u))
 
 #ifdef HAVE_UINT64
-#  define LSL64(v, s) U64(U64(v) << ((s) & 63u))
-#  define LSR64(v, s) U64(U64(v) >> ((s) & 63u))
+#  define LSL64(v, s) U64(U64(v) << ((s)&63u))
+#  define LSR64(v, s) U64(U64(v) >> ((s)&63u))
 #  define LSL64_(d, v, s) ((d).i = LSL64((v).i, (s)))
 #  define LSR64_(d, v, s) ((d).i = LSR64((v).i, (s)))
 #else
 #  define LSL64_(d, v, s) do {                                         \
-     unsigned _s = (s) & 63u;                                          \
+     unsigned _s = (s)&63u;                                            \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
      if (_s >= 32) {                                                   \
@@ -247,7 +247,7 @@ typedef unsigned char octet, uint8;
      }                                                                 \
    } while (0)
 #  define LSR64_(d, v, s) do {                                         \
-     unsigned _s = (s) & 63u;                                          \
+     unsigned _s = (s)&63u;                                            \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
      if (_s >= 32) {                                                   \
@@ -281,7 +281,7 @@ typedef unsigned char octet, uint8;
 #  define ROR64_(d, v, s) ((d).i = ROR64((v).i, (s)))
 #else
 #  define ROL64_(d, v, s) do {                                         \
-     unsigned _s = (s) & 63u;                                          \
+     unsigned _s = (s)&63u;                                            \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
      if (_s > 32) {                                                    \
@@ -299,7 +299,7 @@ typedef unsigned char octet, uint8;
      }                                                                 \
    } while (0)
 #  define ROR64_(d, v, s) do {                                         \
-     unsigned _s = (s) & 63u;                                          \
+     unsigned _s = (s)&63u;                                            \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
      if (_s > 32) {                                                    \
@@ -486,7 +486,7 @@ typedef unsigned char octet, uint8;
 #  define STORE64_B(p, x) (RAW64(p) = HTOB64(x))
 #endif
 
-#define GETBYTE(p, o) (((octet *)(p))[o] & MASK8)
+#define GETBYTE(p, o) (((octet *)(p))[o]&MASK8)
 #define PUTBYTE(p, o, v) (((octet *)(p))[o] = U8((v)))
 
 #define LOAD8(p) (GETBYTE((p), 0))
@@ -619,31 +619,35 @@ typedef unsigned char octet, uint8;
 /* --- Other operations on 64-bit integers --- */
 
 #ifdef HAVE_UINT64
-#  define SET64(d, h, l) ((d).i = (U64((h)) << 32) | U64((l)))
+#  define SET64(d, h, l) ((d).i = ((uint64)(U32(h)) << 32) | U32(l))
 #  define ASSIGN64(d, x) ((d).i = U64((x)))
 #  define HI64(x) U32((x).i >> 32)
 #  define LO64(x) U32((x).i)
 #  define GET64(t, x) ((t)(x).i)
+#  define SETBYTE64(z, x, j) ((z).i |= (uint64)U8(x) << 8*(j))
 #else
 #  define SET64(d, h, l) ((d).hi = U32(h), (d).lo = U32(l))
 #  define ASSIGN64(d, x)                                               \
-    ((d).hi = ((x & ~MASK32) >> 16) >> 16, (d).lo = U32(x))
+    ((d).hi = ((x&~MASK32) >> 16) >> 16, (d).lo = U32(x))
 #  define HI64(x) U32((x).hi)
 #  define LO64(x) U32((x).lo)
-#  define GET64(t, x) (((((t)HI64(x) << 16) << 16) & ~MASK32) | (t)LO64(x))
+#  define GET64(t, x) (((((t)HI64(x) << 16) << 16)&~MASK32) | (t)LO64(x))
+#  define SETBYTE64(z, x, j)                                           \
+       ((j) < 4 ? (z).lo |= (uint32)U8(x) << 8*(j)                     \
+                : (z).hi |= (uint32)U8(x) << 8*((j) - 4))
 #endif
 
 #ifdef HAVE_UINT64
-#  define AND64(d, x, y) ((d).i = (x).i & (y).i)
+#  define AND64(d, x, y) ((d).i = (x).i&(y).i)
 #  define OR64(d, x, y) ((d).i = (x).i | (y).i)
 #  define XOR64(d, x, y) ((d).i = (x).i ^ (y).i)
 #  define CPL64(d, x) ((d).i = ~(x).i)
 #  define ADD64(d, x, y) ((d).i = (x).i + (y).i)
 #  define SUB64(d, x, y) ((d).i = (x).i - (y).i)
 #  define CMP64(x, op, y) ((x).i op (y).i)
-#  define ZERO64(x) ((x) == 0)
+#  define ZERO64(x) ((x).i == 0)
 #else
-#  define AND64(d, x, y) ((d).lo = (x).lo & (y).lo, (d).hi = (x).hi & (y).hi)
+#  define AND64(d, x, y) ((d).lo = (x).lo&(y).lo, (d).hi = (x).hi&(y).hi)
 #  define OR64(d, x, y) ((d).lo = (x).lo | (y).lo, (d).hi = (x).hi | (y).hi)
 #  define XOR64(d, x, y) ((d).lo = (x).lo ^ (y).lo, (d).hi = (x).hi ^ (y).hi)
 #  define CPL64(d, x) ((d).lo = ~(x).lo, (d).hi = ~(x).hi)
index cd3f1c51089fd4996dabe12c49359877a37caad9..47ed9ce72f1274faadb534c5df07a979a2613c89 100644 (file)
 
 #include <setjmp.h>
 
+#ifndef MLIB_MACROS_H
+#  include "macros.h"
+#endif
+
 /*----- Quick documentation -----------------------------------------------*
  *
  * This header file provides some exception handling facilities in C
@@ -309,7 +313,7 @@ extern exc__uncaught exc_uncaught(exc__uncaught /*proc*/);
  *             value and throws an exception.
  */
 
-extern void __exc_throw(exc_extype /*type*/, ...);
+extern NORETURN void __exc_throw(exc_extype /*type*/, ...);
 
 /* --- @__exc_rethrow@ --- *
  *
@@ -322,7 +326,7 @@ extern void __exc_throw(exc_extype /*type*/, ...);
  *             an exception.
  */
 
-extern void __exc_rethrow(exc_extype /*type*/, exc_exval /*val*/);
+extern NORETURN void __exc_rethrow(exc_extype /*type*/, exc_exval /*val*/);
 
 /*----- That's all, folks -------------------------------------------------*/
 
diff --git a/utils/fltfmt-convert.c b/utils/fltfmt-convert.c
new file mode 100644 (file)
index 0000000..6db742b
--- /dev/null
@@ -0,0 +1,210 @@
+/* -*-c-*-
+ *
+ * Floating-point format conversions
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include "config.h"
+
+#include "bits.h"
+#include "fltfmt.h"
+
+/*----- Main code ---------------------------------------------------------*/
+
+/* Macro machinery. */
+
+#define CONVERSIONS(_)                                                 \
+  _(float, flt, f32)                                                   \
+  _(double, dbl, f64)
+
+#define CONV_DECLS_flt_f32 uint32 t
+#if (FLT_FORMAT&(FLTFMT_ORGMASK | FLTFMT_TYPEMASK)) == FLTFMT_IEEE_F32
+#  if (FLT_FORMAT&FLTFMT_ENDMASK) == FLTFMT_BE
+#    define CONV_LOAD_flt_f32 do { t = LOAD32_B(&x); } while (0)
+#    define CONV_STORE_flt_f32 do { STORE32_B(z_out, t); } while (0)
+#  elif (FLT_FORMAT&FLTFMT_ENDMASK) == FLTFMT_LE
+#    define CONV_LOAD_flt_f32 do { t = LOAD32_L(&x); } while (0)
+#    define CONV_STORE_flt_f32 do { STORE32_L(z_out, t); } while (0)
+#  else
+#    error "unimplemented byte order"
+#  endif
+#  ifdef FLTFMT__MUST_FROB_NANS
+#    define CONV_FROB_flt_f32 do { FLTFMT__FROB_NAN_F32(&t, rc); } while (0)
+#  else
+#    define CONV_FROB_flt_f32 do ; while (0)
+#  endif
+#else
+#  define CONV_LOAD_flt_f32 do {                                       \
+     struct floatbits u = FLOATBITS_INIT;                              \
+     rc |= fltfmt_decflt(&u, x, r);                                    \
+     rc |= fltfmt_encieee(&fltfmt_f32, &t, &u, r, FLTERR_ALLERRS);     \
+     fltfmt_freebits(&u);                                              \
+   } while (0)
+#  define CONV_STORE_flt_f32 do {                                      \
+     struct floatbits u = FLOATBITS_INIT;                              \
+     rc |= fltfmt_decieee(&fltfmt_f32, &u, &t);                                \
+     rc |= fltfmt_encflt(z_out, &u, r);                                        \
+     fltfmt_freebits(&u);                                              \
+   } while (0)
+#  define CONV_FROB_flt_f32 do ; while (0)
+#endif
+#define CONV_LOADB_flt_f32 do { t = LOAD32_B(p); } while (0)
+#define CONV_LOADL_flt_f32 do { t = LOAD32_L(p); } while (0)
+#define CONV_STOREB_flt_f32 do { STORE32_B(p, t); } while (0)
+#define CONV_STOREL_flt_f32 do { STORE32_L(p, t); } while (0)
+
+#define CONV_DECLS_dbl_f64 kludge64 t
+#if (DBL_FORMAT&(FLTFMT_ORGMASK | FLTFMT_TYPEMASK)) == FLTFMT_IEEE_F64
+#  if (DBL_FORMAT&FLTFMT_ENDMASK) == FLTFMT_BE
+#    define CONV_LOAD_dbl_f64 do { LOAD64_B_(t, &x); } while (0)
+#    define CONV_STORE_dbl_f64 do { STORE64_B_(z_out, t); } while (0)
+#  elif (DBL_FORMAT&FLTFMT_ENDMASK) == FLTFMT_LE
+#    define CONV_LOAD_dbl_f64 do { LOAD64_L_(t, &x); } while (0)
+#    define CONV_STORE_dbl_f64 do { STORE64_L_(z_out, t); } while (0)
+#  else
+#    error "unimplemented byte order"
+#  endif
+#  ifdef FLTFMT__MUST_FROB_NANS
+#    define CONV_FROB_dbl_f64 do {                                     \
+       uint32 u[2];                                                    \
+       u[0] = HI64(t); u[1] = LO64(t);                                 \
+       FLTFMT__FROB_NAN_F64(&u, rc);                                   \
+       SET64(t, u[0], u[1]);                                           \
+     } while (0)
+#  else
+#    define CONV_FROB_dbl_f64 do ; while (0)
+#  endif
+#else
+#  define CONV_LOAD_dbl_f64 do {                                       \
+     struct floatbits u = FLOATBITS_INIT; uint32 v[2];                 \
+     rc |= fltfmt_decdbl(&u, x, r);                                    \
+     rc |= fltfmt_encieee(&fltfmt_f64, v, &u, r, FLTERR_ALLERRS);      \
+     SET64(t, v[0], v[1]); fltfmt_freebits(&u);                                \
+   } while (0)
+#  define CONV_STORE_dbl_f64 do {                                      \
+     struct floatbits u = FLOATBITS_INIT; uint32 v[2];                 \
+     v[0] = HI64(t); v[1] = LO64(t);                                   \
+     rc |= fltfmt_decieee(&fltfmt_f64, &u, v);                         \
+     rc |= fltfmt_encdbl(z_out, &u, r);                                        \
+     fltfmt_freebits(&u);                                              \
+   } while (0)
+#  define CONV_FROB_dbl_f64 do ; while (0)
+#endif
+#define CONV_LOADB_dbl_f64 do { LOAD64_B_(t, p); } while (0)
+#define CONV_LOADL_dbl_f64 do { LOAD64_L_(t, p); } while (0)
+#define CONV_STOREB_dbl_f64 do { STORE64_B_(p, t); } while (0)
+#define CONV_STOREL_dbl_f64 do { STORE64_L_(p, t); } while (0)
+
+/* --- @fltfmt_CTYtoFTYE@ --- *
+ *
+ * Arguments:  @octet *p@ = output pointer
+ *             @float x@, @double x@ = value to convert
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a native C floating-point value in an external format.
+ *
+ *             The @CTY@ is an abbreviation for a C type: @flt@ for @float@,
+ *             or @dbl@ for @double@; @fty@ is an abbreviation for the
+ *             external format, @f32@ for IEEE Binary32, or @f64@ for IEEE
+ *             Binary64; and @E@ is @l@ for little-endian or @b@ for
+ *             big-endian byte order.  Not all combinations are currently
+ *             supported.
+ *
+ *             On platforms where the external format is used natively,
+ *             these functions are simple data copies.
+ */
+
+#define DEF_CONV(ctype, cty, fty)                                      \
+  unsigned fltfmt_##cty##to##fty##l(octet *p, ctype x, unsigned r)     \
+  {                                                                    \
+    unsigned rc = 0; CONV_DECLS_##cty##_##fty;                         \
+                                                                       \
+    CONV_LOAD_##cty##_##fty;                                           \
+    CONV_FROB_##cty##_##fty;                                           \
+    CONV_STOREL_##cty##_##fty;                                         \
+    return (rc);                                                       \
+  }                                                                    \
+                                                                       \
+  unsigned fltfmt_##cty##to##fty##b(octet *p, ctype x, unsigned r)     \
+  {                                                                    \
+    unsigned rc = 0; CONV_DECLS_##cty##_##fty;                         \
+                                                                       \
+    CONV_LOAD_##cty##_##fty;                                           \
+    CONV_FROB_##cty##_##fty;                                           \
+    CONV_STOREB_##cty##_##fty;                                         \
+    return (rc);                                                       \
+  }
+
+CONVERSIONS(DEF_CONV)
+
+#undef DEF_CONV
+
+/* --- @fltfmt_FTYEtoCTY@ --- *
+ *
+ * Arguments:  @float *z_out@, @double *z_out@ = storage for output
+ *             @const octet *p@ = input pointer
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Decodes a floating point value in an external format into a
+ *             native value.
+ *
+ *             The naming conventions are the same as for @fltfmt_dbltof64b@
+ *             above.
+ *
+ *             On platforms where the external format is used natively,
+ *             these functions are simple data copies.
+ */
+
+#define DEF_CONV(ctype, cty, fty)                                      \
+  unsigned fltfmt_##fty##lto##cty(ctype *z_out, const octet *p, unsigned r) \
+  {                                                                    \
+    unsigned rc = 0; CONV_DECLS_##cty##_##fty;                         \
+                                                                       \
+    CONV_LOADL_##cty##_##fty;                                          \
+    CONV_FROB_##cty##_##fty;                                           \
+    CONV_STORE_##cty##_##fty;                                          \
+    return (rc);                                                       \
+  }                                                                    \
+                                                                       \
+  unsigned fltfmt_##fty##bto##cty(ctype *z_out, const octet *p, unsigned r) \
+  {                                                                    \
+    unsigned rc = 0; CONV_DECLS_##cty##_##fty;                         \
+                                                                       \
+    CONV_LOADB_##cty##_##fty;                                          \
+    CONV_FROB_##cty##_##fty;                                           \
+    CONV_STORE_##cty##_##fty;                                          \
+    return (rc);                                                       \
+  }
+
+CONVERSIONS(DEF_CONV)
+
+#undef DEF_CONV
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/utils/fltfmt.c b/utils/fltfmt.c
new file mode 100644 (file)
index 0000000..291557b
--- /dev/null
@@ -0,0 +1,1648 @@
+/* -*-c-*-
+ *
+ * Floating-point format conversions
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include "config.h"
+
+#include <assert.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "alloc.h"
+#include "arena.h"
+#include "bits.h"
+#include "fltfmt.h"
+#include "growbuf.h"
+#include "macros.h"
+#include "maths.h"
+
+#if GCC_VERSION_P(4, 4)
+#  pragma GCC optimize "-frounding-math"
+#elif CLANG_VERSION_P(11, 0) && !CLANG_VERSION_P(12, 0)
+#  pragma clang optimize "-frounding-math"
+#elif GCC_VERSION_P(0, 0) || \
+       (CLANG_VERSION_P(0, 0) && !CLANG_VERSION_P(12, 0))
+   /* We just lose. */
+#elif __STDC_VERSION__ >= 199001
+#  include <fenv.h>
+#  pragma STDC FENV_ACCESS ON
+#endif
+
+/*----- Some useful constants ---------------------------------------------*/
+
+#define B31 0x80000000                 /* just bit 31 */
+#define B30 0x40000000                 /* just bit 30 */
+
+#define SH32 4294967296.0              /* 2^32 as floating-point */
+
+/*----- Useful macros -----------------------------------------------------*/
+
+#define B32(k) ((uint32)1 << (k))
+#define M32(k) (B32(k) - 1)
+
+#define FINITEP(x) (!((x)->f&(FLTF_INF | FLTF_NANMASK | FLTF_ZERO)))
+
+/*----- Utility functions -------------------------------------------------*/
+
+/* --- @clz32@ --- *
+ *
+ * Arguments:  @uint32 x@ = a 32-bit value
+ *
+ * Returns:    The number of leading zeros in @x@, i.e., the nonnegative
+ *             integer %$n$% such that %$2^{31} \le 2^n x < 2^{32}$%.
+ *             Returns a nonsensical value if %$x = 0$%.
+ */
+
+static unsigned clz32(uint32 x)
+{
+  unsigned n = 0;
+
+  /* Divide and conquer.  If the top half of the bits are clear, then there
+   * must be at least 16 leading zero bits, so accumulate and shift.  Repeat
+   * for smaller powers of two.
+   *
+   * This ends up returning 31 if %$x = 0$%, but don't rely on this.
+   */
+  if (!(x&0xffff0000)) { x <<= 16; n += 16; }
+  if (!(x&0xff000000)) { x <<=  8; n +=  8; }
+  if (!(x&0xf0000000)) { x <<=  4; n +=  4; }
+  if (!(x&0xc0000000)) { x <<=  2; n +=  2; }
+  if (!(x&0x80000000)) {          n +=  1; }
+  return (n);
+}
+
+/* --- @ctz32@ --- *
+ *
+ * Arguments:  @uint32 x@ = a 32-bit value
+ *
+ * Returns:    The number of trailing zeros in @x@, i.e., the nonnegative
+ *             integer %$n$% such that %$x/2^n$% is an odd integer.
+ *             Returns a nonsensical value if %$x = 0$%.
+ */
+
+static unsigned ctz32(uint32 x)
+{
+#ifdef CTZ_TRADITIONAL
+
+  unsigned n = 0;
+
+  /* Divide and conquer.  If the bottom half of the bits are clear, then
+   * there must be at least 16 trailing zero bits, so accumulate and shift.
+   * Repeat for smaller powers of two.
+   *
+   * This ends up returning 31 if %$x = 0$%, but don't rely on this.
+   */
+  if (!(x&0x0000ffff)) { x >>= 16; n += 16; }
+  if (!(x&0x000000ff)) { x >>=  8; n +=  8; }
+  if (!(x&0x0000000f)) { x >>=  4; n +=  4; }
+  if (!(x&0x00000003)) { x >>=  2; n +=  2; }
+  if (!(x&0x00000001)) {          n +=  1; }
+  return (n);
+
+#else
+
+  static unsigned char tab[] =
+    /*
+       ;;; Compute the decoding table for the de Bruijn sequence trick below.
+
+       (let ((db #x04653adf)
+            (rv (make-vector 32 nil)))
+        (dotimes (i 32)
+          (aset rv (logand (ash db (- i 27)) #x1f) i))
+        (save-excursion
+          (goto-char (point-min))
+          (search-forward (concat "***" "BEGIN ctz32tab" "***"))
+          (beginning-of-line 2)
+          (delete-region (point)
+                         (progn
+                           (search-forward "***END***")
+                           (beginning-of-line)
+                           (point)))
+          (dotimes (i 32)
+            (cond ((zerop i) (insert "    { "))
+                  ((zerop (mod i 16)) (insert ",\n      "))
+                  ((zerop (mod i 4)) (insert ",  "))
+                  (t (insert ", ")))
+            (insert (format "%2d" (aref rv i))))
+          (insert " };\n")))
+     */
+
+    /* ***BEGIN ctz32tab*** */
+    {  0,  1,  2,  6,   3, 11,  7, 16,   4, 14, 12, 21,   8, 23, 17, 26,
+      31,  5, 10, 15,  13, 20, 22, 25,  30,  9, 19, 24,  29, 18, 28, 27 };
+    /* ***END*** */
+
+  /* Sneaky trick.  Two's complement negation (which you effectively get
+   * using C unsigned arithmetic, whether you like it or not) complements all
+   * of the bits of an operand more significant than the least significant
+   * set bit.  Therefore, this bit is the only one set in both %$x$% and
+   * %$-x$%, so @x&-x@ will isolate it for us.
+   *
+   * The magic number @0x04653adf@ is a %%\emph{de Bruijn} number%%: every
+   * group of five consecutive bits is distinct, including groups which `wrap
+   * around', including some low bits and some high bits.  Multiplying this
+   * number by a power of two is equivalent to a left shift; and, because the
+   * top five bits are all zero, the most significant five bits of the
+   * product are the same as if we'd applied a rotation.  The result is that
+   * we end up with a distinctive pattern in those bits which perfectly
+   * diagnose each shift from 0 up to 31, which we can decode using a table.
+   *
+   * David Seal described a similar trick -- using the six-bit pattern
+   * generated by the constant @0x0450fbaf@ -- in `comp.sys.arm' in 1994;
+   * this constant was particularly convenient to multiply by on early ARM
+   * processors.  The use of a de Bruijn number is described in Henry
+   * Warren's %%\emph{Hacker's Delight}%%.
+   */
+  return (tab[((x&-x)*0x04653adf >> 27)&0x1f]);
+
+#endif
+}
+
+/* --- @shl@, @shr@ --- *
+ *
+ * Arguments:  @uint32 *z@ = destination vector
+ *             @const uint32 *x@ = source vector
+ *             @size_t sz@ = size of source vector, in elements
+ *             @unsigned n@ = number of bits to shift by; must be less than
+ *                     32
+ *
+ * Returns:    The bits shifted off the end of the vector.
+ *
+ * Use:                Shift a vector of 32-bit words left (@shl@) or right (@shr@)
+ *             by some number of bit positions.  These functions work
+ *             correctly if @z@ and @x@ are the same pointer, but not if
+ *             they otherwise overlap.
+ */
+
+static uint32 shl(uint32 *z, const uint32 *x, size_t sz, unsigned n)
+{
+  size_t i;
+  uint32 t, u;
+  unsigned r;
+
+  if (!n) {
+    for (i = 0; i < sz; i++) z[i] = x[i];
+    t = 0;
+  } else {
+    r = 32 - n;
+    for (t = 0, i = sz; i--; )
+      { u = x[i]; z[i] = ((u << n) | t)&MASK32; t = u >> r; }
+  }
+  return (t);
+}
+
+static uint32 shr(uint32 *z, const uint32 *x, size_t sz, unsigned n)
+{
+  size_t i;
+  uint32 t, u;
+  unsigned r;
+
+  if (!n) {
+    for (i = 0; i < sz; i++) z[i] = x[i];
+    t = 0;
+  } else {
+    r = 32 - n;
+    for (t = 0, i = 0; i < sz; i++)
+      { u = x[i]; z[i] = ((u >> n) | t)&MASK32; t = u << r; }
+  }
+  return (t);
+}
+
+/* --- @sigbits@ --- *
+ *
+ * Arguments:  @const struct floatbits *x@ = decoded floating-point number
+ *
+ * Returns:    The number of significant digits in @x@'s fraction.  This
+ *             will be zero if @x@ is zero or infinite.
+ */
+
+static unsigned sigbits(const struct floatbits *x)
+{
+  unsigned i;
+  uint32 w;
+
+  if (x->f&(FLTF_ZERO | FLTF_INF)) return (0);
+  i = x->n;
+  for (;;) {
+    if (!i) return (0);
+    w = x->frac[--i]; if (w) return (32*(i + 1) - ctz32(w));
+  }
+}
+
+/* --- @ms_set_bit@ --- *
+ *
+ * Arguments:  @const uint32 *x@ = pointer to the %%\emph{end}%% of the
+ *                     buffer
+ *             @unsigned from, to@ = lower (inclusive) and upper (exclusive)
+ *                     bounds on the region of bits to inspect
+ *
+ * Returns:    Index of the most significant set bit, or @ALLCLEAR@.
+ *
+ * Use:                For the (rather unusual) purposes of this function, the bits
+ *             of the input are numbered from zero, being the least
+ *             significant bit of @x[-1]@, upwards through more significant
+ *             bits of @x[-1]@, and then through @x[-2]@ and so on.
+ *
+ *             If all of the bits in the half-open region are clear then
+ *             @ALLCLEAR@ is returned; otherwise, the return value is the
+ *             index of the most significant set bit in the region.  Note
+ *             that @ALLCLEAR@ is equal to @UINT_MAX@: since this is the
+ *             largest possible value of @to@, and the upper bound is
+ *             exclusive, this cannot be the index of a bit in the region.
+ */
+
+#define ALLCLEAR UINT_MAX
+static unsigned ms_set_bit(const uint32 *x, unsigned from, unsigned to)
+{
+  unsigned n0, n, b, base;
+  uint32 m, w;
+
+  /*               <--- increasing indices <---
+   *
+   *     ---+-------+-------+-------+-------+-------+---
+   * ...S   |///|   |       |       |       |    |//|   S...
+   *     ---+-------+-------+-------+-------+-------+---
+   */
+
+  /* If the region is empty then it's technically true that all of the bits
+   * are zero.  It's important to be able to do answer the case where
+   * %$\id{from} = \id{to} = 0$% without accessing memory.
+   */
+  assert(to >= from); if (to == from) return (ALLCLEAR);
+
+  /* This is distressingly complicated.  Here's how it's going to work.
+   *
+   * There's at least one bit to check, or we'd have returned already --
+   * specifically, we must check the bit with index @from@.  But that's at
+   * the wrong end.  Instead, we start at the most significant end, with the
+   * word containing the bit one short of the @to@ position.  Even though
+   * it's actually one off, because we use a half-open interval, we'll call
+   * that the `@to@ bit'.
+   *
+   * We start by loading the word containing the @to@ bit, and start @base@
+   * off as the bit index of the least significant bit of this word.  We mask
+   * off the high bits (if any), leaving only the @to@ bit and the less
+   * significant ones.  We %%\emph{don't}%% check the remaining bits yet.
+   *
+   * We then start an offset loop.  In each iteration, we check the word
+   * we're currently holding: if it's not zero, then we return @base@ plus
+   * the position of the most-significant set bit, using @clz32@.  Otherwise,
+   * we load the next (less significant) word, and drop @base@ by 32, but
+   * don't check it yet.  We end this loop when the word we're holding
+   * contains the @from@ bit.  It's possible that we didn't do any iterations
+   * of the loop, in which case we're still holding the word containing the
+   * @to@ bit at this point.
+   *
+   * Finally, we mask off the bits below the @from@ bit, and check that what
+   * we have left is zero.  If it isn't, we return @base@ plus the position
+   * of the most significant bit; if it is, we return @ALLCEAR@.
+   */
+
+  /* The first job is to find the word containing the @to@ bit and mask off
+   * any higher bits that we don't care about.
+   *
+   * Recall that the bit's index is @to - 1@, but this must be a valid index
+   * because there is at least one bit in the region.  But we start out
+   * pointing beyond the vector, so we must add an extra 32 bits.
+   */
+  n0 = (to + 31)/32; x -= n0; base = (to - 1)&~31u; w = *x++;
+  b = to%32; if (b) w &= M32(b);
+
+  /* Before we start the loop, it'd be useful to know how many iterations we
+   * need.  This is going to be the offset from the word containing the @to@
+   * bit to the word containing the @from@ bit.  Again, we're off by one
+   * because that's how our initial indexing is set up.
+   */
+  n = n0 - from/32 - 1;
+
+  /* Now it's time to do the loop.  This is the easy bit. */
+  while (n--) {
+    if (w) return (base + 31 - clz32(w));
+    w = *x++&MASK32; base -= 32;
+  }
+
+  /* We're now holding the final word -- the one containing the @from@ bit.
+   * We need to mask off any low bits that we don't care about.
+   */
+  m = M32(from%32); w &= MASK32&~m;
+
+  /* Final check. */
+  if (w) return (base + 31 - clz32(w));
+  else return (ALLCLEAR);
+}
+
+/*----- General floating-point hacking ------------------------------------*/
+
+/* --- @fltfmt_initbits@ --- *
+ *
+ * Arguments:  @struct floatbits *x@ = pointer to structure to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Dynamically initialize @x@ to (positive) zero so that it can
+ *             be used as the destination operand by other operations.  This
+ *             doesn't allocate resources and cannot fail.  The
+ *             @FLOATBITS_INIT@ macro is a suitable static initializer for
+ *             performing the same task.
+ */
+
+void fltfmt_initbits(struct floatbits *x)
+{
+  x->f = FLTF_ZERO;
+  x->a = arena_global;
+  x->frac = 0; x->n = x->fracsz = 0;
+}
+
+/* --- @fltfmt_freebits@ --- *
+ *
+ * Arguments:  @struct floatbits *x@ = pointer to structure to free
+ *
+ * Returns:    ---
+ *
+ * Use:                Releases the memory held by @x@.  Afterwards, @x@ is a valid
+ *             (positive) zero, but can safely be discarded.
+ */
+
+void fltfmt_freebits(struct floatbits *x)
+{
+  if (x->frac) x_free(x->a, x->frac);
+  x->f = FLTF_ZERO;
+  x->frac = 0; x->n = x->fracsz = 0;
+}
+
+/* --- @fltfmt_allocfrac@ --- *
+ *
+ * Arguments:  @struct floatbits *x@ = structure to adjust
+ *             @unsigned n@ = number of words required
+ *
+ * Returns:    ---
+ *
+ * Use:                Reallocate the @frac@ vector so that it has space for at
+ *             least @n@ 32-bit words, and set @x->n@ equal to @n@.  If the
+ *             current size is already @n@ or greater, then just update the
+ *             active length @n@ and return; otherwise, any existing vector
+ *             is discarded and a fresh, larger one allocated.
+ */
+
+void fltfmt_allocfrac(struct floatbits *x, unsigned n)
+  { GROWBUF_REPLACEV(unsigned, x->a, x->frac, x->fracsz, n, 4); x->n = n; }
+
+/* --- @fltfmt_copybits@ --- *
+ *
+ * Arguments:  @struct floatbits *z_out@ = where to leave the result
+ *             @const struct floatbits *x@ = source to copy
+ *
+ * Returns:    ---
+ *
+ * Use:                Make @z_out@ be a copy of @x@.  If @z_out@ is the same object
+ *             as @x@ then do nothing.
+ */
+
+void fltfmt_copybits(struct floatbits *z_out, const struct floatbits *x)
+{
+  unsigned i;
+
+  if (z_out == x) return;
+  z_out->f = x->f;
+  if (!FINITEP(x)) z_out->exp = 0;
+  else z_out->exp = x->exp;
+  if ((x->f&(FLTF_ZERO | FLTF_INF)) || !x->n)
+    { z_out->n = 0; z_out->frac = 0; }
+  else {
+    fltfmt_allocfrac(z_out, x->n);
+    for (i = 0; i < x->n; i++) z_out->frac[i] = x->frac[i];
+  }
+}
+
+/* --- @fltfmt_round@ --- *
+ *
+ * Arguments:  @struct floatbits *z_out@ = destination (may equal source)
+ *             @const struct floatbits *x@ = source
+ *             @unsigned r@ = rounding mode (@FLTRND_...@ code)
+ *             @unsigned n@ = nonzero number of bits to leave
+ *
+ * Returns:    A @FLTERR_...@ code, specifically either @FLTERR_INEXACT@ if
+ *             rounding discarded some nonzero value bits, or @FLTERR_OK@ if
+ *             rounding was unnecessary.
+ *
+ * Use:                Rounds a floating-point value to a given number of
+ *             significant bits, using the given rounding rule.
+ */
+
+unsigned fltfmt_round(struct floatbits *z_out, const struct floatbits *x,
+                     unsigned r, unsigned n)
+{
+  unsigned rf, i, uw, ub, hw, hb, rc = 0;
+  uint32 um, hm, w;
+  int exp;
+
+  /* Check that this is likely to work.  We must have at least one bit
+   * remaining, so that we can inspect the last-place unit bit.  And we
+   * mustn't round up if the current value is already exact, because that
+   * would be nonsensical (and inconvenient).
+   */
+  assert(n > 0); assert(!(r&~(FRPMASK_LOW | FRPMASK_HALF)));
+
+  /* Eliminate trivial cases.  There's nothing to do if the value is infinite
+   * or zero, or if we don't have enough precision already.
+   *
+   * The caller will have set the rounding mode and length suitably for a
+   * NaN.
+   */
+  if (x->f&(FLTF_ZERO | FLTF_INF) || n >= 32*x->n)
+    { fltfmt_copybits(z_out, x); return (FLTERR_OK); }
+
+  /* Determine various indices.
+   *
+   * The quantities @uw@ and @ub@ are the word and bit number which will hold
+   * the unit bit when we've finished; @hw@ and @hb@ similarly index the
+   * `half' bit, which is the next less significant bit.
+   */
+            uw = (n - 1)/32; ub =  -n&31;
+  if (!ub) { hw = uw + 1;     hb =     31; }
+  else     { hw = uw;        hb = ub - 1; }
+
+  /* Determine the necessary predicates for the rounding decision. */
+  rf = 0;
+                                 if (x->f&FLTF_NEG) rf |= FRPF_NEG;
+  um = B32(ub);                          if (x->frac[uw]&um) rf |= FRPF_ODD;
+  hm = B32(hb);                          if (x->frac[hw]&hm) rf |= FRPF_HALF;
+                                 if (x->frac[hw]&(hm - 1)) rf |= FRPF_LOW;
+  for (i = hw + 1; i < x->n; i++) if (x->frac[i]) rf |= FRPF_LOW;
+  if (rf&(FRPF_LOW | FRPF_HALF)) rc |= FLTERR_INEXACT;
+
+  /* Allocate space for the result. */
+  fltfmt_allocfrac(z_out, uw + 1);
+
+  /* We start looking at the least significant word of the result.  Clear the
+   * low bits.
+   */
+  i = uw; exp = x->exp; w = x->frac[i]&~(um - 1);
+
+  /* If the rounding function is true then we need to add one to the
+   * truncated fraction and propagate carries.
+   */
+  if ((r >> rf)&1) {
+    w = (w + um)&MASK32;
+    while (i && !w) {
+      z_out->frac[i] = w;
+      w = (x->frac[--i] + 1)&MASK32;
+    }
+    if (!w) { w = B31; exp++; }
+  }
+
+  /* Store, and copy the remaining words. */
+  for (;;) {
+    z_out->frac[i] = w;
+    if (!i) break;
+    w = x->frac[--i];
+  }
+
+  /* Done. */
+  z_out->f = x->f&(FLTF_NEG | FLTF_NANMASK);
+  if (x->f&FLTF_NANMASK) z_out->exp = 0;
+  else z_out->exp = exp;
+  return (rc);
+}
+
+/*----- IEEE formats ------------------------------------------------------*/
+
+/* IEEE (and related) format descriptions. */
+const struct fltfmt_ieeefmt
+  fltfmt_mini = { IEEEF_HIDDEN, 4, 4 },
+  fltfmt_bf16 = { IEEEF_HIDDEN, 8, 8 },
+  fltfmt_f16 = { IEEEF_HIDDEN, 5, 11 },
+  fltfmt_f32 = { IEEEF_HIDDEN, 8, 24 },
+  fltfmt_f64 = { IEEEF_HIDDEN, 11, 53 },
+  fltfmt_f128 = { IEEEF_HIDDEN, 15, 113 },
+  fltfmt_idblext80 = { 0, 15, 64 };
+
+/* --- @fltfmt_encieee@ ---
+ *
+ * Arguments:  @const struct fltfmt_ieeefmt *fmt@ = format description
+ *             @uint32 *z@ = output vector
+ *             @const struct floatbits *x@ = value to encode
+ *             @unsigned r@ = rounding mode
+ *             @unsigned errmask@ = error mask
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a floating-point value in an IEEE format.  This is the
+ *             machinery shared by the @fltfmt_enc...@ functions for
+ *             encoding IEEE-format values.  Most of the arguments and
+ *             behaviour are as described for those functions.
+ *
+ *             The encoded value is right-aligned and big-endian; i.e., the
+ *             sign bit ends up in @z[0]@, and the least significant bit of
+ *             the significand ends up in the least significant bit of
+ *             @z[n - 1]@.
+ */
+
+unsigned fltfmt_encieee(const struct fltfmt_ieeefmt *fmt,
+                       uint32 *z, const struct floatbits *x,
+                       unsigned r, unsigned errmask)
+{
+  struct floatbits y;
+  unsigned sigwd, fracwd, err = 0, f = x->f, rf;
+  unsigned i, j, n, nb, nw, mb, mw, esh, sh;
+  int exp, minexp, maxexp;
+  uint32 z0, t;
+
+#define ERR(e) do { err |= (e); if (err&~errmask) goto end; } while (0)
+
+  /* The following code assumes that the sign, biased exponent, unit, and
+   * quiet/signalling bits can all fit into the most significant 32 bits of
+   * the result.
+   */
+  assert(fmt->expwd + 3 <= 32);
+  esh = 31 - fmt->expwd;
+
+  /* Determine the output size. */
+  nb = fmt->prec + fmt->expwd + 1;
+  if (fmt->f&IEEEF_HIDDEN) nb--;
+  nw = (nb + 31)/32;
+
+  /* Determine the top bits. */
+  z0 = 0; i = 0;
+  if (x->f&FLTF_NEG) z0 |= B31;
+
+  /* And now for the main case analysis. */
+
+  if (f&FLTF_ZERO) {
+    /* Zero.  There's very little to do here. */
+
+  } else if (f&FLTF_INF) {
+    /* Infinity.  Set the exponent and, for non-hidden-bit formats, the unit
+     * bit.
+     */
+
+    z0 |= M32(fmt->expwd) << esh;
+    if (!(fmt->f&IEEEF_HIDDEN)) z0 |= B32(esh - 1);
+
+  } else if (f&FLTF_NANMASK) {
+    /* Not-a-number.
+     *
+     * We must check that we won't lose significant bits.  We need a bit for
+     * the quiet/signalling flag, and enough space for the significant
+     * payload bits.  The unit bit is not in play here, so the available
+     * space is always one less than the advertised precision.  To put it
+     * another way, we need space for the payload, a bit for the
+     * quiet/signalling flag, and a bit for the unit place.
+     */
+
+    fracwd = sigbits(x);
+    if (fracwd + 2 > fmt->prec) ERR(FLTERR_INEXACT);
+
+    /* Copy the payload.
+     *
+     * If the payload is all-zero and we're meant to set a signalling NaN
+     * then report an exactness failure and set the low bit.
+     */
+    mb = fmt->prec - 2; mw = (mb + 31)/32; sh = -mb%32;
+    for (i = 0; i < nw - mw; i++) z[i] = 0;
+    n = x->n; if (n > mw) n = nw;
+    t = shr(z + i, x->frac, n, sh); i += n;
+    if (i < nw) z[i++] = t;
+    sh = esh - 2; if (fmt->f&IEEEF_HIDDEN) sh++;
+    if (f&FLTF_QNAN) z0 |= B32(sh);
+    else if (!fracwd) { ERR(FLTERR_INEXACT); z[nw - 1] |= 1; }
+
+    /* Set the exponent and, for non-hidden-bit formats, the unit bit. */
+    z0 |= M32(fmt->expwd) << esh;
+    if (!(fmt->f&IEEEF_HIDDEN)) z0 |= B32(esh - 1);
+
+  } else {
+    /* A finite value.
+     *
+     * Adjust the exponent by one place to compensate for the difference in
+     * significant conventions.  Our significand lies between zero (in fact,
+     * a half, because we require normalization) and one, while an IEEE
+     * significand lies between zero (in fact, one) and two.  Our exponent is
+     * therefore one larger than the IEEE exponent will be.
+     */
+
+    /* Determine the maximum true (unbiased) exponent.  As noted above, this
+     * is also the bias.
+     */
+    exp = x->exp - 1;
+    maxexp = (1 << (fmt->expwd - 1)) - 1;
+    minexp = 1 - maxexp;
+
+    if (exp <= minexp - (int)fmt->prec) {
+      /* If the exponent is very small then we underflow.  We have %$p - 1$%
+       * bits available to represent a subnormal significand, and therefore
+       * can represent at least one bit of a value as small as
+       * %$2^{e_{\text{min}}-p+1}$%.
+       *
+       * If the exponent is one short of the threshold, then we check to see
+       * whether the value will round up.
+       */
+
+      if ((minexp - exp == fmt->prec) &&
+         ((r >> (FRPF_HALF |
+                 (sigbits(x) > 1 ? FRPF_LOW : 0) |
+                 (f&FLTF_NEG ? FRPF_NEG : 0)))&1)) {
+       ERR(FLTERR_INEXACT);
+       for (i = 0; i < nw - 1; i++) z[i] = 0;
+       z[i++] = 1;
+      } else {
+       ERR(FLTERR_UFLOW | FLTERR_INEXACT);
+       /* Return (signed) zero. */
+      }
+
+    } else {
+      /* We can at least try to store some bits. */
+
+      /* Let's see how many we need to deal with and how much space we have.
+       * We might as well set the biased exponent here while we're at it.
+       *
+       * If %$e \ge e_{\text{min}}$% then we can store %$p$% bits of
+       * significand.  Otherwise, we must make a subnormal and we can only
+       * store %$p + e - e_{\text{min}}$% bits.  (Cross-check: if %$e \le
+       * e_{\text{min}} - p$% then we can store zero bits or fewer and have
+       * underflowed to zero, which matches the previous case.)  In the
+       * subnormal case, we also `correct' the exponent so that we store the
+       * correct sentinel value later.
+       */
+      fracwd = sigbits(x);
+      if (exp >= minexp) sigwd = fmt->prec;
+      else { sigwd = fmt->prec + exp - minexp; exp = minexp - 1; }
+      mw = (sigwd + 31)/32; sh = -sigwd%32;
+
+      /* If we don't have enough significand bits then we must round.  This
+       * might increase the exponent, so we must reload.
+       */
+      if (fracwd > sigwd) {
+       ERR(FLTERR_INEXACT);
+       y.frac = z + nw - mw; y.fracsz = mw; fltfmt_round(&y, x, r, sigwd);
+       x = &y; exp = y.exp - 1; fracwd = sigwd;
+      }
+
+      if (exp > maxexp) {
+       /* If the exponent is too large, then we overflow.  If the error is
+        * masked, then we must produce a default value, choosing between
+        * infinity and the largest representable finite value according to
+        * the rounding mode.
+        */
+
+       rf = FRPF_ODD | FRPF_HALF | FRPF_LOW;
+       if (f&FLTF_NEG) rf |= FRPF_NEG;
+       if ((r >> rf)&1) {
+         ERR(FLTERR_OFLOW | FLTERR_INEXACT);
+         z0 |= M32(fmt->expwd) << esh;
+       } else {
+         ERR(FLTERR_INEXACT);
+         z0 |= (B32(fmt->expwd) - 2) << esh;
+         mb = fmt->prec; if (fmt->f&IEEEF_HIDDEN) mb--;
+         mw = (mb + 31)/32;
+         i = nw - mw;
+         z[i++] = M32(mb%32);
+         while (i < nw) z[i++] = MASK32;
+       }
+
+      } else {
+       /* The exponent is in range.  Everything is ready. */
+
+       /* Store the significand. */
+       n = (fracwd + 31)/32; i = nw - mw;
+       t = shr(z + i, x->frac, n, sh); i += n;
+       if (i < nw) z[i++] = t;
+
+       /* Fill in the top end. */
+       for (j = nw - mw; j--; ) z[j] = 0;
+
+       /* Set the biased exponent. */
+       z0 |= (exp + maxexp) << esh;
+
+       /* Clear the unit bit if we're suppose to use a hidden-bit convention. */
+       if (fmt->f&IEEEF_HIDDEN) {
+         mb = fmt->prec - 1; mw = (mb + 31)/32; mb = mb%32;
+         z[nw - mw] &= ~B32(mb);
+       }
+      }
+    }
+  }
+
+  /* Clear the significand bits that we haven't set explicitly yet. */
+  while (i < nw) z[i++] = 0;
+
+  /* All that remains is to insert the top bits @z0@ in the right place.
+   * This will set the exponent, and the unit and quiet bits.
+   */
+  sh = -nb%32;
+  z[0] |= z0 >> sh;
+  if (sh && nb >= 32) z[1] |= z0 << (32 - sh);
+
+end:
+  return (err);
+
+#undef ERR
+}
+
+/* --- @fltfmt_encTY@ --- *
+ *
+ * Arguments:  @octet *z_out@, @uint16 *z_out@, @uint32 *z_out@,
+ *                     @kludge64 *z_out@ = where to put the encoded value
+ *             @uint16 *se_out@, @kludge64 *m_out@ = where to put the
+ *                     encoded sign-and-exponent and significand
+ *             @const struct floatbits *x@ = value to encode
+ *             @unsigned r@ = rounding mode
+ *             @unsigned errmask@ = error mask
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a floating-point value in an IEEE (or IEEE-adjacent)
+ *             format.
+ *
+ *             If an error is encountered during the encoding, and the
+ *             corresponding bit of @errmask@ is clear, then processing
+ *             stops immediately and the error is returned; if the bit is
+ *             set, then processing continues as described below.
+ *
+ *             The @TY@ may be
+ *
+ *               * @mini@ for the 8-bit `1.4.3 minifloat' format, with
+ *                 four-bit exponent and four-bit significand, represented
+ *                 as a single octet;
+ *
+ *               * @bf16@ for the Google `bfloat16' format, with eight-bit
+ *                 exponent and eight-bit significand, represented as a
+ *                 @uint16@;
+ *
+ *               * @f16@ for the IEEE `binary16' format, with five-bit
+ *                 exponent and eleven-bit significand, represented as a
+ *                 @uint16@;
+ *
+ *               * @f32@ for the IEEE `binary32' format, with eight-bit
+ *                 exponent and 24-bit significand, represented as a
+ *                 @uint32@;
+ *
+ *               * @f64@ for the IEEE `binary64' format, with eleven-bit
+ *                 exponent and 53-bit significand, represented as a
+ *                 @kludge64@;
+ *
+ *               * @f128@ for the IEEE `binary128' format, with fifteen-bit
+ *                 exponent and 113-bit significand, represented as four
+ *                 @uint32@ limbs, most significant first; or
+ *
+ *               * @idblext80@ for the Intel 80-bit `double extended'
+ *                 format, with fifteen-bit exponent and 64-bit significand
+ *                 with no hidden bit, represented as a @uint16 se@
+ *                 holding the sign and exponent, and a @kludge64 m@
+ *                 holding the significand.
+ *
+ *             Positive and negative zero and infinity are representable
+ *             exactly.
+ *
+ *              Following IEEE recommendations (and most implementations),
+ *             the most significant fraction bit of a quiet NaN is set; this
+ *             bit is clear in a signalling NaN.  The most significant
+ *             payload bits of a NaN, held in the top bits of @x->frac[0]@,
+ *             are encoded in the output significand following the `quiet'
+ *             bit.  If the chosen format's significand field is too small
+ *             to accommodate all of the set payload bits then the
+ *             @FLTERR_INEXACT@ error bit is set and, if masked, the
+ *             excess payload bits are discarded.  No rounding of NaN
+ *             payloads is performed.
+ *
+ *             Otherwise, the input value is finite and nonzero.  If the
+ *             significand cannot be represented exactly then the
+ *             @FLTERR_INEXACT@ error bit is set, and, if masked, the value
+ *             will be rounded (internally -- the input @x@ is not changed).
+ *             If the (rounded) value's exponent is too large to represent,
+ *             then the @FLTERR_OFLOW@ and @FLTERR_INEXACT@ error bits are
+ *             set and, if masked, the result is either the (absolute)
+ *             largest representable finite value or infinity, with the
+ *             appropriate sign, chosen according to the rounding mode.  If
+ *             the exponent is too small to represent, then the
+ *             @FLTERR_UFLOW@ and @FLTERR_INEXACT@ error bits are set and,
+ *             if masked, the result is either the (absolute) smallest
+ *             nonzero value or zero, with the appropriate sign, chosen
+ *             according to the rounding mode.
+ */
+
+unsigned fltfmt_encmini(octet *z_out, const struct floatbits *x,
+                       unsigned r, unsigned errmask)
+{
+  uint32 t[1];
+  unsigned rc;
+
+  rc = fltfmt_encieee(&fltfmt_mini, t, x, r, errmask);
+  if (!(rc&~errmask)) *z_out = t[0];
+  return (rc);
+}
+
+unsigned fltfmt_encbf16(uint16 *z_out, const struct floatbits *x,
+                       unsigned r, unsigned errmask)
+{
+  uint32 t[1];
+  unsigned rc;
+
+  rc = fltfmt_encieee(&fltfmt_bf16, t, x, r, errmask);
+  if (!(rc&~errmask)) *z_out = t[0];
+  return (rc);
+}
+
+unsigned fltfmt_encf16(uint16 *z_out, const struct floatbits *x,
+                      unsigned r, unsigned errmask)
+{
+  uint32 t[1];
+  unsigned rc;
+
+  rc = fltfmt_encieee(&fltfmt_f16, t, x, r, errmask);
+  if (!(rc&~errmask)) *z_out = t[0];
+  return (rc);
+}
+
+unsigned fltfmt_encf32(uint32 *z_out, const struct floatbits *x,
+                      unsigned r, unsigned errmask)
+  { return (fltfmt_encieee(&fltfmt_f32, z_out, x, r, errmask)); }
+
+unsigned fltfmt_encf64(kludge64 *z_out, const struct floatbits *x,
+                      unsigned r, unsigned errmask)
+{
+  uint32 t[2];
+  unsigned rc;
+
+  rc = fltfmt_encieee(&fltfmt_f64, t, x, r, errmask);
+  if (!(rc&~errmask)) SET64(*z_out, t[0], t[1]);
+  return (rc);
+}
+
+unsigned fltfmt_encf128(uint32 *z_out, const struct floatbits *x,
+                       unsigned r, unsigned errmask)
+  { return (fltfmt_encieee(&fltfmt_f128, z_out, x, r, errmask)); }
+
+unsigned fltfmt_encidblext80(uint16 *se_out, kludge64 *m_out,
+                            const struct floatbits *x,
+                            unsigned r, unsigned errmask)
+{
+  uint32 t[3];
+  unsigned rc;
+
+  rc = fltfmt_encieee(&fltfmt_idblext80, t, x, r, errmask);
+  if (!(rc&~errmask)) { *se_out = t[0]; SET64(*m_out, t[1], t[2]); }
+  return (rc);
+}
+
+/* --- @fltfmt_decieee@ --- *
+ *
+ * Arguments:  @const struct fltfmt_ieeefmt *fmt@ = format description
+ *             @struct floatbits *z_out@ = output decoded representation
+ *             @const uint32 *x@ = input encoding
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Decode a floating-point value in an IEEE format.  This is the
+ *             machinery shared by the @fltfmt_dec...@ functions for
+ *             deccoding IEEE-format values.  Most of the arguments and
+ *             behaviour are as described for those functions.
+ *
+ *             The encoded value should be right-aligned and big-endian;
+ *             i.e., the sign bit ends up in @z[0]@, and the least
+ *             significant bit of the significand ends up in the least
+ *             significant bit of @z[n - 1]@.
+ */
+
+unsigned fltfmt_decieee(const struct fltfmt_ieeefmt *fmt,
+                       struct floatbits *z_out, const uint32 *x)
+{
+  unsigned sigwd, err = 0, f = 0;
+  unsigned i, nb, nw, mw, esh, sh;
+  int exp, minexp, maxexp;
+  uint32 x0, t, u, emask;
+
+  /* The following code assumes that the sign, biased exponent, unit, and
+   * quiet/signalling bits can all fit into the most significant 32 bits of
+   * the result.
+   */
+  assert(fmt->expwd + 3 <= 32);
+  esh = 31 - fmt->expwd; emask = M32(fmt->expwd);
+  sigwd = fmt->prec; if (fmt->f&IEEEF_HIDDEN) sigwd--;
+
+  /* Determine the input size. */
+  nb = sigwd + fmt->expwd + 1; nw = (nb + 31)/32;
+
+  /* Extract the sign, exponent, and top of the significand. */
+  sh = -nb%32;
+  x0 = x[0] << sh;
+  if (sh && nb >= 32) x0 |= x[1] >> (32 - sh);
+  if (x0&B31) f |= FLTF_NEG;
+  t = (x0 >> esh)&emask;
+
+  /* Time for a case analysis. */
+
+  if (t == emask) {
+    /* Infinity or NaN.
+     *
+     * Note that we don't include the quiet bit in our decoded payload.
+     */
+
+    if (!(fmt->f&IEEEF_HIDDEN)) {
+      /* No hidden bit, so we expect the unit bit to be set.  If it isn't,
+       * that's technically invalid, and its absence won't survive a round
+       * trip, since the bit isn't considered part of a NaN payload -- or
+       * even to distinguish a NaN from an infinity.  In any event, reduce
+       * the notional significand size to exclude this bit from further
+       * consideration.
+       */
+
+      if (!(x0&B32(esh - 1))) err = FLTERR_INVAL;
+      sigwd--;
+    }
+
+    if (ms_set_bit(x + nw, 0, sigwd) == ALLCLEAR)
+      f |= FLTF_INF;
+    else {
+      sh = esh - 2; if (fmt->f&IEEEF_HIDDEN) sh++;
+      if (x0&B32(sh)) f |= FLTF_QNAN;
+      else f |= FLTF_SNAN;
+      sigwd--; mw = (sigwd + 31)/32;
+      fltfmt_allocfrac(z_out, mw);
+      shl(z_out->frac, x + nw - mw, mw, -sigwd%32);
+    }
+    goto end;
+  }
+
+  /* Determine the exponent bounds. */
+  maxexp = (1 << (fmt->expwd - 1)) - 1;
+  minexp = 1 - maxexp;
+
+  /* Dispatch.  If there's a hidden bit then everything is well defined.
+   * Otherwise, we'll normalize the incoming value regardless, but report
+   * settings of the unit bit which are inconsistent with the exponent.
+   */
+  if (fmt->f&IEEEF_HIDDEN) {
+    if (!t) { exp = minexp; goto normalize; }
+    else { exp = t - maxexp; goto hidden; }
+  } else {
+    u = x0&B32(esh - 1);
+    if (!t) { exp = minexp; if (u) err |= FLTERR_INVAL; }
+    else { exp = t - maxexp; if (!u) err |= FLTERR_INVAL; }
+    goto normalize;
+  }
+
+hidden:
+  /* We have a normal real number with a hidden bit. */
+
+  mw = (sigwd + 31)/32;
+
+  if (!(sigwd%32)) {
+    /* The bits we have occupy a whole number of words, but we need to shift
+     * to make space for the unit bit.
+     */
+
+    fltfmt_allocfrac(z_out, mw + 1);
+    z_out->frac[mw] = shr(z_out->frac, x + nw - mw, mw, 1);
+  } else {
+    fltfmt_allocfrac(z_out, mw);
+    shl(z_out->frac, x + nw - mw, mw, -(sigwd + 1)%32);
+  }
+  z_out->frac[0] |= B31;
+  z_out->exp = exp + 1;
+  goto end;
+
+normalize:
+  /* We have, at least potentially, a subnormal number, with no hidden
+   * bit.
+   */
+
+  i = ms_set_bit(x + nw, 0, sigwd);
+  if (i == ALLCLEAR) { f |= FLTF_ZERO; goto end; }
+  mw = i/32 + 1; sh = 32*mw - i - 1;
+  fltfmt_allocfrac(z_out, mw);
+  shl(z_out->frac, x + nw - mw, mw, sh);
+  z_out->exp = exp - fmt->prec + 2 + i;
+  goto end;
+
+end:
+  /* All done. */
+  z_out->f = f; return (err);
+}
+
+/* --- @fltfmt_decTY@ --- *
+ *
+ * Arguments:  @const struct floatbits *z_out@ = storage for the result
+ *             @octet x@, @uint16 x@, @uint32 x@, @kludge64 x@ =
+ *                     encoded input
+ *             @uint16 se@, @kludge64 m@ = encoded sign-and-exponent and
+ *                     significand
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a floating-point value in an IEEE (or IEEE-adjacent)
+ *             format.
+ *
+ *             The options for @TY@ are as documented for the encoding
+ *             functions above.
+ *
+ *             In formats without a hidden bit -- currently only @idblext80@
+ *             -- not all bit patterns are valid encodings.  If the explicit
+ *             unit bit is set when the exponent field is all-bits-zero, or
+ *             clear when the exponent field is not all-bits-zero, then the
+ *             @FLTERR_INVAL@ error bit is set.  If the exponent is all-
+ *             bits-set, denoting infinity or a NaN, then the unit bit is
+ *             otherwise ignored -- in particular, it does not affect the
+ *             NaN payload, or even whether the input encodes a NaN or
+ *             infinity.  Otherwise, the unit bit is considered significant,
+ *             and the result is normalized as one would expect.
+ *             Consequently, biased exponent values 0 and 1 are distinct
+ *             only with respect to which bit patterns are considered valid,
+ *             and not with respect to the set of values denoted.
+ */
+
+unsigned fltfmt_decmini(struct floatbits *z_out, octet x)
+  { uint32 t[1]; t[0] = x; return (fltfmt_decieee(&fltfmt_mini, z_out, t)); }
+
+unsigned fltfmt_decbf16(struct floatbits *z_out, uint16 x)
+  { uint32 t[1]; t[0] = x; return (fltfmt_decieee(&fltfmt_bf16, z_out, t)); }
+
+unsigned fltfmt_decf16(struct floatbits *z_out, uint16 x)
+  { uint32 t[1]; t[0] = x; return (fltfmt_decieee(&fltfmt_f16, z_out, t)); }
+
+unsigned fltfmt_decf32(struct floatbits *z_out, uint32 x)
+  { uint32 t[1]; t[0] = x; return (fltfmt_decieee(&fltfmt_f32, z_out, t)); }
+
+unsigned fltfmt_decf64(struct floatbits *z_out, kludge64 x)
+{
+  uint32 t[2];
+
+  t[0] = HI64(x); t[1] = LO64(x);
+  return (fltfmt_decieee(&fltfmt_f64, z_out, t));
+}
+
+unsigned fltfmt_decf128(struct floatbits *z_out, const uint32 *x)
+  { return (fltfmt_decieee(&fltfmt_f128, z_out, x)); }
+
+unsigned fltfmt_decidblext80(struct floatbits *z_out, uint16 se, kludge64 m)
+{
+  uint32 t[3];
+
+  t[0] = se; t[1] = HI64(m); t[2] = LO64(m);
+  return (fltfmt_decieee(&fltfmt_idblext80, z_out, t));
+}
+
+/*----- Native formats ----------------------------------------------------*/
+
+/* If the floating-point radix is a power of two, determine how many bits
+ * there are in each digit.  This isn't exhaustive, but it covers most of the
+ * bases, so to speak.
+ */
+#if FLT_RADIX == 2
+#  define DIGIT_BITS 1
+#elif FLT_RADIX == 4
+#  define DIGIT_BITS 2
+#elif FLT_RADIX == 8
+#  define DIGIT_BITS 3
+#elif FLT_RADIX == 16
+#  define DIGIT_BITS 4
+#endif
+
+/* --- @ENCFLT@ --- *
+ *
+ * Arguments:  @ty@ = the C type to encode
+ *             @TY@ = the uppercase prefix for macros
+ *             @ty (*ldexp)(ty, int)@ = function to scale a @ty@ value by a
+ *                     power of two
+ *             @unsigned &rc@ = error code to set
+ *             @ty *z_out@ = storage for the result
+ *             @const struct floatbits *x@ = value to convert
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    ---
+ *
+ * Use:                Encode a floating-point value @x@ as a native C object of
+ *             type @ty@.  This is the machinery shared by the
+ *             @fltfmt_enc...@ functions for enccoding native-format values.
+ *             Most of the behaviour is as described for those functions.
+ */
+
+/* Utilities based on conditional compilation, because we can't use
+ * %|#ifdef|% directly in macros.
+ */
+
+#ifdef NAN
+   /* The C implementation acknowledges the existence of (quiet) NaN values,
+    * but will neither let us set the payload in a useful way, nor
+    * acknowledge the existence of signalling NaNs.  We have no good way to
+    * determine which NaN the @NAN@ macro produces, so report this conversion
+    * as inexact.
+    */
+
+#  define SETNAN(rc, z) do { (z) = NAN; (rc) = FLTERR_INEXACT; } while (0)
+#else
+   /* This C implementation doesn't recognize NaNs.  This value is totally
+    * unrepresentable, so just report the error.  (Maybe it's C89 and would
+    * actually do the right thing with @0/0@.  I'm not sure the requisite
+    * compile-time configuration machinery is worth the effort.)
+    */
+
+#  define SETNAN(rc, z) do { (z) = 0; (rc) = FLTERR_REPR; } while (0)
+#endif
+
+#ifdef INFINITY
+   /* The C implementation supports infinities.  This is a simple win. */
+
+#  define SETINF(TY, rc, z)                                            \
+       do { (z) = INFINITY; (rc) = FLTERR_OK; } while (0)
+#else
+   /* The C implementation doesn't support infinities.  Return the maximum
+    * value and report it as an overflow; I think this is more useful than
+    * reporting a complete representation failure.  (Maybe it's C89 and would
+    * actually do the right thing with @1/0@.  Again, I'm not sure the
+    * requisite compile-time configuration machinery is worth the effort.)
+    */
+
+#  define SETINF(TY, rc, z)                                            \
+       do { (z) = TY##_MAX; (rc) = FLTERR_OFLOW | FLTERR_INEXACT; } while (0)
+#endif
+
+#ifdef DIGIT_BITS
+   /* The floating point formats use a power-of-two radix.  This means that
+    * we can determine the correctly rounded value before we start building
+    * the native floating-point value.
+    */
+
+#  define ENC_ROUND_DECLS struct floatbits _y;
+#  define ENC_ROUND(TY, rc, x, r) do {                                 \
+     (rc) |= fltfmt_round(&_y, (x), (r), DIGIT_BITS*TY##_MANT_DIG);    \
+     (x) = &_y;                                                                \
+   } while (0)
+#else
+   /* The floating point formats use a non-power-of-two radix.  This means
+    * that conversion is inherently inexact.
+    */
+
+#  define ENC_ROUND_DECLS
+#  define ENC_ROUND(TY, rc, x, r)                                      \
+     do (rc) |= FLTERR_INEXACT; while (0)
+#  define ENC_FIXUP(...)
+
+#endif
+
+#define ENCFLT(ty, TY, ldexp, rc, z_out, x, r) do {                    \
+  unsigned _rc = 0;                                                    \
+                                                                       \
+  /* See if the native format is one that we recognize. */             \
+  switch (TY##_FORMAT&(FLTFMT_ORGMASK | FLTFMT_TYPEMASK)) {            \
+                                                                       \
+    case FLTFMT_IEEE_F32: {                                            \
+      uint32 _t[1];                                                    \
+      unsigned char *_z = (unsigned char *)(z_out);                    \
+                                                                       \
+      (rc) = fltfmt_encieee(&fltfmt_f32, _t, (x), (r), FLTERR_ALLERRS);        \
+      FLTFMT__FROB_NAN_F32(_t, _rc);                                   \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE: STORE32_B(_z, _t[0]); break;                    \
+       case FLTFMT_LE: STORE32_L(_z, _t[0]); break;                    \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+    } break;                                                           \
+                                                                       \
+    case FLTFMT_IEEE_F64: {                                            \
+      uint32 _t[2];                                                    \
+      unsigned char *_z = (unsigned char *)(z_out);                    \
+      (rc) = fltfmt_encieee(&fltfmt_f64, _t, (x), (r), FLTERR_ALLERRS);        \
+      FLTFMT__FROB_NAN_F64(_t, _rc);                                   \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE:                                                 \
+         STORE32_B(_z + 0, _t[0]); STORE32_B(_z + 4, _t[1]);           \
+         break;                                                        \
+       case FLTFMT_LE:                                                 \
+         STORE32_L(_z + 0, _t[1]); STORE32_L(_z + 4, _t[0]);           \
+         break;                                                        \
+       case FLTFMT_ARME:                                               \
+         STORE32_L(_z + 0, _t[0]); STORE32_L(_z + 4, _t[1]);           \
+         break;                                                        \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+    } break;                                                           \
+                                                                       \
+    case FLTFMT_IEEE_F128: {                                           \
+      uint32 _t[4];                                                    \
+      unsigned char *_z = (unsigned char *)(z_out);                    \
+                                                                       \
+      FLTFMT__FROB_NAN_F128(_t, _rc);                                  \
+      (rc) = fltfmt_encieee(&fltfmt_f128, _t, (x), (r), FLTERR_ALLERRS); \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE:                                                 \
+         STORE32_B(_z +  0, _t[0]); STORE32_B(_z +  4, _t[1]);         \
+         STORE32_B(_z +  8, _t[0]); STORE32_B(_z + 12, _t[1]);         \
+         break;                                                        \
+       case FLTFMT_LE:                                                 \
+         STORE32_L(_z +  0, _t[3]); STORE32_L(_z +  4, _t[2]);         \
+         STORE32_L(_z +  8, _t[1]); STORE32_L(_z + 12, _t[0]);         \
+         break;                                                        \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+    } break;                                                           \
+                                                                       \
+    case FLTFMT_INTEL_F80: {                                           \
+      uint32 _t[3];                                                    \
+      unsigned char *_z = (unsigned char *)(z_out);                    \
+                                                                       \
+      (rc) = fltfmt_encieee(&fltfmt_idblext80, _t, (x), (r), FLTERR_ALLERRS); \
+      FLTFMT__FROB_NAN_IDBLEXT80(_t, _rc);                             \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE:                                                 \
+         STORE16_B(_z + 0, _t[0]);                                     \
+         STORE32_B(_z + 2, _t[1]); STORE32_B(_z + 6, _t[2]);           \
+         break;                                                        \
+       case FLTFMT_LE:                                                 \
+         STORE32_L(_z + 0, _t[2]); STORE32_L(_z + 4, _t[1]);           \
+         STORE16_L(_z + 8, _t[0]);                                     \
+         break;                                                        \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+    } break;                                                           \
+                                                                       \
+    default: {                                                         \
+      /* We must do this the hard way. */                              \
+                                                                       \
+      const struct floatbits *_x = (x);                                        \
+      ty _z;                                                           \
+      unsigned _i;                                                     \
+      ENC_ROUND_DECLS;                                                 \
+                                                                       \
+      /* Case analysis... */                                           \
+      if (_x->f&FLTF_NANMASK) {                                                \
+       /* A NaN.  Use the macro above. */                              \
+                                                                       \
+       SETNAN(_rc, _z);                                                \
+       if (x->f&FLTF_NEG) _z = -_z;                                    \
+      } else if (_x->f&FLTF_INF) {                                     \
+       /* Infinity.  Use the macro. */                                 \
+                                                                       \
+       SETINF(TY, _rc, _z);                                            \
+       if (_x->f&FLTF_NEG) _z = -_z;                                   \
+      } else if (_x->f&FLTF_ZERO) {                                    \
+       /* Zero.  If we're asked for a negative zero then check that we \
+        * produced one: if not, then report an exactness failure.      \
+        */                                                             \
+                                                                       \
+       _z = 0.0;                                                       \
+       if (_x->f&FLTF_NEG)                                             \
+         { _z = -_z; if (!NEGP(_z)) _rc |= FLTERR_INEXACT; }           \
+      } else {                                                         \
+       /* A finite value. */                                           \
+                                                                       \
+       /* If the radix is a power of two, we can round to the correct  \
+        * precision, which will save inexactness later.                \
+        */                                                             \
+       ENC_ROUND(TY, _rc, _x, (r));                                    \
+                                                                       \
+       /* Insert the 32-bit pieces of the fraction one at a time,      \
+        * starting from the least-significant end.  This minimizes the \
+        * inaccuracy from the overall approach, but it's imperfect     \
+        * unless the value has already been rounded correctly.         \
+        */                                                             \
+       _z = 0.0;                                                       \
+       for (_i = _x->n, _z = 0.0; _i--; )                              \
+         _z += ldexp(_x->frac[_i], _x->exp - 32*_i);                   \
+                                                                       \
+       /* Negate the value if we need to. */                           \
+       if (_x->f&FLTF_NEG) _z = -_z;                                   \
+      }                                                                        \
+                                                                       \
+      /* All done. */                                                  \
+      *(z_out) = _z;                                                   \
+    } break;                                                           \
+  }                                                                    \
+                                                                       \
+  /* Set the error code. */                                            \
+  (rc) = _rc;                                                          \
+} while (0)
+
+/* --- @fltfmt_encTY@ --- *
+ *
+ * Arguments:  @ty *z_out@ = storage for the result
+ *             @const struct floatbits *x@ = value to encode
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode the floating-point value @x@ as a native C object and
+ *             store the result in @z_out@.
+ *
+ *             The @TY@ may be @flt@ to encode a @float@, @dbl@ to encode a
+ *             @double@, or (on C99 implementations) @ldbl@ to encode a
+ *             @long double@.
+ *
+ *             In detail, conversion is performed as follows.
+ *
+ *               * If a non-finite value cannot be represented by the
+ *                 implementation then the @FLTERR_REPR@ error bit is set
+ *                 and @*z_out@ is set to zero if @x@ is a NaN, or the
+ *                 (absolute) largest representable value, with appropriate
+ *                 sign, if @x@ is an infinity.
+ *
+ *               * If the implementation can represent NaNs, but cannot set
+ *                 NaN payloads, then the @FLTERR_INEXACT@ error bit is set,
+ *                 and @*z_out@ is set to an arbitrary (quiet) NaN value.
+ *
+ *               * If @x@ is negative zero, but the implementation does not
+ *                 distinguish negative and positive zero, then the
+ *                 @FLTERR_INEXACT@ error bit is set and @*z_out@ is set to
+ *                 zero.
+ *
+ *               * If the implementation's floating-point radix is not a
+ *                 power of two, and @x@ is a nonzero finite value, then
+ *                 @FLTERR_INEXACT@ error bit is set (unconditionally), and
+ *                 the value is rounded by the implementation using its
+ *                 prevailing rounding policy.  If the radix is a power of
+ *                 two, then the @FLTERR_INEXACT@ error bit is set only if
+ *                 rounding is necessary, and rounding is performed using
+ *                 the rounding mode @r@.
+ */
+
+unsigned fltfmt_encflt(float *z_out, const struct floatbits *x, unsigned r)
+{
+  unsigned rc;
+
+  ENCFLT(double, FLT, ldexp, rc, z_out, x, r);
+  return (rc);
+}
+
+unsigned fltfmt_encdbl(double *z_out, const struct floatbits *x, unsigned r)
+{
+  unsigned rc;
+
+  ENCFLT(double, DBL, ldexp, rc, z_out, x, r);
+  return (rc);
+}
+
+#if __STDC_VERSION__ >= 199001
+unsigned fltfmt_encldbl(long double *z_out,
+                       const struct floatbits *x, unsigned r)
+{
+  unsigned rc;
+
+  ENCFLT(long double, LDBL, ldexpl, rc, z_out, x, r);
+  return (rc);
+}
+#endif
+
+/* --- @DECFLT@ --- *
+ *
+ * Arguments:  @ty@ = the C type to encode
+ *             @TY@ = the uppercase prefix for macros
+ *             @ty (*frexp)(ty, int *)@ = function to decompose a @ty@ value
+ *                     into a binary exponent and normalized fraction
+ *             @unsigned &rc@ = error code to set
+ *             @struct floatbits *z_out@ = storage for the result
+ *             @ty x@ = value to convert
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    ---
+ *
+ * Use:                Decode a C native floating-point object.  This is the
+ *             machinery shared by the @fltfmt_dec...@ functions for
+ *             decoding native-format values.  Most of the behaviour is as
+ *             described for those functions.
+ */
+
+/* Define some utilities for decoding native floating-point formats.
+ *
+ *   * @NFRAC(d)@ is the number of fraction limbs we'll need for @d@ native
+ *     digits.
+ *
+ *   * @CONVFIX@ is a final fixup applied to the decoded value.
+ */
+#ifdef DIGIT_BITS
+#  define NFRAC(TY) ((DIGIT_BITS*TY##_MANT_DIG + 31)/32)
+#  define CONVFIX(ty, rc, z, x, n, f, r) do assert(!(x)); while (0)
+#else
+#  define NFRAC(TY)                                                    \
+     (ceil(log(pow(FLT_RADIX, TY##_MANT_DIG) - 1)/32.0*log(2.0)) + 1)
+#  define CONVFIX(ty, rc, z, x, n, f, r) do {                          \
+     ty _x_ = (x);                                                     \
+     struct floatbits *_z_ = (z);                                      \
+     uint32 _w_;                                                       \
+     unsigned _i_, _n_ = (n), _f_;                                     \
+                                                                       \
+     /* Round the result according to the remainder left in %$x$%. */  \
+     _f_ = 0; _i_ = _n_ - 1; _w_ = _z_->frac[_i_];                     \
+     if ((f)&FLTF_NEG) _f_ |= FRPF_NEG;                                        \
+     if (_w_&1) _f_ |= FRPF_ODD;                                       \
+     if (_y_ >= 0.5) _f_ |= FRPF_HALF;                                 \
+     if (_y_ != 0 && _y_ != 0.5) _f_ |= FRPF_LOW;                      \
+     if (((r) >> _f_)&1) {                                             \
+       for (;;) {                                                      \
+        _w_ = (_w_ + 1)&MASK32;                                        \
+        if (_w_ || !_i_) break;                                        \
+        _z_->frac[_i_] = 0; _w_ = _z_->frac[--_i_];                    \
+       }                                                               \
+       if (!_w_) { _z_->exp++; _w_ = B31; }                            \
+       _z_->frac[_i_] = w;                                             \
+     }                                                                 \
+                                                                       \
+     /* The result is not exact. */                                    \
+     (rc) |= FLTERR_INEXACT;                                           \
+   } while (0)
+#endif
+
+#define DECFLT(ty, TY, frexp, rc, z_out, x, r) do {                    \
+  unsigned _rc = 0;                                                    \
+                                                                       \
+  switch (TY##_FORMAT&(FLTFMT_ORGMASK | FLTFMT_TYPEMASK)) {            \
+                                                                       \
+    case FLTFMT_IEEE_F32: {                                            \
+      unsigned _t[1];                                                  \
+      unsigned char *_x = (unsigned char *)&(x);                       \
+                                                                       \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE: _t[0] = LOAD32_B(_x); break;                    \
+       case FLTFMT_LE: _t[0] = LOAD32_L(_x); break;                    \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+      FLTFMT__FROB_NAN_F32(_t, _rc);                                   \
+      _rc |= fltfmt_decieee(&fltfmt_f32, (z_out), _t);                 \
+    } break;                                                           \
+                                                                       \
+    case FLTFMT_IEEE_F64: {                                            \
+      unsigned _t[2];                                                  \
+      unsigned char *_x = (unsigned char *)&(x);                       \
+                                                                       \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE:                                                 \
+         _t[0] = LOAD32_B(_x + 0); _t[1] = LOAD32_B(_x + 4);           \
+         break;                                                        \
+       case FLTFMT_LE:                                                 \
+         _t[1] = LOAD32_L(_x + 0); _t[0] = LOAD32_L(_x + 4);           \
+         break;                                                        \
+       case FLTFMT_ARME:                                               \
+         _t[0] = LOAD32_L(_x + 0); _t[1] = LOAD32_L(_x + 4);           \
+         break;                                                        \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+      FLTFMT__FROB_NAN_F64(_t, _rc);                                   \
+      _rc |= fltfmt_decieee(&fltfmt_f64, (z_out), _t);                 \
+    } break;                                                           \
+                                                                       \
+    case FLTFMT_IEEE_F128: {                                           \
+      unsigned _t[4];                                                  \
+      unsigned char *_x = (unsigned char *)&(x);                       \
+                                                                       \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE:                                                 \
+         _t[0] = LOAD32_B(_x +  0); _t[1] = LOAD32_B(_x +  4);         \
+         _t[2] = LOAD32_B(_x +  8); _t[3] = LOAD32_B(_x + 12);         \
+         break;                                                        \
+       case FLTFMT_LE:                                                 \
+         _t[3] = LOAD32_L(_x +  0); _t[2] = LOAD32_L(_x +  4);         \
+         _t[1] = LOAD32_L(_x +  8); _t[0] = LOAD32_L(_x + 12);         \
+         break;                                                        \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+      FLTFMT__FROB_NAN_F128(_t, _rc);                                  \
+      _rc |= fltfmt_decieee(&fltfmt_f128, (z_out), _t);                        \
+    } break;                                                           \
+                                                                       \
+    case FLTFMT_INTEL_F80: {                                           \
+      unsigned _t[3];                                                  \
+      unsigned char *_x = (unsigned char *)&(x);                       \
+                                                                       \
+      switch (TY##_FORMAT&FLTFMT_ENDMASK) {                            \
+       case FLTFMT_BE:                                                 \
+         _t[0] = LOAD16_B(_x + 0);                                     \
+         _t[1] = LOAD32_B(_x + 2); _t[2] = LOAD32_B(_x + 6);           \
+         break;                                                        \
+       case FLTFMT_LE:                                                 \
+         _t[2] = LOAD32_L(_x + 0); _t[1] = LOAD32_L(_x + 4);           \
+         _t[0] = LOAD16_L(_x + 8);                                     \
+         break;                                                        \
+       default: assert(!"unimplemented byte order"); break;            \
+      }                                                                        \
+      FLTFMT__FROB_NAN_IDBLEXT80(_t, _rc);                             \
+      _rc |= fltfmt_decieee(&fltfmt_idblext80, (z_out), _t);           \
+    } break;                                                           \
+                                                                       \
+    default: {                                                         \
+      struct floatbits *_z = (z_out);                                  \
+      ty _x = (x), _y;                                                 \
+      unsigned _i, _n, _f = 0;                                         \
+      uint32 _t;                                                       \
+                                                                       \
+      /* If the value looks negative then negate it and set the sign   \
+       * flag.                                                         \
+       */                                                              \
+      if (NEGP(_x)) { _f |= FLTF_NEG; _x = -_x; }                      \
+                                                                       \
+      /* Now for the case analysis.  Infinities and zero are           \
+       * unproblematic.  NaNs can't be decoded exactly using the       \
+       * portable machinery.                                           \
+       */                                                              \
+      if (INFP(_x)) _f |= FLTF_INF;                                    \
+      else if (_x == 0.0) _f |= FLTF_ZERO;                             \
+      else if (NANP(_x)) { _f |= FLTF_QNAN; _rc |= FLTERR_INEXACT; }   \
+      else {                                                           \
+       /* A finite value.  Determine the number of fraction limbs      \
+        * we'll need based on the precision and radix and pull out     \
+        * 32-bit chunks one at a time.  This will be unproblematic     \
+        * for power-of-two radices, requiring at most shifting the     \
+        * significand left by a few bits, but inherently inexact (for  \
+        * the most part) for others.                                   \
+        */                                                             \
+                                                                       \
+       _n = NFRAC(TY); fltfmt_allocfrac(_z, _n);                       \
+       _y = frexp(_x, &_z->exp);                                       \
+       for (_i = 0; _i < _n; _i++)                                     \
+         { _y *= SH32; _t = _y; _y -= _t; _z->frac[_i] = _t; }         \
+       CONVFIX(ty, _rc, _z, _y, _n, _f, (r));                          \
+      }                                                                        \
+                                                                       \
+      /* Done. */                                                      \
+      _z->f = _f;                                                      \
+    } break;                                                           \
+  }                                                                    \
+                                                                       \
+  /* Set the error code. */                                            \
+  (rc) = _rc;                                                          \
+} while (0)
+
+/* --- @fltfmt_decTY@ --- *
+ *
+ * Arguments:  @struct floatbits *z_out@ = storage for the result
+ *             @ty x@ = value to decode
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Decode the native C floatingpoint value @x@ and store the
+ *             result in @z_out@.
+ *
+ *             The @TY@ may be @flt@ to encode a @float@, @dbl@ to encode a
+ *             @double@, or (on C99 implementations) @ldbl@ to encode a
+ *             @long double@.
+ *
+ *             In detail, conversion is performed as follows.
+ *
+ *               * If the implementation supports negative zeros and/or
+ *                 infinity, then these are recognized and decoded.
+ *
+ *               * If the input as a NaN, but the implementation cannot
+ *                 usefully report NaN payloads, then the @FLTERR_INEXACT@
+ *                 error bit is set and the decoded payload is left empty.
+ *
+ *               * If the implementation's floating-point radix is not a
+ *                 power of two, and @x@ is a nonzero finite value, then
+ *                 @FLTERR_INEXACT@ error bit is set (unconditionally), and
+ *                 the rounded value (according to the rounding mode @r@) is
+ *                 stored in as many fraction words as necessary to identify
+ *                 the original value uniquely.  If the radix is a power of
+ *                 two, then the value is represented exactly.
+ */
+
+unsigned fltfmt_decflt(struct floatbits *z_out, float x, unsigned r)
+{
+  unsigned rc;
+
+  DECFLT(double, FLT, frexp, rc, z_out, x, r);
+  return (rc);
+}
+
+unsigned fltfmt_decdbl(struct floatbits *z_out, double x, unsigned r)
+{
+  unsigned rc;
+
+  DECFLT(double, DBL, frexp, rc, z_out, x, r);
+  return (rc);
+}
+
+#if __STDC_VERSION__ >= 199001
+unsigned fltfmt_decldbl(struct floatbits *z_out, long double x, unsigned r)
+{
+  unsigned rc;
+
+  DECFLT(long double, LDBL, frexpl, rc, z_out, x, r);
+  return (rc);
+}
+#endif
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/utils/fltfmt.h b/utils/fltfmt.h
new file mode 100644 (file)
index 0000000..cd012a0
--- /dev/null
@@ -0,0 +1,725 @@
+/* -*-c-*-
+ *
+ * Floating-point format conversions
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef MLIB_FLTFMT_H
+#define MLIB_FLTFMT_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#ifndef MLIB_ARENA_H
+#  include "arena.h"
+#endif
+
+#ifndef MLIB_BITS_H
+#  include "bits.h"
+#endif
+
+/*----- Data structures ---------------------------------------------------*/
+
+struct floatbits {
+  /* A decoded floating-point number.
+   *
+   * The flags do most of the heavy lifting here.
+   *
+   *   * @FLTF_ZERO@ is set if the number is zero.  The @frac@ and @exp@ are
+   *    ignored.
+   *
+   *   * @FLTF_NEG@ is set if the number is negative.  The representation is
+   *    signed magnitude, because that seems basically universal among
+   *    floating-point formats.  Negative zero is a thing.
+   *
+   *   * @FLTF_SNAN@ and @FLTF_QMAN@ are set if the value is, respectively, a
+   *    signalling or quiet not-a-number.  The @frac@ holds the payload,
+   *    left-aligned, excluding the quiet bit; @exp@ is ignored.
+   *
+   *   * @FLTF_INF@ is set if the number is positive or negative infinity.
+   *    Projective infinity is not representable.  The @frac@ and @exp@ are
+   *    ignored.
+   *
+   * The @frac@ field contains the fractional significand, big-end first;
+   * either the number is identically (positive or negative) zero, or the
+   * most significant bit of @sig[0]@ is set, and the significand lies
+   * between a half (inclusive) and one (exclusive).  The @exp@ is the power
+   * of two by which the significand is to be scaled.
+   *
+   * The essential convention for @frac@ is that the value is unchanged if
+   * zero-valued words are added or removed at the end.
+   */
+
+  unsigned f;                          /* flags */
+#define FLTF_NEG 0x0001u               /*   number is negative */
+#define FLTF_INF 0x0002u               /*   number is negative */
+#define FLTF_QNAN 0x0004u              /*   quiet not-a-number */
+#define FLTF_SNAN 0x0008u              /*   signalling not-a-number */
+#define FLTF_ZERO 0x0010u              /*   number is zero */
+#define FLTF_NANMASK (FLTF_QNAN | FLTF_SNAN) /* any kind of NaN */
+  int exp;                             /* exponent, base 2 */
+  arena *a;                            /* memory arena */
+  uint32 *frac;                                /* fraction */
+  unsigned n, fracsz;                  /* fraction limbs used/allocated */
+};
+#define FLOATBITS_INIT { FLTF_ZERO, 0, &arena_stdlib, 0, 0, 0 }
+
+/* Error codes. */
+#define FLTERR_OK 0x0000u              /* no trouble */
+#define FLTERR_INVAL 0x0001u           /* technically invalid encoding */
+#define FLTERR_INEXACT 0x0002u         /* result is inexect */
+#define FLTERR_UFLOW 0x0004u           /* underflowed to zero */
+#define FLTERR_OFLOW 0x0008u           /* overflowed to Â±âˆž or max finite */
+#define FLTERR_REPR 0x0010             /* not representable */
+#define FLTERR_ALLERRS 0xffff          /* all errors */
+
+/* Predicates considered for rounding. */
+#define FRPF_LOW 0x0001u            /* lost bits not exactly zero or half */
+#define FRPF_HALF 0x0002u              /* lost a half or more  */
+#define FRPF_ODD 0x0004u               /* final place is currently odd */
+#define FRPF_NEG 0x0008u               /* number is negative */
+
+/* Rounding policies.  These are represented as a 16-bit truth table applied
+ * to the predicate bits listed above.  The following are the mask values
+ * corresponding to the predicate bits being set; a set bit means that the
+ * number should be rounded away from zero.
+ */
+#define FRPMASK_LOW 0xaaaau            /* lost bits below half */
+#define FRPMASK_HALF 0xccccu           /* lost a half or more */
+#define FRPMASK_ODD 0xf0f0u            /* final place is dod */
+#define FRPMASK_NEG 0xff00u            /* number is negative */
+
+/* Useful constructed masks from the above. */
+#define FRPMASK_INEXACT (FRPMASK_LOW | FRPMASK_HALF) /* lost nonzero bits */
+#define FRPMASK_NEAR(dir) (FRPMASK_HALF&(FRPMASK_LOW | (dir))) /*  */
+
+/* Generally useful rounding criteria. */
+#define FLTRND_ZERO 0                  /* towards zero (truncate) */
+#define FLTRND_PROJINF FRPMASK_INEXACT /*        Â½Â³ towards (projective) Â±âˆž */
+#define FLTRND_NEGINF (FRPMASK_INEXACT&FRPMASK_NEG) /* down, towards -∞ */
+#define FLTRND_POSINF (FRPMASK_INEXACT&~FRPMASK_NEG) /* up, towards +∞ */
+#define FLTRND_EVEN (FRPMASK_INEXACT&FRPMASK_ODD) /* to even */
+#define FLTRND_ODD (FRPMASK_INEXACT&~FRPMASK_ODD) /* to odd */
+#define FLTRND_NEAREVEN FRPMASK_NEAR(FLTRND_EVEN) /* nearest, ties to even */
+#define FLTRND_NEARODD FRPMASK_NEAR(FLTRND_ODD) /* nearest, ties to odd */
+#define FLTRND_NEARZERO FRPMASK_NEAR(FLTRND_ZERO) /* nearest, ties to zero */
+#define FLTRND_NEARINF FRPMASK_NEAR(FLTRND_PROJINF) /* nearest, ties to Â±âˆž */
+#define FLTRND_NEARNEG FRPMASK_NEAR(FLTRND_NEGINF) /* nearest, ties to -∞ */
+#define FLTRND_NEARPOS FRPMASK_NEAR(FLTRND_POSINF) /* nearest, ties to +∞ */
+
+/*----- General floating-point hacking ------------------------------------*/
+
+/* --- @fltfmt_initbits@ --- *
+ *
+ * Arguments:  @struct floatbits *x@ = pointer to structure to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Dynamically initialize @x@ to (positive) zero so that it can
+ *             be used as the destination operand by other operations.  This
+ *             doesn't allocate resources and cannot fail.  The
+ *             @FLOATBITS_INIT@ macro is a suitable static initializer for
+ *             performing the same task.
+ */
+
+extern void fltfmt_initbits(struct floatbits */*x*/);
+
+/* --- @fltfmt_freebits@ --- *
+ *
+ * Arguments:  @struct floatbits *x@ = pointer to structure to free
+ *
+ * Returns:    ---
+ *
+ * Use:                Releases the memory held by @x@.  Afterwards, @x@ is a valid
+ *             (positive) zero, but can safely be discarded.
+ */
+
+extern void fltfmt_freebits(struct floatbits */*x*/);
+
+/* --- @fltfmt_allocfrac@ --- *
+ *
+ * Arguments:  @struct floatbits *x@ = structure to adjust
+ *             @unsigned n@ = number of words required
+ *
+ * Returns:    ---
+ *
+ * Use:                Reallocate the @frac@ vector so that it has space for at
+ *             least @n@ 32-bit words, and set @x->n@ equal to @n@.  If the
+ *             current size is already @n@ or greater, then just update the
+ *             active length @n@ and return; otherwise, any existing vector
+ *             is discarded and a fresh, larger one allocated.
+ */
+
+extern void fltfmt_allocfrac(struct floatbits */*x*/, unsigned /*n*/);
+
+/* --- @fltfmt_copybits@ --- *
+ *
+ * Arguments:  @struct floatbits *z_out@ = where to leave the result
+ *             @const struct floatbits *x@ = source to copy
+ *
+ * Returns:    ---
+ *
+ * Use:                Make @z_out@ be a copy of @x@.  If @z_out@ is the same object
+ *             as @x@ then do nothing.
+ */
+
+extern void fltfmt_copybits(struct floatbits */*z_out*/,
+                           const struct floatbits */*x*/);
+
+/* --- @fltfmt_round@ --- *
+ *
+ * Arguments:  @struct floatbits *z_out@ = destination (may equal source)
+ *             @const struct floatbits *x@ = source
+ *             @unsigned r@ = rounding mode (@FLTRND_...@ code)
+ *             @unsigned n@ = nonzero number of bits to leave
+ *
+ * Returns:    A @FLTERR_...@ code, specifically either @FLTERR_INEXACT@ if
+ *             rounding discarded some nonzero value bits, or @FLTERR_OK@ if
+ *             rounding was unnecessary.
+ *
+ * Use:                Rounds a floating-point value to a given number of
+ *             significant bits, using the given rounding rule.
+ */
+
+extern unsigned fltfmt_round(struct floatbits */*z_out*/,
+                            const struct floatbits */*x*/,
+                            unsigned /*r*/, unsigned /*n*/);
+
+/*----- IEEE formats ------------------------------------------------------*/
+
+struct fltfmt_ieeefmt {
+  /* Description of a binary IEEE floating-point format.
+   *
+   * An IEEE binary floating-point encoding is split into three fields,
+   * called %$\sigma$%, %$e'$%, and %$m$%.
+   *
+   * The %$\sigma$% field encodes the sign as a single bit: if %$\sigma = 0$%
+   * then the value is nonnegative; if %$\sigma = 1$% then the value is
+   * negative.  Signed-magnitude encoding is used: if the rest of the
+   * encoding represents a (necessarily nonnegative) value %$x$% then the
+   * signed value is %$(-1)^\sigma \cdot x$%.
+   *
+   * The %$e'$% field encodes the exponent in a field of %$w$% bits.  The
+   * true exponent %$e = e' - e_0$%, where %$e_0 = 2^{w-1} - 1$% is the
+   * %%\emph{exponent bias}%%.  The maximum exponent for finite values is
+   * %$e_{\text{max}} = 2^w - 2 - e_0 = 2^{w-1} - 1$%, which is
+   * coincidentally equal to %$e_0$%; and the minimum exponent for
+   * %%\emph{normal}%% finite values is %$e_{\text{min}} = 1 - e_0 = {}$%
+   * %$2 - 2^{w-1}$%.  The maximum exponent value %$2^w - 1$% denotes
+   * infinities and NaN values, while the minimum value denotes zeros and
+   * subnormal values.
+   *
+   * If a `hidden-bit' convention is used (@IEEEF_HIDDEN@ is set in @f@),
+   * then %$h = 1$%; otherwise, %$h = 0$%.
+   *
+   * The %$m$% field encodes the %$p$%-bit %%\emph{significand}%%.  If a
+   * `hidden-bit' convention is used then the %$m$% field is actually %$p -
+   * 1$% bits wide; otherwise, it is %$p$% bits.
+   *
+   *   * If %$e_{\text{min}} \le e \le e_{\text{max}}$% then the encoding
+   *    represents a %%\emph{normal} value, specifically the value
+   *    %$x = (-1)^\sigma \cdot (h + m/2^{p-1}) \cdot 2^e$%.  In formats
+   *    which do not use the hidden-bit convention, the most significant bit
+   *    of %$m$% must be set; we return @FLTERR_INVAL@ for other
+   *    encodings, and interpret the `unnormal' value as encoded.
+   *
+   *   * If %$e = e_{\text{min}} - 1$% then the encoding represents (signed)
+   *    zero if %$m = 0$%, or a %%\emph{subnormal}%% value %$x = (-1)^\sigma
+   *    \cdot m/2^{p-1} \cdot 2^{e_{\text{min}}}$%.  Note that, in formats
+   *    which do not use the hidden-bit convention, the unit bit should be
+   *    clear; we return @FLTERR_INVAL@ for other encodings, and interpret
+   *    the `pseudo-denormal' value as encoded.
+   *
+   *   * If %e = e_{\text{max}} + 1$% then the encoding represents
+   *    %$(-1)^\sigma \cdot \infty$% if %$m = 0$%, or a not-a-number value
+   *    (NaN) with payload %$m \ne 0$%.  A %%\emph{quiet}%% NaN has bit
+   *    %$p - 2$% set in %$m$%; a signalling NaN has this bit reset.  Note
+   *    that some platform's native format reverses this convention, but
+   *    this is handled in code which deals with native formats: the
+   *    interchange formats described here always indicate quiet NaNs by
+   *    setting the bit.  In formats which use the hidden-bit convetion, the
+   *    unit bit %$p - 1$% is ignored
+   */
+
+  unsigned f;                          /* flags */
+#define IEEEF_HIDDEN 1u                        /*   unit bit is implicit */
+  unsigned expwd;                      /* exponent field width %$w$% */
+  unsigned prec;                       /* precision %$p$% */
+};
+
+/* IEEE (and related) format descriptions. */
+extern const struct fltfmt_ieeefmt
+  fltfmt_f16, fltfmt_f32, fltfmt_f64, fltfmt_f128,
+  fltfmt_mini, fltfmt_bf16, fltfmt_idblext80;
+
+/* --- @fltfmt_encieee@ ---
+ *
+ * Arguments:  @const struct fltfmt_ieeefmt *fmt@ = format description
+ *             @uint32 *z@ = output vector
+ *             @const struct floatbits *x@ = value to encode
+ *             @unsigned r@ = rounding mode
+ *             @unsigned errmask@ = error mask
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a floating-point value in an IEEE format.  This is the
+ *             machinery shared by the @fltfmt_enc...@ functions for
+ *             encoding IEEE-format values.  Most of the arguments and
+ *             behaviour are as described for those functions.
+ *
+ *             The encoded value is right-aligned and big-endian; i.e., the
+ *             sign bit ends up in @z[0]@, and the least significant bit of
+ *             the significand ends up in the least significant bit of
+ *             @z[n - 1]@.
+ */
+
+extern unsigned fltfmt_encieee(const struct fltfmt_ieeefmt */*fmt*/,
+                              uint32 */*z*/, const struct floatbits */*x*/,
+                              unsigned /*r*/, unsigned /*errmask*/);
+
+/* --- @fltfmt_encTY@ --- *
+ *
+ * Arguments:  @octet *z_out@, @uint16 *z_out@, @uint32 *z_out@,
+ *                     @kludge64 *z_out@ = where to put the encoded value
+ *             @uint16 *se_out@, @kludge64 *m_out@ = where to put the
+ *                     encoded sign-and-exponent and significand
+ *             @const struct floatbits *x@ = value to encode
+ *             @unsigned r@ = rounding mode
+ *             @unsigned errmask@ = error mask
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a floating-point value in an IEEE (or IEEE-adjacent)
+ *             format.
+ *
+ *             If an error is encountered during the encoding, and the
+ *             corresponding bit of @errmask@ is clear, then processing
+ *             stops immediately and the error is returned; if the bit is
+ *             set, then processing continues as described below.
+ *
+ *             The @TY@ may be
+ *
+ *               * @mini@ for the 8-bit `1.4.3 minifloat' format, with
+ *                 four-bit exponent and four-bit significand, represented
+ *                 as a single octet;
+ *
+ *               * @bf16@ for the Google `bfloat16' format, with eight-bit
+ *                 exponent and eight-bit significand, represented as a
+ *                 @uint16@;
+ *
+ *               * @f16@ for the IEEE `binary16' format, with five-bit
+ *                 exponent and eleven-bit significand, represented as a
+ *                 @uint16@;
+ *
+ *               * @f32@ for the IEEE `binary32' format, with eight-bit
+ *                 exponent and 24-bit significand, represented as a
+ *                 @uint32@;
+ *
+ *               * @f64@ for the IEEE `binary64' format, with eleven-bit
+ *                 exponent and 53-bit significand, represented as a
+ *                 @kludge64@;
+ *
+ *               * @f128@ for the IEEE `binary128' format, with fifteen-bit
+ *                 exponent and 113-bit significand, represented as four
+ *                 @uint32@ limbs, most significant first; or
+ *
+ *               * @idblext80@ for the Intel 80-bit `double extended'
+ *                 format, with fifteen-bit exponent and 64-bit significand
+ *                 with no hidden bit, represented as a @uint16 se@
+ *                 holding the sign and exponent, and a @kludge64 m@
+ *                 holding the significand.
+ *
+ *             Positive and negative zero and infinity are representable
+ *             exactly.
+ *
+ *              Following IEEE recommendations (and most implementations),
+ *             the most significant fraction bit of a quiet NaN is set; this
+ *             bit is clear in a signalling NaN.  The most significant
+ *             payload bits of a NaN, held in the top bits of @x->frac[0]@,
+ *             are encoded in the output significand following the `quiet'
+ *             bit.  If the chosen format's significand field is too small
+ *             to accommodate all of the set payload bits then the
+ *             @FLTERR_INEXACT@ error bit is set and, if masked, the
+ *             excess payload bits are discarded.  No rounding of NaN
+ *             payloads is performed.
+ *
+ *             Otherwise, the input value is finite and nonzero.  If the
+ *             significand cannot be represented exactly then the
+ *             @FLTERR_INEXACT@ error bit is set, and, if masked, the value
+ *             will be rounded (internally -- the input @x@ is not changed).
+ *             If the (rounded) value's exponent is too large to represent,
+ *             then the @FLTERR_OFLOW@ and @FLTERR_INEXACT@ error bits are
+ *             set and, if masked, the result is either the (absolute)
+ *             largest representable finite value or infinity, with the
+ *             appropriate sign, chosen according to the rounding mode.  If
+ *             the exponent is too small to represent, then the
+ *             @FLTERR_UFLOW@ and @FLTERR_INEXACT@ error bits are set and,
+ *             if masked, the result is either the (absolute) smallest
+ *             nonzero value or zero, with the appropriate sign, chosen
+ *             according to the rounding mode.
+ */
+
+extern unsigned fltfmt_encmini(octet */*z_out*/,
+                              const struct floatbits */*x*/,
+                              unsigned /*r*/, unsigned /*errmask*/);
+
+extern unsigned fltfmt_encbf16(uint16 */*z_out*/,
+                              const struct floatbits */*x*/,
+                              unsigned /*r*/, unsigned /*errmask*/);
+
+extern unsigned fltfmt_encf16(uint16 */*z_out*/,
+                             const struct floatbits */*x*/,
+                             unsigned /*r*/, unsigned /*errmask*/);
+
+extern unsigned fltfmt_encf32(uint32 */*z_out*/,
+                             const struct floatbits */*x*/,
+                             unsigned /*r*/, unsigned /*errmask*/);
+
+extern unsigned fltfmt_encf64(kludge64 */*z_out*/,
+                             const struct floatbits */*x*/,
+                             unsigned /*r*/, unsigned /*errmask*/);
+
+extern unsigned fltfmt_encf128(uint32 */*z_out*/,
+                              const struct floatbits */*x*/,
+                              unsigned /*r*/, unsigned /*errmask*/);
+
+extern unsigned fltfmt_encidblext80(uint16 */*se_out*/, kludge64 */*f_out*/,
+                                   const struct floatbits */*x*/,
+                                   unsigned /*r*/, unsigned /*errmask*/);
+
+/* --- @fltfmt_decieee@ --- *
+ *
+ * Arguments:  @const struct fltfmt_ieeefmt *fmt@ = format description
+ *             @struct floatbits *z_out@ = output decoded representation
+ *             @const uint32 *x@ = input encoding
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Decode a floating-point value in an IEEE format.  This is the
+ *             machinery shared by the @fltfmt_dec...@ functions for
+ *             deccoding IEEE-format values.  Most of the arguments and
+ *             behaviour are as described for those functions.
+ *
+ *             The encoded value should be right-aligned and big-endian;
+ *             i.e., the sign bit ends up in @z[0]@, and the least
+ *             significant bit of the significand ends up in the least
+ *             significant bit of @z[n - 1]@.
+ */
+
+extern unsigned fltfmt_decieee(const struct fltfmt_ieeefmt */*fmt*/,
+                              struct floatbits */*z_out*/,
+                              const uint32 */*x*/);
+
+/* --- @fltfmt_decTY@ --- *
+ *
+ * Arguments:  @const struct floatbits *z_out@ = storage for the result
+ *             @octet x@, @uint16 x@, @uint32 x@, @kludge64 x@ =
+ *                     encoded input
+ *             @uint16 se@, @kludge64 m@ = encoded sign-and-exponent and
+ *                     significand
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a floating-point value in an IEEE (or IEEE-adjacent)
+ *             format.
+ *
+ *             The options for @TY@ are as documented for the encoding
+ *             functions above.
+ *
+ *             In formats without a hidden bit -- currently only @idblext80@
+ *             -- not all bit patterns are valid encodings.  If the explicit
+ *             unit bit is set when the exponent field is all-bits-zero, or
+ *             clear when the exponent field is not all-bits-zero, then the
+ *             @FLTERR_INVAL@ error bit is set.  If the exponent is all-
+ *             bits-set, denoting infinity or a NaN, then the unit bit is
+ *             otherwise ignored -- in particular, it does not affect the
+ *             NaN payload, or even whether the input encodes a NaN or
+ *             infinity.  Otherwise, the unit bit is considered significant,
+ *             and the result is normalized as one would expect.
+ *             Consequently, biased exponent values 0 and 1 are distinct
+ *             only with respect to which bit patterns are considered valid,
+ *             and not with respect to the set of values denoted.
+ */
+
+extern unsigned fltfmt_decmini(struct floatbits */*z_out*/, octet /*x*/);
+
+extern unsigned fltfmt_decbf16(struct floatbits */*z_out*/, uint16 /*x*/);
+
+extern unsigned fltfmt_decf16(struct floatbits */*z_out*/, uint16 /*x*/);
+
+extern unsigned fltfmt_decf32(struct floatbits */*z_out*/, uint32 /*x*/);
+
+extern unsigned fltfmt_decf64(struct floatbits */*z_out*/, kludge64 /*x*/);
+
+extern unsigned fltfmt_decf128(struct floatbits */*z_out*/,
+                              const uint32 */*x*/);
+
+extern unsigned fltfmt_decidblext80(struct floatbits */*z_out*/,
+                                   uint16 /*se*/, kludge64 /*f*/);
+
+/*----- Native formats ----------------------------------------------------*/
+
+/* Hacking for platforms which ill-advisedly have the opposite sense for the
+ * quiet NaN bit.
+ *
+ * Obviously we toggle the quiet bit, but there's a problem: if the quiet bit
+ * is the only one set, then if we toggle it, the fraction will become zero
+ * and we'll be left with an infinity.  Follow MIPS and set all of the bits.
+ *
+ * This is all internal machinery and shouldn't be relied on by applications.
+ */
+#if defined(__hppa__) || (defined(__mips__) && !defined(__mips_nan2008))
+#  define FLTFMT__MUST_FROB_NANS
+
+#  define FLTFMT__FROB_NAN_F32(x_inout, rc) do {                       \
+     uint32 *_x_inout_ = (x_inout), _x0_ = _x_inout_[0];               \
+                                                                       \
+     if ((_x0_&0x7f800000) != 0x7f800000 || !(_x0_&0x007fffff))                \
+       ;                                                               \
+     else if (_x0_&0x003fffff)                                         \
+       _x_inout_[0] = _x0_ ^ 0x00400000;                               \
+     else {                                                            \
+       _x_inout_[0] = (_x0_&0x80000000) | 0x7fffffff;                  \
+       (rc) |= FLTERR_INEXACT;                                         \
+     }                                                                 \
+   } while (0)
+
+#  define FLTFMT__FROB_NAN_F64(x_inout, rc) do {                       \
+     uint32 *_x_inout_ = (x_inout),                                    \
+       _x0_ = _x_inout_[0], _x1_ = _x_inout_[1];                       \
+                                                                       \
+     if ((_x0_&0x7ff00000) != 0x7ff00000 || (!(_x0_&0x000fffff) && !_x1_)) \
+       ;                                                               \
+     else if ((_x0_&0x0007ffff) || _x1_)                               \
+       _x_inout_[0] = _x0_ ^ 0x00080000;                               \
+     else {                                                            \
+       _x_inout_[0] = (_x0_&0x80000000) | 0x7fffffff;                  \
+       _x_inout_[1] = 0xffffffff;                                      \
+       (rc) |= FLTERR_INEXACT;                                         \
+     }                                                                 \
+   } while (0)
+
+#  define FLTFMT__FROB_NAN_F128(x_inout, rc) do {                      \
+     uint32 *_x_inout_ = (x_inout),                                    \
+       _x0_ = _x_inout_[0], _x1_ = _x_inout_[1],                       \
+       _x2_ = _x_inout_[2], _x3_ = _x_inout_[3];                       \
+                                                                       \
+     if ((_x0_&0x7fff0000) != 0x7fff0000 ||                            \
+        (!(_x0_&0x000fffff) && !_x1_ && !_x2_ && !_x3_))               \
+       ;                                                               \
+     else if ((_x0_&0x00007fff) || _x1_ || _x2_ || _x3_)               \
+       _x_inout_[0] = _x0_ ^ 0x00008000;                               \
+     else {                                                            \
+       _x_inout_[0] = (_x0_&0x80000000) | 0x7fffffff;                  \
+       _x_inout_[1] = _x_inout_[2] = _x_inout_[3] = 0xffffffff;                \
+       (rc) |= FLTERR_INEXACT;                                         \
+     }                                                                 \
+   } while (0)
+
+#  define FLTFMT__FROB_NAN_IDBLEXT80(x_inout, rc) do {                 \
+     uint32 *_x_inout_ = (x_inout),                                    \
+       _x0_ = _x_inout_[0], _x1_ = _x_inout_[1], _x2_ = _x_inout_[2];  \
+                                                                       \
+     if ((_x0_&0x00007fff) != 0x00007fff || (!(_x1_&0x7fffffff) && !_x2_)) \
+       ;                                                               \
+     else if ((_x1_&0x3fffffff) || _x1_ || _x2_)                       \
+       _x_inout_[1] = _x1_ ^ 0x40000000;                               \
+     else {                                                            \
+       _x_inout_[1] = (_x1_&0x80000000) | 0x3fffffff; /* preserve unit */ \
+       _x_inout_[2] = 0xffffffff;                                      \
+     }                                                                 \
+   } while (0)
+
+#else
+#  define FLTFMT__FROB_NAN_F32(x_inout, rc) do ; while (0)
+#  define FLTFMT__FROB_NAN_F64(x_inout, rc) do ; while (0)
+#  define FLTFMT__FROB_NAN_F128(x_inout, rc) do ; while (0)
+#  define FLTFMT__FROB_NAN_IDBLEXT80(x_inout, rc) do ; while (0)
+#endif
+
+/* --- @fltfmt_encTY@ --- *
+ *
+ * Arguments:  @ty *z_out@ = storage for the result
+ *             @const struct floatbits *x@ = value to encode
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode the floating-point value @x@ as a native C object and
+ *             store the result in @z_out@.
+ *
+ *             The @TY@ may be @flt@ to encode a @float@, @dbl@ to encode a
+ *             @double@, or (on C99 implementations) @ldbl@ to encode a
+ *             @long double@.
+ *
+ *             In detail, conversion is performed as follows.
+ *
+ *               * If a non-finite value cannot be represented by the
+ *                 implementation then the @FLTERR_REPR@ error bit is set
+ *                 and @*z_out@ is set to zero if @x@ is a NaN, or the
+ *                 (absolute) largest representable value, with appropriate
+ *                 sign, if @x@ is an infinity.
+ *
+ *               * If the implementation can represent NaNs, but cannot set
+ *                 NaN payloads, then the @FLTERR_INEXACT@ error bit is set,
+ *                 and @*z_out@ is set to an arbitrary (quiet) NaN value.
+ *
+ *               * If @x@ is negative zero, but the implementation does not
+ *                 distinguish negative and positive zero, then the
+ *                 @FLTERR_INEXACT@ error bit is set and @*z_out@ is set to
+ *                 zero.
+ *
+ *               * If the implementation's floating-point radix is not a
+ *                 power of two, and @x@ is a nonzero finite value, then
+ *                 @FLTERR_INEXACT@ error bit is set (unconditionally), and
+ *                 the value is rounded by the implementation using its
+ *                 prevailing rounding policy.  If the radix is a power of
+ *                 two, then the @FLTERR_INEXACT@ error bit is set only if
+ *                 rounding is necessary, and rounding is performed using
+ *                 the rounding mode @r@.
+ */
+
+extern unsigned fltfmt_encflt(float */*z_out*/,
+                             const struct floatbits */*x*/,
+                             unsigned /*r*/);
+
+extern unsigned fltfmt_encdbl(double */*z_out*/,
+                             const struct floatbits */*x*/,
+                             unsigned /*r*/);
+
+#if __STDC_VERSION__ >= 199001
+extern unsigned fltfmt_encldbl(long double */*z_out*/,
+                              const struct floatbits */*x*/,
+                              unsigned /*r*/);
+#endif
+
+/* --- @fltfmt_decTY@ --- *
+ *
+ * Arguments:  @struct floatbits *z_out@ = storage for the result
+ *             @ty x@ = value to decode
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Decode the native C floatingpoint value @x@ and store the
+ *             result in @z_out@.
+ *
+ *             The @TY@ may be @flt@ to encode a @float@, @dbl@ to encode a
+ *             @double@, or (on C99 implementations) @ldbl@ to encode a
+ *             @long double@.
+ *
+ *             In detail, conversion is performed as follows.
+ *
+ *               * If the implementation supports negative zeros and/or
+ *                 infinity, then these are recognized and decoded.
+ *
+ *               * If the input as a NaN, but the implementation cannot
+ *                 usefully report NaN payloads, then the @FLTERR_INEXACT@
+ *                 error bit is set and the decoded payload is left empty.
+ *
+ *               * If the implementation's floating-point radix is not a
+ *                 power of two, and @x@ is a nonzero finite value, then
+ *                 @FLTERR_INEXACT@ error bit is set (unconditionally), and
+ *                 the rounded value (according to the rounding mode @r@) is
+ *                 stored in as many fraction words as necessary to identify
+ *                 the original value uniquely.  If the radix is a power of
+ *                 two, then the value is represented exactly.
+ */
+
+extern unsigned fltfmt_decflt(struct floatbits */*z_out*/,
+                             float /*x*/, unsigned /*r*/);
+
+extern unsigned fltfmt_decdbl(struct floatbits */*z_out*/,
+                             double /*x*/, unsigned /*r*/);
+
+#if __STDC_VERSION__ >= 199001
+extern unsigned fltfmt_decldbl(struct floatbits */*z_out*/,
+                              long double /*x*/, unsigned /*r*/);
+#endif
+
+/*----- Some common conversions packaged up -------------------------------*/
+
+/* --- @fltfmt_CTYtoFTYE@ --- *
+ *
+ * Arguments:  @octet *p@ = output pointer
+ *             @float x@, @double x@ = value to convert
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Encode a native C floating-point value in an external format.
+ *
+ *             The @CTY@ is an abbreviation for a C type: @flt@ for @float@,
+ *             or @dbl@ for @double@; @fty@ is an abbreviation for the
+ *             external format, @f32@ for IEEE Binary32, or @f64@ for IEEE
+ *             Binary64; and @E@ is @l@ for little-endian or @b@ for
+ *             big-endian byte order.  Not all combinations are currently
+ *             supported.
+ *
+ *             On platforms where the external format is used natively,
+ *             these functions are simple data copies.
+ */
+
+extern unsigned fltfmt_flttof32l(octet */*p*/, float /*x*/, unsigned /*r*/);
+extern unsigned fltfmt_flttof32b(octet */*p*/, float /*x*/, unsigned /*r*/);
+extern unsigned fltfmt_dbltof64l(octet */*p*/, double /*x*/, unsigned /*r*/);
+extern unsigned fltfmt_dbltof64b(octet */*p*/, double /*x*/, unsigned /*r*/);
+
+/* --- @fltfmt_FTYEtoCTY@ --- *
+ *
+ * Arguments:  @float *z_out@, @double *z_out@ = storage for output
+ *             @const octet *p@ = input pointer
+ *             @unsigned r@ = rounding mode
+ *
+ * Returns:    Error flags (@FLTERR_...@).
+ *
+ * Use:                Decodes a floating point value in an external format into a
+ *             native value.
+ *
+ *             The naming conventions are the same as for @fltfmt_dbltof64b@
+ *             above.
+ *
+ *             On platforms where the external format is used natively,
+ *             these functions are simple data copies.
+ */
+
+extern unsigned fltfmt_f32ltoflt(float */*z_out*/, const octet */*p*/,
+                                unsigned /*r*/);
+extern unsigned fltfmt_f32btoflt(float */*z_out*/, const octet */*p*/,
+                                unsigned /*r*/);
+extern unsigned fltfmt_f64ltodbl(double */*z_out*/, const octet */*p*/,
+                                unsigned /*r*/);
+extern unsigned fltfmt_f64btodbl(double */*z_out*/, const octet */*p*/,
+                                unsigned /*r*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
index 9964d184ea35b786a3967e7ea7a4dcbb108a40c8..45cd35afc9325b34d49fff159fb7880e7a6e224a 100644 (file)
@@ -572,7 +572,8 @@ int gprintf(const struct gprintf_ops *ops, void *out, const char *p, ...)
 
 /* --- @gprintf_memputf@ --- *
  *
- * Arguments:  @char **buf_inout@ = address of output buffer pointer
+ * Arguments:  @arena *a@ = memory allocation arena
+ *             @char **buf_inout@ = address of output buffer pointer
  *             @size_t *sz_inout@ = address of buffer size
  *             @size_t maxsz@ = buffer size needed for this operation
  *             @const char *p@ = pointer to format string
@@ -590,15 +591,16 @@ int gprintf(const struct gprintf_ops *ops, void *out, const char *p, ...)
  *             buffer, and the formatted string will have been written to
  *             the buffer.
  *
- *             When the buffer is no longer required, free it using @xfree@.
+ *             When the buffer is no longer required, free it using
+ *             @x_free@.
  */
 
-size_t gprintf_memputf(char **buf_inout, size_t *sz_inout,
-                   size_t maxsz, const char *p, va_list ap)
+size_t gprintf_memputf(arena *a, char **buf_inout, size_t *sz_inout,
+                      size_t maxsz, const char *p, va_list ap)
 {
   int n;
 
-  GROWBUF_REPLACE(&arena_stdlib, *buf_inout, *sz_inout, maxsz, 64, 1);
+  GROWBUF_REPLACE(size_t, a, *buf_inout, *sz_inout, maxsz, 64, 1);
 #ifdef HAVE_SNPRINTF
   n = vsnprintf(*buf_inout, maxsz + 1, p, ap);
 #else
index 7bb0b043d2f02d91637ded00beda3920730eb517..d3c5f47bf28cbc8dc5ba25c8b279346c089a6345 100644 (file)
@@ -82,7 +82,8 @@ extern int vgprintf(const struct gprintf_ops */*ops*/, void */*out*/,
 
 /* --- @gprintf_memputf@ --- *
  *
- * Arguments:  @char **buf_inout@ = address of output buffer pointer
+ * Arguments:  @arena *a@ = memory allocation arena
+ *             @char **buf_inout@ = address of output buffer pointer
  *             @size_t *sz_inout@ = address of buffer size
  *             @size_t maxsz@ = buffer size needed for this operation
  *             @const char *p@ = pointer to format string
@@ -100,10 +101,12 @@ extern int vgprintf(const struct gprintf_ops */*ops*/, void */*out*/,
  *             buffer, and the formatted string will have been written to
  *             the buffer.
  *
- *             When the buffer is no longer required, free it using @xfree@.
+ *             When the buffer is no longer required, free it using
+ *             @x_free@.
  */
 
-extern size_t gprintf_memputf(char **/*buf_inout*/, size_t */*sz_inout*/,
+extern size_t gprintf_memputf(arena */*a*/,
+                             char **/*buf_inout*/, size_t */*sz_inout*/,
                              size_t /*maxsz*/,
                              const char */*p*/, va_list /*ap*/);
 
index 91052c293a3611fc2979f8daae967f71dfe95f35..caeb4144eb86a88f7514d42543d02541922477a1 100644 (file)
 .\" @STR
 .\" @GLUE
 .\" @STATIC_ASSERT
-.\" COMMA
+.\" @CHECK_TYPE
+.\" @CONVERT_CAREFULLY
+.\" @UNCONST
+.\" @UNVOLATILE
+.\" @UNQUALIFY
+.\" @COMMA
 .
 .\" @ISALNUM
 .\" @ISALPHA
@@ -85,10 +90,16 @@ macros \- useful macros
 .nf
 .B "#include <mLib/macros.h>"
 .PP
-.BI "size_t N(" array ");"
+.BI "size_t N(" type " " array "[]);"
 .BI "STR(" tokens\fR... ")"
 .BI "GLUE(" tokens\fR... ", " tokens\fR... ")"
 .BI "STATIC_ASSERT(" cond ", " msg ");"
+.BI "int CHECK_TYPE(" expty ", " expty " " x );
+.IB newty " CONVERT_CAREFULLY(" newty ", " expty ", " expty " " x );
+.IB type " *UNCONST(" type ", const " type " *" p );
+.IB type " *UNVOLATILE(" type ", volatile " type " *" p );
+.IB type " *UNQUALIFY(" type ", const volatile " type " *" p );
+.B "#define COMMA ,"
 .PP
 .BI "ISALNUM(int " ch ");"
 .BI "ISALPHA(int " ch ");"
@@ -166,6 +177,53 @@ falls back to a somewhat ugly hack which currently ignores the
 .IR msg .
 .PP
 The
+.B CHECK_TYPE
+macro checks at compile-time that
+.I x
+has (or, at least, is assignment-compatible with) type
+.IR expty .
+If so, the result is the integer zero.
+The
+.B CONVERT_CAREFULLY
+macro similarly checks at compile-time that
+.I x
+has type
+.IR expty ,
+and if so, the result is
+.I x
+converted to type
+.IR newty .
+.PP
+The
+.B UNCONST
+macro checks at compile-time that
+.I p
+has (or, at least, is assignment-compatible with) type
+.BI "const " type "\ *" \fR.
+If so, it returns
+.I p
+converted to type
+.IB type "\ *" \fR,
+i.e., it removes any
+.B const
+qualification from the type that
+.I p
+points to.
+The
+.B UNVOLATILE
+macro is similar, except that it removes any
+.B volatile
+qualification;
+and the
+.B UNQUALIFY
+macro
+removes any
+.B const
+.I or
+.B volatile
+qualification.
+.PP
+The
 .B COMMA
 macro expands to a comma
 .BR ` , ',
index dba22a7a9d07ce2e9f442eaa25c205568a042b8e..bc836296e2ca50322286176b570924d222862615 100644 (file)
 #  define STATIC_ASSERT(cond, msg) static_assert(!!(cond), msg)
 #else
 #  define STATIC_ASSERT(cond, msg)                                     \
-       IGNORABLE extern char static_assert_failed[2*!!(cond) - 1]
+       IGNORABLE extern char static_assert_failed[1 - 2*!(cond)]
 #endif
 
+/* --- @CHECK_TYPE@ ---
+ *
+ * Arguments:  @expty@ = expected type of @x@
+ *             @expty x@ = some object
+ *
+ * Returns:    Integer zero.
+ *
+ * Use:                Cause a compile-time failure unless the type of @x@ is
+ *             assignment-compatible with @expty@.
+ */
+
+#define CHECK_TYPE(expty, x) (!sizeof(*(expty *)0 = (x)))
+
+/* --- @CONVERT_CAREFULLY@ ---
+ *
+ * Arguments:  @newty@ = new type for the result
+ *             @expty@ = expected type of @x@
+ *             @expty x@ = some object
+ *
+ * Returns:    @x@, but coerced to type @newty@.
+ *
+ * Use:                Like @(newty)x@, except that it checks at compile-time that
+ *             @x@ is at least assignment-compatible with type @expty@
+ *             before trying.
+ */
+
+#define CONVERT_CAREFULLY(newty, expty, x)                             \
+       (CHECK_TYPE(expty, x) + (/*unconst unvolatile*/ newty)(x))
+
+/* --- @UNCONST@, @UNVOLATILE@, @UNQUALIFY@ --- *
+ *
+ * Arguments:  @type@ = a type name
+ *             @type *p@ = a pointer
+ *
+ * Returns:    @p@, but without @const@, @volatile@ or both qualifiers.
+ *
+ * Use:                Strips qualifiers from pointer types.
+ *
+ *             The @UNCONST@ macro strips @const@.  It checks that @p@
+ *             has type `pointer to @type@ or @const type@'; if not, a
+ *             compile-time error results.  Otherwise, it returns the value
+ *             of @p@, converted to `pointer to (non-constant) @type@'.  It
+ *             will not silently strip a @volatile@ qualifier.
+ *
+ *             The @UNVOLATILE@ macro is similar, except that it strips
+ *             @volatile@ instead of @const@.  The @UNQUALIFY@ macro strips
+ *             both qualifiers.
+ */
+
+#define UNCONST(type, p) CONVERT_CAREFULLY(type *, const type *, p)
+#define UNVOLATILE(type, p) CONVERT_CAREFULLY(type *, volatile type *, p)
+#define UNQUALIFY(type, p)                                             \
+       CONVERT_CAREFULLY(type *, const volatile type *, p)
+
 /* --- @COMMA@ --- *
  *
  * Arguments:  ---
 #if GCC_VERSION_P(2, 7) || CLANG_VERSION_P(0, 0)
 #  define LAUNDER(x)                                                   \
        ({ __typeof__(x) _y; __asm__("" : "=g"(_y) : "0"(x)); _y; })
+#  define ADMIRE(x)                                                    \
+       ({ __asm__("" : : "g"(x)); })
+#  define ADMIRE_BUF(p, sz)                                            \
+       ({ __asm__("" : : "g"(p), "g"(sz)); })
 #  define RELAX do __asm__ __volatile__("" ::: "memory"); while (0)
 #endif
 
 #  define LAUNDER(x) (x)
 #endif
 
+/* --- @ADMIRE@, @ADMIRE_BUF@ --- *
+ *
+ * Arguments:  @x@ = some scalar expression
+ *             @const void *p@, @size_t sz@ = a pointer and length
+ *
+ * Returns:    ---
+ *
+ * Use:                Ensures that the compiler generates code to compute @x@ or
+ *             the contents of the buffer at @p@.
+ */
+
+#ifndef ADMIRE
+#  define ADMIRE(x) ((void)(x))
+#endif
+#ifndef ADMIRE_BUF
+#  define ADMIRE_BUF(p, sz) ((void)(p), (void)(sz))
+#endif
+
 /* --- @RELAX@ --- *
  *
  * Arguments:  ---
index 37227e9e620617faff8adbea578cdc6a3ead22a6..fe33e8b32e5782048caf70c51ffa894299a8c4a6 100644 (file)
 
 #include <math.h>
 
+#ifndef MLIB_BITS_H
+#  include "bits.h"
+#endif
+
 /*----- Macros provided ---------------------------------------------------*/
 
 /* --- @NANP@ --- *
@@ -82,6 +86,8 @@
 #  define NEGP(x) ((x) < 0)
 #endif
 
+/*----- Floating-point encoding and decoding ------------------------------*/
+
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus
index 4967fd67fd90ee04296e28b9fead32f7aa04da5d..464f9d9f90a04b8105882edfad019dee68a3bd83 100644 (file)
 
 /*----- Header files ------------------------------------------------------*/
 
-#include "bits.h"
 #include "tvec.h"
+#include "tvec-types.h"
+
+#include "bits.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -38,8 +40,19 @@ enum {
   RN = RY
 };
 
-#define TSHIFT(OP)                                                     \
-  static void test_##OP(const struct tvec_reg *in, struct tvec_reg *out, \
+static const struct tvec_urange ur_eight = { 8, 8 };
+static const struct tvec_urange ur_shift = { 0, 63 };
+
+static const struct tvec_regdef shift_regs[] = {
+  { "x",       &tvty_bytes,    RX,     0,              { &ur_eight } },
+  { "n",       &tvty_uint,     RN,     0,              { &ur_shift } },
+  { "z",       &tvty_bytes,    RZ,     0,              { &ur_eight } },
+  TVEC_ENDREGS
+};
+
+#define SHIFTOPS(_) _(lsl, LSL) _(lsr, LSR) _(rol, ROL) _(ror, ROR)
+#define TSHIFT(op, OP)                                                 \
+  static void test_##op(const struct tvec_reg *in, struct tvec_reg *out, \
                        void *ctx)                                      \
   {                                                                    \
     kludge64 x;                                                                \
@@ -48,10 +61,22 @@ enum {
     OP##64_(x, x, in[RN].v.u);                                         \
     tvec_allocbytes(&out[RZ].v, 8);                                    \
     STORE64_(out[RZ].v.bytes.p, x);                                    \
-  }
+  }                                                                    \
+  static const struct tvec_test op##_test =                            \
+    { #op "64", shift_regs, 0, test_##op };
+SHIFTOPS(TSHIFT)
+#undef TSHIFT
 
-#define TARITH(OP)                                                     \
-  static void test_##OP(const struct tvec_reg *in, struct tvec_reg *out, \
+static const struct tvec_regdef arith_regs[] = {
+  { "x",       &tvty_bytes,    RX,     0,              { &ur_eight } },
+  { "y",       &tvty_bytes,    RY,     0,              { &ur_eight } },
+  { "z",       &tvty_bytes,    RZ,     0,              { &ur_eight } },
+  TVEC_ENDREGS
+};
+
+#define ARITHOPS(_) _(add, ADD) _(sub, SUB)
+#define TARITH(op, OP)                                                 \
+  static void test_##op(const struct tvec_reg *in, struct tvec_reg *out, \
                        void *ctx)                                      \
   {                                                                    \
     kludge64 x, y;                                                     \
@@ -60,38 +85,19 @@ enum {
     OP##64(x, x, y);                                                   \
     tvec_allocbytes(&out[RZ].v, 8);                                    \
     STORE64_(out[RZ].v.bytes.p, x);                                    \
-  }
-
-TSHIFT(LSL)
-TSHIFT(LSR)
-TSHIFT(ROL)
-TSHIFT(ROR)
-TARITH(ADD)
-TARITH(SUB)
+  }                                                                    \
+  static const struct tvec_test op##_test =                            \
+    { #op "64", arith_regs, 0, test_##op };
 
-static const struct tvec_urange ur_eight = { 8, 8 };
-static const struct tvec_urange ur_shift = { 0, 63 };
-static const struct tvec_regdef shift_regs[] = {
-  { "x",       &tvty_bytes,    RX,     0,              { &ur_eight } },
-  { "n",       &tvty_uint,     RN,     0,              { &ur_shift } },
-  { "z",       &tvty_bytes,    RZ,     0,              { &ur_eight } },
-  TVEC_ENDREGS
-};
-static const struct tvec_regdef arith_regs[] = {
-  { "x",       &tvty_bytes,    RX,     0,              { &ur_eight } },
-  { "y",       &tvty_bytes,    RY,     0,              { &ur_eight } },
-  { "z",       &tvty_bytes,    RZ,     0,              { &ur_eight } },
-  TVEC_ENDREGS
-};
+ARITHOPS(TARITH)
+#undef TARITH
 
-static const struct tvec_test tests[] = {
-  { "lsl64",   shift_regs,     0,              test_LSL },
-  { "lsr64",   shift_regs,     0,              test_LSR },
-  { "rol64",   shift_regs,     0,              test_ROL },
-  { "ror64",   shift_regs,     0,              test_ROR },
-  { "add64",   arith_regs,     0,              test_ADD },
-  { "sub64",   arith_regs,     0,              test_SUB },
-  TVEC_ENDTESTS
+static const struct tvec_test *const tests[] = {
+#define TESTENT(op, OP) &op##_test,
+  SHIFTOPS(TESTENT)
+  ARITHOPS(TESTENT)
+#undef TESTENT
+  0
 };
 
 static const struct tvec_config testconfig =
index 44c4d2fb90a9c66f1fcfc4656d1978bcb844026e..badb9035ab2c1f1f79496758a9f1c3225cf99add 100644 (file)
 
 #include "control.h"
 #include "report.h"
+
 #include "tvec.h"
+#include "tvec-adhoc.h"
+#include "tvec-types.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -57,13 +60,12 @@ static int step;
 
 int main(int argc, char *argv[])
 {
-  struct tvec_test test;
   int argpos;
   int i;
 
   tvec_parseargs(argc, argv, &tvstate, &argpos, &tvec_adhocconfig);
   if (argpos < argc) die(2, "no input files expected");
-  tvec_adhoc(&tvstate, &test);
+  tvec_adhoc(&tvstate);
 
   TESTGROUP("before-after") {
     MC_BEFORE(before0, STEP(0)) STEP(1);
diff --git a/utils/t/fltfmt-test.c b/utils/t/fltfmt-test.c
new file mode 100644 (file)
index 0000000..76e1d41
--- /dev/null
@@ -0,0 +1,556 @@
+/* -*-c-*-
+ *
+ * Test for floating-point conversions
+ *
+ * (c) 2024 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the mLib utilities library.
+ *
+ * mLib is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * mLib is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with mLib.  If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include "config.h"
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "fltfmt.h"
+#include "maths.h"
+#include "tvec.h"
+#include "tvec-remote.h"
+#include "tvec-types.h"
+
+/*----- Register allocation -----------------------------------------------*/
+
+enum {
+  RERR_OUT,
+  RF_OUT,      RZ_OUT = RF_OUT,
+  RE_OUT,
+  RM_OUT,
+  NROUT,
+
+  RF = NROUT,  RX = RF,
+  RE,
+  RM,
+
+  RN,
+  RROUND,
+  RERRMASK,
+
+  NREG
+};
+
+/*----- Type definitions --------------------------------------------------*/
+
+static const struct tvec_flag flterr_flags[] = {
+  { "OK",              FLTERR_ALLERRS, FLTERR_OK },
+  { "ALLERRS",         FLTERR_ALLERRS, FLTERR_ALLERRS },
+  { "INVAL",           FLTERR_INVAL,   FLTERR_INVAL },
+  { "INEXACT",         FLTERR_INEXACT, FLTERR_INEXACT },
+  { "UFLOW",           FLTERR_UFLOW,   FLTERR_UFLOW },
+  { "OFLOW",           FLTERR_OFLOW,   FLTERR_OFLOW },
+  { "REPR",            FLTERR_REPR,    FLTERR_REPR },
+  TVEC_ENDFLAGS
+};
+static const struct tvec_flaginfo flterr_flaginfo =
+  { "flterr", flterr_flags, &tvrange_uint };
+static const struct tvec_flaginfo flterrmask_flaginfo =
+  { "flterrmask", flterr_flags + 1, &tvrange_uint };
+
+static const struct tvec_flag fltrnd_flags[] = {
+
+  /* Standard rounding modes. */
+  { "zero",            0xffff,         FLTRND_ZERO },
+  { "projinf",         0xffff,         FLTRND_PROJINF },
+  { "posinf",          0xffff,         FLTRND_POSINF },
+  { "neginf",          0xffff,         FLTRND_NEGINF },
+  { "odd",             0xffff,         FLTRND_ODD },
+  { "even",            0xffff,         FLTRND_EVEN },
+  { "nearest-even",    0xffff,         FLTRND_NEAREVEN },
+  { "nearest-odd",     0xffff,         FLTRND_NEARODD },
+  { "nearest-zero",    0xffff,         FLTRND_NEARZERO },
+  { "nearest-projinf", 0xffff,         FLTRND_NEARINF },
+  { "nearest-neginf",  0xffff,         FLTRND_NEARNEG },
+  { "nearest-posinf",  0xffff,         FLTRND_NEARPOS },
+
+  /* Rounding mode bits: rounds away from zero in the listed conditions.
+   * The notation corresponds to rounding predicates as follows.  The syntax
+   * is `<s><u>.<h><r>' where
+   *
+   *   var     bit     clear   set
+   *   <s>     @NEG@   %|+|%   %|-|%
+   *   <u>     @ODD@   %|0|%   %|1|%
+   *   <h>     @HALF@  %|0|%   %|1|%
+   *   <r>     @LOW@   %|0|%   %|1|%
+   */
+  { "+0.00",           0x0001,         0x0001 },
+  { "+0.01",           0x0002,         0x0002 },
+  { "+0.10",           0x0004,         0x0004 },
+  { "+0.11",           0x0008,         0x0008 },
+  { "+1.00",           0x0010,         0x0010 },
+  { "+1.01",           0x0020,         0x0020 },
+  { "+1.10",           0x0040,         0x0040 },
+  { "+1.11",           0x0080,         0x0080 },
+  { "-0.00",           0x0100,         0x0100 },
+  { "-0.01",           0x0200,         0x0200 },
+  { "-0.10",           0x0400,         0x0400 },
+  { "-0.11",           0x0800,         0x0800 },
+  { "-1.00",           0x1000,         0x1000 },
+  { "-1.01",           0x2000,         0x2000 },
+  { "-1.10",           0x4000,         0x4000 },
+  { "-1.11",           0x8000,         0x8000 },
+
+  /* Phew! */
+  TVEC_ENDFLAGS
+};
+static const struct tvec_flaginfo fltrnd_flaginfo =
+  { "fltrnd", fltrnd_flags, &tvrange_u16 };
+
+static const struct tvec_flag floatbits_flags[] = {
+  { "NEG",             FLTF_NEG,       FLTF_NEG },
+  { "INF",             FLTF_INF,       FLTF_INF },
+  { "QNAN",            FLTF_QNAN,      FLTF_QNAN },
+  { "SNAN",            FLTF_SNAN,      FLTF_SNAN },
+  { "ZERO",            FLTF_ZERO,      FLTF_ZERO },
+  TVEC_ENDFLAGS
+};
+static const struct tvec_flaginfo floatbits_flaginfo =
+  { "floatbits-flags", floatbits_flags, &tvrange_uint };
+
+static const struct tvec_urange frac_range = { 0, UINT_MAX, 4, 0 };
+
+/*----- Test utilities ----------------------------------------------------*/
+
+#define DEFAULT_REG(rix, set) do {                                     \
+  unsigned _rix = (rix);                                               \
+  struct tvec_reg *_inr = &tv->in[_rix], *_outr = &tv->out[_rix];      \
+  union tvec_regval *rv = &_inr->v;                                    \
+                                                                       \
+  if (!(_inr->f&TVRF_LIVE)) {                                          \
+    set; _inr->f |= TVRF_LIVE;                                         \
+    if (_rix < NROUT) _outr->f |= TVRF_LIVE;                           \
+  }                                                                    \
+} while (0)
+
+static void get_floatbits(struct floatbits *z_out, const struct tvec_reg *in)
+{
+  const unsigned char *p;
+  unsigned i, n;
+
+  z_out->f = in[RF].v.u;
+  if (in[RE].f&TVRF_LIVE) z_out->exp = in[RE].v.i;
+  if (in[RM].f&TVRF_LIVE) {
+    n = in[RM].v.bytes.sz/4; fltfmt_allocfrac(z_out, n);
+    for (p = in[RM].v.bytes.p, i = 0; i < n; p += 4, i++)
+      z_out->frac[i] = LOAD32(p);
+  }
+}
+
+static void put_floatbits(struct tvec_reg *out, const struct floatbits *x)
+{
+  unsigned char *p;
+  unsigned i;
+
+  out[RF_OUT].v.u = x->f; out[RF_OUT].f |= TVRF_LIVE;
+  out[RE_OUT].v.i = x->exp; out[RE_OUT].f |= TVRF_LIVE;
+  if (x->n) {
+    tvec_allocbytes(&out[RM_OUT].v, 4*x->n);
+    for (p = out[RM_OUT].v.bytes.p, i = 0; i < x->n; p += 4, i++)
+      STORE32(p, x->frac[i]);
+  }
+  out[RM_OUT].f |= TVRF_LIVE;
+}
+
+/*----- Utilities ---------------------------------------------------------*/
+
+static const struct tvec_regdef round_regs[] = {
+  { "round",   &tvty_flags,    RROUND, 0,      { &fltrnd_flaginfo } },
+  { "n",       &tvty_uint,     RN,     0,      { &tvrange_uint } },
+  { "f",       &tvty_flags,    RF,     0,      { &floatbits_flaginfo } },
+  { "e",       &tvty_int,      RE,     TVRF_OPT, { &tvrange_int } },
+  { "m",       &tvty_bytes,    RM,     TVRF_OPT, { &frac_range } },
+  { "ff",      &tvty_flags,    RF_OUT, 0,      { &floatbits_flaginfo } },
+  { "ee",      &tvty_int,      RE_OUT, TVRF_OPT, { &tvrange_int } },
+  { "mm",      &tvty_bytes,    RM_OUT, TVRF_OPT, { &frac_range } },
+  { "err",     &tvty_flags,    RERR_OUT, 0,    { &flterr_flaginfo } },
+  TVEC_ENDREGS
+};
+
+static void test_round(const struct tvec_reg *in, struct tvec_reg *out,
+                      void *ctx)
+{
+  struct floatbits x = FLOATBITS_INIT, z = FLOATBITS_INIT;
+
+  get_floatbits(&x, in);
+  out[RERR_OUT].v.u = fltfmt_round(&z, &x, in[RROUND].v.u, in[RN].v.u);
+  put_floatbits(out, &z); fltfmt_freebits(&x); fltfmt_freebits(&z);
+}
+
+static const struct tvec_test round_test =
+  { "round", round_regs, 0, test_round };
+
+/*----- IEEE format conversion --------------------------------------------*/
+
+#define IEEE_FORMATS(_)                                                        \
+  _(mini, 1)                                                           \
+  _(bf16, 2)                                                           \
+  _(f16, 2)                                                            \
+  _(f32, 4)                                                            \
+  _(f64, 8)                                                            \
+  _(f128, 16)                                                          \
+  _(idblext80, 10)
+
+#define DECLS_mini     octet y = 0
+#define OUTSZ_mini     1
+#define LOAD_mini      y = LOAD8(in[RX].v.bytes.p)
+#define STORE_mini     STORE8(out[RZ_OUT].v.bytes.p, y)
+#define ENCARGS_mini   &y
+#define DECARGS_mini   y
+
+#define DECLS_bf16     uint16 y = 0
+#define OUTSZ_bf16     2
+#define LOAD_bf16      y = LOAD16_B(in[RX].v.bytes.p)
+#define STORE_bf16     STORE16_B(out[RZ_OUT].v.bytes.p, y)
+#define ENCARGS_bf16   &y
+#define DECARGS_bf16   y
+
+#define DECLS_f16      uint16 y = 0
+#define OUTSZ_f16      2
+#define LOAD_f16       y = LOAD16_B(in[RX].v.bytes.p)
+#define STORE_f16      STORE16_B(out[RZ_OUT].v.bytes.p, y)
+#define ENCARGS_f16    &y
+#define DECARGS_f16    y
+
+#define DECLS_f32      uint32 y = 0
+#define OUTSZ_f32      4
+#define LOAD_f32       y = LOAD32_B(in[RX].v.bytes.p)
+#define STORE_f32      STORE32_B(out[RZ_OUT].v.bytes.p, y)
+#define ENCARGS_f32    &y
+#define DECARGS_f32    y
+
+#define DECLS_f64      kludge64 y = { 0 }
+#define OUTSZ_f64      8
+#define LOAD_f64       LOAD64_B_(y, in[RX].v.bytes.p)
+#define STORE_f64      STORE64_B_(out[RZ_OUT].v.bytes.p, y)
+#define ENCARGS_f64    &y
+#define DECARGS_f64    y
+
+#define DECLS_f128     uint32 yv[4] = { 0 }; unsigned i
+#define OUTSZ_f128     16
+#define LOAD_f128      for (i = 0; i < 4; i++)                         \
+                         yv[i] = LOAD32_B(in[RX].v.bytes.p + 4*i)
+#define STORE_f128     for (i = 0; i < 4; i++)                         \
+                         STORE32_B(out[RZ_OUT].v.bytes.p + 4*i, yv[i])
+#define ENCARGS_f128   yv
+#define DECARGS_f128   yv
+
+#define DECLS_idblext80        uint16 se = 0; kludge64 f = { 0 }
+#define OUTSZ_idblext80        10
+#define LOAD_idblext80 se = LOAD16_B(in[RX].v.bytes.p + 0);            \
+                       LOAD64_B_(f, in[RX].v.bytes.p + 2)
+#define STORE_idblext80        STORE16_B(out[RZ_OUT].v.bytes.p + 0, se);       \
+                       STORE64_B_(out[RZ_OUT].v.bytes.p + 2, f)
+#define ENCARGS_idblext80 &se, &f
+#define DECARGS_idblext80 se, f
+
+#define DEF_RANGE(ty, sz)                                              \
+  static const struct tvec_urange ty##_range = { sz, sz, 0, 0 };
+IEEE_FORMATS(DEF_RANGE)
+#undef DEF_RANGE
+
+static void before_encieee(struct tvec_state *tv, void *ctx)
+{
+  DEFAULT_REG(RROUND, rv->u = FLTRND_NEAREVEN);
+  DEFAULT_REG(RERRMASK, rv->u = FLTERR_ALLERRS);
+  DEFAULT_REG(RERR_OUT, rv->u = FLTERR_OK);
+}
+static struct tvec_env encieee_env = { 0, 0, 0, before_encieee, 0, 0, 0 };
+
+static void before_decieee(struct tvec_state *tv, void *ctx)
+  { DEFAULT_REG(RERR_OUT, rv->u = FLTERR_OK); }
+static struct tvec_env decieee_env = { 0, 0, 0, before_decieee, 0, 0, 0 };
+
+#define DEF_TEST(ty, sz)                                               \
+                                                                       \
+  static const struct tvec_regdef enc##ty##_regs[] = {                 \
+    { "round", &tvty_flags,    RROUND, TVRF_OPT, { &fltrnd_flaginfo } }, \
+    { "errmask", &tvty_flags,  RERRMASK, TVRF_OPT,                     \
+                                           { &flterrmask_flaginfo } }, \
+    { "f",     &tvty_flags,    RF,    TVRF_OPT, { &floatbits_flaginfo } }, \
+    { "e",     &tvty_int,      RE,     TVRF_OPT, { &tvrange_int } },   \
+    { "m",     &tvty_bytes,    RM,     TVRF_OPT, { &frac_range } },    \
+    { "z",     &tvty_bytes,    RZ_OUT, 0,      { &ty##_range } },      \
+    { "err",   &tvty_flags,    RERR_OUT, TVRF_OPT, { &flterr_flaginfo } }, \
+    TVEC_ENDREGS                                                       \
+  };                                                                   \
+                                                                       \
+  static void test_enc##ty(const struct tvec_reg *in, struct tvec_reg *out, \
+                          void *ctx)                                   \
+  {                                                                    \
+    struct floatbits x = FLOATBITS_INIT;                               \
+    DECLS_##ty;                                                                \
+                                                                       \
+    get_floatbits(&x, in);                                             \
+    out[RERR_OUT].v.u =                                                        \
+      fltfmt_enc##ty(ENCARGS_##ty, &x, in[RROUND].v.u, in[RERRMASK].v.u); \
+    tvec_allocbytes(&out[RZ_OUT].v, OUTSZ_##ty); STORE_##ty;           \
+    fltfmt_freebits(&x);                                               \
+  }                                                                    \
+                                                                       \
+  static const struct tvec_test enc##ty##_test =                       \
+    { "enc" #ty, enc##ty##_regs, &encieee_env, test_enc##ty };         \
+                                                                       \
+  static const struct tvec_regdef dec##ty##_regs[] = {                 \
+    { "x",     &tvty_bytes,    RX,     0,      { &ty##_range } },      \
+    { "f",     &tvty_flags,    RF_OUT, 0,      { &floatbits_flaginfo } }, \
+    { "e",     &tvty_int,      RE_OUT, TVRF_OPT, { &tvrange_int } },   \
+    { "m",     &tvty_bytes,    RM_OUT, TVRF_OPT, { &frac_range } },    \
+    { "err",   &tvty_flags,    RERR_OUT, TVRF_OPT, { &flterr_flaginfo } }, \
+    TVEC_ENDREGS                                                       \
+  };                                                                   \
+                                                                       \
+  static void test_dec##ty(const struct tvec_reg *in, struct tvec_reg *out, \
+                          void *ctx)                                   \
+  {                                                                    \
+    struct floatbits z = FLOATBITS_INIT;                               \
+    DECLS_##ty;                                                                \
+                                                                       \
+    LOAD_##ty; out[RERR_OUT].v.u = fltfmt_dec##ty(&z, DECARGS_##ty);   \
+    put_floatbits(out, &z); fltfmt_freebits(&z);                       \
+  }                                                                    \
+                                                                       \
+  static const struct tvec_test dec##ty##_test =                       \
+    { "dec" #ty, dec##ty##_regs, &decieee_env, test_dec##ty };
+
+IEEE_FORMATS(DEF_TEST)
+
+#undef DEF_TEST
+
+#define DEF_IEEE_TEST(ty, sz) &enc##ty##_test, &dec##ty##_test,
+#define IEEE_TESTS IEEE_FORMATS(DEF_IEEE_TEST)
+
+/*----- Native format conversion ------------------------------------------*/
+
+#define NATIVE_FORMATS(_)                                              \
+  _(flt, float, FLT)                                                   \
+  _(dbl, double, DBL)
+
+enum {
+#define DEF_ENUM(ty, cty, TY) NTV_##TY,
+  NATIVE_FORMATS(DEF_ENUM)
+#undef DEF_ENUM
+  NTV_NFMT
+};
+
+static const struct ntvinfo {
+  unsigned fmt;
+  unsigned mant_dig;
+} ntvinfo[] = {
+#define DEF_INFO(ty, cty, TY) { TY##_FORMAT, TY##_MANT_DIG },
+  NATIVE_FORMATS(DEF_INFO)
+#undef DEF_INFO
+};
+
+#define AF_NEGZ 0x0001u
+#define AF_INF 0x0002u
+#define AF_STDCNAN 0x0004u
+#define AF_IEEE 0x0008u
+#define AF_PREC24 0x0010u
+#define AF_PREC53 0x0020u
+#define AF_PREC64 0x0040u
+#define AF_PREC113 0x0080u
+
+static const struct tvec_flag assume_flags[] = {
+  { "negz",            AF_NEGZ,        AF_NEGZ },
+  { "inf",             AF_INF,         AF_INF },
+  { "stdc-nan",                AF_STDCNAN,     AF_STDCNAN },
+  { "ieee",            AF_IEEE,        AF_IEEE },
+  { "prec24",          AF_PREC24,      AF_PREC24 },
+  { "prec53",          AF_PREC53,      AF_PREC53 },
+  { "prec64",          AF_PREC64,      AF_PREC64 },
+  { "prec113",         AF_PREC113,     AF_PREC113 },
+  TVEC_ENDFLAGS
+};
+static const struct tvec_flaginfo assume_flaginfo =
+  { "assume", assume_flags, &tvrange_uint };
+
+struct nativeenv { struct tvec_env _env; unsigned ntv; };
+struct nativectx { unsigned af, want; };
+
+static void setup_native(struct tvec_state *tv, const struct tvec_env *env,
+                        void *pctx, void *ctx)
+{
+  const struct nativeenv *nenv = (const struct nativeenv *)env;
+  const struct ntvinfo *info = &ntvinfo[nenv->ntv];
+  struct nativectx *nctx = ctx;
+  double prec;
+
+  switch (info->fmt&(FLTFMT_ORGMASK | FLTFMT_TYPEMASK)) {
+    case FLTFMT_IEEE_F32:
+      nctx->af = AF_NEGZ | AF_INF | AF_IEEE | AF_PREC24;
+      break;
+    case FLTFMT_IEEE_F64:
+      nctx->af = AF_NEGZ | AF_INF | AF_IEEE | AF_PREC24 | AF_PREC53;
+      break;
+    case FLTFMT_IEEE_F128:
+      nctx->af = AF_NEGZ | AF_INF | AF_IEEE |
+                AF_PREC24 | AF_PREC53 | AF_PREC64 | AF_PREC113;
+      break;
+    case FLTFMT_INTEL_F80:
+      nctx->af = AF_NEGZ | AF_INF | AF_IEEE |
+                AF_PREC24 | AF_PREC53 | AF_PREC64;
+      break;
+    default:
+      nctx->af = 0;
+      if (NEGP(-0.0)) nctx->af |= AF_NEGZ;
+#ifdef INF
+      nctx->af |= AF_INF;
+#endif
+#ifdef NAN
+      nctx->af |= AF_STDCNAN;
+#endif
+      prec = log(FLT_RADIX)/log(2.0)*info->mant_dig;
+      if (prec >= 24) nctx->af |= AF_PREC24;
+      if (prec >= 53) nctx->af |= AF_PREC53;
+      if (prec >= 64) nctx->af |= AF_PREC64;
+      if (prec >= 113) nctx->af |= AF_PREC113;
+      break;
+  }
+  nctx->want = 0;
+}
+
+static int setvar_native(struct tvec_state *tv, const char *var,
+                        const union tvec_regval *rv, void *ctx)
+{
+  struct nativectx *nctx = ctx;
+
+  if (STRCMP(var, ==, "@assume")) nctx->want = rv->u;
+  else return (tvec_unkregerr(tv, var));
+  return (0);
+}
+static const struct tvec_vardef assume_vardef =
+  { sizeof(struct tvec_reg), setvar_native,
+    { "@assume", &tvty_flags, 0, 0, { &assume_flaginfo } }};
+static const struct tvec_vardef *findvar_native
+  (struct tvec_state *tv, const char *name, void **ctx_out, void *ctx)
+{
+  if (STRCMP(name, ==, "@assume"))
+    { *ctx_out = ctx; return (&assume_vardef); }
+  else
+    return (0);
+}
+
+static void before_native(struct tvec_state *tv, void *ctx)
+{
+  struct nativectx *nctx = ctx;
+
+  if (nctx->want&~nctx->af)
+    tvec_skip(tv, "unsatisfied assumption");
+  else {
+    DEFAULT_REG(RROUND, rv->u = FLTRND_NEAREVEN);
+    DEFAULT_REG(RERR_OUT, rv->u = FLTERR_OK);
+  }
+}
+
+static void after_native(struct tvec_state *tv, void *ctx)
+{
+  struct nativectx *nctx = ctx;
+
+  nctx->want = 0;
+}
+
+#define DEF_TEST(ty, cty, TY)                                          \
+                                                                       \
+  static struct nativeenv ty##_env =                                   \
+    { { sizeof(struct nativectx),                                      \
+       setup_native, findvar_native, before_native, 0, after_native, 0 }, \
+      NTV_##TY };                                                      \
+                                                                       \
+  static const struct tvec_regdef enc##ty##_regs[] = {                 \
+    { "round", &tvty_flags,    RROUND, TVRF_OPT, { &fltrnd_flaginfo } }, \
+    { "f",     &tvty_flags,    RF,     0,      { &floatbits_flaginfo } }, \
+    { "e",     &tvty_int,      RE,     TVRF_OPT, { &tvrange_int } },   \
+    { "m",     &tvty_bytes,    RM,     TVRF_OPT, { &frac_range } },    \
+    { "z",     &tvty_float,    RZ_OUT, 0,      { &tvflt_##cty } },     \
+    { "err",   &tvty_flags,    RERR_OUT, TVRF_OPT, { &flterr_flaginfo } }, \
+    TVEC_ENDREGS                                                       \
+  };                                                                   \
+                                                                       \
+  static void test_enc##ty(const struct tvec_reg *in, struct tvec_reg *out, \
+                          void *ctx)                                   \
+  {                                                                    \
+    struct floatbits x = FLOATBITS_INIT;                               \
+    cty z;                                                             \
+                                                                       \
+    get_floatbits(&x, in);                                             \
+    out[RERR_OUT].v.u = fltfmt_enc##ty(&z, &x, in[RROUND].v.u);                \
+    out[RZ_OUT].v.f = z; fltfmt_freebits(&x);                          \
+  }                                                                    \
+                                                                       \
+  static const struct tvec_test enc##ty##_test =                       \
+    { "enc" #ty, enc##ty##_regs, &ty##_env._env, test_enc##ty };       \
+                                                                       \
+  static const struct tvec_regdef dec##ty##_regs[] = {                 \
+    { "x",     &tvty_float,    RX,     0,      { &tvflt_##cty } },     \
+    { "round", &tvty_flags,    RROUND, TVRF_OPT, { &fltrnd_flaginfo } }, \
+    { "f",     &tvty_flags,    RF_OUT, 0,      { &floatbits_flaginfo } }, \
+    { "e",     &tvty_int,      RE_OUT, TVRF_OPT, { &tvrange_int } },   \
+    { "m",     &tvty_bytes,    RM_OUT, TVRF_OPT, { &frac_range } },    \
+    { "err",   &tvty_flags,    RERR_OUT, TVRF_OPT, { &flterr_flaginfo } }, \
+    TVEC_ENDREGS                                                       \
+  };                                                                   \
+                                                                       \
+  static void test_dec##ty(const struct tvec_reg *in, struct tvec_reg *out, \
+                          void *ctx)                                   \
+  {                                                                    \
+    struct floatbits z = FLOATBITS_INIT;                               \
+                                                                       \
+    out[RERR_OUT].v.u = fltfmt_dec##ty(&z, in[RX].v.f, in[RROUND].v.u);        \
+    put_floatbits(out, &z); fltfmt_freebits(&z);                       \
+  }                                                                    \
+                                                                       \
+  static const struct tvec_test dec##ty##_test =                       \
+    { "dec" #ty, dec##ty##_regs, &ty##_env._env, test_dec##ty };
+
+NATIVE_FORMATS(DEF_TEST)
+
+#undef DEF_TEST
+
+#define DEF_NATIVE_TEST(ty, cty, TY) &enc##ty##_test, &dec##ty##_test,
+#define NATIVE_TESTS NATIVE_FORMATS(DEF_NATIVE_TEST)
+
+/*----- Main code ---------------------------------------------------------*/
+
+static const struct tvec_test *const tests[] = {
+  &round_test,
+  NATIVE_TESTS
+  IEEE_TESTS
+  0
+};
+
+static const struct tvec_config testconfig =
+  { tests, NROUT, NREG, sizeof(struct tvec_reg) };
+
+int main(int argc, char *argv[])
+  { return (tvec_main(argc, argv, &testconfig, 0)); }
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/utils/t/fltfmt-testgen b/utils/t/fltfmt-testgen
new file mode 100755 (executable)
index 0000000..7f63664
--- /dev/null
@@ -0,0 +1,449 @@
+#! /usr/bin/python
+###
+### Generate exhaustive tests for floating-point conversions.
+###
+### (c) 2024 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the mLib utilities library.
+###
+### mLib is free software: you can redistribute it and/or modify it under
+### the terms of the GNU Library General Public License as published by
+### the Free Software Foundation; either version 2 of the License, or (at
+### your option) any later version.
+###
+### mLib is distributed in the hope that it will be useful, but WITHOUT
+### ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+### FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+### License for more details.
+###
+### You should have received a copy of the GNU Library General Public
+### License along with mLib.  If not, write to the Free Software
+### Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+### USA.
+
+###--------------------------------------------------------------------------
+### Imports.
+
+import sys as SYS
+import optparse as OP
+import random as R
+if SYS.version_info >= (3,):
+  from io import StringIO
+  xrange = range
+  def iterkeys(d): return d.keys()
+else:
+  from cStringIO import StringIO
+  def iterkeys(d): return d.iterkeys()
+
+###--------------------------------------------------------------------------
+### Utilities.
+
+def bit(k): "Return an integer with just bit K set."; return 1 << k
+def mask(k): "Return an integer with bits 0 to K - 1 set."; return bit(k) - 1
+M32 = mask(32)
+
+def explore(wd, lobits, hibits):
+  """
+  Return an iterator over various WD-bit values.
+
+  Suppose that a test wants to explore various WD-bit fields, but WD might be
+  too large to do this exhaustively.  We assume (reasonably, in the case at
+  hand of floating-point formats) that the really interesting bits are those
+  at the low and high ends of the field, and test small subfields at the ends
+  exhaustively, filling in the bits in the middle with zeros, ones, or random
+  data.
+
+  So, the generator behaves as follows.  If WD <= LOBITS + HIBITS + 1 then
+  the iterator will yield all WD-bit values exhaustively.  Otherwise, it
+  yields a sequence which includes all combinations of: every LOBITS-bit
+  pattern in the least significant bits; every HIBITS-bit pattern in the most
+  significant bits; and all-bits-clear, all-bits-set, and a random pattern in
+  the bits in between.
+  """
+
+  if wd <= hibits + lobits + 1:
+    for i in xrange(bit(wd)): yield i
+  else:
+    midbit = bit(wd - hibits - lobits)
+    hishift = wd - hibits
+    m = (midbit - 1) << lobits
+    for hi in xrange(bit(hibits)):
+      top = hi << hishift
+      for lo in xrange(bit(lobits)):
+        base = lo | top
+        yield base
+        yield base | (R.randrange(midbit) << lobits)
+        yield base | m
+
+class ExploreParameters (object):
+  """
+  Simple structure for exploration parameters; see `explore' for background.
+
+  The `explo' and `exphi' attributes are the low and high subfield sizes
+  for exponent fields, and `siglo' and `sighi' are the low and high subfield
+  sizes for significand fields.
+  """
+  def __init__(me, explo = 0, exphi = 2, siglo = 1, sighi = 3):
+    me.explo, me.exphi = explo, exphi
+    me.siglo, me.sighi = siglo, sighi
+
+FMTMAP = {} # maps format names to classes
+
+def with_metaclass(meta, *supers):
+  """
+  Return an arbitrary instance of the metaclass META.
+
+  The class will have SUPERS (default just `object') as its superclasses.
+  This is intended to be used in direct-superclass lists, as a compatibility
+  hack, because the Python 2 and 3 syntaxes are wildly different.
+  """
+  return meta("#<anonymous base %s>" % meta.__name__,
+              supers or (object,), dict())
+
+class FormatClass (type):
+  """
+  Metaclass for format classes.
+
+  If the class defines a `NAME' attribute then register the class in
+  `FMTMAP'.
+  """
+  def __new__(cls, name, supers, dict):
+    c = type.__new__(cls, name, supers, dict)
+    try: FMTMAP[c.NAME] = c
+    except AttributeError: pass
+    return c
+
+class IEEEFormat (with_metaclass(FormatClass)):
+  """
+  Floating point format class.
+
+  Concrete subclasses must define the following class attributes.
+
+    * `HIDDENP' -- true if the format uses a `hidden bit' convention for
+      normal numbers.
+
+    * `EXPWD' -- exponent field width, in bits.
+
+    * `PREC' -- precision, in bits, /including/ the hidden bit if any.
+
+  Many useful quantities are derived.
+
+    * `_expbias' is the exponent bias.
+
+    * `_minexp' and `_maxexp' are the minimum and maximum representable
+      exponents.
+
+    * `_sigwd' is the width of the significand field.
+
+    * `_paywords' is the number of words required to represent a NaN payload.
+
+    * `_nbits' is the total number of bits in an encoded value.
+
+    * `_rawbytes' is the number of bytes required for an encoded value.
+  """
+
+  def __init__(me):
+    """
+    Initialize an instance.
+    """
+    me._expbias = mask(me.EXPWD - 1)
+    me._maxexp = me._expbias
+    me._minexp = 1 - me._expbias
+    if me.HIDDENP: me._sigwd = me.PREC - 1
+    else: me._sigwd = me.PREC
+
+    me._paywords = (me._sigwd + 29)//32
+
+    me._nbits = 1 + me.EXPWD + me._sigwd
+    me._rawbytes = (me._nbits + 7)//8
+
+  def decode(me, x):
+    """
+    Decode the encoded floating-point value X, represented as an integer.
+
+    Return five quantities (FLAGS, EXP, FW, FRAC, ERR), corresponding mostly
+    to the `struct floatbits' representation, characterizing the value
+    encoded in X.
+
+      * FLAGS is a list of flag tokens:
+
+         -- `NEG' if the value is negative;
+         -- `ZERO' if the value is exactly zero;
+         -- `INF' if the value is infinite;
+         -- `SNAN' if the value is a signalling NaN; and/or
+         -- `QNAN' if the value is a quiet NaN.
+
+        FLAGS will be empty if the value is a strictly positive finite
+        number.
+
+      * EXP is the exponent, as a signed integer.  This will be `None' if the
+        value is zero, infinite, or a NaN.
+
+      * FW is the length of the fraction, in 32-bit words.  This will be
+        `None' if the value is zero or infinite.
+
+      * FRAC is the fraction or payload.  This will be `None' if the value is
+        zero or infinite; otherwise it will be an integer, 0 <= FRAC <
+        2^{32FW}.  If the value is a NaN, then the FRAC represents the
+        payload, /not/ including the quiet bit, left aligned.  Otherwise,
+        FRAC is normalized so that 2^{32FW-1} <= FRAC < 2^{32FW}, and the
+        value represented is S FRAC 2^{EXP-32FW}, where S = -1 if `NEG' is in
+        FLAGS, or +1 otherwise.  The represented value is unchanged by
+        multiplying or dividing FRAC by an exact power of 2^{32} and
+        (respectively) incrementing or decrementing FW to match, but this
+        will affect the output data in a way that affects the tests.
+
+      * ERR is a list of error tokens:
+
+          -- `INVAL' if the encoded value is erroneous (though decoding
+             continues anyway).
+
+        ERR will be empty if no error occurred.
+    """
+
+    ## Extract fields.
+    sig = x&mask(me._sigwd)
+    biasedexp = (x >> me._sigwd)&mask(me.EXPWD)
+    signbit = (x >> (me._sigwd + me.EXPWD))&1
+    if not me.HIDDENP: unitbit = sig >> me.PREC - 1
+
+    ## Initialize flag lists.
+    flags = []
+    err = []
+
+    ## Capture the sign.  This is always relevant.
+    if signbit: flags.append("NEG")
+
+    ## If the exponent field is all-bits-set then we have infinity or NaN.
+    if biasedexp == mask(me.EXPWD):
+
+      ## If there's no hidden bit then the unit bit should be /set/, but is
+      ## /not/ part of the NaN payload -- or even significant for
+      ## distinguishing a NaN from an infinity.  If it's clear, signal an
+      ## error; if it's set, then clear it so that we don't have to think
+      ## about it again.
+      if not me.HIDDENP:
+        if unitbit: sig &= mask(me._sigwd - 1)
+        else: err.append("INVAL")
+
+      ## If the significand is (now) zero, we have an infinity and there's
+      ## nothing else to do.
+      if not sig:
+        flags.append("INF")
+        frac = fw = exp = None
+
+      ## Otherwise determine the NaN flavour and extract the payload.
+      else:
+        if sig&bit(me.PREC - 2): flags.append("QNAN")
+        else: flags.append("SNAN")
+        shift = 32*me._paywords + 2 - me.PREC
+        frac = (sig&mask(me.PREC - 2)) << shift
+        exp = None
+        fw = me._paywords
+
+    ## Otherwise we have a finite number.  We handle all of these together.
+    else:
+
+      ## If there's no hidden bit, then check that the unit bit matches the
+      ## exponent: it should be clear if the exponent field is all-bits-zero
+      ## (zero or subnormal numbers), and set otherwise (normal numbers).  If
+      ## this isn't the case, signal an error, but continue.  We'll normalize
+      ## the number correctly as we go.
+      if not me.HIDDENP:
+        if (not biasedexp and unitbit) or (biasedexp and not unitbit):
+          err.append("INVAL")
+
+      ## If the exponent is all-bits-zero then set it to 1; otherwise, if the
+      ## format uses a hidden bit then force the unit bit of our significand
+      ## on.  The absolute value is now exactly
+      ##
+      ##        2^{biasedexp-_expbias-PREC+1} sig
+      ##
+      ## in all cases.
+      if not biasedexp: biasedexp = 1
+      elif me.HIDDENP: sig |= bit(me._sigwd)
+
+      ## If the significand is now zero then the value must be zero.
+      if not sig:
+        flags.append("ZERO")
+        frac = fw = exp = None
+
+      ## Otherwise we have a nonzero finite value, which might need
+      ## normalization.
+      else:
+        sigwd = sig.bit_length()
+        fw = (sigwd + 31)//32
+        exp = biasedexp - me._expbias - me.PREC + sigwd + 1
+        frac = sig << (32*fw - sigwd)
+
+    ## All done.
+    return flags, exp, frac, fw, err
+
+  def _dump_as_bytes(me, var, x, wd):
+    """
+    Dump an assignment to VAR of X as a WD-byte binary string.
+
+    Print, on standard output, an assignment `VAR = ...' giving the value of
+    X, in hexadecimal, split with spaces into groups of 8 digits from the
+    right.
+    """
+
+    if not wd:
+      print("%s = #empty" % var)
+    else:
+      out = StringIO()
+      for i in xrange(wd - 1, -1, -1):
+        out.write("%02x" % ((x >> 8*i)&0xff))
+        if i and not i%4: out.write(" ")
+      print("%s = %s" % (var, out.getvalue()))
+
+  def _dump_flags(me, var, flags, zero = "0"):
+    """
+    Dump an assignment to VAR of FLAGS as a list of flags.
+
+    Print, on standard output, an assignment `VAR = ...' giving the named
+    flags.  Print ZERO (default `0') if FLAGS is empty.
+    """
+
+    if flags: print("%s = %s" % (var, " | ".join(flags)))
+    else: print("%s = %s" % (var, zero))
+
+  def genenc(me, ep = ExploreParameters()):
+    """
+    Print, on standard output, tests of encoding floating-point values.
+
+    The tests will cover positive and negative values, with the exponent and
+    signficand fields explored according to the parameters EP.
+    """
+
+    print("[enc%s]" % me.NAME)
+    for s in xrange(2):
+      for e in explore(me.EXPWD, ep.explo, ep.exphi):
+        for m in explore(me.PREC - 1, ep.siglo, ep.sighi):
+          if not me.HIDDENP and e: m |= bit(me.PREC - 1)
+          x = (s << (me.EXPWD + me._sigwd)) | (e << me._sigwd) | m
+          flags, exp, frac, fw, err = me.decode(x)
+          print("")
+          me._dump_flags("f", flags)
+          if exp is not None: print("e = %d" % exp)
+          if frac is not None:
+            while not frac&M32 and fw: frac >>= 32; fw -= 1
+            me._dump_as_bytes("m", frac, 4*fw)
+          me._dump_as_bytes("z", x, me._rawbytes)
+          if err: me._dump_flags("err", err, "OK")
+
+  def gendec(me, ep = ExploreParameters()):
+    """
+    Print, on standard output, tests of decoding floating-point values.
+
+    The tests will cover positive and negative values, with the exponent and
+    signficand fields explored according to the parameters EP.
+    """
+
+    print("[dec%s]" % me.NAME)
+    for s in xrange(2):
+      for e in explore(me.EXPWD, ep.explo, ep.exphi):
+        for m in explore(me._sigwd, ep.siglo, ep.sighi):
+          x = (s << (me.EXPWD + me._sigwd)) | (e << me._sigwd) | m
+          flags, exp, frac, fw, err = me.decode(x)
+          print("")
+          me._dump_as_bytes("x", x, me._rawbytes)
+          me._dump_flags("f", flags)
+          if exp is not None: print("e = %d" % exp)
+          if frac is not None: me._dump_as_bytes("m", frac, 4*fw)
+          if err: me._dump_flags("err", err, "OK")
+
+class MiniFloat (IEEEFormat):
+  NAME = "mini"
+  EXPWD = 4
+  PREC = 4
+  HIDDENP = True
+
+class BFloat16 (IEEEFormat):
+  NAME = "bf16"
+  EXPWD = 8
+  PREC = 8
+  HIDDENP = True
+
+class Binary16 (IEEEFormat):
+  NAME = "f16"
+  EXPWD = 5
+  PREC = 11
+  HIDDENP = True
+
+class Binary32 (IEEEFormat):
+  NAME = "f32"
+  EXPWD = 8
+  PREC = 24
+  HIDDENP = True
+
+class Binary64 (IEEEFormat):
+  NAME = "f64"
+  EXPWD = 11
+  PREC = 53
+  HIDDENP = True
+
+class Binary128 (IEEEFormat):
+  NAME = "f128"
+  EXPWD = 15
+  PREC = 113
+  HIDDENP = True
+
+class DoubleExtended80 (IEEEFormat):
+  NAME = "idblext80"
+  EXPWD = 15
+  PREC = 64
+  HIDDENP = False
+
+###--------------------------------------------------------------------------
+### Main program.
+
+op = OP.OptionParser \
+  (description = "Generate test data for IEEE format encoding and decoding",
+   usage = "usage: %prog [-E LO/HI] [-M LO/HI] [[enc|dec]FORMAT]")
+for shortopt, longopt, kw in \
+  [("-E", "--explore-exponent",
+    dict(action = "store", metavar = "LO/HI", dest = "expparam",
+         help = "exponent exploration parameters")),
+   ("-M", "--explore-significand",
+    dict(action = "store", metavar = "LO/HI", dest = "sigparam",
+         help = "significand exploration parameters"))]:
+  op.add_option(shortopt, longopt, **kw)
+opts, args = op.parse_args()
+
+ep = ExploreParameters()
+for optattr, loattr, hiattr in [("expparam", "explo", "exphi"),
+                                ("sigparam", "siglo", "sighi")]:
+  opt = getattr(opts, optattr)
+  if opt is not None:
+    ok = False
+    try: sl = opt.index("/")
+    except ValueError: pass
+    else:
+      try: lo, hi = map(int, (opt[:sl], opt[sl + 1:]))
+      except ValueError: pass
+      else:
+        setattr(ep, loattr, lo)
+        setattr(ep, hiattr, hi)
+        ok = True
+    if not ok: op.error("bad exploration parameter `%s'" % opt)
+
+if not args:
+  for fmt in iterkeys(FMTMAP):
+    args.append("enc" + fmt)
+    args.append("dec" + fmt)
+firstp = True
+for arg in args:
+  tail = fmt = None
+  if arg.startswith("enc"): tail = arg[3:]; gen = lambda f: f.genenc(ep)
+  elif arg.startswith("dec"): tail = arg[3:]; gen = lambda f: f.gendec(ep)
+  if tail is not None: fmt = FMTMAP.get(tail)
+  if not fmt: op.error("unknown test group `%s'" % arg)
+  if firstp: firstp = False
+  else: print("")
+  gen(fmt())
+
+###----- That's all, folks --------------------------------------------------
diff --git a/utils/t/fltfmt.tests b/utils/t/fltfmt.tests
new file mode 100644 (file)
index 0000000..4b4c358
--- /dev/null
@@ -0,0 +1,551 @@
+;;; -*-conf-*-
+;;; Tests for floating-point conversions
+
+;;;--------------------------------------------------------------------------
+[round]
+
+;; Some easy special cases.
+
+round = nearest-even
+n = 16
+f = ZERO
+ff = ZERO
+err = OK
+
+round = nearest-even
+n = 16
+f = INF | NEG
+ff = INF | NEG
+err = OK
+
+;; Check that we round at the right bit.
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = fff00000
+ff = 0
+ee = 0
+mm = fff00000
+err = OK
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = ffe80000
+ff = 0
+ee = 0
+mm = ffe00000
+err = INEXACT
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = fff80000
+ff = 0
+ee = 1
+mm = 80000000
+err = INEXACT
+
+;; Check rounding of multi-word fractions.
+
+round = nearest-even
+n = 76
+f = 0
+e = 12
+m = ffffffff ffffffff fff00000 00000000
+ff = 0
+ee = 12
+mm = ffffffff ffffffff fff00000
+err = OK
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff fffeffff fff00000 00000001
+ff = 0
+ee = 0
+mm = ffffffff fffeffff fff00000
+err = INEXACT
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff ffffffff ffe80000 00000000
+ff = 0
+ee = 0
+mm = ffffffff ffffffff ffe00000
+err = INEXACT
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff fffeffff ffe80000 00000001
+ff = 0
+ee = 0
+mm = ffffffff fffeffff fff00000
+err = INEXACT
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff fffeffff fff80000 00000000
+ff = 0
+ee = 0
+mm = ffffffff ffff0000 00000000
+err = INEXACT
+
+;; Check carry up to next exponent.
+
+round = nearest-even
+n = 76
+f = 0
+e = -18
+m = ffffffff ffffffff fff80000 00000000
+ff = 0
+ee = -17
+mm = 80000000 00000000 00000000
+err = INEXACT
+
+;; Check rounding modes.
+
+round = zero
+n = 12
+f = 0
+e = 0
+m = bfffffff
+ff = 0
+ee = 0
+mm = bff00000
+err = INEXACT
+
+round = zero
+n = 12
+f = NEG
+e = 0
+m = bfffffff
+ff = NEG
+ee = 0
+mm = bff00000
+err = INEXACT
+
+round = neginf
+n = 12
+f = 0
+e = 0
+m = bfffffff
+ff = 0
+ee = 0
+mm = bff00000
+err = INEXACT
+
+round = neginf
+n = 12
+f = NEG
+e = 0
+m = bfffffff
+ff = NEG
+ee = 0
+mm = c0000000
+err = INEXACT
+
+;; Check inexactness detection.
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = ffe00001
+ff = 0
+ee = 0
+mm = ffe00000
+err = INEXACT
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = fff00001
+ff = 0
+ee = 0
+mm = fff00000
+err = INEXACT
+
+;; Check rounding at word boundaries.
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000001 00000001
+ff = 0
+ee = 0
+mm = 80000001
+err = INEXACT
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000000 80000000
+ff = 0
+ee = 0
+mm = 80000000
+err = INEXACT
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000000 80000001
+ff = 0
+ee = 0
+mm = 80000001
+err = INEXACT
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000001 80000000
+ff = 0
+ee = 0
+mm = 80000002
+err = INEXACT
+
+;;;--------------------------------------------------------------------------
+;;; IEEE conversions.
+
+[encf64]
+
+;; Check NaN truncation.
+
+errmask = 0
+f = QNAN
+m = 090cad8d 8de42000 00000000
+z = 7ff84865 6c6c6f21
+err = OK
+
+errmask = 0
+f = QNAN
+m = 090cad8d 8de43000
+z = 00000000 00000000
+err = INEXACT
+
+errmask = 0
+f = QNAN
+m = 090cad8d 8de42000 00000001
+z = 00000000 00000000
+err = INEXACT
+
+round = posinf
+errmask = INEXACT
+f = QNAN
+m = 090cad8d 8de43fff
+z = 7ff84865 6c6c6f21
+err = INEXACT
+
+;; Check subnormal underflow.
+
+errmask = 0
+f = 0
+e = -1073
+m = 80000000
+z = 00000000 00000001
+err = OK
+
+errmask = UFLOW | INEXACT
+f = 0
+e = -1074
+m = 80000000
+z = 00000000 00000000
+err = UFLOW | INEXACT
+
+round = projinf
+errmask = UFLOW | INEXACT
+f = 0
+e = -1074
+m = 80000000
+z = 00000000 00000001
+err = INEXACT
+
+round = projinf
+errmask = UFLOW | INEXACT
+f = 0
+e = -1075
+m = ffffffff
+z = 00000000 00000000
+err = UFLOW | INEXACT
+
+;; Check ordinary rounding.
+
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223800
+z = bfe44444 44444447
+err = OK
+
+errmask = 0
+f = NEG
+e = 0
+m = 22222222 22223801
+z = 00000000 00000000
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223801
+z = bfe44444 44444447
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223bff
+z = bfe44444 44444447
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223c00
+z = bfe44444 44444448
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223fff
+z = bfe44444 44444448
+err = INEXACT
+
+round = posinf
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223fff
+z = bfe44444 44444447
+err = INEXACT
+
+;; Check overflow and infinity.
+
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffff800
+z = 7fefffff ffffffff
+err = OK
+
+round = nearest-even
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffff801
+z = 7fefffff ffffffff
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffffbff
+z = 7fefffff ffffffff
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffffc00
+z = 7ff00000 00000000
+err = INEXACT | OFLOW
+
+round = neginf
+errmask = INEXACT | OFLOW
+f = 0
+e = 4096
+m = ffffffff
+z = 7fefffff ffffffff
+err = INEXACT
+
+[encf128]
+
+;; This was a randomized test that caught a bug.
+f = NEG
+e = 4400
+m = cd1c3727 b1c7bb96 c3668568
+z = d12e9a38 6e4f638f 772d86cd 0ad00000
+
+;;;--------------------------------------------------------------------------
+;;; Native format conversions.
+
+[encflt]
+
+f = ZERO
+z = 0.0
+
+@assume = negz
+f = NEG | ZERO
+z = -0.0
+
+@assume = inf
+f = INF
+z = #+inf
+
+@assume = inf
+f = NEG | INF
+z = #-inf
+
+f = NEG
+e = 0
+m = a0000000 00000000
+z = -0.625
+
+@assume = prec24
+f = 0
+e = 3
+m = c90fdb00
+z = 6.2831854820251465
+
+@assume = stdc-nan
+f = QNAN
+m = #empty
+z = #nan
+err = INEXACT
+
+@assume = ieee
+f = QNAN
+m = #empty
+z = #nan
+
+[decflt]
+
+x = 0.0
+f = ZERO
+
+@assume = negz
+x = -0.0
+f = NEG | ZERO
+
+x = -0.625
+f = NEG
+e = 0
+m = a0000000
+
+@assume = prec24
+x = 6.2831853
+f = 0
+e = 3
+m = c90fdb00
+
+@assume = inf
+x = #+inf
+f = INF
+
+@assume = inf
+x = #-inf
+f = NEG | INF
+
+@assume = stdc-nan
+x = #nan
+f = QNAN
+err = INEXACT
+
+@assume = ieee
+x = #nan
+f = QNAN
+m = 00000000 ; maybe
+err = OK
+
+[encdbl]
+
+f = ZERO
+z = 0.0
+
+@assume = negz
+f = NEG | ZERO
+z = -0.0
+
+@assume = inf
+f = INF
+z = #+inf
+
+@assume = inf
+f = NEG | INF
+z = #-inf
+
+f = NEG
+e = 0
+m = a0000000 00000000
+z = -0.625
+
+@assume = prec53
+f = 0
+e = 3
+m = c90fdaa2 2168c000
+z = 6.283185307179586
+
+@assume = stdc-nan
+f = QNAN
+m = #empty
+z = #nan
+err = INEXACT
+
+@assume = ieee
+f = QNAN
+m = #empty
+z = #nan
+
+[decdbl]
+
+x = 0.0
+f = ZERO
+
+@assume = negz
+x = -0.0
+f = NEG | ZERO
+
+x = -0.625
+f = NEG
+e = 0
+m = a0000000 00000000
+
+@assume = prec53
+x = 6.283185307179586
+f = 0
+e = 3
+m = c90fdaa2 2168c000
+
+@assume = inf
+x = #+inf
+f = INF
+
+@assume = inf
+x = #-inf
+f = NEG | INF
+
+@assume = stdc-nan
+x = #nan
+f = QNAN
+err = INEXACT
+
+@assume = ieee
+x = #nan
+f = QNAN
+m = 00000000 00000000 ; maybe
+err = OK
+
+;;;--------------------------------------------------------------------------
index c9090a3899908269e6b5ff6b809882f6cd0b9c3f..f0df250ed6fa84be56020283ad7004b3beedeed4 100644 (file)
@@ -26,6 +26,8 @@
  */
 
 #include "tvec.h"
+#include "tvec-types.h"
+
 #include "versioncmp.h"
 
 enum {
@@ -33,9 +35,12 @@ enum {
   RV0 = NROUT, RV1, NREG
 };
 
-static void test_versioncmp(const struct tvec_reg *in, struct tvec_reg *out,
-                           void *ctx)
-  { out[RRC].v.i = versioncmp(in[RV0].v.text.p, in[RV1].v.text.p); }
+static const struct tvec_regdef versioncmp_regs[] = {
+  { "v0",      &tvty_text,     RV0,    0 },
+  { "v1",      &tvty_text,     RV1,    0 },
+  { "rc",      &tvty_ienum,    RRC,    0,              { &tvenum_cmp } },
+  TVEC_ENDREGS
+};
 
 static void swap_test(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
 {
@@ -47,19 +52,16 @@ static void swap_test(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
   tv->in[RRC].v.i = -tv->in[RRC].v.i;
   fn(tv->in, tv->out, 0); tvec_check(tv, "swapped");
 }
-static const struct tvec_env swap_testenv = { 0, 0, 0, 0, swap_test, 0, 0 };
 
-static const struct tvec_regdef versioncmp_regs[] = {
-  { "v0",      &tvty_text,     RV0,    0 },
-  { "v1",      &tvty_text,     RV1,    0 },
-  { "rc",      &tvty_ienum,    RRC,    0,              { &tvenum_cmp } },
-  TVEC_ENDREGS
-};
+static void test_versioncmp(const struct tvec_reg *in, struct tvec_reg *out,
+                           void *ctx)
+  { out[RRC].v.i = versioncmp(in[RV0].v.text.p, in[RV1].v.text.p); }
 
-static const struct tvec_test tests[] = {
-  { "versioncmp", versioncmp_regs, &swap_testenv, test_versioncmp },
-  TVEC_ENDTESTS
-};
+static const struct tvec_env swap_testenv = { 0, 0, 0, 0, swap_test, 0, 0 };
+static const struct tvec_test versioncmp_test =
+  { "versioncmp", versioncmp_regs, &swap_testenv, test_versioncmp };
+
+static const struct tvec_test *const tests[] = { &versioncmp_test, 0 };
 
 static const struct tvec_config testconfig =
   { tests, NROUT, NREG, sizeof(struct tvec_reg) };
index 32b81117edee03802b99cf776fc2b1dbb3a27878..a19d4c02e66096f0e72670d5714e59a3b72816bf 100644 (file)
@@ -37,7 +37,7 @@ AT_CLEANUP
 ## control
 AT_SETUP([utilities: control])
 AT_KEYWORDS([utils control])
-AT_CHECK([BUILDDIR/t/control.t -fh], [0], [ignore])
+AT_CHECK([BUILDDIR/t/control.t -fm], [0], [ignore])
 AT_CLEANUP
 
 ## exc
@@ -56,10 +56,18 @@ hello! __exc_list = (nil)
 AT_CHECK([BUILDDIR/t/exc.t], [0], [expout])
 AT_CLEANUP
 
+## fltfmt
+AT_SETUP([utilities: fltfmt])
+AT_KEYWORDS([utils fltfmt])
+$PYTHON SRCDIR/t/fltfmt-testgen >fltfmt-gen.tests
+AT_CHECK([BUILDDIR/t/fltfmt.t -fm SRCDIR/t/fltfmt.tests fltfmt-gen.tests],
+       [0], [ignore])
+AT_CLEANUP
+
 ## versioncmp
 AT_SETUP([utilities: versioncmp])
 AT_KEYWORDS([utils versioncmp])
-AT_CHECK([BUILDDIR/t/versioncmp.t -fh SRCDIR/t/versioncmp.tests],
+AT_CHECK([BUILDDIR/t/versioncmp.t -fm SRCDIR/t/versioncmp.tests],
         [0], [ignore])
 AT_CLEANUP