From: Mark Wooding Date: Sun, 25 Nov 2018 11:40:32 +0000 (+0000) Subject: symm/strobe.c: Implement Hamburg's STROBE framework. X-Git-Tag: 2.6.0~46 X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/commitdiff_plain/b1d7b4240027d23d1e9af6b194a5d20fb217dd95 symm/strobe.c: Implement Hamburg's STROBE framework. --- diff --git a/debian/catacomb2.symbols b/debian/catacomb2.symbols index 44c2da7d..ceec3f2f 100644 --- a/debian/catacomb2.symbols +++ b/debian/catacomb2.symbols @@ -4181,6 +4181,22 @@ libcatacomb.so.2 catacomb2 #MINVER# kmac128_rand@Base 2.0.0 kmac256_rand@Base 2.0.0 +## strobe + strobe_init@Base 2.5.99~ + strobe_begin@Base 2.5.99~ + strobe_process@Base 2.5.99~ + strobe_done@Base 2.5.99~ + strobe_key@Base 2.5.99~ + strobe_ad@Base 2.5.99~ + strobe_prf@Base 2.5.99~ + strobe_clrout@Base 2.5.99~ + strobe_clrin@Base 2.5.99~ + strobe_encout@Base 2.5.99~ + strobe_encin@Base 2.5.99~ + strobe_macout@Base 2.5.99~ + strobe_macin@Base 2.5.99~ + strobe_ratchet@Base 2.5.99~ + ## poly1305 poly1305_keyinit@Base 2.4.0 poly1305_keysz@Base 2.4.0 diff --git a/symm/Makefile.am b/symm/Makefile.am index 68d9267a..48e5a22e 100644 --- a/symm/Makefile.am +++ b/symm/Makefile.am @@ -476,6 +476,12 @@ $(srcdir)/t/sha3: $(SHA3_TESTS) sha3-trans t/sha3.local cat t/sha3.local; } >t/sha3.new && \ mv t/sha3.new t/sha3 +## Mike Hamburg's STROBE protocol framework. +pkginclude_HEADERS += strobe.h +libsymm_la_SOURCES += strobe.c +TESTS += strobe.t$(EXEEXT) +EXTRA_DIST += t/strobe + ## Bellare, Canetti and Krawczyk's `HMAC' mode for message authentication. HASHMACMODES += hmac diff --git a/symm/strobe.c b/symm/strobe.c new file mode 100644 index 00000000..8d4d42da --- /dev/null +++ b/symm/strobe.c @@ -0,0 +1,694 @@ +/* -*-c-*- + * + * The STROBE protocol framework + * + * (c) 2018 Straylight/Edgeware + */ + +/*----- Licensing notice --------------------------------------------------* + * + * This file is part of Catacomb. + * + * Catacomb 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. + * + * Catacomb 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 Catacomb. If not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +/*----- Header files ------------------------------------------------------*/ + +#include +#include +#include + +#include + +#include "keccak1600.h" +#include "strobe.h" + +/*----- Magic constants ---------------------------------------------------*/ + +#define DDATA 0x04 +#define DRATE 0x80 + +/*----- Utilities ---------------------------------------------------------*/ + +/* --- @crank@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block to initialize + * + * Returns: --- + * + * Use: Cycle the Keccak-p[1600, n] duplex function. + */ + +static void crank(strobe_ctx *ctx) +{ + kludge64 t[25]; + octet *p; + unsigned i; + + /* Ensure that we've not overstepped the rate bound. */ + assert(ctx->n <= ctx->r - 2); + + /* Apply the cSHAKE and rate padding. */ + ctx->buf[ctx->n] ^= ctx->n0; + ctx->buf[ctx->n + 1] ^= DDATA; + ctx->buf[ctx->r - 1] ^= DRATE; + + /* Cycle the sponge. */ + for (i = 0, p = ctx->buf; i < ctx->r/8; i++) + { LOAD64_L_(t[i], p); p += 8; } + keccak1600_set(&ctx->k, t, ctx->r/8); + keccak1600_p(&ctx->k, &ctx->k, 24); + keccak1600_extract(&ctx->k, t, ctx->r/8); + for (i = 0, p = ctx->buf; i < ctx->r/8; i++) + { STORE64_L_(p, t[i]); p += 8; } + + /* Restart at the beginning of the buffer, and note this as a + * continuation. + */ + ctx->n = ctx->n0 = 0; +} + +/* --- @xorbuf@ --- * + * + * Arguments: @octet *z@ = pointer to output buffer + * @const octet *x, *y@ = pointer to input buffers + * @size_t sz@ = common buffer length + * + * Returns: --- + * + * Use: Store the bytewise XOR of the buffers @x@ and @y@ in @z@. + * The @x@ and @y@ may be equal, but otherwise the buffers must + * not overlap. + */ + +static void xorbuf(octet *z, const octet *x, const octet *y, size_t sz) + { size_t i; for (i = 0; i < sz; i++) *z++ = *x++ ^ *y++; } + +/* --- @nonzerop@ --- * + * + * Arguments: @const octet *x@ = pointer to input buffer + * @size_t sz@ = buffer length + * + * Returns: --- + * + * Use: If any byte of @x@ is nonzero, then return a nonzero value + * between 1 and 255 inclusive; otherwise return zero. + */ + +static unsigned nonzerop(const octet *x, size_t sz) +{ + unsigned z = 0; + size_t i; + + for (i = 0; i < sz; i++) z |= *x++; + return (z); +} + +/* --- @unequalp@ --- * + * + * Arguments: @const octet *x, *y@ = pointer to input buffers + * @size_t sz@ = common buffer length + * + * Returns: --- + * + * Use: If any respective bytes of @x@ and @y@ are unequal, then + * return a nonzero value between 1 and 255 inclusive; otherwise + * return zero. + */ + +static unsigned unequalp(const octet *x, const octet *y, size_t sz) +{ + unsigned z = 0; + size_t i; + + for (i = 0; i < sz; i++) z |= *x++ ^ *y++; + return (z); +} + +/* --- @process_buffer@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * @const octet *p@ = pointer to input buffer + * @octet *q@ = pointer to output buffer + * @size_t sz@ = common buffer length + * + * Returns: --- + * + * Use: Process a portion of a STROBE input small enough to be + * satisfied from the internal buffer. + */ + +static void process_buffer(strobe_ctx *ctx, + const octet *p, octet *q, size_t sz) +{ + octet *b = ctx->buf + ctx->n; + unsigned z = 0; + + if (!(ctx->f&STRBF_CRYPTO)) { + /* No crypto to do. The `output' would be equal to the input, so that's + * rather uninteresting (and, indeed, forbidden). If there's input, then + * mix it into the state. + */ + + if (p && (ctx->f&STRBF_VRFOUT)) z |= nonzerop(p, sz); + if (p) xorbuf(b, b, p, sz); + } else if (!(ctx->f&STRBF_MIXOUT)) { + /* Mix the input into the sponge state. That means that the new state + * will be equal to the output. + */ + + if (p) xorbuf(b, b, p, sz); + if (ctx->f&STRBF_VRFOUT) z |= nonzerop(b, sz); + if (q) memcpy(q, b, sz); + } else if (p) { + /* Mix the output into the sponge state, so the new state will in fact be + * equal to the input. If the input and output buffers are equal then we + * have a dance to do. + */ + + if (!q) { + if (ctx->f&STRBF_VRFOUT) z |= unequalp(p, b, sz); + memcpy(b, p, sz); + } else { + xorbuf(q, p, b, sz); + if (q != p) memcpy(b, p, sz); + else xorbuf(b, b, q, sz); + if (ctx->f&STRBF_VRFOUT) z |= nonzerop(q, sz); + } + } else { + /* As above, only the input is hardwired to zero. That means that we + * copy state bytes to the output (if any), and just clobber the state + * when we're done. + */ + + if (q) memcpy(q, b, sz); + memset(b, 0, sz); + } + + /* Set the @STRBF_NZERO@ flag if @z@ is nonzero. If @z@ is zero then + * subtracting one will set all of its bits, so, in particular, bits + * 8--15. Otherwise, @z@ is between 1 and 255, so bits 8--15 are clear and + * will remain so when we subtract one. + */ + if (ctx->f&STRBF_VRFOUT) ctx->f |= ((z - 1)&STRBF_NZERO) ^ STRBF_NZERO; + + /* Update the buffer cursor. */ + ctx->n += sz; +} + +/*----- Interface ---------------------------------------------------------*/ + +/* --- @strobe_init@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block to initialize + * @unsigned lambda@ = security parameter, in bits (must be a + * multiple of 32) + * + * Returns: --- + * + * Use: Initialize a STROBE context for use. + */ + +void strobe_init(strobe_ctx *ctx, unsigned lambda) +{ + const char v[] = "STROBEv1.0.2"; + kludge64 t[25]; + octet *p; + buf b; + unsigned n, i; + + /* Check the security parameter. */ + assert(lambda%32 == 0); assert(lambda <= 704); + ctx->r = (1600 - 2*lambda)/8; + + /* Set up the initial cSHAKE framing. */ + buf_init(&b, ctx->buf, ctx->r); + buf_putu8(&b, 1); buf_putu8(&b, ctx->r); + buf_putu8(&b, 1); buf_putu8(&b, 0); + buf_putu8(&b, 1); buf_putu8(&b, 8*(sizeof(v) - 1)); + buf_put(&b, v, sizeof(v) - 1); + assert(BOK(&b)); + n = BLEN(&b); if (n%8) memset(ctx->buf + n, 0, 8 - n%8); + + /* Cycle the sponge once initially, and get the first output buffer. */ + keccak1600_init(&ctx->k); + for (i = 0, p = ctx->buf; i < (n + 7)/8; i++) + { LOAD64_L_(t[i], p); p += 8; } + keccak1600_set(&ctx->k, t, (n + 7)/8); + keccak1600_p(&ctx->k, &ctx->k, 24); + keccak1600_extract(&ctx->k, t, ctx->r/8); + for (i = 0, p = ctx->buf; i < ctx->r/8; i++) + { STORE64_L_(p, t[i]); p += 8; } + + /* Initialize the other parts of the state. */ + ctx->n = ctx->n0 = 0; ctx->f = 0; +} + +/* --- @strobe_begin@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * @unsigned op@ = bitmask of flags + * + * Returns: --- + * + * Use: Begin a STROBE operation. The flags determine the behaviour + * of the @strobe_process@ and @strobe_done@ functions. + * + * * The @I@ bit determines the primary direction of data + * movement. If it's clear, data comes from the application + * into STROBE. If it's set, data comes from STROBE towards + * the application. + * + * * The @C@ bit activates cryptographic processing. If it's + * clear, then the input and output data would be equal, so + * @dest@ must be null. If it's set, then input data is + * XORed with the keystream on its way to the output. + * + * * The @A@ bit determines whether the application is + * engaged. If it's set, then the input or output buffer + * (according to whether @I@ is clear or set, respectively) + * holds the application data. If it's clear, and @I@ is + * clear, then zero bytes are fed in; if @I@ is set, then + * the output is compared with zero, and @strobe_done@ + * reports the outcome of this comparison. + * + * * The @T@ bit determines whether the transport is engaged. + * If it's set, then the input or output buffer (according + * to whether @I@ is set or clear, respectively) holds + * transport data. If it's clear, and @I@ is set, then zero + * bytes are fed in; if @I@ is clear, then the output is + * discarded. + * + * * The @M@ bit marks the data as metadata, but has no other + * effect. + */ + +void strobe_begin(strobe_ctx *ctx, unsigned op) +{ + /* Preliminary checking. We shouldn't have an operation underway, and the + * operation shouldn't have reserved bits set. + */ + assert(!(ctx->f&STRBF_ACTIVE)); assert(!(op&~STRBF_VALIDMASK)); + + /* Reset our operation state. */ + ctx->f &= STRBF_STMASK; + + /* Operation framing. Chain back to the start of the previous frame and + * write the new operation code. Set the sticky asymmetry bit here if + * necessary. + */ + ctx->buf[ctx->n++] ^= ctx->n0; ctx->n0 = ctx->n; + if (ctx->n >= ctx->r - 2) crank(ctx); + if (!(op&STRBF_T)) + ctx->buf[ctx->n++] ^= U8(op); + else { + if (!(ctx->f&STRBF_INIT)) ctx->f |= STRBF_INIT | (op&STRBF_I); + ctx->buf[ctx->n++] ^= U8(op ^ ctx->f); + } + if (ctx->n >= ctx->r - 2 || (op&STRBF_C)) crank(ctx); + + /* The operation is now underway. */ + ctx->f |= STRBF_ACTIVE; + + /* Determine whether we expect input and/or output. */ + if (op&(op&STRBF_I ? STRBF_T : STRBF_A)) + ctx->f |= STRBF_WANTIN; + if ((op&STRBF_C) && op&(op&STRBF_I ? STRBF_A : STRBF_T)) + ctx->f |= STRBF_WANTOUT; + + /* Determine whether the keystream is engaged, and how it fits in. */ + if (op&STRBF_C) { + ctx->f |= STRBF_CRYPTO; + if ((op&(STRBF_I | STRBF_T)) != STRBF_T) ctx->f |= STRBF_MIXOUT; + } + + /* Determine whether the output is supposed to be all-bytes-zero. */ + if ((op&(STRBF_I | STRBF_A | STRBF_T)) == (STRBF_I | STRBF_T)) + ctx->f |= STRBF_VRFOUT; + + /* The operation is now underway. */ + ctx->f |= STRBF_ACTIVE; +} + +/* --- @strobe_process@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * @const void *src@ = pointer to input data, or null + * @void *dest@ = pointer to output data, or null + * @size_t sz@ = common buffer length + * + * Returns: --- + * + * Use: Process data through the active STROBE operation. The exact + * behaviour depends on the flags passed to @strobe_begin@; see + * that function for details. If @src@ is null, then the + * behaviour is as if the input consists of @sz@ zero bytes. If + * @dest@ in null, then the output is discarded. + */ + +void strobe_process(strobe_ctx *ctx, const void *src, void *dest, size_t sz) +{ + const octet *p = src; octet *q = dest; + unsigned spare; + + /* Make sure that things are set up properly. */ + assert(ctx->f&STRBF_ACTIVE); + if (!(ctx->f&STRBF_WANTIN)) assert(!src); + if (!(ctx->f&STRBF_WANTOUT)) assert(!dest); + + /* Work through the input. */ + spare = ctx->r - ctx->n - 2; + if (sz < spare) + { process_buffer(ctx, p, q, sz); return; } + if (ctx->n) { + process_buffer(ctx, p, q, spare); crank(ctx); + if (p) { p += spare; } + if (q) { q += spare; } + sz -= spare; + } + + while (sz >= ctx->r - 2) { + process_buffer(ctx, p, q, ctx->r - 2); crank(ctx); + if (p) { p += ctx->r - 2; } + if (q) { q += ctx->r - 2; } + sz -= ctx->r - 2; + } + if (sz) process_buffer(ctx, p, q, sz); +} + +/* --- @strobe_done@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * + * Returns: Zero on success; @-1@ on verification failure (if @I@ and @T@ + * are set and @A@ is clear) + * + * Use: Concludes a STROBE operation, returning the result. + */ + +int strobe_done(strobe_ctx *ctx) +{ + assert(ctx->f&STRBF_ACTIVE); ctx->f &= ~STRBF_ACTIVE; + if (ctx->f&STRBF_VRFOUT) return (-(int)((ctx->f/STRBF_NZERO)&1u)); + else return (0); +} + +/* --- @strobe_key@, @strobe_ad@, @strobe_@prf@, @strobe_clrout@, + * @strobe_clrin@, @strobe_encout@, @strobe_encin@, @strobe_macout@, + * @strobe_macin@, @strobe_ratchet@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * + * Returns: @strobe_macin@ returns zero on success, or @-1@ on + * verification failure + * + * Use: Perform a STROBE operation on a single buffer. + */ + +static int op(strobe_ctx *ctx, unsigned f0, unsigned f1, + const void *src, void *dest, size_t sz) +{ + assert(!(f1&~STRBF_M)); + + strobe_begin(ctx, f0 | f1); + strobe_process(ctx, src, dest, sz); + return (strobe_done(ctx)); +} + +void strobe_key(strobe_ctx *ctx, unsigned f, const void *k, size_t sz) + { op(ctx, STROBE_KEY, f, k, 0, sz); } + +void strobe_ad(strobe_ctx *ctx, unsigned f, const void *h, size_t sz) + { op(ctx, STROBE_AD, f, h, 0, sz); } + +void strobe_prf(strobe_ctx *ctx, unsigned f, void *t, size_t sz) + { op(ctx, STROBE_PRF, f, 0, t, sz); } + +void strobe_clrout(strobe_ctx *ctx, unsigned f, const void *m, size_t sz) + { op(ctx, STROBE_CLROUT, f, m, 0, sz); } + +void strobe_clrin(strobe_ctx *ctx, unsigned f, const void *m, size_t sz) + { op(ctx, STROBE_CLRIN, f, m, 0, sz); } + +void strobe_encout(strobe_ctx *ctx, unsigned f, + const void *m, void *c, size_t sz) + { op(ctx, STROBE_ENCOUT, f, m, c, sz); } + +void strobe_encin(strobe_ctx *ctx, unsigned f, + const void *c, void *m, size_t sz) + { op(ctx, STROBE_ENCIN, f, c, m, sz); } + +void strobe_macout(strobe_ctx *ctx, unsigned f, void *t, size_t sz) + { op(ctx, STROBE_MACOUT, f, 0, t, sz); } + +int strobe_macin(strobe_ctx *ctx, unsigned f, const void *t, size_t sz) + { return (op(ctx, STROBE_MACIN, f, t, 0, sz)); } + +void strobe_ratchet(strobe_ctx *ctx, unsigned f, size_t sz) + { op(ctx, STROBE_RATCHET, f, 0, 0, sz); } + +/*----- Test rig ----------------------------------------------------------*/ + +#ifdef TEST_RIG + +#include +#include + +#include +#include + +#define NSTATE 16 + +static strobe_ctx states[NSTATE]; + +static void dump(int rc, char win, const void *p, size_t sz) +{ + dstr d = DSTR_INIT; + const char *q = p; + size_t i; + codec *hex; + int printable; + + if (!p) { + if (!rc) putchar(win); + else putchar('-'); + } else { + for (i = 0, printable = 1; i < sz; i++) + if (!isprint((unsigned char)q[i])) { printable = 0; break; } + if (printable) + printf("`%s'", q); + else { + hex = hex_class.encoder(CDCF_LOWERC, 0, 0); + hex->ops->code(hex, p, sz, &d); + dstr_write(&d, stdout); + hex->ops->destroy(hex); + } + } + dstr_destroy(&d); + putchar('\n'); +} + +typedef int opfunc(strobe_ctx *, unsigned, const void *, void *, size_t); + +static int op_init(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_init(ctx, sz); return (0); } + +static int op_copy(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { *ctx = states[sz]; return (0); } + +static int op_begin(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_begin(ctx, f); return (0); } + +static int op_process(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_process(ctx, p, q, sz); return (0); } + +static int op_done(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { return (strobe_done(ctx)); } + +static int op_key(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_key(ctx, f, p, sz); return (0); } + +static int op_ad(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_ad(ctx, f, p, sz); return (0); } + +static int op_prf(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_prf(ctx, f, q, sz); return (0); } + +static int op_clrout(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_clrout(ctx, f, p, sz); return (0); } + +static int op_clrin(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_clrin(ctx, f, p, sz); return (0); } + +static int op_encout(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_encout(ctx, f, p, q, sz); return (0); } + +static int op_encin(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_encin(ctx, f, p, q, sz); return (0); } + +static int op_macout(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_macout(ctx, f, q, sz); return (0); } + +static int op_macin(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { return (strobe_macin(ctx, f, p, sz)); } + +static int op_ratchet(strobe_ctx *ctx, unsigned f, + const void *p, void *q, size_t sz) + { strobe_ratchet(ctx, f, sz); return (0); } + +static const struct optab { + const char *name; + opfunc *op; +} optab[] = { +#define OP(op) { #op, op_##op } + OP(init), OP(copy), + OP(begin), OP(process), OP(done), + OP(key), OP(ad), OP(prf), + OP(clrout), OP(clrin), + OP(encout), OP(encin), + OP(macout), OP(macin), + OP(ratchet), + { 0 } +#undef OP +}; + +static int verify(dstr v[]) +{ + int r; + strobe_ctx *ctx; + const char *p; + char *q; + const struct optab *op; + dstr d0 = DSTR_INIT, d1 = DSTR_INIT; + codec *hex; + unsigned f; + const void *src, *destref; + void *dest; + size_t sz; + int rc, rcref; + int ok; + + /* First, get the register number. */ + r = *(int *)v[0].buf; ctx = &states[r]; + + /* Next job is to parse the command and flags. */ + q = v[1].buf; p = q; q += strcspn(q, "/"); if (*q) *q++ = 0; + for (op = optab; op->name; op++) + if (!strcmp(op->name, p)) goto found_op; + abort(); +found_op: + + f = 0; + for (p = q; *p; p++) { + switch (*p) { + case 'I': f |= STRBF_I; break; + case 'C': f |= STRBF_C; break; + case 'A': f |= STRBF_A; break; + case 'T': f |= STRBF_T; break; + case 'M': f |= STRBF_M; break; + default: abort(); + } + } + + /* Convert the source parameter. */ + p = v[2].buf; + if (*p == '*') + { src = 0; sz = strtoul(p + 1, 0, 0); } + else if (*p == '=') + { src = p + 1; sz = v[2].len - 1; } + else if (*p == '!') { + hex = hex_class.decoder(CDCF_IGNCASE); + rc = hex->ops->code(hex, p + 1, v[2].len - 1, &d0); assert(!rc); + src = d0.buf; sz = d0.len; + hex->ops->destroy(hex); + } else + abort(); + + /* Convert the destination parameter. */ + p = v[3].buf; + if (*p == '+') + { destref = 0; rcref = 0; assert(v[3].len == 1); } + else if (*p == '-') + { destref = 0; rcref = -1; assert(v[3].len == 1); } + else if (*p == '=') + { destref = p + 1; assert(sz == v[3].len - 1); rcref = 0; } + else if (*p == '!') { + hex = hex_class.decoder(CDCF_IGNCASE); + rc = hex->ops->code(hex, p + 1, v[3].len - 1, &d1); assert(!rc); + destref = d1.buf; assert(sz == d1.len); + hex->ops->destroy(hex); + rcref = 0; + } else + abort(); + if (!destref) dest = 0; + else dest = xmalloc(sz); + + /* Do the operation. */ + rc = op->op(ctx, f, src, dest, sz); + + /* Check we got the right answer. */ + ok = (rc == rcref && (!destref || !memcmp(dest, destref, sz))); + if (!ok) { + printf("failed test\n"); + printf(" state = %d\n", r); + printf(" operation = %s%s%s%s%s%s%s\n", + op->name, + f ? "/" : "", + f&STRBF_I ? "I" : "", + f&STRBF_A ? "A" : "", + f&STRBF_C ? "C" : "", + f&STRBF_T ? "T" : "", + f&STRBF_M ? "M" : ""); + printf(" input = "); dump(0, '*', src, sz); + printf(" computed = "); dump(rc, '+', dest, sz); + printf(" expected = "); dump(rcref, '+', destref, sz); + } + + dstr_destroy(&d0); + dstr_destroy(&d1); + free(dest); + return (ok); +} + +static test_chunk tests[] = { + { "strobe", verify, + { &type_int, &type_string, &type_string, &type_string, 0 } }, + { 0, 0, { 0 } } +}; + +int main(int argc, char *argv[]) +{ + test_run(argc, argv, tests, SRCDIR "/t/strobe"); + return (0); +} + +#endif + +/*----- That's all, folks -------------------------------------------------*/ diff --git a/symm/strobe.h b/symm/strobe.h new file mode 100644 index 00000000..c53fc399 --- /dev/null +++ b/symm/strobe.h @@ -0,0 +1,233 @@ +/* -*-c-*- + * + * The STROBE protocol framework + * + * (c) 2018 Straylight/Edgeware + */ + +/*----- Licensing notice --------------------------------------------------* + * + * This file is part of Catacomb. + * + * Catacomb 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. + * + * Catacomb 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 Catacomb. If not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +/*----- Notes on the STROBE framework -------------------------------------* + * + * Mike Hamburg's STROBE framework is an attempt to do pretty much all the + * obvious parts of symmetric cryptography using a single primitive: the + * Keccak-p[1600, 24] sponge function which underlies the SHA3. This works + * excellently on tiny devices, because it's possible to implement + * Keccak-p[1600, 24] with a very small amount of code, and STROBE requires + * minimal additional state beyond the 200-byte Keccak-p[1600, n] state, + * which can be updated more-or-less in place. + * + * STROBE is stateful. The idea is that the two parties' STROBE states + * should evolve in lockstep with each other. This will obviously go wrong + * if messages cross over, or are reordered or duplicated. + * + * The model for a single STROBE-based endpoint consists of the application, + * and a transport for communicating with a peer. All data gets mixed into + * the STROBE state. Some operations mix input data with a keystream + * generated by the sponge function (used in duplexing mode), which can then + * be used to encrypt and authenticate messages. + */ + +#ifndef CATACOMB_STROBE_H +#define CATACOMB_STROBE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----- Header files ------------------------------------------------------*/ + +#include + +#ifndef CATACOMB_KECCAK1600_H +# include "keccak1600.h" +#endif + +/*----- Data structures ---------------------------------------------------*/ + +#define STRBF_I 0x01 /* inbound */ +#define STRBF_A 0x02 /* application */ +#define STRBF_C 0x04 /* cipher */ +#define STRBF_T 0x08 /* transport */ +#define STRBF_M 0x10 /* metadata */ +#define STRBF_K 0x20 /* key-tree (not implemented) */ +#define STRBF_VALIDMASK 0x1f /* valid bits */ +#define STRBF_OPMASK 0xff /* observable operation bits */ + +typedef struct strobe_ctx { + keccak1600_state k; + octet buf[200]; + unsigned f, r, n0, n; +#define STRBF_I0 0x0001 /* initiator/responder role */ +#define STRBF_INIT 0x0100 /* initiator/responder role set? */ +#define STRBF_STMASK 0x01ff /* mask for persistent state bits */ +#define STRBF_ACTIVE 0x0200 /* operation in progress */ +#define STRBF_WANTIN 0x0400 /* expect input buffer */ +#define STRBF_WANTOUT 0x0800 /* expect output buffer */ +#define STRBF_VRFOUT 0x1000 /* verify that output is nonzero */ +#define STRBF_NZERO 0x2000 /* nonzero output from update */ +#define STRBF_MIXOUT 0x4000 /* mix output into state */ +#define STRBF_CRYPTO 0x8000 /* mix sponge state into output */ +} strobe_ctx; + +#define STROBE_KEY (STRBF_A | STRBF_C) +#define STROBE_AD (STRBF_A) +#define STROBE_PRF (STRBF_I | STRBF_A | STRBF_C) +#define STROBE_CLROUT (STRBF_A | STRBF_T) +#define STROBE_CLRIN (STRBF_I | STRBF_A | STRBF_T) +#define STROBE_ENCOUT (STRBF_A | STRBF_C | STRBF_T) +#define STROBE_ENCIN (STRBF_I | STRBF_A | STRBF_C | STRBF_T) +#define STROBE_MACOUT (STRBF_C | STRBF_T) +#define STROBE_MACIN (STRBF_I | STRBF_C | STRBF_T) +#define STROBE_RATCHET (STRBF_C) + +#define STROBE_ROLEMASK (STRBF_I0 | STRBF_INIT) +#define STRBRL_UNDCD (0) /* undecided */ +#define STRBRL_INIT (STRBF_INIT) /* initiator */ +#define STRBRL_RESP (STRBF_I0 | STRBF_INIT) /* responder */ + +/*----- Functions provided ------------------------------------------------*/ + +/* --- @strobe_init@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block to initialize + * @unsigned lambda@ = security parameter, in bits (must be a + * multiple of 32) + * + * Returns: --- + * + * Use: Initialize a STROBE context for use. + */ + +extern void strobe_init(strobe_ctx */*ctx*/, unsigned /*lambda*/); + +/* --- @strobe_begin@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * @unsigned op@ = bitmask of flags + * + * Returns: --- + * + * Use: Begin a STROBE operation. The flags determine the behaviour + * of the @strobe_process@ and @strobe_done@ functions. + * + * * The @I@ bit determines the primary direction of data + * movement. If it's clear, data comes from the application + * into STROBE. If it's set, data comes from STROBE towards + * the application. + * + * * The @C@ bit activates cryptographic processing. If it's + * clear, then the input and output data would be equal, so + * @dest@ must be null. If it's set, then input data is + * XORed with the keystream on its way to the output. + * + * * The @A@ bit determines whether the application is + * engaged. If it's set, then the input or output buffer + * (according to whether @I@ is clear or set, respectively) + * holds the application data. If it's clear, and @I@ is + * clear, then zero bytes are fed in; if @I@ is set, then + * the output is compared with zero, and @strobe_done@ + * reports the outcome of this comparison. + * + * * The @T@ bit determines whether the transport is engaged. + * If it's set, then the input or output buffer (according + * to whether @I@ is set or clear, respectively) holds + * transport data. If it's clear, and @I@ is set, then zero + * bytes are fed in; if @I@ is clear, then the output is + * discarded. + * + * * The @M@ bit marks the data as metadata, but has no other + * effect. + */ + +extern void strobe_begin(strobe_ctx */*ctx*/, unsigned /*op*/); + +/* --- @strobe_process@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * @const void *src@ = pointer to input data, or null + * @void *dest@ = pointer to output data, or null + * @size_t sz@ = common buffer length + * + * Returns: --- + * + * Use: Process data through the active STROBE operation. The exact + * behaviour depends on the flags passed to @strobe_begin@; see + * that function for details. If @src@ is null, then the + * behaviour is as if the input consists of @sz@ zero bytes. If + * @dest@ in null, then the output is discarded. + */ + +extern void strobe_process(strobe_ctx */*ctx*/, const void */*src*/, + void */*dest*/, size_t /*sz*/); + +/* --- @strobe_done@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * + * Returns: Zero on success; @-1@ on verification failure (if @I@ and @T@ + * are set and @A@ is clear) + * + * Use: Concludes a STROBE operation, returning the result. + */ + +extern int strobe_done(strobe_ctx */*ctx*/); + +/* --- @strobe_key@, @strobe_ad@, @strobe_@prf@, @strobe_clrout@, + * @strobe_clrin@, @strobe_encout@, @strobe_encin@, @strobe_macout@, + * @strobe_macin@, @strobe_ratchet@ --- * + * + * Arguments: @strobe_ctx *ctx@ = pointer to context block + * + * Returns: @strobe_macin@ returns zero on success, or @-1@ on + * verification failure + * + * Use: Perform a STROBE operation on a single buffer. + */ + +extern void strobe_key(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*k*/, size_t /*sz*/); +extern void strobe_ad(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*h*/, size_t /*sz*/); +extern void strobe_prf(strobe_ctx */*ctx*/, unsigned /*f*/, + void */*t*/, size_t /*sz*/); +extern void strobe_clrout(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*m*/, size_t /*sz*/); +extern void strobe_clrin(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*m*/, size_t /*sz*/); +extern void strobe_encout(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*m*/, void */*c*/, size_t /*sz*/); +extern void strobe_encin(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*c*/, void */*m*/, size_t /*sz*/); +extern void strobe_macout(strobe_ctx */*ctx*/, unsigned /*f*/, + void */*t*/, size_t /*sz*/); +extern int strobe_macin(strobe_ctx */*ctx*/, unsigned /*f*/, + const void */*t*/, size_t /*sz*/); +extern void strobe_ratchet(strobe_ctx */*ctx*/, unsigned /*f*/, + size_t /*sz*/); + +/*----- That's all, folks -------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/symm/t/strobe b/symm/t/strobe new file mode 100644 index 00000000..1d056755 --- /dev/null +++ b/symm/t/strobe @@ -0,0 +1,1288 @@ +### Test vectors for STROBE. + +strobe { + ## This is the `Concurrence' test from Hamburg's reference implementation. + + ## Initial conversation. + 0 init *128 +; 1 init *128 +; + 0 ad/M =testing +; 1 ad/M =testing +; + 0 prf *10 !8a13a189683bf5678170; 1 prf *10 !8a13a189683bf5678170; + 0 ad =Hello +; 1 ad =Hello +; + 0 encout =World !123bfbee34; 1 encin !123bfbee34 =World; + 0 clrout =foo +; 1 clrin =foo +; + 0 clrin =bar +; 1 clrout =bar +; + 0 encin =baz !15e518; 1 encout !15e518 =baz; + + ## Lots of `X's. + 0 encout + = + !; + 1 encin + ! + =; + 0 encout + =X + !c6; + 1 encin + !c6 + =X; + 0 encout + =XX + !1016; + 1 encin + !1016 + =XX; + 0 encout + =XXX + !8ba0e8; + 1 encin + !8ba0e8 + =XXX; + 0 encout + =XXXX + !4990e91f; + 1 encin + !4990e91f + =XXXX; + 0 encout + =XXXXX + !5eec19edd5; + 1 encin + !5eec19edd5 + =XXXXX; + 0 encout + =XXXXXX + !dc06c47954a4; + 1 encin + !dc06c47954a4 + =XXXXXX; + 0 encout + =XXXXXXX + !9a4b7ade0aa89e; + 1 encin + !9a4b7ade0aa89e + =XXXXXXX; + 0 encout + =XXXXXXXX + !0d1b71cf776af3a9; + 1 encin + !0d1b71cf776af3a9 + =XXXXXXXX; + 0 encout + =XXXXXXXXX + !fa037bf1c020190bbc; + 1 encin + !fa037bf1c020190bbc + =XXXXXXXXX; + 0 encout + =XXXXXXXXXX + !a66e9933c1cdcf5fc084; + 1 encin + !a66e9933c1cdcf5fc084 + =XXXXXXXXXX; + 0 encout + =XXXXXXXXXXX + !561f708ef060b436728811; + 1 encin + !561f708ef060b436728811 + =XXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXX + !12fe9d8b24b91b434ec114ab; + 1 encin + !12fe9d8b24b91b434ec114ab + =XXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXX + !9a516cf12e38944e370864e0f8; + 1 encin + !9a516cf12e38944e370864e0f8 + =XXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXX + !9155393fc1155502250c839e3758; + 1 encin + !9155393fc1155502250c839e3758 + =XXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXX + !9731d438dd00d5de2a3bb21a6a14e3; + 1 encin + !9731d438dd00d5de2a3bb21a6a14e3 + =XXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXX + !41c74574fe9efce9225aa766a83d4f42; + 1 encin + !41c74574fe9efce9225aa766a83d4f42 + =XXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXX + !65d720eafbb3261f0d960d70c35dcaea20; + 1 encin + !65d720eafbb3261f0d960d70c35dcaea20 + =XXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXX + !703a1db79e5b68de3760c58f90fa6775f455; + 1 encin + !703a1db79e5b68de3760c58f90fa6775f455 + =XXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXX + !b47759d2263e7d97760a4461a0d04e7fd56f6e; + 1 encin + !b47759d2263e7d97760a4461a0d04e7fd56f6e + =XXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXX + !3869204c64230931d7c2e5647dd67e2800db2039; + 1 encin + !3869204c64230931d7c2e5647dd67e2800db2039 + =XXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXX + !4aa5d694e8006d83f87cfc62408b6127b77e47bdd7; + 1 encin + !4aa5d694e8006d83f87cfc62408b6127b77e47bdd7 + =XXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXX + !1f1e7cee02468524a853c1c1b53d561443d89b19d536; + 1 encin + !1f1e7cee02468524a853c1c1b53d561443d89b19d536 + =XXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXX + !7c3fc5d277be9e4525d80442d49d21536fc460a7317f0e; + 1 encin + !7c3fc5d277be9e4525d80442d49d21536fc460a7317f0e + =XXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXX + !fd2f4cf48128e3a4d20d1ffedb7e1629ba80e89e55b1d343; + 1 encin + !fd2f4cf48128e3a4d20d1ffedb7e1629ba80e89e55b1d343 + =XXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXX + !c85c1eb7626b48b96ebb245822a54dc95a6d96cb6a2af76c3c; + 1 encin + !c85c1eb7626b48b96ebb245822a54dc95a6d96cb6a2af76c3c + =XXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXX + !1b3a6f13c1741e91fad9a060ba3f144e356a7c8e5bf6ea982d84; + 1 encin + !1b3a6f13c1741e91fad9a060ba3f144e356a7c8e5bf6ea982d84 + =XXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXX + !a979bb3b94687d0d60c55dbc071668da261bfa6f37f91a2d194115; + 1 encin + !a979bb3b94687d0d60c55dbc071668da261bfa6f37f91a2d194115 + =XXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1e2a52e3220403c77bbb0e6e2b9456fcb918d5a0dfc04eef76fc9278; + 1 encin + !1e2a52e3220403c77bbb0e6e2b9456fcb918d5a0dfc04eef76fc9278 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1f34cc349d503817d28fc1a67b8dd54a4082ae73d8d4f004279bd7ce63; + 1 encin + !1f34cc349d503817d28fc1a67b8dd54a4082ae73d8d4f004279bd7ce63 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !f7c6bdf8689f0cd920c8ff6745b3fc285decc5a73180841baec2008b72ae; + 1 encin + !f7c6bdf8689f0cd920c8ff6745b3fc285decc5a73180841baec2008b72ae + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !89bca3b3fe374d7776fca1568c67972791638e6004e37fc3b792388fbf4d94; + 1 encin + !89bca3b3fe374d7776fca1568c67972791638e6004e37fc3b792388fbf4d94 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d752309a5e5ebe2c591c55b9b42c1aebc3a5d17bb696bd5e5fece6d70cd4a076; + 1 encin + !d752309a5e5ebe2c591c55b9b42c1aebc3a5d17bb696bd5e5fece6d70cd4a076 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !e6f0b8800dbee31e5a9b1487e186ae7e5839becfbe8572afe8a907803b6298ce47; + 1 encin + !e6f0b8800dbee31e5a9b1487e186ae7e5839becfbe8572afe8a907803b6298ce47 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ea5e143b8a616211700347b46bda10ebd200ebad8cb747bee6ebbd2044bcbbe88767; + 1 encin + !ea5e143b8a616211700347b46bda10ebd200ebad8cb747bee6ebbd2044bcbbe88767 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !c88d7a83b618b4a3bbaf5cdcd9bfb77b8593163e29b656de06aad9dcba67f1090894a8; + 1 encin + !c88d7a83b618b4a3bbaf5cdcd9bfb77b8593163e29b656de06aad9dcba67f1090894a8 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !13343f85d5c33de49ebab48d9ea012ec6bee78fe997b9d465220b267ce527df63963920c; + 1 encin + !13343f85d5c33de49ebab48d9ea012ec6bee78fe997b9d465220b267ce527df63963920c + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !0772dfb3e97ffe9897e254e183ed6a339e14b6f6ce98579cbd74b0dd12705f0e8fc83a22f1; + 1 encin + !0772dfb3e97ffe9897e254e183ed6a339e14b6f6ce98579cbd74b0dd12705f0e8fc83a22f1 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !e666998f161d9d5cd8a4b84b8f69c7f242843a7d70a368e0012aebb31f3455c8db0a2762d56e; + 1 encin + !e666998f161d9d5cd8a4b84b8f69c7f242843a7d70a368e0012aebb31f3455c8db0a2762d56e + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a617e710a24d8ec6e8d0643913558d03c979dff5adb4807a1bb676c54abc271e478e3cd26441f5; + 1 encin + !a617e710a24d8ec6e8d0643913558d03c979dff5adb4807a1bb676c54abc271e478e3cd26441f5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !4ac10a6382eb48c30b8f3532c5d2bd6aa01258713c8048843f2f01aeb07ec9673ee23c12ebbc496c; + 1 encin + !4ac10a6382eb48c30b8f3532c5d2bd6aa01258713c8048843f2f01aeb07ec9673ee23c12ebbc496c + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !3a14815a68d3156dbb049088b1c3cac707e1fe98d6f6c2ef702507b73d36341539f5bf3ec179c459fd; + 1 encin + !3a14815a68d3156dbb049088b1c3cac707e1fe98d6f6c2ef702507b73d36341539f5bf3ec179c459fd + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !c5e4de01206e6d22e1b688ee16cf70722800c67acdf9b33ea0e4c4bb9abf57c29212a4b5037cead2d56b; + 1 encin + !c5e4de01206e6d22e1b688ee16cf70722800c67acdf9b33ea0e4c4bb9abf57c29212a4b5037cead2d56b + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ef4c23d94151559c878ed774c21e343cb401494331bb90471146f6b9dfa754f29220fe979712c045f279cf; + 1 encin + !ef4c23d94151559c878ed774c21e343cb401494331bb90471146f6b9dfa754f29220fe979712c045f279cf + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1d5e809ca195882a69bf0a3ceb7cab559cdaa31f10bbfb4c52350d921a6d00cc6432730fe329ba59fb40ee9b; + 1 encin + !1d5e809ca195882a69bf0a3ceb7cab559cdaa31f10bbfb4c52350d921a6d00cc6432730fe329ba59fb40ee9b + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !0ce3268ba95b6a6ff86e8c9f2258ac6464b6c1dd6ada24a3003cfd91f54c930c08a440fae376197d5b021cbe2e; + 1 encin + !0ce3268ba95b6a6ff86e8c9f2258ac6464b6c1dd6ada24a3003cfd91f54c930c08a440fae376197d5b021cbe2e + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !522fb018a04f385658fd390f4c2543454c872ce4ba8d6fed4aee361e896875ca34f393a9a5472464a3bcf01e9853; + 1 encin + !522fb018a04f385658fd390f4c2543454c872ce4ba8d6fed4aee361e896875ca34f393a9a5472464a3bcf01e9853 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !7f25149deb31470c801e70671e08ed3a370342fb15bb99d17b58943c5bf9c1e4eeebf0b8aaa4f30679be9a06bb8923; + 1 encin + !7f25149deb31470c801e70671e08ed3a370342fb15bb99d17b58943c5bf9c1e4eeebf0b8aaa4f30679be9a06bb8923 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !3f4a8395e2d690bb34b1bdcfb36c2c52079d5d66b4fcb6548da98d492da04db0d90500a4ef5c4f9e9feb55ee42154ad9; + 1 encin + !3f4a8395e2d690bb34b1bdcfb36c2c52079d5d66b4fcb6548da98d492da04db0d90500a4ef5c4f9e9feb55ee42154ad9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !b0f391bda49d977c52f80f8675e84e9b014f7503bb3825c25da1b5169af498e96dc9440cae6b516325efdee35689abbad9; + 1 encin + !b0f391bda49d977c52f80f8675e84e9b014f7503bb3825c25da1b5169af498e96dc9440cae6b516325efdee35689abbad9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !2812c84a8d5c2fb938292308e711d64bff30ea0c6419e3433eb43be48646fe8b29f3864cb06cd0a3cc70b38cdea4fa6d099d; + 1 encin + !2812c84a8d5c2fb938292308e711d64bff30ea0c6419e3433eb43be48646fe8b29f3864cb06cd0a3cc70b38cdea4fa6d099d + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !9f2d627361db4aab97458fda8cdc703ed90dad1f3d6d524c6dae99729194effd0a1f394c30271d9ddf28c04cca1b391b0bb660; + 1 encin + !9f2d627361db4aab97458fda8cdc703ed90dad1f3d6d524c6dae99729194effd0a1f394c30271d9ddf28c04cca1b391b0bb660 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d90fd5180555d5694fb8d37ae3b14a16522f0975dfedf194d7fb982f78739e5c18ec96683d36e7ea87e95f9b6032af286cfc87b9; + 1 encin + !d90fd5180555d5694fb8d37ae3b14a16522f0975dfedf194d7fb982f78739e5c18ec96683d36e7ea87e95f9b6032af286cfc87b9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !9f68b8e0fbabaa3ba7e89f01ce4ee4a303a0d5b70a4cf86e248fd0818b197e2a11fa48eacbac441e555f9c334ad08d01826e832362; + 1 encin + !9f68b8e0fbabaa3ba7e89f01ce4ee4a303a0d5b70a4cf86e248fd0818b197e2a11fa48eacbac441e555f9c334ad08d01826e832362 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !5eda3e402fb41bcd18f967777257f3bc57df8a46899110accff5cd918faaa0e6d50879e32dd185978ff379120fccfda4d4a8fdd4af64; + 1 encin + !5eda3e402fb41bcd18f967777257f3bc57df8a46899110accff5cd918faaa0e6d50879e32dd185978ff379120fccfda4d4a8fdd4af64 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !217f1002e3606276bc24ef3441adba9b103aa61c009157ff65c88925d7bc6ffa76860af8ca8e809de0650f560f5fef195697086774a509; + 1 encin + !217f1002e3606276bc24ef3441adba9b103aa61c009157ff65c88925d7bc6ffa76860af8ca8e809de0650f560f5fef195697086774a509 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1a27632ac0e6dc87d3d9b752e104fae2e97962129829c68d921a01880ddae68eaf1c4cf514cfc1be573acb9704483c8052f263daba49c5c1; + 1 encin + !1a27632ac0e6dc87d3d9b752e104fae2e97962129829c68d921a01880ddae68eaf1c4cf514cfc1be573acb9704483c8052f263daba49c5c1 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !63ee36be37b62458e10f5a1014bec7168ee9925e290f232484aedee47e99c55168eb25fd677e83b2dfd8b74fbea276c17efe71cef67932e7fa; + 1 encin + !63ee36be37b62458e10f5a1014bec7168ee9925e290f232484aedee47e99c55168eb25fd677e83b2dfd8b74fbea276c17efe71cef67932e7fa + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !aa17985c6558bbb41d8bdcfbcdbfedb0c495c2f1795be87902defeb3eaf329cca4210047084f9664f7bba72dfafc3ac277d465ccad618af29090; + 1 encin + !aa17985c6558bbb41d8bdcfbcdbfedb0c495c2f1795be87902defeb3eaf329cca4210047084f9664f7bba72dfafc3ac277d465ccad618af29090 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !cb6c34e2718c39a14da69b7edcb2b9eb341036cf37b74109b920b02426d216bd137387cf79c904233da683b0e2d95497e62b0e5456095de8b7adb1; + 1 encin + !cb6c34e2718c39a14da69b7edcb2b9eb341036cf37b74109b920b02426d216bd137387cf79c904233da683b0e2d95497e62b0e5456095de8b7adb1 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !8920633abb5e90a51bd6da58a196e932647695b2ac3fa83d5a4a156f95c1cd506aab3c655f2b2b11c9434292529a0dfb6c5f1b5db33de9e3019f98aa; + 1 encin + !8920633abb5e90a51bd6da58a196e932647695b2ac3fa83d5a4a156f95c1cd506aab3c655f2b2b11c9434292529a0dfb6c5f1b5db33de9e3019f98aa + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !87df0d097ff3bcb1c875d39bb45138c7bec2b033209dadbb205655b28bcce6353f802b15b81642919f40f7601c36703266fbd07163e7da933d4f2bb9d4; + 1 encin + !87df0d097ff3bcb1c875d39bb45138c7bec2b033209dadbb205655b28bcce6353f802b15b81642919f40f7601c36703266fbd07163e7da933d4f2bb9d4 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !dbbb5a6d715a0504eb85597f07a74c7df63a2f497a45f523ba37a01134993fcbd08b4c3ee88c540c640728864f79b3011fb8f07c20da16453d3d7bc0ad62; + 1 encin + !dbbb5a6d715a0504eb85597f07a74c7df63a2f497a45f523ba37a01134993fcbd08b4c3ee88c540c640728864f79b3011fb8f07c20da16453d3d7bc0ad62 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !bba81430187038b681b56b17148f96ac219a2b474c29ea1d362fb97fa3177c6b3aae2a8b35bdf16d4166f2ff35319e60b0770436ed42fd4c72caf90b2e4047; + 1 encin + !bba81430187038b681b56b17148f96ac219a2b474c29ea1d362fb97fa3177c6b3aae2a8b35bdf16d4166f2ff35319e60b0770436ed42fd4c72caf90b2e4047 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !3b341925aa4a4b5930a4280f5c7ac0d8e7aa047e1a55f5ba7803cc57d3685df6d460fc0ab526c5f776a0ebe100907080f9448cf473668c06a4d8724f5bf34aa5; + 1 encin + !3b341925aa4a4b5930a4280f5c7ac0d8e7aa047e1a55f5ba7803cc57d3685df6d460fc0ab526c5f776a0ebe100907080f9448cf473668c06a4d8724f5bf34aa5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !572c5a300ac0105071ed9d80d268a7ff9e71df5e4b7bd4734089368500159222711532393589a776e48f3809e03fa0af9895909220d3c1e477605546bf82388742; + 1 encin + !572c5a300ac0105071ed9d80d268a7ff9e71df5e4b7bd4734089368500159222711532393589a776e48f3809e03fa0af9895909220d3c1e477605546bf82388742 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ad6a3713688e3c8d05bb38ab2115819c2a7a6044e6b532bdb5f5afc199eeeec5530ed464014e82ebbc5ae8cb230438831dd90233cf679e3cd0aa621e82749e00bcbf; + 1 encin + !ad6a3713688e3c8d05bb38ab2115819c2a7a6044e6b532bdb5f5afc199eeeec5530ed464014e82ebbc5ae8cb230438831dd90233cf679e3cd0aa621e82749e00bcbf + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !9ad3396f7edfd8cb0c67701033b2941e32867e9a34288cfbf0b575f4981d96738d7d58f95131652da0947405e6210eca92d4787a9604cedb5113e7820bf2b1f60b338a; + 1 encin + !9ad3396f7edfd8cb0c67701033b2941e32867e9a34288cfbf0b575f4981d96738d7d58f95131652da0947405e6210eca92d4787a9604cedb5113e7820bf2b1f60b338a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !fd7ab45351a569c2215e8645840b3f62cdd02d348d984f848a6aa1971854fe5feaf4253ace1f3a5cd8f9e5caf2ad65572a389f9e09fb09059fa66f37aad370ff6d068a88; + 1 encin + !fd7ab45351a569c2215e8645840b3f62cdd02d348d984f848a6aa1971854fe5feaf4253ace1f3a5cd8f9e5caf2ad65572a389f9e09fb09059fa66f37aad370ff6d068a88 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !38e597770fde2538e66147b517e204e827674c1fc47d51d835fc5f8e9c0de980f6995ab39272791d075ac26d3ef13a4e87ed8491e4610c64ae8102310623cde0ebcc78ba30; + 1 encin + !38e597770fde2538e66147b517e204e827674c1fc47d51d835fc5f8e9c0de980f6995ab39272791d075ac26d3ef13a4e87ed8491e4610c64ae8102310623cde0ebcc78ba30 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !86e78b7d6e0c059f0895d5cb7cfc130523a1738b2d0efb4dacac3a8a10ef768d39f46c18206496cbe0a07ae07bd9ce0e7439f2952ed2ff25ae7d7c9242b7de77515d3a6a0bb3; + 1 encin + !86e78b7d6e0c059f0895d5cb7cfc130523a1738b2d0efb4dacac3a8a10ef768d39f46c18206496cbe0a07ae07bd9ce0e7439f2952ed2ff25ae7d7c9242b7de77515d3a6a0bb3 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !49f36a3342f69941f0c2fbf927b19eb768e8fcbd4dc1050e70146db69e16155964b4da24ec9f5b677ced64cccdb2d50623a2b85bc7f9e2e40f340993ba4d238fe47d4401a345b6; + 1 encin + !49f36a3342f69941f0c2fbf927b19eb768e8fcbd4dc1050e70146db69e16155964b4da24ec9f5b677ced64cccdb2d50623a2b85bc7f9e2e40f340993ba4d238fe47d4401a345b6 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !37256a8d6113eba18fa7e67a2eb2a7d9007099c0f8dad252a7450b2199a9031ff2318140668f623b161877eedd5342e324edb960a9584a680d45ca633adf08b90430c531b132478b; + 1 encin + !37256a8d6113eba18fa7e67a2eb2a7d9007099c0f8dad252a7450b2199a9031ff2318140668f623b161877eedd5342e324edb960a9584a680d45ca633adf08b90430c531b132478b + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !32dca3f2af35c92213a9af62b8c9206742f6c66a3df5148d7b72b967e9ae90d1ba3dc5b5743fce415a57deb51c46f5a133ffe2f83b8acb0f1495f16a702bc644c15377255a75a44039; + 1 encin + !32dca3f2af35c92213a9af62b8c9206742f6c66a3df5148d7b72b967e9ae90d1ba3dc5b5743fce415a57deb51c46f5a133ffe2f83b8acb0f1495f16a702bc644c15377255a75a44039 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !5bc91312769a0b0f43b13813583b56041d376cc7c059f0ba9693287df303d2271f9a81f8467f1b9d2a929ad508b0c08568d2988aa330395660c5a3e10828cb6c06b0a300a3a4789ff756; + 1 encin + !5bc91312769a0b0f43b13813583b56041d376cc7c059f0ba9693287df303d2271f9a81f8467f1b9d2a929ad508b0c08568d2988aa330395660c5a3e10828cb6c06b0a300a3a4789ff756 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !cfcef59edf00d6721c558676ad694b2bc7cdda43564d29da7f58e399a47fe0ad544a2a5c85086a37239b5f2ccabd7472e8a7936d9de9f2252b67d5953b21144f329565b9a4770c8ff4a227; + 1 encin + !cfcef59edf00d6721c558676ad694b2bc7cdda43564d29da7f58e399a47fe0ad544a2a5c85086a37239b5f2ccabd7472e8a7936d9de9f2252b67d5953b21144f329565b9a4770c8ff4a227 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ef849e65f395e85b4396f22602b1aa9fe3726161e6e1d582ebc585c2e6790fce1c0e5f0b616e35e875b9ed5eccef0c945cc8e68be2374d8859576405979f300a18931d9806e6a8a1e99eb66b; + 1 encin + !ef849e65f395e85b4396f22602b1aa9fe3726161e6e1d582ebc585c2e6790fce1c0e5f0b616e35e875b9ed5eccef0c945cc8e68be2374d8859576405979f300a18931d9806e6a8a1e99eb66b + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !bd964b885a27668afe2e0738502b2ba3f11a63181e5cc26fb55223b320bae68e2c04f069d076b0ff5209f6a5b453c059177af54d28ba29bb1dd62edfb8a77dbad75c5b19397062408dd42ea499; + 1 encin + !bd964b885a27668afe2e0738502b2ba3f11a63181e5cc26fb55223b320bae68e2c04f069d076b0ff5209f6a5b453c059177af54d28ba29bb1dd62edfb8a77dbad75c5b19397062408dd42ea499 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !463042317a2a27ba58aaea708b0bfe915a2a2433f89ef1193e04082f06ad3cd7a5bf8920adfc155fcbb8dc91d0473c28ff17b2202baccf8d7ba72c7d622a95a5eaf3a5de9e7b1a55e3d76c98a745; + 1 encin + !463042317a2a27ba58aaea708b0bfe915a2a2433f89ef1193e04082f06ad3cd7a5bf8920adfc155fcbb8dc91d0473c28ff17b2202baccf8d7ba72c7d622a95a5eaf3a5de9e7b1a55e3d76c98a745 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d91972d9c34b73ca5adfdf28c276903d020d856a39569272483a1d333f7c6b72ae1fc94e00e42d62d0c6f93d5d2ded327e19ff8c07e586e5ed9eebd00c55239446500cea3a4ea22c38f4d0e32d8dec; + 1 encin + !d91972d9c34b73ca5adfdf28c276903d020d856a39569272483a1d333f7c6b72ae1fc94e00e42d62d0c6f93d5d2ded327e19ff8c07e586e5ed9eebd00c55239446500cea3a4ea22c38f4d0e32d8dec + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !4e9afeacf87b309b35d87b488162b56421f477ce928add35f0f31a6824e0a5f5c31f3bf762ac50e6aef8c7d0e98eb01d4950d0dd67261f8c06dee7e034788e686318884285b1ddce6f64dc9aae9c5479; + 1 encin + !4e9afeacf87b309b35d87b488162b56421f477ce928add35f0f31a6824e0a5f5c31f3bf762ac50e6aef8c7d0e98eb01d4950d0dd67261f8c06dee7e034788e686318884285b1ddce6f64dc9aae9c5479 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !e15bb7f491654b63e1ed476efda5b4ed6a86c7c5193cc79da0650b7848e325b392f8321ca8463539f1e1e60777192732c64507162ddcad9fb563b6a34a35af66f6bfad0f7c9d22828c70cb718c40ddfff6; + 1 encin + !e15bb7f491654b63e1ed476efda5b4ed6a86c7c5193cc79da0650b7848e325b392f8321ca8463539f1e1e60777192732c64507162ddcad9fb563b6a34a35af66f6bfad0f7c9d22828c70cb718c40ddfff6 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !12643264e4261ecb9bf62fb88fd3d23fb26e017c16455c888acc5ae6e3bde3689b15659b1ec5942408a90146fbecc56c33136c0e691784ecce9ed0b0181b654f08eea34646ff8db13dc89a2e653164b306be; + 1 encin + !12643264e4261ecb9bf62fb88fd3d23fb26e017c16455c888acc5ae6e3bde3689b15659b1ec5942408a90146fbecc56c33136c0e691784ecce9ed0b0181b654f08eea34646ff8db13dc89a2e653164b306be + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a66947e171591261bc4b41aaf24dc588bcdcbbec645dc4ddfdf3857e799ca30e8e65ac1ff2081dae5f3bc859c3a2f89f644aec1c239f4d498a22be827ef23e48a4771da5f9972cca6378616a8960a5f7c72076; + 1 encin + !a66947e171591261bc4b41aaf24dc588bcdcbbec645dc4ddfdf3857e799ca30e8e65ac1ff2081dae5f3bc859c3a2f89f644aec1c239f4d498a22be827ef23e48a4771da5f9972cca6378616a8960a5f7c72076 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !6f4bacbcfacfd24c2e17bda9e259edb6c02f949f78029a6990b53a5c51e4c103b938556a0f0a67f372c459f04281e1390db713ba8434837de3631e290f0ae637f8423cacad173e7952a021dc0c380ace81f9be89; + 1 encin + !6f4bacbcfacfd24c2e17bda9e259edb6c02f949f78029a6990b53a5c51e4c103b938556a0f0a67f372c459f04281e1390db713ba8434837de3631e290f0ae637f8423cacad173e7952a021dc0c380ace81f9be89 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a4b2340dec02cabb3531362a815759930e2f09b6a466d44afd33959bb753638ce63b8050b365c5e9e00290114c8e8847d909eaca13581366170e6adf31347a9946f7573538d8921239f16b7ea403313a1d0fa218a7; + 1 encin + !a4b2340dec02cabb3531362a815759930e2f09b6a466d44afd33959bb753638ce63b8050b365c5e9e00290114c8e8847d909eaca13581366170e6adf31347a9946f7573538d8921239f16b7ea403313a1d0fa218a7 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !9df08e36f23ceb212520f4461e8df919d09d50e6818fa7571c2139268129ce9310c79e671d4442c330fdc336e3c9ed30f7b0ce90127d2d9d288e4b10078f4f580c0b127791ee53a8a9876f05c64c884fd009dcf9d1ad; + 1 encin + !9df08e36f23ceb212520f4461e8df919d09d50e6818fa7571c2139268129ce9310c79e671d4442c330fdc336e3c9ed30f7b0ce90127d2d9d288e4b10078f4f580c0b127791ee53a8a9876f05c64c884fd009dcf9d1ad + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !dedfd0487fd61a2d9c54495f96a2b5f6c46682d7411c5d9a6e73cb1ab5296353d7c6f0c2fc7b759b233495fdaaf532c2b6c0a1a10252c1f34e1eec567650ccaca1e891c74744d60ca6e132240f56b775fa84618fb9a97e; + 1 encin + !dedfd0487fd61a2d9c54495f96a2b5f6c46682d7411c5d9a6e73cb1ab5296353d7c6f0c2fc7b759b233495fdaaf532c2b6c0a1a10252c1f34e1eec567650ccaca1e891c74744d60ca6e132240f56b775fa84618fb9a97e + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !c6e3226aa258e7c492e730f5c43e2e39f664a7c9a3a6a038a1ccc077d307c2d2a9e21091f222b9dbc66e9fd462e38e59546cf2706dc02301afa34beb1894c334ce44daddd002250eec388f2e4aa819ac4a943c297292626a; + 1 encin + !c6e3226aa258e7c492e730f5c43e2e39f664a7c9a3a6a038a1ccc077d307c2d2a9e21091f222b9dbc66e9fd462e38e59546cf2706dc02301afa34beb1894c334ce44daddd002250eec388f2e4aa819ac4a943c297292626a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !95fa84145d9a295647c55aac1f55e67ad2b91f7048a066c8314cb1c1b1e5a090c8b4862da9e29e270009f73cf2d7d18206d6a732b46bf85a1a4e44e4188a02a7e26716453df7962c5604195c47d7cc2d5850e8387cc641781f; + 1 encin + !95fa84145d9a295647c55aac1f55e67ad2b91f7048a066c8314cb1c1b1e5a090c8b4862da9e29e270009f73cf2d7d18206d6a732b46bf85a1a4e44e4188a02a7e26716453df7962c5604195c47d7cc2d5850e8387cc641781f + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !960bc94f8c562c75ae7a863757295bda90586db18e675f5b8e93e5897a534a369cf60383f636a81af4a0d48bc9fa11a2d5ce6f56efe48d55fe0202d13a24b64b9b3c6ff8bb27e4eccc3d5260fe5f22bb173d57837d078f11a38d; + 1 encin + !960bc94f8c562c75ae7a863757295bda90586db18e675f5b8e93e5897a534a369cf60383f636a81af4a0d48bc9fa11a2d5ce6f56efe48d55fe0202d13a24b64b9b3c6ff8bb27e4eccc3d5260fe5f22bb173d57837d078f11a38d + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !7f437b3d6edcec8b85a6b5a755f0718a63a10d2dbbcf842362c5e32822de6da58deae222ada40efae07b9148b9db97680decfc9c134cacbefbb89a79d685cfd53a33f28a24012d9e6d277350bf5ab87d61d7ef9c322c0c292481e5; + 1 encin + !7f437b3d6edcec8b85a6b5a755f0718a63a10d2dbbcf842362c5e32822de6da58deae222ada40efae07b9148b9db97680decfc9c134cacbefbb89a79d685cfd53a33f28a24012d9e6d277350bf5ab87d61d7ef9c322c0c292481e5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d7078e462a43b0805ea87ad33842b2418bce472ec2a3e2391701e8bb637518aa71bb1dfe34d9f1cd7c5e17858b6614105460e27342493515b90a16a0beb7964fde79f3828f979bf58487cd505f9b56da1b35b2dbaf4a79fc6eea7104; + 1 encin + !d7078e462a43b0805ea87ad33842b2418bce472ec2a3e2391701e8bb637518aa71bb1dfe34d9f1cd7c5e17858b6614105460e27342493515b90a16a0beb7964fde79f3828f979bf58487cd505f9b56da1b35b2dbaf4a79fc6eea7104 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !2cb0637be1b04080b43b84fb5275269a25cfc672897886337978163d9e73da4be2bab5036eecc91d19b5c8b542bde6ed4514bb22f3e0a6ea0792ea062c60a96dd266d7e470cf4407463286c5cd0397a8ea0011b3bc6f99be9e78631c65; + 1 encin + !2cb0637be1b04080b43b84fb5275269a25cfc672897886337978163d9e73da4be2bab5036eecc91d19b5c8b542bde6ed4514bb22f3e0a6ea0792ea062c60a96dd266d7e470cf4407463286c5cd0397a8ea0011b3bc6f99be9e78631c65 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !5d7358063a8200c777e45389670e232d4188d628376180c5032dd7f2c11d372eaff574f40a1b58ee0e0af0242bf7c24d5d70b2f7b088c052111006fad011ec35456990459fd16b7db74439c5e9e5f53ad39055adc2786ac65b9c2faed47c; + 1 encin + !5d7358063a8200c777e45389670e232d4188d628376180c5032dd7f2c11d372eaff574f40a1b58ee0e0af0242bf7c24d5d70b2f7b088c052111006fad011ec35456990459fd16b7db74439c5e9e5f53ad39055adc2786ac65b9c2faed47c + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !63d76039f6f5138bd4b61472da6cb3493ae0928323e84244dfc79d832e1f3f93919b619a1526969365b2622ad4fa0f5d6d8302ecc2e5dddb15d22978f52b78f21bb79f6fd0c587cf36a6d38671ad474d4bcbdad048f79e34aeeafa936a4fde; + 1 encin + !63d76039f6f5138bd4b61472da6cb3493ae0928323e84244dfc79d832e1f3f93919b619a1526969365b2622ad4fa0f5d6d8302ecc2e5dddb15d22978f52b78f21bb79f6fd0c587cf36a6d38671ad474d4bcbdad048f79e34aeeafa936a4fde + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !4fbb7e5d6f71ab847942a0a0581532679ad7b9a544e42c1a337144c0cc1e779db8172d5fd172e1957d51b3e70fe4fb0930997384efb7f1b17d16b58075f866effa13b13e5104ab8c110c6b9a7c89ff8ad1bebb27a31c22e6e2b49aec205e04b9; + 1 encin + !4fbb7e5d6f71ab847942a0a0581532679ad7b9a544e42c1a337144c0cc1e779db8172d5fd172e1957d51b3e70fe4fb0930997384efb7f1b17d16b58075f866effa13b13e5104ab8c110c6b9a7c89ff8ad1bebb27a31c22e6e2b49aec205e04b9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !805395735a1a2f301dcfbb22cb101078d52fbf686c8998a6c0b2c5f3dee68976dbeef15796df545f345725e72e4b5d48c4b9102932f5db2574d88b91da298421d3f0be76efaafefde2aee208b8ee2e336d33f55047e42f16f87a164f56f3a5f4a0; + 1 encin + !805395735a1a2f301dcfbb22cb101078d52fbf686c8998a6c0b2c5f3dee68976dbeef15796df545f345725e72e4b5d48c4b9102932f5db2574d88b91da298421d3f0be76efaafefde2aee208b8ee2e336d33f55047e42f16f87a164f56f3a5f4a0 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !8b53700554352c4e5b1f7907cb52e061b48cf3e459f7db87fc14df1935072944bdf81f088624fe2b7bbd2a4a0e15ffd69017d685b06f138d8bd5f5999e9a1a9592a7774de43014b98cecea6e798eec14b2737239028d70aed2a6e6806bca6f691eaa; + 1 encin + !8b53700554352c4e5b1f7907cb52e061b48cf3e459f7db87fc14df1935072944bdf81f088624fe2b7bbd2a4a0e15ffd69017d685b06f138d8bd5f5999e9a1a9592a7774de43014b98cecea6e798eec14b2737239028d70aed2a6e6806bca6f691eaa + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d6d4465829dfd8dc49547f835882ada15a406833a83ca2f6fbb4bb7c0db0d64ed12884e2d32abc05f0a429287746399e9262e2f304c0ad6ae36c1a5cd530fd929dfb0163017ed471b52fe10c1062c22f046a7fd375cd113d26b38b35504a8f32aefb5a; + 1 encin + !d6d4465829dfd8dc49547f835882ada15a406833a83ca2f6fbb4bb7c0db0d64ed12884e2d32abc05f0a429287746399e9262e2f304c0ad6ae36c1a5cd530fd929dfb0163017ed471b52fe10c1062c22f046a7fd375cd113d26b38b35504a8f32aefb5a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a6b1200dd06a7e2a036e971949474aaa154f524b4215ff691706a0e12498ff335792866ae19a48d8e4335bfb6d85d96126ed7b8b581b7f7042a0c7e5d6901ad8f32b7f29c04463f70aa8d5de527d19df1ad6d48a192109afc58eaa22c515ae0a10fde60c; + 1 encin + !a6b1200dd06a7e2a036e971949474aaa154f524b4215ff691706a0e12498ff335792866ae19a48d8e4335bfb6d85d96126ed7b8b581b7f7042a0c7e5d6901ad8f32b7f29c04463f70aa8d5de527d19df1ad6d48a192109afc58eaa22c515ae0a10fde60c + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !27be9a888de11c9b544d1c8e65b9453737464138e4a25b81ba946034da90d61dbd46cb298f1fecf60b6f9c6351ca9193f1db7f340e876a0ff812a0e4064332f91ac684d31b242229fd19d58c0626a6a43a5d9e8641cf6d9fd072f6e2a15ee1ecfa508e54dd; + 1 encin + !27be9a888de11c9b544d1c8e65b9453737464138e4a25b81ba946034da90d61dbd46cb298f1fecf60b6f9c6351ca9193f1db7f340e876a0ff812a0e4064332f91ac684d31b242229fd19d58c0626a6a43a5d9e8641cf6d9fd072f6e2a15ee1ecfa508e54dd + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !578538e9c435f10544df84cadc023d8513a0e51c73a512764d817d4ceab7f7ceb522031a9f94f0d73aae136f1e0d8468f99ba24f40803ead8beed12fac2385235887cb680ce3aa93f882f62061ff7a6411d4fa0ae395172ccceb4b4ee66c821e6d6b2d979bf2; + 1 encin + !578538e9c435f10544df84cadc023d8513a0e51c73a512764d817d4ceab7f7ceb522031a9f94f0d73aae136f1e0d8468f99ba24f40803ead8beed12fac2385235887cb680ce3aa93f882f62061ff7a6411d4fa0ae395172ccceb4b4ee66c821e6d6b2d979bf2 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !2a564c70ffaf1f6c9b4bde77e13b803a92603b1d853555a334d41eb38fca095fee9cf4d47b6dc34226f735c0471bb4ee20ab690a72d4bf6d9e9057fc44082334d00440e6264184e1f2140eea5f795b7b688959f00028d2b2620a1b1e085286ad8d9bce2cdccae7; + 1 encin + !2a564c70ffaf1f6c9b4bde77e13b803a92603b1d853555a334d41eb38fca095fee9cf4d47b6dc34226f735c0471bb4ee20ab690a72d4bf6d9e9057fc44082334d00440e6264184e1f2140eea5f795b7b688959f00028d2b2620a1b1e085286ad8d9bce2cdccae7 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !c3a497949629704ca9b40657503c581ba1cebb20b4f7bd3dd1e71f4a7e3cf67e5609cd60b35b2c6fa9df996d7c4609b90dc8195e55b3fcbc90184538c18b1307e5161f85005b1f41b043577548ca9104912ac7aab9c3993169bd66af217efd52d59c0b2217a9595f; + 1 encin + !c3a497949629704ca9b40657503c581ba1cebb20b4f7bd3dd1e71f4a7e3cf67e5609cd60b35b2c6fa9df996d7c4609b90dc8195e55b3fcbc90184538c18b1307e5161f85005b1f41b043577548ca9104912ac7aab9c3993169bd66af217efd52d59c0b2217a9595f + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !fffa26f4dbd0fa61db80afadaec090c5a55a4c3a1394d7aa64b7d144705c3864c5f296ced71fe5e75f7ad7805abc8113417681659a53dff7b6209db2de89412fb3ad47d6eaf6bf4a6b3b10d8f1272dafa114b2ad3f3f1ff7bd72dcb282027879d42d128f197dbf67b2; + 1 encin + !fffa26f4dbd0fa61db80afadaec090c5a55a4c3a1394d7aa64b7d144705c3864c5f296ced71fe5e75f7ad7805abc8113417681659a53dff7b6209db2de89412fb3ad47d6eaf6bf4a6b3b10d8f1272dafa114b2ad3f3f1ff7bd72dcb282027879d42d128f197dbf67b2 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !86cba2f603aae0dcbfbb3ac33c846452e4d0ba8891b11cee14f2117e97b48fc780e19fddd82131f310138a8d806525714a34b1ad02ce1ed1745572c031c64ddfe16b6f90b45242c4522fa8c050a4e392881de0d7d5c36d11774d5d0e83a6614a80bad1e7968d402b8e64; + 1 encin + !86cba2f603aae0dcbfbb3ac33c846452e4d0ba8891b11cee14f2117e97b48fc780e19fddd82131f310138a8d806525714a34b1ad02ce1ed1745572c031c64ddfe16b6f90b45242c4522fa8c050a4e392881de0d7d5c36d11774d5d0e83a6614a80bad1e7968d402b8e64 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !f0334f7e4a7acda9077684729f1740afdd50931e8814f3308a736faeb67d7c70432d076df140034313bece815f7060eca9911359681b6647feda952b8701ecc1996426eb7951df47bb2550700dac2da57643865ab6a3e59598094f72d646d39103d3251f6b2da9663a2ef5; + 1 encin + !f0334f7e4a7acda9077684729f1740afdd50931e8814f3308a736faeb67d7c70432d076df140034313bece815f7060eca9911359681b6647feda952b8701ecc1996426eb7951df47bb2550700dac2da57643865ab6a3e59598094f72d646d39103d3251f6b2da9663a2ef5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !087b6a424f1c2a083940fb4d7c9772eb2fbd9dbbba59054f76c3c0687a78dab3bd6124da5960c9b9618c5b5ac00b6899dbc1d91a75a74d4824c6ab5647b3783ca0da89f2cbcbf2274b1e9529fede6439d7ecaf2ffc08e9ad1903af418590810abf8618668b5dad8ee1b21b18; + 1 encin + !087b6a424f1c2a083940fb4d7c9772eb2fbd9dbbba59054f76c3c0687a78dab3bd6124da5960c9b9618c5b5ac00b6899dbc1d91a75a74d4824c6ab5647b3783ca0da89f2cbcbf2274b1e9529fede6439d7ecaf2ffc08e9ad1903af418590810abf8618668b5dad8ee1b21b18 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !75bd4f8ff0d109a3425322a55977727a53cd81735fe798dea31a1e308bbe6d19cdd4fd309b63c5f0f3891374715ad385f57e780974aaf64c73cf3b183d50755e3c753dd7a080da9da863233619defebe67a3059dc125c707f873ec8acc1334d0226240edd4aab093480598ec21; + 1 encin + !75bd4f8ff0d109a3425322a55977727a53cd81735fe798dea31a1e308bbe6d19cdd4fd309b63c5f0f3891374715ad385f57e780974aaf64c73cf3b183d50755e3c753dd7a080da9da863233619defebe67a3059dc125c707f873ec8acc1334d0226240edd4aab093480598ec21 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !5e86f82dc7b83b01a9d4362e7ad0871c53e8f8c96ff7b78746d0162257fa81771bb8bae3a6f34bccc42951fbc1c06fb1dd518ac733ecc253357c93892946944f815cba634f1f85178f744ac95ce478b2661a740b45a422bf6cec31cfe20d78a3ee978dd1d7e79910a5903bd1c782; + 1 encin + !5e86f82dc7b83b01a9d4362e7ad0871c53e8f8c96ff7b78746d0162257fa81771bb8bae3a6f34bccc42951fbc1c06fb1dd518ac733ecc253357c93892946944f815cba634f1f85178f744ac95ce478b2661a740b45a422bf6cec31cfe20d78a3ee978dd1d7e79910a5903bd1c782 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !3d906019d05fe688c8b215aa6a765e4ca03745195109c46c53f84b3b54dc8e4c2ded2a13de8e8678d94b8dcf9a936783ce726344199e73f82f182459e4bd88fdb6047e7e3bd16d2ff501f62e991e0bda2026be06e661313c532e84396cf6f56afd2ca9f3cc79cf1cc3e52a1d893eb6; + 1 encin + !3d906019d05fe688c8b215aa6a765e4ca03745195109c46c53f84b3b54dc8e4c2ded2a13de8e8678d94b8dcf9a936783ce726344199e73f82f182459e4bd88fdb6047e7e3bd16d2ff501f62e991e0bda2026be06e661313c532e84396cf6f56afd2ca9f3cc79cf1cc3e52a1d893eb6 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !6a65bc3cf9bcad98c0a733fafd599fbc9553584eba486ef3fb197ed4a12ff5da33d7b4bddb9ad153b890f870801b45c1e0115ffa220c24d8d60c5529c81a9141808a4d8ab91f2f93356247bb1c951aaf7d23328562150265130f607d54289500020099a247034a75ee58fd73af740e16; + 1 encin + !6a65bc3cf9bcad98c0a733fafd599fbc9553584eba486ef3fb197ed4a12ff5da33d7b4bddb9ad153b890f870801b45c1e0115ffa220c24d8d60c5529c81a9141808a4d8ab91f2f93356247bb1c951aaf7d23328562150265130f607d54289500020099a247034a75ee58fd73af740e16 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a0648c74ee2872b422b64290354ce4f38de2fb62fbbb99ae2a46a7233b9f4a9ea08ec253aa377042855099edca949834b90091dcf7d946baa658f0ef2906c906f70c151a19a1a73d9ae83176364533cd9b4de078329dd07ea96cdf2f6264446d5b9386a3d4a3f49d6db97e05ec518950aa; + 1 encin + !a0648c74ee2872b422b64290354ce4f38de2fb62fbbb99ae2a46a7233b9f4a9ea08ec253aa377042855099edca949834b90091dcf7d946baa658f0ef2906c906f70c151a19a1a73d9ae83176364533cd9b4de078329dd07ea96cdf2f6264446d5b9386a3d4a3f49d6db97e05ec518950aa + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !2c887d8300686768cac139577901999d57371ff152ec09e5cb979cf360a9704669b79a9e9252c6c90ba9f9e44bd5e77224081c3e3aebdc5d8f59a10794dfa167f8c2f6a25b3386eae4dd580ad86ebaa1df9bf5169f09698277f52f6877d3724c05bc07d3975865bc61b19a13174c2a750c96; + 1 encin + !2c887d8300686768cac139577901999d57371ff152ec09e5cb979cf360a9704669b79a9e9252c6c90ba9f9e44bd5e77224081c3e3aebdc5d8f59a10794dfa167f8c2f6a25b3386eae4dd580ad86ebaa1df9bf5169f09698277f52f6877d3724c05bc07d3975865bc61b19a13174c2a750c96 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !63c6df75230c4afab23cf2dc6f92138b9fde21cf5cd48865f3cb44642fb0f36a8212d07e4374351fee51566be0a0a70bfe1fb03b87cac717a3c667fc9190ba053a471428b2cc1329f49976a026150952bd8438220edfc60d9c3cd07dcbb6bff3ff0ea3353afeea85ab194db96161146f5e9e89; + 1 encin + !63c6df75230c4afab23cf2dc6f92138b9fde21cf5cd48865f3cb44642fb0f36a8212d07e4374351fee51566be0a0a70bfe1fb03b87cac717a3c667fc9190ba053a471428b2cc1329f49976a026150952bd8438220edfc60d9c3cd07dcbb6bff3ff0ea3353afeea85ab194db96161146f5e9e89 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !f980b6dd51a09fe70b93e752ec22a082e7a8fc5ffacaa9d53dd68c5688400355e52588087e91e4ee2185d54f998ab1fc1d263bdd5ae9cc1223414113bbc31f4e5eeeeab7764c60319b55beae12c1e02f92d5aa938c10b706027066cebde0269b572ba23f6e4972b127905faad5eaef8c5bc12115; + 1 encin + !f980b6dd51a09fe70b93e752ec22a082e7a8fc5ffacaa9d53dd68c5688400355e52588087e91e4ee2185d54f998ab1fc1d263bdd5ae9cc1223414113bbc31f4e5eeeeab7764c60319b55beae12c1e02f92d5aa938c10b706027066cebde0269b572ba23f6e4972b127905faad5eaef8c5bc12115 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !dee0d26ce7b9d85fefcef72ed7e3c995c06f60de485ce04b0531279d22eb6553bb58fc807e119f98e71220ca51f4242b8ae59228afa4756fd98e3c1f12efea0cd44f1bcdc6ccd6e77e0fff4375e65f0dd1c1a0c79aa17f3c79b09cde2ec364ee122e37a54bd1fdf4d97fa50a40b7eef07f781f9d1a; + 1 encin + !dee0d26ce7b9d85fefcef72ed7e3c995c06f60de485ce04b0531279d22eb6553bb58fc807e119f98e71220ca51f4242b8ae59228afa4756fd98e3c1f12efea0cd44f1bcdc6ccd6e77e0fff4375e65f0dd1c1a0c79aa17f3c79b09cde2ec364ee122e37a54bd1fdf4d97fa50a40b7eef07f781f9d1a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !5fe15102695168abca87356479efd9a734ccbd1ebcc2742f470aec0931a24379d225c9f5617b02415e3db7fd8e741d359a4059830dd9c83c2152370b5b89fae3d6c89ec9445bd339c689741bc08c1ba7392ee4f9cb5d06612dc766919144add4a7659222c8bc3c63b08353e7f24ecfc4b459a27e9bf4; + 1 encin + !5fe15102695168abca87356479efd9a734ccbd1ebcc2742f470aec0931a24379d225c9f5617b02415e3db7fd8e741d359a4059830dd9c83c2152370b5b89fae3d6c89ec9445bd339c689741bc08c1ba7392ee4f9cb5d06612dc766919144add4a7659222c8bc3c63b08353e7f24ecfc4b459a27e9bf4 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !4a9ab68772ead5aaa6c1e40e7ce22e1647070b5185a4260cebddb7c7bbf2ab88bf8c81e361cccfac2e96e971cef18e0f16607f04f01fc5131542f3de46ab6192bfcce55fdd37c32fe86423222b6dfa1c443b6e4a1b7039fe07e80f390f6bc99ca5ced16148c39f25f0644ed58fad44bc44fe6fe8ff87c9; + 1 encin + !4a9ab68772ead5aaa6c1e40e7ce22e1647070b5185a4260cebddb7c7bbf2ab88bf8c81e361cccfac2e96e971cef18e0f16607f04f01fc5131542f3de46ab6192bfcce55fdd37c32fe86423222b6dfa1c443b6e4a1b7039fe07e80f390f6bc99ca5ced16148c39f25f0644ed58fad44bc44fe6fe8ff87c9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !eaf08edd13b54042c0b2513d87f8fbe40eeeaba7395f20bfba998f23d19a88753f86588a21d1f47ad76733423bdf27ac253040608d12d7a931495a0572dd025230dc8992423e87639b5948cf792bf205bfc010d6e1edeb7a0244af19e38fe696771a1ba7f50fa7df7e20e2d514b73fa4db9668749f53ae91; + 1 encin + !eaf08edd13b54042c0b2513d87f8fbe40eeeaba7395f20bfba998f23d19a88753f86588a21d1f47ad76733423bdf27ac253040608d12d7a931495a0572dd025230dc8992423e87639b5948cf792bf205bfc010d6e1edeb7a0244af19e38fe696771a1ba7f50fa7df7e20e2d514b73fa4db9668749f53ae91 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !b741f0d5ddf4fd12c35b263c809648be6696576310c2982b2dd2ebf259df191cdbc4792fde17eec1ab0d470c9814ef62248ea816f8cb3a0be431179c0d44762f94014aaefb3227d70eda04f2ab460dd59bff4adced323d673b91d2128fbaed95fc9ccbd68195bf3dc50f382ce3987f7bef692647e8dfbee4d5; + 1 encin + !b741f0d5ddf4fd12c35b263c809648be6696576310c2982b2dd2ebf259df191cdbc4792fde17eec1ab0d470c9814ef62248ea816f8cb3a0be431179c0d44762f94014aaefb3227d70eda04f2ab460dd59bff4adced323d673b91d2128fbaed95fc9ccbd68195bf3dc50f382ce3987f7bef692647e8dfbee4d5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !03b0931db86e38f25ad44cfaafeedfed18b06a97f92eff0d64011cb0733b4e514e59531569fd97b4309801b8671405068159bc1a5ffaf2cb177235ed52fa285d24309f7ab065eee2b69bb7c2c7c20211829883bb2250bce0d233c203748661cdbf9007dacf93746176e2bf4f67fd90a01bfc55723e783729b887; + 1 encin + !03b0931db86e38f25ad44cfaafeedfed18b06a97f92eff0d64011cb0733b4e514e59531569fd97b4309801b8671405068159bc1a5ffaf2cb177235ed52fa285d24309f7ab065eee2b69bb7c2c7c20211829883bb2250bce0d233c203748661cdbf9007dacf93746176e2bf4f67fd90a01bfc55723e783729b887 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !989906fd9f5f75949d1a37e67787ee1ef6e9a363200079e05becff5d47ad954753e5573aa490a193560dc32bdfeacad0e1ba94762967d31a87c3a5ba4ca89eb00db5f3ed51c5f6aa987bd68b8d7d6faccb4c3ee81a9d2d2f1ad36af8717765c076632448b4dea1c7e9cff8ebcb4a56cf6232aff243cdc94d5e3cb1; + 1 encin + !989906fd9f5f75949d1a37e67787ee1ef6e9a363200079e05becff5d47ad954753e5573aa490a193560dc32bdfeacad0e1ba94762967d31a87c3a5ba4ca89eb00db5f3ed51c5f6aa987bd68b8d7d6faccb4c3ee81a9d2d2f1ad36af8717765c076632448b4dea1c7e9cff8ebcb4a56cf6232aff243cdc94d5e3cb1 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !4a372dac2c861d6198141bbe14c36939fe30c5766fe2aa1c6c97c236e131f0fc77255636552d9a201c598c69d72482886db1ce216c50cfb870e622ad866518f6ce0d69d4bb6af0d53105a024ac3af6a684ce751dd2ce22b4aedf869f4c4ac8153e4c6c11188a1a7efa9ad48f0c219447bb0b2db7863495224cfb92f9; + 1 encin + !4a372dac2c861d6198141bbe14c36939fe30c5766fe2aa1c6c97c236e131f0fc77255636552d9a201c598c69d72482886db1ce216c50cfb870e622ad866518f6ce0d69d4bb6af0d53105a024ac3af6a684ce751dd2ce22b4aedf869f4c4ac8153e4c6c11188a1a7efa9ad48f0c219447bb0b2db7863495224cfb92f9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !49cdb3599b611bcb646931ea2cd3c1060ee0a9929da09814766ec5a2b21c40b45f538d495a5222dedcc132cbb1ec9fac86413e51968c986a461376b32d9ef7e46d6eb78d30c1de2cdbe962406299f415b71bf161b2b281f86bc78d4c607d1998ddd54605a5c320da45733d83f6025cbfd8040f238be9e599d2c75b8966; + 1 encin + !49cdb3599b611bcb646931ea2cd3c1060ee0a9929da09814766ec5a2b21c40b45f538d495a5222dedcc132cbb1ec9fac86413e51968c986a461376b32d9ef7e46d6eb78d30c1de2cdbe962406299f415b71bf161b2b281f86bc78d4c607d1998ddd54605a5c320da45733d83f6025cbfd8040f238be9e599d2c75b8966 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ea38bad18ac44276bd7a3f160166311eb27e5290267e2f9532d3780bc31d47ff1a3b14f4dc4ca025f5f62735205fdbe6c26f96cbcdef43b6a00f22ea30cf76068decad0d9bea2c943f112cc0233d862f9f729e1a8563c3aaa8d9dd7ea6060c4d080be791865b38d54517e01a7bc06b8172347dfcfa58a4af0cb726ec0615; + 1 encin + !ea38bad18ac44276bd7a3f160166311eb27e5290267e2f9532d3780bc31d47ff1a3b14f4dc4ca025f5f62735205fdbe6c26f96cbcdef43b6a00f22ea30cf76068decad0d9bea2c943f112cc0233d862f9f729e1a8563c3aaa8d9dd7ea6060c4d080be791865b38d54517e01a7bc06b8172347dfcfa58a4af0cb726ec0615 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !cb799d41fdeca9a8edf3be872ef7ae761b03f63503d4d9e7296c386dbc4032396844e9949a77dff11174a74d0f0d90a6cd54f8f32188756639949478dc73a386d79dff19238a2ea6d5595e5015ac55f5bba55390a8d1c0eeaf908068167c7b86b4633b632cb0e271c35506baad8f79a63e04face56d157101c7bfa2f6aaadb; + 1 encin + !cb799d41fdeca9a8edf3be872ef7ae761b03f63503d4d9e7296c386dbc4032396844e9949a77dff11174a74d0f0d90a6cd54f8f32188756639949478dc73a386d79dff19238a2ea6d5595e5015ac55f5bba55390a8d1c0eeaf908068167c7b86b4633b632cb0e271c35506baad8f79a63e04face56d157101c7bfa2f6aaadb + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1730946f2b7514c84c2bb6ac6e268d42627d50a468c466a6fb8e7b6a27062df5b9bd67c858bd2b174a8ae43e506177fceaafde77296c5febf48fb91b6fbd38bd476bc5f4b1b246516ac7cb536887dad9e7a058ccff5733c443fdcb4ec7fccec491f204e07e801ada05af9df8b267ec7669b1d213d74fdb4c996ac67ff7b14d79; + 1 encin + !1730946f2b7514c84c2bb6ac6e268d42627d50a468c466a6fb8e7b6a27062df5b9bd67c858bd2b174a8ae43e506177fceaafde77296c5febf48fb91b6fbd38bd476bc5f4b1b246516ac7cb536887dad9e7a058ccff5733c443fdcb4ec7fccec491f204e07e801ada05af9df8b267ec7669b1d213d74fdb4c996ac67ff7b14d79 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !9e8b99a3af0f1e8b6316b1c0efcd812160803e80b9652d059bf2f85ec2e91581c6128e2d2afbfae23accfda5acfab80baad8466e97f3f73899ccbd9de6048dd85aeb5ab78a39fdca62af5a4c556feddbf97a50f7fc376c3a41c46bb599d6a44334dcb17a03fa93262aae1041322dcc17d7e08a655985fe6574db79f951f336bda7; + 1 encin + !9e8b99a3af0f1e8b6316b1c0efcd812160803e80b9652d059bf2f85ec2e91581c6128e2d2afbfae23accfda5acfab80baad8466e97f3f73899ccbd9de6048dd85aeb5ab78a39fdca62af5a4c556feddbf97a50f7fc376c3a41c46bb599d6a44334dcb17a03fa93262aae1041322dcc17d7e08a655985fe6574db79f951f336bda7 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a21883c5d37094d553045637551fd4993ee73471e6fd2152111a3c5336622130199e981dce4ec30a8f151d6b1b3b070a343196c8624146f6247bc79bee489e883d2a6e720995b684c5b30f9aa734b6f1891ccaf05f464dcd9bcfbdcbac372e28845de339f8920716ba6efe914c166817c74f2df2e5331997426548a92be3a2dd5679; + 1 encin + !a21883c5d37094d553045637551fd4993ee73471e6fd2152111a3c5336622130199e981dce4ec30a8f151d6b1b3b070a343196c8624146f6247bc79bee489e883d2a6e720995b684c5b30f9aa734b6f1891ccaf05f464dcd9bcfbdcbac372e28845de339f8920716ba6efe914c166817c74f2df2e5331997426548a92be3a2dd5679 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !8d5a18f2b27043ec61d95990211be55d3901870f9ef30b2403e59bd09b30617f5e5043089ebd916a3f13591d72d7394ad4b2dc66ebebb7c1c5e6329525d8bf1c2cfe5f657363c180bd37f39f8e0fe67c16918d02a7dbc30d4436441d8383b7b50e8ce8d414506c20917b29d4b0f249fefef11cac8af387d27d0d45149860685143cbc0; + 1 encin + !8d5a18f2b27043ec61d95990211be55d3901870f9ef30b2403e59bd09b30617f5e5043089ebd916a3f13591d72d7394ad4b2dc66ebebb7c1c5e6329525d8bf1c2cfe5f657363c180bd37f39f8e0fe67c16918d02a7dbc30d4436441d8383b7b50e8ce8d414506c20917b29d4b0f249fefef11cac8af387d27d0d45149860685143cbc0 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !c512f89967db78a64284f9e8975327fe142cce566d2adad60dc3ec81d462877fea4fe06a32428b9a148dd9a8d4a661be6c56582e30a65d6e3289c08dcadcc717e4e9f785a7a887d652174f586286d9d2104171f938b084ed61dc5df1158c328e361c75b9901807dd2563d1be9c1507b4dbd1bafefb837ff8a2538c131425a27d29d59938; + 1 encin + !c512f89967db78a64284f9e8975327fe142cce566d2adad60dc3ec81d462877fea4fe06a32428b9a148dd9a8d4a661be6c56582e30a65d6e3289c08dcadcc717e4e9f785a7a887d652174f586286d9d2104171f938b084ed61dc5df1158c328e361c75b9901807dd2563d1be9c1507b4dbd1bafefb837ff8a2538c131425a27d29d59938 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !467c5e146445701168ce494b307cd12c729189b1c1176ff06ef8f93ff1b0690f311e284b68380395224cdea9e382a69b8d5fe027a5f79ccab42f523a1749362873aed701acbede76da4614cc538310027a37bcb6518e19c8ce3ab8b7c98f486217e3263887566cc8be7447cd5b14bfd27ed2336496ee9b4542603456d0511bbcebe3d1a2f8; + 1 encin + !467c5e146445701168ce494b307cd12c729189b1c1176ff06ef8f93ff1b0690f311e284b68380395224cdea9e382a69b8d5fe027a5f79ccab42f523a1749362873aed701acbede76da4614cc538310027a37bcb6518e19c8ce3ab8b7c98f486217e3263887566cc8be7447cd5b14bfd27ed2336496ee9b4542603456d0511bbcebe3d1a2f8 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !0fb913af1109a3ba37d5085ea5540b1ee92c5aed16f00fad7aad185e67c6071be4d496df368c7bf8e4acabd275754a6f1e8f59dd5c590dd4f43e86f4f150dd5a6f2d8f79852ab4df1274b660720409993effaff1da293fdf035acee7a60ad46a5f8d308aeeb97124f2429c4f19354faa8a2ef7dbfc7a44685601dbff5561dcd7d69e8d6b9e87; + 1 encin + !0fb913af1109a3ba37d5085ea5540b1ee92c5aed16f00fad7aad185e67c6071be4d496df368c7bf8e4acabd275754a6f1e8f59dd5c590dd4f43e86f4f150dd5a6f2d8f79852ab4df1274b660720409993effaff1da293fdf035acee7a60ad46a5f8d308aeeb97124f2429c4f19354faa8a2ef7dbfc7a44685601dbff5561dcd7d69e8d6b9e87 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !26d41ee387956931db354efe7fb8bc6a517e5418806986d8f758934f40f61d71788296cd7e3fee5f8c2ccd32375527c39c4de49b53c6c71726145fb173bd091230842edfc5f54c9ec2012c06decd95881d9da61d4c93ba6c7fff662073969fd74eb12a3b8ed255b01fc2c138f45033c03a77b127d0a17d4a00c02599fea636e1afbb257b9afb92; + 1 encin + !26d41ee387956931db354efe7fb8bc6a517e5418806986d8f758934f40f61d71788296cd7e3fee5f8c2ccd32375527c39c4de49b53c6c71726145fb173bd091230842edfc5f54c9ec2012c06decd95881d9da61d4c93ba6c7fff662073969fd74eb12a3b8ed255b01fc2c138f45033c03a77b127d0a17d4a00c02599fea636e1afbb257b9afb92 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !67f8a44aaff6a6854b93913b91acf1ff4279196ead3237bb06ec6186ed2ce0d0b89adaed048d0fd098e2192fd3ea2a61657f05d488a9ed67078d93ae8b90d45b2498a368cdb1da1c90aca04f6d1109bbbe219b6dc9f8a9c74aaf30ad127d50286409d9ee829a20c25b365bef91582c0261d6b34adbe0cdc638b90c17edf99f8b1464986012542dba; + 1 encin + !67f8a44aaff6a6854b93913b91acf1ff4279196ead3237bb06ec6186ed2ce0d0b89adaed048d0fd098e2192fd3ea2a61657f05d488a9ed67078d93ae8b90d45b2498a368cdb1da1c90aca04f6d1109bbbe219b6dc9f8a9c74aaf30ad127d50286409d9ee829a20c25b365bef91582c0261d6b34adbe0cdc638b90c17edf99f8b1464986012542dba + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !cdda0d5dc2e67d6068e0489111a8a7b04beb7acd74f69fc6ee867ad5da4fdf93267b2085186a8c243b61bf93b9ecaa3f4288597cf18ced9dab52efa3cb52b01211527a90872755862c765d659baa936a5eb74d2c5de82206ae1b170183ea10f49de534928879d813b4f450c3c1b8f5e80de7282b010a3c1d20214b0127fd0ab1fa34818275cc959540; + 1 encin + !cdda0d5dc2e67d6068e0489111a8a7b04beb7acd74f69fc6ee867ad5da4fdf93267b2085186a8c243b61bf93b9ecaa3f4288597cf18ced9dab52efa3cb52b01211527a90872755862c765d659baa936a5eb74d2c5de82206ae1b170183ea10f49de534928879d813b4f450c3c1b8f5e80de7282b010a3c1d20214b0127fd0ab1fa34818275cc959540 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ff7cf9c75c7604cbb436d1b77819520b3fba90750073a66ed6df1533aa012bae59b17d5dc60832695394f3f9893857169ae23d961c96c6ec35054e55d600a62c9f0313780a7b8b3e6c55b3d268fdc25bcd379971fd82639c375ff0ca93b116bb992b137758c8ccfb1379406d50f64d58095b90076561706ab302db92d47c4ebf54ca9b2ba5594c1cd67f; + 1 encin + !ff7cf9c75c7604cbb436d1b77819520b3fba90750073a66ed6df1533aa012bae59b17d5dc60832695394f3f9893857169ae23d961c96c6ec35054e55d600a62c9f0313780a7b8b3e6c55b3d268fdc25bcd379971fd82639c375ff0ca93b116bb992b137758c8ccfb1379406d50f64d58095b90076561706ab302db92d47c4ebf54ca9b2ba5594c1cd67f + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !57b2bfaec0af01a35c50b5b0d8d6dd4ca5d9cb51ecaa601e31f845cc6772b6522112c913ef6f3b875ff364f91d60b340b687e1d54163e05086b69518c6697faa995a4cbbe7b467ec7d49b6cdd074d3458de3bf45eb468b3b6e4949725bb6d67e2e69788d35bb36817791f2d55b1289281f614d48f6d74f20856be25523e285df3febfb775289b4491635b2; + 1 encin + !57b2bfaec0af01a35c50b5b0d8d6dd4ca5d9cb51ecaa601e31f845cc6772b6522112c913ef6f3b875ff364f91d60b340b687e1d54163e05086b69518c6697faa995a4cbbe7b467ec7d49b6cdd074d3458de3bf45eb468b3b6e4949725bb6d67e2e69788d35bb36817791f2d55b1289281f614d48f6d74f20856be25523e285df3febfb775289b4491635b2 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !55af1f6bbdc6cb39b760e9f2b0bb10078cac8178deed373a5593730cf99c67356a352dcd3c6cbbd046cbb0c4f1e0c4658e982f4052a908c95e53d18704eb50d1d53a4ac371a96eecbca72a017ad9e91a34842233e48450b191ac8bd18d0e55d8ce893f690d50ebba44c7c85f1cce6e99b6eb7f626ba32729c4871222e893592df5904ac3a102d139ebb8ad6a; + 1 encin + !55af1f6bbdc6cb39b760e9f2b0bb10078cac8178deed373a5593730cf99c67356a352dcd3c6cbbd046cbb0c4f1e0c4658e982f4052a908c95e53d18704eb50d1d53a4ac371a96eecbca72a017ad9e91a34842233e48450b191ac8bd18d0e55d8ce893f690d50ebba44c7c85f1cce6e99b6eb7f626ba32729c4871222e893592df5904ac3a102d139ebb8ad6a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !817f9d166e2324ca704127c3235a0201526f6cae694aa8a8a8cfab625d28f75a639c816562ac0f520b8ce5f075be45cd939a1978224d9b7a5cc703a623cf7c1c255825f246b6ff608bd90a859d6e4119b27e48018c8acf6fb82ea093d2c926a3f4a5f0d7f91953c0610858d063f2d28fb13c12d8f02a0c078707408c323ba8be17ce2a8df6862095adce0ead83; + 1 encin + !817f9d166e2324ca704127c3235a0201526f6cae694aa8a8a8cfab625d28f75a639c816562ac0f520b8ce5f075be45cd939a1978224d9b7a5cc703a623cf7c1c255825f246b6ff608bd90a859d6e4119b27e48018c8acf6fb82ea093d2c926a3f4a5f0d7f91953c0610858d063f2d28fb13c12d8f02a0c078707408c323ba8be17ce2a8df6862095adce0ead83 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !7298ea337f59a018915318a4d0db523f1df3d0be7c3da956e040361f40e48eb7e0bc2dfa76e840cd47e3d62c6345be06a0b05cbb17633c1892f0c4d5d9929bde4ddf116b6114e10ed97c625702f60dfcf2c9bbf89f4602490c35f9098d6f345fcd2c4988ff1a67033ed4eea7949432ff1e01ac43a0f134d221e6aea1b3c8d48c137a28da8b1f27b87fa698732cb0; + 1 encin + !7298ea337f59a018915318a4d0db523f1df3d0be7c3da956e040361f40e48eb7e0bc2dfa76e840cd47e3d62c6345be06a0b05cbb17633c1892f0c4d5d9929bde4ddf116b6114e10ed97c625702f60dfcf2c9bbf89f4602490c35f9098d6f345fcd2c4988ff1a67033ed4eea7949432ff1e01ac43a0f134d221e6aea1b3c8d48c137a28da8b1f27b87fa698732cb0 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !7cdf8bf7ca3c72b62bbf780fb64e525aed5941c5b427df53214e667aad02e66214082074bf5289412f065e28b5519d9e72990e7da6b821939b7003ed9d14be5d8e40e5b108163143032cf3ec8de24223ba39a7b31d3758a26992c0282bc8750768b9d7dc4873ea35a09dbfe21e87bf8dac2864cd7a6f9f233945a6d90a34b82c75b9cf3041d026a56f67c00b78dcc4; + 1 encin + !7cdf8bf7ca3c72b62bbf780fb64e525aed5941c5b427df53214e667aad02e66214082074bf5289412f065e28b5519d9e72990e7da6b821939b7003ed9d14be5d8e40e5b108163143032cf3ec8de24223ba39a7b31d3758a26992c0282bc8750768b9d7dc4873ea35a09dbfe21e87bf8dac2864cd7a6f9f233945a6d90a34b82c75b9cf3041d026a56f67c00b78dcc4 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !bfd7ed1fb1d60722deed37eee14269fa78711a348e141f74f1dc099369785bdf7ca057e1a9b8b8c312d780c714d0573a2d3f470c095f860eaa12f69178ea50e69c0c328cdcbd5e224c303f58ed28063c2bfb6ee0744de16664d3fbf3a865e5a4d24535d2ba07033f20ffdb85b3c7877aff32b8d221108b3ae453df3d83741b4d78b55b2541eae332e38083d56e9bacf9; + 1 encin + !bfd7ed1fb1d60722deed37eee14269fa78711a348e141f74f1dc099369785bdf7ca057e1a9b8b8c312d780c714d0573a2d3f470c095f860eaa12f69178ea50e69c0c328cdcbd5e224c303f58ed28063c2bfb6ee0744de16664d3fbf3a865e5a4d24535d2ba07033f20ffdb85b3c7877aff32b8d221108b3ae453df3d83741b4d78b55b2541eae332e38083d56e9bacf9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !e7c484b50b855361c92113e093248397d429ad660b492d7cee162225be9be63c73a97d70202e511222075a6d456af4a1db02e9db54a120cc34088813c8c9ff466382147470a64c9376508d5198051dc5956a1ecca55da430a897922cf9feb2a02dd1230b015bc7693ba20a159dc2bb33df14b9a07d84815b51aa87b2a95fd3c6e641de935958e8bd39c0d4fb9f1bd8e090; + 1 encin + !e7c484b50b855361c92113e093248397d429ad660b492d7cee162225be9be63c73a97d70202e511222075a6d456af4a1db02e9db54a120cc34088813c8c9ff466382147470a64c9376508d5198051dc5956a1ecca55da430a897922cf9feb2a02dd1230b015bc7693ba20a159dc2bb33df14b9a07d84815b51aa87b2a95fd3c6e641de935958e8bd39c0d4fb9f1bd8e090 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d074a37adcf01819fc6a0d9147bf55b3c4ef2f14f900ae750241648c134428dad5138117bc92b9ea4c0bb8838c8e578e909effb483d63b59500bce9e6ead001d8d21aef7cad4bf92ce2b7ae99885ea1444d065fc58026682d4e7d6f25fbb4952e2ce5fc50796a0332fabaa3a7cc3521d3a1d3994ef0cc3324ee0c04c928b3054326fff80bdbbe2c0ca251cefa84ff86e3e6e; + 1 encin + !d074a37adcf01819fc6a0d9147bf55b3c4ef2f14f900ae750241648c134428dad5138117bc92b9ea4c0bb8838c8e578e909effb483d63b59500bce9e6ead001d8d21aef7cad4bf92ce2b7ae99885ea1444d065fc58026682d4e7d6f25fbb4952e2ce5fc50796a0332fabaa3a7cc3521d3a1d3994ef0cc3324ee0c04c928b3054326fff80bdbbe2c0ca251cefa84ff86e3e6e + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !990e4ae01929cd998c3568ec423b4bd62a07a635453bb8a75c68c7db0ed42661294b8f7b0ba120885bcde030fadd1f8ef4f72650789da415ca81dc28b215d981909d6f67d3c03742028538a679b3f20ddae154b4d050748da40c93c2a6dd38287838118245ce3005f653aaf3af86e4b52159fd43984bca37f5c16b880c64154330134903dae9cddc6606f67acb5efb98eaf9ee; + 1 encin + !990e4ae01929cd998c3568ec423b4bd62a07a635453bb8a75c68c7db0ed42661294b8f7b0ba120885bcde030fadd1f8ef4f72650789da415ca81dc28b215d981909d6f67d3c03742028538a679b3f20ddae154b4d050748da40c93c2a6dd38287838118245ce3005f653aaf3af86e4b52159fd43984bca37f5c16b880c64154330134903dae9cddc6606f67acb5efb98eaf9ee + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ad097be738311d2e3d2a39e3ee1b4bfe04bec56469d598b4b4e8834fc676df55cc9c84dbfaef232c595d15a89aabd037e9dc42227222e73aba94237615e296bc0f74e5cb363f16ddfb688c03fdfa10de2a24b5363241830d90dabfcd2fcd5759728ed2a8e65698780dc4851868791d86984ea5950f84e23e02ead6128cd93e68139b87f4ff50b53aef621ffc0bb6f8c645081765; + 1 encin + !ad097be738311d2e3d2a39e3ee1b4bfe04bec56469d598b4b4e8834fc676df55cc9c84dbfaef232c595d15a89aabd037e9dc42227222e73aba94237615e296bc0f74e5cb363f16ddfb688c03fdfa10de2a24b5363241830d90dabfcd2fcd5759728ed2a8e65698780dc4851868791d86984ea5950f84e23e02ead6128cd93e68139b87f4ff50b53aef621ffc0bb6f8c645081765 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a292c951bf6914dc7215b8cc0643713e537adad6c5277ae3ffbab54cd6b6ba66b26e09b793af29e1b076e4c42a604385a1cb10e7e62b1b80a5b629305d343ef63a259c2b80e08b3c9f81dd5f9d81cce72ebd43b819efb12538f6a4d2ecfd20cb792106d4f830f47e17b1868514ce494c5394701bc4f0c7e6f151631953527b78b21f5127e128984d2b97cdb8e36e8c38fb084f9e86; + 1 encin + !a292c951bf6914dc7215b8cc0643713e537adad6c5277ae3ffbab54cd6b6ba66b26e09b793af29e1b076e4c42a604385a1cb10e7e62b1b80a5b629305d343ef63a259c2b80e08b3c9f81dd5f9d81cce72ebd43b819efb12538f6a4d2ecfd20cb792106d4f830f47e17b1868514ce494c5394701bc4f0c7e6f151631953527b78b21f5127e128984d2b97cdb8e36e8c38fb084f9e86 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d78adbbbaf2c814d5ece2c7d946606951b1801c95be9594398aa6c1121bd48892f5e53b27a364a4d4d60a5ffdbf430b9e0058594e9a18bd0f875e0d3525b326e629f5a2a8552eef0c09188364ed7a1c27b59cd5b29155d77db49051eee69b6f01f49d23dcb5fb00e4c649a2cab73b34ca2ce7f7e307e9ae50ce9ff6b718a6165a5b0053d1fa94ee35ee2052d19215d6f92801c6263c0; + 1 encin + !d78adbbbaf2c814d5ece2c7d946606951b1801c95be9594398aa6c1121bd48892f5e53b27a364a4d4d60a5ffdbf430b9e0058594e9a18bd0f875e0d3525b326e629f5a2a8552eef0c09188364ed7a1c27b59cd5b29155d77db49051eee69b6f01f49d23dcb5fb00e4c649a2cab73b34ca2ce7f7e307e9ae50ce9ff6b718a6165a5b0053d1fa94ee35ee2052d19215d6f92801c6263c0 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !91553d2f6c335608f38b20fef4372d877d851d9f15f3088ea772a77880a9761784912d9863ab94984e7a047241b048d4fbf9dd3ae6f69be65b3a9fac8da0a3fc83968d9cde57f062eb67404b86eee957263b1bbd6d73d76bef122c5262fd33d2a84bccb5f39743b47f23d73850e68796a603ecf1957025ee90608b66c6137f08d56c4e2d5866265943dd1d5057a2495add3db8093d9359; + 1 encin + !91553d2f6c335608f38b20fef4372d877d851d9f15f3088ea772a77880a9761784912d9863ab94984e7a047241b048d4fbf9dd3ae6f69be65b3a9fac8da0a3fc83968d9cde57f062eb67404b86eee957263b1bbd6d73d76bef122c5262fd33d2a84bccb5f39743b47f23d73850e68796a603ecf1957025ee90608b66c6137f08d56c4e2d5866265943dd1d5057a2495add3db8093d9359 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !38a6a59d061f04f11ba59e1a39bdeaf5394895f788738eff0def07797d99371f02ad9f1f5e624308c1356730f1561008e0ae46ee68439715107ab75bdf960f5d2970c3899735fe9ae934afeb67a862c54eef175cbeaf856e84ca623f1e33084c21f9e5d7e68808b26edff9b08584537453f60ddbd52affd973423a3e671f5010f84908a9d76ee8e3a63b7d70f79e26c90f865a265184ba64; + 1 encin + !38a6a59d061f04f11ba59e1a39bdeaf5394895f788738eff0def07797d99371f02ad9f1f5e624308c1356730f1561008e0ae46ee68439715107ab75bdf960f5d2970c3899735fe9ae934afeb67a862c54eef175cbeaf856e84ca623f1e33084c21f9e5d7e68808b26edff9b08584537453f60ddbd52affd973423a3e671f5010f84908a9d76ee8e3a63b7d70f79e26c90f865a265184ba64 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !88368e2008e4625020bdc44e0ce3a7931a4e8ae20d109ff1ea15dadc5f5f20a20c397c08defe92c08bb3c9616af246a1081e79b3fab37030580c1184cc7b0e10ec37c7e0ca79e8cb2dc356fbdc920162407dbf70f16e44cddd14d96159e8ea3b90231f35356976c508ee854085bca1cd2601cdc4aeff90aa1e341a64f164acd6e75fdb4344bee0950c4c93a66cd73b58c9ad4969d704e4bef8; + 1 encin + !88368e2008e4625020bdc44e0ce3a7931a4e8ae20d109ff1ea15dadc5f5f20a20c397c08defe92c08bb3c9616af246a1081e79b3fab37030580c1184cc7b0e10ec37c7e0ca79e8cb2dc356fbdc920162407dbf70f16e44cddd14d96159e8ea3b90231f35356976c508ee854085bca1cd2601cdc4aeff90aa1e341a64f164acd6e75fdb4344bee0950c4c93a66cd73b58c9ad4969d704e4bef8 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !61bfce8ba6e1b8c43b1cb6d42068b9a05732db6d7ab6c6bf0eb5646952dfdedaaab8c098b68ff62bd5afefcdb8b9efa817db9a2c73287c80770cccaa904f978608cd084d64dfcff4694cba64d197f4d51d7bf727cb55c6218470ac2c4cf0097dc5af9e1aba3853f935c90627e8520c6c2dab7f49f8614c6aa2d732ae04483446925d6a24ae292ec5a5b5c614f3570f2cd4b2e7b43e3895708926; + 1 encin + !61bfce8ba6e1b8c43b1cb6d42068b9a05732db6d7ab6c6bf0eb5646952dfdedaaab8c098b68ff62bd5afefcdb8b9efa817db9a2c73287c80770cccaa904f978608cd084d64dfcff4694cba64d197f4d51d7bf727cb55c6218470ac2c4cf0097dc5af9e1aba3853f935c90627e8520c6c2dab7f49f8614c6aa2d732ae04483446925d6a24ae292ec5a5b5c614f3570f2cd4b2e7b43e3895708926 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !7a2ede61e2fde8e1745851495017a161de04c347153f7ec572b4c60b22e1c10509a5767dd664f2df7d1d8e86f2262396d0fcb7e7339fe53f4c80882b4d2b43add0736694a7829bda043cc744f236f1f5b9f61f7fd77b38819257f1e7c632d84e23d40e921b65b04439afa64c053cc9a3dc42e95c089495b571bc7493ded7c9c6be32e1a5288d3ca20861c9bbaf1261909acfa6a66a1ee3dce159de; + 1 encin + !7a2ede61e2fde8e1745851495017a161de04c347153f7ec572b4c60b22e1c10509a5767dd664f2df7d1d8e86f2262396d0fcb7e7339fe53f4c80882b4d2b43add0736694a7829bda043cc744f236f1f5b9f61f7fd77b38819257f1e7c632d84e23d40e921b65b04439afa64c053cc9a3dc42e95c089495b571bc7493ded7c9c6be32e1a5288d3ca20861c9bbaf1261909acfa6a66a1ee3dce159de + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d7caceec9406ce456325d8c2d72a56fc3c648e949eb2e69f815f6a4607a3dcc2d980d15672325f3aa714f7c3560aaa7076912cb9a9073d382730a4d2f08636f5c8a75252a4517355845f2bf956c1768694aa523b94440e01d526ce4f1d289c413f02ad16b5de0de49602ec3469edd588c06a8f40eb25ef5440ec4ea5d9ff3c35aa75468b05026b6850895e64fc6ff718ef4f6988972d978a679c7550; + 1 encin + !d7caceec9406ce456325d8c2d72a56fc3c648e949eb2e69f815f6a4607a3dcc2d980d15672325f3aa714f7c3560aaa7076912cb9a9073d382730a4d2f08636f5c8a75252a4517355845f2bf956c1768694aa523b94440e01d526ce4f1d289c413f02ad16b5de0de49602ec3469edd588c06a8f40eb25ef5440ec4ea5d9ff3c35aa75468b05026b6850895e64fc6ff718ef4f6988972d978a679c7550 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !2d651c94a7ed4d02d256b4039661e0dc59e6a15b582e2aaa4931ad644d9765ffea394266410efa7502bd4a86a9f45f1c337c18510bbfa4f5bd40d9d1d0ba37f216d0980647266f382e448f8911c02f4840f9aa5c7dfc1a60bfbe90822358d46b7ef3bce139112101dc85ad5153233429cee3cfb9399c028400bdf7010083ab5defc0a2e3be79f95f76995e5e466641743d410533a5ca6e2b398da11bb5; + 1 encin + !2d651c94a7ed4d02d256b4039661e0dc59e6a15b582e2aaa4931ad644d9765ffea394266410efa7502bd4a86a9f45f1c337c18510bbfa4f5bd40d9d1d0ba37f216d0980647266f382e448f8911c02f4840f9aa5c7dfc1a60bfbe90822358d46b7ef3bce139112101dc85ad5153233429cee3cfb9399c028400bdf7010083ab5defc0a2e3be79f95f76995e5e466641743d410533a5ca6e2b398da11bb5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !0976f8129dd12c3f8dea983af67ae3aadfbdafd1fc4070454e5f48a69491e6fb34abb1aba463547b8ac75b036c8acbf71760d560453da42b4d6eb9d648a9e3305329fcf206291d3ce91da0a00f3d7d9f56f5e828b5403c1ea451d731c8751a07943cccade4d76bc4ad467a08a35f3d5f2412ea96ff4affad059e5b13d8aac4160e40b13406cdf643df1a70d9f9a564c3c104f66b1e341cb70b0e9768c903; + 1 encin + !0976f8129dd12c3f8dea983af67ae3aadfbdafd1fc4070454e5f48a69491e6fb34abb1aba463547b8ac75b036c8acbf71760d560453da42b4d6eb9d648a9e3305329fcf206291d3ce91da0a00f3d7d9f56f5e828b5403c1ea451d731c8751a07943cccade4d76bc4ad467a08a35f3d5f2412ea96ff4affad059e5b13d8aac4160e40b13406cdf643df1a70d9f9a564c3c104f66b1e341cb70b0e9768c903 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !976ef493928a00c12152f71ee7f0471090b83d2443131f0f5906e825dd28a42601dee4a590eb773e9accb1c9651fe70d12ebad1ed6e48534a2c532dbb8da858ad46612cec9a3a1189643f3321b7cb1b450b1a2b536d4b80be7809693ebbd3a621e13d3fa245fe32cb36b38e42f83db93b5318caadc6ca85f74f4a9f15b01e1524a2f63e713b28fa8fd9f42ae5b46c1734f6d93b3bf7845e44275af3051d8d4; + 1 encin + !976ef493928a00c12152f71ee7f0471090b83d2443131f0f5906e825dd28a42601dee4a590eb773e9accb1c9651fe70d12ebad1ed6e48534a2c532dbb8da858ad46612cec9a3a1189643f3321b7cb1b450b1a2b536d4b80be7809693ebbd3a621e13d3fa245fe32cb36b38e42f83db93b5318caadc6ca85f74f4a9f15b01e1524a2f63e713b28fa8fd9f42ae5b46c1734f6d93b3bf7845e44275af3051d8d4 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !8ac2ef579459419d2d55a05cc2b1b38f2c214f917b6803c414487e168415010103ec052e2d34110a9400993c3db3ae2811153428a4bd102f7002d253db77da3bb8f19dd64cb2c9889e777c0e91d6935815f46f69ca20c7ce9ce987f1a8f53d2d827dd7966c7e3f678e6ae080db3b3139c6ac83f821d17c45e4a385e47b5257387f2bdcc8d95cc465b240fb0149499035a5dd93f428eb8a42793fbb9e4ae88d67; + 1 encin + !8ac2ef579459419d2d55a05cc2b1b38f2c214f917b6803c414487e168415010103ec052e2d34110a9400993c3db3ae2811153428a4bd102f7002d253db77da3bb8f19dd64cb2c9889e777c0e91d6935815f46f69ca20c7ce9ce987f1a8f53d2d827dd7966c7e3f678e6ae080db3b3139c6ac83f821d17c45e4a385e47b5257387f2bdcc8d95cc465b240fb0149499035a5dd93f428eb8a42793fbb9e4ae88d67 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !930bc40db6824175fec1a6ac155183afb11bdbb2ff1c32a4425f7667171e1271ac4d436c10c839bc85a1172a4095501e62a53a0c5933a7fee45b5415dc26bb68fbb4768b4bee89b14bce1459a8f46d84d2ac9f5fa4b43f66a719a1d74837da85de979ea0ff975441f8ec34225a17a4a326fc6273614d4643c672da8d8a22a8cac265adaf916b7bd11f30e8282a268e4abb16fed4677dc963bcf5e360b03d862adb; + 1 encin + !930bc40db6824175fec1a6ac155183afb11bdbb2ff1c32a4425f7667171e1271ac4d436c10c839bc85a1172a4095501e62a53a0c5933a7fee45b5415dc26bb68fbb4768b4bee89b14bce1459a8f46d84d2ac9f5fa4b43f66a719a1d74837da85de979ea0ff975441f8ec34225a17a4a326fc6273614d4643c672da8d8a22a8cac265adaf916b7bd11f30e8282a268e4abb16fed4677dc963bcf5e360b03d862adb + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d18d19dc4a66a1994dd58caa14ae538160d710af67597889f5c5d7d1a6c2a7d076ac4fb070200e0e1deecd1d0f1189dea5f2d542b8375317fe734a52cda4b40b414816201de095841a89db465cbbc198b4e3d2239afd4b07add7cf5e4ba5c934c65a485e8c2d682546d28f435234b6208ad0fe9f02192bb9b2c1b73e20716e39525f586f12f5f9fe8e0c58381b8f26651794a3156261b94795e98cb494b8402f0034; + 1 encin + !d18d19dc4a66a1994dd58caa14ae538160d710af67597889f5c5d7d1a6c2a7d076ac4fb070200e0e1deecd1d0f1189dea5f2d542b8375317fe734a52cda4b40b414816201de095841a89db465cbbc198b4e3d2239afd4b07add7cf5e4ba5c934c65a485e8c2d682546d28f435234b6208ad0fe9f02192bb9b2c1b73e20716e39525f586f12f5f9fe8e0c58381b8f26651794a3156261b94795e98cb494b8402f0034 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !8f6ed81d1b3df9d227a6c0d1d7fcbd0dac459e92a6c8e7ede2f3f58767722026d6308129bb753818e0ec585a5e3e56dab714ae1aae8b7bc2e0625e0ef8294d1d7a048bd25bef0dfe581c08356ea0198430698d2499f0b833f6e3d22d8cdf7abfb3178365c082d274014fe6afcdd0e8e024c89f75f9ee6a12357684612d557ed1544931a04ab1ebedc73450f9126f805f62660e46298a930af945d5e737365b8eed349e; + 1 encin + !8f6ed81d1b3df9d227a6c0d1d7fcbd0dac459e92a6c8e7ede2f3f58767722026d6308129bb753818e0ec585a5e3e56dab714ae1aae8b7bc2e0625e0ef8294d1d7a048bd25bef0dfe581c08356ea0198430698d2499f0b833f6e3d22d8cdf7abfb3178365c082d274014fe6afcdd0e8e024c89f75f9ee6a12357684612d557ed1544931a04ab1ebedc73450f9126f805f62660e46298a930af945d5e737365b8eed349e + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !394cc6c775f2c9d0f178ccab1f32a9beb6f19f33bc82aaf734f30b4499a70ea6cad8e3c074766a466c7f541a460453b99bde9a5119a83f6360aeced4dfea527178008c38ea08a27352f731e8e5f2698e1fc030e26378bb597a6cb1153e2b2c6c2ed827efa4d941e3caecbbbbc16036cf614f0f8ebb1d355003f854c90b8e1ad325ba6269bbfc1807a8e067a546523c6e0b0a034affc0a4c8f8d10bd9d7f926e6c383c6d8; + 1 encin + !394cc6c775f2c9d0f178ccab1f32a9beb6f19f33bc82aaf734f30b4499a70ea6cad8e3c074766a466c7f541a460453b99bde9a5119a83f6360aeced4dfea527178008c38ea08a27352f731e8e5f2698e1fc030e26378bb597a6cb1153e2b2c6c2ed827efa4d941e3caecbbbbc16036cf614f0f8ebb1d355003f854c90b8e1ad325ba6269bbfc1807a8e067a546523c6e0b0a034affc0a4c8f8d10bd9d7f926e6c383c6d8 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !503e331b0acc00f2fc35dd9d8f145b2eb5c2e1ed3204dfdcc0a624eabd913ffac3dd87cd30a972df89ec6ccf43cfaadf5deca3c0448d510600068033201099f1c8e3f08eadb73ee63bc06e63e7df525458abf9b54113aebf3825127b1a0bdc12c96665e1cdd1ef08a66d147e727dadf9172076215a53f21b1201112cf2b57b33e10c8bed75afa629afe4e9f6510c77b853d64c218af57edcb68281594afc61f926a659bafd; + 1 encin + !503e331b0acc00f2fc35dd9d8f145b2eb5c2e1ed3204dfdcc0a624eabd913ffac3dd87cd30a972df89ec6ccf43cfaadf5deca3c0448d510600068033201099f1c8e3f08eadb73ee63bc06e63e7df525458abf9b54113aebf3825127b1a0bdc12c96665e1cdd1ef08a66d147e727dadf9172076215a53f21b1201112cf2b57b33e10c8bed75afa629afe4e9f6510c77b853d64c218af57edcb68281594afc61f926a659bafd + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !794a8b86dcef1e3409d82b9e460403e67a7719c399dbab43e23610347bb0c275bf7ca6babe885231398c04b6492b6bec7ec678f6ca6ab5b23e1466dfd253bf270f08cc6a467cc4bedec91bce70e95b87be5509501260ab8edd3c1a2ccac8722e3cfc6687c962aa9ccb1f7fca535d38b0c930ebe9a63407a0308aa6198b90fa0ed3d4918f962be7391c7ab9444beb642f6fb06f3a2df0bba77fdb29bd7ac2420aeeb9bcfecc0a; + 1 encin + !794a8b86dcef1e3409d82b9e460403e67a7719c399dbab43e23610347bb0c275bf7ca6babe885231398c04b6492b6bec7ec678f6ca6ab5b23e1466dfd253bf270f08cc6a467cc4bedec91bce70e95b87be5509501260ab8edd3c1a2ccac8722e3cfc6687c962aa9ccb1f7fca535d38b0c930ebe9a63407a0308aa6198b90fa0ed3d4918f962be7391c7ab9444beb642f6fb06f3a2df0bba77fdb29bd7ac2420aeeb9bcfecc0a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !7e3f2d928ed2d2e4e1cf6c534b57d52235d437d9377b00760467bba709f113b0b562e52c1a077ffeff2622ea38f7f787ac7dbbc4b29aa7fc5d9e8d58977a2bf94172e00b3fc7f63875f08f1e5c67e2737259faf012e4362177affa06f24859b476a8ab55798bba9702980f57d78b0f1306b4dd7be7118ace1bbbe1a23340226fb91499d938f10573d720c4c72e3d116dd6d72fd7920a7af69b1f600b5cfbba5538645ce50aae1e; + 1 encin + !7e3f2d928ed2d2e4e1cf6c534b57d52235d437d9377b00760467bba709f113b0b562e52c1a077ffeff2622ea38f7f787ac7dbbc4b29aa7fc5d9e8d58977a2bf94172e00b3fc7f63875f08f1e5c67e2737259faf012e4362177affa06f24859b476a8ab55798bba9702980f57d78b0f1306b4dd7be7118ace1bbbe1a23340226fb91499d938f10573d720c4c72e3d116dd6d72fd7920a7af69b1f600b5cfbba5538645ce50aae1e + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !30ad0da493ebd63c8fc042db11b23a2d203bae61cffd6194337d4ad838589b693211b89a25f845d15c8dcbe61442b1a2f44fd4ec5a6bfdb43ecd0bcc5fb8da34d68f2c20ef1433422d658c917a25fc440b4c2b151a62b949e184f58f501ff0c6d77335ac8db3127e38313fe96c4b109e9c05233e300fd9c9fdf45b700e8ee0553c55bdaedc0d43856cbf8679f53525e722f3e3435eb4f154137195c27590c8e6eb7455f64d11c546; + 1 encin + !30ad0da493ebd63c8fc042db11b23a2d203bae61cffd6194337d4ad838589b693211b89a25f845d15c8dcbe61442b1a2f44fd4ec5a6bfdb43ecd0bcc5fb8da34d68f2c20ef1433422d658c917a25fc440b4c2b151a62b949e184f58f501ff0c6d77335ac8db3127e38313fe96c4b109e9c05233e300fd9c9fdf45b700e8ee0553c55bdaedc0d43856cbf8679f53525e722f3e3435eb4f154137195c27590c8e6eb7455f64d11c546 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !e3177d315779299d808bd2c34eca11dfb2efd5f0c11c354d59b9bc2d29eab2767cce65797e2d2cd94328dda9e700eaadd66dd23a7bcce40c978e5fa0081056d393cd1612ae248ad340dd33e0605cfba4c899dd7f78e4fdeec95d53b0fdac26217fe1a6f0104ddc0f2929feb54db9b07a6b8801c99978a6db91cbefb9f3001bef853424018d5911c2c22fa4d2939b5ead3457274332a2b223f2c8eccaec8a632ada3bb746e55adbf77f; + 1 encin + !e3177d315779299d808bd2c34eca11dfb2efd5f0c11c354d59b9bc2d29eab2767cce65797e2d2cd94328dda9e700eaadd66dd23a7bcce40c978e5fa0081056d393cd1612ae248ad340dd33e0605cfba4c899dd7f78e4fdeec95d53b0fdac26217fe1a6f0104ddc0f2929feb54db9b07a6b8801c99978a6db91cbefb9f3001bef853424018d5911c2c22fa4d2939b5ead3457274332a2b223f2c8eccaec8a632ada3bb746e55adbf77f + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !584cee6d2cbdcde833d8d786bc1939a8a3da9ee634703bf690532eff66665478b7c2478a2df42e0326cca1fd6f891c81a261489e8c37471f031874970bd556c6747626b6fdd05d4c4f4531da9a938030d38626f661ccec2faea96affc1273fc48245cd1828b346bb6ea7e107026171c06db53e08a66286a9b945a7142236ea16133e217aa104a2920eb401f4404d6dcb9589d694b0d6ef8c61e9a2a9f584a4a3af56449f2aaea8d06534; + 1 encin + !584cee6d2cbdcde833d8d786bc1939a8a3da9ee634703bf690532eff66665478b7c2478a2df42e0326cca1fd6f891c81a261489e8c37471f031874970bd556c6747626b6fdd05d4c4f4531da9a938030d38626f661ccec2faea96affc1273fc48245cd1828b346bb6ea7e107026171c06db53e08a66286a9b945a7142236ea16133e217aa104a2920eb401f4404d6dcb9589d694b0d6ef8c61e9a2a9f584a4a3af56449f2aaea8d06534 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1e11e7edfa768149f9969b5863f1a2240c90f528593d0bd47ca6636a564aa7218cefe194a1d57c557b1429779336b8bd2cacfe63e15b4e8161f584ab860069ff5d3bccfd6b3c8be24789f2988fe8c1bd23fdf2a870fc502e8e25d2fd90ab4c95dcd929a050d99d3e2ef0a4e0fd8e42b5a73300becd80d6571ba8ebfcef4aa5a152843ac09f6c102b765c7e422f619563b18c5fc18bbdb279c6463b84116373adaf8c776c68b85221fe0abd; + 1 encin + !1e11e7edfa768149f9969b5863f1a2240c90f528593d0bd47ca6636a564aa7218cefe194a1d57c557b1429779336b8bd2cacfe63e15b4e8161f584ab860069ff5d3bccfd6b3c8be24789f2988fe8c1bd23fdf2a870fc502e8e25d2fd90ab4c95dcd929a050d99d3e2ef0a4e0fd8e42b5a73300becd80d6571ba8ebfcef4aa5a152843ac09f6c102b765c7e422f619563b18c5fc18bbdb279c6463b84116373adaf8c776c68b85221fe0abd + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !2219a18f102a95f8e186531b43cfc32c33b502b82f8327224423866a8f107e14dbac95eaffdac32deb461ca94008c4285478d2e294972cedc61af9a02c6a650261b3fe05d96e6e5de9f88c996a9fdba504b762e5e662f59b918a054bd44dcda3c093b49726d361a7c9efa020f7c5548ee1f671e17d1add2a5f802b2b661e8b4ac6ff9c4463776a8cc1d0db851dee9f53ac32c54f4f93641be604bb671db1be856fa228a41c6cd3bbb947cfb0; + 1 encin + !2219a18f102a95f8e186531b43cfc32c33b502b82f8327224423866a8f107e14dbac95eaffdac32deb461ca94008c4285478d2e294972cedc61af9a02c6a650261b3fe05d96e6e5de9f88c996a9fdba504b762e5e662f59b918a054bd44dcda3c093b49726d361a7c9efa020f7c5548ee1f671e17d1add2a5f802b2b661e8b4ac6ff9c4463776a8cc1d0db851dee9f53ac32c54f4f93641be604bb671db1be856fa228a41c6cd3bbb947cfb0 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ae249337097bb506049440d2c68004517c467292742e4153c5f76bbfaf608b092e681b8eb012163166ef2be88b704d859ec57405bb3a3b15bcd9167d9c007f3865250cc614b8dda4864868243303c31749f2a4f32f967f95c28b4b80ff9f089d670af32b62641dd213d6c3d9553d16a1e398985a304c0ce4b535b8d2ec7b8328039883d55afe35cfb3cde5b59d21b5c85d14de7498404b25470f931e77bfa9658d92171cc3ea7b31406b1d2b03; + 1 encin + !ae249337097bb506049440d2c68004517c467292742e4153c5f76bbfaf608b092e681b8eb012163166ef2be88b704d859ec57405bb3a3b15bcd9167d9c007f3865250cc614b8dda4864868243303c31749f2a4f32f967f95c28b4b80ff9f089d670af32b62641dd213d6c3d9553d16a1e398985a304c0ce4b535b8d2ec7b8328039883d55afe35cfb3cde5b59d21b5c85d14de7498404b25470f931e77bfa9658d92171cc3ea7b31406b1d2b03 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d3001684fb506a9e086187174ac74f28c7d78412658329bde0ffb2c70b47fbb071ff32f79b1386e88f6050969da71e1f44524a09c601d52dac9884e21869c7321a3a1a70e714723024f368889a7eb52ec19b4356962a9e38f7b8a03d092b218e2b175d691555b300a02ec585f5504b8d68a908ff6c62e38c5dd590fc783e751fe425e9af00b0c743cb48be38de4300b42609d2bbb3956ddd771865ed365790d5455253799a2df6a08e0bfee50595; + 1 encin + !d3001684fb506a9e086187174ac74f28c7d78412658329bde0ffb2c70b47fbb071ff32f79b1386e88f6050969da71e1f44524a09c601d52dac9884e21869c7321a3a1a70e714723024f368889a7eb52ec19b4356962a9e38f7b8a03d092b218e2b175d691555b300a02ec585f5504b8d68a908ff6c62e38c5dd590fc783e751fe425e9af00b0c743cb48be38de4300b42609d2bbb3956ddd771865ed365790d5455253799a2df6a08e0bfee50595 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !4f78ed9d5c890216da2099901998bf64bd90a0426a3d31dd0e8789a37659d9ddfd1154f7407c3cb6a2000a87fe1fb050f84715bb5dcd02e61e51cfbe67d95504b9c83a3e988cb77408d468ffb869aec42291d414be67049af20b9e10c59ef5ef39f3945c146c4ab941cec0043afb9460878a2c513080df8c757fbccb2269512c08136dcda6cfe8b0a6dbd3fe2754cf4551cf8a5a95a6215e677bded62ea4487ac6304b028154eba7e98e024112f28a; + 1 encin + !4f78ed9d5c890216da2099901998bf64bd90a0426a3d31dd0e8789a37659d9ddfd1154f7407c3cb6a2000a87fe1fb050f84715bb5dcd02e61e51cfbe67d95504b9c83a3e988cb77408d468ffb869aec42291d414be67049af20b9e10c59ef5ef39f3945c146c4ab941cec0043afb9460878a2c513080df8c757fbccb2269512c08136dcda6cfe8b0a6dbd3fe2754cf4551cf8a5a95a6215e677bded62ea4487ac6304b028154eba7e98e024112f28a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !49a411020d58068cf8d35e23b4155598b348a9f91b92dfd0e831f7c040b7d4b696fbc5b4ca0e40cf9c57843dd440aa6c85e84e7c0091443baa205bfc668883380124d84fb042b92fd982099567b2f6048a0ec215975114990b3c72a09d684a21c006bae1dff5010d84330203c64f2afe2127ecac142760f3732f382658bb6b3ee3e58afbe7f231851ffbbc5220906a8acbb7ff61bb797996b590aeaeea7f1cd5769703fc182959c6082fbf1678f314ec; + 1 encin + !49a411020d58068cf8d35e23b4155598b348a9f91b92dfd0e831f7c040b7d4b696fbc5b4ca0e40cf9c57843dd440aa6c85e84e7c0091443baa205bfc668883380124d84fb042b92fd982099567b2f6048a0ec215975114990b3c72a09d684a21c006bae1dff5010d84330203c64f2afe2127ecac142760f3732f382658bb6b3ee3e58afbe7f231851ffbbc5220906a8acbb7ff61bb797996b590aeaeea7f1cd5769703fc182959c6082fbf1678f314ec + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !e439fc3b2bc7687dbf83956f3b2174e9c3b137e33d42661129c9fd00b7b6514608b03b68361d950b8c49f493eba04fa2c3f1b66bc4484ad07b81f65f7755609755adbeec725db22c9115cd1d2010eacb784a5b88b06a1e0e7c0ad63fdbbedbbd407d94df8740b014706acd1a27effd43581e9b218837512feb0f60141371ab6910098ff0e457c5df82779947197e46213e8b5973d4cef2e41b326a203f4bba820c18127e7aabe7abf06a12b8f31660c223; + 1 encin + !e439fc3b2bc7687dbf83956f3b2174e9c3b137e33d42661129c9fd00b7b6514608b03b68361d950b8c49f493eba04fa2c3f1b66bc4484ad07b81f65f7755609755adbeec725db22c9115cd1d2010eacb784a5b88b06a1e0e7c0ad63fdbbedbbd407d94df8740b014706acd1a27effd43581e9b218837512feb0f60141371ab6910098ff0e457c5df82779947197e46213e8b5973d4cef2e41b326a203f4bba820c18127e7aabe7abf06a12b8f31660c223 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !13e0220a51a95659729e38e45e6f189923e230e75ba60282ee7c1064bcf5fdabc446a44f16e36a1d3d0dee3933359f8c2ec41595494918e8ac5a69b131775febb8d2d0510e2a78932f084eb875ba8a22da5033123debd857a16811a2fe87997d59eebd6832371e7f893bc182b019fb750bca23ee7c80335e90f72ce6bdf1bdaf2b4597684bc22c43be120452f4cd8f8f1c9e5ca0a8fbd434ed889ba8fea8ec5a3e101b0185a661e261620166b534b59dd3b9; + 1 encin + !13e0220a51a95659729e38e45e6f189923e230e75ba60282ee7c1064bcf5fdabc446a44f16e36a1d3d0dee3933359f8c2ec41595494918e8ac5a69b131775febb8d2d0510e2a78932f084eb875ba8a22da5033123debd857a16811a2fe87997d59eebd6832371e7f893bc182b019fb750bca23ee7c80335e90f72ce6bdf1bdaf2b4597684bc22c43be120452f4cd8f8f1c9e5ca0a8fbd434ed889ba8fea8ec5a3e101b0185a661e261620166b534b59dd3b9 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !1bb9929153b43eba74014f0a3e9232b6b09c3264f7b51321dfdef0d31a83ac116f742fd8af086514605e91e04eac8a19463f156863ba14440c4c85aedfc741a1d6208bf6fb8c40e63da89216a7548b53def99de221ed4cb5bf0a9bc450763c21ed9345acc1a4f64b73a2ae652508f5ce7b8dd3f6e9df8674e6c987f8436a2c2418425008b1b75995cba10d2e0a871c694de76bbb0e21c1c24d1503fbb46e1e693ddb21c5876fbaca82e479f660fe67a7686a7a; + 1 encin + !1bb9929153b43eba74014f0a3e9232b6b09c3264f7b51321dfdef0d31a83ac116f742fd8af086514605e91e04eac8a19463f156863ba14440c4c85aedfc741a1d6208bf6fb8c40e63da89216a7548b53def99de221ed4cb5bf0a9bc450763c21ed9345acc1a4f64b73a2ae652508f5ce7b8dd3f6e9df8674e6c987f8436a2c2418425008b1b75995cba10d2e0a871c694de76bbb0e21c1c24d1503fbb46e1e693ddb21c5876fbaca82e479f660fe67a7686a7a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !d0302df57b17f2f3188b63b200d2e9ec3915ce60514c9b6941f9a29031cd1f68e2c07af6400bda66945b1753a33b26ff6c2dabe6ffdc1fa915b3422ef0c1444aa71522d656dc225981f345771dec1dfd304733be682194b89d3c90ae3a490a309709909998a1edb6dd6f65f9e7ee49bb80b0d5ed399dab5a18573fa6df6e986ea4a53fd062638472f9162e2abe43de24fbb1ec1461ff86a498ee0877100c907b0158638ea75fae34ddaa6ce9963636af55f7e0c0; + 1 encin + !d0302df57b17f2f3188b63b200d2e9ec3915ce60514c9b6941f9a29031cd1f68e2c07af6400bda66945b1753a33b26ff6c2dabe6ffdc1fa915b3422ef0c1444aa71522d656dc225981f345771dec1dfd304733be682194b89d3c90ae3a490a309709909998a1edb6dd6f65f9e7ee49bb80b0d5ed399dab5a18573fa6df6e986ea4a53fd062638472f9162e2abe43de24fbb1ec1461ff86a498ee0877100c907b0158638ea75fae34ddaa6ce9963636af55f7e0c0 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !35b23065c41551d21bca567870fcac995aabf14c1f9f32d6638cb75964c5924e03902a5ca638abe78af8af70b448c113498a000289efd5e0a9c5b5ede89445e42dd3140fe0d73089f3d8223d9d662111e67809a539f034a07971ab886121a8bddcd45bdafdc249b15b1556ea2bdd0221a75fb575a76a56ff2557bc6b1773b4ac0317f141f35dbd032e32236039a3d881e15951e3e54c4bcfd364a9b9696f281fc750f1153c3fa2e3b87fe0cc3a73249daab30e15c6; + 1 encin + !35b23065c41551d21bca567870fcac995aabf14c1f9f32d6638cb75964c5924e03902a5ca638abe78af8af70b448c113498a000289efd5e0a9c5b5ede89445e42dd3140fe0d73089f3d8223d9d662111e67809a539f034a07971ab886121a8bddcd45bdafdc249b15b1556ea2bdd0221a75fb575a76a56ff2557bc6b1773b4ac0317f141f35dbd032e32236039a3d881e15951e3e54c4bcfd364a9b9696f281fc750f1153c3fa2e3b87fe0cc3a73249daab30e15c6 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !6aa7cbfd617d2dc854b2e65e4fe5077fb991987bbe6a2e274f8dfe06bc62b2c9539bddb7db1a6a76adde9b78d6b73776700e30dfa42cd4d96dfa359d8857ae3a952ceab3bc7b266d33dff9a75da46aa4ade9031eac27428f49dfd30dfe4894f1b7d474e50dbdb06987aa29b280eb0bca726e1246e8fbaa0d623cc4df1bd9d551e67d0aea9337c63446124ddafe3f942f5b05897f49c902a8f67c31a0a51455c6b2b7e845c68f2f82f6c86e6f5bbc37f78622bb067693; + 1 encin + !6aa7cbfd617d2dc854b2e65e4fe5077fb991987bbe6a2e274f8dfe06bc62b2c9539bddb7db1a6a76adde9b78d6b73776700e30dfa42cd4d96dfa359d8857ae3a952ceab3bc7b266d33dff9a75da46aa4ade9031eac27428f49dfd30dfe4894f1b7d474e50dbdb06987aa29b280eb0bca726e1246e8fbaa0d623cc4df1bd9d551e67d0aea9337c63446124ddafe3f942f5b05897f49c902a8f67c31a0a51455c6b2b7e845c68f2f82f6c86e6f5bbc37f78622bb067693 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !3d4f01c3f52db6eadd975fb99c579dd8ed921c67d577e3ad51f2eee94c643d31cd4e27636234478d2aa718b85656c9ffa3f8a4874e465f3b8007776b0124949eaa7a2f4199d9203cfc46e154bf62c36fa8f31d07efd9fe2333d42fcba6438a2022ee8e37b67489c9595efc02c7488eb05c9d691d2da641043610d800ffcf497ba5dfb1be9263fa7b05dd27ded3bdf7a463443c5cc11d2506f2e221cc13446a04e5e8a42941e55a52c135fb139b97cdd9dab1b22f9f4c40; + 1 encin + !3d4f01c3f52db6eadd975fb99c579dd8ed921c67d577e3ad51f2eee94c643d31cd4e27636234478d2aa718b85656c9ffa3f8a4874e465f3b8007776b0124949eaa7a2f4199d9203cfc46e154bf62c36fa8f31d07efd9fe2333d42fcba6438a2022ee8e37b67489c9595efc02c7488eb05c9d691d2da641043610d800ffcf497ba5dfb1be9263fa7b05dd27ded3bdf7a463443c5cc11d2506f2e221cc13446a04e5e8a42941e55a52c135fb139b97cdd9dab1b22f9f4c40 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !82ba5683a6b7b686523481e90adce794dbe49e5e80217d798272ae66f5827fe7bd0900d6bd0cb3101916a4284420298e8826afd5ec0e9a9c78ead1f48c8007f8cb4e20364adde10ec5f843e92e717106498cbc7ed7741f5e0db2a9ef48f5c07db71d4f31be38bcb1532c16fdbf3001300861ee0d9b2b06be8779cf13d8436b28af7e87ba69634bbdbccbee94201c93273089dd9fb8a6acb7fa6f1238effce72ee5130ac3930d947ba7f8bc4cd91e129a7cbafbeb4c32d01a; + 1 encin + !82ba5683a6b7b686523481e90adce794dbe49e5e80217d798272ae66f5827fe7bd0900d6bd0cb3101916a4284420298e8826afd5ec0e9a9c78ead1f48c8007f8cb4e20364adde10ec5f843e92e717106498cbc7ed7741f5e0db2a9ef48f5c07db71d4f31be38bcb1532c16fdbf3001300861ee0d9b2b06be8779cf13d8436b28af7e87ba69634bbdbccbee94201c93273089dd9fb8a6acb7fa6f1238effce72ee5130ac3930d947ba7f8bc4cd91e129a7cbafbeb4c32d01a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !11b58ac73a99abf28873aaa1f820ba419659265dd34df84986f5437b6a9a353438e4f4d0134bad123e648ee670ee7eccb75c4a47f768006645020483a8e4e3f538b761a427763a2389d6b00b4b75226b21ee8b22d799c15df53fc786000a2e42d687b84419d4cd709b82c1b79313c642686a221194cdbdce50f52a678273182309dc50ff1b71d73c398937a090ac47e36d1abbe0ab5ee526a19e64c34ca1b54d67b23b002ba33ae1538f7a4cfdeb897bd930fc0cae0bf99470; + 1 encin + !11b58ac73a99abf28873aaa1f820ba419659265dd34df84986f5437b6a9a353438e4f4d0134bad123e648ee670ee7eccb75c4a47f768006645020483a8e4e3f538b761a427763a2389d6b00b4b75226b21ee8b22d799c15df53fc786000a2e42d687b84419d4cd709b82c1b79313c642686a221194cdbdce50f52a678273182309dc50ff1b71d73c398937a090ac47e36d1abbe0ab5ee526a19e64c34ca1b54d67b23b002ba33ae1538f7a4cfdeb897bd930fc0cae0bf99470 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a6e6e7cd064b56599f350078aa8009f5c496f976525b4543ce8b5aed07b97b2d9ed2a6ec53b175740bc0a709b21b90a775ac216c925c4d2c8662bbf6839bafda30657c11e688cafd61779fbf345bd662f0253cd292a65bfa69d235c2ddd31f82bd2b72c354ba2345848e417cbdcb15b8bd18dac3f490c2bbca39a5fe839a22a5bc9d588971b7c6765b6367bae62fcad0e88246e515d47f3dfd706f5d2b2ad2fd678b3ba13c589ba7a9be4d140f77553ba09dc01e7b6eab91bbe8; + 1 encin + !a6e6e7cd064b56599f350078aa8009f5c496f976525b4543ce8b5aed07b97b2d9ed2a6ec53b175740bc0a709b21b90a775ac216c925c4d2c8662bbf6839bafda30657c11e688cafd61779fbf345bd662f0253cd292a65bfa69d235c2ddd31f82bd2b72c354ba2345848e417cbdcb15b8bd18dac3f490c2bbca39a5fe839a22a5bc9d588971b7c6765b6367bae62fcad0e88246e515d47f3dfd706f5d2b2ad2fd678b3ba13c589ba7a9be4d140f77553ba09dc01e7b6eab91bbe8 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !46ae65281aa759e1e8a46a5041503ebdcea654a9e36e593f37feed335172d4bc6b6774fd4c3a0965f04a69ee35dc96eb3cd4d16f62a5996b1c9040f4b5b5bc0230286c1c9cdb9ceeb96f8297466d1bbfc8ced321e11af6a1582672c8e82f54d8474c05310f67313bbb074d78fc938e5dbf18eac026370010e20d968a15b1acc9d7d4f83c8608b84570d999c151b1ee55fbc15c7cbf8235d95bbb710cbf3d606133dfe910824606f2a1c55accb3de74b67c963cf0077d778bd68d8a; + 1 encin + !46ae65281aa759e1e8a46a5041503ebdcea654a9e36e593f37feed335172d4bc6b6774fd4c3a0965f04a69ee35dc96eb3cd4d16f62a5996b1c9040f4b5b5bc0230286c1c9cdb9ceeb96f8297466d1bbfc8ced321e11af6a1582672c8e82f54d8474c05310f67313bbb074d78fc938e5dbf18eac026370010e20d968a15b1acc9d7d4f83c8608b84570d999c151b1ee55fbc15c7cbf8235d95bbb710cbf3d606133dfe910824606f2a1c55accb3de74b67c963cf0077d778bd68d8a + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !beccfb6865d93fc79df6863c229892181813ad92f2b7ae1069a0d359cab9ceb4b2bd78b5a77cd3557b3100709aee138c152663f8f01d2872c38133a1c2ca375379eeaadf41c5291e73e580a6b43d763a6d88b14be8f6898e636f9b57f3020ab4f83c6d36397d9e1fe63f62bc37bf5449eba8621febd9679b6d314e2992d2e02580b471c12deaadcf674c05db4a7e4ae2b29827f7744e2f08d6c4a9e1732b2cf24b036bc5e9b6d39be223117c2f6a4581868cfe14bd6ff5aeb583b848; + 1 encin + !beccfb6865d93fc79df6863c229892181813ad92f2b7ae1069a0d359cab9ceb4b2bd78b5a77cd3557b3100709aee138c152663f8f01d2872c38133a1c2ca375379eeaadf41c5291e73e580a6b43d763a6d88b14be8f6898e636f9b57f3020ab4f83c6d36397d9e1fe63f62bc37bf5449eba8621febd9679b6d314e2992d2e02580b471c12deaadcf674c05db4a7e4ae2b29827f7744e2f08d6c4a9e1732b2cf24b036bc5e9b6d39be223117c2f6a4581868cfe14bd6ff5aeb583b848 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !95ca5c74d1ee38d0fb0c75d8890ab98f8b9219aaccb500ee6257efbf26412c6f8909069a43f66ed0a4452ff21a7b8b995f2bce9b636a1363f582397133900410714fec452c95f109ef21a5ac227ae925c2e78baf70ff404f2447d802fa680820fa1686f8dd8dd9c163a2451ee9587cdccb288b4cc4bbb2f9e8950f5d8744ec5d5d9f1074e33ae98359c68d0ec1fc665c7e55efd68e97283257a4f3adf46276d480b66ae8cf4dc43c1152ea087717250d888ced63f6aed38f220c86116f; + 1 encin + !95ca5c74d1ee38d0fb0c75d8890ab98f8b9219aaccb500ee6257efbf26412c6f8909069a43f66ed0a4452ff21a7b8b995f2bce9b636a1363f582397133900410714fec452c95f109ef21a5ac227ae925c2e78baf70ff404f2447d802fa680820fa1686f8dd8dd9c163a2451ee9587cdccb288b4cc4bbb2f9e8950f5d8744ec5d5d9f1074e33ae98359c68d0ec1fc665c7e55efd68e97283257a4f3adf46276d480b66ae8cf4dc43c1152ea087717250d888ced63f6aed38f220c86116f + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !0f7e862cc4b8330d51d29e038100afc60afee12133bc2005549a46bb45fab3bcdfb9bb25039a066029f4b293b6bfbe128dc9ad86e365b67cd7f6a368620a0d20f23d3fe368f5d75bc96949706674272bab848e63ce53e0d18fa1f5945a396a67af66f9399c01103fc768471f6b146ae82c1624f6aaa9a41edb27ef3feade42034c7d7278c1e3dc2fdcc9ded319dd0548a0d14dc6bc94a821c6cfa351e8b105f65208afc56fc0fdc6c1307767a3ebe6df1533b8ee53be66f39be14f311b57; + 1 encin + !0f7e862cc4b8330d51d29e038100afc60afee12133bc2005549a46bb45fab3bcdfb9bb25039a066029f4b293b6bfbe128dc9ad86e365b67cd7f6a368620a0d20f23d3fe368f5d75bc96949706674272bab848e63ce53e0d18fa1f5945a396a67af66f9399c01103fc768471f6b146ae82c1624f6aaa9a41edb27ef3feade42034c7d7278c1e3dc2fdcc9ded319dd0548a0d14dc6bc94a821c6cfa351e8b105f65208afc56fc0fdc6c1307767a3ebe6df1533b8ee53be66f39be14f311b57 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !99e949b44e949bcbaed6b35d39f94327764bcee5268f6634e4fb0c8a7b8e5c5cdfa9524a7f1fe38c59c65a281093b6ccbfe5e87b3661f5757aa50465b70d65090a1c16563ea62af36e20d1885dcbd100a9bce0f96158b0dc4d0fcbc2ab65658c6d9d2fe7b3abe31f25eba6179e6da61e82418ebd0094eb2890723671d8a43eaf3a53e5cbaadea5ba3eaa065d5b3c60939a7feb4993b0e6000cca8e125f5e40961681cd5cd12fef3c53bff1ac2872f6d835faa92de1729a1f6c9ca5ba887a10; + 1 encin + !99e949b44e949bcbaed6b35d39f94327764bcee5268f6634e4fb0c8a7b8e5c5cdfa9524a7f1fe38c59c65a281093b6ccbfe5e87b3661f5757aa50465b70d65090a1c16563ea62af36e20d1885dcbd100a9bce0f96158b0dc4d0fcbc2ab65658c6d9d2fe7b3abe31f25eba6179e6da61e82418ebd0094eb2890723671d8a43eaf3a53e5cbaadea5ba3eaa065d5b3c60939a7feb4993b0e6000cca8e125f5e40961681cd5cd12fef3c53bff1ac2872f6d835faa92de1729a1f6c9ca5ba887a10 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !28919843d9fd8f617aa87186155b9542fde5014d857c172fb3562e448780d1004f98f5cbbbf3f8d0605f7dec2e73eb48fa3c23d3f191cf82af45363dc364c7dbba5304601a91663171b46e73fb0e48f9a4ea3092091f581d642fb40fa4469227bf7956ad90363e4550df4d73945386c0278a3433d10f4f0381bab8fdc62dd911e3130ef1c68e85d551c9c51be9d8a9ab15237b4ee914e7c04bfa95a0db8db7a9947ab7244d1d371c16d0d31ec354012ae4fd6485fcb590622e2e7e6e49383f92; + 1 encin + !28919843d9fd8f617aa87186155b9542fde5014d857c172fb3562e448780d1004f98f5cbbbf3f8d0605f7dec2e73eb48fa3c23d3f191cf82af45363dc364c7dbba5304601a91663171b46e73fb0e48f9a4ea3092091f581d642fb40fa4469227bf7956ad90363e4550df4d73945386c0278a3433d10f4f0381bab8fdc62dd911e3130ef1c68e85d551c9c51be9d8a9ab15237b4ee914e7c04bfa95a0db8db7a9947ab7244d1d371c16d0d31ec354012ae4fd6485fcb590622e2e7e6e49383f92 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !f521bf3504ddd72a7deb4fbbed98dc1b2793c9eb42593f4ba38724da05396801e219f45c7ce3f98f108ee002166df1206b3625e68c0997cca92c6b46f1f4966fe4be41db01594f936680d9e28f287363969730c9d1f6bff9782a6e5a3d05f3bb756032bb668698b934b50f94b8937602dad9617aaab85799647f96ab6069b06376350b34842a4aa8a874400f61c867cfc49945e964a1fc3da8d924ec800a65b0f83dac752f23eed134fa325586a0780b0988ed827805097fb993af5f25aedfefde; + 1 encin + !f521bf3504ddd72a7deb4fbbed98dc1b2793c9eb42593f4ba38724da05396801e219f45c7ce3f98f108ee002166df1206b3625e68c0997cca92c6b46f1f4966fe4be41db01594f936680d9e28f287363969730c9d1f6bff9782a6e5a3d05f3bb756032bb668698b934b50f94b8937602dad9617aaab85799647f96ab6069b06376350b34842a4aa8a874400f61c867cfc49945e964a1fc3da8d924ec800a65b0f83dac752f23eed134fa325586a0780b0988ed827805097fb993af5f25aedfefde + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !ee153185d4b6438313761f9dd042f1b16af08876cd2ee02a6fa3a89a8910d74b8fe53bf1877483476754556e2b0b2e9f13c483c3daeb2bbb294fb00816eba4a70e93a67aea8b3297684940b5e2ef22724f427334aaa77fd32516b9b888d775178f754e6cd3228ca9190675287abe9e98061868a2ba491b97c3c561f02f1988632be69ace7c37f01f7ef74399d9ba0c9dc8679f8c82823155553c2678a64bba1433b29e6476b2e480873fa512fcfcf3d04b94901cb3e8086671c76cd4168727f0b3fe; + 1 encin + !ee153185d4b6438313761f9dd042f1b16af08876cd2ee02a6fa3a89a8910d74b8fe53bf1877483476754556e2b0b2e9f13c483c3daeb2bbb294fb00816eba4a70e93a67aea8b3297684940b5e2ef22724f427334aaa77fd32516b9b888d775178f754e6cd3228ca9190675287abe9e98061868a2ba491b97c3c561f02f1988632be69ace7c37f01f7ef74399d9ba0c9dc8679f8c82823155553c2678a64bba1433b29e6476b2e480873fa512fcfcf3d04b94901cb3e8086671c76cd4168727f0b3fe + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !188778ec99fa6b7cdbb54ba457d08ec97b0afbccfac8f3adfa0f9d16e1332ebc8a7f826f7f017f5daeff368ec657208ce487b8f42d5e0c002476d71ad4119847082770f95815b07bd779af99cb8c3ad9384fc5513688d0636481bb28306385e63b29576622c017313a7d4e5914c50494b7ebcb1ae9185900437993bf6d0a7777beabc71245301bffa5c99031c67146904c9bb1d8e674562b4cccb6e12f9671cf06efbaaa32e5cc9249ecdefbe8804b88ee86437da83d4e16facccde46a3ce04f5209c1; + 1 encin + !188778ec99fa6b7cdbb54ba457d08ec97b0afbccfac8f3adfa0f9d16e1332ebc8a7f826f7f017f5daeff368ec657208ce487b8f42d5e0c002476d71ad4119847082770f95815b07bd779af99cb8c3ad9384fc5513688d0636481bb28306385e63b29576622c017313a7d4e5914c50494b7ebcb1ae9185900437993bf6d0a7777beabc71245301bffa5c99031c67146904c9bb1d8e674562b4cccb6e12f9671cf06efbaaa32e5cc9249ecdefbe8804b88ee86437da83d4e16facccde46a3ce04f5209c1 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !544bd24c1e8c7658f1c0c577ac0f06bac973fdf62c03ea6e8d83d811a2a91f0fea27f9a3bc62dc7fb8db7f03e37e7d35ace19024207a9ebfe3e5e083fc8b0a992e779db4a3c9844f5f7494bec07450cce78224f69c87ad0dde624a286831f3d4485c397cfc8217a517c8705ebd9d758358bc100b90ab18829bd8cec8a1a49b5b91167cafc7eedeac90cd74610c2f281692ade9f3f442b1f618f8c5ba32cd0380478c05281965301c9b3185094aeeb6bfe071d177fcbaef27812aa978b4b21ae66ee546de; + 1 encin + !544bd24c1e8c7658f1c0c577ac0f06bac973fdf62c03ea6e8d83d811a2a91f0fea27f9a3bc62dc7fb8db7f03e37e7d35ace19024207a9ebfe3e5e083fc8b0a992e779db4a3c9844f5f7494bec07450cce78224f69c87ad0dde624a286831f3d4485c397cfc8217a517c8705ebd9d758358bc100b90ab18829bd8cec8a1a49b5b91167cafc7eedeac90cd74610c2f281692ade9f3f442b1f618f8c5ba32cd0380478c05281965301c9b3185094aeeb6bfe071d177fcbaef27812aa978b4b21ae66ee546de + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !956b768925fd4ddf7a44aac550783d04b77bdc179a635c40e818bf2a5c3a450846ea931ec6ed539e50a586fb52ba11611e44a44c224bcbc757d6828757101788c093dfb0cca10d451de2c87fa50662b2e5272e96f89c6d06ec967f61265d6a06381d5b7b14d669336d28b74bc41b56c03a994901cb80a47470b2fcd2e2ea883c7f83271f3f92ed0e9614d90818440cf44c13ebb84df180e7c281ed6660e6d15d12a9776052b802c3ffaa55ec456bc7fc24130ee00ca84fc140f26a47450475467271fe7270; + 1 encin + !956b768925fd4ddf7a44aac550783d04b77bdc179a635c40e818bf2a5c3a450846ea931ec6ed539e50a586fb52ba11611e44a44c224bcbc757d6828757101788c093dfb0cca10d451de2c87fa50662b2e5272e96f89c6d06ec967f61265d6a06381d5b7b14d669336d28b74bc41b56c03a994901cb80a47470b2fcd2e2ea883c7f83271f3f92ed0e9614d90818440cf44c13ebb84df180e7c281ed6660e6d15d12a9776052b802c3ffaa55ec456bc7fc24130ee00ca84fc140f26a47450475467271fe7270 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !c17edf88f543f4f8f358ef7bc02f696d4afca3b561c9fe4b0110aadcd7d4f63cda8269fd39a69f5d4237644608391df0a336ddbb1f58d7e06d6f9e104287ec366cd3a36eeecafbaf56d565cc7b637f3841db2131d3b386094b8acde4cce3a321474134440781b7c3be99cbf38dbbb149521b510034567ef4f555ca5b4d0ab5f3e9370971b785f863547f600edf2031efaa6e31d4dcafa182a122e63d42e4375bb485fefa4faf9f3796529ad44f77e901f56cfb4f9bc960fb4e210f2425d891cf468a3b297fc5; + 1 encin + !c17edf88f543f4f8f358ef7bc02f696d4afca3b561c9fe4b0110aadcd7d4f63cda8269fd39a69f5d4237644608391df0a336ddbb1f58d7e06d6f9e104287ec366cd3a36eeecafbaf56d565cc7b637f3841db2131d3b386094b8acde4cce3a321474134440781b7c3be99cbf38dbbb149521b510034567ef4f555ca5b4d0ab5f3e9370971b785f863547f600edf2031efaa6e31d4dcafa182a122e63d42e4375bb485fefa4faf9f3796529ad44f77e901f56cfb4f9bc960fb4e210f2425d891cf468a3b297fc5 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 2 copy *0 +; + 0 encout + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !a9174d658536fdd35fe59babd9680f137e003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf236725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171e2; + 3 copy *1 +; + 1 encin + !a9174d658536fdd35fe59babd9680f137e003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf236725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171e2 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + + ## Some buffering tests. + 2 begin/ACT *0 +; + 2 process + =XXXXXXXXXXXXXXXXX + !a9174d658536fdd35fe59babd9680f137e; + 2 process + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf23; + 2 process + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + !6725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171; + 2 process + =X + !e2; + 2 done *0 +; + + 3 begin/IACT *0 +; + 3 process + !a9174d658536fdd35fe59babd9680f137e + =XXXXXXXXXXXXXXXXX; + 3 process + !003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf23 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 3 process + !6725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171 + =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + 3 process + !e2 + =X; + 3 done *0 +; + + ## Back to legible tests. + 0 prf *123 !45476fc0806aee35e864c4f18e6ba62bd3eb1b1e8bef9042b30b0f15d00c3e9f5d5904ab789d4c67eaed582473c15aa4424f11d52b21a296b36db3392e2ecbb2dc6963bafba3b23882d061f1d335e86e470e8d819591bf0c223e24b925751d04f789fc73bc55f7d2b3ed4881c625aa6321d31511b13f6d5e4ce54a; + 1 prf *123 !45476fc0806aee35e864c4f18e6ba62bd3eb1b1e8bef9042b30b0f15d00c3e9f5d5904ab789d4c67eaed582473c15aa4424f11d52b21a296b36db3392e2ecbb2dc6963bafba3b23882d061f1d335e86e470e8d819591bf0c223e24b925751d04f789fc73bc55f7d2b3ed4881c625aa6321d31511b13f6d5e4ce54a; + + ## MAC verification tests, positive and negative. + 2 copy *1 +; + 2 macin !171419608e11e7c907d493209e17f26b +; + + 2 copy *1 +; + 2 begin/ICT *0 +; + 2 process !171419608e11e7c907d493209e17f26b +; + 2 done *0 +; + + 2 copy *1 +; + 2 begin/ICT *0 +; + 2 process !171419608e11e7c970d493209e17f26b +; + 2 done *0 -; + + 2 copy *1 +; + 2 ad =spong +; + 2 macin !171419608e11e7c907d493209e17f26b -; + + ## Resume Hamburg's `Concurrence' test. + 0 macout *16 !171419608e11e7c907d493209e17f26b; + 1 macin !171419608e11e7c907d493209e17f26b +; + + ## Additional home-grown tests (see `utils/strobe'). + 0 key "=this is my super-secret key" +; + 1 key "=this is my super-secret key" +; + + 0 prf *32 !5418e0f0ee7f982bbbdc2b4bbf49425d0088abfa98ee21d8ad8a3610d15ebb68; + 1 prf *32 !5418e0f0ee7f982bbbdc2b4bbf49425d0088abfa98ee21d8ad8a3610d15ebb68; + + 0 ratchet *32 +; 1 ratchet *32 +; + + 0 macin !b2084ebdfabd50768c91eebc190132cc +; + 1 macout *16 !b2084ebdfabd50768c91eebc190132cc; +} diff --git a/utils/strobe b/utils/strobe new file mode 100644 index 00000000..fd0fe577 --- /dev/null +++ b/utils/strobe @@ -0,0 +1,147 @@ +#! /usr/bin/python + +import catacomb as CAT + +I = 1 +A = 2 +C = 4 +T = 8 +M = 16 +INIT = 256 + +def dump_keccak_state(what, state): + buf = CAT.ReadBuffer(state + CAT.ByteString.zero(200 - len(state))) + print ";; %s [round 0]" % what + print ";; uncomplemented state..." + for i in xrange(5): + print ";;\t%s" % " ".join(["%016x" % buf.getu64l() for j in xrange(5)]) + print + +class Strobe (object): + def __init__(me, sec = 128, _copy = None): + if _copy is None: + me.k = CAT.Keccak1600() + me.r = (1600 - 2*sec)/8 + me.f = 0 + me.p0 = 0 + buf = CAT.WriteBuffer() + buf.putu8(1).putu8(me.r) + buf.putu8(1).putu8(0) + buf.putu8(1).putu8(12*8).put('STROBEv1.0.2') + ##dump_keccak_state("init", buf.contents) + me.k.mix(buf.contents).step() + me.buf = CAT.WriteBuffer() + me.mask = me.k.extract(me.r - 2) + ##dump_keccak_state("final", me.mask) + else: + me.k = _copy.k.dup() + me.r = _copy.r + me.f = _copy.f + me.p0 = _copy.p0 + me.buf = CAT.WriteBuffer().put(_copy.buf.contents) + me.mask = me._copy.mask + + def _crank(me): + me.buf.putu8(me.p0); me.p0 = 0 + if me.buf.size == me.r - 1: me.buf.putu8(0x84) + else: me.buf.putu8(0x04).zero(me.r - me.buf.size - 1).putu8(0x80) + ##dump_keccak_state("buffer", me.buf.contents) + ##dump_keccak_state("init", me.buf.contents ^ me.k.extract(me.r)) + me.k.mix(me.buf.contents).step() + me.mask = me.k.extract(me.r - 2) + ##dump_keccak_state("final", me.mask) + me.buf = CAT.WriteBuffer() + + def process(me, op, input): + if not op&T: + opf = op + else: + if not me.f&INIT: me.f |= INIT | (op&I) + opf = op ^ (me.f&255) + me.buf.putu8(me.p0); me.p0 = me.buf.size + if me.buf.size >= me.r - 2: me._crank() + me.buf.putu8(opf) + if op&C or me.buf.size >= me.r - 2: me._crank() + + if op&(I | T) == I or op&(I | A) == 0: buf = CAT.ByteString.zero(input) + else: buf = CAT.ByteString(input) + out = CAT.WriteBuffer() + i, j, sz = 0, me.buf.size, len(buf) + + while i < sz: + spare = me.r - j - 2 + n = min(spare, sz - i); x = buf[i:i + n]; i += n + if not op&C: out.put(x); me.buf.put(x) + else: + y = x ^ me.mask[j:j + n]; out.put(y) + if op&I or not op&T: me.buf.put(y) + else: me.buf.put(x) + if n == spare: me._crank(); j = 0 + + if op&(I | A | C | T) != (I | C | T): return out.contents + elif out.contents == CAT.ByteString.zero(out.size): return me + else: raise ValueError, 'verify failed' + +st0 = Strobe() +st1 = Strobe() + +st0.process(A | M, 'testing') +st1.process(A | M, 'testing') + +print 'prf(10) -> %s' % hex(st0.process(I | A | C, 10)) +st1.process(I | A | C, 10) + +print 'ad("Hello")' +st0.process(A, 'Hello') +st1.process(A, 'Hello') + +c0 = st0.process(A | C | T, 'World'); +st1.process(I | A | C | T, c0) +print 'encout("World") -> %s' % hex(c0) + +print 'clrout("foo")' +st0.process(A | T, 'foo'); +st1.process(I | A | T, 'foo') + +print 'clrin("bar")' +st1.process(A | T, 'bar') +st0.process(I | A | T, 'bar') + +m1 = st0.process(I | A | C | T, 'baz') +st1.process(A | C | T, m1) # backwards in time +print 'encin("baz") -> %s' % hex(m1) + +for i in xrange(200): + c = st0.process(A | C | T, i*'X') + m = st1.process(I | A | C | T, c) + print " 0 encout\n\t=%s\n\t!%s;" % (i*'X', hex(c)) + print " 1 encin\n\t!%s\n\t=%s;" % (hex(c), i*'X') + +r0 = st0.process(I | A | C, 123) +r1 = st1.process(I | A | C, 123) +print 'prf(123) -> %s' % hex(r0) +assert r0 == r1 + +t = st0.process(C | T, 16) +print 'macout(16) -> %s' % hex(t) +st1.process(I | C | T, t) + +k = 'this is my super-secret key' +print 'key("%s")' % k +st0.process(A | C, k) +st1.process(A | C, k) + +r0 = st0.process(I | A | C, 32) +r1 = st1.process(I | A | C, 32) +print 'prf(32) -> %s' % hex(r0) +assert r0 == r1 + +print 'ratchet(32)' +st0.process(C, 32) +st1.process(C, 32) + +t0 = CAT.bytes('b2084ebdfabd50768c91eebc190132cc') +st0.process(I | C | T, t0) +t1 = st1.process(C | T, 16) +assert t1 == t0 +print 'macin(%s)' % hex(t0)