diff options
author | Steve Thomas <Sc00bz@users.noreply.github.com> | 2015-11-01 14:36:28 -0600 |
---|---|---|
committer | Steve Thomas <Sc00bz@users.noreply.github.com> | 2015-11-01 14:36:28 -0600 |
commit | db7e40d449ab4ae65bacf267b38d1bf836b4fe54 (patch) | |
tree | f6f815673f56490c8ae3bfdc8ed9a5f4d9996f76 | |
parent | 025908ef2b091faab75f60188654f789b691ff0d (diff) | |
parent | f9a2494fae0dcddef493de453aa6ab69caa987cf (diff) | |
download | sjcl-db7e40d449ab4ae65bacf267b38d1bf836b4fe54.zip sjcl-db7e40d449ab4ae65bacf267b38d1bf836b4fe54.tar.gz sjcl-db7e40d449ab4ae65bacf267b38d1bf836b4fe54.tar.bz2 |
Merge pull request #1 from bitwiseshiftleft/master
Update
69 files changed, 5672 insertions, 455 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3e0187e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +core.js +core_closure.js diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..502b4e8 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,9 @@ +before_script: ./configure --with-all + +language: node_js +node_js: + - "0.11" + - "0.10" + - "0.8" +# 0.6 appears to be unreliable on Travis at the moment. +# - "0.6" @@ -54,31 +54,35 @@ lint: core.js core/*.js test/*.js browserTest/*.js lint/coding_guidelines.pl lint/coding_guidelines.pl core/*.js test/*.js browserTest/*.js -TEST_COMMON= browserTest/rhinoUtil.js test/test.js +TEST_COMMON= browserTest/nodeUtil.js test/test.js TEST_SCRIPTS= $(TEST_COMMON) \ + test/ccm_vectors.js test/ccm_arraybuffer_test.js \ + test/codec_arraybuffer_test.js \ test/aes_vectors.js test/aes_test.js \ - test/ocb2_vectors.js test/ocb2_test.js \ - test/ccm_vectors.js test/ccm_test.js \ + test/bitArray_vectors.js test/bitArray_test.js \ + test/bn_vectors.js test/bn_test.js \ test/cbc_vectors.js test/cbc_test.js \ + test/ccm_vectors.js test/ccm_test.js \ + test/ecc_conv.js \ + test/ecdsa_test.js test/ecdsa_vectors.js test/ecdh_test.js \ + test/gcm_vectors.js test/gcm_test.js \ + test/hmac_vectors.js test/hmac_test.js \ + test/json_test.js \ + test/ocb2_vectors.js test/ocb2_test.js \ + test/ocb2progressive_test.js \ + test/pbkdf2_test.js test/scrypt_vectors.js test/scrypt_test.js \ + test/ripemd160_vectors.js test/ripemd160_test.js \ + test/sha1_vectors.js test/sha1_test.js \ test/sha256_vectors.js test/sha256_test.js \ test/sha256_test_brute_force.js \ - test/sha1_vectors.js test/sha1_test.js \ - test/hmac_vectors.js test/hmac_test.js \ - test/pbkdf2_test.js \ - test/bn_vectors.js test/bn_test.js \ - test/ecdsa_test.js test/ecdh_test.js - -TEST_SCRIPTS_OPT= $(TEST_COMMON) \ + test/sha512_vectors.js test/sha512_test.js \ + test/sha512_test_brute_force.js \ test/srp_vectors.js test/srp_test.js -# Rhino fails at -O 0. Probably because the big files full of test vectors blow the -# bytecode limit. So, run most tests with -O -1. But modular exponentiation is -# currently very slow (on Rhino), so run the SRP test with optimizations on. - -test: sjcl.js $(TEST_SCRIPTS) test/run_tests_rhino.js - @rhino -O -1 -w test/run_tests_rhino.js $< $(TEST_SCRIPTS) - @rhino -O 9 -w test/run_tests_rhino.js $< $(TEST_SCRIPTS_OPT) +# Run all tests in node.js. +test: sjcl.js $(TEST_SCRIPTS) test/run_tests_node.js + node test/run_tests_node.js $< $(TEST_SCRIPTS) tidy: find . -name '*~' -delete @@ -90,4 +94,3 @@ clean: tidy distclean: clean ./configure make sjcl.js tidy - diff --git a/README.md b/README.md new file mode 100644 index 0000000..4d3cf20 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +sjcl +==== + +[](https://travis-ci.org/bitwiseshiftleft/sjcl) + +[](https://gitter.im/bitwiseshiftleft/sjcl?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +Stanford Javascript Crypto Library + +Security Advisories +=== + +* 12.02.2014: the current development version has a paranoia bug in the ecc module. The bug was introduced in commit [ac0b3fe0](https://github.com/bitwiseshiftleft/sjcl/commit/ac0b3fe0) and might affect ecc key generation on platforms without a platform random number generator. + +Security Contact +==== +Security Mail: sjcl@ovt.me +OpenPGP-Key Fingerprint: 0D54 3E52 87B4 EC06 3FA9 0115 72ED A6C7 7AAF 48ED +Keyserver: pool.sks-keyservers.net + +Upgrade Guide +==== + +## 1.0.3 -> 1.0.4 + +`codecBase32` has been re-enabled with changes to conform to [RFC 4648](http://tools.ietf.org/html/rfc4648#section-6): + +* Padding with `=` is now applied to the output of `fromBits`. If you don't want that padding, you can disable it by calling `fromBits` with a second parameter of `true` or anything that evaluates as "truthy" in JS +* The encoding alphabet for `sjcl.codec.base32` now matches that specified by the RFC, rather than the extended hex alphabet. +* The former extended hex alphabet is now available through `sjcl.codec.base32hex` (also matching the RFC). So if you encoded something with `base32` before, you'll want to decode it with `base32hex` now. + +Documentation +==== +The documentation is available [here](http://bitwiseshiftleft.github.io/sjcl/doc/) diff --git a/README/COPYRIGHT b/README/COPYRIGHT index d573a05..69b3e19 100644 --- a/README/COPYRIGHT +++ b/README/COPYRIGHT @@ -30,3 +30,20 @@ fees for OCB 2.0. There may be patents which apply to SJCL other than Phil Rogaway's OCB patents. We suggest that you consult legal counsel before using SJCL in a commercial project. + +----- + +Please note, two Java JAR files, Google Closure Compiler and +YUI Compressor, are provided in the "compress" folder as a convenience +for the compiling process of SJCL. These are not part of SJCL itself +and provided under their own licenses. + +As of October 2015, more information can be found at the following +locations: + +Google Closure Compiler + - https://developers.google.com/closure/compiler/ + +YUI Compressor + - http://yui.github.io/yuicompressor/ + diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..ae9acad --- /dev/null +++ b/bower.json @@ -0,0 +1,4 @@ +{ + "name": "sjcl", + "main": ["./sjcl.js"] +} diff --git a/browserTest/browserUtil.js b/browserTest/browserUtil.js index 9c23d01..004a92c 100644 --- a/browserTest/browserUtil.js +++ b/browserTest/browserUtil.js @@ -1,6 +1,6 @@ browserUtil = {}; -browserUtil.isRhino = (typeof(window) === 'undefined'); +browserUtil.isNodeJS = (typeof(window) === 'undefined'); /** * Pause (for the graphics to update and the script timer to clear), then run the diff --git a/browserTest/entropy.html b/browserTest/entropy.html new file mode 100644 index 0000000..4458ba7 --- /dev/null +++ b/browserTest/entropy.html @@ -0,0 +1,88 @@ +<html> +<head> + +<title>Entropy Generator Progress</title> +<!-- ProgressBar source: http://stackoverflow.com/questions/7190898/progress-bar-with-html-and-css --> + +<style> +#progressbar { + background-color: black; + border-radius: 13px; /* (height of inner div) / 2 + padding */ + padding: 3px; +} +#progressbar > div { + background-color: orange; + width: 0%; /* Adjust with JavaScript */ + height: 20px; + border-radius: 10px; +} +</style> + +<script type="text/javascript" src="../sjcl.js"> +</script> + +<script type="text/javascript"> + +var busy = 0; +var collecting = 0; + +function showprogress () { + var barwidth = document.getElementById ("progresswidth"); + var paranoia = parseInt (document.getElementById ("paranoialevel").value); + var progress = 100 * sjcl.random.getProgress (paranoia); + barwidth.style.width = progress+"%"; + if (!sjcl.random.isReady (paranoia)) { + setTimeout ("showprogress()", 10, "JavaScript"); + } else { + busy = 0; + document.getElementById ("startbutton").style.disabled = 1; + } +} + +function startup () { + if (collecting == 0) { + sjcl.random.startCollectors (); + collecting = 1; + } + if (busy == 0) { + busy = 1; + document.getElementById ("startbutton").style.disabled = 1; + showprogress (); + } +} + +function consume (numbits) { + var collector = document.getElementById ("collector"); + collector.value = "retrieving random data"; + var paranoia = document.getElementById ("paranoialevel").value; + var numwords = Math.ceil (numbits / 32); + var bits = sjcl.random.randomWords (numwords, paranoia); + collector.value = ''; + for (var i=0; i<numwords; i++) { + var hi = (bits [i] >> 16) & 0x0000ffff; + var lo = bits [i] & 0x0000ffff; + collector.value = collector.value + hi.toString (16) + lo.toString (16); + } + startup (); +} + +</script> + +</head> +<body> +<h1>Entropy Generator Progress</h1> + +<p>Target: 192 bits, available at paranoia level 5.</p> + +<p>Corresponding paranoia level from [0,1..10]: <input type="text" value="5" id="paranoialevel"/> <input type=button onclick="startup ()" id="startbutton" value=" Start >> "> (the idea being that you can see the progress bar advance gently from empty/black to full/yellow after you press this)</p> + +<p><input type=button onclick="consume (192)" value=" Consume 192 bits >> "><input type=text id=collector size=50 value="" onkeypress="consume (192)"> (also consumes 192 bits with every keypress in the text field; use key repeat to consume swiftly)</p> + +<div id="progressbar"> + <div id="progresswidth"></div> +</div> + +<p>Please move your mouse, play around and generally introduce entropy into your environment.</p> + +</body> +</html>
\ No newline at end of file diff --git a/browserTest/rhinoUtil.js b/browserTest/nodeUtil.js index 3107104..9ccb6b9 100644 --- a/browserTest/rhinoUtil.js +++ b/browserTest/nodeUtil.js @@ -1,5 +1,5 @@ browserUtil = { - isRhino: true, + isNodeJS: true, pauseAndThen: function (cb) { cb(); }, @@ -30,15 +30,15 @@ browserUtil = { }, write: function(type, message) { - print(message); + console.log(message); return { update: function (type2, message2) { - if (type2 === 'pass') { print(" + " + message2); } - else if (type2 === 'unimplemented') { print(" ? " + message2); } - else { print(" - " + message2); } + if (type2 === 'pass') { console.log(" + " + message2); } + else if (type2 === 'unimplemented') { console.log(" ? " + message2); } + else { console.log(" - " + message2); } }}; }, - writeNewline: function () { print(""); }, + writeNewline: function () { console.log(""); }, status: function(message) {} }; diff --git a/compress/compiler-latest.zip b/compress/compiler-latest.zip Binary files differnew file mode 100644 index 0000000..42ade1e --- /dev/null +++ b/compress/compiler-latest.zip diff --git a/compress/compiler.jar b/compress/compiler.jar Binary files differindex c087e92..9cae695 100644 --- a/compress/compiler.jar +++ b/compress/compiler.jar diff --git a/compress/compress_with_closure.sh b/compress/compress_with_closure.sh index 07985c8..fe57755 100755 --- a/compress/compress_with_closure.sh +++ b/compress/compress_with_closure.sh @@ -2,6 +2,30 @@ DIR=`dirname $0` +URL="https://dl.google.com/closure-compiler/compiler-latest.zip" +FILE=`echo $URL | sed 's#.*/##'` +unzip > /dev/null 2> /dev/null +if [ $? -eq 0 ] ; then + wget -V > /dev/null 2> /dev/null + if [ $? -eq 0 ] ; then + pushd . > /dev/null + cd $DIR + wget -q -N $URL + popd > /dev/null + else + curl -V > /dev/null 2> /dev/null + if [ $? -eq 0 ] ; then + curl -s -z $DIR/$FILE -o $DIR/$FILE $URL > /dev/null 2> /dev/null + fi + fi + if [ -s $DIR/$FILE ] ; then + pushd . > /dev/null + cd $DIR + unzip -o $FILE compiler.jar > /dev/null 2> /dev/null + popd > /dev/null + fi +fi + $DIR/remove_constants.pl $1 | $DIR/opacify.pl > ._tmpRC.js echo -n '"use strict";' diff --git a/compress/digitize.pl b/compress/digitize.pl index e8a0140..0fcc5c2 100755 --- a/compress/digitize.pl +++ b/compress/digitize.pl @@ -16,7 +16,7 @@ sub digitize { } while (<>) { - s/([^a-zA-Z0-9_])(\d+)/$1 . digitize $2/eg; + s/([^a-zA-Z0-9_"])(\d+)/$1 . digitize $2/eg; print; } diff --git a/compress/opacify.pl b/compress/opacify.pl index 8c9a9a2..4d76a75 100755 --- a/compress/opacify.pl +++ b/compress/opacify.pl @@ -13,17 +13,24 @@ my $script = join '', <>; # remove comments -$script =~ s=/\*([^\*]|\*+[^\/])*\*/==g; -$script =~ s=//.*==g; +#$script =~ s=/\*([^\*]|\*+[^\/])*\*/==g; +#$script =~ s=//.*==g; # stringify property names $script =~ s=\.([a-zA-Z][_a-zA-Z0-9]*)=['$1']=g; +# destringify 'prototype' +$script =~ s=\['prototype'\]=.prototype=g; + # stringify sjcl $script =~ s=(?:var\s+)?sjcl(\.|\s*\=)=window['sjcl']$1=g; # stringify object notation -$script =~ s=([\{,]\s*)([a-zA-Z0-9][_a-zA-Z0-9]*):=$1'$2':=g; +$script =~ s=([\{,] + \s* + (?:/\*(?:[^\*]|\*+[^\/])*\*/\s* # preserve C-style comments + |//[^\n]*\n\s*)*) + ([a-zA-Z0-9][_a-zA-Z0-9]*):=$1'$2':=xg; # Export sjcl. This is a bit of a hack, and might get replaced later. print $script; diff --git a/compress/remove_constants.pl b/compress/remove_constants.pl index c9b0f22..73aee05 100755 --- a/compress/remove_constants.pl +++ b/compress/remove_constants.pl @@ -13,8 +13,8 @@ my $script = join '', <>; # remove comments -$script =~ s=/\*([^\*]|\*+[^\/])*\*/==g; -$script =~ s=//.*==g; +#$script =~ s=/\*([^\*]|\*+[^\/])*\*/==g; +#$script =~ s=//.*==g; sub preserve { my $stuff = shift; @@ -1,2 +1,2 @@ -SOURCES= core/sjcl.js core/aes.js core/bitArray.js core/codecString.js core/codecHex.js core/codecBase64.js core/sha256.js core/ccm.js core/ocb2.js core/hmac.js core/pbkdf2.js core/random.js core/convenience.js +SOURCES= core/sjcl.js core/aes.js core/bitArray.js core/codecString.js core/codecHex.js core/codecBase32.js core/codecBase64.js core/sha256.js core/ccm.js core/ocb2.js core/gcm.js core/hmac.js core/pbkdf2.js core/random.js core/convenience.js COMPRESS= core_closure.js @@ -4,36 +4,44 @@ use strict; my ($arg, $i, $j, $targ); -my @targets = qw/sjcl aes bitArray codecString codecHex codecBase64 codecBytes sha256 sha1 ccm cbc ocb2 hmac pbkdf2 random convenience bn ecc srp/; +my @targets = qw/sjcl aes bitArray codecString codecHex codecBase32 codecBase64 codecBytes sha256 sha512 sha1 ccm cbc ocb2 ocb2progressive gcm hmac pbkdf2 scrypt random convenience bn ecc srp ccmArrayBuffer codecArrayBuffer ripemd160/; my %deps = ('aes'=>'sjcl', 'bitArray'=>'sjcl', 'codecString'=>'bitArray', 'codecHex'=>'bitArray', 'codecBase64'=>'bitArray', + 'codecBase32'=>'bitArray', 'codecBytes'=>'bitArray', 'sha256'=>'codecString', + 'sha512'=>'codecString', 'sha1'=>'codecString', + 'ripemd160' => 'codecString', 'ccm'=>'bitArray,aes', 'ocb2'=>'bitArray,aes', + 'ocb2progressive'=>'ocb2', + 'gcm'=>'bitArray,aes', 'hmac'=>'sha256', 'pbkdf2'=>'hmac', + 'scrypt'=>'pbkdf2,codecBytes', 'srp'=>'sha1,bn,bitArray', 'bn'=>'bitArray,random', 'ecc'=>'bn', 'cbc'=>'bitArray,aes', 'random'=>'sha256,aes', - 'convenience'=>'ccm,pbkdf2,random,codecBase64'); - + 'convenience'=>'ccm,pbkdf2,random,codecBase64', + 'ccmArrayBuffer'=>'bitArray,codecArrayBuffer', + 'codecArrayBuffer'=>'bitArray'); + my $compress = "closure"; - + my %enabled = (); $enabled{$_} = 0 foreach (@targets); # by default, all but codecBytes, srp, bn -$enabled{$_} = 1 foreach (qw/aes bitArray codecString codecHex codecBase64 sha256 ccm ocb2 hmac pbkdf2 random convenience/); +$enabled{$_} = 1 foreach (qw/aes bitArray codecString codecHex codecBase32 codecBase64 sha256 ccm ocb2 gcm hmac pbkdf2 random convenience/); # argument parsing -while ($arg = shift @ARGV) { +while (my $arg = shift @ARGV) { if ($arg =~ /^--?with-all$/) { foreach (@targets) { if ($enabled{$_} == 0) { @@ -74,14 +82,14 @@ Usage: $0 arguments... Valid arguments are: --with-all: by default, include all targets --without-all: by default, include no targets - + --compress=none|closure|yui - + --with-TARGET: require TARGET --without-TARGET: forbid TARGET - + --help: show this message - + Valid targets are: $targets @@ -95,7 +103,7 @@ my $config = ''; my $pconfig; # dependency analysis: forbidden -foreach $i (@targets) { +foreach my $i (@targets) { if ($enabled{$i} > 0) { foreach $j (split /,/, $deps{$i}) { if ($enabled{$j} == -1) { @@ -112,7 +120,7 @@ foreach $i (@targets) { } # reverse -foreach $i (reverse @targets) { +foreach my $i (reverse @targets) { if ($enabled{$i} > 0) { foreach $j (split /,/, $deps{$i}) { if ($enabled{$j} < $enabled{$i}) { @@ -138,4 +146,3 @@ $compress = "core_$compress.js"; $compress = 'core.js' if ($compress eq 'core_none.js'); print CONFIG "COMPRESS= $compress\n"; - diff --git a/core/bitArray.js b/core/bitArray.js index a6d0617..54112ac 100644 --- a/core/bitArray.js +++ b/core/bitArray.js @@ -74,7 +74,7 @@ sjcl.bitArray = { return a1.concat(a2); } - var out, i, last = a1[a1.length-1], shift = sjcl.bitArray.getPartial(last); + var last = a1[a1.length-1], shift = sjcl.bitArray.getPartial(last); if (shift === 32) { return a1.concat(a2); } else { @@ -183,5 +183,19 @@ sjcl.bitArray = { */ _xor4: function(x,y) { return [x[0]^y[0],x[1]^y[1],x[2]^y[2],x[3]^y[3]]; + }, + + /** byteswap a word array inplace. + * (does not handle partial words) + * @param {sjcl.bitArray} a word array + * @return {sjcl.bitArray} byteswapped array + */ + byteswapM: function(a) { + var i, v, m = 0xff00; + for (i = 0; i < a.length; ++i) { + v = a[i]; + a[i] = (v >>> 24) | ((v >>> 8) & m) | ((v & m) << 8) | (v << 24); + } + return a; } }; @@ -1,4 +1,5 @@ /** + * @constructor * Constructs a new bignum from another bignum, a number or a hex string. */ sjcl.bn = function(it) { @@ -9,7 +10,7 @@ sjcl.bn.prototype = { radix: 24, maxMul: 8, _class: sjcl.bn, - + copy: function() { return new this._class(this); }, @@ -18,17 +19,17 @@ sjcl.bn.prototype = { * Initializes this with it, either as a bn, a number, or a hex string. */ initWith: function(it) { - var i=0, k, n, l; + var i=0, k; switch(typeof it) { case "object": this.limbs = it.limbs.slice(0); break; - + case "number": this.limbs = [it]; this.normalize(); break; - + case "string": it = it.replace(/^0x/, ''); this.limbs = []; @@ -59,14 +60,14 @@ sjcl.bn.prototype = { } return (difference === 0); }, - + /** * Get the i'th limb of this, zero if i is too large. */ getLimb: function(i) { return (i >= this.limbs.length) ? 0 : this.limbs[i]; }, - + /** * Constant time comparison function. * Returns 1 if this >= that, or zero otherwise. @@ -83,7 +84,7 @@ sjcl.bn.prototype = { } return (greater | ~less) >>> 31; }, - + /** * Convert to a hex string. */ @@ -99,7 +100,7 @@ sjcl.bn.prototype = { } return "0x"+out; }, - + /** this += that. Does not normalize. */ addM: function(that) { if (typeof(that) !== "object") { that = new this._class(that); } @@ -112,7 +113,7 @@ sjcl.bn.prototype = { } return this; }, - + /** this *= 2. Requires normalized; ends up normalized. */ doubleM: function() { var i, carry=0, tmp, r=this.radix, m=this.radixMask, l=this.limbs; @@ -127,7 +128,7 @@ sjcl.bn.prototype = { } return this; }, - + /** this /= 2, rounded down. Requires normalized; ends up normalized. */ halveM: function() { var i, carry=0, tmp, r=this.radix, l=this.limbs; @@ -154,14 +155,21 @@ sjcl.bn.prototype = { } return this; }, - + mod: function(that) { + var neg = !this.greaterEquals(new sjcl.bn(0)); + that = new sjcl.bn(that).normalize(); // copy before we begin var out = new sjcl.bn(this).normalize(), ci=0; - + + if (neg) out = (new sjcl.bn(0)).subM(out).normalize(); + for (; out.greaterEquals(that); ci++) { that.doubleM(); } + + if (neg) out = that.sub(out).normalize(); + for (; ci > 0; ci--) { that.halveM(); if (out.greaterEquals(that)) { @@ -170,15 +178,15 @@ sjcl.bn.prototype = { } return out.trim(); }, - + /** return inverse mod prime p. p must be odd. Binary extended Euclidean algorithm mod p. */ inverseMod: function(p) { var a = new sjcl.bn(1), b = new sjcl.bn(0), x = new sjcl.bn(this), y = new sjcl.bn(p), tmp, i, nz=1; - + if (!(p.limbs[0] & 1)) { throw (new sjcl.exception.invalid("inverseMod: p must be odd")); } - + // invariant: y is odd do { if (x.limbs[0] & 1) { @@ -189,13 +197,13 @@ sjcl.bn.prototype = { } x.subM(y); x.normalize(); - + if (!a.greaterEquals(b)) { a.addM(p); } a.subM(b); } - + // cut everything in half x.halveM(); if (a.limbs[0] & 1) { @@ -203,20 +211,20 @@ sjcl.bn.prototype = { } a.normalize(); a.halveM(); - + // check for termination: x ?= 0 for (i=nz=0; i<x.limbs.length; i++) { nz |= x.limbs[i]; } } while(nz); - + if (!y.equals(1)) { throw (new sjcl.exception.invalid("inverseMod: p and x must be relatively prime")); } - + return b; }, - + /** this + that. Does not normalize. */ add: function(that) { return this.copy().addM(that); @@ -226,7 +234,7 @@ sjcl.bn.prototype = { sub: function(that) { return this.copy().subM(that); }, - + /** this * that. Normalizes and reduces. */ mul: function(that) { if (typeof(that) === "number") { that = new this._class(that); } @@ -240,7 +248,7 @@ sjcl.bn.prototype = { for (j=0; j<bl; j++) { c[i+j] += ai * b[j]; } - + if (!--ii) { ii = this.maxMul; out.cnormalize(); @@ -256,22 +264,18 @@ sjcl.bn.prototype = { /** this ^ n. Uses square-and-multiply. Normalizes and reduces. */ power: function(l) { - if (typeof(l) === "number") { - l = [l]; - } else if (l.limbs !== undefined) { - l = l.normalize().limbs; - } + l = new sjcl.bn(l).normalize().trim().limbs; var i, j, out = new this._class(1), pow = this; for (i=0; i<l.length; i++) { for (j=0; j<this.radix; j++) { - if (l[i] & (1<<j)) { - out = out.mul(pow); - } + if (l[i] & (1<<j)) { out = out.mul(pow); } + if (i == (l.length - 1) && l[i]>>(j + 1) == 0) { break; } + pow = pow.square(); } } - + return out; }, @@ -282,14 +286,184 @@ sjcl.bn.prototype = { /** this ^ x mod N */ powermod: function(x, N) { - var result = new sjcl.bn(1), a = new sjcl.bn(this), k = new sjcl.bn(x); - while (true) { - if (k.limbs[0] & 1) { result = result.mulmod(a, N); } - k.halveM(); - if (k.equals(0)) { break; } - a = a.mulmod(a, N); - } - return result.normalize().reduce(); + x = new sjcl.bn(x); + N = new sjcl.bn(N); + + // Jump to montpowermod if possible. + if ((N.limbs[0] & 1) == 1) { + var montOut = this.montpowermod(x, N); + + if (montOut != false) { return montOut; } // else go to slow powermod + } + + var i, j, l = x.normalize().trim().limbs, out = new this._class(1), pow = this; + + for (i=0; i<l.length; i++) { + for (j=0; j<this.radix; j++) { + if (l[i] & (1<<j)) { out = out.mulmod(pow, N); } + if (i == (l.length - 1) && l[i]>>(j + 1) == 0) { break; } + + pow = pow.mulmod(pow, N); + } + } + + return out; + }, + + /** this ^ x mod N with Montomery reduction */ + montpowermod: function(x, N) { + x = new sjcl.bn(x).normalize().trim(); + N = new sjcl.bn(N); + + var i, j, + radix = this.radix, + out = new this._class(1), + pow = this.copy(); + + // Generate R as a cap of N. + var R, s, wind, bitsize = x.bitLength(); + + R = new sjcl.bn({ + limbs: N.copy().normalize().trim().limbs.map(function() { return 0; }) + }); + + for (s = this.radix; s > 0; s--) { + if (((N.limbs[N.limbs.length - 1] >> s) & 1) == 1) { + R.limbs[R.limbs.length - 1] = 1 << s; + break; + } + } + + // Calculate window size as a function of the exponent's size. + if (bitsize == 0) { + return this; + } else if (bitsize < 18) { + wind = 1; + } else if (bitsize < 48) { + wind = 3; + } else if (bitsize < 144) { + wind = 4; + } else if (bitsize < 768) { + wind = 5; + } else { + wind = 6; + } + + // Find R' and N' such that R * R' - N * N' = 1. + var RR = R.copy(), NN = N.copy(), RP = new sjcl.bn(1), NP = new sjcl.bn(0), RT = R.copy(); + + while (RT.greaterEquals(1)) { + RT.halveM(); + + if ((RP.limbs[0] & 1) == 0) { + RP.halveM(); + NP.halveM(); + } else { + RP.addM(NN); + RP.halveM(); + + NP.halveM(); + NP.addM(RR); + } + } + + RP = RP.normalize(); + NP = NP.normalize(); + + RR.doubleM() + var R2 = RR.mulmod(RR, N); + + // Check whether the invariant holds. + // If it doesn't, we can't use Montgomery reduction on this modulus. + if (!RR.mul(RP).sub(N.mul(NP)).equals(1)) { + return false; + } + + var montIn = function(c) { return montMul(c, R2) }, + montMul = function(a, b) { + // Standard Montgomery reduction + var k, carry, ab, right, abBar, mask = (1 << (s + 1)) - 1; + + ab = a.mul(b); + + right = ab.mul(NP); + right.limbs = right.limbs.slice(0, R.limbs.length); + + if (right.limbs.length == R.limbs.length) { + right.limbs[R.limbs.length - 1] &= mask; + } + + right = right.mul(N); + + abBar = ab.add(right).normalize().trim(); + abBar.limbs = abBar.limbs.slice(R.limbs.length - 1); + + // Division. Equivelent to calling *.halveM() s times. + for (k=0; k < abBar.limbs.length; k++) { + if (k > 0) { + abBar.limbs[k - 1] |= (abBar.limbs[k] & mask) << (radix - s - 1) + } + + abBar.limbs[k] = abBar.limbs[k] >> (s + 1) + } + + if (abBar.greaterEquals(N)) { + abBar.subM(N) + } + + return abBar; + }, + montOut = function(c) { return montMul(c, 1); }; + + pow = montIn(pow); + out = montIn(out); + + // Sliding-Window Exponentiation (HAC 14.85) + var h, precomp = {}, cap = (1 << (wind - 1)) - 1; + + precomp[1] = pow.copy(); + precomp[2] = montMul(pow, pow); + + for (h=1; h<=cap; h++) { + precomp[(2 * h) + 1] = montMul(precomp[(2 * h) - 1], precomp[2]); + } + + var getBit = function(exp, i) { // Gets ith bit of exp. + var off = i % exp.radix; + + return (exp.limbs[Math.floor(i / exp.radix)] & (1 << off)) >> off; + } + + for (i = x.bitLength() - 1; i >= 0; ) { + if (getBit(x, i) == 0) { + // If the next bit is zero: + // Square, move forward one bit. + out = montMul(out, out) + i = i - 1; + } else { + // If the next bit is one: + // Find the longest sequence of bits after this one, less than `wind` + // bits long, that ends with a 1. Convert the sequence into an + // integer and look up the pre-computed value to add. + var l = i - wind + 1; + + while (getBit(x, l) == 0) { + l++; + } + + var indx = 0; + for (j = l; j <= i; j++) { + indx += getBit(x, j) << (j - l) + out = montMul(out, out); + } + + out = montMul(out, precomp[indx]) + + i = l - 1; + } + } + + return montOut(out); }, trim: function() { @@ -300,7 +474,7 @@ sjcl.bn.prototype = { l.push(p); return this; }, - + /** Reduce mod a modulus. Stubbed for subclassing. */ reduce: function() { return this; @@ -310,7 +484,7 @@ sjcl.bn.prototype = { fullReduce: function() { return this.normalize(); }, - + /** Propagate carries. */ normalize: function() { var carry=0, i, pv = this.placeVal, ipv = this.ipv, l, m, limbs = this.limbs, ll = limbs.length, mask = this.radixMask; @@ -320,7 +494,10 @@ sjcl.bn.prototype = { carry = (l-m)*ipv; } if (carry === -1) { - limbs[i-1] -= this.placeVal; + limbs[i-1] -= pv; + } + while (limbs.length > 0 && limbs[limbs.length-1] === 0) { + limbs.pop(); } return this; }, @@ -336,35 +513,39 @@ sjcl.bn.prototype = { limbs[i] += carry; return this; }, - + /** Serialize to a bit array */ toBits: function(len) { this.fullReduce(); - len = len || this.exponent || this.limbs.length * this.radix; + len = len || this.exponent || this.bitLength(); var i = Math.floor((len-1)/24), w=sjcl.bitArray, e = (len + 7 & -8) % this.radix || this.radix, out = [w.partial(e, this.getLimb(i))]; for (i--; i >= 0; i--) { - out = w.concat(out, [w.partial(this.radix, this.getLimb(i))]); + out = w.concat(out, [w.partial(Math.min(this.radix,len), this.getLimb(i))]); + len -= this.radix; } return out; }, - + /** Return the length in bits, rounded up to the nearest byte. */ bitLength: function() { this.fullReduce(); var out = this.radix * (this.limbs.length - 1), b = this.limbs[this.limbs.length - 1]; - for (; b; b >>= 1) { + for (; b; b >>>= 1) { out ++; } return out+7 & -8; } }; +/** @memberOf sjcl.bn +* @this { sjcl.bn } +*/ sjcl.bn.fromBits = function(bits) { var Class = this, out = new Class(), words=[], w=sjcl.bitArray, t = this.prototype, l = Math.min(this.bitLength || 0x100000000, w.bitLength(bits)), e = l % t.radix || t.radix; - + words[0] = w.extract(bits, 0, e); for (; e < l; e += t.radix) { words.unshift(w.extract(bits, e, t.radix)); @@ -384,6 +565,9 @@ sjcl.bn.prototype.radixMask = (1 << sjcl.bn.prototype.radix) - 1; * i.e. a prime of the form 2^e + sum(a * 2^b),where the sum is negative and sparse. */ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { + /** @constructor + * @private + */ function p(it) { this.initWith(it); /*if (this.limbs[this.modOffset]) { @@ -401,7 +585,7 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { ppr.fullOffset = []; ppr.fullFactor = []; ppr.modulus = p.modulus = new sjcl.bn(Math.pow(2,exponent)); - + ppr.fullMask = 0|-Math.pow(2, exponent % ppr.radix); for (i=0; i<coeff.length; i++) { @@ -415,9 +599,12 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { ppr._class = p; ppr.modulus.cnormalize(); - /** Approximate reduction mod p. May leave a number which is negative or slightly larger than p. */ + /** Approximate reduction mod p. May leave a number which is negative or slightly larger than p. + * @memberof sjcl.bn + * @this { sjcl.bn } + */ ppr.reduce = function() { - var i, k, l, mo = this.modOffset, limbs = this.limbs, aff, off = this.offset, ol = this.offset.length, fac = this.factor, ll; + var i, k, l, mo = this.modOffset, limbs = this.limbs, off = this.offset, ol = this.offset.length, fac = this.factor, ll; i = this.minOffset; while (limbs.length > mo) { @@ -426,7 +613,7 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { for (k=0; k<ol; k++) { limbs[ll+off[k]] -= fac[k] * l; } - + i--; if (!i) { limbs.push(0); @@ -438,7 +625,10 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { return this; }; - + + /** @memberof sjcl.bn + * @this { sjcl.bn } + */ ppr._strongReduce = (ppr.fullMask === -1) ? ppr.reduce : function() { var limbs = this.limbs, i = limbs.length - 1, k, l; this.reduce(); @@ -452,11 +642,14 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { } }; - /** mostly constant-time, very expensive full reduction. */ + /** mostly constant-time, very expensive full reduction. + * @memberof sjcl.bn + * @this { sjcl.bn } + */ ppr.fullReduce = function() { var greater, i; // massively above the modulus, may be negative - + this._strongReduce(); // less than twice the modulus, may be negative @@ -464,7 +657,7 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { this.addM(this.modulus); this.normalize(); // probably 2-3x the modulus - + this._strongReduce(); // less than the power of 2. still may be more than // the modulus @@ -473,7 +666,7 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { for (i=this.limbs.length; i<this.modOffset; i++) { this.limbs[i] = 0; } - + // constant-time subtract modulus greater = this.greaterEquals(this.modulus); for (i=0; i<this.limbs.length; i++) { @@ -484,6 +677,10 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { return this; }; + + /** @memberof sjcl.bn + * @this { sjcl.bn } + */ ppr.inverse = function() { return (this.power(this.modulus.sub(2))); }; @@ -494,18 +691,24 @@ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { }; // a small Mersenne prime +var sbp = sjcl.bn.pseudoMersennePrime; sjcl.bn.prime = { - p127: sjcl.bn.pseudoMersennePrime(127, [[0,-1]]), + p127: sbp(127, [[0,-1]]), // Bernstein's prime for Curve25519 - p25519: sjcl.bn.pseudoMersennePrime(255, [[0,-19]]), + p25519: sbp(255, [[0,-19]]), + + // Koblitz primes + p192k: sbp(192, [[32,-1],[12,-1],[8,-1],[7,-1],[6,-1],[3,-1],[0,-1]]), + p224k: sbp(224, [[32,-1],[12,-1],[11,-1],[9,-1],[7,-1],[4,-1],[1,-1],[0,-1]]), + p256k: sbp(256, [[32,-1],[9,-1],[8,-1],[7,-1],[6,-1],[4,-1],[0,-1]]), // NIST primes - p192: sjcl.bn.pseudoMersennePrime(192, [[0,-1],[64,-1]]), - p224: sjcl.bn.pseudoMersennePrime(224, [[0,1],[96,-1]]), - p256: sjcl.bn.pseudoMersennePrime(256, [[0,-1],[96,1],[192,1],[224,-1]]), - p384: sjcl.bn.pseudoMersennePrime(384, [[0,-1],[32,1],[96,-1],[128,-1]]), - p521: sjcl.bn.pseudoMersennePrime(521, [[0,-1]]) + p192: sbp(192, [[0,-1],[64,-1]]), + p224: sbp(224, [[0,1],[96,-1]]), + p256: sbp(256, [[0,-1],[96,1],[192,1],[224,-1]]), + p384: sbp(384, [[0,-1],[32,1],[96,-1],[128,-1]]), + p521: sbp(521, [[0,-1]]) }; sjcl.bn.random = function(modulus, paranoia) { @@ -531,4 +734,3 @@ sjcl.bn.random = function(modulus, paranoia) { } } }; - diff --git a/core/cbc.js b/core/cbc.js index 9a98ed8..39026cd 100644 --- a/core/cbc.js +++ b/core/cbc.js @@ -5,18 +5,18 @@ * @author Dan Boneh */ -/** @namespace - * Dangerous: CBC mode with PKCS#5 padding. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ if (sjcl.beware === undefined) { sjcl.beware = {}; } sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity." ] = function() { + /** @namespace + * Dangerous: CBC mode with PKCS#5 padding. + * + * @author Emily Stark + * @author Mike Hamburg + * @author Dan Boneh + */ sjcl.mode.cbc = { /** The name of the mode. * @constant @@ -100,7 +100,7 @@ sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity. /* check and remove the pad */ bi = output[i-1] & 255; - if (bi == 0 || bi > 16) { + if (bi === 0 || bi > 16) { throw new sjcl.exception.corrupt("pkcs#5 padding corrupt"); } bo = bi * 0x1010101; diff --git a/core/ccm.js b/core/ccm.js index 8a32c5a..1efde02 100644 --- a/core/ccm.js +++ b/core/ccm.js @@ -15,6 +15,27 @@ sjcl.mode.ccm = { */ name: "ccm", + _progressListeners: [], + + listenProgress: function (cb) { + sjcl.mode.ccm._progressListeners.push(cb); + }, + + unListenProgress: function (cb) { + var index = sjcl.mode.ccm._progressListeners.indexOf(cb); + if (index > -1) { + sjcl.mode.ccm._progressListeners.splice(index, 1); + } + }, + + _callProgressListener: function (val) { + var p = sjcl.mode.ccm._progressListeners.slice(), i; + + for (i = 0; i < p.length; i += 1) { + p[i](val); + } + }, + /** Encrypt in CCM mode. * @static * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. @@ -25,7 +46,7 @@ sjcl.mode.ccm = { * @return {bitArray} The encrypted data, an array of bytes. */ encrypt: function(prf, plaintext, iv, adata, tlen) { - var L, i, out = plaintext.slice(0), tag, w=sjcl.bitArray, ivl = w.bitLength(iv) / 8, ol = w.bitLength(out) / 8; + var L, out = plaintext.slice(0), tag, w=sjcl.bitArray, ivl = w.bitLength(iv) / 8, ol = w.bitLength(out) / 8; tlen = tlen || 64; adata = adata || []; @@ -59,7 +80,7 @@ sjcl.mode.ccm = { decrypt: function(prf, ciphertext, iv, adata, tlen) { tlen = tlen || 64; adata = adata || []; - var L, i, + var L, w=sjcl.bitArray, ivl = w.bitLength(iv) / 8, ol = w.bitLength(ciphertext), @@ -90,6 +111,36 @@ sjcl.mode.ccm = { return out.data; }, + _macAdditionalData: function (prf, adata, iv, tlen, ol, L) { + var mac, tmp, i, macData = [], w=sjcl.bitArray, xor = w._xor4; + + // mac the flags + mac = [w.partial(8, (adata.length ? 1<<6 : 0) | (tlen-2) << 2 | L-1)]; + + // mac the iv and length + mac = w.concat(mac, iv); + mac[3] |= ol; + mac = prf.encrypt(mac); + + if (adata.length) { + // mac the associated data. start with its length... + tmp = w.bitLength(adata)/8; + if (tmp <= 0xFEFF) { + macData = [w.partial(16, tmp)]; + } else if (tmp <= 0xFFFFFFFF) { + macData = w.concat([w.partial(16,0xFFFE)], [tmp]); + } // else ... + + // mac the data itself + macData = w.concat(macData, adata); + for (i=0; i<macData.length; i += 4) { + mac = prf.encrypt(xor(mac, macData.slice(i,i+4).concat([0,0,0]))); + } + } + + return mac; + }, + /* Compute the (unencrypted) authentication tag, according to the CCM specification * @param {Object} prf The pseudorandom function. * @param {bitArray} plaintext The plaintext data. @@ -101,7 +152,7 @@ sjcl.mode.ccm = { */ _computeTag: function(prf, plaintext, iv, adata, tlen, L) { // compute B[0] - var q, mac, field = 0, offset = 24, tmp, i, macData = [], w=sjcl.bitArray, xor = w._xor4; + var mac, i, w=sjcl.bitArray, xor = w._xor4; tlen /= 8; @@ -115,31 +166,8 @@ sjcl.mode.ccm = { throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"); } - // mac the flags - mac = [w.partial(8, (adata.length ? 1<<6 : 0) | (tlen-2) << 2 | L-1)]; + mac = sjcl.mode.ccm._macAdditionalData(prf, adata, iv, tlen, w.bitLength(plaintext)/8, L); - // mac the iv and length - mac = w.concat(mac, iv); - mac[3] |= w.bitLength(plaintext)/8; - mac = prf.encrypt(mac); - - - if (adata.length) { - // mac the associated data. start with its length... - tmp = w.bitLength(adata)/8; - if (tmp <= 0xFEFF) { - macData = [w.partial(16, tmp)]; - } else if (tmp <= 0xFFFFFFFF) { - macData = w.concat([w.partial(16,0xFFFE)], [tmp]); - } // else ... - - // mac the data itself - macData = w.concat(macData, adata); - for (i=0; i<macData.length; i += 4) { - mac = prf.encrypt(xor(mac, macData.slice(i,i+4).concat([0,0,0]))); - } - } - // mac the plaintext for (i=0; i<plaintext.length; i+=4) { mac = prf.encrypt(xor(mac, plaintext.slice(i,i+4).concat([0,0,0]))); @@ -161,7 +189,7 @@ sjcl.mode.ccm = { * @private */ _ctrMode: function(prf, data, iv, tag, tlen, L) { - var enc, i, w=sjcl.bitArray, xor = w._xor4, ctr, b, l = data.length, bl=w.bitLength(data); + var enc, i, w=sjcl.bitArray, xor = w._xor4, ctr, l = data.length, bl=w.bitLength(data), n = l/50, p = n; // start the ctr ctr = w.concat([w.partial(8,L-1)],iv).concat([0,0,0]).slice(0,4); @@ -173,6 +201,10 @@ sjcl.mode.ccm = { if (!l) { return {tag:tag, data:[]}; } for (i=0; i<l; i+=4) { + if (i > n) { + sjcl.mode.ccm._callProgressListener(i/l); + n += p; + } ctr[3]++; enc = prf.encrypt(ctr); data[i] ^= enc[0]; diff --git a/core/ccmArrayBuffer.js b/core/ccmArrayBuffer.js new file mode 100644 index 0000000..a7b44b0 --- /dev/null +++ b/core/ccmArrayBuffer.js @@ -0,0 +1,247 @@ +/** @fileOverview Really fast & small implementation of CCM using JS' array buffers + * + * @author Marco Munizaga + */ + +/** @namespace CTR mode with CBC MAC. */ + +sjcl.arrayBuffer = sjcl.arrayBuffer || {}; + +//patch arraybuffers if they don't exist +if (typeof(ArrayBuffer) === 'undefined') { + (function(globals){ + "use strict"; + globals.ArrayBuffer = function(){}; + globals.DataView = function(){}; + }(this)); +} + + +sjcl.arrayBuffer.ccm = { + mode: "ccm", + + defaults: { + tlen:128 //this is M in the NIST paper + }, + + /** Encrypt in CCM mode. Meant to return the same exact thing as the bitArray ccm to work as a drop in replacement + * @static + * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. + * @param {bitArray} plaintext The plaintext data. + * @param {bitArray} iv The initialization value. + * @param {bitArray} [adata=[]] The authenticated data. + * @param {Number} [tlen=64] the desired tag length, in bits. + * @return {bitArray} The encrypted data, an array of bytes. + */ + compat_encrypt: function(prf, plaintext, iv, adata, tlen){ + var plaintext_buffer = sjcl.codec.arrayBuffer.fromBits(plaintext, true, 16), + ol = sjcl.bitArray.bitLength(plaintext)/8, + encrypted_obj, + ct, + tag; + + tlen = tlen || 64; + adata = adata || []; + + encrypted_obj = sjcl.arrayBuffer.ccm.encrypt(prf, plaintext_buffer, iv, adata, tlen, ol); + ct = sjcl.codec.arrayBuffer.toBits(encrypted_obj.ciphertext_buffer); + + ct = sjcl.bitArray.clamp(ct, ol*8); + + + return sjcl.bitArray.concat(ct, encrypted_obj.tag); + }, + + /** Decrypt in CCM mode. Meant to imitate the bitArray ccm + * @static + * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. + * @param {bitArray} ciphertext The ciphertext data. + * @param {bitArray} iv The initialization value. + * @param {bitArray} [[]] adata The authenticated data. + * @param {Number} [64] tlen the desired tag length, in bits. + * @return {bitArray} The decrypted data. + */ + compat_decrypt: function(prf, ciphertext, iv, adata, tlen){ + tlen = tlen || 64; + adata = adata || []; + var L, i, + w=sjcl.bitArray, + ol = w.bitLength(ciphertext), + out = w.clamp(ciphertext, ol - tlen), + tag = w.bitSlice(ciphertext, ol - tlen), tag2, + ciphertext_buffer = sjcl.codec.arrayBuffer.fromBits(out, true, 16); + + var plaintext_buffer = sjcl.arrayBuffer.ccm.decrypt(prf, ciphertext_buffer, iv, tag, adata, tlen, (ol-tlen)/8); + return sjcl.bitArray.clamp(sjcl.codec.arrayBuffer.toBits(plaintext_buffer), ol-tlen); + + }, + + /** Really fast ccm encryption, uses arraybufer and mutates the plaintext buffer + * @static + * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. + * @param {ArrayBuffer} plaintext_buffer The plaintext data. + * @param {bitArray} iv The initialization value. + * @param {ArrayBuffer} [adata=[]] The authenticated data. + * @param {Number} [tlen=128] the desired tag length, in bits. + * @return {ArrayBuffer} The encrypted data, in the same array buffer as the given plaintext, but given back anyways + */ + encrypt: function(prf, plaintext_buffer, iv, adata, tlen, ol){ + var auth_blocks, mac, L, w = sjcl.bitArray, + ivl = w.bitLength(iv) / 8; + + //set up defaults + adata = adata || []; + tlen = tlen || sjcl.arrayBuffer.ccm.defaults.tlen; + ol = ol || plaintext_buffer.byteLength; + tlen = Math.ceil(tlen/8); + + for (L=2; L<4 && ol >>> 8*L; L++) {} + if (L < 15 - ivl) { L = 15-ivl; } + iv = w.clamp(iv,8*(15-L)); + + //prf should use a 256 bit key to make precomputation attacks infeasible + + mac = sjcl.arrayBuffer.ccm._computeTag(prf, plaintext_buffer, iv, adata, tlen, ol, L); + + //encrypt the plaintext and the mac + //returns the mac since the plaintext will be left encrypted inside the buffer + mac = sjcl.arrayBuffer.ccm._ctrMode(prf, plaintext_buffer, iv, mac, tlen, L); + + + //the plaintext_buffer has been modified so it is now the ciphertext_buffer + return {'ciphertext_buffer':plaintext_buffer, 'tag':mac}; + }, + + /** Really fast ccm decryption, uses arraybufer and mutates the given buffer + * @static + * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. + * @param {ArrayBuffer} ciphertext_buffer The Ciphertext data. + * @param {bitArray} iv The initialization value. + * @param {bitArray} The authentication tag for the ciphertext + * @param {ArrayBuffer} [adata=[]] The authenticated data. + * @param {Number} [tlen=128] the desired tag length, in bits. + * @return {ArrayBuffer} The decrypted data, in the same array buffer as the given buffer, but given back anyways + */ + decrypt: function(prf, ciphertext_buffer, iv, tag, adata, tlen, ol){ + var mac, mac2, i, L, w = sjcl.bitArray, + ivl = w.bitLength(iv) / 8; + + //set up defaults + adata = adata || []; + tlen = tlen || sjcl.arrayBuffer.ccm.defaults.tlen; + ol = ol || ciphertext_buffer.byteLength; + tlen = Math.ceil(tlen/8) ; + + for (L=2; L<4 && ol >>> 8*L; L++) {} + if (L < 15 - ivl) { L = 15-ivl; } + iv = w.clamp(iv,8*(15-L)); + + //prf should use a 256 bit key to make precomputation attacks infeasible + + //decrypt the buffer + mac = sjcl.arrayBuffer.ccm._ctrMode(prf, ciphertext_buffer, iv, tag, tlen, L); + + mac2 = sjcl.arrayBuffer.ccm._computeTag(prf, ciphertext_buffer, iv, adata, tlen, ol, L); + + //check the tag + if (!sjcl.bitArray.equal(mac, mac2)){ + throw new sjcl.exception.corrupt("ccm: tag doesn't match"); + } + + return ciphertext_buffer; + + }, + + /* Compute the (unencrypted) authentication tag, according to the CCM specification + * @param {Object} prf The pseudorandom function. + * @param {ArrayBuffer} data_buffer The plaintext data in an arraybuffer. + * @param {bitArray} iv The initialization value. + * @param {bitArray} adata The authenticated data. + * @param {Number} tlen the desired tag length, in bits. + * @return {bitArray} The tag, but not yet encrypted. + * @private + */ + _computeTag: function(prf, data_buffer, iv, adata, tlen, ol, L){ + var i, plaintext, mac, data, data_blocks_size, data_blocks, + w = sjcl.bitArray, tmp, macData; + + mac = sjcl.mode.ccm._macAdditionalData(prf, adata, iv, tlen, ol, L); + + if (data_buffer.byteLength !== 0) { + data = new DataView(data_buffer); + //set padding bytes to 0 + for (i=ol; i< data_buffer.byteLength; i++){ + data.setUint8(i,0); + } + + //now to mac the plaintext blocks + for (i=0; i < data.byteLength; i+=16){ + mac[0] ^= data.getUint32(i); + mac[1] ^= data.getUint32(i+4); + mac[2] ^= data.getUint32(i+8); + mac[3] ^= data.getUint32(i+12); + + mac = prf.encrypt(mac); + } + } + + return sjcl.bitArray.clamp(mac,tlen*8); + }, + + /** CCM CTR mode. + * Encrypt or decrypt data and tag with the prf in CCM-style CTR mode. + * Mutates given array buffer + * @param {Object} prf The PRF. + * @param {ArrayBuffer} data_buffer The data to be encrypted or decrypted. + * @param {bitArray} iv The initialization vector. + * @param {bitArray} tag The authentication tag. + * @param {Number} tlen The length of th etag, in bits. + * @return {Object} An object with data and tag, the en/decryption of data and tag values. + * @private + */ + _ctrMode: function(prf, data_buffer, iv, mac, tlen, L){ + var data, ctr, word0, word1, word2, word3, keyblock, i, w = sjcl.bitArray, xor = w._xor4, n = data_buffer.byteLength/50, p = n; + + ctr = new DataView(new ArrayBuffer(16)); //create the first block for the counter + + //prf should use a 256 bit key to make precomputation attacks infeasible + + // start the ctr + ctr = w.concat([w.partial(8,L-1)],iv).concat([0,0,0]).slice(0,4); + + // en/decrypt the tag + mac = w.bitSlice(xor(mac,prf.encrypt(ctr)), 0, tlen*8); + + ctr[3]++; + if (ctr[3]===0) ctr[2]++; //increment higher bytes if the lowest 4 bytes are 0 + + if (data_buffer.byteLength !== 0) { + data = new DataView(data_buffer); + //now lets encrypt the message + for (i=0; i<data.byteLength;i+=16){ + if (i > n) { + sjcl.mode.ccm._callProgressListener(i/data_buffer.byteLength); + n += p; + } + keyblock = prf.encrypt(ctr); + + word0 = data.getUint32(i); + word1 = data.getUint32(i+4); + word2 = data.getUint32(i+8); + word3 = data.getUint32(i+12); + + data.setUint32(i,word0 ^ keyblock[0]); + data.setUint32(i+4, word1 ^ keyblock[1]); + data.setUint32(i+8, word2 ^ keyblock[2]); + data.setUint32(i+12, word3 ^ keyblock[3]); + + ctr[3]++; + if (ctr[3]===0) ctr[2]++; //increment higher bytes if the lowest 4 bytes are 0 + } + } + + //return the mac, the ciphered data is available through the same data_buffer that was given + return mac; + } + +}; diff --git a/core/codecArrayBuffer.js b/core/codecArrayBuffer.js new file mode 100644 index 0000000..c2be4ca --- /dev/null +++ b/core/codecArrayBuffer.js @@ -0,0 +1,113 @@ +/** @fileOverview Bit array codec implementations. + * + * @author Marco Munizaga + */ + +//patch arraybuffers if they don't exist +if (typeof(ArrayBuffer) === 'undefined') { + (function(globals){ + "use strict"; + globals.ArrayBuffer = function(){}; + globals.DataView = function(){}; + }(this)); +} + +/** @namespace ArrayBuffer */ +sjcl.codec.arrayBuffer = { + /** Convert from a bitArray to an ArrayBuffer. + * Will default to 8byte padding if padding is undefined*/ + fromBits: function (arr, padding, padding_count) { + var out, i, ol, tmp, smallest; + padding = padding==undefined ? true : padding + padding_count = padding_count || 8 + + if (arr.length === 0) { + return new ArrayBuffer(0); + } + + ol = sjcl.bitArray.bitLength(arr)/8; + + //check to make sure the bitLength is divisible by 8, if it isn't + //we can't do anything since arraybuffers work with bytes, not bits + if ( sjcl.bitArray.bitLength(arr)%8 !== 0 ) { + throw new sjcl.exception.invalid("Invalid bit size, must be divisble by 8 to fit in an arraybuffer correctly") + } + + if (padding && ol%padding_count !== 0){ + ol += padding_count - (ol%padding_count); + } + + + //padded temp for easy copying + tmp = new DataView(new ArrayBuffer(arr.length*4)); + for (i=0; i<arr.length; i++) { + tmp.setUint32(i*4, (arr[i]<<32)); //get rid of the higher bits + } + + //now copy the final message if we are not going to 0 pad + out = new DataView(new ArrayBuffer(ol)); + + //save a step when the tmp and out bytelength are === + if (out.byteLength === tmp.byteLength){ + return tmp.buffer; + } + + smallest = tmp.byteLength < out.byteLength ? tmp.byteLength : out.byteLength; + for(i=0; i<smallest; i++){ + out.setUint8(i,tmp.getUint8(i)); + } + + + return out.buffer + }, + + toBits: function (buffer) { + var i, out=[], len, inView, tmp; + + if (buffer.byteLength === 0) { + return []; + } + + inView = new DataView(buffer); + len = inView.byteLength - inView.byteLength%4; + + for (var i = 0; i < len; i+=4) { + out.push(inView.getUint32(i)); + } + + if (inView.byteLength%4 != 0) { + tmp = new DataView(new ArrayBuffer(4)); + for (var i = 0, l = inView.byteLength%4; i < l; i++) { + //we want the data to the right, because partial slices off the starting bits + tmp.setUint8(i+4-l, inView.getUint8(len+i)); // big-endian, + } + out.push( + sjcl.bitArray.partial( (inView.byteLength%4)*8, tmp.getUint32(0) ) + ); + } + return out; + }, + + + + /** Prints a hex output of the buffer contents, akin to hexdump **/ + hexDumpBuffer: function(buffer){ + var stringBufferView = new DataView(buffer) + var string = '' + var pad = function (n, width) { + n = n + ''; + return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n; + } + + for (var i = 0; i < stringBufferView.byteLength; i+=2) { + if (i%16 == 0) string += ('\n'+(i).toString(16)+'\t') + string += ( pad(stringBufferView.getUint16(i).toString(16),4) + ' ') + } + + if ( typeof console === undefined ){ + console = console || {log:function(){}} //fix for IE + } + console.log(string.toUpperCase()) + } +}; + diff --git a/core/codecBase32.js b/core/codecBase32.js new file mode 100644 index 0000000..9251e04 --- /dev/null +++ b/core/codecBase32.js @@ -0,0 +1,88 @@ +/** @fileOverview Bit array codec implementations. + * + * @author Nils Kenneweg + */ + +/** @namespace Base32 encoding/decoding */ +sjcl.codec.base32 = { + /** The base32 alphabet. + * @private + */ + _chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", + _hexChars: "0123456789ABCDEFGHIJKLMNOPQRSTUV", + + /* bits in an array */ + BITS: 32, + /* base to encode at (2^x) */ + BASE: 5, + /* bits - base */ + REMAINING: 27, + + /** Convert from a bitArray to a base32 string. */ + fromBits: function (arr, _noEquals, _hex) { + var BITS = sjcl.codec.base32.BITS, BASE = sjcl.codec.base32.BASE, REMAINING = sjcl.codec.base32.REMAINING; + var out = "", i, bits=0, c = sjcl.codec.base32._chars, ta=0, bl = sjcl.bitArray.bitLength(arr); + + if (_hex) { + c = sjcl.codec.base32._hexChars; + } + + for (i=0; out.length * BASE < bl; ) { + out += c.charAt((ta ^ arr[i]>>>bits) >>> REMAINING); + if (bits < BASE) { + ta = arr[i] << (BASE-bits); + bits += REMAINING; + i++; + } else { + ta <<= BASE; + bits -= BASE; + } + } + while ((out.length & 7) && !_noEquals) { out += "="; } + + return out; + }, + + /** Convert from a base32 string to a bitArray */ + toBits: function(str, _hex) { + str = str.replace(/\s|=/g,'').toUpperCase(); + var BITS = sjcl.codec.base32.BITS, BASE = sjcl.codec.base32.BASE, REMAINING = sjcl.codec.base32.REMAINING; + var out = [], i, bits=0, c = sjcl.codec.base32._chars, ta=0, x, format="base32"; + + if (_hex) { + c = sjcl.codec.base32._hexChars; + format = "base32hex" + } + + for (i=0; i<str.length; i++) { + x = c.indexOf(str.charAt(i)); + if (x < 0) { + // Invalid character, try hex format + if (!_hex) { + try { + return sjcl.codec.base32hex.toBits(str); + } + catch (e) {} + } + throw new sjcl.exception.invalid("this isn't " + format + "!"); + } + if (bits > REMAINING) { + bits -= REMAINING; + out.push(ta ^ x>>>bits); + ta = x << (BITS-bits); + } else { + bits += BASE; + ta ^= x << (BITS-bits); + } + } + if (bits&56) { + out.push(sjcl.bitArray.partial(bits&56, ta, 1)); + } + return out; + } +}; + +sjcl.codec.base32hex = { + fromBits: function (arr, _noEquals) { return sjcl.codec.base32.fromBits(arr,_noEquals,1); }, + toBits: function (str) { return sjcl.codec.base32.toBits(str,1); } +}; diff --git a/core/codecBase64.js b/core/codecBase64.js index 33b2b7a..f518083 100644 --- a/core/codecBase64.js +++ b/core/codecBase64.js @@ -15,7 +15,9 @@ sjcl.codec.base64 = { /** Convert from a bitArray to a base64 string. */ fromBits: function (arr, _noEquals, _url) { var out = "", i, bits=0, c = sjcl.codec.base64._chars, ta=0, bl = sjcl.bitArray.bitLength(arr); - if (_url) c = c.substr(0,62) + '-_'; + if (_url) { + c = c.substr(0,62) + '-_'; + } for (i=0; out.length * 6 < bl; ) { out += c.charAt((ta ^ arr[i]>>>bits) >>> 26); if (bits < 6) { @@ -35,7 +37,9 @@ sjcl.codec.base64 = { toBits: function(str, _url) { str = str.replace(/\s|=/g,''); var out = [], i, bits=0, c = sjcl.codec.base64._chars, ta=0, x; - if (_url) c = c.substr(0,62) + '-_'; + if (_url) { + c = c.substr(0,62) + '-_'; + } for (i=0; i<str.length; i++) { x = c.indexOf(str.charAt(i)); if (x < 0) { diff --git a/core/codecHex.js b/core/codecHex.js index 03fb628..c14d5a0 100644 --- a/core/codecHex.js +++ b/core/codecHex.js @@ -9,7 +9,7 @@ sjcl.codec.hex = { /** Convert from a bitArray to a hex string. */ fromBits: function (arr) { - var out = "", i, x; + var out = "", i; for (i=0; i<arr.length; i++) { out += ((arr[i]|0)+0xF00000000000).toString(16).substr(4); } diff --git a/core/convenience.js b/core/convenience.js index 8d68b07..ecc8cfa 100644 --- a/core/convenience.js +++ b/core/convenience.js @@ -4,7 +4,7 @@ * @author Mike Hamburg * @author Dan Boneh */ - + /** @namespace JSON encapsulation */ sjcl.json = { /** Default values for encryption */ @@ -15,13 +15,13 @@ * @param {String} plaintext The data to encrypt. * @param {Object} [params] The parameters including tag, iv and salt. * @param {Object} [rp] A returned version with filled-in parameters. - * @return {String} The ciphertext. + * @return {Object} The cipher raw data. * @throws {sjcl.exception.invalid} if a parameter is invalid. */ - encrypt: function (password, plaintext, params, rp) { + _encrypt: function (password, plaintext, params, rp) { params = params || {}; rp = rp || {}; - + var j = sjcl.json, p = j._add({ iv: sjcl.random.randomWords(4,0) }, j.defaults), tmp, prp, adata; j._add(p, params); @@ -32,7 +32,7 @@ if (typeof p.iv === "string") { p.iv = sjcl.codec.base64.toBits(p.iv); } - + if (!sjcl.mode[p.mode] || !sjcl.cipher[p.cipher] || (typeof password === "string" && p.iter <= 100) || @@ -41,52 +41,73 @@ (p.iv.length < 2 || p.iv.length > 4)) { throw new sjcl.exception.invalid("json encrypt: invalid parameters"); } - + if (typeof password === "string") { tmp = sjcl.misc.cachedPbkdf2(password, p); password = tmp.key.slice(0,p.ks/32); p.salt = tmp.salt; + } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.publicKey) { + tmp = password.kem(); + p.kemtag = tmp.tag; + password = tmp.key.slice(0,p.ks/32); } if (typeof plaintext === "string") { plaintext = sjcl.codec.utf8String.toBits(plaintext); } if (typeof adata === "string") { - adata = sjcl.codec.utf8String.toBits(adata); + p.adata = adata = sjcl.codec.utf8String.toBits(adata); } prp = new sjcl.cipher[p.cipher](password); - + /* return the json data */ j._add(rp, p); rp.key = password; - + /* do the encryption */ - p.ct = sjcl.mode[p.mode].encrypt(prp, plaintext, p.iv, adata, p.ts); - + if (p.mode === "ccm" && sjcl.arrayBuffer && sjcl.arrayBuffer.ccm && plaintext instanceof ArrayBuffer) { + p.ct = sjcl.arrayBuffer.ccm.encrypt(prp, plaintext, p.iv, adata, p.ts); + } else { + p.ct = sjcl.mode[p.mode].encrypt(prp, plaintext, p.iv, adata, p.ts); + } + //return j.encode(j._subtract(p, j.defaults)); + return p; + }, + + /** Simple encryption function. + * @param {String|bitArray} password The password or key. + * @param {String} plaintext The data to encrypt. + * @param {Object} [params] The parameters including tag, iv and salt. + * @param {Object} [rp] A returned version with filled-in parameters. + * @return {String} The ciphertext serialized data. + * @throws {sjcl.exception.invalid} if a parameter is invalid. + */ + encrypt: function (password, plaintext, params, rp) { + var j = sjcl.json, p = j._encrypt.apply(j, arguments); return j.encode(p); }, - + /** Simple decryption function. * @param {String|bitArray} password The password or key. - * @param {String} ciphertext The ciphertext to decrypt. + * @param {Object} ciphertext The cipher raw data to decrypt. * @param {Object} [params] Additional non-default parameters. * @param {Object} [rp] A returned object with filled parameters. * @return {String} The plaintext. * @throws {sjcl.exception.invalid} if a parameter is invalid. * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt. */ - decrypt: function (password, ciphertext, params, rp) { + _decrypt: function (password, ciphertext, params, rp) { params = params || {}; rp = rp || {}; - - var j = sjcl.json, p = j._add(j._add(j._add({},j.defaults),j.decode(ciphertext)), params, true), ct, tmp, prp, adata=p.adata; + + var j = sjcl.json, p = j._add(j._add(j._add({},j.defaults),ciphertext), params, true), ct, tmp, prp, adata=p.adata; if (typeof p.salt === "string") { p.salt = sjcl.codec.base64.toBits(p.salt); } if (typeof p.iv === "string") { p.iv = sjcl.codec.base64.toBits(p.iv); } - + if (!sjcl.mode[p.mode] || !sjcl.cipher[p.cipher] || (typeof password === "string" && p.iter <= 100) || @@ -96,27 +117,51 @@ (p.iv.length < 2 || p.iv.length > 4)) { throw new sjcl.exception.invalid("json decrypt: invalid parameters"); } - + if (typeof password === "string") { tmp = sjcl.misc.cachedPbkdf2(password, p); password = tmp.key.slice(0,p.ks/32); p.salt = tmp.salt; + } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.secretKey) { + password = password.unkem(sjcl.codec.base64.toBits(p.kemtag)).slice(0,p.ks/32); } if (typeof adata === "string") { adata = sjcl.codec.utf8String.toBits(adata); } prp = new sjcl.cipher[p.cipher](password); - + /* do the decryption */ - ct = sjcl.mode[p.mode].decrypt(prp, p.ct, p.iv, adata, p.ts); - + if (p.mode === "ccm" && sjcl.arrayBuffer && sjcl.arrayBuffer.ccm && p.ct instanceof ArrayBuffer) { + ct = sjcl.arrayBuffer.ccm.decrypt(prp, p.ct, p.iv, p.tag, adata, p.ts); + } else { + ct = sjcl.mode[p.mode].decrypt(prp, p.ct, p.iv, adata, p.ts); + } + /* return the json data */ j._add(rp, p); rp.key = password; - - return sjcl.codec.utf8String.fromBits(ct); + + if (params.raw === 1) { + return ct; + } else { + return sjcl.codec.utf8String.fromBits(ct); + } }, - + + /** Simple decryption function. + * @param {String|bitArray} password The password or key. + * @param {String} ciphertext The ciphertext to decrypt. + * @param {Object} [params] Additional non-default parameters. + * @param {Object} [rp] A returned object with filled parameters. + * @return {String} The plaintext. + * @throws {sjcl.exception.invalid} if a parameter is invalid. + * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt. + */ + decrypt: function (password, ciphertext, params, rp) { + var j = sjcl.json; + return j._decrypt(password, j.decode(ciphertext), params, rp); + }, + /** Encode a flat structure into a JSON string. * @param {Object} obj The structure to encode. * @return {String} A JSON string. @@ -130,31 +175,31 @@ if (!i.match(/^[a-z0-9]+$/i)) { throw new sjcl.exception.invalid("json encode: invalid property name"); } - out += comma + '"' + i + '"' + ':'; + out += comma + '"' + i + '":'; comma = ','; - + switch (typeof obj[i]) { - case 'number': - case 'boolean': - out += obj[i]; - break; - - case 'string': - out += '"' + escape(obj[i]) + '"'; - break; - - case 'object': - out += '"' + sjcl.codec.base64.fromBits(obj[i],1) + '"'; - break; - - default: - throw new sjcl.exception.bug("json encode: unsupported type"); + case 'number': + case 'boolean': + out += obj[i]; + break; + + case 'string': + out += '"' + escape(obj[i]) + '"'; + break; + + case 'object': + out += '"' + sjcl.codec.base64.fromBits(obj[i],0) + '"'; + break; + + default: + throw new sjcl.exception.bug("json encode: unsupported type"); } } } return out+'}'; }, - + /** Decode a simple (flat) JSON string into a structure. The ciphertext, * adata, salt and iv will be base64-decoded. * @param {String} str The string. @@ -163,23 +208,25 @@ */ decode: function (str) { str = str.replace(/\s/g,''); - if (!str.match(/^\{.*\}$/)) { + if (!str.match(/^\{.*\}$/)) { throw new sjcl.exception.invalid("json decode: this isn't json!"); } var a = str.replace(/^\{|\}$/g, '').split(/,/), out={}, i, m; for (i=0; i<a.length; i++) { - if (!(m=a[i].match(/^(?:(["']?)([a-z][a-z0-9]*)\1):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i))) { + if (!(m=a[i].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) { throw new sjcl.exception.invalid("json decode: this isn't json!"); } - if (m[3]) { + if (m[3] != null) { out[m[2]] = parseInt(m[3],10); - } else { - out[m[2]] = m[2].match(/^(ct|salt|iv)$/) ? sjcl.codec.base64.toBits(m[4]) : unescape(m[4]); + } else if (m[4] != null) { + out[m[2]] = m[2].match(/^(ct|adata|salt|iv)$/) ? sjcl.codec.base64.toBits(m[4]) : unescape(m[4]); + } else if (m[5] != null) { + out[m[2]] = m[5] === 'true'; } } return out; }, - + /** Insert all elements of src into target, modifying and returning target. * @param {Object} target The object to be modified. * @param {Object} src The object to pull data from. @@ -201,22 +248,22 @@ } return target; }, - + /** Remove all elements of minus from plus. Does not modify plus. * @private */ _subtract: function (plus, minus) { var out = {}, i; - + for (i in plus) { if (plus.hasOwnProperty(i) && plus[i] !== minus[i]) { out[i] = plus[i]; } } - + return out; }, - + /** Return only the specified elements of src. * @private */ @@ -256,24 +303,22 @@ sjcl.misc._pbkdf2Cache = {}; /** Cached PBKDF2 key derivation. * @param {String} password The password. - * @param {Object} [params] The derivation params (iteration count and optional salt). + * @param {Object} [obj] The derivation params (iteration count and optional salt). * @return {Object} The derived data in key, the salt in salt. */ sjcl.misc.cachedPbkdf2 = function (password, obj) { var cache = sjcl.misc._pbkdf2Cache, c, cp, str, salt, iter; - + obj = obj || {}; iter = obj.iter || 1000; - + /* open the cache for this password and iteration count */ cp = cache[password] = cache[password] || {}; c = cp[iter] = cp[iter] || { firstSalt: (obj.salt && obj.salt.length) ? obj.salt.slice(0) : sjcl.random.randomWords(2,0) }; - + salt = (obj.salt === undefined) ? c.firstSalt : obj.salt; - + c[salt] = c[salt] || sjcl.misc.pbkdf2(password, salt, obj.iter); return { key: c[salt].slice(0), salt:salt.slice(0) }; }; - - diff --git a/core/ecc.js b/core/ecc.js index 504288f..67a54e7 100644 --- a/core/ecc.js +++ b/core/ecc.js @@ -1,3 +1,6 @@ +/** + * base class for all ecc operations. + */ sjcl.ecc = {}; /** @@ -11,8 +14,16 @@ sjcl.ecc.point = function(curve,x,y) { if (x === undefined) { this.isIdentity = true; } else { + if (x instanceof sjcl.bn) { + x = new curve.field(x); + } + if (y instanceof sjcl.bn) { + y = new curve.field(y); + } + this.x = x; this.y = y; + this.isIdentity = false; } this.curve = curve; @@ -28,7 +39,7 @@ sjcl.ecc.point.prototype = { mult: function(k) { return this.toJac().mult(k, this).toAffine(); }, - + /** * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates. * @param {bigInt} k The coefficient to multiply this by. @@ -39,7 +50,7 @@ sjcl.ecc.point.prototype = { mult2: function(k, k2, affine2) { return this.toJac().mult2(k, this, k2, affine2).toAffine(); }, - + multiples: function() { var m, i, j; if (this._multiples === undefined) { @@ -53,6 +64,11 @@ sjcl.ecc.point.prototype = { return this._multiples; }, + negate: function() { + var newY = new this.curve.field(0).sub(this.y).normalize().reduce(); + return new sjcl.ecc.point(this.curve, this.x, newY); + }, + isValid: function() { return this.y.square().equals(this.curve.b.add(this.x.mul(this.curve.a.add(this.x.square())))); }, @@ -89,7 +105,7 @@ sjcl.ecc.pointJac.prototype = { * Adds S and T and returns the result in Jacobian coordinates. Note that S must be in Jacobian coordinates and T must be in affine coordinates. * @param {sjcl.ecc.pointJac} S One of the points to add, in Jacobian coordinates. * @param {sjcl.ecc.point} T The other point to add, in affine coordinates. - * @return {sjcl.ecc.pointJac} The sum of the two points, in Jacobian coordinates. + * @return {sjcl.ecc.pointJac} The sum of the two points, in Jacobian coordinates. */ add: function(T) { var S = this, sz2, c, d, c2, x1, x2, x, y1, y2, y, z; @@ -115,7 +131,7 @@ sjcl.ecc.pointJac.prototype = { return new sjcl.ecc.pointJac(S.curve); } } - + d = T.y.mul(sz2.mul(S.z)).subM(S.y); c2 = c.square(); @@ -131,7 +147,7 @@ sjcl.ecc.pointJac.prototype = { return new sjcl.ecc.pointJac(this.curve,x,y,z); }, - + /** * doubles this point. * @return {sjcl.ecc.pointJac} The doubled point. @@ -144,7 +160,9 @@ sjcl.ecc.pointJac.prototype = { a = y2.mul(this.x.mul(4)), b = y2.square().mul(8), z2 = this.z.square(), - c = this.x.sub(z2).mul(3).mul(this.x.add(z2)), + c = this.curve.a.toString() == (new sjcl.bn(-3)).toString() ? + this.x.sub(z2).mul(3).mul(this.x.add(z2)) : + this.x.square().mul(3).add(z2.square().mul(this.curve.a)), x = c.square().subM(a).subM(a), y = a.sub(x).mul(c).subM(b), z = this.y.add(this.y).mul(this.z); @@ -154,7 +172,7 @@ sjcl.ecc.pointJac.prototype = { /** * Returns a copy of this point converted to affine coordinates. * @return {sjcl.ecc.point} The converted point. - */ + */ toAffine: function() { if (this.isIdentity || this.z.equals(0)) { return new sjcl.ecc.point(this.curve); @@ -162,7 +180,7 @@ sjcl.ecc.pointJac.prototype = { var zi = this.z.inverse(), zi2 = zi.square(); return new sjcl.ecc.point(this.curve, this.x.mul(zi2).fullReduce(), this.y.mul(zi2.mul(zi)).fullReduce()); }, - + /** * Multiply this point by k and return the answer in Jacobian coordinates. * @param {bigInt} k The coefficient to multiply by. @@ -175,7 +193,7 @@ sjcl.ecc.pointJac.prototype = { } else if (k.limbs !== undefined) { k = k.normalize().limbs; } - + var i, j, out = new sjcl.ecc.point(this.curve).toJac(), multiples = affine.multiples(); for (i=k.length-1; i>=0; i--) { @@ -183,10 +201,10 @@ sjcl.ecc.pointJac.prototype = { out = out.doubl().doubl().doubl().doubl().add(multiples[k[i]>>j & 0xF]); } } - + return out; }, - + /** * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates. * @param {bigInt} k The coefficient to multiply this by. @@ -201,13 +219,13 @@ sjcl.ecc.pointJac.prototype = { } else if (k1.limbs !== undefined) { k1 = k1.normalize().limbs; } - + if (typeof(k2) === "number") { k2 = [k2]; } else if (k2.limbs !== undefined) { k2 = k2.normalize().limbs; } - + var i, j, out = new sjcl.ecc.point(this.curve).toJac(), m1 = affine.multiples(), m2 = affine2.multiples(), l1, l2; @@ -218,10 +236,14 @@ sjcl.ecc.pointJac.prototype = { out = out.doubl().doubl().doubl().doubl().add(m1[l1>>j & 0xF]).add(m2[l2>>j & 0xF]); } } - + return out; }, + negate: function() { + return this.toAffine().negate().toJac(); + }, + isValid: function() { var z2 = this.z.square(), z4 = z2.square(), z6 = z4.mul(z2); return this.y.square().equals( @@ -242,7 +264,7 @@ sjcl.ecc.pointJac.prototype = { */ sjcl.ecc.curve = function(Field, r, a, b, x, y) { this.field = Field; - this.r = Field.prototype.modulus.sub(r); + this.r = new sjcl.bn(r); this.a = new Field(a); this.b = new Field(b); this.G = new sjcl.ecc.point(this, new Field(x), new Field(y)); @@ -261,7 +283,7 @@ sjcl.ecc.curve.prototype.fromBits = function (bits) { sjcl.ecc.curves = { c192: new sjcl.ecc.curve( sjcl.bn.prime.p192, - "0x662107c8eb94364e4b2dd7ce", + "0xffffffffffffffffffffffff99def836146bc9b1b4d22831", -3, "0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012", @@ -269,7 +291,7 @@ sjcl.ecc.curves = { c224: new sjcl.ecc.curve( sjcl.bn.prime.p224, - "0xe95c1f470fc1ec22d6baa3a3d5c4", + "0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d", -3, "0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4", "0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", @@ -277,7 +299,7 @@ sjcl.ecc.curves = { c256: new sjcl.ecc.curve( sjcl.bn.prime.p256, - "0x4319055358e8617b0c46353d039cdaae", + "0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", -3, "0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", "0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", @@ -285,51 +307,143 @@ sjcl.ecc.curves = { c384: new sjcl.ecc.curve( sjcl.bn.prime.p384, - "0x389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68c", + "0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973", -3, "0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef", "0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", - "0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f") + "0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"), + + c521: new sjcl.ecc.curve( + sjcl.bn.prime.p521, + "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", + -3, + "0x051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", + "0xC6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", + "0x11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"), + + k192: new sjcl.ecc.curve( + sjcl.bn.prime.p192k, + "0xfffffffffffffffffffffffe26f2fc170f69466a74defd8d", + 0, + 3, + "0xdb4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d", + "0x9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d"), + + k224: new sjcl.ecc.curve( + sjcl.bn.prime.p224k, + "0x010000000000000000000000000001dce8d2ec6184caf0a971769fb1f7", + 0, + 5, + "0xa1455b334df099df30fc28a169a467e9e47075a90f7e650eb6b7a45c", + "0x7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5"), + + k256: new sjcl.ecc.curve( + sjcl.bn.prime.p256k, + "0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + 0, + 7, + "0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") + }; +/** our basicKey classes +*/ +sjcl.ecc.basicKey = { + /** ecc publicKey. + * @constructor + * @param {curve} curve the elliptic curve + * @param {point} point the point on the curve + */ + publicKey: function(curve, point) { + this._curve = curve; + this._curveBitLength = curve.r.bitLength(); + if (point instanceof Array) { + this._point = curve.fromBits(point); + } else { + this._point = point; + } -/* Diffie-Hellman-like public-key system */ -sjcl.ecc._dh = function(cn) { - sjcl.ecc[cn] = { - publicKey: function(curve, point) { - this._curve = curve; - if (point instanceof Array) { - this._point = curve.fromBits(point); - } else { - this._point = point; - } - }, + /** get this keys point data + * @return x and y as bitArrays + */ + this.get = function() { + var pointbits = this._point.toBits(); + var len = sjcl.bitArray.bitLength(pointbits); + var x = sjcl.bitArray.bitSlice(pointbits, 0, len/2); + var y = sjcl.bitArray.bitSlice(pointbits, len/2); + return { x: x, y: y }; + }; + }, - secretKey: function(curve, exponent) { - this._curve = curve; - this._exponent = exponent; - }, + /** ecc secretKey + * @constructor + * @param {curve} curve the elliptic curve + * @param exponent + */ + secretKey: function(curve, exponent) { + this._curve = curve; + this._curveBitLength = curve.r.bitLength(); + this._exponent = exponent; + + /** get this keys exponent data + * @return {bitArray} exponent + */ + this.get = function () { + return this._exponent.toBits(); + }; + } +}; - generateKeys: function(curve, paranoia) { +/** @private */ +sjcl.ecc.basicKey.generateKeys = function(cn) { + return function generateKeys(curve, paranoia, sec) { + curve = curve || 256; + + if (typeof curve === "number") { + curve = sjcl.ecc.curves['c'+curve]; if (curve === undefined) { - curve = 256; - } - if (typeof curve === "number") { - curve = sjcl.ecc.curves['c'+curve]; - if (curve === undefined) { - throw new sjcl.exception.invalid("no such curve"); - } + throw new sjcl.exception.invalid("no such curve"); } - var sec = sjcl.bn.random(curve.r, paranoia), pub = curve.G.mult(sec); - return { pub: new sjcl.ecc[cn].publicKey(curve, pub), - sec: new sjcl.ecc[cn].secretKey(curve, sec) }; } - }; + sec = sec || sjcl.bn.random(curve.r, paranoia); + + var pub = curve.G.mult(sec); + return { pub: new sjcl.ecc[cn].publicKey(curve, pub), + sec: new sjcl.ecc[cn].secretKey(curve, sec) }; + }; }; -sjcl.ecc._dh("elGamal"); +/** elGamal keys */ +sjcl.ecc.elGamal = { + /** generate keys + * @function + * @param curve + * @param {int} paranoia Paranoia for generation (default 6) + * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey + */ + generateKeys: sjcl.ecc.basicKey.generateKeys("elGamal"), + /** elGamal publicKey. + * @constructor + * @augments sjcl.ecc.basicKey.publicKey + */ + publicKey: function (curve, point) { + sjcl.ecc.basicKey.publicKey.apply(this, arguments); + }, + /** elGamal secretKey + * @constructor + * @augments sjcl.ecc.basicKey.secretKey + */ + secretKey: function (curve, exponent) { + sjcl.ecc.basicKey.secretKey.apply(this, arguments); + } +}; sjcl.ecc.elGamal.publicKey.prototype = { + /** Kem function of elGamal Public Key + * @param paranoia paranoia to use for randomization. + * @return {object} key and tag. unkem(tag) with the corresponding secret key results in the key returned. + */ kem: function(paranoia) { var sec = sjcl.bn.random(this._curve.r, paranoia), tag = this._curve.G.mult(sec).toBits(), @@ -339,42 +453,108 @@ sjcl.ecc.elGamal.publicKey.prototype = { }; sjcl.ecc.elGamal.secretKey.prototype = { + /** UnKem function of elGamal Secret Key + * @param {bitArray} tag The Tag to decrypt. + * @return {bitArray} decrypted key. + */ unkem: function(tag) { return sjcl.hash.sha256.hash(this._curve.fromBits(tag).mult(this._exponent).toBits()); }, + /** Diffie-Hellmann function + * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with + * @return {bitArray} diffie-hellmann result for this key combination. + */ dh: function(pk) { return sjcl.hash.sha256.hash(pk._point.mult(this._exponent).toBits()); - } + }, + + /** Diffie-Hellmann function, compatible with Java generateSecret + * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with + * @return {bitArray} undigested X value, diffie-hellmann result for this key combination, + * compatible with Java generateSecret(). + */ + dhJavaEc: function(pk) { + return pk._point.mult(this._exponent).x.toBits(); + } }; -sjcl.ecc._dh("ecdsa"); +/** ecdsa keys */ +sjcl.ecc.ecdsa = { + /** generate keys + * @function + * @param curve + * @param {int} paranoia Paranoia for generation (default 6) + * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey + */ + generateKeys: sjcl.ecc.basicKey.generateKeys("ecdsa") +}; -sjcl.ecc.ecdsa.secretKey.prototype = { - sign: function(hash, paranoia) { - var R = this._curve.r, - l = R.bitLength(), - k = sjcl.bn.random(R.sub(1), paranoia).add(1), - r = this._curve.G.mult(k).x.mod(R), - s = sjcl.bn.fromBits(hash).add(r.mul(this._exponent)).inverseMod(R).mul(k).mod(R); - return sjcl.bitArray.concat(r.toBits(l), s.toBits(l)); - } +/** ecdsa publicKey. +* @constructor +* @augments sjcl.ecc.basicKey.publicKey +*/ +sjcl.ecc.ecdsa.publicKey = function (curve, point) { + sjcl.ecc.basicKey.publicKey.apply(this, arguments); }; +/** specific functions for ecdsa publicKey. */ sjcl.ecc.ecdsa.publicKey.prototype = { - verify: function(hash, rs) { + /** Diffie-Hellmann function + * @param {bitArray} hash hash to verify. + * @param {bitArray} rs signature bitArray. + * @param {boolean} fakeLegacyVersion use old legacy version + */ + verify: function(hash, rs, fakeLegacyVersion) { + if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) { + hash = sjcl.bitArray.clamp(hash, this._curveBitLength); + } var w = sjcl.bitArray, R = this._curve.r, - l = R.bitLength(), + l = this._curveBitLength, r = sjcl.bn.fromBits(w.bitSlice(rs,0,l)), - s = sjcl.bn.fromBits(w.bitSlice(rs,l,2*l)), + ss = sjcl.bn.fromBits(w.bitSlice(rs,l,2*l)), + s = fakeLegacyVersion ? ss : ss.inverseMod(R), hG = sjcl.bn.fromBits(hash).mul(s).mod(R), hA = r.mul(s).mod(R), r2 = this._curve.G.mult2(hG, hA, this._point).x; - - if (r.equals(0) || s.equals(0) || r.greaterEquals(R) || s.greaterEquals(R) || !r2.equals(r)) { - throw (new sjcl.exception.corrupt("signature didn't check out")); + if (r.equals(0) || ss.equals(0) || r.greaterEquals(R) || ss.greaterEquals(R) || !r2.equals(r)) { + if (fakeLegacyVersion === undefined) { + return this.verify(hash, rs, true); + } else { + throw (new sjcl.exception.corrupt("signature didn't check out")); + } } return true; } }; + +/** ecdsa secretKey +* @constructor +* @augments sjcl.ecc.basicKey.publicKey +*/ +sjcl.ecc.ecdsa.secretKey = function (curve, exponent) { + sjcl.ecc.basicKey.secretKey.apply(this, arguments); +}; + +/** specific functions for ecdsa secretKey. */ +sjcl.ecc.ecdsa.secretKey.prototype = { + /** Diffie-Hellmann function + * @param {bitArray} hash hash to sign. + * @param {int} paranoia paranoia for random number generation + * @param {boolean} fakeLegacyVersion use old legacy version + */ + sign: function(hash, paranoia, fakeLegacyVersion, fixedKForTesting) { + if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) { + hash = sjcl.bitArray.clamp(hash, this._curveBitLength); + } + var R = this._curve.r, + l = R.bitLength(), + k = fixedKForTesting || sjcl.bn.random(R.sub(1), paranoia).add(1), + r = this._curve.G.mult(k).x.mod(R), + ss = sjcl.bn.fromBits(hash).add(r.mul(this._exponent)), + s = fakeLegacyVersion ? ss.inverseMod(R).mul(k).mod(R) + : ss.mul(k.inverseMod(R)).mod(R); + return sjcl.bitArray.concat(r.toBits(l), s.toBits(l)); + } +}; diff --git a/core/gcm.js b/core/gcm.js new file mode 100644 index 0000000..61bf59d --- /dev/null +++ b/core/gcm.js @@ -0,0 +1,183 @@ +/** @fileOverview GCM mode implementation. + * + * @author Juho Vähä-Herttua + */ + +/** @namespace Galois/Counter mode. */ +sjcl.mode.gcm = { + /** The name of the mode. + * @constant + */ + name: "gcm", + + /** Encrypt in GCM mode. + * @static + * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. + * @param {bitArray} plaintext The plaintext data. + * @param {bitArray} iv The initialization value. + * @param {bitArray} [adata=[]] The authenticated data. + * @param {Number} [tlen=128] The desired tag length, in bits. + * @return {bitArray} The encrypted data, an array of bytes. + */ + encrypt: function (prf, plaintext, iv, adata, tlen) { + var out, data = plaintext.slice(0), w=sjcl.bitArray; + tlen = tlen || 128; + adata = adata || []; + + // encrypt and tag + out = sjcl.mode.gcm._ctrMode(true, prf, data, adata, iv, tlen); + + return w.concat(out.data, out.tag); + }, + + /** Decrypt in GCM mode. + * @static + * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. + * @param {bitArray} ciphertext The ciphertext data. + * @param {bitArray} iv The initialization value. + * @param {bitArray} [adata=[]] The authenticated data. + * @param {Number} [tlen=128] The desired tag length, in bits. + * @return {bitArray} The decrypted data. + */ + decrypt: function (prf, ciphertext, iv, adata, tlen) { + var out, data = ciphertext.slice(0), tag, w=sjcl.bitArray, l=w.bitLength(data); + tlen = tlen || 128; + adata = adata || []; + + // Slice tag out of data + if (tlen <= l) { + tag = w.bitSlice(data, l-tlen); + data = w.bitSlice(data, 0, l-tlen); + } else { + tag = data; + data = []; + } + + // decrypt and tag + out = sjcl.mode.gcm._ctrMode(false, prf, data, adata, iv, tlen); + + if (!w.equal(out.tag, tag)) { + throw new sjcl.exception.corrupt("gcm: tag doesn't match"); + } + return out.data; + }, + + /* Compute the galois multiplication of X and Y + * @private + */ + _galoisMultiply: function (x, y) { + var i, j, xi, Zi, Vi, lsb_Vi, w=sjcl.bitArray, xor=w._xor4; + + Zi = [0,0,0,0]; + Vi = y.slice(0); + + // Block size is 128 bits, run 128 times to get Z_128 + for (i=0; i<128; i++) { + xi = (x[Math.floor(i/32)] & (1 << (31-i%32))) !== 0; + if (xi) { + // Z_i+1 = Z_i ^ V_i + Zi = xor(Zi, Vi); + } + + // Store the value of LSB(V_i) + lsb_Vi = (Vi[3] & 1) !== 0; + + // V_i+1 = V_i >> 1 + for (j=3; j>0; j--) { + Vi[j] = (Vi[j] >>> 1) | ((Vi[j-1]&1) << 31); + } + Vi[0] = Vi[0] >>> 1; + + // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R + if (lsb_Vi) { + Vi[0] = Vi[0] ^ (0xe1 << 24); + } + } + return Zi; + }, + + _ghash: function(H, Y0, data) { + var Yi, i, l = data.length; + + Yi = Y0.slice(0); + for (i=0; i<l; i+=4) { + Yi[0] ^= 0xffffffff&data[i]; + Yi[1] ^= 0xffffffff&data[i+1]; + Yi[2] ^= 0xffffffff&data[i+2]; + Yi[3] ^= 0xffffffff&data[i+3]; + Yi = sjcl.mode.gcm._galoisMultiply(Yi, H); + } + return Yi; + }, + + /** GCM CTR mode. + * Encrypt or decrypt data and tag with the prf in GCM-style CTR mode. + * @param {Boolean} encrypt True if encrypt, false if decrypt. + * @param {Object} prf The PRF. + * @param {bitArray} data The data to be encrypted or decrypted. + * @param {bitArray} iv The initialization vector. + * @param {bitArray} adata The associated data to be tagged. + * @param {Number} tlen The length of the tag, in bits. + */ + _ctrMode: function(encrypt, prf, data, adata, iv, tlen) { + var H, J0, S0, enc, i, ctr, tag, last, l, bl, abl, ivbl, w=sjcl.bitArray; + + // Calculate data lengths + l = data.length; + bl = w.bitLength(data); + abl = w.bitLength(adata); + ivbl = w.bitLength(iv); + + // Calculate the parameters + H = prf.encrypt([0,0,0,0]); + if (ivbl === 96) { + J0 = iv.slice(0); + J0 = w.concat(J0, [1]); + } else { + J0 = sjcl.mode.gcm._ghash(H, [0,0,0,0], iv); + J0 = sjcl.mode.gcm._ghash(H, J0, [0,0,Math.floor(ivbl/0x100000000),ivbl&0xffffffff]); + } + S0 = sjcl.mode.gcm._ghash(H, [0,0,0,0], adata); + + // Initialize ctr and tag + ctr = J0.slice(0); + tag = S0.slice(0); + + // If decrypting, calculate hash + if (!encrypt) { + tag = sjcl.mode.gcm._ghash(H, S0, data); + } + + // Encrypt all the data + for (i=0; i<l; i+=4) { + ctr[3]++; + enc = prf.encrypt(ctr); + data[i] ^= enc[0]; + data[i+1] ^= enc[1]; + data[i+2] ^= enc[2]; + data[i+3] ^= enc[3]; + } + data = w.clamp(data, bl); + + // If encrypting, calculate hash + if (encrypt) { + tag = sjcl.mode.gcm._ghash(H, S0, data); + } + + // Calculate last block from bit lengths, ugly because bitwise operations are 32-bit + last = [ + Math.floor(abl/0x100000000), abl&0xffffffff, + Math.floor(bl/0x100000000), bl&0xffffffff + ]; + + // Calculate the final tag block + tag = sjcl.mode.gcm._ghash(H, tag, last); + enc = prf.encrypt(J0); + tag[0] ^= enc[0]; + tag[1] ^= enc[1]; + tag[2] ^= enc[2]; + tag[3] ^= enc[3]; + + return { tag:w.bitSlice(tag, 0, tlen), data:data }; + } +}; diff --git a/core/hmac.js b/core/hmac.js index 87237b2..84f9a15 100644 --- a/core/hmac.js +++ b/core/hmac.js @@ -27,14 +27,35 @@ sjcl.misc.hmac = function (key, Hash) { this._baseHash[0].update(exKey[0]); this._baseHash[1].update(exKey[1]); + this._resultHash = new Hash(this._baseHash[0]); }; /** HMAC with the specified hash function. Also called encrypt since it's a prf. * @param {bitArray|String} data The data to mac. - * @param {Codec} [encoding] the encoding function to use. */ -sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (data, encoding) { - var w = new (this._hash)(this._baseHash[0]).update(data, encoding).finalize(); - return new (this._hash)(this._baseHash[1]).update(w).finalize(); +sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (data) { + if (!this._updated) { + this.update(data); + return this.digest(data); + } else { + throw new sjcl.exception.invalid("encrypt on already updated hmac called!"); + } +}; + +sjcl.misc.hmac.prototype.reset = function () { + this._resultHash = new this._hash(this._baseHash[0]); + this._updated = false; }; +sjcl.misc.hmac.prototype.update = function (data) { + this._updated = true; + this._resultHash.update(data); +}; + +sjcl.misc.hmac.prototype.digest = function () { + var w = this._resultHash.finalize(), result = new (this._hash)(this._baseHash[1]).update(w).finalize(); + + this.reset(); + + return result; +};
\ No newline at end of file diff --git a/core/ocb2progressive.js b/core/ocb2progressive.js new file mode 100644 index 0000000..0cb1790 --- /dev/null +++ b/core/ocb2progressive.js @@ -0,0 +1,137 @@ +/** + * OCB2.0 implementation slightly modified by Yifan Gu + * to support progressive encryption + * @author Yifan Gu + */ + +/** @fileOverview OCB 2.0 implementation + * + * @author Emily Stark + * @author Mike Hamburg + * @author Dan Boneh + */ + +/** @namespace + * Phil Rogaway's Offset CodeBook mode, version 2.0. + * May be covered by US and international patents. + * + * @author Emily Stark + * @author Mike Hamburg + * @author Dan Boneh + */ + +sjcl.mode.ocb2progressive = { + createEncryptor: function(prp, iv, adata, tlen, premac) { + if (sjcl.bitArray.bitLength(iv) !== 128) { + throw new sjcl.exception.invalid("ocb iv must be 128 bits"); + } + var i, + times2 = sjcl.mode.ocb2._times2, + w = sjcl.bitArray, + xor = w._xor4, + checksum = [0,0,0,0], + delta = times2(prp.encrypt(iv)), + bi, bl, + datacache = [], + pad; + + adata = adata || []; + tlen = tlen || 64; + + return { + process: function(data){ + var datalen = sjcl.bitArray.bitLength(data); + if (datalen == 0){ // empty input natrually gives empty output + return []; + } + var output = []; + datacache = datacache.concat(data); + for (i=0; i+4 < datacache.length; i+=4) { + /* Encrypt a non-final block */ + bi = datacache.slice(i,i+4); + checksum = xor(checksum, bi); + output = output.concat(xor(delta,prp.encrypt(xor(delta, bi)))); + delta = times2(delta); + } + datacache = datacache.slice(i); // at end of each process we ensure size of datacache is smaller than 4 + return output; //spits out the result. + }, + finalize: function(){ + // the final block + bi = datacache; + bl = w.bitLength(bi); + pad = prp.encrypt(xor(delta,[0,0,0,bl])); + bi = w.clamp(xor(bi.concat([0,0,0]),pad), bl); + + /* Checksum the final block, and finalize the checksum */ + checksum = xor(checksum,xor(bi.concat([0,0,0]),pad)); + checksum = prp.encrypt(xor(checksum,xor(delta,times2(delta)))); + + /* MAC the header */ + if (adata.length) { + checksum = xor(checksum, premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)); + } + + return w.concat(bi, w.clamp(checksum, tlen)); // spits out the last block + } + }; + }, + createDecryptor: function(prp, iv, adata, tlen, premac){ + if (sjcl.bitArray.bitLength(iv) !== 128) { + throw new sjcl.exception.invalid("ocb iv must be 128 bits"); + } + tlen = tlen || 64; + var i, + times2 = sjcl.mode.ocb2._times2, + w = sjcl.bitArray, + xor = w._xor4, + checksum = [0,0,0,0], + delta = times2(prp.encrypt(iv)), + bi, bl, + datacache = [], + pad; + + adata = adata || []; + + return { + process: function(data){ + if (data.length == 0){ // empty input natrually gives empty output + return []; + } + var output = []; + datacache = datacache.concat(data); + var cachelen = sjcl.bitArray.bitLength(datacache); + for (i=0; i+4 < (cachelen-tlen)/32; i+=4) { + /* Decrypt a non-final block */ + bi = xor(delta, prp.decrypt(xor(delta, datacache.slice(i,i+4)))); + checksum = xor(checksum, bi); + output = output.concat(bi); + delta = times2(delta); + } + datacache = datacache.slice(i); + return output; + }, + finalize: function(){ + /* Chop out and decrypt the final block */ + bl = sjcl.bitArray.bitLength(datacache) - tlen; + pad = prp.encrypt(xor(delta,[0,0,0,bl])); + bi = xor(pad, w.clamp(datacache,bl).concat([0,0,0])); + + /* Checksum the final block, and finalize the checksum */ + checksum = xor(checksum, bi); + checksum = prp.encrypt(xor(checksum, xor(delta, times2(delta)))); + + /* MAC the header */ + if (adata.length) { + checksum = xor(checksum, premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)); + } + + if (!w.equal(w.clamp(checksum, tlen), w.bitSlice(datacache, bl))) { + throw new sjcl.exception.corrupt("ocb: tag doesn't match"); + } + + return w.clamp(bi,bl); + } + }; + } +} diff --git a/core/pbkdf2.js b/core/pbkdf2.js index 869e4df..3e9aa3f 100644 --- a/core/pbkdf2.js +++ b/core/pbkdf2.js @@ -12,7 +12,7 @@ * This is the method specified by RSA's PKCS #5 standard. * * @param {bitArray|String} password The password. - * @param {bitArray} salt The salt. Should have lots of entropy. + * @param {bitArray|String} salt The salt. Should have lots of entropy. * @param {Number} [count=1000] The number of iterations. Higher numbers make the function slower but more secure. * @param {Number} [length] The length of the derived key. Defaults to the output size of the hash function. @@ -30,6 +30,10 @@ sjcl.misc.pbkdf2 = function (password, salt, count, length, Prff) { password = sjcl.codec.utf8String.toBits(password); } + if (typeof salt === "string") { + salt = sjcl.codec.utf8String.toBits(salt); + } + Prff = Prff || sjcl.misc.hmac; var prf = new Prff(password), diff --git a/core/random.js b/core/random.js index 6def0d3..fed0ebf 100644 --- a/core/random.js +++ b/core/random.js @@ -3,11 +3,13 @@ * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh + * @author Michael Brooks */ -/** @namespace Random number generator - * +/** @constructor + * @class Random number generator * @description + * <b>Use sjcl.random as a singleton for this class!</b> * <p> * This random number generator is a derivative of Ferguson and Schneier's * generator Fortuna. It collects entropy from various events into several @@ -39,8 +41,45 @@ * look for improvements in future versions. * </p> */ -sjcl.random = { - /** Generate several random words, and return them in an array +sjcl.prng = function(defaultParanoia) { + + /* private */ + this._pools = [new sjcl.hash.sha256()]; + this._poolEntropy = [0]; + this._reseedCount = 0; + this._robins = {}; + this._eventId = 0; + + this._collectorIds = {}; + this._collectorIdNext = 0; + + this._strength = 0; + this._poolStrength = 0; + this._nextReseed = 0; + this._key = [0,0,0,0,0,0,0,0]; + this._counter = [0,0,0,0]; + this._cipher = undefined; + this._defaultParanoia = defaultParanoia; + + /* event listener stuff */ + this._collectorsStarted = false; + this._callbacks = {progress: {}, seeded: {}}; + this._callbackI = 0; + + /* constants */ + this._NOT_READY = 0; + this._READY = 1; + this._REQUIRES_RESEED = 2; + + this._MAX_WORDS_PER_BURST = 65536; + this._PARANOIA_LEVELS = [0,48,64,96,128,192,256,384,512,768,1024]; + this._MILLISECONDS_PER_RESEED = 30000; + this._BITS_PER_RESEED = 80; +}; + +sjcl.prng.prototype = { + /** Generate several random words, and return them in an array. + * A word consists of 32 bits (4 bytes) * @param {Number} nwords The number of words to generate. */ randomWords: function (nwords, paranoia) { @@ -65,7 +104,11 @@ sjcl.random = { return out.slice(0,nwords); }, - setDefaultParanoia: function (paranoia) { + setDefaultParanoia: function (paranoia, allowZeroParanoia) { + if (paranoia === 0 && allowZeroParanoia !== "Setting paranoia=0 will ruin your security; use it only for testing") { + throw "Setting paranoia=0 will ruin your security; use it only for testing"; + } + this._defaultParanoia = paranoia; }, @@ -82,7 +125,7 @@ sjcl.random = { i, tmp, t = (new Date()).valueOf(), robin = this._robins[source], - oldReady = this.isReady(), err = 0; + oldReady = this.isReady(), err = 0, objName; id = this._collectorIds[source]; if (id === undefined) { id = this._collectorIds[source] = this._collectorIdNext ++; } @@ -100,7 +143,7 @@ sjcl.random = { break; case "object": - var objName = Object.prototype.toString.call(data); + objName = Object.prototype.toString.call(data); if (objName === "[object Uint32Array]") { tmp = []; for (i = 0; i < data.length; i++) { @@ -112,7 +155,7 @@ sjcl.random = { err = 1; } for (i=0; i<data.length && !err; i++) { - if (typeof(data[i]) != "number") { + if (typeof(data[i]) !== "number") { err = 1; } } @@ -197,14 +240,25 @@ sjcl.random = { startCollectors: function () { if (this._collectorsStarted) { return; } + this._eventListener = { + loadTimeCollector: this._bind(this._loadTimeCollector), + mouseCollector: this._bind(this._mouseCollector), + keyboardCollector: this._bind(this._keyboardCollector), + accelerometerCollector: this._bind(this._accelerometerCollector), + touchCollector: this._bind(this._touchCollector) + }; + if (window.addEventListener) { - window.addEventListener("load", this._loadTimeCollector, false); - window.addEventListener("mousemove", this._mouseCollector, false); + window.addEventListener("load", this._eventListener.loadTimeCollector, false); + window.addEventListener("mousemove", this._eventListener.mouseCollector, false); + window.addEventListener("keypress", this._eventListener.keyboardCollector, false); + window.addEventListener("devicemotion", this._eventListener.accelerometerCollector, false); + window.addEventListener("touchmove", this._eventListener.touchCollector, false); } else if (document.attachEvent) { - document.attachEvent("onload", this._loadTimeCollector); - document.attachEvent("onmousemove", this._mouseCollector); - } - else { + document.attachEvent("onload", this._eventListener.loadTimeCollector); + document.attachEvent("onmousemove", this._eventListener.mouseCollector); + document.attachEvent("keypress", this._eventListener.keyboardCollector); + } else { throw new sjcl.exception.bug("can't attach event"); } @@ -216,12 +270,17 @@ sjcl.random = { if (!this._collectorsStarted) { return; } if (window.removeEventListener) { - window.removeEventListener("load", this._loadTimeCollector, false); - window.removeEventListener("mousemove", this._mouseCollector, false); - } else if (window.detachEvent) { - window.detachEvent("onload", this._loadTimeCollector); - window.detachEvent("onmousemove", this._mouseCollector); + window.removeEventListener("load", this._eventListener.loadTimeCollector, false); + window.removeEventListener("mousemove", this._eventListener.mouseCollector, false); + window.removeEventListener("keypress", this._eventListener.keyboardCollector, false); + window.removeEventListener("devicemotion", this._eventListener.accelerometerCollector, false); + window.removeEventListener("touchmove", this._eventListener.touchCollector, false); + } else if (document.detachEvent) { + document.detachEvent("onload", this._eventListener.loadTimeCollector); + document.detachEvent("onmousemove", this._eventListener.mouseCollector); + document.detachEvent("keypress", this._eventListener.keyboardCollector); } + this._collectorsStarted = false; }, @@ -238,56 +297,30 @@ sjcl.random = { /** remove an event listener for progress or seeded-ness */ removeEventListener: function (name, cb) { var i, j, cbs=this._callbacks[name], jsTemp=[]; - + /* I'm not sure if this is necessary; in C++, iterating over a * collection and modifying it at the same time is a no-no. */ - + for (j in cbs) { - if (cbs.hasOwnProperty(j) && cbs[j] === cb) { + if (cbs.hasOwnProperty(j) && cbs[j] === cb) { jsTemp.push(j); } } - + for (i=0; i<jsTemp.length; i++) { j = jsTemp[i]; delete cbs[j]; } }, - /* private */ - _pools : [new sjcl.hash.sha256()], - _poolEntropy : [0], - _reseedCount : 0, - _robins : {}, - _eventId : 0, - - _collectorIds : {}, - _collectorIdNext : 0, - - _strength : 0, - _poolStrength : 0, - _nextReseed : 0, - _key : [0,0,0,0,0,0,0,0], - _counter : [0,0,0,0], - _cipher : undefined, - _defaultParanoia : 6, - - /* event listener stuff */ - _collectorsStarted : false, - _callbacks : {progress: {}, seeded: {}}, - _callbackI : 0, - - /* constants */ - _NOT_READY : 0, - _READY : 1, - _REQUIRES_RESEED : 2, + _bind: function (func) { + var that = this; + return function () { + func.apply(that, arguments); + }; + }, - _MAX_WORDS_PER_BURST : 65536, - _PARANOIA_LEVELS : [0,48,64,96,128,192,256,384,512,768,1024], - _MILLISECONDS_PER_RESEED : 30000, - _BITS_PER_RESEED : 80, - /** Generate 4 random words, no reseed, no gate. * @private */ @@ -359,42 +392,131 @@ sjcl.random = { this._reseed(reseedData); }, - _mouseCollector: function (ev) { - var x = ev.x || ev.clientX || ev.offsetX, y = ev.y || ev.clientY || ev.offsetY; - sjcl.random.addEntropy([x,y], 2, "mouse"); + _keyboardCollector: function () { + this._addCurrentTimeToEntropy(1); }, - _loadTimeCollector: function (ev) { - sjcl.random.addEntropy((new Date()).valueOf(), 2, "loadtime"); + _mouseCollector: function (ev) { + var x, y; + + try { + x = ev.x || ev.clientX || ev.offsetX || 0; + y = ev.y || ev.clientY || ev.offsetY || 0; + } catch (err) { + // Event originated from a secure element. No mouse position available. + x = 0; + y = 0; + } + + if (x != 0 && y!= 0) { + sjcl.random.addEntropy([x,y], 2, "mouse"); + } + + this._addCurrentTimeToEntropy(0); + }, + + _touchCollector: function(ev) { + var touch = ev.touches[0] || ev.changedTouches[0]; + var x = touch.pageX || touch.clientX, + y = touch.pageY || touch.clientY; + + sjcl.random.addEntropy([x,y],1,"touch"); + + this._addCurrentTimeToEntropy(0); }, + _loadTimeCollector: function () { + this._addCurrentTimeToEntropy(2); + }, + + _addCurrentTimeToEntropy: function (estimatedEntropy) { + if (typeof window !== 'undefined' && window.performance && typeof window.performance.now === "function") { + //how much entropy do we want to add here? + sjcl.random.addEntropy(window.performance.now(), estimatedEntropy, "loadtime"); + } else { + sjcl.random.addEntropy((new Date()).valueOf(), estimatedEntropy, "loadtime"); + } + }, + _accelerometerCollector: function (ev) { + var ac = ev.accelerationIncludingGravity.x||ev.accelerationIncludingGravity.y||ev.accelerationIncludingGravity.z; + if(window.orientation){ + var or = window.orientation; + if (typeof or === "number") { + sjcl.random.addEntropy(or, 1, "accelerometer"); + } + } + if (ac) { + sjcl.random.addEntropy(ac, 2, "accelerometer"); + } + this._addCurrentTimeToEntropy(0); + }, + _fireEvent: function (name, arg) { var j, cbs=sjcl.random._callbacks[name], cbsTemp=[]; - /* TODO: there is a race condition between removing collectors and firing them */ + /* TODO: there is a race condition between removing collectors and firing them */ /* I'm not sure if this is necessary; in C++, iterating over a * collection and modifying it at the same time is a no-no. */ - + for (j in cbs) { - if (cbs.hasOwnProperty(j)) { + if (cbs.hasOwnProperty(j)) { cbsTemp.push(cbs[j]); - } + } } - + for (j=0; j<cbsTemp.length; j++) { - cbsTemp[j](arg); + cbsTemp[j](arg); } } }; +/** an instance for the prng. +* @see sjcl.prng +*/ +sjcl.random = new sjcl.prng(6); + (function(){ + // function for getting nodejs crypto module. catches and ignores errors. + function getCryptoModule() { + try { + return require('crypto'); + } + catch (e) { + return null; + } + } + try { - // get cryptographically strong entropy in Webkit - var ab = new Uint32Array(32); - crypto.getRandomValues(ab); - sjcl.random.addEntropy(ab, 1024, "crypto.getRandomValues"); + var buf, crypt, ab; + + // get cryptographically strong entropy depending on runtime environment + if (typeof module !== 'undefined' && module.exports && (crypt = getCryptoModule()) && crypt.randomBytes) { + buf = crypt.randomBytes(1024/8); + buf = new Uint32Array(new Uint8Array(buf).buffer); + sjcl.random.addEntropy(buf, 1024, "crypto.randomBytes"); + + } else if (typeof window !== 'undefined' && typeof Uint32Array !== 'undefined') { + ab = new Uint32Array(32); + if (window.crypto && window.crypto.getRandomValues) { + window.crypto.getRandomValues(ab); + } else if (window.msCrypto && window.msCrypto.getRandomValues) { + window.msCrypto.getRandomValues(ab); + } else { + return; + } + + // get cryptographically strong entropy in Webkit + sjcl.random.addEntropy(ab, 1024, "crypto.getRandomValues"); + + } else { + // no getRandomValues :-( + } } catch (e) { - // no getRandomValues :-( + if (typeof window !== 'undefined' && window.console) { + console.log("There was an error collecting entropy from the browser:"); + console.log(e); + //we do not want the library to fail due to randomness not being maintained. + } } -})(); +}()); diff --git a/core/ripemd160.js b/core/ripemd160.js new file mode 100644 index 0000000..4ee7b92 --- /dev/null +++ b/core/ripemd160.js @@ -0,0 +1,207 @@ +/** @fileOverview Javascript RIPEMD-160 implementation. + * + * @author Artem S Vybornov <vybornov@gmail.com> + */ +(function() { + +/** + * Context for a RIPEMD-160 operation in progress. + * @constructor + * @class RIPEMD, 160 bits. + */ +sjcl.hash.ripemd160 = function (hash) { + if (hash) { + this._h = hash._h.slice(0); + this._buffer = hash._buffer.slice(0); + this._length = hash._length; + } else { + this.reset(); + } +}; + +/** + * Hash a string or an array of words. + * @static + * @param {bitArray|String} data the data to hash. + * @return {bitArray} The hash value, an array of 5 big-endian words. + */ +sjcl.hash.ripemd160.hash = function (data) { + return (new sjcl.hash.ripemd160()).update(data).finalize(); +}; + +sjcl.hash.ripemd160.prototype = { + /** + * Reset the hash state. + * @return this + */ + reset: function () { + this._h = _h0.slice(0); + this._buffer = []; + this._length = 0; + return this; + }, + + /** + * Reset the hash state. + * @param {bitArray|String} data the data to hash. + * @return this + */ + update: function (data) { + if ( typeof data === "string" ) + data = sjcl.codec.utf8String.toBits(data); + + var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), + ol = this._length, + nl = this._length = ol + sjcl.bitArray.bitLength(data); + for (i = 512+ol & -512; i <= nl; i+= 512) { + var words = b.splice(0,16); + for ( var w = 0; w < 16; ++w ) + words[w] = _cvt(words[w]); + + _block.call( this, words ); + } + + return this; + }, + + /** + * Complete hashing and output the hash value. + * @return {bitArray} The hash value, an array of 5 big-endian words. + */ + finalize: function () { + var b = sjcl.bitArray.concat( this._buffer, [ sjcl.bitArray.partial(1,1) ] ), + l = ( this._length + 1 ) % 512, + z = ( l > 448 ? 512 : 448 ) - l % 448, + zp = z % 32; + + if ( zp > 0 ) + b = sjcl.bitArray.concat( b, [ sjcl.bitArray.partial(zp,0) ] ) + for ( ; z >= 32; z -= 32 ) + b.push(0); + + b.push( _cvt( this._length | 0 ) ); + b.push( _cvt( Math.floor(this._length / 0x100000000) ) ); + + while ( b.length ) { + var words = b.splice(0,16); + for ( var w = 0; w < 16; ++w ) + words[w] = _cvt(words[w]); + + _block.call( this, words ); + } + + var h = this._h; + this.reset(); + + for ( var w = 0; w < 5; ++w ) + h[w] = _cvt(h[w]); + + return h; + } +}; + +var _h0 = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; + +var _k1 = [ 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e ]; +var _k2 = [ 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000 ]; +for ( var i = 4; i >= 0; --i ) { + for ( var j = 1; j < 16; ++j ) { + _k1.splice(i,0,_k1[i]); + _k2.splice(i,0,_k2[i]); + } +} + +var _r1 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ]; +var _r2 = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ]; + +var _s1 = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]; +var _s2 = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]; + +function _f0(x,y,z) { + return x ^ y ^ z; +}; + +function _f1(x,y,z) { + return (x & y) | (~x & z); +}; + +function _f2(x,y,z) { + return (x | ~y) ^ z; +}; + +function _f3(x,y,z) { + return (x & z) | (y & ~z); +}; + +function _f4(x,y,z) { + return x ^ (y | ~z); +}; + +function _rol(n,l) { + return (n << l) | (n >>> (32-l)); +} + +function _cvt(n) { + return ( (n & 0xff << 0) << 24 ) + | ( (n & 0xff << 8) << 8 ) + | ( (n & 0xff << 16) >>> 8 ) + | ( (n & 0xff << 24) >>> 24 ); +} + +function _block(X) { + var A1 = this._h[0], B1 = this._h[1], C1 = this._h[2], D1 = this._h[3], E1 = this._h[4], + A2 = this._h[0], B2 = this._h[1], C2 = this._h[2], D2 = this._h[3], E2 = this._h[4]; + + var j = 0, T; + + for ( ; j < 16; ++j ) { + T = _rol( A1 + _f0(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; + A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; + T = _rol( A2 + _f4(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; + A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } + for ( ; j < 32; ++j ) { + T = _rol( A1 + _f1(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; + A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; + T = _rol( A2 + _f3(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; + A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } + for ( ; j < 48; ++j ) { + T = _rol( A1 + _f2(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; + A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; + T = _rol( A2 + _f2(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; + A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } + for ( ; j < 64; ++j ) { + T = _rol( A1 + _f3(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; + A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; + T = _rol( A2 + _f1(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; + A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } + for ( ; j < 80; ++j ) { + T = _rol( A1 + _f4(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; + A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; + T = _rol( A2 + _f0(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; + A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } + + T = this._h[1] + C1 + D2; + this._h[1] = this._h[2] + D1 + E2; + this._h[2] = this._h[3] + E1 + A2; + this._h[3] = this._h[4] + A1 + B2; + this._h[4] = this._h[0] + B1 + C2; + this._h[0] = T; +} + +})(); diff --git a/core/scrypt.js b/core/scrypt.js new file mode 100644 index 0000000..78dbc9d --- /dev/null +++ b/core/scrypt.js @@ -0,0 +1,146 @@ +/** scrypt Password-Based Key-Derivation Function. + * + * @param {bitArray|String} password The password. + * @param {bitArray|String} salt The salt. Should have lots of entropy. + * + * @param {Number} [N=16384] CPU/Memory cost parameter. + * @param {Number} [r=8] Block size parameter. + * @param {Number} [p=1] Parallelization parameter. + * + * @param {Number} [length] The length of the derived key. Defaults to the + * output size of the hash function. + * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family. + * + * @return {bitArray} The derived key. + */ +sjcl.misc.scrypt = function (password, salt, N, r, p, length, Prff) { + var SIZE_MAX = Math.pow(2, 32) - 1, + self = sjcl.misc.scrypt; + + N = N || 16384; + r = r || 8; + p = p || 1; + + if (r * p >= Math.pow(2, 30)) { + throw sjcl.exception.invalid("The parameters r, p must satisfy r * p < 2^30"); + } + + if ((N < 2) || (N & (N - 1) != 0)) { + throw sjcl.exception.invalid("The parameter N must be a power of 2."); + } + + if (N > SIZE_MAX / 128 / r) { + throw sjcl.exception.invalid("N too big."); + } + + if (r > SIZE_MAX / 128 / p) { + throw sjcl.exception.invalid("r too big."); + } + + var blocks = sjcl.misc.pbkdf2(password, salt, 1, p * 128 * r * 8, Prff), + len = blocks.length / p; + + self.reverse(blocks); + + for (var i = 0; i < p; i++) { + var block = blocks.slice(i * len, (i + 1) * len); + self.blockcopy(self.ROMix(block, N), 0, blocks, i * len); + } + + self.reverse(blocks); + + return sjcl.misc.pbkdf2(password, blocks, 1, length, Prff); +} + +sjcl.misc.scrypt.salsa20Core = function (word, rounds) { + var R = function(a, b) { return (a << b) | (a >>> (32 - b)); } + var x = word.slice(0); + + for (var i = rounds; i > 0; i -= 2) { + x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9); + x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18); + x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9); + x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18); + x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9); + x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18); + x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9); + x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18); + x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9); + x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18); + x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9); + x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18); + x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9); + x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18); + x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9); + x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18); + } + + for (i = 0; i < 16; i++) word[i] = x[i]+word[i]; +} + +sjcl.misc.scrypt.blockMix = function(blocks) { + var X = blocks.slice(-16), + out = [], + len = blocks.length / 16, + self = sjcl.misc.scrypt; + + for (var i = 0; i < len; i++) { + self.blockxor(blocks, 16 * i, X, 0, 16); + self.salsa20Core(X, 8); + + if ((i & 1) == 0) { + self.blockcopy(X, 0, out, 8 * i); + } else { + self.blockcopy(X, 0, out, 8 * (i^1 + len)); + } + } + + return out; +} + +sjcl.misc.scrypt.ROMix = function(block, N) { + var X = block.slice(0), + V = [], + self = sjcl.misc.scrypt; + + for (var i = 0; i < N; i++) { + V.push(X.slice(0)); + X = self.blockMix(X); + } + + for (i = 0; i < N; i++) { + var j = X[X.length - 16] & (N - 1); + + self.blockxor(V[j], 0, X, 0); + X = self.blockMix(X); + } + + return X; +} + +sjcl.misc.scrypt.reverse = function (words) { // Converts Big <-> Little Endian words + for (var i in words) { + var out = words[i] & 0xFF; + out = (out << 8) | (words[i] >>> 8) & 0xFF; + out = (out << 8) | (words[i] >>> 16) & 0xFF; + out = (out << 8) | (words[i] >>> 24) & 0xFF; + + words[i] = out; + } +} + +sjcl.misc.scrypt.blockcopy = function (S, Si, D, Di, len) { + var i; + + len = len || (S.length - Si); + + for (i = 0; i < len; i++) D[Di + i] = S[Si + i] | 0; +} + +sjcl.misc.scrypt.blockxor = function(S, Si, D, Di, len) { + var i; + + len = len || (S.length - Si); + + for (i = 0; i < len; i++) D[Di + i] = (D[Di + i] ^ S[Si + i]) | 0; +} diff --git a/core/sha1.js b/core/sha1.js index 73d05b1..708e10b 100644 --- a/core/sha1.js +++ b/core/sha1.js @@ -138,8 +138,7 @@ sjcl.hash.sha1.prototype = { _block:function (words) { var t, tmp, a, b, c, d, e, w = words.slice(0), - h = this._h, - k = this._key; + h = this._h; a = h[0]; b = h[1]; c = h[2]; d = h[3]; e = h[4]; diff --git a/core/sha256.js b/core/sha256.js index fd51609..6ff5294 100644 --- a/core/sha256.js +++ b/core/sha256.js @@ -77,7 +77,7 @@ sjcl.hash.sha256.prototype = { /** * Complete hashing and output the hash value. - * @return {bitArray} The hash value, an array of 16 big-endian words. + * @return {bitArray} The hash value, an array of 8 big-endian words. */ finalize:function () { var i, b = this._buffer, h = this._h; diff --git a/core/sha512.js b/core/sha512.js new file mode 100644 index 0000000..6e628c7 --- /dev/null +++ b/core/sha512.js @@ -0,0 +1,348 @@ +/** @fileOverview Javascript SHA-512 implementation. + * + * This implementation was written for CryptoJS by Jeff Mott and adapted for + * SJCL by Stefan Thomas. + * + * CryptoJS (c) 2009–2012 by Jeff Mott. All rights reserved. + * Released with New BSD License + * + * @author Emily Stark + * @author Mike Hamburg + * @author Dan Boneh + * @author Jeff Mott + * @author Stefan Thomas + */ + +/** + * Context for a SHA-512 operation in progress. + * @constructor + * @class Secure Hash Algorithm, 512 bits. + */ +sjcl.hash.sha512 = function (hash) { + if (!this._key[0]) { this._precompute(); } + if (hash) { + this._h = hash._h.slice(0); + this._buffer = hash._buffer.slice(0); + this._length = hash._length; + } else { + this.reset(); + } +}; + +/** + * Hash a string or an array of words. + * @static + * @param {bitArray|String} data the data to hash. + * @return {bitArray} The hash value, an array of 16 big-endian words. + */ +sjcl.hash.sha512.hash = function (data) { + return (new sjcl.hash.sha512()).update(data).finalize(); +}; + +sjcl.hash.sha512.prototype = { + /** + * The hash's block size, in bits. + * @constant + */ + blockSize: 1024, + + /** + * Reset the hash state. + * @return this + */ + reset:function () { + this._h = this._init.slice(0); + this._buffer = []; + this._length = 0; + return this; + }, + + /** + * Input several words to the hash. + * @param {bitArray|String} data the data to hash. + * @return this + */ + update: function (data) { + if (typeof data === "string") { + data = sjcl.codec.utf8String.toBits(data); + } + var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), + ol = this._length, + nl = this._length = ol + sjcl.bitArray.bitLength(data); + for (i = 1024+ol & -1024; i <= nl; i+= 1024) { + this._block(b.splice(0,32)); + } + return this; + }, + + /** + * Complete hashing and output the hash value. + * @return {bitArray} The hash value, an array of 16 big-endian words. + */ + finalize:function () { + var i, b = this._buffer, h = this._h; + + // Round out and push the buffer + b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); + + // Round out the buffer to a multiple of 32 words, less the 4 length words. + for (i = b.length + 4; i & 31; i++) { + b.push(0); + } + + // append the length + b.push(0); + b.push(0); + b.push(Math.floor(this._length / 0x100000000)); + b.push(this._length | 0); + + while (b.length) { + this._block(b.splice(0,32)); + } + + this.reset(); + return h; + }, + + /** + * The SHA-512 initialization vector, to be precomputed. + * @private + */ + _init:[], + + /** + * Least significant 24 bits of SHA512 initialization values. + * + * Javascript only has 53 bits of precision, so we compute the 40 most + * significant bits and add the remaining 24 bits as constants. + * + * @private + */ + _initr: [ 0xbcc908, 0xcaa73b, 0x94f82b, 0x1d36f1, 0xe682d1, 0x3e6c1f, 0x41bd6b, 0x7e2179 ], + + /* + _init: + [0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1, + 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179], + */ + + /** + * The SHA-512 hash key, to be precomputed. + * @private + */ + _key:[], + + /** + * Least significant 24 bits of SHA512 key values. + * @private + */ + _keyr: + [0x28ae22, 0xef65cd, 0x4d3b2f, 0x89dbbc, 0x48b538, 0x05d019, 0x194f9b, 0x6d8118, + 0x030242, 0x706fbe, 0xe4b28c, 0xffb4e2, 0x7b896f, 0x1696b1, 0xc71235, 0x692694, + 0xf14ad2, 0x4f25e3, 0x8cd5b5, 0xac9c65, 0x2b0275, 0xa6e483, 0x41fbd4, 0x1153b5, + 0x66dfab, 0xb43210, 0xfb213f, 0xef0ee4, 0xa88fc2, 0x0aa725, 0x03826f, 0x0e6e70, + 0xd22ffc, 0x26c926, 0xc42aed, 0x95b3df, 0xaf63de, 0x77b2a8, 0xedaee6, 0x82353b, + 0xf10364, 0x423001, 0xf89791, 0x54be30, 0xef5218, 0x65a910, 0x71202a, 0xbbd1b8, + 0xd2d0c8, 0x41ab53, 0x8eeb99, 0x9b48a8, 0xc95a63, 0x418acb, 0x63e373, 0xb2b8a3, + 0xefb2fc, 0x172f60, 0xf0ab72, 0x6439ec, 0x631e28, 0x82bde9, 0xc67915, 0x72532b, + 0x26619c, 0xc0c207, 0xe0eb1e, 0x6ed178, 0x176fba, 0xc898a6, 0xf90dae, 0x1c471b, + 0x047d84, 0xc72493, 0xc9bebc, 0x100d4c, 0x3e42b6, 0x657e2a, 0xd6faec, 0x475817], + + /* + _key: + [0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817], + */ + + /** + * Function to precompute _init and _key. + * @private + */ + _precompute: function () { + // XXX: This code is for precomputing the SHA256 constants, change for + // SHA512 and re-enable. + var i = 0, prime = 2, factor; + + function frac(x) { return (x-Math.floor(x)) * 0x100000000 | 0; } + function frac2(x) { return (x-Math.floor(x)) * 0x10000000000 & 0xff; } + + outer: for (; i<80; prime++) { + for (factor=2; factor*factor <= prime; factor++) { + if (prime % factor === 0) { + // not a prime + continue outer; + } + } + + if (i<8) { + this._init[i*2] = frac(Math.pow(prime, 1/2)); + this._init[i*2+1] = (frac2(Math.pow(prime, 1/2)) << 24) | this._initr[i]; + } + this._key[i*2] = frac(Math.pow(prime, 1/3)); + this._key[i*2+1] = (frac2(Math.pow(prime, 1/3)) << 24) | this._keyr[i]; + i++; + } + }, + + /** + * Perform one cycle of SHA-512. + * @param {bitArray} words one block of words. + * @private + */ + _block:function (words) { + var i, wrh, wrl, + w = words.slice(0), + h = this._h, + k = this._key, + h0h = h[ 0], h0l = h[ 1], h1h = h[ 2], h1l = h[ 3], + h2h = h[ 4], h2l = h[ 5], h3h = h[ 6], h3l = h[ 7], + h4h = h[ 8], h4l = h[ 9], h5h = h[10], h5l = h[11], + h6h = h[12], h6l = h[13], h7h = h[14], h7l = h[15]; + + // Working variables + var ah = h0h, al = h0l, bh = h1h, bl = h1l, + ch = h2h, cl = h2l, dh = h3h, dl = h3l, + eh = h4h, el = h4l, fh = h5h, fl = h5l, + gh = h6h, gl = h6l, hh = h7h, hl = h7l; + + for (i=0; i<80; i++) { + // load up the input word for this round + if (i<16) { + wrh = w[i * 2]; + wrl = w[i * 2 + 1]; + } else { + // Gamma0 + var gamma0xh = w[(i-15) * 2]; + var gamma0xl = w[(i-15) * 2 + 1]; + var gamma0h = + ((gamma0xl << 31) | (gamma0xh >>> 1)) ^ + ((gamma0xl << 24) | (gamma0xh >>> 8)) ^ + (gamma0xh >>> 7); + var gamma0l = + ((gamma0xh << 31) | (gamma0xl >>> 1)) ^ + ((gamma0xh << 24) | (gamma0xl >>> 8)) ^ + ((gamma0xh << 25) | (gamma0xl >>> 7)); + + // Gamma1 + var gamma1xh = w[(i-2) * 2]; + var gamma1xl = w[(i-2) * 2 + 1]; + var gamma1h = + ((gamma1xl << 13) | (gamma1xh >>> 19)) ^ + ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ + (gamma1xh >>> 6); + var gamma1l = + ((gamma1xh << 13) | (gamma1xl >>> 19)) ^ + ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ + ((gamma1xh << 26) | (gamma1xl >>> 6)); + + // Shortcuts + var wr7h = w[(i-7) * 2]; + var wr7l = w[(i-7) * 2 + 1]; + + var wr16h = w[(i-16) * 2]; + var wr16l = w[(i-16) * 2 + 1]; + + // W(round) = gamma0 + W(round - 7) + gamma1 + W(round - 16) + wrl = gamma0l + wr7l; + wrh = gamma0h + wr7h + ((wrl >>> 0) < (gamma0l >>> 0) ? 1 : 0); + wrl += gamma1l; + wrh += gamma1h + ((wrl >>> 0) < (gamma1l >>> 0) ? 1 : 0); + wrl += wr16l; + wrh += wr16h + ((wrl >>> 0) < (wr16l >>> 0) ? 1 : 0); + } + + w[i*2] = wrh |= 0; + w[i*2 + 1] = wrl |= 0; + + // Ch + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + + // Maj + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + // Sigma0 + var sigma0h = ((al << 4) | (ah >>> 28)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((ah << 4) | (al >>> 28)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + + // Sigma1 + var sigma1h = ((el << 18) | (eh >>> 14)) ^ ((el << 14) | (eh >>> 18)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((eh << 18) | (el >>> 14)) ^ ((eh << 14) | (el >>> 18)) ^ ((el << 23) | (eh >>> 9)); + + // K(round) + var krh = k[i*2]; + var krl = k[i*2+1]; + + // t1 = h + sigma1 + ch + K(round) + W(round) + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + t1l += chl; + t1h += chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + t1l += krl; + t1h += krh + ((t1l >>> 0) < (krl >>> 0) ? 1 : 0); + t1l = t1l + wrl|0; // FF32..FF34 perf issue https://bugzilla.mozilla.org/show_bug.cgi?id=1054972 + t1h += wrh + ((t1l >>> 0) < (wrl >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash + h0l = h[1] = (h0l + al) | 0; + h[0] = (h0h + ah + ((h0l >>> 0) < (al >>> 0) ? 1 : 0)) | 0; + h1l = h[3] = (h1l + bl) | 0; + h[2] = (h1h + bh + ((h1l >>> 0) < (bl >>> 0) ? 1 : 0)) | 0; + h2l = h[5] = (h2l + cl) | 0; + h[4] = (h2h + ch + ((h2l >>> 0) < (cl >>> 0) ? 1 : 0)) | 0; + h3l = h[7] = (h3l + dl) | 0; + h[6] = (h3h + dh + ((h3l >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + h4l = h[9] = (h4l + el) | 0; + h[8] = (h4h + eh + ((h4l >>> 0) < (el >>> 0) ? 1 : 0)) | 0; + h5l = h[11] = (h5l + fl) | 0; + h[10] = (h5h + fh + ((h5l >>> 0) < (fl >>> 0) ? 1 : 0)) | 0; + h6l = h[13] = (h6l + gl) | 0; + h[12] = (h6h + gh + ((h6l >>> 0) < (gl >>> 0) ? 1 : 0)) | 0; + h7l = h[15] = (h7l + hl) | 0; + h[14] = (h7h + hh + ((h7l >>> 0) < (hl >>> 0) ? 1 : 0)) | 0; + } +}; + + diff --git a/core/sjcl.js b/core/sjcl.js index 50e5307..8c9425d 100644 --- a/core/sjcl.js +++ b/core/sjcl.js @@ -10,7 +10,7 @@ "use strict"; /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */ -/*global document, window, escape, unescape */ +/*global document, window, escape, unescape, module, require, Uint32Array */ /** @namespace The Stanford Javascript Crypto Library, top-level namespace. */ var sjcl = { @@ -42,25 +42,25 @@ var sjcl = { /** @namespace Exceptions. */ exception: { - /** @class Ciphertext is corrupt. */ + /** @constructor Ciphertext is corrupt. */ corrupt: function(message) { this.toString = function() { return "CORRUPT: "+this.message; }; this.message = message; }, - /** @class Invalid parameter. */ + /** @constructor Invalid parameter. */ invalid: function(message) { this.toString = function() { return "INVALID: "+this.message; }; this.message = message; }, - /** @class Bug or missing feature in SJCL. */ + /** @constructor Bug or missing feature in SJCL. @constructor */ bug: function(message) { this.toString = function() { return "BUG: "+this.message; }; this.message = message; }, - /** @class Something isn't ready. */ + /** @constructor Something isn't ready. */ notReady: function(message) { this.toString = function() { return "NOT READY: "+this.message; }; this.message = message; @@ -68,6 +68,11 @@ var sjcl = { } }; -if(typeof module != 'undefined' && module.exports){ +if(typeof module !== 'undefined' && module.exports){ module.exports = sjcl; } +if (typeof define === "function") { + define([], function () { + return sjcl; + }); +} diff --git a/core/srp.js b/core/srp.js index d1dba28..1f92d57 100644 --- a/core/srp.js +++ b/core/srp.js @@ -16,7 +16,7 @@ */ sjcl.keyexchange.srp = { /** - * Calculates SRP v, the verifier. + * Calculates SRP v, the verifier. * v = g^x mod N [RFC 5054] * @param {String} I The username. * @param {String} P The password. @@ -27,7 +27,7 @@ sjcl.keyexchange.srp = { */ makeVerifier: function(I, P, s, group) { var x; - x = this.makeX(I, P, s); + x = sjcl.keyexchange.srp.makeX(I, P, s); x = sjcl.bn.fromBits(x); return group.g.powermod(x, group.N); }, @@ -52,8 +52,8 @@ sjcl.keyexchange.srp = { */ knownGroup:function(i) { if (typeof i !== "string") { i = i.toString(); } - if (!this._didInitKnownGroups) { this._initKnownGroups(); } - return this._knownGroups[i]; + if (!sjcl.keyexchange.srp._didInitKnownGroups) { sjcl.keyexchange.srp._initKnownGroups(); } + return sjcl.keyexchange.srp._knownGroups[i]; }, /** @@ -63,16 +63,16 @@ sjcl.keyexchange.srp = { _didInitKnownGroups: false, _initKnownGroups:function() { var i, size, group; - for (i=0; i < this._knownGroupSizes.length; i++) { - size = this._knownGroupSizes[i].toString(); - group = this._knownGroups[size]; + for (i=0; i < sjcl.keyexchange.srp._knownGroupSizes.length; i++) { + size = sjcl.keyexchange.srp._knownGroupSizes[i].toString(); + group = sjcl.keyexchange.srp._knownGroups[size]; group.N = new sjcl.bn(group.N); group.g = new sjcl.bn(group.g); } - this._didInitKnownGroups = true; + sjcl.keyexchange.srp._didInitKnownGroups = true; }, - _knownGroupSizes: [1024, 1536, 2048], + _knownGroupSizes: [1024, 1536, 2048, 3072, 4096, 6144, 8192], _knownGroups: { 1024: { N: "EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C" + @@ -106,8 +106,121 @@ sjcl.keyexchange.srp = { "94B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F" + "9E4AFF73", g: 2 + }, + + 3072: { + N: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + + "E0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF", + g: 5 + }, + + 4096: { + N: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" + + "FFFFFFFFFFFFFFFF", + g: 5 + }, + + 6144: { + N: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" + + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" + + "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" + + "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" + + "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" + + "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" + + "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" + + "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" + + "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" + + "6DCC4024FFFFFFFFFFFFFFFF", + g: 5 + }, + + 8192: { + N:"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" + + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" + + "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" + + "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" + + "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" + + "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" + + "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" + + "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" + + "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" + + "6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA" + + "3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C" + + "5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9" + + "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886" + + "2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6" + + "6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5" + + "0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268" + + "359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6" + + "FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" + + "60C980DD98EDD3DFFFFFFFFFFFFFFFFF", + g: 19 } } }; - diff --git a/demo/example.js b/demo/example.js index 940402b..42b1c0e 100644 --- a/demo/example.js +++ b/demo/example.js @@ -108,7 +108,7 @@ function doDecrypt() { } v.mode = rp.mode; v.iv = rp.iv; - v.adata = rp.adata; + v.adata = sjcl.codec.utf8String.fromBits(rp.adata); if (v.password) { v.salt = rp.salt; v.iter = rp.iter; diff --git a/demo/index.html b/demo/index.html index 68f78d5..5e1c516 100644 --- a/demo/index.html +++ b/demo/index.html @@ -36,7 +36,7 @@ <h2>Key Derivation</h2> <div class="section"> <div> - <label for="salt"">Salt:</label> + <label for="salt">Salt:</label> <a class="random floatright" href="javascript:randomize('salt',2,0)">random</a> </div> <input type="text" id="salt" class="wide hex" autocomplete="off" size="17" maxlength="35"/> @@ -104,13 +104,15 @@ <label for="ccm"><acronym title="Counter mode with Cipher block chaining Message authentication code">CCM</acronym></label> <input type="radio" name="mode" value="ocb2" id="ocb2" autocomplete="off"/> <label for="ocb2"><acronym title="Offset CodeBook mode, version 2.0">OCB2</acronym></label> + <input type="radio" name="mode" value="gcm" id="gcm" autocomplete="off"/> + <label for="gcm"><acronym title="Galois Counter Mode">GCM</acronym></label> <p class="explanation"> The cipher mode is a standard for how to use AES and other algorithms to encrypt and authenticate your message. - <a href="http://en.wikipedia.org/wiki/OCB_mode">OCB2 mode</a> - is slightly faster and has more features, but - <a href="http://en.wikipedia.org/wiki/CCM_mode">CCM mode</a> has wider - support because it is not patented. + <a href="http://en.wikipedia.org/wiki/OCB_mode">OCB2 mode</a> (patented) and + <a href="http://en.wikipedia.org/wiki/GCM_mode">GCM mode</a> (unencumbered) + are slightly faster and have more features than + <a href="http://en.wikipedia.org/wiki/CCM_mode">CCM mode</a>. </p> </div> @@ -128,7 +130,7 @@ different each time you send it. </p> <p class="explanation"> - Be careful: CCM mode doesn't use + Be careful: CCM mode and GCM mode don't use the whole IV, so changing just part of it isn't enough. </p> </div> diff --git a/package.json b/package.json new file mode 100644 index 0000000..93d366b --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "sjcl", + "version": "1.0.4", + "description": "Stanford Javascript Crypto Library", + "main": "sjcl.js", + "author": "bitwiseshiftleft", + "keywords": ["encryption", "high-level", "crypto"], + "repository" : { + "type": "git", + "url": "https://github.com/bitwiseshiftleft/sjcl.git" + }, + "scripts": { + "test": "make test" + }, + "engines": { "node": "*" } +} @@ -1,41 +1,59 @@ "use strict";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}}; -if(typeof module!="undefined"&&module.exports)module.exports=sjcl; -sjcl.cipher.aes=function(a){this.h[0][0][0]||this.w();var b,c,d,e,f=this.h[0][4],g=this.h[1];b=a.length;var h=1;if(b!==4&&b!==6&&b!==8)throw new sjcl.exception.invalid("invalid aes key size");this.a=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(a%b===0||b===8&&a%b===4){c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255];if(a%b===0){c=c<<8^c>>>24^h<<24;h=h<<1^(h>>7)*283}}d[a]=d[a-b]^c}for(b=0;a;b++,a--){c=d[b&3?a:a-4];e[b]=a<=4||b<4?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^ -g[3][f[c&255]]}}; -sjcl.cipher.aes.prototype={encrypt:function(a){return this.H(a,0)},decrypt:function(a){return this.H(a,1)},h:[[[],[],[],[],[]],[[],[],[],[],[]]],w:function(){var a=this.h[0],b=this.h[1],c=a[4],d=b[4],e,f,g,h=[],i=[],k,j,l,m;for(e=0;e<0x100;e++)i[(h[e]=e<<1^(e>>7)*283)^e]=e;for(f=g=0;!c[f];f^=k||1,g=i[g]||1){l=g^g<<1^g<<2^g<<3^g<<4;l=l>>8^l&255^99;c[f]=l;d[l]=f;j=h[e=h[k=h[f]]];m=j*0x1010101^e*0x10001^k*0x101^f*0x1010100;j=h[l]*0x101^l*0x1010100;for(e=0;e<4;e++){a[e][f]=j=j<<24^j>>>8;b[e][l]=m=m<<24^m>>>8}}for(e= -0;e<5;e++){a[e]=a[e].slice(0);b[e]=b[e].slice(0)}},H:function(a,b){if(a.length!==4)throw new sjcl.exception.invalid("invalid aes block size");var c=this.a[b],d=a[0]^c[0],e=a[b?3:1]^c[1],f=a[2]^c[2];a=a[b?1:3]^c[3];var g,h,i,k=c.length/4-2,j,l=4,m=[0,0,0,0];g=this.h[b];var n=g[0],o=g[1],p=g[2],q=g[3],r=g[4];for(j=0;j<k;j++){g=n[d>>>24]^o[e>>16&255]^p[f>>8&255]^q[a&255]^c[l];h=n[e>>>24]^o[f>>16&255]^p[a>>8&255]^q[d&255]^c[l+1];i=n[f>>>24]^o[a>>16&255]^p[d>>8&255]^q[e&255]^c[l+2];a=n[a>>>24]^o[d>>16& -255]^p[e>>8&255]^q[f&255]^c[l+3];l+=4;d=g;e=h;f=i}for(j=0;j<4;j++){m[b?3&-j:j]=r[d>>>24]<<24^r[e>>16&255]<<16^r[f>>8&255]<<8^r[a&255]^c[l++];g=d;d=e;e=f;f=a;a=g}return m}}; -sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.P(a.slice(b/32),32-(b&31)).slice(1);return c===undefined?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(a.length===0||b.length===0)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return d===32?a.concat(b):sjcl.bitArray.P(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length; -if(b===0)return 0;return(b-1)*32+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(a.length*32<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b&=31;if(c>0&&b)a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1);return a},partial:function(a,b,c){if(a===32)return b;return(c?b|0:b<<32-a)+a*0x10000000000},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return false;var c=0,d;for(d=0;d<a.length;d++)c|= -a[d]^b[d];return c===0},P:function(a,b,c,d){var e;e=0;if(d===undefined)d=[];for(;b>=32;b-=32){d.push(c);c=0}if(b===0)return d.concat(a);for(e=0;e<a.length;e++){d.push(c|a[e]>>>b);c=a[e]<<32-b}e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,b+a>32?c:d.pop(),1));return d},k:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]}}; -sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++){if((d&3)===0)e=a[d/4];b+=String.fromCharCode(e>>>24);e<<=8}return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++){d=d<<8|a.charCodeAt(c);if((c&3)===3){b.push(d);d=0}}c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}}; -sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a+="00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,d*4)}}; -sjcl.codec.base64={D:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b,c){var d="",e=0,f=sjcl.codec.base64.D,g=0,h=sjcl.bitArray.bitLength(a);if(c)f=f.substr(0,62)+"-_";for(c=0;d.length*6<h;){d+=f.charAt((g^a[c]>>>e)>>>26);if(e<6){g=a[c]<<6-e;e+=26;c++}else{g<<=6;e-=6}}for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d=0,e=sjcl.codec.base64.D,f=0,g;if(b)e=e.substr(0,62)+"-_";for(b=0;b<a.length;b++){g=e.indexOf(a.charAt(b)); -if(g<0)throw new sjcl.exception.invalid("this isn't base64!");if(d>26){d-=26;c.push(f^g>>>d);f=g<<32-d}else{d+=6;f^=g<<32-d}}d&56&&c.push(sjcl.bitArray.partial(d&56,f,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.a[0]||this.w();if(a){this.n=a.n.slice(0);this.i=a.i.slice(0);this.e=a.e}else this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()}; -sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.n=this.N.slice(0);this.i=[];this.e=0;return this},update:function(a){if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);var b,c=this.i=sjcl.bitArray.concat(this.i,a);b=this.e;a=this.e=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)this.C(c.splice(0,16));return this},finalize:function(){var a,b=this.i,c=this.n;b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.e/ -4294967296));for(b.push(this.e|0);b.length;)this.C(b.splice(0,16));this.reset();return c},N:[],a:[],w:function(){function a(e){return(e-Math.floor(e))*0x100000000|0}var b=0,c=2,d;a:for(;b<64;c++){for(d=2;d*d<=c;d++)if(c%d===0)continue a;if(b<8)this.N[b]=a(Math.pow(c,0.5));this.a[b]=a(Math.pow(c,1/3));b++}},C:function(a){var b,c,d=a.slice(0),e=this.n,f=this.a,g=e[0],h=e[1],i=e[2],k=e[3],j=e[4],l=e[5],m=e[6],n=e[7];for(a=0;a<64;a++){if(a<16)b=d[a];else{b=d[a+1&15];c=d[a+14&15];b=d[a&15]=(b>>>7^b>>>18^ -b>>>3^b<<25^b<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+d[a&15]+d[a+9&15]|0}b=b+n+(j>>>6^j>>>11^j>>>25^j<<26^j<<21^j<<7)+(m^j&(l^m))+f[a];n=m;m=l;l=j;j=k+b|0;k=i;i=h;h=g;g=b+(h&i^k&(h^i))+(h>>>2^h>>>13^h>>>22^h<<30^h<<19^h<<10)|0}e[0]=e[0]+g|0;e[1]=e[1]+h|0;e[2]=e[2]+i|0;e[3]=e[3]+k|0;e[4]=e[4]+j|0;e[5]=e[5]+l|0;e[6]=e[6]+m|0;e[7]=e[7]+n|0}}; -sjcl.mode.ccm={name:"ccm",encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,i=h.bitLength(c)/8,k=h.bitLength(g)/8;e=e||64;d=d||[];if(i<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;f<4&&k>>>8*f;f++);if(f<15-i)f=15-i;c=h.clamp(c,8*(15-f));b=sjcl.mode.ccm.G(a,b,c,d,e,f);g=sjcl.mode.ccm.I(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),i=f.clamp(b,h-e),k=f.bitSlice(b, -h-e);h=(h-e)/8;if(g<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;b<4&&h>>>8*b;b++);if(b<15-g)b=15-g;c=f.clamp(c,8*(15-b));i=sjcl.mode.ccm.I(a,i,c,k,e,b);a=sjcl.mode.ccm.G(a,i.data,c,d,e,b);if(!f.equal(i.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");return i.data},G:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,i=h.k;e/=8;if(e%2||e<4||e>16)throw new sjcl.exception.invalid("ccm: invalid tag length");if(d.length>0xffffffff||b.length>0xffffffff)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"); -f=[h.partial(8,(d.length?64:0)|e-2<<2|f-1)];f=h.concat(f,c);f[3]|=h.bitLength(b)/8;f=a.encrypt(f);if(d.length){c=h.bitLength(d)/8;if(c<=65279)g=[h.partial(16,c)];else if(c<=0xffffffff)g=h.concat([h.partial(16,65534)],[c]);g=h.concat(g,d);for(d=0;d<g.length;d+=4)f=a.encrypt(i(f,g.slice(d,d+4).concat([0,0,0])))}for(d=0;d<b.length;d+=4)f=a.encrypt(i(f,b.slice(d,d+4).concat([0,0,0])));return h.clamp(f,e*8)},I:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.k;var i=b.length,k=h.bitLength(b);c=h.concat([h.partial(8, -f-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!i)return{tag:d,data:[]};for(g=0;g<i;g+=4){c[3]++;e=a.encrypt(c);b[g]^=e[0];b[g+1]^=e[1];b[g+2]^=e[2];b[g+3]^=e[3]}return{tag:d,data:h.clamp(b,k)}}}; -sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.A,i=sjcl.bitArray,k=i.k,j=[0,0,0,0];c=h(a.encrypt(c));var l,m=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4){l=b.slice(g,g+4);j=k(j,l);m=m.concat(k(c,a.encrypt(k(c,l))));c=h(c)}l=b.slice(g);b=i.bitLength(l);g=a.encrypt(k(c,[0,0,0,b]));l=i.clamp(k(l.concat([0,0,0]),g),b);j=k(j,k(l.concat([0,0,0]),g));j=a.encrypt(k(j,k(c,h(c)))); -if(d.length)j=k(j,f?d:sjcl.mode.ocb2.pmac(a,d));return m.concat(i.concat(l,i.clamp(j,e)))},decrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.A,h=sjcl.bitArray,i=h.k,k=[0,0,0,0],j=g(a.encrypt(c)),l,m,n=sjcl.bitArray.bitLength(b)-e,o=[];d=d||[];for(c=0;c+4<n/32;c+=4){l=i(j,a.decrypt(i(j,b.slice(c,c+4))));k=i(k,l);o=o.concat(l);j=g(j)}m=n-c*32;l=a.encrypt(i(j,[0,0,0,m]));l=i(l,h.clamp(b.slice(c), -m).concat([0,0,0]));k=i(k,l);k=a.encrypt(i(k,i(j,g(j))));if(d.length)k=i(k,f?d:sjcl.mode.ocb2.pmac(a,d));if(!h.equal(h.clamp(k,e),h.bitSlice(b,n)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return o.concat(h.clamp(l,m))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.A,e=sjcl.bitArray,f=e.k,g=[0,0,0,0],h=a.encrypt([0,0,0,0]);h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4){h=d(h);g=f(g,a.encrypt(f(h,b.slice(c,c+4))))}b=b.slice(c);if(e.bitLength(b)<128){h=f(h,d(h));b=e.concat(b,[2147483648|0,0, -0,0])}g=f(g,b);return a.encrypt(f(d(f(h,d(h))),g))},A:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^(a[0]>>>31)*135]}};sjcl.misc.hmac=function(a,b){this.M=b=b||sjcl.hash.sha256;var c=[[],[]],d=b.prototype.blockSize/32;this.l=[new b,new b];if(a.length>d)a=b.hash(a);for(b=0;b<d;b++){c[0][b]=a[b]^909522486;c[1][b]=a[b]^1549556828}this.l[0].update(c[0]);this.l[1].update(c[1])}; -sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a,b){a=(new this.M(this.l[0])).update(a,b).finalize();return(new this.M(this.l[1])).update(a).finalize()}; -sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;if(d<0||c<0)throw sjcl.exception.invalid("invalid params to pbkdf2");if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,i,k=[],j=sjcl.bitArray;for(i=1;32*k.length<(d||1);i++){e=f=a.encrypt(j.concat(b,[i]));for(g=1;g<c;g++){f=a.encrypt(f);for(h=0;h<f.length;h++)e[h]^=f[h]}k=k.concat(e)}if(d)k=j.clamp(k,d);return k}; -sjcl.random={randomWords:function(a,b){var c=[];b=this.isReady(b);var d;if(b===0)throw new sjcl.exception.notReady("generator isn't seeded");else b&2&&this.U(!(b&1));for(b=0;b<a;b+=4){(b+1)%0x10000===0&&this.L();d=this.u();c.push(d[0],d[1],d[2],d[3])}this.L();return c.slice(0,a)},setDefaultParanoia:function(a){this.t=a},addEntropy:function(a,b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.q[c],h=this.isReady();d=this.F[c];if(d===undefined)d=this.F[c]=this.R++;if(g===undefined)g=this.q[c]=0;this.q[c]= -(this.q[c]+1)%this.b.length;switch(typeof a){case "number":break;case "object":if(b===undefined)for(c=b=0;c<a.length;c++)for(e=a[c];e>0;){b++;e>>>=1}this.b[g].update([d,this.J++,2,b,f,a.length].concat(a));break;case "string":if(b===undefined)b=a.length;this.b[g].update([d,this.J++,3,b,f,a.length]);this.b[g].update(a);break;default:throw new sjcl.exception.bug("random: addEntropy only supports number, array or string");}this.j[g]+=b;this.f+=b;if(h===0){this.isReady()!==0&&this.K("seeded",Math.max(this.g, -this.f));this.K("progress",this.getProgress())}},isReady:function(a){a=this.B[a!==undefined?a:this.t];return this.g&&this.g>=a?this.j[0]>80&&(new Date).valueOf()>this.O?3:1:this.f>=a?2:0},getProgress:function(a){a=this.B[a?a:this.t];return this.g>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.m){if(window.addEventListener){window.addEventListener("load",this.o,false);window.addEventListener("mousemove",this.p,false)}else if(document.attachEvent){document.attachEvent("onload",this.o); -document.attachEvent("onmousemove",this.p)}else throw new sjcl.exception.bug("can't attach event");this.m=true}},stopCollectors:function(){if(this.m){if(window.removeEventListener){window.removeEventListener("load",this.o,false);window.removeEventListener("mousemove",this.p,false)}else if(window.detachEvent){window.detachEvent("onload",this.o);window.detachEvent("onmousemove",this.p)}this.m=false}},addEventListener:function(a,b){this.r[a][this.Q++]=b},removeEventListener:function(a,b){var c;a=this.r[a]; -var d=[];for(c in a)a.hasOwnProperty(c)&&a[c]===b&&d.push(c);for(b=0;b<d.length;b++){c=d[b];delete a[c]}},b:[new sjcl.hash.sha256],j:[0],z:0,q:{},J:0,F:{},R:0,g:0,f:0,O:0,a:[0,0,0,0,0,0,0,0],d:[0,0,0,0],s:undefined,t:6,m:false,r:{progress:{},seeded:{}},Q:0,B:[0,48,64,96,128,192,0x100,384,512,768,1024],u:function(){for(var a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}return this.s.encrypt(this.d)},L:function(){this.a=this.u().concat(this.u());this.s=new sjcl.cipher.aes(this.a)},T:function(a){this.a= -sjcl.hash.sha256.hash(this.a.concat(a));this.s=new sjcl.cipher.aes(this.a);for(a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}},U:function(a){var b=[],c=0,d;this.O=b[0]=(new Date).valueOf()+3E4;for(d=0;d<16;d++)b.push(Math.random()*0x100000000|0);for(d=0;d<this.b.length;d++){b=b.concat(this.b[d].finalize());c+=this.j[d];this.j[d]=0;if(!a&&this.z&1<<d)break}if(this.z>=1<<this.b.length){this.b.push(new sjcl.hash.sha256);this.j.push(0)}this.f-=c;if(c>this.g)this.g=c;this.z++;this.T(b)},p:function(a){sjcl.random.addEntropy([a.x|| -a.clientX||a.offsetX,a.y||a.clientY||a.offsetY],2,"mouse")},o:function(){sjcl.random.addEntropy(new Date,2,"loadtime")},K:function(a,b){var c;a=sjcl.random.r[a];var d=[];for(c in a)a.hasOwnProperty(c)&&d.push(a[c]);for(c=0;c<d.length;c++)d[c](b)}};try{var s=new Uint32Array(32);crypto.getRandomValues(s);sjcl.random.addEntropy(s,1024,"crypto['getRandomValues']")}catch(t){} -sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},encrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.c({iv:sjcl.random.randomWords(4,0)},e.defaults),g;e.c(f,c);c=f.adata;if(typeof f.salt==="string")f.salt=sjcl.codec.base64.toBits(f.salt);if(typeof f.iv==="string")f.iv=sjcl.codec.base64.toBits(f.iv);if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||typeof a==="string"&&f.iter<=100||f.ts!==64&&f.ts!==96&&f.ts!==128||f.ks!==128&&f.ks!==192&&f.ks!==0x100||f.iv.length< -2||f.iv.length>4)throw new sjcl.exception.invalid("json encrypt: invalid parameters");if(typeof a==="string"){g=sjcl.misc.cachedPbkdf2(a,f);a=g.key.slice(0,f.ks/32);f.salt=g.salt}if(typeof b==="string")b=sjcl.codec.utf8String.toBits(b);if(typeof c==="string")c=sjcl.codec.utf8String.toBits(c);g=new sjcl.cipher[f.cipher](a);e.c(d,f);d.key=a;f.ct=sjcl.mode[f.mode].encrypt(g,b,f.iv,c,f.ts);return e.encode(f)},decrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.c(e.c(e.c({},e.defaults),e.decode(b)), -c,true);var f;c=b.adata;if(typeof b.salt==="string")b.salt=sjcl.codec.base64.toBits(b.salt);if(typeof b.iv==="string")b.iv=sjcl.codec.base64.toBits(b.iv);if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||typeof a==="string"&&b.iter<=100||b.ts!==64&&b.ts!==96&&b.ts!==128||b.ks!==128&&b.ks!==192&&b.ks!==0x100||!b.iv||b.iv.length<2||b.iv.length>4)throw new sjcl.exception.invalid("json decrypt: invalid parameters");if(typeof a==="string"){f=sjcl.misc.cachedPbkdf2(a,b);a=f.key.slice(0,b.ks/32);b.salt=f.salt}if(typeof c=== -"string")c=sjcl.codec.utf8String.toBits(c);f=new sjcl.cipher[b.cipher](a);c=sjcl.mode[b.mode].decrypt(f,b.ct,b.iv,c,b.ts);e.c(d,b);d.key=a;return sjcl.codec.utf8String.fromBits(c)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+'"'+b+'":';d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+ -sjcl.codec.base64.fromBits(a[b],1)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^(?:(["']?)([a-z][a-z0-9]*)\1):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");b[d[2]]= -d[3]?parseInt(d[3],10):d[2].match(/^(ct|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4])}return b},c:function(a,b,c){if(a===undefined)a={};if(b===undefined)return a;var d;for(d in b)if(b.hasOwnProperty(d)){if(c&&a[d]!==undefined&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},W:function(a,b){var c={},d;for(d in a)if(a.hasOwnProperty(d)&&a[d]!==b[d])c[d]=a[d];return c},V:function(a,b){var c={},d;for(d=0;d<b.length;d++)if(a[b[d]]!==undefined)c[b[d]]= -a[b[d]];return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.S={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.S,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=b.salt===undefined?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}}; +"undefined"!==typeof module&&module.exports&&(module.exports=sjcl);"function"===typeof define&&define([],function(){return sjcl}); +sjcl.cipher.aes=function(a){this.s[0][0][0]||this.O();var b,c,d,e,g=this.s[0][4],f=this.s[1];b=a.length;var h=1;if(4!==b&&6!==b&&8!==b)throw new sjcl.exception.invalid("invalid aes key size");this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=g[c>>>24]<<24^g[c>>16&255]<<16^g[c>>8&255]<<8^g[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:f[0][g[c>>>24]]^f[1][g[c>>16&255]]^f[2][g[c>>8&255]]^f[3][g[c& +255]]}; +sjcl.cipher.aes.prototype={encrypt:function(a){return u(this,a,0)},decrypt:function(a){return u(this,a,1)},s:[[[],[],[],[],[]],[[],[],[],[],[]]],O:function(){var a=this.s[0],b=this.s[1],c=a[4],d=b[4],e,g,f,h=[],l=[],k,m,n,p;for(e=0;0x100>e;e++)l[(h[e]=e<<1^283*(e>>7))^e]=e;for(g=f=0;!c[g];g^=k||1,f=l[f]||1)for(n=f^f<<1^f<<2^f<<3^f<<4,n=n>>8^n&255^99,c[g]=n,d[n]=g,m=h[e=h[k=h[g]]],p=0x1010101*m^0x10001*e^0x101*k^0x1010100*g,m=0x101*h[n]^0x1010100*n,e=0;4>e;e++)a[e][g]=m=m<<24^m>>>8,b[e][n]=p=p<<24^p>>>8;for(e= +0;5>e;e++)a[e]=a[e].slice(0),b[e]=b[e].slice(0)}}; +function u(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid("invalid aes block size");var d=a.b[c],e=b[0]^d[0],g=b[c?3:1]^d[1],f=b[2]^d[2];b=b[c?1:3]^d[3];var h,l,k,m=d.length/4-2,n,p=4,r=[0,0,0,0];h=a.s[c];a=h[0];var q=h[1],t=h[2],w=h[3],x=h[4];for(n=0;n<m;n++)h=a[e>>>24]^q[g>>16&255]^t[f>>8&255]^w[b&255]^d[p],l=a[g>>>24]^q[f>>16&255]^t[b>>8&255]^w[e&255]^d[p+1],k=a[f>>>24]^q[b>>16&255]^t[e>>8&255]^w[g&255]^d[p+2],b=a[b>>>24]^q[e>>16&255]^t[g>>8&255]^w[f&255]^d[p+3],p+=4,e=h,g=l,f=k;for(n= +0;4>n;n++)r[c?3&-n:n]=x[e>>>24]<<24^x[g>>16&255]<<16^x[f>>8&255]<<8^x[b&255]^d[p++],h=e,e=g,g=f,f=b,b=h;return r} +sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0=== +b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0=== +c},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}}; +sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>24),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}}; +sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a=a+"00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}}; +sjcl.codec.base32={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",X:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,g="",f=0,h=sjcl.codec.base32.B,l=0,k=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;g.length*d<k;)g+=h.charAt((l^a[c]>>>f)>>>e),f<d?(l=a[c]<<d-f,f+=e,c++):(l<<=d,f-=d);for(;g.length&7&&!b;)g+="=";return g},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS, +d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,g=[],f,h=0,l=sjcl.codec.base32.B,k=0,m,n="base32";b&&(l=sjcl.codec.base32.X,n="base32hex");for(f=0;f<a.length;f++){m=l.indexOf(a.charAt(f));if(0>m){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+n+"!");}h>e?(h-=e,g.push(k^m>>>h),k=m<<c-h):(h+=d,k^=m<<c-h)}h&56&&g.push(sjcl.bitArray.partial(h&56,k,1));return g}}; +sjcl.codec.base32hex={fromBits:function(a,b){return sjcl.codec.base32.fromBits(a,b,1)},toBits:function(a){return sjcl.codec.base32.toBits(a,1)}}; +sjcl.codec.base64={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b,c){var d="",e=0,g=sjcl.codec.base64.B,f=0,h=sjcl.bitArray.bitLength(a);c&&(g=g.substr(0,62)+"-_");for(c=0;6*d.length<h;)d+=g.charAt((f^a[c]>>>e)>>>26),6>e?(f=a[c]<<6-e,e+=26,c++):(f<<=6,e-=6);for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d,e=0,g=sjcl.codec.base64.B,f=0,h;b&&(g=g.substr(0,62)+"-_");for(d=0;d<a.length;d++){h=g.indexOf(a.charAt(d)); +if(0>h)throw new sjcl.exception.invalid("this isn't base64!");26<e?(e-=26,c.push(f^h>>>e),f=h<<32-e):(e+=6,f^=h<<32-e)}e&56&&c.push(sjcl.bitArray.partial(e&56,f,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.O();a?(this.F=a.F.slice(0),this.A=a.A.slice(0),this.l=a.l):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()}; +sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.F=this.Y.slice(0);this.A=[];this.l=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.A=sjcl.bitArray.concat(this.A,a);b=this.l;a=this.l=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)v(this,c.splice(0,16));return this},finalize:function(){var a,b=this.A,c=this.F,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.l/ +4294967296));for(b.push(this.l|0);b.length;)v(this,b.splice(0,16));this.reset();return c},Y:[],b:[],O:function(){function a(a){return 0x100000000*(a-Math.floor(a))|0}var b=0,c=2,d;a:for(;64>b;c++){for(d=2;d*d<=c;d++)if(0===c%d)continue a;8>b&&(this.Y[b]=a(Math.pow(c,.5)));this.b[b]=a(Math.pow(c,1/3));b++}}}; +function v(a,b){var c,d,e,g=b.slice(0),f=a.F,h=a.b,l=f[0],k=f[1],m=f[2],n=f[3],p=f[4],r=f[5],q=f[6],t=f[7];for(c=0;64>c;c++)16>c?d=g[c]:(d=g[c+1&15],e=g[c+14&15],d=g[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g[c&15]+g[c+9&15]|0),d=d+t+(p>>>6^p>>>11^p>>>25^p<<26^p<<21^p<<7)+(q^p&(r^q))+h[c],t=q,q=r,r=p,p=n+d|0,n=m,m=k,k=l,l=d+(k&m^n&(k^m))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+l|0;f[1]=f[1]+k|0;f[2]=f[2]+m|0;f[3]=f[3]+n|0;f[4]=f[4]+p|0;f[5]=f[5]+r|0;f[6]= +f[6]+q|0;f[7]=f[7]+t|0} +sjcl.mode.ccm={name:"ccm",G:[],listenProgress:function(a){sjcl.mode.ccm.G.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.G.indexOf(a);-1<a&&sjcl.mode.ccm.G.splice(a,1)},fa:function(a){var b=sjcl.mode.ccm.G.slice(),c;for(c=0;c<b.length;c+=1)b[c](a)},encrypt:function(a,b,c,d,e){var g,f=b.slice(0),h=sjcl.bitArray,l=h.bitLength(c)/8,k=h.bitLength(f)/8;e=e||64;d=d||[];if(7>l)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(g=2;4>g&&k>>>8*g;g++);g<15-l&&(g=15-l);c=h.clamp(c, +8*(15-g));b=sjcl.mode.ccm.V(a,b,c,d,e,g);f=sjcl.mode.ccm.C(a,f,c,b,e,g);return h.concat(f.data,f.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var g=sjcl.bitArray,f=g.bitLength(c)/8,h=g.bitLength(b),l=g.clamp(b,h-e),k=g.bitSlice(b,h-e),h=(h-e)/8;if(7>f)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;4>b&&h>>>8*b;b++);b<15-f&&(b=15-f);c=g.clamp(c,8*(15-b));l=sjcl.mode.ccm.C(a,l,c,k,e,b);a=sjcl.mode.ccm.V(a,l.data,c,d,e,b);if(!g.equal(l.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match"); +return l.data},na:function(a,b,c,d,e,g){var f=[],h=sjcl.bitArray,l=h.i;d=[h.partial(8,(b.length?64:0)|d-2<<2|g-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length)for(c=h.bitLength(b)/8,65279>=c?f=[h.partial(16,c)]:0xffffffff>=c&&(f=h.concat([h.partial(16,65534)],[c])),f=h.concat(f,b),b=0;b<f.length;b+=4)d=a.encrypt(l(d,f.slice(b,b+4).concat([0,0,0])));return d},V:function(a,b,c,d,e,g){var f=sjcl.bitArray,h=f.i;e/=8;if(e%2||4>e||16<e)throw new sjcl.exception.invalid("ccm: invalid tag length"); +if(0xffffffff<d.length||0xffffffff<b.length)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");c=sjcl.mode.ccm.na(a,d,c,e,f.bitLength(b)/8,g);for(d=0;d<b.length;d+=4)c=a.encrypt(h(c,b.slice(d,d+4).concat([0,0,0])));return f.clamp(c,8*e)},C:function(a,b,c,d,e,g){var f,h=sjcl.bitArray;f=h.i;var l=b.length,k=h.bitLength(b),m=l/50,n=m;c=h.concat([h.partial(8,g-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(f(d,a.encrypt(c)),0,e);if(!l)return{tag:d,data:[]};for(f=0;f<l;f+=4)f>m&&(sjcl.mode.ccm.fa(f/ +l),m+=n),c[3]++,e=a.encrypt(c),b[f]^=e[0],b[f+1]^=e[1],b[f+2]^=e[2],b[f+3]^=e[3];return{tag:d,data:h.clamp(b,k)}}}; +sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,g){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");var f,h=sjcl.mode.ocb2.S,l=sjcl.bitArray,k=l.i,m=[0,0,0,0];c=h(a.encrypt(c));var n,p=[];d=d||[];e=e||64;for(f=0;f+4<b.length;f+=4)n=b.slice(f,f+4),m=k(m,n),p=p.concat(k(c,a.encrypt(k(c,n)))),c=h(c);n=b.slice(f);b=l.bitLength(n);f=a.encrypt(k(c,[0,0,0,b]));n=l.clamp(k(n.concat([0,0,0]),f),b);m=k(m,k(n.concat([0,0,0]),f));m=a.encrypt(k(m,k(c,h(c)))); +d.length&&(m=k(m,g?d:sjcl.mode.ocb2.pmac(a,d)));return p.concat(l.concat(n,l.clamp(m,e)))},decrypt:function(a,b,c,d,e,g){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var f=sjcl.mode.ocb2.S,h=sjcl.bitArray,l=h.i,k=[0,0,0,0],m=f(a.encrypt(c)),n,p,r=sjcl.bitArray.bitLength(b)-e,q=[];d=d||[];for(c=0;c+4<r/32;c+=4)n=l(m,a.decrypt(l(m,b.slice(c,c+4)))),k=l(k,n),q=q.concat(n),m=f(m);p=r-32*c;n=a.encrypt(l(m,[0,0,0,p]));n=l(n,h.clamp(b.slice(c),p).concat([0, +0,0]));k=l(k,n);k=a.encrypt(l(k,l(m,f(m))));d.length&&(k=l(k,g?d:sjcl.mode.ocb2.pmac(a,d)));if(!h.equal(h.clamp(k,e),h.bitSlice(b,r)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return q.concat(h.clamp(n,p))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.S,e=sjcl.bitArray,g=e.i,f=[0,0,0,0],h=a.encrypt([0,0,0,0]),h=g(h,d(d(h)));for(c=0;c+4<b.length;c+=4)h=d(h),f=g(f,a.encrypt(g(h,b.slice(c,c+4))));c=b.slice(c);128>e.bitLength(c)&&(h=g(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));f=g(f,c); +return a.encrypt(g(d(g(h,d(h))),f))},S:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}}; +sjcl.mode.gcm={name:"gcm",encrypt:function(a,b,c,d,e){var g=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.C(!0,a,g,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var g=b.slice(0),f=sjcl.bitArray,h=f.bitLength(g);e=e||128;d=d||[];e<=h?(b=f.bitSlice(g,h-e),g=f.bitSlice(g,0,h-e)):(b=g,g=[]);a=sjcl.mode.gcm.C(!1,a,g,d,c,e);if(!f.equal(a.tag,b))throw new sjcl.exception.corrupt("gcm: tag doesn't match");return a.data},ka:function(a,b){var c,d,e,g,f,h=sjcl.bitArray.i;e=[0,0, +0,0];g=b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,g));f=0!==(g[3]&1);for(d=3;0<d;d--)g[d]=g[d]>>>1|(g[d-1]&1)<<31;g[0]>>>=1;f&&(g[0]^=-0x1f000000)}return e},j:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;d<e;d+=4)b[0]^=0xffffffff&c[d],b[1]^=0xffffffff&c[d+1],b[2]^=0xffffffff&c[d+2],b[3]^=0xffffffff&c[d+3],b=sjcl.mode.gcm.ka(b,a);return b},C:function(a,b,c,d,e,g){var f,h,l,k,m,n,p,r,q=sjcl.bitArray;n=c.length;p=q.bitLength(c);r=q.bitLength(d);h=q.bitLength(e); +f=b.encrypt([0,0,0,0]);96===h?(e=e.slice(0),e=q.concat(e,[1])):(e=sjcl.mode.gcm.j(f,[0,0,0,0],e),e=sjcl.mode.gcm.j(f,e,[0,0,Math.floor(h/0x100000000),h&0xffffffff]));h=sjcl.mode.gcm.j(f,[0,0,0,0],d);m=e.slice(0);d=h.slice(0);a||(d=sjcl.mode.gcm.j(f,h,c));for(k=0;k<n;k+=4)m[3]++,l=b.encrypt(m),c[k]^=l[0],c[k+1]^=l[1],c[k+2]^=l[2],c[k+3]^=l[3];c=q.clamp(c,p);a&&(d=sjcl.mode.gcm.j(f,h,c));a=[Math.floor(r/0x100000000),r&0xffffffff,Math.floor(p/0x100000000),p&0xffffffff];d=sjcl.mode.gcm.j(f,d,a);l=b.encrypt(e); +d[0]^=l[0];d[1]^=l[1];d[2]^=l[2];d[3]^=l[3];return{tag:q.bitSlice(d,0,g),data:c}}};sjcl.misc.hmac=function(a,b){this.W=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.w=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.w[0].update(c[0]);this.w[1].update(c[1]);this.R=new b(this.w[0])}; +sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){if(this.aa)throw new sjcl.exception.invalid("encrypt on already updated hmac called!");this.update(a);return this.digest(a)};sjcl.misc.hmac.prototype.reset=function(){this.R=new this.W(this.w[0]);this.aa=!1};sjcl.misc.hmac.prototype.update=function(a){this.aa=!0;this.R.update(a)};sjcl.misc.hmac.prototype.digest=function(){var a=this.R.finalize(),a=(new this.W(this.w[1])).update(a).finalize();this.reset();return a}; +sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;if(0>d||0>c)throw sjcl.exception.invalid("invalid params to pbkdf2");"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var g,f,h,l,k=[],m=sjcl.bitArray;for(l=1;32*k.length<(d||1);l++){e=g=a.encrypt(m.concat(b,[l]));for(f=1;f<c;f++)for(g=a.encrypt(g),h=0;h<g.length;h++)e[h]^=g[h];k=k.concat(e)}d&&(k=m.clamp(k,d));return k}; +sjcl.prng=function(a){this.c=[new sjcl.hash.sha256];this.m=[0];this.P=0;this.H={};this.N=0;this.U={};this.Z=this.f=this.o=this.ha=0;this.b=[0,0,0,0,0,0,0,0];this.h=[0,0,0,0];this.L=void 0;this.M=a;this.D=!1;this.K={progress:{},seeded:{}};this.u=this.ga=0;this.I=1;this.J=2;this.ca=0x10000;this.T=[0,48,64,96,128,192,0x100,384,512,768,1024];this.da=3E4;this.ba=80}; +sjcl.prng.prototype={randomWords:function(a,b){var c=[],d;d=this.isReady(b);var e;if(d===this.u)throw new sjcl.exception.notReady("generator isn't seeded");if(d&this.J){d=!(d&this.I);e=[];var g=0,f;this.Z=e[0]=(new Date).valueOf()+this.da;for(f=0;16>f;f++)e.push(0x100000000*Math.random()|0);for(f=0;f<this.c.length&&(e=e.concat(this.c[f].finalize()),g+=this.m[f],this.m[f]=0,d||!(this.P&1<<f));f++);this.P>=1<<this.c.length&&(this.c.push(new sjcl.hash.sha256),this.m.push(0));this.f-=g;g>this.o&&(this.o= +g);this.P++;this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.L=new sjcl.cipher.aes(this.b);for(d=0;4>d&&(this.h[d]=this.h[d]+1|0,!this.h[d]);d++);}for(d=0;d<a;d+=4)0===(d+1)%this.ca&&y(this),e=z(this),c.push(e[0],e[1],e[2],e[3]);y(this);return c.slice(0,a)},setDefaultParanoia:function(a,b){if(0===a&&"Setting paranoia=0 will ruin your security; use it only for testing"!==b)throw"Setting paranoia=0 will ruin your security; use it only for testing";this.M=a},addEntropy:function(a,b,c){c=c||"user"; +var d,e,g=(new Date).valueOf(),f=this.H[c],h=this.isReady(),l=0;d=this.U[c];void 0===d&&(d=this.U[c]=this.ha++);void 0===f&&(f=this.H[c]=0);this.H[c]=(this.H[c]+1)%this.c.length;switch(typeof a){case "number":void 0===b&&(b=1);this.c[f].update([d,this.N++,1,b,g,1,a|0]);break;case "object":c=Object.prototype.toString.call(a);if("[object Uint32Array]"===c){e=[];for(c=0;c<a.length;c++)e.push(a[c]);a=e}else for("[object Array]"!==c&&(l=1),c=0;c<a.length&&!l;c++)"number"!==typeof a[c]&&(l=1);if(!l){if(void 0=== +b)for(c=b=0;c<a.length;c++)for(e=a[c];0<e;)b++,e=e>>>1;this.c[f].update([d,this.N++,2,b,g,a.length].concat(a))}break;case "string":void 0===b&&(b=a.length);this.c[f].update([d,this.N++,3,b,g,a.length]);this.c[f].update(a);break;default:l=1}if(l)throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");this.m[f]+=b;this.f+=b;h===this.u&&(this.isReady()!==this.u&&A("seeded",Math.max(this.o,this.f)),A("progress",this.getProgress()))},isReady:function(a){a=this.T[void 0!== +a?a:this.M];return this.o&&this.o>=a?this.m[0]>this.ba&&(new Date).valueOf()>this.Z?this.J|this.I:this.I:this.f>=a?this.J|this.u:this.u},getProgress:function(a){a=this.T[a?a:this.M];return this.o>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.D){this.a={loadTimeCollector:B(this,this.ma),mouseCollector:B(this,this.oa),keyboardCollector:B(this,this.la),accelerometerCollector:B(this,this.ea),touchCollector:B(this,this.qa)};if(window.addEventListener)window.addEventListener("load",this.a.loadTimeCollector, +!1),window.addEventListener("mousemove",this.a.mouseCollector,!1),window.addEventListener("keypress",this.a.keyboardCollector,!1),window.addEventListener("devicemotion",this.a.accelerometerCollector,!1),window.addEventListener("touchmove",this.a.touchCollector,!1);else if(document.attachEvent)document.attachEvent("onload",this.a.loadTimeCollector),document.attachEvent("onmousemove",this.a.mouseCollector),document.attachEvent("keypress",this.a.keyboardCollector);else throw new sjcl.exception.bug("can't attach event"); +this.D=!0}},stopCollectors:function(){this.D&&(window.removeEventListener?(window.removeEventListener("load",this.a.loadTimeCollector,!1),window.removeEventListener("mousemove",this.a.mouseCollector,!1),window.removeEventListener("keypress",this.a.keyboardCollector,!1),window.removeEventListener("devicemotion",this.a.accelerometerCollector,!1),window.removeEventListener("touchmove",this.a.touchCollector,!1)):document.detachEvent&&(document.detachEvent("onload",this.a.loadTimeCollector),document.detachEvent("onmousemove", +this.a.mouseCollector),document.detachEvent("keypress",this.a.keyboardCollector)),this.D=!1)},addEventListener:function(a,b){this.K[a][this.ga++]=b},removeEventListener:function(a,b){var c,d,e=this.K[a],g=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&g.push(d);for(c=0;c<g.length;c++)d=g[c],delete e[d]},la:function(){C(1)},oa:function(a){var b,c;try{b=a.x||a.clientX||a.offsetX||0,c=a.y||a.clientY||a.offsetY||0}catch(d){c=b=0}0!=b&&0!=c&&sjcl.random.addEntropy([b,c],2,"mouse");C(0)},qa:function(a){a= +a.touches[0]||a.changedTouches[0];sjcl.random.addEntropy([a.pageX||a.clientX,a.pageY||a.clientY],1,"touch");C(0)},ma:function(){C(2)},ea:function(a){a=a.accelerationIncludingGravity.x||a.accelerationIncludingGravity.y||a.accelerationIncludingGravity.z;if(window.orientation){var b=window.orientation;"number"===typeof b&&sjcl.random.addEntropy(b,1,"accelerometer")}a&&sjcl.random.addEntropy(a,2,"accelerometer");C(0)}}; +function A(a,b){var c,d=sjcl.random.K[a],e=[];for(c in d)d.hasOwnProperty(c)&&e.push(d[c]);for(c=0;c<e.length;c++)e[c](b)}function C(a){"undefined"!==typeof window&&window.performance&&"function"===typeof window.performance.now?sjcl.random.addEntropy(window.performance.now(),a,"loadtime"):sjcl.random.addEntropy((new Date).valueOf(),a,"loadtime")}function y(a){a.b=z(a).concat(z(a));a.L=new sjcl.cipher.aes(a.b)} +function z(a){for(var b=0;4>b&&(a.h[b]=a.h[b]+1|0,!a.h[b]);b++);return a.L.encrypt(a.h)}function B(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6); +a:try{var D,E,F,G;if(G="undefined"!==typeof module&&module.exports){var H;try{H=require("crypto")}catch(a){H=null}G=E=H}if(G&&E.randomBytes)D=E.randomBytes(128),D=new Uint32Array((new Uint8Array(D)).buffer),sjcl.random.addEntropy(D,1024,"crypto['randomBytes']");else if("undefined"!==typeof window&&"undefined"!==typeof Uint32Array){F=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(F);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(F); +else break a;sjcl.random.addEntropy(F,1024,"crypto['getRandomValues']")}}catch(a){"undefined"!==typeof window&&window.console&&(console.log("There was an error collecting entropy from the browser:"),console.log(a))} +sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},ja:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,g=e.g({iv:sjcl.random.randomWords(4,0)},e.defaults),f;e.g(g,c);c=g.adata;"string"===typeof g.salt&&(g.salt=sjcl.codec.base64.toBits(g.salt));"string"===typeof g.iv&&(g.iv=sjcl.codec.base64.toBits(g.iv));if(!sjcl.mode[g.mode]||!sjcl.cipher[g.cipher]||"string"===typeof a&&100>=g.iter||64!==g.ts&&96!==g.ts&&128!==g.ts||128!==g.ks&&192!==g.ks&&0x100!==g.ks||2>g.iv.length|| +4<g.iv.length)throw new sjcl.exception.invalid("json encrypt: invalid parameters");"string"===typeof a?(f=sjcl.misc.cachedPbkdf2(a,g),a=f.key.slice(0,g.ks/32),g.salt=f.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.publicKey&&(f=a.kem(),g.kemtag=f.tag,a=f.key.slice(0,g.ks/32));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));"string"===typeof c&&(g.adata=c=sjcl.codec.utf8String.toBits(c));f=new sjcl.cipher[g.cipher](a);e.g(d,g);d.key=a;g.ct="ccm"===g.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&& +b instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.encrypt(f,b,g.iv,c,g.ts):sjcl.mode[g.mode].encrypt(f,b,g.iv,c,g.ts);return g},encrypt:function(a,b,c,d){var e=sjcl.json,g=e.ja.apply(e,arguments);return e.encode(g)},ia:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.g(e.g(e.g({},e.defaults),b),c,!0);var g,f;g=b.adata;"string"===typeof b.salt&&(b.salt=sjcl.codec.base64.toBits(b.salt));"string"===typeof b.iv&&(b.iv=sjcl.codec.base64.toBits(b.iv));if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||"string"=== +typeof a&&100>=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4<b.iv.length)throw new sjcl.exception.invalid("json decrypt: invalid parameters");"string"===typeof a?(f=sjcl.misc.cachedPbkdf2(a,b),a=f.key.slice(0,b.ks/32),b.salt=f.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.secretKey&&(a=a.unkem(sjcl.codec.base64.toBits(b.kemtag)).slice(0,b.ks/32));"string"===typeof g&&(g=sjcl.codec.utf8String.toBits(g));f=new sjcl.cipher[b.cipher](a);g="ccm"=== +b.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&b.ct instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.decrypt(f,b.ct,b.iv,b.tag,g,b.ts):sjcl.mode[b.mode].decrypt(f,b.ct,b.iv,g,b.ts);e.g(d,b);d.key=a;return 1===c.raw?g:sjcl.codec.utf8String.fromBits(g)},decrypt:function(a,b,c,d){var e=sjcl.json;return e.ia(a,e.decode(b),c,d)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+'"'+ +b+'":';d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],0)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!"); +null!=d[3]?b[d[2]]=parseInt(d[3],10):null!=d[4]?b[d[2]]=d[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4]):null!=d[5]&&(b[d[2]]="true"===d[5])}return b},g:function(a,b,c){void 0===a&&(a={});if(void 0===b)return a;for(var d in b)if(b.hasOwnProperty(d)){if(c&&void 0!==a[d]&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},sa:function(a,b){var c={},d;for(d in a)a.hasOwnProperty(d)&&a[d]!==b[d]&&(c[d]=a[d]);return c},ra:function(a, +b){var c={},d;for(d=0;d<b.length;d++)void 0!==a[b[d]]&&(c[b[d]]=a[b[d]]);return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.pa={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.pa,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=void 0===b.salt?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}}; diff --git a/test/bitArray_test.js b/test/bitArray_test.js new file mode 100644 index 0000000..bcf646f --- /dev/null +++ b/test/bitArray_test.js @@ -0,0 +1,115 @@ +(function() { + + function word2hex(w) { + return "0x" + ((w|0)+0xF00000000000).toString(16).substr(4); + } + + var b0 = sjcl.bitArray.partial(1, 0); + var b1 = sjcl.bitArray.partial(1, 1); + + function concatbits(s) { + var j, b, a = []; + for (j = 0; j < s.length; ++j) { + b = (s[j] == '1' ? b1 : b0); + a = sjcl.bitArray.concat(a, [b]); + } + return a; + } + + new sjcl.test.TestCase("bitArray single bits", function (cb) { + if (!sjcl.bitArray) { + this.unimplemented(); + cb && cb(); + return; + } + + this.require((b0|0) === (0x00000000|0), "bitstring '0': " + word2hex(b0)); + this.require((b1|0) === (0x80000000|0), "bitstring '1': " + word2hex(b1)); + + cb && cb(); + }); + + new sjcl.test.TestCase("bitArray concat small bitstrings", function (cb) { + if (!sjcl.bitArray) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat = sjcl.test.vector.bitArray.bits, tv, a, b, bitlen, t; + for (i=0; i<kat.length; i++) { + tv = kat[i]; + a = concatbits(tv[0]); + bitlen = sjcl.bitArray.bitLength(a); + t = "bitstring '" + tv[0] + "': "; + this.require(1 === a.length, t + "array length is 1: " + a.length); + this.require(bitlen === tv[0].length, t + "length " + bitlen + " matches input length " + tv[0].length); + b = sjcl.bitArray.partial(tv[0].length, tv[1]); + this.require(a[0] === b, t + "array matches shifted number: " + word2hex(a[0]) + " == " + word2hex(b)); + b = 0 | (a[0] >>> (32 - tv[0].length)); // unsigned shift, convert to signed word + this.require(b === (tv[1]|0), t + "array entry shifted is number: " + word2hex(b) + " == " + word2hex(tv[1])); + } + + cb && cb(); + }); + + + new sjcl.test.TestCase("bitArray concat, slicing, shifting and clamping", function (cb) { + if (!sjcl.bitArray) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, j, kat = sjcl.test.vector.bitArray.slices, tv, a, a1, b, bitlen, t; + for (i=0; i<kat.length; i++) { + tv = kat[i]; + a = []; + b = []; + + bitlen = 0; + for (j=0; j<tv[0].length; j++) { + b[j] = concatbits(tv[0][j]); + a = sjcl.bitArray.concat(a, b[j]); + bitlen += tv[0][j].length; + } + + // shift last array entry and set partial length on it + a1 = tv[1]; a1 = a1.slice(0, a1.length); + bitlen &= 31; + if (0 !== bitlen) a1[a1.length-1] = sjcl.bitArray.partial(bitlen, a1[a1.length-1]); + + this.require(sjcl.bitArray.equal(a, a1), "concat: [" + a + "] == [" + a1 + "]"); + + t = 0; + for (j=0; j<tv[0].length; j++) { + bitlen = sjcl.bitArray.bitLength(b[j]); + this.require(bitlen === tv[0][j].length, "bitstring length"); + a1 = sjcl.bitArray.bitSlice(a, t, t + bitlen); + this.require(sjcl.bitArray.equal(b[j], a1), "slice after concat: [" + b[j] + "] == [" + a1 + "]"); + t += bitlen; + } + } + + cb && cb(); + }); + + new sjcl.test.TestCase("bitArray byteswap", function (cb) { + if (!sjcl.bitArray) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat = sjcl.test.vector.bitArray.byteswap, tv, a; + for (i=0; i<kat.length; i++) { + tv = kat[i]; + + a = tv[1]; + this.require(sjcl.bitArray.equal(tv[0], sjcl.bitArray.byteswapM(a.slice(0, a.length)))); + } + + cb && cb(); + }); + +})(); diff --git a/test/bitArray_vectors.js b/test/bitArray_vectors.js new file mode 100644 index 0000000..8929fc6 --- /dev/null +++ b/test/bitArray_vectors.js @@ -0,0 +1,163 @@ +sjcl.test.vector.bitArray = {}; + +// random test cases generated with ruby String#to_i(radix) and Fixnum#to_s(radix) + +// bitstrings (<= 32 bits) encoding a number +sjcl.test.vector.bitArray.bits = [ +[ "00" , 0|0x0 ], +[ "01" , 0|0x1 ], +[ "10" , 0|0x2 ], +[ "11" , 0|0x3 ], +[ "000" , 0|0x0 ], +[ "011" , 0|0x3 ], +[ "101" , 0|0x5 ], +[ "110" , 0|0x6 ], +[ "0100" , 0|0x4 ], +[ "0101" , 0|0x5 ], +[ "1000" , 0|0x8 ], +[ "1100" , 0|0xc ], +[ "00101" , 0|0x5 ], +[ "01010" , 0|0xa ], +[ "10011" , 0|0x13 ], +[ "11010" , 0|0x1a ], +[ "001100" , 0|0xc ], +[ "001110" , 0|0xe ], +[ "010100" , 0|0x14 ], +[ "100111" , 0|0x27 ], +[ "0001011" , 0|0xb ], +[ "0001101" , 0|0xd ], +[ "1000100" , 0|0x44 ], +[ "1101011" , 0|0x6b ], +[ "00100001" , 0|0x21 ], +[ "00100111" , 0|0x27 ], +[ "00101000" , 0|0x28 ], +[ "10101111" , 0|0xaf ], +[ "000100000" , 0|0x20 ], +[ "100100011" , 0|0x123 ], +[ "100111001" , 0|0x139 ], +[ "111010011" , 0|0x1d3 ], +[ "0001001011" , 0|0x4b ], +[ "0001100110" , 0|0x66 ], +[ "0010110111" , 0|0xb7 ], +[ "1011101111" , 0|0x2ef ], +[ "01000010110" , 0|0x216 ], +[ "01001101000" , 0|0x268 ], +[ "10111101001" , 0|0x5e9 ], +[ "11111100000" , 0|0x7e0 ], +[ "000101010001" , 0|0x151 ], +[ "010101111111" , 0|0x57f ], +[ "101010001110" , 0|0xa8e ], +[ "110101100010" , 0|0xd62 ], +[ "0010001111010" , 0|0x47a ], +[ "1000000001100" , 0|0x100c ], +[ "1100011000000" , 0|0x18c0 ], +[ "1110011000011" , 0|0x1cc3 ], +[ "00111101111110" , 0|0xf7e ], +[ "01101011001001" , 0|0x1ac9 ], +[ "10111000111101" , 0|0x2e3d ], +[ "11101010011110" , 0|0x3a9e ], +[ "010111101010110" , 0|0x2f56 ], +[ "100011010110000" , 0|0x46b0 ], +[ "110001001100100" , 0|0x6264 ], +[ "111011000100110" , 0|0x7626 ], +[ "0100101111001100" , 0|0x4bcc ], +[ "1000000001101100" , 0|0x806c ], +[ "1001000100110110" , 0|0x9136 ], +[ "1101010000100011" , 0|0xd423 ], +[ "01001001001101110" , 0|0x926e ], +[ "01111001111000010" , 0|0xf3c2 ], +[ "10011011011000011" , 0|0x136c3 ], +[ "10101011001110000" , 0|0x15670 ], +[ "010000000101000110" , 0|0x10146 ], +[ "011000100101110001" , 0|0x18971 ], +[ "101100100110110111" , 0|0x2c9b7 ], +[ "101110100100101111" , 0|0x2e92f ], +[ "0010101100101000000" , 0|0x15940 ], +[ "1011010010000101010" , 0|0x5a42a ], +[ "1011100111011011000" , 0|0x5ced8 ], +[ "1111011110011111110" , 0|0x7bcfe ], +[ "00101000011011111111" , 0|0x286ff ], +[ "01111001100011000100" , 0|0x798c4 ], +[ "11111001001110101011" , 0|0xf93ab ], +[ "11111001111001101001" , 0|0xf9e69 ], +[ "000110100000110010101" , 0|0x34195 ], +[ "011110000101101101111" , 0|0xf0b6f ], +[ "101111010011001100110" , 0|0x17a666 ], +[ "111101001011110010001" , 0|0x1e9791 ], +[ "1001111100011011100001" , 0|0x27c6e1 ], +[ "1011110101000101010110" , 0|0x2f5156 ], +[ "1100000100011110001011" , 0|0x30478b ], +[ "1100001010010110111111" , 0|0x30a5bf ], +[ "01001111001101000111101" , 0|0x279a3d ], +[ "10110011101111110000001" , 0|0x59df81 ], +[ "11000001101100110100011" , 0|0x60d9a3 ], +[ "11011000010110110010110" , 0|0x6c2d96 ], +[ "010011110100100110010100" , 0|0x4f4994 ], +[ "011101110001100111111110" , 0|0x7719fe ], +[ "011110001010011011100011" , 0|0x78a6e3 ], +[ "111100010001011101111110" , 0|0xf1177e ], +[ "0010110000010110001000010" , 0|0x582c42 ], +[ "0100100011001001101110000" , 0|0x919370 ], +[ "1000111001010110111010110" , 0|0x11cadd6 ], +[ "1111001100101000010010101" , 0|0x1e65095 ], +[ "00110010011100010101111111" , 0|0xc9c57f ], +[ "00111101011011010100111110" , 0|0xf5b53e ], +[ "01100000111011111010011100" , 0|0x183be9c ], +[ "11010001100110101111010111" , 0|0x3466bd7 ], +[ "010000001111100110000110011" , 0|0x207cc33 ], +[ "011010010000110000101011111" , 0|0x348615f ], +[ "011010110001110110001110010" , 0|0x358ec72 ], +[ "110110100001001001001110000" , 0|0x6d09270 ], +[ "0101000000000001000011100101" , 0|0x50010e5 ], +[ "0110011001001100011111111100" , 0|0x664c7fc ], +[ "1001011010000001100110111101" , 0|0x96819bd ], +[ "1011011101000000111000000010" , 0|0xb740e02 ], +[ "00100111111011011111010101101" , 0|0x4fdbead ], +[ "00110000011001110110101110010" , 0|0x60ced72 ], +[ "10111110111000010010010111101" , 0|0x17dc24bd ], +[ "11010001000001110010101000010" , 0|0x1a20e542 ], +[ "001001010001010111111101010111" , 0|0x9457f57 ], +[ "100110011101100000110111111010" , 0|0x26760dfa ], +[ "100111000100011001010011111011" , 0|0x271194fb ], +[ "111011110110101110110111010101" , 0|0x3bdaedd5 ], +[ "0111100111010100101010000111100" , 0|0x3cea543c ], +[ "1000010011010100111001110000100" , 0|0x426a7384 ], +[ "1001110000000100001011010001010" , 0|0x4e02168a ], +[ "1101000000000110110010011010100" , 0|0x680364d4 ], +[ "00000011100100001011101011100111", 0|0x390bae7 ], +[ "10011110110111111000010010010011", 0|0x9edf8493 ], +[ "11000101100000110001011010111100", 0|0xc58316bc ], +[ "11111010101110011001010001011000", 0|0xfab99458 ] +]; + +// concat some bitstrings into an array (the last array entry here is not "high" shifted yet) +sjcl.test.vector.bitArray.slices = [ +// lengths: 17, 16, 15, 14, 13 +[ ["00100010111010110", "0010000111100001", "101111111100010", "10111011110000", "1100100100001" ], [0|0x22eb10f0, 0|0xdfe2bbc3, 0|0x121] ], +[ ["00001010100110010", "0000100011110001", "111110101100100", "10110111000101", "0000100111011" ], [0|0x0a990478, 0|0xfd64b714, 0|0x13b] ], +[ ["10110101101100001", "0000110110010100", "110100011010100", "01011010010111", "0101101011011" ], [0|0xb5b086ca, 0|0x68d45a5d, 0|0x35b] ], +[ ["01010010001010110", "1110010000100111", "001010110101110", "10110111101000", "0100000010100" ], [0|0x522b7213, 0|0x95aeb7a1, 0|0x014] ], +[ ["10011001001100110", "0100100011100010", "000110011001001", "00101101101000", "0001111101100" ], [0|0x99332471, 0|0x0cc92da0, 0|0x3ec] ], +[ ["01111100000110000", "1000101001000010", "110101001111111", "01001010110110", "0111100000001" ], [0|0x7c184521, 0|0x6a7f4ad9, 0|0x701] ], +[ ["00110011010100110", "0100101101110000", "110101110100100", "00111010010110", "0110011011100" ], [0|0x335325b8, 0|0x6ba43a59, 0|0x4dc] ], +[ ["11111110011100100", "1111101001010011", "001000100110010", "01101101100001", "0001011101011" ], [0|0xfe727d29, 0|0x91326d84, 0|0x2eb] ], +[ ["00100011001001000", "1001010100000100", "010111001100111", "11011111000000", "0100111101110" ], [0|0x23244a82, 0|0x2e67df01, 0|0x1ee] ], +[ ["10111111100000010", "0111110011010001", "001000101001110", "11101010011001", "0101111101110" ], [0|0xbf813e68, 0|0x914eea65, 0|0x3ee] ], +// lengths: 17, 15, 32, 10, 20 +[ ["00001111000110001", "110100011111001", "10010110001110010011011000011111", "1001101101", "01110010001111001110" ], [0|0x0f18e8f9, 0|0x9639361f, 0|0x26d723ce] ], +[ ["11011111010101100", "101010100101100", "11101101011001011011010111101011", "0010110010", "11110011110110000010" ], [0|0xdf56552c, 0|0xed65b5eb, 0|0x0b2f3d82] ], +[ ["10100100001000101", "100111001100011", "00111100101000110010000011101001", "1001110001", "11000000001111111110" ], [0|0xa422ce63, 0|0x3ca320e9, 0|0x271c03fe] ], +[ ["01110001111111010", "000101001101110", "00001100011010100100001011111001", "1011111010", "00011001110111111001" ], [0|0x71fd0a6e, 0|0x0c6a42f9, 0|0x2fa19df9] ], +[ ["01001100010011001", "000111011000100", "10100000110101110110011110001100", "0011000001", "11001101010101011100" ], [0|0x4c4c8ec4, 0|0xa0d7678c, 0|0x0c1cd55c] ], +[ ["01010010100110110", "110111110001000", "10011100001100010100000110000000", "1100111101", "00010001110100111101" ], [0|0x529b6f88, 0|0x9c314180, 0|0x33d11d3d] ], +[ ["11010100011101101", "110101011011010", "01000110000011001111101110100001", "0001001110", "01001100010010001010" ], [0|0xd476eada, 0|0x460cfba1, 0|0x04e4c48a] ], +[ ["11000001010001101", "001111011110111", "10000010100111010111011000100001", "0011000011", "11011110110000101000" ], [0|0xc1469ef7, 0|0x829d7621, 0|0x0c3dec28] ], +[ ["11000101100010100", "000110111111110", "11111011110010001100001100010000", "0000101010", "10000011010011100011" ], [0|0xc58a0dfe, 0|0xfbc8c310, 0|0x02a834e3] ], +[ ["11111111110100101", "110101000011001", "10101010010100111010100010110100", "0010011000", "10100110001000000010" ], [0|0xffd2ea19, 0|0xaa53a8b4, 0|0x098a6202] ] +]; + +sjcl.test.vector.bitArray.byteswap = [ + [ [ 0xdab1a44e, 0x73fdc3de, 0xed6e6f00, 0x5d221b85, 0xadb987a4, 0xc20eda76, 0xa0d40d0c, 0xd1da9657, 0xd85eebf0, 0xd3f9c06d, 0xca1e39b0, 0xccd7eaeb, 0xb1dd6bd0, 0x7315a9e6, 0x77cfcac4, 0xf7914c19, 0x1bc15354, 0x935afabc, 0x3ee9d375, 0xd18a095f] + , [ 0x4ea4b1da, 0xdec3fd73, 0x006f6eed, 0x851b225d, 0xa487b9ad, 0x76da0ec2, 0x0c0dd4a0, 0x5796dad1, 0xf0eb5ed8, 0x6dc0f9d3, 0xb0391eca, 0xebead7cc, 0xd06bddb1, 0xe6a91573, 0xc4cacf77, 0x194c91f7, 0x5453c11b, 0xbcfa5a93, 0x75d3e93e, 0x5f098ad1] + ] +]; diff --git a/test/bn_test.js b/test/bn_test.js index 7756b30..a669991 100644 --- a/test/bn_test.js +++ b/test/bn_test.js @@ -65,3 +65,14 @@ new sjcl.test.TestCase("Bignum modular exponentiation test", function (cb) { } cb && cb(); }); + +new sjcl.test.TestCase("Bignum toString test", function (cb) { + if (!sjcl.bn) { + this.unimplemented(); + cb && cb(); + return; + } + this.require((new sjcl.bn(12312434)).power(10).toString() === + '0xb99c06973dcc72429aa1dd41b0bc40a424289a05d3d72f066ee4e71c400'); + cb && cb(); +}); diff --git a/test/bn_vectors.js b/test/bn_vectors.js index 3dd5a3b..c375388 100644 --- a/test/bn_vectors.js +++ b/test/bn_vectors.js @@ -72,14 +72,11 @@ sjcl.test.vector.bn_powermod = [ x: "89457115510016156219817846189181057618965150496979174671534084187", N: "1897166415676096761", v: "16840615e646a4c5c8d" - }//, - // // This was disabled because it's slow (~2.5s with `rhino -O 9`). Once - // // a better powermod algorithm is implemented (e.g., using Montgomery - // // reduction), this can be re-enabled. - // { - // g: 2, - // x: "eeaf0ab9adb3008dd6c314c9c25600057674df692c0006e0d5d8e2050b98be48e4", - // N: "b48130d6e07674df740e1d33b4816e0d5d8e20e2050b98be48e457674df74096ea", - // v: "9c3219b694befb9caac51a13eb1ac7053b02c654b6a0541cfa60c483592d478630" - // } + }, + { + g: 2, + x: "eeaf0ab9adb3008dd6c314c9c25600057674df692c0006e0d5d8e2050b98be48e4", + N: "b48130d6e07674df740e1d33b4816e0d5d8e20e2050b98be48e457674df74096ea", + v: "9c3219b694befb9caac51a13eb1ac7053b02c654b6a0541cfa60c483592d478630" + } ] diff --git a/test/ccm_arraybuffer_test.js b/test/ccm_arraybuffer_test.js new file mode 100644 index 0000000..65a288e --- /dev/null +++ b/test/ccm_arraybuffer_test.js @@ -0,0 +1,31 @@ +new sjcl.test.TestCase("CCM arrayBuffer tests", function (cb) { + if (!sjcl.cipher.aes || !sjcl.mode.ccm || !sjcl.arrayBuffer) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat = sjcl.test.vector.ccm, tv, iv, ct, aes, len, tlen, thiz=this, w=sjcl.bitArray, pt, h=sjcl.codec.hex, ad; + browserUtil.cpsIterate(function (j, cbb) { + for (i=100*j; i<kat.length && i<100*(j+1); i++) { + tv = kat[i]; + len = 32 * tv.key.length; + aes = new sjcl.cipher.aes(h.toBits(tv.key)); + + // Convert from strings + iv = h.toBits(tv.iv); + ad = h.toBits(tv.adata); + pt = h.toBits(tv.pt); + ct = h.toBits(tv.ct + tv.tag); + tlen = tv.tag.length * 4; + + thiz.require(w.equal(sjcl.arrayBuffer.ccm.compat_encrypt(aes, pt, iv, ad, tlen), ct), "aes-"+len+"-ccm-encrypt #"+i); + try { + thiz.require(w.equal(sjcl.arrayBuffer.ccm.compat_decrypt(aes, ct, iv, ad, tlen), pt), "aes-"+len+"-ccm-decrypt #"+i); + } catch (e) { + thiz.fail("aes-ccm-decrypt #"+i+" (exn "+e+")"); + } + } + cbb(); + }, 0, kat.length / 100, true, cb); +}); diff --git a/test/codec_arraybuffer_test.js b/test/codec_arraybuffer_test.js new file mode 100644 index 0000000..a88f518 --- /dev/null +++ b/test/codec_arraybuffer_test.js @@ -0,0 +1,37 @@ +new sjcl.test.TestCase("arrayBuffer codec tests", function (cb) { + if (!sjcl.codec.arrayBuffer) { + this.unimplemented(); + cb && cb(); + return; + } + + var test_bytes = []; + + var zeropad_hex = function(number){ + var hex = number.toString(16); + while ( hex.length%2 != 0 ){ + hex = "0"+hex; + } + return hex; + }; + + + for (var i = 0; i <= 0xffff; i++){ + test_bytes.push(zeropad_hex(i)); + } + + var that = this; + + test_bytes.map(function(test_byte, index){ + var bitArray = sjcl.codec.hex.toBits(test_byte), + arrayBuffer = sjcl.codec.arrayBuffer.fromBits(bitArray, false), + roundTripArrayBuffer = sjcl.codec.arrayBuffer.toBits(arrayBuffer), + roundTripHex = sjcl.codec.hex.fromBits(roundTripArrayBuffer); + + if (roundTripHex !== test_byte){ + that.fail("Failed test, expected " + roundTripHex + "to be" + test_byte + "(at: " + i + ")"); + } + }); + + cb(); +});
\ No newline at end of file diff --git a/test/ecc_conv.js b/test/ecc_conv.js new file mode 100644 index 0000000..fcc9f3f --- /dev/null +++ b/test/ecc_conv.js @@ -0,0 +1,33 @@ +new sjcl.test.TestCase("ECC convenience test", function (cb) { + if (!sjcl.ecc) { + this.unimplemented(); + cb && cb(); + return; + } + + try { + // Uses hard-coded randomness just to give the test something to work with. + // This isn't how this is supposed to be used in the real world. + var random = [ -625324409, + -1863172196, + -1745409890, + -1513341554, + 1970821986, + -532843769, + -200096675, + -1271344660 ]; + + sjcl.random.addEntropy(random, 8 * 4 * random.length, "crypto.randomBytes") + + var keys = sjcl.ecc.elGamal.generateKeys(192,0); + + var ciphertext = sjcl.encrypt(keys.pub, "hello world"); + var plaintext = sjcl.decrypt(keys.sec, ciphertext); + + this.require(plaintext == "hello world"); + } catch(e) { + console.log(e.stack) + this.fail(e); + } + cb && cb(); +}); diff --git a/test/ecdsa_test.js b/test/ecdsa_test.js index e305374..bcf3dca 100644 --- a/test/ecdsa_test.js +++ b/test/ecdsa_test.js @@ -1,4 +1,4 @@ -new sjcl.test.TestCase("ECSA test", function (cb) { +new sjcl.test.TestCase("ECDSA test", function (cb) { if (!sjcl.ecc) { this.unimplemented(); cb && cb(); @@ -24,6 +24,80 @@ new sjcl.test.TestCase("ECSA test", function (cb) { } catch (e) { this.pass("bad message accepted"); } + + // Run through the test vectors + for (var key in sjcl.test.vector.ecdsa) { + var match = /^p(\d+)sha(\d+)/.exec(key); + var curvenum = parseInt(match[1]); + var shanum = parseInt(match[2]); + + var vectors = sjcl.test.vector.ecdsa[key]; + var curve = sjcl.ecc.curves['c'+curvenum]; + var sha = sjcl.hash['sha'+shanum]; + if (!sha) continue; + + var h = sjcl.codec.hex; + var ba = sjcl.bitArray; + var bn = sjcl.bn; + + for (var i=0; i<vectors.length; i++) { + var msgbits = h.toBits(vectors[i].msg); + var d = bn.fromBits(h.toBits(vectors[i].d)); + var x = bn.fromBits(h.toBits(vectors[i].Qx)); + var y = bn.fromBits(h.toBits(vectors[i].Qy)); + var k = bn.fromBits(h.toBits(vectors[i].k)); + var r = bn.fromBits(h.toBits(vectors[i].R)); + var s = bn.fromBits(h.toBits(vectors[i].S)); + + keys = sjcl.ecc.ecdsa.generateKeys(curvenum,0,d); + var pub = keys.pub; + var sec = keys.sec; + + // verify generated x and y + var genx = bn.fromBits(pub.get().x); + var geny = bn.fromBits(pub.get().y); + this.require(x.equals(genx)); + this.require(y.equals(geny)); + + // sign + try { + hash = sha.hash(msgbits); + var sig = sec.sign(hash,0,0,k); + siglen = ba.bitLength(sig); + var genr = bn.fromBits(ba.bitSlice(sig, 0, siglen/2)); + var gens = bn.fromBits(ba.bitSlice(sig, siglen/2, siglen)); + + this.require(genr.equals(r)); + this.require(gens.equals(s)); + } catch (e) { + this.fail("error signing!"); + } + + // verify signature + try { + pub.verify(hash, sig); + this.pass(); + } catch (e) { + this.fail(); + } + } + + // sign legacy style + try { + hash = sha.hash(msgbits); + var sig = sec.sign(hash,0,1); + pub.verify(hash, sig); + pub.verify(hash, sig, 1); + try { + pub.verify(hash, sig, 0); + this.fail(); + } catch (ee) { + this.pass(); + } + } catch (e) { + this.fail(e); + } + } cb && cb(); }); diff --git a/test/ecdsa_vectors.js b/test/ecdsa_vectors.js new file mode 100644 index 0000000..1254432 --- /dev/null +++ b/test/ecdsa_vectors.js @@ -0,0 +1,1120 @@ +/* Official ECDSA test vectors. + * + * Source: + * http://csrc.nist.gov/groups/STM/cavp/index.html + * http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip + */ + +sjcl.test.vector.ecdsa = { + "p192sha1" : [ + { + msg: "ebf748d748ebbca7d29fb473698a6e6b4fb10c865d4af024cc39ae3df3464ba4f1d6d40f32bf9618a91bb5986fa1a2af048a0e14dc51e5267eb05e127d689d0ac6f1a7f156ce066316b971cc7a11d0fd7a2093e27cf2d08727a4e6748cc32fd59c7810c5b9019df21cdcc0bca432c0a3eed0785387508877114359cee4a071cf", + d: "e14f37b3d1374ff8b03f41b9b3fdd2f0ebccf275d660d7f3", + Qx: "07008ea40b08dbe76432096e80a2494c94982d2d5bcf98e6", + Qy: "76fab681d00b414ea636ba215de26d98c41bd7f2e4d65477", + k: "cb0abc7043a10783684556fb12c4154d57bc31a289685f25", + R: "6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e", + S: "02ba6465a234903744ab02bc8521405b73cf5fc00e1a9f41" + }, + { + msg: "0dcb3e96d77ee64e9d0a350d31563d525755fc675f0c833504e83fc69c030181b42fe80c378e86274a93922c570d54a7a358c05755ec3ae91928e02236e81b43e596e4ccbf6a9104889c388072bec4e1faeae11fe4eb24fa4f9573560dcf2e3abc703c526d46d502c7a7222583431cc8178354ae7dbb84e3479917707bce0968", + d: "7a0235bea3d70445f14d56f9b7fb80ec8ff4eb2f76865244", + Qx: "0ea3c1fa1f124f26530cbfddeb831eecc67df31e08889d1d", + Qy: "7215a0cce0501b47903bd8fe1179c2dfe07bd076f89f5225", + k: "3c646b0f03f5575e5fd463d4319817ce8bd3022eaf551cef", + R: "a3ba51c39c43991d87dff0f34d0bec7c883299e04f60f95e", + S: "8a7f9c59c6d65ad390e4c19636ba92b53be5d0f848b4e1f7" + }, + { + msg: "9408392847e3a387307fbc6789669974fbdaa49b5f2bd5510895105a11dff9c1caab7e327cec80c281e3d9ff13b9e37bbbd2342da7543733bff9aabbfeacc75a40c75a2c5d2b159290428761b64689e5d51224da41da22482c95965422946a644a8becec98f55f1403f23dc794ee889bf02eb7d833f4d465713201e8460a66ce", + d: "e16f2aaee2aec553ecd538367a03c3d72bfcc5c7ab4d4ca0", + Qx: "44e1499e104bf04262aebd26ebad3b3a4980af03c5224b0e", + Qy: "5c2214b22bb07187e1fbe2728ac9f667277c6645fc5d3392", + k: "aed61c2dacf8aff0e85c0c5f8f4daa19bdcea7f5ee33027c", + R: "7fd327a0e6ef4c27b09483818fd784f569f97e6c979a4f31", + S: "95a1db7b13790e2205dfdb81c2da97bb9bc3d7dd3dd0d91a" + }, + { + msg: "76f5eea4ad9d8028542b712a26f37151fd2bbb44f28520d19a3ba4ab919877f24095f9a77a0c7e66388394605241690acc151c283e53de22cfabe7a983a532a4870be28d77c215e244350aa4ad4ccc73c2e098d1f0fc4ceda2d5a23c265cc26312eb6532b5694f1fbd2af32121f41e3cba07d27389bf54a76803dfa6795e286e", + d: "2a004cbd89d7a6cbe2c39e362fb537845b19cd6c50e08527", + Qx: "e6135a418ede8adbb685b08294cc274ce08a3dcdacac7fd4", + Qy: "c0c4fffed855aec46fd95ad4c4a15a17659d2cacd2a8ba03", + k: "7bdd329bb76fe8045bc86851b1dcff3c96363c8b07bbfca8", + R: "de556e8d15a5e1e7d318c7051341ac0dc6698950b8c5b859", + S: "8f36c906d66cb47388b09343129dc29176469db84ddd8d95" + }, + { + msg: "5d26f9e60babc8ea6338c51610c06450d27378487afd041ab63c01f9c659618f0d5fc3b5c3253b17b77fec62f4dbe8cd2fd7eb67dfdaaa2cc217c603837c9edb717967ee5ec43b32da94d5aaea4508837cb90d7916844aa7ca93cf0a12feaf0378f7bb773730410bfc42f8b52bdab39076e584b24f9891c53fed8a990a356a50", + d: "6019413d76958e73e6ba530192f4851097b5ce075e1db438", + Qx: "20c1007a371c147edfc59207611fb6d5542b0136d9e14f80", + Qy: "1608c763e6b93361ee0462e308e956cf27cea603fd8ebc11", + k: "372cb07b0e19db159ed5594b75c21d9f1b9647a2f475eb2f", + R: "79256149f44a11515d91b470aab4be1f252927f5df0dd84b", + S: "cc2a17eddfc48db85f449f0fd72cff5e304febeffe670889" + }, + { + msg: "dfca280be57fe107874436c23e4c7343dd909e75eaa8418e9429453ac2d000aeed475c8fcec17e424232ba7a2470362d62d52eaf38e9a3a2193f4c61152e3602482448a9d280ac560e57dc26c37262307124c4621b4556b08684c5bc9aaa98a9f57dfe5c2a4d146f09410aa10c55aa48c70850e96c42e368c455d97b5695438a", + d: "3ebdf68ae0d42d48838f042aecff7ebbdf387ad82bfd3501", + Qx: "f81eee98efa4361a351e08e9d2abc4083541b2f10f4457f5", + Qy: "5af7894ba266997943dbee8a4d6e5679713776e7e07a0a2d", + k: "eab771d6dbec1687a464abaab925d799a84468709af69714", + R: "0215f1173796e6a61ea99b8d91319a29c3539fc312ad57a8", + S: "8f22035e01ddb27e1a2ae824461d858b99748d455d3332ab" + }, + { + msg: "f13d5607ca5b1e94bb9f2d8e927acca7d9a8a682043b707e68c77cae82fcc6fbf2c17cfd24d0425582d430ecf16f413e5d3d54d1124aa1b8b0d7a144598e736470dcdb0929eaa8911acabf359c72ea588987d6a60394ea98ef2edb182b77f34bd6252b00326bb723e6d1c6bbde85ea4c824e49e716ee7ee4380eae845aba8ae1", + d: "0ff956a1d81ab1f5c8a2e87340a2429d4b9b3cec54c58944", + Qx: "15a2805a6195f176c6b32826bd92674f64373565f68e91c8", + Qy: "25e9e9e7145d331654ef357af1fcf45b8ca350a3853b2b99", + k: "efc787869f6be3a130f59803e5cd751167de4e851449f2d0", + R: "b5de4fdf1a0e0d59197720a549eb0ef52a49649f1a70f050", + S: "683e32589d61512acf24201a0fe8b2f4569d953803f55e35" + }, + { + msg: "c45b6b1b2a1ac262012543982d4bb8b6def39e26bf7555aaaf5674c9e72a59c088887f2a9cdf9088cd17b2d739cba152d13464bc69b974d3ea1f56a755aaf4c3d97838aee2953c9c501b2d5d7ee8b702f71b251856d708eb914344746ad487b32aac0d26e67033330745164ef67fd01758aa56e257cf84418a82c50716b8750e", + d: "f310bd616126225ddf94fb886b62f894585619365aba1317", + Qx: "fc044c1dc333da8ec98e6598ffaef60e5b230d098102791a", + Qy: "8e76c0c9a17d292e1aee839766ebcc6ed7b83330d29b8858", + k: "017448988e6169673975943a6d2de804741d4e8ac16f1545", + R: "08975a982c05da87ba46ae400ac47b017aa7a82d9a6a8069", + S: "4ec2b5db62bd287b2ca1ead38e52c36ae03762196848a36a" + }, + { + msg: "5b704ad725a178d018165a84947b10f1362adad79198fab15f27f5c973815ddbee53460e158c8cb5506df51b9db21344d4552f311150b507b5bf07c4379016881a4919122ac42bc42bfda78670869f929e3e23f96648493f88744c3972b4e9aab56d12c68bc0a1dd38d447fa09e8acf04df810b889ad0ad789ca2fa43cd9ea05", + d: "63cd3c5af5d24d2f79f43a4b07a21191c7fc5ff5e1704713", + Qx: "b6e6015c995f75aa0a1533e8023a367a04143f153632956b", + Qy: "54331ecd90c8897fc0f831c4443fb08d948fb67ac6ff89d4", + k: "9f32e05576c3ab9dd2d0cdf30d2c3e4995e27b5102d98c59", + R: "edb1ff080df6374a3222103d081f4dbbdc50a4028a5595f0", + S: "ecbb3f470175c9bf1085237661263efaad3a177423865b6b" + }, + { + msg: "ac43f3a921e0adef1caacbecaadb9ddeeb53cb88616697121a99c0ab0e42009b16678fad2e1e007942b27ffe9df0e046cd9d1d73d602a5bebb64e25602020e6d94d8ee6a71ad0ef5098f741e0468c191416cc67d1f2995f36b7fd20aa881570e0be3f1f7e42279f3164da8a9fff1d9e4f79b8537a42402548afbd47b87c93e6c", + d: "e4bce33ca654556851e4d6abf5730c54f8006076261f21dd", + Qx: "d8b51224389f335fda34681fc4844885ee5138b7ab3d4c0c", + Qy: "82564d8c3e10f349d9ba928eb5f760a44935e061f8324ab0", + k: "df31b5371d6f6dadc1f6e752d23dcf748c424b7b27f4ebc8", + R: "8856b1451f0ff744aba86e9e567be739f0715eaaf5a54402", + S: "320005598a5d26f18ffd188b34a1680ab7f08aa3834a782a" + }, + { + msg: "3497eedbc30525fa62397088127d998570dc839e0cf217cf71751126c8b16ce87b11e5d8f83e11ca4c606c1f90abc5975854a1303a8ce8bafa4bf190f19bc2028f35f81a7cb1e1e460f31007966cb5492f2298a484ed319a017e09e5086315bbdc01b05c3f88f1702b82244623d04765da58a3009e67d7025fe650e4cf915e0e", + d: "42e9997dde0d1b11ec8fd0ff4a01d0b7123deb08b49aa8df", + Qx: "c26576a6e2a9ed348245483afc8e0d925f1104ebf8a014d7", + Qy: "540f780769b6a755d8c7de0c2675c4f4853ab64a172574be", + k: "f360d85503c5ff5c7a28d5a2ead13c5f6278e5781ef91296", + R: "9b32f6142c028867f3026fe6c38dad560fd30834dcef7624", + S: "326c5087d54fcfb7a76820489adcf7c14916577120253940" + }, + { + msg: "60e06e0096e10b1b89736ed6c9473a8dee2a69c973830f14497ebf364518843ddfb3bb7acde381805102462e9c2b10151f12a8d5a96e6e6dfaf82deb935c17baa2a9a54c5091d962494b4c515d8934d1f881a9f0c9d687897307cfbd7686afab23f308dddd5ba30a0c9e63656355cfe5ad10394311aa66907f5bd9fde1582849", + d: "a4b8b72bda49d4b607c73c6765088e0ae8c7445bfd98163b", + Qx: "edfdc0a324a07bc9e0640ab3b33d8cb4d32bb8d673fe0c9f", + Qy: "7ec3731330b192fc97c279c4785fa5af0084e3f2e94602aa", + k: "c525c24f10e83f0f110597af62d0eaf50426b82bf7b74dd9", + R: "b513b40e9f6d7069b58a1bba95a65f5be65ea9a744629c29", + S: "caf5a7fdfee32dee5945cbf189b6f3028800ac7fd1cf2342" + }, + { + msg: "f7322577fa79a67b7057cd23dfd7dd47bad340beecf0ba9c1c88792c7fead99f4c9cfb4f37ef1a35ad61dcb733bc55cb9d80539c5d904ead03be0520a6f50b75e1032595cd30d9b2c20a733a9f4dc9af72c9886f6add1253d736575e62027e74910750c5bc6621daf5e22140484857daabdd8243b158ad1d4f03582c11f44268", + d: "47f1a1abb180378e2e0a69b8f1c5fb3f4b20a0604465d61c", + Qx: "2de12115512085dc58d092e26d1b5c16e4964c811c85aeaf", + Qy: "3b5ab809bbfe4096d1a1977c84b5ef507ac81bde2123e063", + k: "c7506b4fe3ed0739244d985d53c4f5a5a4013d4b449d3121", + R: "9b4a02fde706a17495fced71a15c9e73fb4ab55a38572799", + S: "7932dfd21e2b82db2ce8a2939c5ce7b870cb838be4a98066" + }, + { + msg: "1a359e77397e22c9a6b896c89d74a216ef0ad5e32100e1b0d14960e6541f5077384e07a744b48a15fdb0e32804f012f3a8abbacd8beabc06457dc2eb24623af4293cecd4e201a39d3f3440dca9005113f66e71e7b6ddb74835481f30f09bc0c3c34c47bc61a60f37dce2c97dbfa5611fd292896ba1fad18c56d1b21d51c37743", + d: "92dbfd711170c0064c3644a55165fc7253905cbc9aab85d4", + Qx: "b330e90f795624ebc91ff56148c9ac60db7e227e1f70c823", + Qy: "30829cca9d817123bb2d2acf4c21c01ef126203cf4ad28f5", + k: "77229ee70de79d2eb5b71ae6844b1e0745c5f679af040f39", + R: "e780dd8222297b25ff6b3228b7e0c2b46fc5fe4454020894", + S: "47eb9f182021e8d55ee23c300a1283a136738ad02b8e9fbf" + }, + { + msg: "abfd6a51193fe2f4bc69ed658adb102a86b58e39bdb9b88539f1b910461c47997d15ac507f416b8cea3705b96ad4d5ddb2278504a79c8447c8e82a4a19e8b1bc6f8bc2df945daca2c5a6d676be30be198054d8c92a1df624fec6aaa81d4208f5a36c27ed05038e344154d6d7c94ef341d6ae7be205212fef9d442d7ac8f98e32", + d: "27c1fe2d6dd9ade057b52ea08983d4373389b794776033e2", + Qx: "bddc76139445c9aa10f41fa20e4988ef21d72cf0c4e4a7f0", + Qy: "d3c29be5dee5798e925818ac1d5f087ac7a624f7237fe922", + k: "056925acf8b40b6b9b1cb33211f71cb7b6fddb88b893cb95", + R: "8ef40136fef6ca89d2bf4483c2b3a9f7e99e0dcf8223adcb", + S: "eddbc4c433bcb59354a54ac1f275a192175429e382eed9ca" + } + ], + /* Disabled since computed S values don't match */ + "p192sha256" : [ + { + msg: "5c868fedb8026979ebd26f1ba07c27eedf4ff6d10443505a96ecaf21ba8c4f0937b3cd23ffdc3dd429d4cd1905fb8dbcceeff1350020e18b58d2ba70887baa3a9b783ad30d3fbf210331cdd7df8d77defa398cdacdfc2e359c7ba4cae46bb74401deb417f8b912a1aa966aeeba9c39c7dd22479ae2b30719dca2f2206c5eb4b7", + d: "24edd22f7ddd6fa5bc61fc0653479aa40809ef865cf27a47", + Qx: "9bf12d7174b7708a076a38bc80aa28662f251e2ed8d414dc", + Qy: "4854c8d07dfc08824e9e471ca2fedcfcff3ddcb011573498", + k: "a5c817a236a5f7faa329b8ecc3c596687c71aaaf86c7703e", + R: "354abaecf4361fea90c29b9199882edf8573e686a813eff8", + S: "80f50000ac86111c9b3047385a15d78e632c58b7949e82c1" + }, + { + msg: "17cd4a74d724d55355b6fb2b0759ca095298e3fd1856b87ca1cb2df5409058022736d21be071d820b16dfc441be97fbcea5df787edc886e759475469e2128b22f26b82ca993be6695ab190e673285d561d3b6d42fcc1edd6d12db12dcda0823e9d6079e7bc5ff54cd452dad308d52a15ce9c7edd6ef3dad6a27becd8e001e80f", + d: "e586581cf94fc8be2b9316aee98b42d9d3f446153019f297", + Qx: "6fe0202a08d773cf07ece7b14335a8e4943f5662a906718a", + Qy: "98afcacaa5ca89a3a645156234b3b463496c4414ef7198fa", + k: "06575ab99793a044f67597c43088749723ac7ef65ee3011d", + R: "43e4113f185064fc46a4d95248b6bd3c157173c13d63a4cc", + S: "4603d99289017408b889aa49b04ec5c7bbe245e6ce01d5e9" + }, + { + msg: "db0d31717b04802adbbae1997487da8773440923c09b869e12a57c36dda34af11b8897f266cd81c02a762c6b74ea6aaf45aaa3c52867eb8f270f5092a36b498f88b65b2ebda24afe675da6f25379d1e194d093e7a2f66e450568dbdffebff97c4597a00c96a5be9ba26deefcca8761c1354429622c8db269d6a0ec0cc7a8585c", + d: "8068271d4019a978ad6a5b642cf20c40c7318ad1b56be09e", + Qx: "11b8fcb620b3a40814fce73487628784f1724580c3e262e1", + Qy: "bb062057ce3bf1c43eeced0c952cdb45ea5672d43537bf07", + k: "e58863ea4eef46c3448107c37875c38f811c9171dd63466d", + R: "24613dc9e28b26092cb07696d5bdff019e6f3f85498bd240", + S: "e727ac11d6e499674771e37bd7c32606befb0a49e27c3876" + }, + { + msg: "47c9deddfd8c841a63a99be96e972e40fa035ae10d929babfc86c437b9d5d495577a45b7f8a35ce3f880e7d8ae8cd8eb685cf41f0506e68046ccf5559232c674abb9c3683829dcc8002683c4f4ca3a29a7bfde20d96dd0f1a0ead847dea18f297f220f94932536ca4deacedc2c6701c3ee50e28e358dcc54cdbf69daf0eb87f6", + d: "c1be68b712e2f0ce5f2fb2b854e5566e0e220c4917ed1d50", + Qx: "e165cbe844fe05da8ac0109518a936998a7e557338a0d879", + Qy: "05e328de91aac88ec30daf08dedf260021c06a3a42c5b091", + k: "523977b6a35111c673241cadbf0a441e1df2693f8b0a397c", + R: "d32d60408aac53fb922180940171dd7f36edb3f51627ac0d", + S: "1b4c853eeaadcb703c534e9dadbfabc4f2c5ea35734fe398" + }, + { + msg: "f15433188c2bbc93b2150bb2f34d36ba8ae49f8f7e4e81aed651c8fb2022b2a7e851c4dbbbc21c14e27380316bfdebb0a049246349537dba687581c1344e40f75afd2735bb21ea074861de6801d28b22e8beb76fdd25598812b2061ca3fba229daf59a4ab416704543b02e16b8136c22acc7e197748ae19b5cbbc160fdc3a8cd", + d: "97ed7b71cfd2e54fcbc3405eb1954fad518e8c6df1b39310", + Qx: "c206a5a204c0e679a1f91774c0abc5d33f9f0034343302ff", + Qy: "096ae846244aa572e1af1758af11e034b7424e05a257f433", + k: "96c912c92254cfa88481762356029ac423633a5c1ca31f3a", + R: "adabac1edc082f49e251549a142c91e4d6b8371fc1dab450", + S: "d0db4f9c8510e729e6ba384e2a7ed38d3738acb227ede72b" + }, + { + msg: "1bc796124b87793b7f7fdd53b896f8f0d0f2d2be36d1944e3c2a0ac5c6b2839f59a4b4fad200f8035ec98630c51ef0d40863a5ddd69b703d73f06b4afae8ad1a88e19b1b26e8c10b7bff953c05eccc82fd771b220910165f3a906b7c931683e431998d1fd06c32dd11b4f872bf980d547942f22124c7e50c9523321aee23a36d", + d: "0908bba29266577f6187279b4e7b89c69c3c0a954c9b953e", + Qx: "57dbac4f83bdccfe81d34be27df0373c7da17665a69812ac", + Qy: "3a4808e9c027b2a1aa19e66ab72745f6607ecbb67cbf7dea", + k: "62e18e8b5fa1e1c3b12e51d469ee571eafb72de51c438dfa", + R: "ac16cb38f2b94478a2525cd3ae812fde821814ecc4727855", + S: "ad67bb35a0bd238b703455fbe540e65d2d277c338c83ead5" + }, + { + msg: "18e55ac264031da435b613fc9dc6c4aafc49aae8ddf6f220d523415896ff915fae5c5b2e6aed61d88e5721823f089c46173afc5d9b47fd917834c85284f62dda6ed2d7a6ff10eb553b9312b05dad7decf7f73b69479c02f14ea0a2aa9e05ec07396cd37c28795c90e590631137102315635d702278e352aa41d0826adadff5e1", + d: "cf86e30f9fb18c6b916a09ba6acf0ef6c05035f0b5153be9", + Qx: "fb7df2c9e1196043602b42812c08c57af7f5900bdeac1a2a", + Qy: "b9719048ab366a7f1e1009ca85d568cace9c058ccda1036e", + k: "746f6dd3558d7ff42930cb00de422529670405de2544da03", + R: "bea8ddfa0a420568b2dbd19b6fc16abf7a63ed66c0f67525", + S: "bd8cd2940b16a059c1e13741d570048485aef4a9744add7b" + }, + { + msg: "a5290666c97294d090f8da898e555cbd33990579e5e95498444bfb318b4aa1643e0d4348425e21c7c6f99f9955f3048f56c22b68c4a516af5c90ed5268acc9c5a20fec0200c2a282a90e20d3c46d4ecdda18ba18b803b19263de2b79238da921707a0864799cdee9f02913b40681c02c6923070688844b58fe415b7d71ea6845", + d: "8f7864b2b4e0f6135516d1b00c867953d4523571a1329e7b", + Qx: "92c464d40fce53f22925e65ecd50baec49b49b156ced0b85", + Qy: "f71ce3b80edd67419d73c1c54c07309e4b644fd67d4022ec", + k: "12e9360f731d5c1d15a0e68b0ddcd80db51a76d74cee6dbe", + R: "58fabec32dc6c1442220f34f121a02ab7a86861f7f393008", + S: "54c7a528d3a347f5fe67ed50a58453223a3ae7e0780459ca" + }, + { + msg: "13ad0600229c2a66b2f11617f69c7210ad044c49265dc98ec3c64f56e56a083234d277d404e2c40523c414ad23af5cc2f91a47fe59e7ca572f7fe1d3d3cfceaedadac4396749a292a38e92727273272335f12b2acea21cf069682e67d7e7d7a31ab5bb8e472298a9451aeae6f160f36e6623c9b632b9c93371a002818addc243", + d: "5e3c2eae83ee1bc82619c86a95524c288919e9de4ad0a521", + Qx: "ad0220c8fe6382401da98abfc7671b56cb7b3b7710220316", + Qy: "36b323c85d0116c892b7775e505327f4e4d2dacf03618549", + k: "d09fa3ff3cc8595065ae3df5c500b0e9be2787857e47f14d", + R: "6f63ce464eb669e6adc8861c48bfc9e93ca2fa3ae9ada322", + S: "3b21e66324a8ae892c84550b185eea0ef488b78984d1fb74" + }, + { + msg: "51ad843da5eafc177d49a50a82609555e52773c5dfa14d7c02db5879c11a6b6e2e0860df38452dc579d763f91a83ade23b73f4fcbd703f35dd6ecfbb4c9578d5b604ed809c8633e6ac5679a5f742ce94fea3b97b5ba8a29ea28101a7b35f9eaa894dda54e3431f2464d18faf8342b7c59dfe0598c0ab29a14622a08eea70126b", + d: "29ac61422184d4e49b867afdb3eeb2f40df2e0bf3186c6ee", + Qx: "caf6a582fb6893d6b2ea4f7a15d2d43d91b7abd421137b54", + Qy: "0cfff44522f49d999d052c09baeb599bb626cafe4213dc34", + k: "d4d3f9319ef50bfbd0981eee2784394f613cf15b7d0ddd85", + R: "d5dea485b93d307ca9b0627515d41593a2370d76571be031", + S: "918749590bcc4d66c38f3a21bd1b1017c1819048ffc29e97" + }, + { + msg: "678b505467d55ce01aec23fd4851957137c3a1de3ff2c673ec95a577aa9fb011b4b4a8eb7a0e6f391d4236a35b7e769692ace5851d7c53700e180fa522d3d37dbaa496163f3de6d96391e38ff83271e621f2458729ff74de462cdce6b3029f308d4eb8aef036357b9de06d68558e0388a6e88af91340c875050b8c91c4e26fc8", + d: "44c91536b0467b4573cb595cc6b63939f0b8cb72d312b94f", + Qx: "12371709cdb69ab3f7fa265a8e5cb51ab6064e5b42beb536", + Qy: "0260baa0e798d6954089e29415d994fc7954b4a313f01c54", + k: "deefe91e65253874cc3b4f45e070f2f138ddcc0fd73c80b9", + R: "a3d57616b4d6f727b05e3f153b7e19bbe530d186aabc36da", + S: "49cb35e66517c5edb31dff59a35fcd8d0d32dabfba9b2135" + }, + { + msg: "9bf457159f0d44b78d0e151ee53c41cecd98fb4e4129fcda8cc84a758636f84dcad9032f3ec422219d8a7ec61ea89f45d19cab3c3d451de1a634e3d2532231bc03031973d7150cf8e83d8b6a34f25fc136446878e3851b780abdca069c8e981b3ea3f1bf1ff6e47a03f97aed64c1cc90dd00389fa21bb973f142af5e8ceccef4", + d: "3707138933f4a3db2f593bc0984926abe3c8e0eebae679a1", + Qx: "3eba27ffb523f41eb12c897e088e0e94b585e79049dac687", + Qy: "b3bc45b84cf04134e63567070a0f52f8c178e0e4a981a24e", + k: "042d9ec80b96d1bfd4bbe29c5fb834c4c6105f738edd9f5c", + R: "19aa98a7bf513140e315c855c6af330e422e07f3538e7b26", + S: "bdc8b26834e858b265ed6f4262c7ecbe2377ee31bc85a074" + }, + { + msg: "2469172b7a046e6112dfe365590dfddb7c045cccd4ab353edc3076091aad1c780a9a73ff93f3dbf9e2189c5d1fdd6f6167d0ae8cc0f53dc8950e60dd0410e23589999d4ce4fa49e268774defd4edce01c05b205014b63591a041745bfffc6ae4d72d3add353e49478106653cc735b07b0fe665c42d0e6766e525bb9718264c87", + d: "d1e976d6a5f85a37ef7b634cf15dccb833ca32d28e773ab9", + Qx: "f1def88f6dd6d00b1d5fe95eb7b4e57e13ca0afb33306bf6", + Qy: "d62dab1905aa12770f89f20db798d398b197e516aec5f27e", + k: "4d1e4c4f4ff06265239860e0c8dca6e59feff6bc83254788", + R: "9a34c019e389c1b0515bec0d7d85a4f6ed92c16656a355ae", + S: "38be91be075f1a30e2e39fdec3a40a1262d69b8d137e588c" + }, + { + msg: "6f8983e74f304c3657cffde0682b42699cb2c3475b925058ff37292c40a0aa296690ad129730339ac60cf784225b2fd3db58297c8ce5889df7a48d3e74a363ae4135e8a234cab53ca4c11c031d561a6cf7dd47b925ed5bc4c2794ba7b74a868b0c3da31ff1e4540d0768612192a236d86f74fb8c73f375b71c62f1648c0e6126", + d: "2e646107f032b748be926ce821fff561d74c459cbb05919a", + Qx: "8956649fb58bf819b6f5ff11a6f1179c563bce240178496d", + Qy: "3b346498bfc7253e9e54ddeef3cf89335ff84befe91dd3d8", + k: "6a32a8a540a1d1992036cc5d9413ffef55e8d04bffadf806", + R: "f2dcca32b158303267ab039b128eae3187459536ef63cf77", + S: "b438390ea65ec12bb7bb6c9da5dbb095e747c9229803ab87" + }, + { + msg: "6fbe6f0f178fdc8a3ad1a8eecb02d37108c5831281fe85e3ff8eeb66ca1082a217b6d602439948f828e140140412544f994da75b6efc203b295235deca060ecfc7b71f05e5af2acc564596772ddbfb4078b4665f6b85f4e70641af26e31f6a14e5c88604459df4eeeed9b77b33c4b82a3c1458bd2fd1dc7214c04f9c79c8f09b", + d: "70da499b104dfbcf883d222d06e7d0597f1d276af4650476", + Qx: "7fa0b6437ac2191048e7f8ea85f72fc04d952aaa8ad4058a", + Qy: "b7c10d055c5814e6a74337fd0b18d9e947f5aa6cc298c1ca", + k: "5a7d2207b70ea7e7c3d5ab5cf6ed4aefc1d43958db1f18c7", + R: "8f65321799fdab0dd95f21df968c04a214fc782144524b4e", + S: "23750f05a4148a1b551bb1bc89334bc505b8a9ed9ff5780d" + } + ], + "p224sha1" : [ + { + msg: "36c8b22986487f677c18d0972a9e2047b3afa59ec162764ec30b5b69e0630f990d4e05c273b0e5a9d42827b695fc2d64d9138b1cf4c12155894c421321a7bb970bdce0fbf0d2ae8561aad8717f2e46dfe3ff8deab4d7932356032c15130d599e26c10f2fec963031ac6938a18d664538b94dac5534ef7b599424d69be1f71c20", + d: "97c4b796e1639dd1035b708fc00dc7ba1682cec44a1002a1a820619f", + Qx: "8a4dca35136c4b70e588e23554637ae251077d1365a6ba5db9585de7", + Qy: "ad3dee06de0be8279d4af435d7245f14f3b4f82eb578e519ee0057b1", + k: "ec2c2faa14bee0169b2fefdd41bb3e4c39c7ac52bccfbc3091084f0c", + R: "147b33758321e722a0360a4719738af848449e2c1d08defebc1671a7", + S: "24fc7ed7f1352ca3872aa0916191289e2e04d454935d50fe6af3ad5b" + }, + { + msg: "f7e8d5552054565c07249bb5a186292a587a0bfe3d15fc7da55db87fdbd87a33982b04fcb188a499151f11c4cdaa6fcf8a71b7f07a0030429a4004b96e0ef0c04b3349524b60c89fef99dbe0e51f1d5784c485fbdda40096ec1993d238aba02456599b34bc0036be376959d9d60c5ab581580719e52a6a6f63203ecdb3966b48", + d: "e6f0a6ab81b7bd50dc5581b03d43308fb28356408392e29a5321ca7f", + Qx: "c87c46fb7a07789aa352d0055b3a4ad588851a80f6f0915ab5547dda", + Qy: "b7741b39048588bae158f2568a4c1dcfbc0843210f2be6ce3e2ffbe9", + k: "6b8c3a59ff56793cf3fc434abd01c7eb91cebbb01dd32f484b7deaf1", + R: "8c0e764cffd1845b37ad0eb3337e06bee7265c298056d9009845a301", + S: "84fa1e38c2911b575f33916bcbac7f63dd219ce59a31674369316fbe" + }, + { + msg: "6a8c6c3581223c02ea7383c905fce25d88d4fdf5b4fdd954ba98a0ebf6ccdbd7fe9dacd351ff5821d40d89fa1f7cbbbdd79952021947f34d581e4f66dfcd0205b808bc5f5bfe598574a6364eb51a0d5218691df58f9cc32dd8ec02e01521b382671fcae10e1fe6958794f49a9327b132c512ecc044bdb05a54f5c1f1ff445808", + d: "3ad83662320c54cebad24be5de2ecbcbe30c2b69aa639ebe44a23654", + Qx: "599b4847fb5c02b17918f8aa9547e4b0a34791ea4d96741a5d9ff29a", + Qy: "55df76239cafa86fd149d2fa4438d54cef61f2e7d9afe3644b71a61f", + k: "ad0ced62c01ca30b93432c142cc9d2f53ee2da76c2123c90f7ff1612", + R: "5e034661375dc3cab74000c0589f759e1dda76756f718d47c3f026d8", + S: "35cc2bad11d1bd6a94717add49e42064bc0b392ee9d030f2d03d3b7b" + }, + { + msg: "54a819f20462afdd1e171c6053bd8bc3ec536003bc2ea3b383348c74f57ab366d9f443b394f7c6e9cb689aff32fc1c5203155a41a3978401699c2cfa48341b43302c113adeb1638616a48d2b610233579eddc39eff3dd729e4b0959f059850efc5e315a108ad113b336d09a8b1450f28a68e31fc5b46e6561baf329df063312f", + d: "9ac287e839788adac320d3157d36ed3f41e558381573a14d49afb201", + Qx: "e78a4ba07da5c9d87b13a0cd887fef963371588ac8e7a504aa1dad07", + Qy: "5199690b267b213e2b9c8e2526a7cc5ba0d4b25c96d899db1eab8f24", + k: "2ff3761eb86814c4e761cd4db17369b6ab1756ca15a87eef6c18c013", + R: "c3a7a23bde22c267e452dca6af88d9cbff80e332859149d48af47807", + S: "79f1b5cbd6a145f6eb4582d303ee35d3ea7e87d8b64e5fd0f8a23bf0" + }, + { + msg: "91c123a0fce6aadf85ce7588f58831c6a7db8b8535344dfac001fc9a111c5f71223d47c05b14e93caea536e8b729c0442d648a9bef5fab5cbceb44b58d5abdead7bcd834c0f42649000c8c04af20f077257669aacc9332c8c51da05c26c15f2f2d34483f88c7fbb17debc0e59cad817446f8c0349e89baa895a0e4a5cb05f2be", + d: "4af8ad116c393082f245904b1e062ff32a818cf0d9974ad8046b363a", + Qx: "4382782a6cea5b369c5117953be775d1e34254b0cd322f6e58a7f7da", + Qy: "4a089a411ce60f1741beccd97e0747b8724609f5a74154e36ff6e456", + k: "1152259df488702133982228bb54011fa0086a7d2b8a3cc3b617c232", + R: "342eae8c8d8bf062957be48f8792fab4cb9e654bd8592ba4ad2e98b1", + S: "5bf0f7ecdbbbc28b18619ad2cc6bbd8c20085fd2ecce7440f362f870" + }, + { + msg: "5d896c51eb12e8d918ccd91d5d23e22a4d4d2568db96110dfac0f11050f82582eb740177895fc025e823a4ea15ec297458d53fff0be9c2c94284de51296e2181604eb08df8741d6825d3e5e0c94780f1403907be494de1908e3ea8733535fe08bd935ff6561d58e8fc0068f1b3b00f7014bc085a0202107a11b5c03b2e1adf90", + d: "2d90465e11c6ee4104f283ff4019779c5c9d5d0665e8552c6d58eec5", + Qx: "018f6cc36154151b360c47372935b1a7bcd64aedf495f1cbd3b567b9", + Qy: "327dd3de098555ade51eff8bcacdab04fbc309ea10b77eb0576bd525", + k: "8b3157d48a85f452703e02c1079147515a6ae139564ec46eeb9d42d4", + R: "ca135626737544d52bb5d0722f4709633a4182205da4462c4166c54e", + S: "fa85f1954fa02631223267320d572c7d6932d6ed2da26edb1e7dfc93" + }, + { + msg: "4fbeddb09d2a2d050b9b8221b5fb7b4f44a8fc9cfb6a48aa3a16d0c3620d1087848d6a494b45c939ace1a31241b69f92787e4a149676c7fadeca3288ed3873c88485cd73dbac4d75bbb32a984d2ab045b518c54b18303791e4dceb70b0df4a770d66468ec84dd0af08fa402ae27e3903877f6091ab52d913d09e17cb08ceb0c5", + d: "6ec68008dfba890356284849d5529d0a7405fb10c9338ff2092004a6", + Qx: "cc6959a5b591042c75fb99aa4687d33de1aab404d4c2e022d081865e", + Qy: "4b84c5499d0003ee9d751d1bf27a6a27ab073ca4c6f5c36a9bd95ca7", + k: "6724264dd8c92f01fc0cba26561ab5f7dd4afd1d532c61d13da8a38b", + R: "b0cf97ad5a79fe55a67fb22f65c64dbce7482f6b6e138fe192d89352", + S: "3b1d9236807ed766d2d776a1320b08fd8b080c2fa1b387863d2f2bf0" + }, + { + msg: "20a7201e4fb67e6962afe8101a9dceca2e8acb761ff579ddb54bc5935a8bc3992b1dc16a6d3b4b9d0daf1b5337b757564a2205effb2b4e7e38dbbf1019be193fa26472d5486001042db93838a58ec877331b323cc15a2ce307f83d2f921edf474c3c6fe25dd33d3e0e92b13c67c92ed1ca0c700c66b7022fc2ebb05671c422dd", + d: "26b872a198bd4f39f9eff3d6038b49cf067611dc4e684ef24c1cf343", + Qx: "c0f92b4452ec4286fbc0ebbf9fc4d73cb8cc52bd9538758ee739bb06", + Qy: "54cdebd20767de663d66664e59c591c28adfb0322a5bd1898041c761", + k: "2ad9e0e87c3e206554eac70ac7afbfa7999c93b73892fe8a1174f803", + R: "3858452d69773fcca5c7bae0e678ba698c6eb90b8f34ce9922714156", + S: "b764be3a2d2dd339ac20306c83302e4f803aea6d70b0a7333fbc1af3" + }, + { + msg: "dea90090619b70c5feecb05968b53e56862a6fa0f83e5b3e488214a1b4bed309e15c528c794d0ceb576faf6b159661512b0d2e53c5ecfdf6beada6240c7204ce185b124db695e4c5aa2824cf08c3e153c9a34c8ee426f1c403133ce2e3f9ae2fb63ee9cf0376ea719604a01a00aeb5a7e3d8d2e9690d5ceecd69d3aa43106ddb", + d: "74cac3c4683b5b848832ce2c3157d1f4748ae2942a04f17e9c612956", + Qx: "8c95776235855bfb6c8a5eba977e1c566b08dacb876c456e86be1edf", + Qy: "173732acf0d6b7a51ec3d66843a3e3b896000c00206032b3c8a59ef6", + k: "174e19ac43ca1185d14cc1270bfd0f4ad99c3c54e75ed6aadc940b56", + R: "b41b4d49107cfc8ba2c57e0fee8df879fb7708cfbc6e18d19ca5986a", + S: "cb90854db55a7250b444a205d0e61386d98504222e407f4df77dd1c7" + }, + { + msg: "fe2f9c5da89c29f4799017a04332b01d26f843b79e7855c40b7f0240cdd71726ba66574e40e251b8994af08871eda1384d4a9f3d62bec0648fea92a7661d5ad6a9a7758f88ba979c4d97ff47774b6c9f246d16edc21278feeffd678dce359c4ad2eeae1bfd216384389c35382463c088ef90fb9e076b4213a28d52213a0302ff", + d: "c6eb83bf50449807dd1b12946b4bb29aba4ccfd1fe9ef0203fd3440f", + Qx: "3e34fb08853c03394725fc4d8e7828ef35a25fc3612d1012faa55fcb", + Qy: "6ea5333bfd8fc1ad3a06e947c6c60f9eb17b357411bb4dff19cb6455", + k: "fc8909a9538102c552a310455e1d42300b2b5df5352da8ba963ab4f6", + R: "e4fb3762017cc4a9a5865b65d32ba3c4244203d66aabde8b70ec554c", + S: "fbf058a0a4a3f353fe8a47d87bda4eba032d8d858aa2810852a5d3c3" + }, + { + msg: "87c8aa1002c54ee6fe06364f19066ef3b497d0c757c8dd064e2195465e1098c6abe51a53adb2fbff617bde2365c822cd6d77b4baf0753f09f36d86e82ee68b3aa5ffc14ccdfb78ef28c03fa2f6808d9b044ce4dc2721933b9a60838a4a1de812472e10d0c8048244fe0b7fad35be655d398f212117e99c4c1e92c68adafee018", + d: "b89acbaa56807917b4d1325858a1d28993d8090808048a559ddcd343", + Qx: "dc0ec9cf7bcaea4fcb1a925283fba8bfb515d8291fdba232b940bc9f", + Qy: "3ff17baa9c1a073fb157838348c5ac7afcd3f30bdf7e46d4441e9100", + k: "a5bc0af44d19b4f15ce211e18601c42f936b4b27690b8e27554ab2d6", + R: "b00ba15426a4c901815c3bb39ecec7d62ed4dbe68afa1cfaff6ef5ab", + S: "24c554d7582ec1914bfbe47cf37302281d34b9f2d147d612a323988a" + }, + { + msg: "5839a755837138ddf416b44935a4e90030197623d9276dc21715028da723798f1e5c1c9e3968accd137af7c51838820026c2c59027ff8e66a19ee1b9b77349851fe0fb6999be6a0b196f7ee956c7b4681678b591890202e5d7a9d0b3032514400f9ccee46dd9551c4f8e8714f767a361344585d0d4cc130ebf14f8e09391982d", + d: "19c9cbdecd6a0ab775c4101efa1a009efc2865a384ce232f8ac1873e", + Qx: "d408006358326ea2e39ab7f75046421d4f18b1472b465ea331ef0be5", + Qy: "cc2bb31b02f2bdf05937832f88f40969203dd1eabc4c3de069353002", + k: "ffa43b492bc3a12d19a75736f43a3a9c553c9013ae9c5001e5b7e91f", + R: "56c3818a5b984402510fc76a0d65e1737507e75f68a1f35a1eb659da", + S: "200e30e262d1de79c1c5daef7bede98f27640f58fb64a481ced7b40c" + }, + { + msg: "7daf713b5b4928ee2c0ff34b2593edfa1648c1a591177aca21a4c1579eb2d34b4879366e30740aa0e25079bcaa8cb594e7069ecb40a5cc27426bfba61418fd914e6b970e187fdc3c3432f7f6e56a1e0e5f94c7548d4b3c02d1c27b08a62a0d767e736424cf4b725e3387bcce8f61f39413320a89eed66f7a6d714365fa8370c3", + d: "41bb33d169c75ccf8ba2d5f5138fb5b6be4dc8fdcf53a8fdaa9cea72", + Qx: "adc321cdde54c94dd2920110306dadae6d044e2a8465e5beba4ef31a", + Qy: "35268278c46b10b6707ad4851fd29dc628a7e9a50d196792161b4123", + k: "f92f6761a1e75398f973a25446a0f911ea8c15fce70f12094bd903da", + R: "cfeb641116b847df61e0f5a7fc80e1abd5d80db20a4b0552a13b9be6", + S: "a686585af34bdfb31eaa1b2fde99a70a18c7b10f9d5030c01ca58b5b" + }, + { + msg: "c922c34ae89a5e1a04d3dd6ff14dd15a1cbdc76aeb1d12635dfd68f697ef92b8daabec0b3144353e62b71b3bbbeb2878eeccaf037685a87f6d2f0e35ef7fec1a1d58ced46f80dcd2d63e84d5f100d0adfbe6d6ae2931f6de60aae385180a6e052b06d65d1dda3f76f6e969a96b71a9045a08657d934718f6ebde50777fc2c601", + d: "36dd2974e764b3993477e8474f47f8aca2d3da794cf3ed76d59e42b2", + Qx: "fed38c8e1c25d007b52db3acc1a4f99d034361da90793e4ae41b0615", + Qy: "9d47e70bd09b7753f82fc0e65182003afddf4e2240a14cb90bdd8df0", + k: "8016776fd06bf32ef2a36a43ca4a058f996f4d5a17b6a8aa8ae993d1", + R: "cb3b22063fa972f182a2d2fc70ebf4d7e1aeb44311fa8bc197c9f9d6", + S: "3bf46f9a772a0d39cb98a92245f01581146263f2c156d1dbd9af7c7d" + }, + { + msg: "553a6188719d0057df4fa606df0f2465488eebc5cdfd6a7f099f8b9d8ac4ff3e77806d4bdbda6b2e3621d1f8816615dd2b5f32a28b1595651aa3229ed867f35e0f0295495f368f036a6260c68a436f83b59dad5e96049364ae3aebf3446699d2a68af5fc3d80952807518dc7257cd9b4b4bb91ab33d90a40c411a92bb15df285", + d: "6d423859ec293329a02a55659453059f130be9f70b38be8bc57b181e", + Qx: "d08540ca06c7983b0555285b54998a24c3c9c5cd3d643e817ef9b9c8", + Qy: "7127da72ae33847679078dfba12876149c86aa9c6daba21dec640c85", + k: "8f303b3ac9d98743633bf78821d5c81cf4403cc003027dec48f6d072", + R: "e7bad54f956844dbd72d77bc6a3a8912afef8d92780816fc6b8a7407", + S: "881783cbda0827c0daed689fe088fd63931b9d07d151f660adf5717b" + } + ], + "p224sha256" : [ + { + msg: "2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e", + d: "888fc992893bdd8aa02c80768832605d020b81ae0b25474154ec89aa", + Qx: "4c741e4d20103670b7161ae72271082155838418084335338ac38fa4", + Qy: "db7919151ac28587b72bad7ab180ec8e95ab9e2c8d81d9b9d7e2e383", + k: "06f7a56007825433c4c61153df1a135eee2f38ec687b492ed40d9c90", + R: "0909c9b9cae8d2790e29db6afdb45c04f5b072c4c20410c7dc9b6772", + S: "298f4fcae1fe271da1e0345d11d07a1fca43f58af4c113b909eedea0" + }, + { + msg: "1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407", + d: "5b5a3e186e7d5b9b0fbdfc74a05e0a3d85dc4be4c87269190c839972", + Qx: "897089f4ef05b943eeac06589f0e09ccc571a6add3eb1610a2fc830f", + Qy: "62ba3f6b3e6f0f062058b93e6f25b6041246c5be13584a41cae7e244", + k: "5b6f7eca2bcc5899fce41b8169d48cd57cf0c4a1b66a30a150072676", + R: "f12c9985d454ffbc899ebbbb6cf43e3debcac7f19029f8f2f35cce31", + S: "12fcb848adbd8b1b4c72b2b54a04d936e4a5f480ae2a3ea2e3c1baae" + }, + { + msg: "74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb", + d: "f60b3a4d4e31c7005a3d2d0f91cb096d016a8ddb5ab10ecb2a549170", + Qx: "40a4ab1e6a9f84b4dedb81795e6a7124d1cfdfd7ec64c5d4b9e32666", + Qy: "83aa32a3c2fc068e62626f2dafce5d7f050e826e5c145cd2d13d1b27", + k: "c31150420dfb38ba8347e29add189ec3e38c14b0c541497fb90bf395", + R: "bf6c6daa89b21211ea2c9f45192d91603378d46b1a5057962dafaf12", + S: "cb6b237950e0f0369323055cd1f643528c7a64616f75b11c4ddd63c7" + }, + { + msg: "d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560", + d: "c8fc474d3b1cba5981348de5aef0839e376f9f18e7588f1eed7c8c85", + Qx: "66f49457ed15f67ed4042195856f052fe774077f61cebcb9efddc365", + Qy: "3a6e3f3423eec7308a69eb1b0416d67cc3b84d24f251d7cbdb45c079", + k: "5e5405ae9ab6164bb476c1bb021ec78480e0488736e4f8222920fbd9", + R: "7b7beaf9f696ca1a8051527478c4c075ab45aa4768937886dbf38618", + S: "93d4cf110a37c5a6f15c4e6024822118539e860dee2f60b8c3f462f6" + }, + { + msg: "ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db", + d: "04ef5d2a45341e2ace9af8a6ebd25f6cde45453f55b7a724eb6c21f6", + Qx: "8d642868e4d0f55ee62a2052e6b806b566d2ac79dbde7939fe725773", + Qy: "79505a57cd56904d2523b3e1281e9021167657d38aeb7d42fc8ec849", + k: "ec60ea6f3d6b74d102e5574182566b7e79a69699a307fee70a2d0d22", + R: "2fd7fcbb7832c97ce325301dd338b279a9e28b8933284d49c6eabcf6", + S: "550b2f1efc312805a6ed8f252e692d8ee19eaa5bcd5d0cda63a1a3f0" + }, + { + msg: "4cc91f744ac858d3577e48813219aa3538dd813b186b42d1e6218376f07cc1cc448ddd6b37240e98bf953f49cf54d65c12878b33c0bf6eb1c60254f0b6fa974f847e53abc56773eef6f29885dfc619e6a48fc15a667ca94001a0c945b6357a53221b0f4b266181456b0d2d25e90708777f1a6f85971c00140c631c1991e0fd06", + d: "35d4bbe77d149812339e85c79483cb270bdac56bbf30b5ef3d1f4d39", + Qx: "7924b1d7f5920cce98e25094e40f2eb3eb80d70b17e14b3d36c3671c", + Qy: "26c5af35f71e61858582b7cc2b41790597c53ee514ffdf7a289d108c", + k: "751869c1d0e79eb30aae8fbfb6d97bfa332123fd6b6c72c9cd3c1796", + R: "26bb1b92b0f01e94eba5fa429271371db527ce857abba13bd1103f64", + S: "836aba9c63e1252c2b2d72a21e6a41b82241ebe32647e7f814652bcb" + }, + { + msg: "58f43cc1924de4bc5867664adbc9d26b4f096a43aca47c27c52851b006dc2a658919ef9ce5b5ac48372703be15ac51631c2bd84b88f479f113b0569a9a09e230ec1e8e573474c6075284d3e57d973829af35325d9e7dab4a5f9b065155bbcaff3642a82ef4c9b9e127d3575c050721653da3b087d3fa394192897a5519527d19", + d: "2c291a393281b75264c9b8817af684fa86a1cdc900822f74039dc5d6", + Qx: "18cb5826ad60e6696bf07655032a3749f6577ca36da3ccd6e66a137c", + Qy: "194e14820fe02d784fd1363ff7a30399518309765bd3f4412d646da2", + k: "e2a860416229dfd3f5a5cc92344ca015093a543943a0d8f73bf2b2fd", + R: "00e300c1ef4a8c4ca5da6413856f8981db49de29bdf03f32ffc3ceab", + S: "f250f18a51ba5f63e1584097841099fa6ae4e98ee458c061d1d5aed7" + }, + { + msg: "113a2806b052fde683ee09453098e402204155afb3776fd1cad3a9103421d327eab8f9ec0dd050ffcc83f93b34ea707705fabeccfe43ab1a71c95298fd3ec769d99ead1066950eee677d225816e0faad19cf69e1b35d16771689e2092cafe16d7c0dd7b0db73fffb8d0f3eaed83004dd21e753530ec939c89ba25578fa5f785b", + d: "831ea25dbeda33d272a1382c5def0e83929170ab06a629eed6ee244b", + Qx: "076518e393940d42dfd09819409d66966d8c9189c83d554a9cc8a082", + Qy: "44d0ceaf4c0f50e46bea4a52e30423ce3ada19edd363ac5694c65cb8", + k: "6be6dd9f6a083915ccba54626caf12d246d3aece0a7eda7d8d85599c", + R: "ff1460946e06fb6f5d35e8d2625ca70ffb9b45308e3fabf6ad8351b1", + S: "6029aa3990918e8cb8a388d53b0772e5cdfff49c3405fe0d3a95933a" + }, + { + msg: "64cbfc8f2e2149a31b3e8a80c4a552f6c62aaeb7990b6e0ee55500a9d17be04213406578caf315951086dff5c2af3b5ce17d425d185101ef26f86396ba3a129a4f3f8e2dd595f59efb6c0f5c2dcc394569d7268695e9ac7daa84203f1f1895f1f9e4b514a5c9cd23baa63454710144fe735ad9b8f42d8c43267aa434a26d7e5f", + d: "70f74c7324ef137318b610ead8ddc5b964e0eed3750b20612fc2e67b", + Qx: "279649e2a2918e683520cde3fc98b0ae58a7100e8de35e7c9cc797b6", + Qy: "aa4de6be34be61f02880139787b9038f4554a8ef1c994b887c2974b5", + k: "8e984864f86f7a2a73f3edda17dbccd13fac8fa4b872814abf223b1b", + R: "3b18736fa11d04e27e2614cda03a63ec11a180f357b0b3192920d09c", + S: "2f0f3dbd570727b14fbb29155538e62c930dd51c4035275c1365dc60" + }, + { + msg: "a10a11c8e30fff118d371daf824f16c08200b83ea059436466a4611ccac93b2dea2de8c1006f946196aef7fe9b0c251a391b0340f21797798278b412ff2b53842eec6450728e2bca062f8337a2c204b9ea04ff660cd4d4db559f2f11c4d8ef199021339fcc82396f7a93926cf5f247e37d8067fe50692de54f102bd5ab51925c", + d: "026be5789886d25039c11d7d58a11a6e1d52cb1d5657561f2165b8a8", + Qx: "3fa617c50b177da1a2bdb98b780ad21ad1195c4bd24465f6187de3c9", + Qy: "e3fd8d8876dfd03a4a4e31a1acad3a08d983826d286c250c4e5620c1", + k: "0128b8e3f50731eb5fcc223517fc0cf6b96cd1d2807eb4524bc46f77", + R: "3a6b633f96f3d0b6d54f7fb29ac33709e4f0dd8fa0e51606ed9765ca", + S: "63e8c119dfa51784decd864f6911f2210a80f8f02d472d88df10d119" + }, + { + msg: "b3f720bf566ffa369259f4361959ae0641d2755ec264a4c4349981df2b02563275b2b9adb5aee47f7a456760a971991ffed6b17809bb9694138d1677fa916123795239353158fc6b22d10f20d26f5d2dcd8c56c44373eea5b93067dba2d7c5318dac2e9e8714873cb1b37f58c011fd14fa1e535554efe05f468bfc8e11cd8b99", + d: "e79c18d935c2839644762867aa793201f96a3cde080c5968412ce784", + Qx: "b7ae1e992b1c7fde1141f40bd913358538ca0f07f62b729f13cea327", + Qy: "811252d12120e04805fc171a439d382c43b68a21e1a0bdf5e4ec1da4", + k: "7abedab1d36f4f0959a03d968b27dd5708223b66e0fc48594d827361", + R: "d35047d74e1e7305bb8c1a94e8ae47cb1591c3437a3e185e00afe710", + S: "d9c425c9d5feb776ac8952e6c4eee0ecd68aef2f0e7bff2e49c9185e" + }, + { + msg: "0a398a46df7ccc48d1e7833f8bbc67100f1ef77a62dc78bbc115b2a662f9591fbaaa91ad3d788e2fdd1b3164e45293d4f5686c151296901768028ac80ded4bf89c647ad35f0c7c4cb318c0c757c1d83c44d850e5fd4677281b3f13b1ee54de79c8c042813f9d3312dcc6111a68299cb7e829557d7f3d96e702f65aefc6499415", + d: "0d087f9d1f8ae29c9cf791490efc4a5789a9d52038c4b1d22494ad8c", + Qx: "cd95cf8fb1cd21690f40d647f2353672a1076cc6c46bddaad2d0fc56", + Qy: "934262f74d9ee0f8a2754f64cb7415923d64bf00c94a39b52803f577", + k: "557d0e3995dc6377b3911546dd7aeaeec62a6d8f2af6a274382fc37f", + R: "56df0ea6afdcc232ceb41729eec00cf906b69b6e28423a36d3c92cc5", + S: "f4f70fd948c9a147f55317fdea7b8a84c33e721014552d5800d63edc" + }, + { + msg: "8c33616821a6038b448d8918668977fcf1ef5aa0cf7c341837b39bbcc9bca875a3757f4b392630e9995b9bbe4eb66978b877586adaa02f99d2344dae082a7603351d8ffcfca081ab403cd0acb90d078dd1d0789c2eb3185c62bff2d9f04cd38e509e3b83c12ed0a5c6808fc42f7ba5b06acdc496c8ad9be648ee6a4505f8560f", + d: "0830aebb6577d3a3be3ba54a4501c987b0e0bb593267b9bbadb66583", + Qx: "b88652020e083ccc1c43dc83d1881884dd4c7e3b4e3460b344b1ea64", + Qy: "22b69b517f86d7c26dc37c0f8feb4bb07fe876149fbcc3334fd2805b", + k: "e4f4a3280574c704c2fde47ca81ec883d27f2c5a961a294db7cda9d2", + R: "b30b8a0079d9a134b5e1618c2ac63e3fbe0e95866b9dbc5f423f2707", + S: "3dc36746610271ef66e0aa52cc2ccadc5c9b08dc769e4dc4f6538c11" + }, + { + msg: "94d56535fd4edfe67a0daa6579f9d53bf6b7b8830ae2aeb62892ff59f18756ddf2811b449c7d20d65d54f8507de4e7c50eaa084830637812aa4b250a4d61ab67845be36e4a41cdc0a70f8d6e3a63d4514f0dc197e6486015046a316153d5f3a3a4a0ae1ed7ea5fa55e12e73d333333685c02e0eb636234ea7e6d4b76b4b76b5a", + d: "2acc9b97e625263e8e4cd164302c7d1e078bfcdd706111a13ccda5b2", + Qx: "ce1a06f82df874dded37cca03b56c0648e4e8917ecd40ee73ee61588", + Qy: "ceb6177b8f1ac7c5c6e6e1f7737cc3026952ee392badd2cd7af32f9d", + k: "e401fa80f96480d437ed4f61a783888062ec33d530b188fd48016a6d", + R: "28674f447c4742e4087bbccfb522fbad4e18b56031d2ce8f532b078a", + S: "a5a7a13d15b423dd17771f73cea98d89dbffa846cc209b45c0e29b76" + }, + { + msg: "5d8ebdf9eb28b47bdafaa36bf0b66a9eaf99b6c83959da4f2b1151b4f4ecd28fb115a64c0cb9491093a7e9b9c53ec423e4c72e7765bb9c818da0e8c428667e44474a71db4867130c77c40bfd8544b2d7b9d6464d2b8e6a48482153256a32437c3a747231f51134dd14c703407e31146a6fcde23bededcf16950486e90ca69ac0", + d: "f4e873d4fb944fb52323406f933815092b7672221de4d1c45917f3fc", + Qx: "0dc2cdddb990341adb1de73f02d87fc3822485a659a15145f4251d5f", + Qy: "cf78b2a83c7352eda1af2c74e1804ea04b35f76c04e89d90281dc2bb", + k: "5d1476c682a64162fd2fdc82696fc8cab1469a86f707ea2757416e40", + R: "82982b38ed465138df4018d7cfb835edcb591cb57446ca49d163782b", + S: "8ef1d7b326cabee7f7ab95b7b98d3c27a069c0fd95a1599c0ccb422b" + } + ], + "p256sha1" : [ + { + msg: "a24b21762e6edb153cc11438db0e92cdf52b86b06ca97016062759c70d36d1562cc9630d7fc7c774b28b54e31ef55872b2a65df1d7ec26debb33e7d927efccf46b63de52a4f431eaca59b05d2edec4845fffc0ee150394d61f3dfecbcdbf6f5a7338d0be3f2a773451983ebaeb48f6738fc895df357e1a48a653bb355a31a1b4", + d: "be34baa8d040a3b991f9075b56ba292f755b90e4b6dc10dad36715c33cfdac25", + Qx: "fa2737fb93488d19caef11ae7faf6b7f4bcd67b286e3fc54e8a65c2b74aeccb0", + Qy: "d4ccd6dae698208aa8c3a6f39e45510d03be09b2f124bfc067856c324f9b4d09", + k: "18731ef637fe84872cf89a879567946a50f327f3af3aaeb6074a86f117e332b0", + R: "2b826f5d44e2d0b6de531ad96b51e8f0c56fdfead3c236892e4d84eacfc3b75c", + S: "a2248b62c03db35a7cd63e8a120a3521a89d3d2f61ff99035a2148ae32e3a248" + }, + { + msg: "ac3275c33b54d4f5c4e9200191e525392e7b8f1c94f641e6bfe379ad44b88850efe76612f50652723a0eeeb1d6af1757761ab89a4ae177a04ff3af33cfc69d6bbfe7efe68ad268ff92c4385fd40f99bb2bcc3cba97a90b3db4055aadc3ad8d2d966219638afc2922e82e140a61238d90ad35cc322a3557e7a6d88010c74eb959", + d: "1fe33950c5f461124ae992c2bdfdf1c73b1615f571bd567e60d19aa1f48cdf42", + Qx: "7c110c66dcfda807f6e69e45ddb3c74f69a1484d203e8dc5ada8e9a9dd7cb3c7", + Qy: "0df448986e51bde5d1576f99901f9c2c6a806a47fd907643a72b835597efc8c6", + k: "ce45eac259171cf25ddbd621195515111c7b933de3d415f2a269648fa8b803d1", + R: "e4337061373d22d10f8b96888ebba55036096a4d39ba1566127ed894a914bf91", + S: "77792301bfaadc72334312a3fcaaea3bc2af5ec3065a526d04d467d07dce9851" + }, + { + msg: "725b4872151ab885a0c21f391a4a8b83a747d99db8a187ff1fea69c7a0427c24f295a133f398b572facdf79a661381ca7289b8e6f09387208c4485314a2f3c93dec576df55840754823bf31cf3eeea5162c7b29ae0d2e6719c6ffd0a6dc3a01fecb38161357f0abc3b0cf1abee14793651e3f30bb9b445411bc8a04607577e22", + d: "65dee450c43c222ca453b46375e63169b389b208e9c091974f258af09b8ab000", + Qx: "8b91da916dc268e5b7018f578fa3cefb03721a6427a918a3b754390adac76ecf", + Qy: "6d5da492a8aea36df8418c941e0339e52d15595ad5ca52e93896697b9dc87870", + k: "43f990dd44e86744d6e5d3107100e98a34289afd80777a18b92a40ec49b93d28", + R: "e6aff59f9185dcb84ab2cf481388c31c5101d678370bc34e2c3adb63a7d3b899", + S: "7aa151701e8479bd787171f6c0c0b070a50d03447f27745bc3a28ac3b82820da" + }, + { + msg: "d5112d558342ac908e8ff21e1c7049150ba3e4a9d7127785e96e438bdbb1ffda7ebee6c549eb236b4a782db9b7e579c9f5c666552605221da174c09a7fa9640af921f63fb5e0eaca49681b8e1b53f823145258cef907348845cf346cd355dcd6c846d8f4ab4c3b65b2cc08608c3724ff401143d0527ac947732ad4b9702dd092", + d: "e93ec1b3a4c69ebe0843b731625bbc020336593fb86ded4782cdfa447e49ebb3", + Qx: "739253334af6ddf935e4a07ac9a115eb2b978c93a687d438f221c54474697dba", + Qy: "a1eeba7ab8985bc5e43a8ff886c32018b431723c2b84d8c30d284f546d675c44", + k: "c2650705469748344ad9e08e290cab107581ffb17402e57514d362a5b0890235", + R: "e53cad8cf4deb3ab44b603a185f4eecd50bb19cbc3bc1e394382775ad5857aee", + S: "6663df18f6c50100983c2d1b2b0b4574ff83dd5b87a7747789402a1a6ac5cb2f" + }, + { + msg: "f858c9488ef60b3ebcde475cb2fb44c009b051267442c4e4bd329a67db50a1b85a4b591b191fdce348a1ee7d33eac53e43eafb79b31937ca5ca4dbf08c6330b35d34c1845a99daf01e33a71f2ab1f2923317d9892829be25437d7bdf8485eb886d3e492ea5366084f0e3102d7a3fbd4e63442e9ac70f4ac1daf740db63093a30", + d: "1cfc39b35ef4afb8e0182f6aa5da8cef0925dd829d1e43f18caabacf3e5466fa", + Qx: "db02762c3ffb91fdf9ef87d4488acaf5aa0c7e898004b5621ef0d3b20e7fec54", + Qy: "d0ff019ace9b7c058f20f01355f82ad886f83aeb87770e54135572a2818fcc31", + k: "f35c0742dff5d901326a42ca50ac50b7c32794c7d85f48a7450da772b967b8ba", + R: "e4f877e86b6da25cfdadcd1967b98954c7c4545178769c78269975ba54734ccc", + S: "a8676a0bdf9fbe47f16a92bbaf75821906c74f68ffca2fdf602d7f48b4ef9e6a" + }, + { + msg: "9f25f1faace8de677a8a67adc7eea9e93f77a98bf19429647202639bff18ee8633a8d4bc675a4fb58ea5dda044dc78d43cff74ac14149dc94367877f1e063dc3ded853c8475dcc10082b42c93256e3ade3c22623dcf86dcd28043d3d4c538f807e2f25a9b24fd939c72c3de3ad09107b327da970b9fd47045fab7c8fc5de7101", + d: "533e7ec63dddc22071a5614409a68b3f99355de629abf2fb9dea696dd6bab1b2", + Qx: "ca641448dc12b7fc154d9bb129affaab4f03ed5d28cc8ef47d318404b427e9c5", + Qy: "668c5930638802ca8dbc468f2b69176036da375ca16308130a683cf610e3f260", + k: "21ab69b8ff8eee106d6698cddaa58052bc23564cf8ac28570f4164470f3f9739", + R: "63eda6e6a7888fc4bd54242227b60520dbec520b5538e14eec2ea5ef1ce1c298", + S: "f6fabd495f7191d2df06a24d53748c32e014b0e456b4406769500399ed93f881" + }, + { + msg: "b4b3e4477d00cda57d5348ccb70e3321943024acced95a85ea5e48c1a5beceafdc61879be5f743f4b641418a9fe8823fa2d8f6222ca8c4d9f586d9f221a2dee648c47f2539879374efe1f17de0404f3bf2e7d4cc512f38baf0a9d73b5a8f969314dee5c12652ca7e2cd4a1901b7a21fdcfbaf11b9508fe6571cb296020c83ab6", + d: "9134c53bdf5a0fb7bd1d0afab6edeb0ad7270c5efc083f3256f0cb251fca3a7d", + Qx: "760abf17b9abdebfb8a7807d8a96e69b68caa9e5c883be8fa8a3c6140c22e217", + Qy: "817a35e830b254508ae9d04cc9ef58f06254e6711174e3f9fcde6560b8c3a75e", + k: "d2cfd5d47c6a3b125557d86509618859027703197bea96a483af6de4f0fbd0b2", + R: "23131427fa930631f1dad2c8f2c96222245a0f14b2704fc87986adeaa4a25dd4", + S: "769745372812d2a2b7d59bafa1d1276fd63c1ccfc06cbf44f3e93015191f690e" + }, + { + msg: "6c912febe971de66f63842507c77d68323e3eda0db15bbd169c12fabcacca45942fc5efe5e50fd2d88d81677f16d6a3ae35730f0500b276d894b398e1229edd97da0d01d7951b75eef77186fa17e0cf75f3372043bd1290a9f79a5b274adc5d08c02f7e6ec680faebe6c6127d51c03bb63740a970d5ff9940a0d807a4fa2c915", + d: "2c678b91bc8c8f2610439bd586b69c0549847c32ef41b2d31bab4d90362cb76a", + Qx: "392470b95de6502a2ee121d4798fec9fca025d7f49b7f5134c2c8faba1879887", + Qy: "ec293c22cea46db8fd6a90ab3d3b1e763f6f1de09e79408725007ac4edee31d3", + k: "285493df1f126a153d9cd79eef19e31eab3d2ece9a8898b463175680e7372d8f", + R: "a12aad3339e291c0103974af9e77713bba63413e85f05aa3230a9c2487348f69", + S: "8dfaf41f619807b085453a14df195d686d3d80c97602a0770da853de155da630" + }, + { + msg: "f44a2f163fa651803c6ccf07b13a0120265fdab908e3de4e7c30bf8c55304d6d184e654124044cc2f31441f7c9540ef732623e603039754b68fb4246ab9bc3acd6012309e650cd35bf02ee552c354938c662f5389e5ce35964e0e060ff1209ca209f1049f9e62dc36e1182f3a22b31cbd8a4ab4163bdaeac7621d599de6e122c", + d: "1545750a9cf39b189e0fed21118c95aae771de4664552a2b36ba2cdafa072496", + Qx: "91c50e3505cb18127a1cfab0a543df407e3189f300c03145c801f6fb3c06be56", + Qy: "1c80d1585e045dc028c543aaff97f9dcbdc14701e6113ab2d983c703587592d3", + k: "d74686019626b6733960263474938404c855928a0e2b3251a1fbf6e63df00c4b", + R: "ebf0cb5e43e28aa9c209ecd1b9f95528e5820305b85c73558cc4ebb43e4cb20f", + S: "f75770a7cb17ff659dd241ddde8dc2a79cc6a8d89203c67cd5b8243c40877d2c" + }, + { + msg: "58fa1c954d5b63e4637fb27ffb8d9521b756c7daf47a7b0906f53fe9a548995a03d2af43886e4bffff5a1fa8ad9087e48d17c1e6de55a0b5149e2200d14d73b3c95f74ad1708e75ac864109c6b21d8215b7c8d4d750337dff8d7f56c524dfb6e30e6637920b45a6ed052c291280e4f1eb22bde0310fc80a391325b34a29f90b3", + d: "b24cbf1f527b4f178fccab71f5397cfac08448b9466a94ea61dfa1fcd117bafc", + Qx: "4140dbefc6a025aa38d89fcbf493d9c9cf935285cbf6e6d46439b8b4b2b212d3", + Qy: "39a3c27cc0ca04eb822da9bbb543d1550a00bb61b8ad6d928d03282b0a315c25", + k: "7a4f0c2190ae1e04dc3ef9bab93a3683e9f2fddec48d93f3ca8775fc4d8943f1", + R: "7a896ba95a27aac2f10046f07538dbfa023b7fe6164dde5fc8d4bc7e981ad291", + S: "7698349f95ddab79c9de2ff97acff63da555cd7025ebdd0a3fe8ac37bed4c77e" + }, + { + msg: "bcfb424e5325b7db169d25152f845fce8a5d0c431985b48c622c1bc0306e6b2e927e1aa4a4ad49c00ac90a3dff38a48cc6a1fd051a0206c75153f6732969d0d1211cf09b573a8c04ac9c12a64d852c5417b9d28b8c4c7fa8e3588cc171ee550dfb7f73e0102e82782b337eab374ee4d52ff8951c8a6d460a4ed140e0611cdc1f", + d: "53e2db8a5e9b560f8e1271dccb0df690f086a6d7f35334853a2a01932da42737", + Qx: "355f248821295b1ac54d4d67c7f85ae7e9aa39f032b8bca7e300228df1b53d6f", + Qy: "f9edc9c3b39111ea198bed4b8116b4ec04d97ac1484ea681611ff9e18997911c", + k: "2cef19b64807559a22d795e00704e7687eef1ab69e4bc9addafdab4aac3cc25f", + R: "3ecd9eb36b538515b9f2cd7e9ec731d11d367c2694fcce7cd8094c6eaad32f8a", + S: "08511a693d962758434d12d76330189969e05f672f8e6d4d681880e92999ae1a" + }, + { + msg: "e933cce186c24ddb88754a08c5f1571c170372593e6d3b7c256c378b290a44516a71a8beea253d2110793b66958686ee475deb67a2352682ce9a3f4e02b0c71368cd8cef7d23f9b4e6c46f6e8b3b07b90fc2d499e3274d11570be39c39cbcb6f92b245be47f0d60fdc03bf95e0dc2b22c2b985df4e407485e660984715bd217d", + d: "9691aa416ea645de2fcea9041086a62da57f6ea7771eed2d88305aec3e91ce70", + Qx: "2bd8ffbe98b9fa4489c9345e9593626b250f492e1b6cfeb7d9fd5a63dd0e2aae", + Qy: "ec0ed1bd59eef482e7a83d21ff01d44d0537281e23e66c3c498e3278c6a9996a", + k: "4b5c25141913b2b08508098d713876c6379d8854fd82ca9adb55fd893587eb01", + R: "a2f503d5d5acc9536b4c2952fdc67ffdb3953f8feb8ed05afd9db2c013e51a35", + S: "85787a416dcee11361d3f6be9943b592f0e74ef9e1b067131aba60a4bf1cae48" + }, + { + msg: "129dfb15456ecd1c70e421dd5df55037f0481e80ae2694cacb702885847ee3abaadc4a0adb27075f26ee852d560723fd5bb3379aa022e8be25ec294638bdd53166d2e9ec35bc78e4d42cbc2c4b58dcd30222cbc46e56a4bd8a0dc8d7744e2e0cc3018ed25a450e12a7030963a05afdd03dc4a6a93c099f5140c65746d1ffe2fd", + d: "f739a5d137495f5d5b6cf1eef062f0e2160940ef69c8b480505bcfa783c5f650", + Qx: "f9cd480b2daffd9fc7674750cfe0092aa73e3e33f83f6ae81d9de18b1c7ff29d", + Qy: "67a661d919c13bc2c4b4c65935ec4ab4c89e46e72c7430c027d56decab986ac9", + k: "34da46b8fe9a20e59d0c6cf73750af580d60d17c731b28ab82238468cd8106a0", + R: "6e7973338806d8885a1e1962d440c4122e685a67bb453981b0669c2788aab547", + S: "eb7fe09a88e47ed3a49209dad4cab1eb1d5c2c3c93b7ef8e26266add4291ee2c" + }, + { + msg: "fa0092ea1b0ed56800689ae9399522fed95dc55e88fc9e4d4692576486c84573633bbaac30fe1554dcd9f270365bb0ec9631b0564b3d2660850befe501718cbd06d1446a4978a34e2e27cba67a37e25d0f9c0ad9ce33008844e4fd71ec21dd873e84933653a24e5aaa420ef171a8e2073388cc69013c8b2d43c6840846cd20cd", + d: "fff2b2469b0cad0a6cd55936558f1d6af2644d0a5fc64136aa22bff38d27b9ae", + Qx: "118ed26c29d0a1d4e85e6d5d0250464f6617aa601294891c31873e00d574fc00", + Qy: "b6a6b61556d9c3c1175ac845915ba92acc0d84cd298aff3fec09d6162e42067f", + k: "6c7f12ecd6224c4cfc9d5883cd34de3aa93b3a7204fe747ef634ea1ac47c3453", + R: "459701da1b57cd4a4de43ca13438967b0e4ff07679ba73dc22f96925de645467", + S: "f7cffdc4da23abce131c86daaa686ea56ae714c13a7cef353ea95302d5708c3a" + }, + { + msg: "4ddf84886629454207b770c0651a72dfaa4904044c1781a264763f1934201ade0ee11dfbe1c5749adb0ed54000f4cc59e219e2bdd6d062a0d453801121ad0fcc4d65d3b30c4b45972d1205a84c62fc3cf9b8bef989271108a2b18a0f1b4706b1172cec6a2e20a5db4fc9ba3dc200073355acaa6a5d8e6f3d2e513dbeb9734458", + d: "a30a1a653c8ddf1b03dcccb15b96e76a9620ca7bcbb1bac3754e053fbc55c989", + Qx: "625a8fddbcabe407bed77aa74f90fec783d955a0ccf88e81e66a1dded4196e6b", + Qy: "d89e44f1b8a0dccd8c500f2c6a460942c56330722cb59a45d38376938627a1f1", + k: "83fe3f656ab40a45ff615f52dcf74f0e6cbc3f3396d275abe6f0cba92ec6aec5", + R: "7ada5e3c644fc66bb1d3967955a7d3715b760d950db88724c75568ccb1f9d285", + S: "460e27a26e218936e9323b350090cb9267ed5794a564dfed4d3920d1d03f3538" + } + ], + "p256sha256" : [ + { + msg: "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8", + d: "519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464", + Qx: "1ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83", + Qy: "ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9", + k: "94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de", + R: "f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac", + S: "8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903", + }, + { + msg: "c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1", + d: "0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813", + Qx: "e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8a", + Qy: "bfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39", + k: "6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6", + R: "976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db", + S: "1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932" + }, + { + msg: "3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee", + d: "e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef", + Qx: "74ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde8", + Qy: "29074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614", + k: "ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2", + R: "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1", + S: "ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96" + }, + { + msg: "0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30", + d: "a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07", + Qx: "322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e1", + Qy: "3c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999", + k: "24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18", + R: "d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884ca", + S: "b46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89" + }, + { + msg: "dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7", + d: "53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d", + Qx: "1bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba82963057244", + Qy: "8af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1", + k: "5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4", + R: "18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c387182604", + S: "77c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c" + }, + { + msg: "600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71", + d: "4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d", + Qx: "a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00", + Qy: "d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9", + k: "e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab", + R: "8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68", + S: "d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb" + }, + { + msg: "dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b", + d: "78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab", + Qx: "8bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c97479", + Qy: "0f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96", + k: "295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77", + R: "c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b254", + S: "84a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30" + }, + { + msg: "51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b", + d: "80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a", + Qx: "a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e767", + Qy: "2d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185", + k: "7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22", + R: "9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902", + S: "d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f" + }, + { + msg: "558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8", + d: "5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881", + Qx: "1bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3a", + Qy: "ec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f", + k: "2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9", + R: "2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9", + S: "f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199" + }, + { + msg: "4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e", + d: "f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308", + Qx: "b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde", + Qy: "423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a", + k: "62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615", + R: "1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620", + S: "880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430" + }, + { + msg: "f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a", + d: "b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906", + Qx: "51f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce", + Qy: "4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1", + k: "72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f", + R: "9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c42", + S: "2bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c" + }, + { + msg: "3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4", + d: "d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7", + Qx: "8fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb7", + Qy: "1f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573", + k: "d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778", + R: "490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb", + S: "644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7" + }, + { + msg: "c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7", + d: "b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c", + Qx: "68229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76", + Qy: "303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c", + k: "e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071", + R: "e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb", + S: "9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333" + }, + { + msg: "72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01", + d: "54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1", + Qx: "0a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bb", + Qy: "f26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae", + k: "646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a", + R: "b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64b", + S: "d7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851" + }, + { + msg: "21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34", + d: "34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1", + Qx: "105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d73737", + Qy: "6c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4", + k: "a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4", + R: "542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d962663", + S: "4f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f" + }, + /* + * This vector comes from Suite B Implementer’s Guide to FIPS 186-3 (ECDSA): + * http://www.nsa.gov/ia/_files/ecdsa.pdf + */ + { + /* The message text: "This is only a test message. It is 48 bytes long" */ + msg: "54686973206973206f6e6c7920612074657374206d6573736167652e204974206973203438206279746573206c6f6e67", + d: "70a12c2db16845ed56ff68cfc21a472b3f04d7d6851bf6349f2d7d5b3452b38a", + Qx: "8101ece47464a6ead70cf69a6e2bd3d88691a3262d22cba4f7635eaff26680a8", + Qy: "d8a12ba61d599235f67d9cb4d58f1783d3ca43e78f0a5abaa624079936c0c3a9", + k: "580ec00d856434334cef3f71ecaed4965b12ae37fa47055b1965c7b134ee45d0", + R: "7214bc9647160bbd39ff2f80533f5dc6ddd70ddf86bb815661e805d5d4e6f27c", + S: "7d1ff961980f961bdaa3233b6209f4013317d3e3f9e1493592dbeaa1af2bc367" + } + ], + "p384sha1" : [ + { + msg: "abe10ace13e7e1d9186c48f7889d51473d3a0961984bc872df708ecc3ed3b8169d01e3d96fc4f1d5ea00a03692bcc5cffd53787c88b934af404c039d3289b5bac5ae7db1496875b5dc73c309f925c13d1c01abdaafebcdac2cee433939ce8d4a0a5d57bb705f3bf6ec08479511d4b4a3211f61649ad6274314bf0d438a81e060", + d: "a492ce8fa90084c227e1a32f7974d39e9ff67a7e8705ec3419b35fb607582bebd461e0b1520ac76ec2dd4e9b63ebae71", + Qx: "e55fee6c49d8d523f5ce7bf9c0425ce4ff650708b7de5cfb095901523979a7f042602db30854735369813b5c3f5ef868", + Qy: "28f59cc5dc509892a988d38a8e2519de3d0c4fd0fbdb0993e38f18506c17606c5e24249246f1ce94983a5361c5be983e", + k: "ba25756f1a4a9853bbf60cb2c789569fd551abf3a9cceb889ff71ab5ef7758a3e302166bf2a01a29af18ffbd329cd781", + R: "6820b8585204648aed63bdff47f6d9acebdea62944774a7d14f0e14aa0b9a5b99545b2daee6b3c74ebf606667a3f39b7", + S: "491af1d0cccd56ddd520b233775d0bc6b40a6255cc55207d8e9356741f23c96c14714221078dbd5c17f4fdd89b32a907" + }, + { + msg: "f6c1063a44a18265cf2861a089e85d7919ad6b4648359477d820d419c10cbfa4c11d874bf4a08b971ebe56287d8e86d8f1ebc6293c78b738c7f048e059a6f28e8919f2f4853a0b28ace36ac5bc8da7f096ecbb795107f5f1da621deca31acfcd5a2109e6a051da338df7480c0258b511786756484d6ad748c7304abe90f7e233", + d: "f058ab8da69bb97e830d94a0e062b547404a667627a81840fdaafcce1e84473d873e2ace6a8d2a1888948063a3b32056", + Qx: "762baf5164a5b1b9f7773808ddc1a4fe5ba692b33a9dec84a7b647c265153f0684fc1d4e2c1fde0567feaab5f0436dce", + Qy: "d3677aeedb149527581f0473521e0d78140cd32a96e1d9e1ca4b64f8cef970212c8e3d9043de251f8b8b337f54e8cfa4", + k: "1bf4fa2025cd522e630e36dde7805f9df1cb9729105e4e751004d2997017fbd14a2dd36c8b5d24f16704da442770c381", + R: "70f6087c96d29d9ca44ec14773c85eb23708cdff30dd0858da741d0d7687f0e6b9c04620cc757cf106f8d7ea04504442", + S: "a07783086ec45c2be737001fa90fe91412731d59364bddde22525fb5bff00718a5ec0fa0ff6f5ad71ada41db7af32395" + }, + { + msg: "429ba62978a21129a87d8e50c6c06e26b94b42c74b079942f986c786ea7f294ca415ba9e4822eec1e269408acbfc18b6fb6790c7e4d234bb047a03c9d9736071d55d124ebd943a2bc5a396f96e680131dfb5dd21db63a67d319c8b471cbb093d6211061e0796d7d17817fe186d0d909258d6c68394521666d4eb99506c8fb280", + d: "3d2a59c2b324339f298eeab2a67fd8977f0ab5ccfedebbe7520216e4d194d0232206cc2ede6f7e6d34a383090f105c47", + Qx: "74c83ada1218cb5f6b303b1e9ce72973a574216b451543d09920854925dc12f01594d81d405885136d0e68328f7270a2", + Qy: "34d1ea91b3cf5c34abfece7b778c90f18d62a7b34562e74a340e164b9a7872d3f8cc0703fbcd86093b8ee1c6f6ecc1c3", + k: "0c8b1775b01b6a98adc2edd136851713bffb41eaaf8da779f18b9d4e46dc25a9ea69788951bcbdb2b3414bffa94c1a8c", + R: "99664f7a18c378e89499ac5013c9549f66b9536d534e37f9035b6d579e1d1c6308f24330f3c6919b22892c613b296808", + S: "749554953a6dcc2e75552eaeae5608d4065358e3bf1c54c80b3a2942c61487aea88b651fb06f5ac6173b8428eb9cd4c2" + }, + { + msg: "a735612430e7824d2f0c23a4997887fd129ce01a72ec8944c366b2397cd189dbdd978e904ff8b1b00a5f5b0f7adcf7075000b6820959ee93bb3a54db87790b27d5b9abbc1bfbb3c7048f9f5f403b39f5da6777efe7af7d357bbaa371d8554dbb817ced9c70d8ef268fde3d5a9cbe68114a8768e1734eec2a3ff7694374d2c607", + d: "4f9312adcfad6ffdd0c4cc4f1367e52ebc37dd8f0b11c685f846771b8d45c70ba420e6567387948800d6cc9201bfe60e", + Qx: "8c08e4f67ea47522582bf2ebb8b06961b10892500f05c5aac66ff5b757518285b460bb152525e671a6dfda2b6e678e14", + Qy: "7961721a35d8319700ebc3adabb9f686f44d1674bd9f542e8295b2ffe8b48d69e71ddeec38612abcbce296d059d03be9", + k: "c1fe6ac7761cfe487ff24e4f87889524febf50db850608b4f7655e5b4d9715ca5f17a5deab5b9717548069e96e799df6", + R: "9128a790c7be3008d0fa79b6cebe2fde800045b5fd99df7e8f964439a82d1cd1d0264bee844b20eb7bf2dc490ce9e94d", + S: "c9214132dd8fe8f08c5d95e35e49dc912c9fdf9d5b2d359855f5373b659962b2c988fb050b14688b51fcf98094bf4ca1" + }, + { + msg: "ac248f141503afd56de5b41612b550dc5b2103904d9ef1e2758a4e7b2cee41b6a51bcb246672548d445204b6e51921b47c3b5fdde1274e5f22ed000a566e591e3b4f86d706e0ec3415a7e6cb8df6cbedca983edfd60db5a7be4adb6143e698d3d15717cc7058b811e4c226d0ac8535f4b7242ad261e66778aaae973fd5c1cb02", + d: "8713954a6fdc62eb278f8f2bc11c6aa6aa96341f87df303103751e4fdde4b7da554de5e568e8d4ef7c5e2520ebd90156", + Qx: "a770c1dcc22f8fdab4158d798c3bd95cab9c19cb670e789a18e0fb6b474297e5c45fb2e867c28b8c2f077597881d30b8", + Qy: "7cc9c857d0079c5a187b2a2cd0932d6fe0ec2d8b161d349dd3122d8425513e39df248af04dd3e05ceabad8dc1cec14a3", + k: "9c04b46e5443683f8a6a77788e0d7204592cf12a17a1cdb785239e46bb3c3d8c61a99c8e2b71ef6a042025144c073521", + R: "7803606f6e60ed987fe7bae5f97b2c5ce4befc3e1ecf9ffb053abc61e30fa07bb04056d15fafaf8ce53bf6003e875773", + S: "fd1d3ecc1b8273d22a5659744494deba9bbddc49530487c2ab983cba82522dc99ae68bda00261f6514233a5936435c62" + }, + { + msg: "10d63d0932cd02dcac5c00f0a256a04a06b9022b662d72e1ba2156a6347b29eead66d0b16888981e575cd5771ed5188a20d8105c12c9677cfbeedfd00d97a2da392d70b9ee9702f643716b9e98f990c9fc0c30f6d3cfc860c6d279ec71893bfcc42251d51a29253aaab5d26f5a6b35e07675ed98e096dee8cbd3b724c5655ce3", + d: "9a7c829838b6212aa543c5acece0ab7d4502838a474e25a0d664c1807c787a1706d365942efa6576c8738ad6753048ef", + Qx: "173182d5e68e8148ec365ae7a2d8a8983e81488d644cf703375b64e8cfe1110d969b8daea8326f4bb62b2f1c26ecdb6a", + Qy: "b9c8ce3ad95449c6263b4b76d2b5bc1298c6ce0f86545ea893f95e26fc578624ae9cbe4776eabcb16e07cf49f9da7462", + k: "a5ef3548af0406758bb6714fb7d576f147059482624cfacff4002afc5b71ff034125d5f9b696ab826219d6c240a81296", + R: "624d9d3b1ac954828fba1fb180882ecfe041bacde373275e68c5096937aaba2c4891430f22bfec7b23f66820d2f9d10c", + S: "c3245e068837e2e180c57d77f9bb0cce1e14ab8491797ca042e43662d51fca15b52a40f2ec3de80655fe09c33c675ac6" + }, + { + msg: "14abd3c6b5f0f29a7f5b35a18547fdb9de5a6506564c0de4017d4ba2c18f848a2773b7f2270e9306fe092dbf2274e17a195817248d688367280aec2e1222caddc90c63de3b8ce77b3de6f80eb477e64fe459aa5820d8e10abb1f46a2b2679b4c8ff211303dff97951fc9233c9f8805176360aa70906035a1fc87446c5f1a0aa9", + d: "e6136ec60221b53c019866e0c8afa087893339c4b8ccb587083321b4cdae2bc354325c9eb06464958a49fa2de4bc030a", + Qx: "30603f54d41740151c4f0177540ff12add6e2ad7be5fce0af9cc39c2527c949b2ee66ae723be1380ea71e94e29799fd1", + Qy: "2445cbd5e8510fe387a433b50d2c60cc70ad11d1af921f7c65d5a2f1ebded3ddb667a9a8985dbef3d3e08161b398f32e", + k: "d6ed0b3ab1b70984abc67fea5dba4f448fcae34d3b77a1f5301b17d1dfd4e191ab70aeb88d195e2b07df0549287a8c4f", + R: "350640057ea4c2a02ded8e053e4d5566acf9eb3ee20e76457b1e423109922802b957fea42baeaad9aaa0b101fa67cde1", + S: "83ce730d9f606eacbd8f1dcae3eb6ce68f559100586577ff11481a706aa632a7abfb1051be086d78cbee27a0b7ad66d0" + }, + { + msg: "4920581f4ee31e2d1a9c303ebd7a1712bda879fdeb1daf99dfa28a042ac9d6370bad567ca392d2bc3ed6a2e2002520cbfb10d309e5d4f65ee9d34c836cedc6b67448ad0902ba4e9bb082362a7160230cccb53ee0bfe884e8e2eea81fb1e7dc4aa01f0191c21745aa6431aeabea4987abb68aa53be9a4fd8df2e97013af0d17dd", + d: "8f1fc47321b1708a0f3f320e3b8e6bb71b57eb334c2cc20553fe2d1cf00ed00c40ee8dbc4704862bc68cb39fcd8dc03e", + Qx: "c03696284c3c843d28f54591dc813b11da2bb8a83a8ab20e0b54a1b0435d6cefe99fdb5812e87a3bdf8bb600aadc5f8d", + Qy: "5e32ab64b65c3bafd77fecb64eda186a871684fdcd1c97860d21303e63bc453b3abac338e1f3bcf12a3fa6fe981a2e31", + k: "32ca5f506bb5f7c95eae80fe849388f76bbd2b855c6e1bb766f9a7d5f4cf6337112f9523039f962e5dc40529fcc331bd", + R: "a162bb54548941e63cd87753ce77d917cc9f64a6040bbd6c48fae587b2829037bdec9e3a7e09d93ffa5d797be201bcce", + S: "3798c49f1d2c9507aeaedab09ef22d8bd13353c87fe4685fdc531c04f93fcb95388f1ce1fba9f5090c03b0f3bd9a57bf" + }, + { + msg: "5e2525da0c76ad1c7f05b728cf52ef07c6d346ce3382e72bdbd7312ea035f9e2a4920ace8a3524f8c695f9e1cdf35315dfbfe804d79d0ed44b2aff85276f34603f2feb6dfec51b94a5e0ba97dd8294baca948249319e0d5f656d371a67cc32a7fdca78b9c19b19b88dfbb49a552cfcf80fa2724a2d7daa76fa79aec7d82413e3", + d: "88f54804b66345889537229e0a3ebb01901745bb0c2e58259795ef805bfd449e3e28c88e63f80412855dddf2bfbf16c4", + Qx: "2dbba355935388d99a59bf1ca24e8f915186a5012325cbaf8b44a77e60986bbd13ade4f5af8d5baeb7f927697d28d35f", + Qy: "50d67264b86fcef65553455403936d47acdc3b0f0104e4259d62fb838584086f76ab08a98942b9179e4f30b2561fb2b4", + k: "f426c920e96667343c6d4d6b79e5e1ab97ee7da40d526d3a9f0a992de01795a73c3150d940e0c41311cc120898b8895b", + R: "948e376bd2f3ef488ef75fd39fd42140dab1a838be08b35f44b898f23e6959ac2bbab05840a42ea70443555677712028", + S: "a815053ce1a0a65686056331eb952a6098438078a081daa749071fa4d9206692f1f7fe0930fc5aa32ed5034134fe6885" + }, + { + msg: "92ef3594e6d80d33276d81121c1a9f31361fe5336642803d44145066728ea29afa32d8fcd5ca995c52e652bbe9ba77cccd377c34a440348d13e27f44e473e50b747a36c5bef085c3e3a56f62d00bf9b2848864a1c8e259d6262a90ab4d85c33b3e382a5ef2bff1ccbe68160e77dc108e558e3283fcced1afd6decc88d8589e44", + d: "a95cbc7a261e932417b2cc01a0934c1633a5728e876394d27772febbd57e2e6fe3620df15a61813ec00fe0d41b760131", + Qx: "37873d4ea00a594976d5acf65db8634dd2399b4fb4fabf4a1e3b41fc14d3229a70c41fa164c555d1e617aeeabdf742ee", + Qy: "7b2d2c9ea694c4ea71ad7ca473be982f2ca25d2ca3f1ac37c23003c665cb9c726dedaa9b913e023b8df52ad3f80523f1", + k: "7a159b8a33e4319b99ebd523f5a993546d3f27f4a9749cd370dc44fbe49cd323f9ff03b8d5bf548f0ad6acb87207e534", + R: "9e3db7869dd52ea7eca61eb45831df81763974d8df9bf3a077fea35f9a098a158c91fbd6ea7e6db0d26039a21dedcb01", + S: "f05e65320b48f1dc92c1eea928aca3aacc768e9570f91b5a60d367c50d178609f685ec8c1584afebd0264a9b770a0786" + }, + { + msg: "3f5807da9c649aaac6288006a680fa06a5ecbf6fcd97522753139f41ce4aaf56a02100d5adce1926f49901e45c15408c4c7d8c8f6580d5d004d51446176528252999b4ca5d2f9b42b3f9e770c41d88b7a11c3d0665d7b6621329f28c0b5da0864b6dd40662413071909257e763490f7f23c9a39342af0862b89e03527d317567", + d: "4a314ec56d0026fc2fcd33c3d098e1b96084b27f3e63bd7defeeebf5f6f6aa751f390dc6dc96b67d62de15a7b06045fa", + Qx: "977eac715a79a5f2cc277d2d70c7d6b3d8e94b567e2ca383633a1ad749f6ad7e253918caeeeeafc2de3e22fab9db6393", + Qy: "3a05a8312cbbc5f1aa69aaff8edfc99e12df7964e9058d314a176d1b76ce8207408c6bf0b8904e65f59c7b7058e5ad29", + k: "79e88b71e5c9c075ed40c207d45a6e16b98fd29208bd950ab823b08fb763e79a586e9a4b03e857532e02f1d71e5ad61a", + R: "9cc23717d433f808ee8bdc7c7118866c6db672e07c707042c65dce3d77aa44c73ea7d658602db71598f9eeea6a1b55f3", + S: "6392f35e844c018610be532fe442471b3d7931a9595cddca3c25c5661b1a2d3cc45d90cc1861e6707fc60b820106ec54" + }, + { + msg: "7bd895d9f6601838b502b7c1d66f3826915d5e9cb94cd6ba3191432bc0d9259173833a4ed531c01023f520c3bbb92d346fbd2e43e5145f4465db3215c7f56328ef88a28c4f8e8dd803dd552d3fdb703e132a266a391a69020157a2a80331e1219a1712ce278bc80f51f700480fe200f18b33950e0ff7daf5d87c5f87b359914f", + d: "d01840f4bb77ffef94723457b4f0e29bc2c8454fe85baa97753790f7378a5bf8df6826ac73b86a4630be5175e13e8bee", + Qx: "b3cb40021bfcb4b09e2eccac438fc9b1f28f6a4d767c5c4a45671d62b8f44ecd3d355634ae225c7d9f1bbf35bd88b3d8", + Qy: "0611c73f1bffb1cbde6b292b10875054a37ef8ec0a90da121b6b954fb329a9d6779c0e225a01d640f3b140b9cb253c72", + k: "5647129036d20d84a13d70f2ecb3abe399d1534c629a2e572ba7391ac3a28e6fc1662ca9ce80ec262d7c0a39de7b994c", + R: "7a253ca0766f90e3b2c1c40e9905787d1144fa1aa528a8a01cbf1eaed5724d225a7c066c95c19f712067243e66080b7b", + S: "dd3db6f19760b65d3a34dfe19b62208964f523485cae11e8e01f8d3dc7abbf3ab2b8c150122d8b6dd56d6d9b40add3f4" + }, + { + msg: "29dd164a7e1dcd2174eb96c0e88c659a1453b6470d77f70d72c3b122780755715a4547ff103c709b4b3bad59484c680635f5b8b67af74156a32d3d5a66509284db68e7fb3b589254e233563bf42fe680878bd8ad1ba3e6e7fe81f0d16e57ba71985cc80c0d6c0695ec779fde8787cc2a3753e978b82fd291faca33d15815fd6d", + d: "81832668cd5ebb74d8daa33f7414c1d025dd7344a73974fa8d3d58abee83d7418baf17a3e42d43427125d78799c99b52", + Qx: "d6db14db42e54afbb6b9b52feef267f91d26e23175f87035f3ee5fd48b9bfd6886aa7ef8bb324cd36f348d7c95755006", + Qy: "2779be1a39113228576250b2a77f9de53cab65645af15ba35e8271369d6fb02ff2bea6ab7d224d8229581b7c58b70448", + k: "5e5f44e0c9949153ffb4838f32124f458eac07feb916a8480019d550ea25aa49dbd2319f413994dbfd72e5d739863d13", + R: "0d0249a735fb4566218e56fc436f759996eac374b99f8689d79eb1d13e03a09a87008a7a183e53ed6040d7f80e868bff", + S: "ab3b29bb70fad6f713dd40be954a0be552475b665010ceddbe883267e90627cf0c51bc1604a60dbf6ed7a053cd314b05" + }, + { + msg: "e54221f012f050b34d0feecf3bb427906840a4656374724ad3d41d876275b0d52b98645b190b5985fcd21a39cc662aa6033d4383e4dc48b907c499ab99cbacf3bafb078ccf867707d765e0fbe914c3dc404119639bebb80637b41318ab2c85aa7b70a749903c405b377abeab8e84d2a01961a9c2f3102e6f3b5716b63f89737f", + d: "2b3bd4814050e3c2f72aed6d05a42a32734bfea28efc8f8b2b5861eee3e457593c315d3fc5f68bc612645d895a2f0270", + Qx: "087e54b1552ca0ae80731e0a222c27daa8c8bfec958c6f2f9dd87ac3bfa5ad9e0c3bd0233bd99e13c128073299931547", + Qy: "f76b48d48391e70401e809a395c006c60f6e9febe4d03fa071d8d3b778166e6b047165401cf03c387e797c95965dd741", + k: "038afebb3fc960c01a494deae196075ae6cfe0671df54248b77e809073cbce376c049b4c472213a0433b292529edeb56", + R: "8c408a1e940350932da6433227c1384c181e557ad93bd5995d369f25fa65d1cb708d643a21da370a202bf171298382d0", + S: "d2607418569e36c7839d562463c5488b207ad9685d2449651f6d35b42383d2118568d55eee85009a72a4d4a9b9a1ccb3" + }, + { + msg: "7ff90295dc87aa889a0eb6a2dfb864ced3fc12b42670eaa3bd04aa886341fda408d559b5bceca805fdf045399e0f1892ea4edfae35714f1df09f9c473c7c66220403da0697e321bfc0c36da141988a45619fb466621f102431ec74765146468ea53e5a792121495345a23ebecc1e673a3164ad7f7b25f053f0dc50e4e5cb95d1", + d: "8918f0a85ec63cacbf866ecdd61fe905582f677be22bf8f9a830df7c3803df864d39efac6aef10b160b8b9a459aed096", + Qx: "0e4afaf083220ea3de006bed7ebd2ce2d7a7d3723779718a2a591859506c1f9c8e370d12b8e433eb1ae1650bf000fa56", + Qy: "a50c5ca35317455edd87bddf470d9af037868a54af8ae756592cacba2d1ade447497e2263c9dacb7b7165c7bd0a3c31d", + k: "c9c84818894e0c338c0fce743e189e8bef4c31e43091b7afb580d7821e6f3c4ca6b3852ae7c3d7f682c2fcf27ebcf12f", + R: "d7a1d00584ae855f823e77c77f9ac300eeb2af078e42ab0a0a43cea510d8a6a6a1ac3a6ba13c4543efdb4b046028584a", + S: "c38750449a3603f41667a966999700fc6afcf212e677a18b91be974819cbd33c5e88984f1d1db600351d5a78863bda2e" + } + ], + "p384sha256" : [ + { + msg: "663b12ebf44b7ed3872b385477381f4b11adeb0aec9e0e2478776313d536376dc8fd5f3c715bb6ddf32c01ee1d6f8b731785732c0d8441df636d8145577e7b3138e43c32a61bc1242e0e73d62d624cdc924856076bdbbf1ec04ad4420732ef0c53d42479a08235fcfc4db4d869c4eb2828c73928cdc3e3758362d1b770809997", + d: "c602bc74a34592c311a6569661e0832c84f7207274676cc42a89f058162630184b52f0d99b855a7783c987476d7f9e6b", + Qx: "0400193b21f07cd059826e9453d3e96dd145041c97d49ff6b7047f86bb0b0439e909274cb9c282bfab88674c0765bc75", + Qy: "f70d89c52acbc70468d2c5ae75c76d7f69b76af62dcf95e99eba5dd11adf8f42ec9a425b0c5ec98e2f234a926b82a147", + k: "c10b5c25c4683d0b7827d0d88697cdc0932496b5299b798c0dd1e7af6cc757ccb30fcd3d36ead4a804877e24f3a32443", + R: "b11db00cdaf53286d4483f38cd02785948477ed7ebc2ad609054551da0ab0359978c61851788aa2ec3267946d440e878", + S: "16007873c5b0604ce68112a8fee973e8e2b6e3319c683a762ff5065a076512d7c98b27e74b7887671048ac027df8cbf2" + }, + { + msg: "784d7f4686c01bea32cb6cab8c089fb25c341080d9832e04feac6ea63a341079cbd562a75365c63cf7e63e7e1dddc9e99db75ccee59c5295340c2bba36f457690a8f05c62ab001e3d6b333780117d1456a9c8b27d6c2504db9c1428dad8ba797a4419914fcc636f0f14ede3fba49b023b12a77a2176b0b8ff55a895dcaf8dbce", + d: "0287f62a5aa8432ff5e95618ec8f9ccaa870dde99c30b51b7673378efe4ccac598f4bbebbfd8993f9abb747b6ad638b9", + Qx: "b36418a3014074ec9bbcc6a4b2367a4fb464cca7ec0a324cb68670d5c5e03e7a7eb07da117c5ea50b665ab62bd02a491", + Qy: "4ea299c30e7d76e2c5905babada2d3bb4ee5eb35a5a23605cdb0d5133471a53eb9e6758e49105a4eaf29d2267ba84ef2", + k: "935eeab3edeb281fbd4eead0d9c0babd4b10ff18a31663ee9de3bfa9ae8f9d266441158ea31c889ded9b3c592da77fd7", + R: "738f9cb28f3b991335ef17b62559255faf75cad370a222464a492e27bb173c7f16b22100ada6b695875c7e4b1a28f158", + S: "bc998c30e1491cd5d60dc7d1c38333165efe036b2a78db9b8f0e85ee68619cfba654e11ae5ca5ee5a87099c27cf22442" + }, + { + msg: "45e47fccc5bd6801f237cdbeac8f66ebc75f8b71a6da556d2e002352bd85bf269b6bc7c928d7bb1b0422601e4dd80b29d5906f8fcac212fe0eaaf52eda552303259cbcbe532e60abd3d38d786a45e39a2875bce675800a3eaeb9e42983d9fd9031180abd9adccc9ba30c6c198b4202c4dd70f241e969a3c412724b9b595bc28a", + d: "d44d3108873977036c9b97e03f914cba2f5775b68c425d550995574081191da764acc50196f6d2508082a150af5cd41f", + Qx: "c703835d723c85c643260379d8445b0c816fe9534351921e14a8e147fe140ec7b0c4d704f8dc66a232b2333b28f03dee", + Qy: "c5d0bb054053fd86c26f147c4966757aa04b00513a02d427b8d06c16055c607955efdc518d338abfe7927c195dc28588", + k: "c80f63e080650c8a21e4f63a62ec909adfb7d877f365d11ee1cb260baf112eb4730c161c1d99dba98fc0d5bbd00dc97d", + R: "81de2810cde421997013513951a3d537c51a013110d6dbb29251410bcb5ba001a9686b8490f1e581e282fd2ed0974b22", + S: "9cab0bbaffe91c7677ec3dd1f17060211a3cc0be574cbca064aa8c4b66ba6e64f3d80e83da895042ca32d311c388d950" + }, + { + msg: "c33ff63b4e6891e00b2349b3f2907c417ca355560544a91e24a7a0ee260d6850aeded29fc0176b6039ca6187e8333391047cceaf14b1077df8f147dad84d36b2dac5666dc2f69dc9b58b88cc73956efdb3b47f91831d5875051c76b0c4e9fc087012a1f03eeee85d6745b46aa50bd9cb0110c2c94508765cec162ee1aa841d73", + d: "d5b72cbb6ec68aca46b9c27ad992afd8ffa02cb3067b234fcfa6e272e3b31be760695ff7df988b57663057ab19dd65e3", + Qx: "135a6542612f1468d8a4d01ff1914e532b1dd64d3627db9d403dc325651d3f82b0f6f0fd1dbdeca2be967c4fb3793b5f", + Qy: "cbbd40f6d3a38d0dfb64582ff4789d7b268241bc0c36de2884bccfaeeff3b7b2b46a30bb35719804e0d11124b4e7f480", + k: "9da6de7c87c101b68db64fea40d97f8ad974ceb88224c6796c690cbf61b8bd8eede8470b3caf6e6106b66cf3f0eebd55", + R: "17840911ecdf6ae0428b2634f442163c2c11b8dbf0cc7a5596fbe4d33e3e52f9d99e99ad169867b1f39e89c9180cedc2", + S: "dd7ed67e480866d0474379ea4afff72870746f4feef2153be42f13bf472b1613d7faa5c0abb7f7464070f94d7cf3f234" + }, + { + msg: "f562f2b9d84b0e96a52532c3b43c39c8018c738bd8dc3797a7de7353971b2729d522d6961b1f2e4df3f6a4bd3653e6d72b74fc0dba92ab939c4b542e994e5db6dd8ed4f56f651e699052e791237ae1f552f990ad156226ae8f7bf17fcbfa564f749604f97e9df0879d50985747d981422a23040fe52f5ec74caf1d4aaad8a710", + d: "218ee54a71ef2ccf012aca231fee28a2c665fc395ff5cd20bde9b8df598c282664abf9159c5b3923132983f945056d93", + Qx: "01989ff07a7a452d8084937448be946bfedac4049cea34b3db6f7c91d07d69e926cce0af3d6e88855a28120cf3dba8df", + Qy: "eb064e029d7539d4b301aabafe8de8870162deffe6383bc63cc005add6ee1d5ced4a5761219c60cd58ad5b2a7c74aaa9", + k: "c5d39b436d851d94691f5f4aa9ef447f7989d984f279ae8b091aef5449ac062bcc0567740f914624ad5b99fc32f9af0b", + R: "07d5b1b12877e8cb5e0aa5e71eeeb17bf0aa203064c7e98b3a1798a74dc9717252dc47c7f06aaf1d5fe15b868323bbb9", + S: "69428cf101a7af5d08161a9fd7af212e02e33b6062aebdce4c96bf3a0684b5394cb902ca7c2dec6e2f01f40c4576009d" + }, + { + msg: "ace953ae851f571d71779aa120915f27450b236da23e9106f8d0756abdd25861937941228d225d5fb1aa1b1ebf759b1e326aeb3b6cd0cd87edd2ab9f6a7ad67b63d2c501d6a550edb2e7c9d216cc8af78dd33546af64d00abed4d0d2cfc5c9a7b5a055dbe8f7547902d185cf46937314832bc5c602419a82ab83dbd9d3bd5aff", + d: "e6ab171f6937c000e144950801ad91023ae8e8476856c2592d9f7d5bb7180fd729211803d39a412ead6c0be761cfa5d1", + Qx: "38bc42b8c9d8866d09b214398d584b1b24a488dfacc3420d1e9506aa825b19fdf1ba74e7b8f547f47b571467fe8c4d1f", + Qy: "5179d62668d3f6a7ab5c8e3761a685e12008fb87d0529a97645f65cfb5364376c1b6682e0ffcddd0bcd995c41d013ad3", + k: "05e9718aea9669c9e434f73866da5f252dec6d24c47a1c4ee3233450b6ec626de9746ebe095b285558dfc89fc1b622fe", + R: "df9bab9dd1f22ec6f27116f38831cb2089aa78aa8c073024a0faddd9a48e810a5e8e2cadd80fbf8dbd6088c71fe30b5b", + S: "1e0e8718567d12d18558c57f9e87a755c309e4ffb497335a3adfc8d7475ce8fd882d5dc33a8f5a16274b7ad74bb7862a" + }, + { + msg: "9635ab832240be95301bedb94c5aec169eedc198cbbdfedcf41e9b586143d829b4597a6b2a81902828332825fd84a785f187a3894e21bd99d22c4f94dcf34453fc052f15ec64d1447c932cb38fcdd30b7be851963409c11881438cbaad7e96f9efbde317f2235d66af804477a5dfe9f0c51448383830050ecf228889f83631e1", + d: "14acd516c7198798fd42ab0684d18df1cd1c99e304312752b3035bed6535a8975dff8acfc2ba1675787c817b5bff6960", + Qx: "29909d143cf7ee9c74b11d52f1a8f3ebd4a720c135612ca5618d3f432f03a95602ee75a2057e1d7aab51d0648ac0b334", + Qy: "404b6c5adffbadfa1b0380ae89fed96ec1ca16cc28661e623d0f1c8b130fbaa96dd7257eae2bf03c2d3dcbc3dbc82c58", + k: "7f623c103eaa9099a0462e55f80519c565adaeffcb57a29993f3a8a92e63a560be8f0fb9d23dc80bff1064bb41abad79", + R: "932ab291950c16b2b19a8036cd2e905714c6229cb190a73b3ea49c48dd8e76063a453c7c3267a57597d2973678216296", + S: "d17d4c5ddbb9c27beebf526f113b416c8abfad53d11c4224813c7f351ba41a77dd4e77d6e4a65bef2c9f62cc37a469a5" + }, + { + msg: "d98b9a7d4fe9d0fd95de5056af164a8b7882cd34ab5bde83a2abb32dc361eb56a479a3a6119db3b91dcad26a42d2206749567f0d97c34a981a91fc734921821a429f6a53401743a5c406ba9d560f956203abc9d1f32f1a13e7d7b290f75c95fdbf857ea597021461c06a3aacfa554ede3d69e4ff03bbbee5b7463ec77de2b3b2", + d: "2e780550984f3a00cb1e412429b33493c6eb6cd86d12f9d80588c247dcf567bd04296d2d4b24b889d9c54954b7f38f57", + Qx: "37dac42ef04663238443ef33e8addee2e78c40d50a1751913a7f5c37d1f23a26c7f86e16055c788b8ca9554f06b2f2ef", + Qy: "bbed1549652904e3d00c39b01cc0460dbaf3185e6190c2705677a9701de1fe56dff4f4d8418ee15059ff8fc36800982d", + k: "b788ca82811b0d4e4841765c71eafaa1e575378beedcd3860d8b92db3d070ac5aef7c425067860fbee6c50cf0c642bbb", + R: "7292b3851870daeb2555a8a2fb198ead78739fcfb75327e5c32a82c6b77d58983e5ad548ccb75dcf9411039c9576d9b9", + S: "a378c61802d9f1dd062b6e18f16416a954018f77df4df95ad1b983570377d5cfce4cc7861759e802c52f81abc4f49aac" + }, + { + msg: "1b4c754ac1c28dc415a71eac816bde68de7e8db66409af835838c5bb2c605111108a3bf13606ed5d8ade5ed72e50503e0de664416393d178ea4eec834d8d6f15039847b410080fd5529b426e5aadd8451c20ebd92d787921f33e147bcbeb327b104d4aab1157fc1df33e4d768404b5ccb7110055c2508c600f429fd0c21b5784", + d: "a24d0fe90808aecc5d90626d7e6da7c9be5dfd4e1233c7f0f71f1b7c1c6fd318fafe18559c94718f044cf02ed5107cb1", + Qx: "ec8ae1fb9bb88589d27d6f27d790392853396f37bc0c381631d85800fc668eea0886bf1c6cff801147df19778d5b1604", + Qy: "1e1a8336c1e2506f8ee388b55cc648ae73b9295ea78467979d2affb364536fad28120f51ec62a67cbb6ce7784780389f", + k: "755d025509b73cf1ea8817beb772ad150b4c17a52378be187daffe3db0158921e5e552d1ca3c85df28519939f3cb794d", + R: "23ff2ffa62bbd427d49995d9c9950116e0d5a06ef076a4553448bc109e6482c5e87d4c833bc88de0bc722bc98cae2e61", + S: "9aea13d487c3ea6917e16374caafcf0321c12a80d28902dd8cd81909bb04b8c439e2491e504756742d0d0bfb15a9c34c" + }, + { + msg: "3cd8c053741dd9f974c6c5dbf8a1e5728e9b5eafb1cbcfc3452f5fbbda32a8c7564dee157e8d902c52514361da6d972934a56b3276e2a9379e328e24282e0db697c5bc29090fc489ec46b7b188325dd4e96494c250de0f4a89fe2ccf919eaefcfb50c288113e6df92714feb7f46e0822478c796d0f4ff3447a32997e892693ce", + d: "1c172e25732555afee7ded67a496f3f11babc0875898619f4519c29321e201e8ba1149f2c20b48e5efba235d58fea7c3", + Qx: "13e9e2c8bbcfe26e8f5f43c86268c5980ee693236a6b8777f3a7323718baa21005b482d08aafc6fa6e3667d91353544c", + Qy: "9ba181b3ee505be030f87ecd249b00670a791489b42af04976013483ff95b630c91c01e95757e906129f2f9b4ce719a8", + k: "08aec9a9e58bdc028805eb5dc86073d05fff1f5fb3fd17f510fc08f9272d84ba7aa66b6f77d84fe6360bd538192bf01a", + R: "2b4337c3dfbc886ffad7858ae2480cb62227e12205a70361c42f1a5ca9e658ee30fc3cf4030d85bd065edad83b99821f", + S: "2550cef8574bf17fb3d6b0c9d04ab266962bac3621bac233ff2e4989712d2a4a07171c0aebd3040cd6a32c3bd3efb8b5" + }, + { + msg: "ed955dda6d9650124804d3deb6aeef900e520faf98b1ef6f14efcada7ca2433f09329b70897305e59c89024d76e466b28fe02cb2a9b12e2478c66470259d7c282137a19e5a04ffadea55245c0f34a681593fedc42931d8b3321b3d82e9cc102cd00540ad311ec7bd8c9d06db21bea4ca3dc74d98931ae0d40494aefc2345132c", + d: "5b96555dbd602e71d4d5d3aee19fd1ea084ee23d4f55c10937056762bc2015cbded2e898a487f5482ab7e1e971245907", + Qx: "6e14c17bb831b0112d7f3543c5fd17c78379a516c9e0539b03b8b4bfdead2820343fc84b0382807573ded6c4d97b7003", + Qy: "7f60021d2de77546db666721c9aec84c3e2ba8de0ba77443600dc77e6839bbf9316271adb22d4cb47d08f745ecb1dafd", + k: "7ad6f4ffd2b429ba10c6f112f800cacf1ad508cf8eba880893bb9659c1ddaaec57dcdc093a114500460d457bdde324f2", + R: "faea950ca513806bc59028c638d6302ffc86978c3ff1f06db015dd7c4777050186cb8dd871f5e926e1416539c1939c2f", + S: "2c592240eabb8a1f9878e1b5c9d5d3ced7b3a7ae571f5a86494ed2ca567a36eb72e7bea8934bded29594bccf67ca84bd" + }, + { + msg: "ce395b001da2a58e49691605d44af4206306f62f561bf2394060d2a5591a350277166bed043819035f1e60b5b3fb5ae113ddd0473f8ef6b2b050c472c2a264e1d8b3ca82a4f158c40f2d78d9ce5e5ea6de243f2e1f13f47f6c6f403b270912c81c636be35b396ca58468b3fb60aa83911d61441a0528d973bc31f965d4059080", + d: "8df9c3c710a25192f3dea970910bb3784e3509874cccf4334823eb9f7a8d05b067f2d812d61e878e24b093089a0b8245", + Qx: "92c9e32b20cbe6d4ed0727c6c942cf804a72031d6dfd69078b5e78ebce2d192268f1f5e2abce5aaf1f8d6a35f136837f", + Qy: "d5167905fa7689e03b9fb1487c566f62b36f2bc1c4a2bfb6a836113b5c8d46f7c1ca51b628b14397fbc06ec9a07f4849", + k: "258dd05919735cd48627c9fe9fac5c252604aa7c2ae0460d7c1149cd96b7bd2ba195ad393bf392a2499f06aead5ba050", + R: "413793bcce52eda0f5b675a8d687cce86d5c9e1659b38a89e96246b5e05f8b0934d17dbba3b2ea44c838aa5fd87125d1", + S: "ce7309fc2d6e3438818a1a29a997410b025b0403de20795b97c86c46034a6b02afeed279aeb06522d4de941bfdf50469" + }, + { + msg: "ffefe316455ae4ffdb890bb804bf7d31424ea060ecacff419d0f7134ff76ad434063c0ec0f8bb7059584d3a03f3625bb9e9f66ace1a47ac4b8f3e76fc7c420c55edb1427d1fa15b387ad73d02b0595c4e74321be8822752230a0dcfb85d60bfa186da7623a8ec3eb1633f0a294b23ae87216b14ccee9ef56418dcfab9427371e", + d: "6002cb01ad2ce6e7101665d47729c863b6435c3875de57a93f99da834f73e3e6e2b3880e06de3e6bd1d51ea1807ab0d7", + Qx: "e4216e1a20af8e8e3e74653ac016545001066e53e64af679ad1c85841bb475aed3e00ead052ae9955f48d675ff4ace56", + Qy: "8804c17641be21d4c6386902c9c5c888af25d97ca383703ea4a85cf93bbab360c0bbd2993374da499a303778650270b9", + k: "6b9507fd2844df0949f8b67b6fde986e50173713ac03df2edf65cb339859321cd3a2b9aab8356f95dec62460ab19c822", + R: "018891f6381ed358b422f79a299cf0789cee783ba388af4d82cbbe17f3709751b7fd9400e9702820c28b9afc62fdf489", + S: "aef73bd590802b2fd2a65c4f7fec89f9b24ecc199a69254785925f334cd1977c5e1f858bd9830d7d7d243ea707b1af0b" + }, + { + msg: "304bccb718b3a9e12669913490cc5bcc1979287b56c628fad706c354241e88d10e81445a2853e3fc32ece094ba1abc3fdcab61da27f9a0fca739371049fed462ee6b08fa31cde12720f8144a6f00ce9b1a7a6eadd231f126717074b4efb5c72ce673ca5859000a436f67a338d698759f12c461247c45a361fb6cb661fdbe6714", + d: "d8559c3543afc6f7b3dc037a687bad2630283757ba7862fd23ed14e2151a4cf5fed3d249268f780e0b96b6b46274a2d5", + Qx: "5f94223918f2ec9f0a08342cb99e724881c92453957c59672860f69daac01b660331a0f5845e50f1f27766b219c89e7e", + Qy: "d76d83396130d10d1168d76c7fc83742ffffbe66d9f4da4ca3f95f5ad6dac8cc7bb65d16d317d37aa99fdbf30ec7439c", + k: "4ad5a92b5b8e170b71c8a7ed419dc624c7680004562b8d16a37b6e639f581ce81d5f0d98cce44d54c4e7136229148340", + R: "f7baa6a5488ab462ea59aa31a36402b15880c68110b6069f51ede0c3b52a7b1e5bf926fdbe95768931b7d5f87058835c", + S: "28b1c4ef448a432f7c91b98b0c6471691e888211b6af907369a8930859b8cdb2e94f466a44f4e52f46df9b0d65e35de6" + }, + { + msg: "64f9f05c2805acf59c047b5f5d2e20c39277b6d6380f70f87b72327a76170b872bfe4b25c451602acfb6a631bb885e2655aee8abe44f69c90fb21ffde03cef2a452c468c6369867dfd8aa26ac24e16aa53b292375a8d8fbf988e302bf00088e4c061aa12c421d8fe3cbd7273b0e8993701df1c59431f436a08b8e15bd123d133", + d: "b9208cbfd186ddfa3efd5b71342ae1efb01a13ebc4c2a992a2cbee7254b7846a4252ece1104b89d13d835911f8511224", + Qx: "166e6d96cb60d916fd19888a2dd945a3306ff0d7b0a5e30729f47d3dac3de2be3fd5cd7437e9a80d6c48cf960d2d36f8", + Qy: "e6b2b70f131092ae210f29cc6bad701318bddb31bddf921695855c6208941100d0cee5d10799f8b835afe3ea510e8229", + k: "da706ab5f61531f2378b3c0a2b342108cd119eadaa88b859df64923bccfb0ec2393fd312826f65c15a6587d1d460015b", + R: "d9124c42858080c62400e4d4d8136304e03d910cbe9b9b3487f4d27c7e0540a314d34bef8c850045c8746ca631c11c42", + S: "bbf6424a3b70166fa799f49e918439d515327039258ef9bd88435a59c9c19659f8ec3c8660720b0c08354ff60e0f5a76" + } + ] +} diff --git a/test/gcm_test.js b/test/gcm_test.js new file mode 100644 index 0000000..75cc3d3 --- /dev/null +++ b/test/gcm_test.js @@ -0,0 +1,31 @@ +new sjcl.test.TestCase("GCM mode tests", function (cb) { + if (!sjcl.cipher.aes || !sjcl.mode.gcm) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat = sjcl.test.vector.gcm, tv, iv, ct, aes, len, tlen, thiz=this, w=sjcl.bitArray, pt, h=sjcl.codec.hex, ad; + browserUtil.cpsIterate(function (j, cbb) { + for (i=100*j; i<kat.length && i<100*(j+1); i++) { + tv = kat[i]; + len = 32 * tv.key.length; + aes = new sjcl.cipher.aes(h.toBits(tv.key)); + + // Convert from strings + iv = h.toBits(tv.iv); + ad = h.toBits(tv.adata); + pt = h.toBits(tv.pt); + ct = h.toBits(tv.ct + tv.tag); + tlen = tv.tag.length * 4; + + thiz.require(w.equal(sjcl.mode.gcm.encrypt(aes, pt, iv, ad, tlen), ct), "aes-"+len+"-gcm-encrypt #"+i); + try { + thiz.require(w.equal(sjcl.mode.gcm.decrypt(aes, ct, iv, ad, tlen), pt), "aes-"+len+"-gcm-decrypt #"+i); + } catch (e) { + thiz.fail("aes-gcm-decrypt #"+i+" (exn "+e+")"); + } + } + cbb(); + }, 0, kat.length / 100, true, cb); +}); diff --git a/test/gcm_vectors.js b/test/gcm_vectors.js new file mode 100644 index 0000000..e5ad376 --- /dev/null +++ b/test/gcm_vectors.js @@ -0,0 +1,131 @@ +sjcl.test.vector.gcm = [ +/** From AES-GCM specification + * http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf + */ + +{ key: "00000000000000000000000000000000", + adata: "", + pt: "", + ct: "", + iv: "000000000000000000000000", + tag: "58e2fccefa7e3061367f1d57a4e7455a" +}, +{ key: "00000000000000000000000000000000", + adata: "", + pt: "00000000000000000000000000000000", + ct: "0388dace60b6a392f328c2b971b2fe78", + iv: "000000000000000000000000", + tag: "ab6e47d42cec13bdf53a67b21257bddf" +}, +{ key: "feffe9928665731c6d6a8f9467308308", + adata: "", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255", + ct: "42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985", + iv: "cafebabefacedbaddecaf888", + tag: "4d5c2af327cd64a62cf35abd2ba6fab4" +}, +{ key: "feffe9928665731c6d6a8f9467308308", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091", + iv: "cafebabefacedbaddecaf888", + tag: "5bc94fbc3221a5db94fae95ae7121a47" +}, +{ key: "feffe9928665731c6d6a8f9467308308", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598", + iv: "cafebabefacedbad", + tag: "3612d2e79e3b0785561be14aaca2fccb" +}, +{ key: "feffe9928665731c6d6a8f9467308308", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5", + iv: "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b", + tag: "619cc5aefffe0bfa462af43c1699d050" +}, +{ key: "000000000000000000000000000000000000000000000000", + adata: "", + pt: "", + ct: "", + iv: "000000000000000000000000", + tag: "cd33b28ac773f74ba00ed1f312572435" +}, +{ key: "000000000000000000000000000000000000000000000000", + adata: "", + pt: "00000000000000000000000000000000", + ct: "98e7247c07f0fe411c267e4384b0f600", + iv: "000000000000000000000000", + tag: "2ff58d80033927ab8ef4d4587514f0fb" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c", + adata: "", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255", + ct: "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256", + iv: "cafebabefacedbaddecaf888", + tag: "9924a7c8587336bfb118024db8674a14" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710", + iv: "cafebabefacedbaddecaf888", + tag: "2519498e80f1478f37ba55bd6d27618c" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7", + iv: "cafebabefacedbad", + tag: "65dcc57fcf623a24094fcca40d3533f8" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b", + iv: "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b", + tag: "dcf566ff291c25bbb8568fc3d376a6d9" +}, +{ key: "0000000000000000000000000000000000000000000000000000000000000000", + adata: "", + pt: "", + ct: "", + iv: "000000000000000000000000", + tag: "530f8afbc74536b9a963b4f1c4cb738b" +}, +{ key: "0000000000000000000000000000000000000000000000000000000000000000", + adata: "", + pt: "00000000000000000000000000000000", + ct: "cea7403d4d606b6e074ec5d3baf39d18", + iv: "000000000000000000000000", + tag: "d0d1c8a799996bf0265b98b5d48ab919" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", + adata: "", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255", + ct: "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad", + iv: "cafebabefacedbaddecaf888", + tag: "b094dac5d93471bdec1a502270e3cc6c" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662", + iv: "cafebabefacedbaddecaf888", + tag: "76fc6ece0f4e1768cddf8853bb2d551b" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f", + iv: "cafebabefacedbad", + tag: "3a337dbf46a792c45e454913fe2ea8f2" +}, +{ key: "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", + adata: "feedfacedeadbeeffeedfacedeadbeefabaddad2", + pt: "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", + ct: "5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f", + iv: "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b", + tag: "a44a8266ee1c8eb0c8b5d4cf5ae9f19a" +}]; diff --git a/test/hmac_test.js b/test/hmac_test.js index 8f9ca32..7b70688 100644 --- a/test/hmac_test.js +++ b/test/hmac_test.js @@ -5,11 +5,23 @@ new sjcl.test.TestCase("HMAC official test vectors", function (cb) { return; } - var i, kat = sjcl.test.vector.hmac, tv, h=sjcl.codec.hex, out; + var i, kat = sjcl.test.vector.hmac, tv, h=sjcl.codec.hex, out, data, mac; for (i=0; i<kat.length; i++) { tv = kat[i]; - out = h.fromBits((new sjcl.misc.hmac(h.toBits(tv.key))).mac(h.toBits(tv.data))); + data = h.toBits(tv.data); + mac = new sjcl.misc.hmac(h.toBits(tv.key)); + + out = h.fromBits(mac.mac(data)); this.require (out.substr(0,tv.mac.length) == tv.mac, "hmac #"+i); + + out = h.fromBits(mac.mac(data)); + this.require (out.substr(0,tv.mac.length) == tv.mac, "hmac reset #"+i); + + mac.update(sjcl.bitArray.bitSlice(data, 0, sjcl.bitArray.bitLength(data)/2)); + mac.update(sjcl.bitArray.bitSlice(data, sjcl.bitArray.bitLength(data)/2)); + + out = h.fromBits(mac.digest()); + this.require (out.substr(0,tv.mac.length) == tv.mac, "hmac reset #"+i); } cb && cb(); }); diff --git a/test/hmac_vectors.js b/test/hmac_vectors.js index b47103e..768da1d 100644 --- a/test/hmac_vectors.js +++ b/test/hmac_vectors.js @@ -1,4 +1,5 @@ /* Official HMAC test vectors. */ +//Nilos: http://tools.ietf.org/html/draft-nystrom-smime-hmac-sha-02 for sjcl.test.vector.hmac = [ { key: "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", data: "4869205468657265", diff --git a/test/json_test.js b/test/json_test.js new file mode 100644 index 0000000..5052143 --- /dev/null +++ b/test/json_test.js @@ -0,0 +1,126 @@ +/* + * Asserts that an object can be encoded to an expected string. + */ +new sjcl.test.TestCase("JSON Encode Test", function (cb) { + if(!sjcl.json) { + this.unimplemented(); + cb && cb(); + return; + } + + //Build up a standard object for encoding, this includes a nice wide variety of properties. + var obj = new Object(); + obj.int = 4; + obj.nint = -5; + obj.str = 'string'; + obj.iv = [ -95577995, -949876189, 1443400017, 697058741 ]; + obj.truth = true; + obj.lie = false; + + try { + var str = sjcl.json.encode(obj); + this.require(!(!str)); //Check for non-'falsey' + } + catch (e) { + //The standard object should encode just fine, so this is out of place. Fail. + this.fail(e); + } + cb && cb(); +}); + + +/* + * Asserts that a JSON string can be decoded to an expected object. + */ +new sjcl.test.TestCase("JSON Decode Test", function (cb) { + if(!sjcl.json) { + this.unimplemented(); + cb && cb(); + return; + } + + var str = ''; var i; + str = '{"int":4,"nint":-5,"str":"string","iv":"/////wAAAAAAAAABAAAAAg==","truth":true,"lie":false}'; + + try { + var obj = sjcl.json.decode(str); + this.require(obj.int === 4); + this.require(obj.nint === -5); + this.require(obj.str === 'string'); + this.require(obj.truth === true); + this.require(obj.lie === false); + for(i in obj.iv) { + this.require(obj.iv[i] == (i-1)); //Array in iv is [-1,0,1,2] + } + } catch (e) { this.fail(e); } + + str = '{ "int" : 4, "nint" : -5,"str":"string", "iv": "/////wAAAAAAAAABAAAAAg==","truth": true,"lie": false }'; + try { + var obj = sjcl.json.decode(str); + this.require(obj.int === 4); + this.require(obj.nint === -5); + this.require(obj.str === 'string'); + this.require(obj.truth === true); + this.require(obj.lie === false); + for(i in obj.iv) { + this.require(obj.iv[i] == (i-1)); //Array in iv is [-1,0,1,2] + } + } catch (e) { this.fail(e); } + + //Tests passed, return. + cb && cb(); +}); + + +/* + * Asserts that an Object can be Encoded to a string that can be decoded to an equivalent object + * as well as the converse. + */ +new sjcl.test.TestCase("JSON Commutative Test", function (cb) { + if(!sjcl.json) { + this.unimplemented(); + cb && cb(); + return; + } + + var obj1 = new Object(); + obj1.int = 4; + obj1.nint = -5; + obj1.str = 'string'; + obj1.iv = [ -95577995, -949876189, 1443400017, 697058741 ]; + obj1.truth = true; + obj1.lie = false; + + var str1 = ''; + var str2 = ''; + var obj2; + try { + str1 = sjcl.json.encode(obj1); + obj2 = sjcl.json.decode(str1); + str2 = sjcl.json.encode(obj2); + } + catch (e) { + this.fail(e); + } + + try { + this.require(str1 === str2); + this.require(obj1.int == obj2.int); + this.require(obj1.str == obj2.str); + this.require(obj1.lie == obj2.lie); + this.require(obj1.nint == obj2.nint); + this.require(obj1.truth == obj2.truth); + + var i; + for(i in obj1.iv) + { + this.require(obj1.iv[i] == obj2.iv[i]); + } + } + catch (e) { + this.fail(e); + } + + //Tests passed. + cb && cb(); +}); diff --git a/test/ocb2progressive_test.js b/test/ocb2progressive_test.js new file mode 100644 index 0000000..3e2642b --- /dev/null +++ b/test/ocb2progressive_test.js @@ -0,0 +1,52 @@ +new sjcl.test.TestCase("OCB 2.0 progressive mode tests", function (cb) { + if (!sjcl.cipher.aes || !sjcl.mode.ocb2 || !sjcl.mode.ocb2progressive) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat = sjcl.test.vector.ocb2, tv, iv, ct, aes, len, tlen, thiz=this, w=sjcl.bitArray, pt, iv, h = sjcl.codec.hex, ad, tlen; + browserUtil.cpsIterate(function (j, cbb) { + for (i=100*j; i<kat.length && i<100*(j+1); i++) { + tv = kat[i]; + len = 32 * tv.key.length; + aes = new sjcl.cipher.aes(h.toBits(tv.key)); + + // sort of a hack because of the format of the vectors file + pt = h.toBits(tv.pt); + ct = h.toBits(tv.ct+tv.tag); + iv = h.toBits(tv.iv); + ad = h.toBits(tv.adata); + tlen = tv.tag.length * 4; + + var enc = sjcl.mode.ocb2progressive.createEncryptor(aes, iv, ad, tlen); + var result = []; + var sliceSizeRange = 3; // 1 to 3 bytes + var slice = [0, Math.floor((Math.random() * sliceSizeRange) + 1)]; + while (slice[0] < pt.length) { + result = result.concat(enc.process(pt.slice(slice[0], slice[1]))); + slice[0] = slice[1]; + slice[1] = slice[0] + Math.floor((Math.random() * sliceSizeRange) + 1); + } + result = result.concat(enc.finalize()); + + thiz.require(w.equal(result, ct), "aes-"+len+"-ocb2-encrypt #"+i); + try { + var dec = sjcl.mode.ocb2progressive.createDecryptor(aes, iv, ad, tlen); + var dresult = []; + var sliceSizeRange = 3; // 1 to 3 bytes + var slice = [0, Math.floor((Math.random() * sliceSizeRange) + 1)]; + while (slice[0] < ct.length) { + dresult = dresult.concat(dec.process(ct.slice(slice[0], slice[1]))); + slice[0] = slice[1]; + slice[1] = slice[0] + Math.floor((Math.random() * sliceSizeRange) + 1); + } + dresult = dresult.concat(dec.finalize()); + thiz.require(w.equal(dresult, pt), "aes-"+len+"-ocb2-decrypt #"+i); + } catch (e) { + thiz.fail("aes-ocb-decrypt #"+i+" (exn " + e + ")"); + } + } + cbb(); + }, 0, kat.length / 100, true, cb); +}); diff --git a/test/ripemd160_test.js b/test/ripemd160_test.js new file mode 100644 index 0000000..3460c69 --- /dev/null +++ b/test/ripemd160_test.js @@ -0,0 +1,15 @@ +new sjcl.test.TestCase("RIPEMD-160", function (cb) { + if (!sjcl.hash.ripemd160) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat=sjcl.test.vector.ripemd160, p=0, f=0; + for (i=0; i<kat.length; i++) { + var out = sjcl.hash.ripemd160.hash(kat[i][0]); + this.require(sjcl.codec.hex.fromBits(out) == kat[i][1], kat[i][0]); + } + + cb && cb(); +}); diff --git a/test/ripemd160_vectors.js b/test/ripemd160_vectors.js new file mode 100644 index 0000000..ed87c94 --- /dev/null +++ b/test/ripemd160_vectors.js @@ -0,0 +1,13 @@ +/* conventional test vectors */ +sjcl.test.vector.ripemd160 = +[ +["", "9c1185a5c5e9fc54612808977ee8f548b2258d31"], +["a", "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe"], +["abc", "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"], +["message digest", "5d0689ef49d2fae572b881b123a85ffa21595f36"], +["abcdefghijklmnopqrstuvwxyz", "f71c27109c692c1b56bbdceb5b9d2865b3708dbc"], +["abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq","12a053384a9c0c88e405a06c27dcf49ada62eb2b"], +["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789","b0e20b6e3116640286ed3a87a5713079b21f5189"], +["The quick brown fox jumps over the lazy dog", "37f332f68db77bd9d7edd4969571ad671cf9dd3b"], +["The quick brown fox jumps over the lazy cog", "132072df690933835eb8b6ad0b77e7b6f14acad7"], +]; diff --git a/test/run_tests_browser.js b/test/run_tests_browser.js index f05a9b4..91d4ffe 100644 --- a/test/run_tests_browser.js +++ b/test/run_tests_browser.js @@ -4,28 +4,43 @@ function testCore(coreName, cb) { "test.js", "aes_test.js", "aes_vectors.js", - "ccm_test.js", - "ccm_vectors.js", + "bitArray_test.js", + "bitArray_vectors.js", + "bn_test.js", + "bn_vectors.js", "cbc_test.js", "cbc_vectors.js", + "ccm_test.js", + "ccm_vectors.js", + "ecc_conv.js", + "ecdh_test.js", + "ecdsa_test.js", + "ecdsa_vectors.js", + "gcm_test.js", + "gcm_vectors.js", + "hmac_test.js", + "hmac_vectors.js", + "json_test.js", "ocb2_test.js", + "ocb2progressive_test.js", "ocb2_vectors.js", + "pbkdf2_test.js", + "ripemd160_test.js", + "ripemd160_vectors.js", + "scrypt_test.js", + "scrypt_vectors.js", + "sha1_test.js", + "sha1_vectors.js", "sha256_test.js", "sha256_vectors.js", "sha256_test_brute_force.js", - "sha1_test.js", - "sha1_vectors.js", - "hmac_test.js", - "hmac_vectors.js", - "pbkdf2_test.js", - "bn_test.js", - "bn_vectors.js", - "ecdsa_test.js", - "ecdh_test.js", + "sha512_test.js", + "sha512_vectors.js", + "sha512_test_brute_force.js", "srp_test.js", - "srp_vectors.js" + "srp_vectors.js", ], i; - + for (i=1; i<testFiles.length; i++) { testFiles[i] = testPath + testFiles[i]; } diff --git a/test/run_tests_node.js b/test/run_tests_node.js new file mode 100644 index 0000000..1475646 --- /dev/null +++ b/test/run_tests_node.js @@ -0,0 +1,21 @@ +var fs = require('fs'); +var vm = require('vm'); + +var load = function(path) { + try { + vm.runInThisContext(fs.readFileSync(path)); + } catch (e) { + console.log(path); + throw e; + } +}; + +// Assume we're run using `make test`. +// That means argv[0] is `node` and argv[1] is this file. +process.argv.slice(2).map(load); + +sjcl.test.run(undefined, function(){ + if(!browserUtil.allPassed) { + process.exit(1); + } +}); diff --git a/test/run_tests_rhino.js b/test/run_tests_rhino.js deleted file mode 100644 index 1192114..0000000 --- a/test/run_tests_rhino.js +++ /dev/null @@ -1,11 +0,0 @@ -if (arguments === undefined || load === undefined) { - throw "This script must be run from Rhino."; -} - -for (var i=0; i<arguments.length; i++) { - var file = arguments[i]; - if (!file.match(/^-/)) load(file); -} - -sjcl.test.run(); - diff --git a/test/scrypt_test.js b/test/scrypt_test.js new file mode 100644 index 0000000..c6aa15c --- /dev/null +++ b/test/scrypt_test.js @@ -0,0 +1,23 @@ +new sjcl.test.TestCase("scrypt", function (cb) { + var self = this; + if (!sjcl.misc.scrypt) { + this.unimplemented(); + cb && cb(); + return; + } + + sjcl.test.vector.scrypt.forEach(function (vect) { + var cand = sjcl.codec.hex.fromBits(sjcl.misc.scrypt( + vect["password"], + vect["salt"], + vect["N"], + vect["r"], + vect["p"], + vect["dkLen"] * 8 + )); + + self.require(vect["expected"] == cand); + }); + + cb && cb(); +}); diff --git a/test/scrypt_vectors.js b/test/scrypt_vectors.js new file mode 100644 index 0000000..0057158 --- /dev/null +++ b/test/scrypt_vectors.js @@ -0,0 +1,200 @@ +sjcl.test.vector.scrypt = [ + { + "salt": "salt", + "password": "password", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "6d1bb878eee9ce4a7b77d7a44103574d4cbfe3c15ae3940f0ffe75cd5e1e0afa" + }, + { + "salt": "salt", + "password": "password", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "6d1bb878eee9ce4a7b77d7a44103574d4cbfe3c15ae3940f0ffe75cd5e1e0afa" + }, + { + "salt": "salt", + "password": "password", + "N": 2, + "r": 1, + "p": 2, + "dkLen": 32, + "expected": "4db52954f6ece830ebef61b6613b9f1dfd921922d32a1af5b719d15a6676e8ad" + }, + { + "salt": "salt", + "password": "password", + "N": 2, + "r": 2, + "p": 1, + "dkLen": 32, + "expected": "b6902e4c128feb4b3a475d59773bc4b25e44080cea51d7526b18986c52008386" + }, + { + "salt": "salt", + "password": "password", + "N": 4, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "2ef4390d867dcad84fbb1c064e7fe984e1e9850922ac45c11b2f30c85043f9bd" + }, + { + "salt": "salt", + "password": "password", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 48, + "expected": "6d1bb878eee9ce4a7b77d7a44103574d4cbfe3c15ae3940f0ffe75cd5e1e0afadb0a556b482b5dcb0d1a54b6e4070beb" + }, + { + "salt": "salt", + "password": "password", + "N": 4, + "r": 2, + "p": 2, + "dkLen": 48, + "expected": "89d93e71c0cae21fb524624e6e0229ecae4fb727fb8e5b5f705aaed078aa455fba9e2186b6d5c7dcd7c9561affefd597" + }, + { + "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "password": "passwordPASSWORDpassword", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "2e40cbd0f2e5b348d11b25ce977f572c20bbb133b188c5b182f939e92f5581c1" + }, + { + "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "password": "passwordPASSWORDpassword", + "N": 2, + "r": 1, + "p": 2, + "dkLen": 32, + "expected": "b8f439cd39d8c2db78fbc6846bbe4c7af559039af2a44140f4648333bd706a9f" + }, + { + "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "password": "passwordPASSWORDpassword", + "N": 2, + "r": 2, + "p": 1, + "dkLen": 32, + "expected": "60ecb015fc3e8ee29c05253d3827639cee3163ba9e724e84675be7923101aba6" + }, + { + "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "password": "passwordPASSWORDpassword", + "N": 4, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "0ca4071216a28c62c86e9b6499de4df73db413cb8f6af8e7210dbedb908340d3" + }, + { + "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "password": "passwordPASSWORDpassword", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 48, + "expected": "2e40cbd0f2e5b348d11b25ce977f572c20bbb133b188c5b182f939e92f5581c16f89084a1ceea4d5b52050498bd94ba5" + }, + { + "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "password": "passwordPASSWORDpassword", + "N": 4, + "r": 2, + "p": 2, + "dkLen": 48, + "expected": "e5f5bce126455eec251b65667e0feb532b07ffcf56164c1b7e81e6cdd88a647cf679d16a7fe8d640de40028df832fd19" + }, + { + "salt": "sa\u0000lt", + "password": "pass\u0000word", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "26e5228d9800146660ad3a9b3e264e7aff9eb0fc68bcc36ee581ec037c4d5a06" + }, + { + "salt": "sa\u0000lt", + "password": "pass\u0000word", + "N": 2, + "r": 1, + "p": 2, + "dkLen": 32, + "expected": "21131d0da3e4c7250bc108e61ed6afcb6c2b2550b550846b190141ffee12f184" + }, + { + "salt": "sa\u0000lt", + "password": "pass\u0000word", + "N": 2, + "r": 2, + "p": 1, + "dkLen": 32, + "expected": "72912cd0b78ff614ce9e45773ef2b03e47185ad94f97cbd03337c68f62bc8fca" + }, + { + "salt": "sa\u0000lt", + "password": "pass\u0000word", + "N": 4, + "r": 1, + "p": 1, + "dkLen": 32, + "expected": "9ab1c590b7651ec11bfd3e6659ad950c39d93f3bba5f73585958164e16d15606" + }, + { + "salt": "sa\u0000lt", + "password": "pass\u0000word", + "N": 2, + "r": 1, + "p": 1, + "dkLen": 48, + "expected": "26e5228d9800146660ad3a9b3e264e7aff9eb0fc68bcc36ee581ec037c4d5a06794abf829f0042f0884a7b9de15471d5" + }, + { + "salt": "sa\u0000lt", + "password": "pass\u0000word", + "N": 4, + "r": 2, + "p": 2, + "dkLen": 48, + "expected": "2c0ea11828a8a4f4991349c2c6c5ff2266aa543c27d876b5ae7a813dd0bb4c0da0d6aadd3d031063502f05faa527ac66" + }, + { + "salt": "", + "password": "", + "N": 16, + "r": 1, + "p": 1, + "dkLen": 64, + "expected": "77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906" + }, + { + "salt": "NaCl", // heh + "password": "password", + "N": 1024, + "r": 8, + "p": 16, + "dkLen": 64, + "expected": "fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640" + }, + { + "salt": "SodiumChloride", + "password": "pleaseletmein", + "N": 16384, + "r": 8, + "p": 1, + "dkLen": 64, + "expected": "7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887" + } +]; diff --git a/test/sha512_test.js b/test/sha512_test.js new file mode 100644 index 0000000..85fee06 --- /dev/null +++ b/test/sha512_test.js @@ -0,0 +1,14 @@ +new sjcl.test.TestCase("SHA-512 from catameringue", function (cb) { + if (!sjcl.hash.sha512) { + this.unimplemented(); + cb && cb(); + return; + } + + var i, kat=sjcl.test.vector.sha512, p=0, f=0; + for (i=0; i<kat.length; i++) { + var out = sjcl.hash.sha512.hash(kat[i][0]); + this.require(sjcl.codec.hex.fromBits(out) == kat[i][1], i); + } + cb && cb(); +}); diff --git a/test/sha512_test_brute_force.js b/test/sha512_test_brute_force.js new file mode 100644 index 0000000..11e7159 --- /dev/null +++ b/test/sha512_test_brute_force.js @@ -0,0 +1,34 @@ +/** + * Test SHA-512 using an ad-hoc iterative technique. + * This uses a string buffer which has n characters on the nth iteration. + * Each iteration, the buffer is hashed and the hash is converted to a string. + * The first two characters of the string are prepended to the buffer, then the + * last character of the buffer is removed. This way, neither the beginning nor + * the end of the buffer is fixed. + * + * The hashes from each output step are also hashed together into one final hash. + * This is compared against a final hash which was computed with OpenSSL/Node.js. + */ + +new sjcl.test.TestCase("SHA-512 iterative", function (cb) { + if (!sjcl.hash.sha512) { + this.unimplemented(); + cb && cb(); + return; + } + + var toBeHashed = "", cumulative = new sjcl.hash.sha512(), hash, thiz=this; + browserUtil.cpsIterate(function (i, cbb) { + for (var n=100*i; n<100*(i+1); n++) { + hash = sjcl.hash.sha512.hash(toBeHashed); + hash = sjcl.codec.hex.fromBits(hash); + cumulative.update(hash); + toBeHashed = (hash.substring(0,2)+toBeHashed).substring(0,n+1); + } + cbb && cbb(); + }, 0, 10, true, function () { + hash = sjcl.codec.hex.fromBits(cumulative.finalize()); + thiz.require(hash === "602923787640dd6d77a99b101c379577a4054df2d61f39c74172cafa2d9f5b26a11b40b7ba4cdc87e84a4ab91b85391cb3e1c0200f3e3d5e317486aae7bebbf3"); + cb && cb(); + }); +}); diff --git a/test/sha512_vectors.js b/test/sha512_vectors.js new file mode 100644 index 0000000..bf5745a --- /dev/null +++ b/test/sha512_vectors.js @@ -0,0 +1,518 @@ +/* same tests as sha256_vectors.js + correct results determined by OpenSSL in Node.js */ +sjcl.test.vector.sha512 = +[ +["", "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"], +["J", "3c266c0035de59eab2a0dd31b3dcb4a9dd157b310289e5db9ab4f8c2fddb7433466d48f25da7ad735a1cb8f2935aa612ad1f62f0efcece3933ba9979082e2304"], +["UQ", "e3a6badd1017cf2af18aa0c8815a7778ce8fdf5e3de314daa598715be8337e444daa5e1ba57c7be747588651e6a8a0e42444208c25dc6a921a73dde3620b4e30"], +["3zu", "9178c9ee83f4b7e9756b32b7242a495ccb7630babb20e07b69147b6cada71bc308611840872c0e301750d49a683236562efd6ccd41650f3f0250a0b2f5d01b83"], +["SQ34", "8a565d40812cd62efc524beecef17954edb5fd9b13eaee9d72d6f6720f563a78f288436b12f9ab09248ad0692644ada72ccbf911295b801d1e9d70f68edc90d8"], +["ksUOe", "6cfbfa4c42d45ca3ccb59473fb0df931b2cf59225b2f7932ef5ebf2a7fcbd76af319746a3d2c67e6d0d05de0f118177927b3b16ba9465af05cccf21ee34d0399"], +["cVcjJ4", "337cb5dbb802ae7707cd063336556e9a2ce877e353e09be19f56b78e09a2902fb100bb90531346d75dcfda8e720690aa6b249490126cd939c44ffa55afb67134"], +["8F5FQOy", "57e42af08e4f112c0b214bd330d7da45878346ac393950a993308023fccc553faf4e490eeaa4e306c4278d53b6d22ca9be9fcc7a2149c525de1ad2de2413fb60"], +["4f3uqBTp", "304f9dea3024e69dfc439d936d2a0c45434fad9c30536033134534a2a37ffdc888aa6c237b344d58fa1e17193ef46f16fce19df40231851164658cb287e394cc"], +["nTLqNR3tW", "ab98864a4f51e7851acb001d292e32673841a1fa6c7bf044ee6ecdc34f8a4ce589f265796692b39fa45c27a1d4a62cb73722d1cd4912b020fe174960e0245736"], +["vdAYhVtVCk", "7b561dd1e5627a813eae1d381f949d1a10eeac80567c4c3d3f855570099805062caa1c6f5628180cfe19b6f377e39966c9eb5eb0a499475f39d220d7bbfb0e65"], +["6xLa68T63Lg", "5de2b20154b5e07e1047186179240e22f16bf6a7c5ecdffbb90bb2bc00d6e6448bb33ca6e072b9c4da45e187b883e76c14b9bd86d642626730dd3738230ff301"], +["AtJ52sRObhuH", "eaa1830bab1c6f365666865a794f3782d0f9d6b39930b6744e9f73097d367bee914fa84c699fabee76c9f0e9edcb94bf2c563acf88cf1f1eaea8fbf50d3d3f44"], +["xo76bPHp1YbRF", "84a1225146e2a4139bc3ac8a876e9eb2be8b6cef10dfd2d8235d9e3fc45474f5f0588f1791740dfc431c307ecb5b9ffa21bd116adc58ad19e20e696480da0f9f"], +["ThjICeYgAzhp35", "a64b9f7748519a556afb37f50c14af29c2656e1f3a1da8af627fa26b2d122ff03607feffe170ed43145d563cd5f8f6768c0c8f1d7a0203e26a28dafdba69a374"], +["CZ6Cd9EHVx3q3wr", "cbb0546bf48a6cd2cf2a0235ce2d4228d01f4f14cf614c255b7d9ba6c03857d18dc17a88558fcd1361b2067079c500daead7af7ded97cc7d52a0739f0d0607c2"], +["wqvsNpKZejVnWykY", "0cc8339bf601784737e08b242946a5738f7e631147f921e9ff572ccc16e38c14530a8177bef02b5016d7cbe25f8f59db0d4686ca0edf5e8d46063f1282cef52b"], +["2ZqtefXHaWRlvkeIE", "2231688c201d1e95fa14ced0dc219ca03cf4c167b1afc7342eeae0eb049289711e0e5a01e7cd65c8ca8863b8055bed34c265c3ee80c313c1cfee6728719a061e"], +["7MPoGOIDWwOIylUtxg", "3c02abaa6b051e8ced23099363c5b599a06db4478a825dc5749658be5bdf3413f62d653b03a3472701c02a6b754277d175fcb16ab83b1119219e1add8c4ba2f2"], +["caeiSnfg6TP2xlHUfv9", "885b5737d69be5e300ed3ff3d60d926cce1aa6eb094027241088a02ab20bc57ae16b639f72eb3e069ba3799b03959b1eea908aeef6a7f6e03ce74ce5c3e44107"], +["BYNTDmjX75AEbBs3orIp", "86b45516821f85b3aa0269bffe360a0d61c5838da40f8e471f8a2cf01a93a97b4b3987eaba2ae34c57c945104cbd7c8d34b5bcd9c412cb55b49785756fe5833f"], +["UFQ38EFPHeO2zwScsgWfM", "1a383a56c5e1712c61b4863b34f111fd875061cd9b5d0d078d1db9386cb4f0b34c224ea053b64843b44513f0e5a784ce38110c0ff11a396216f7538b173e9f82"], +["MWmlT2rczB3ENCpuuPTmcN", "af2b8a179cecbb06b6036de030bbcae8c0a4a543b54bdbe54f60d87e65056902cf0673274c98c55a86f3805d3034ad6158cd974ec698d7e0d4c6e16e0ecd4f30"], +["sQrs8KCz8r9o9kggoaUdQkY", "c9c3ef8e9070f243999561edb58fb4b61fb401798d9dd3dc4dd87dfe2a2dbae2e7b02f865a9ee88218b0d2c59ed45e501c28e9c383c727fe01937f163ef2b6b7"], +["pyMq5mdbgnqjfpzXaY2Txn6J", "31c4c19d6c4537f39da07b08d034985cfcdd1d707f1768b19ce54649c26263cc4f6abe40ce77e4c2a68097f8fee369130f97071dfa1505b4bb5f6154e4ac0e5f"], +["yaaZQ4VuPHRVOz2TlJv8fWAAb", "da8296bd64eea45c81196803919a237c7f2b00b2a510f3a45a3ba62adeb6849be515cfadb410ee7a3fb5574ec5435a818829f9c8df2efe909f1c11ffefaf9519"], +["dm3rzSKLRcKLnTrOXZt3CrsCqW", "8f7c8f2465b80f356ab24095376e7b9402f2ccd52316824b0a60491baeff95f4c85224a2e6fda542d63483672cda93ef3f31a45b6307972f88e97cc1ac5ed1e9"], +["ioJPx6onAVydcuEub5mCPQ274NC", "39622571e609171ce8740fad11d4b61cc6a56d482cbdbebf30e601e2258a87235fcc6db17bc451aa4c0d61fda6febfb1e57fe3b596723a0e481702de4c227597"], +["NeUenr9nNDZUTXLrcEf9yfYxYL4F", "728ea0f4e074bb74f993e3ac302a64cff2fb599355ffe68f7c9e049bf9383a9e9d70a6b952cc72e36b597854693b031245e6f628ffbf6b3ba2f83e917f94bdac"], +["cOhrhsfVAzmTc5VArk2DQ4GYB56NR", "151a368236b08602e0e4b043153dfd87a7be39e2d7c687e0896b30e76b5062a1d26ec6a20cc19d3e859af7b05bfbdda000d14312a0ab732876a0b140307f44ae"], +["gzuPlpOEP08TzXKnxinF6Ub5X3SLQl", "1289135e4242dafe486c4533b565ba65679971e9ba89c538f3c42a114faaa366bd054b2853884eaeeb7614ca1df686266b2f344ae870d2a86e4402073181c226"], +["dYPVcmbC42y70nwf6ZiNlmfaSfwfyuN", "f36a54c7196ac0545c5c308f53aecdf7c2b3811782947d1271bcdcae60a3fe26a597c9b364359c969e643ad3c25d14f9da977924fe1ecb6ca5377d3f64722313"], +["XzJS9vxH4QXUv6UQ55mmQlF4fFPzakYe", "e21884d732856592ba6aca037f6b08736cd707e10a88d284d22cbbf8894fdc7df9c49bc01e13486dcd89dab31596a4abd6f6c91a90731c1b398d02b887db2afa"], +["pWcLJAkOzbQpxdSGYfrvGoEOdycICsthz", "1bc0fecc5a29f11bd9ed6f814cd64b20650153bb8c3f4f1e9b6d6518b543b4e1cc51d3a0a89573bab8696dd773d6a510afe0ed8ec065ff06cba4e6e4bdfb249c"], +["ZHB7HdgGcl6iHofklYfhIbHYBwZ22xYGBh", "1338b4c6c8963dc8218fd06c9f9fc7422da0e6b20e9d7180f7ad28b73d3c17d784fa85466ca306c260ab01c3e7253e691b441ebdafad55b103f2603bf0ac67dd"], +["J2dMOnxXS7fVcmJKsky5Lgr5q6wPLm3Qg3s", "b783f1e5b0392faa415547dbcccc452df131a110c8f9f6ecf8ad70cc8095fffdadc25b5c59cc0b61f12d5a85ab56d654de700ccf50c35bf3f1036b17ed37cb77"], +["qFBsvjqP65WkL6ohYiA287QKZzlq8qpcHc4B", "9ef434894c9ce2a7d8a0afe754dd9fae258a4c69b2a9167ba4d02753eed1c5cc787c6d8828689df3eab739eb6bbf52b59de9ce5645486c06a77d2556b264a5f2"], +["drWlXFxFDJrMyRVaTmwrjmzS8dIoMcXTiJwZJ", "41034f5271d75cf717d7fae03a8005a62af389a9fe0d2b6ca208babc4cb02444aa8ffdd55325c03e4e3343d042edb8eb2e403457697388d5b6290b4b370884e9"], +["ZLnGOs1gybrU3EuC6tzMlV5yW9KpDCPakCk9kZ", "8adcf23b9e3d289e5e2c794346eee8ea5c18737d7ce4135aba338a67b0f8d333781775c17f05d86e61c272b7b572fb86cdc6a7e1d7286c8e9dac0bde45284481"], +["GO6Zyv6H7wdO7TehklJLHiQMZgPj0C32yJmPW2Y", "2a44b44409b4f55ac00c643fc2c046963056cc1fff8ca3b02f8e3c3b54af34b6eb74587bda81251965635b60d9b87b1f35d644f6982cdcb42f95d453ad00eabd"], +["RItYK7e5V3L4EiwnV1RVYqV2IKMf0N3KBF4QoSLz", "8ef9c6c50d07740f31189452dd3a673a0fd728dd6889bec3f18ae71ff3f09063c409053f5f15624496183d4e15c1b39a5fa46fd4a1b690eaceba20fcd45b3a28"], +["MDc9jES5NtO8HoOJPKhQMvLZt7jGGYVkq5O6jCJlM", "e7c1ae04b9886ce0c1f578eb5b1cd358f43e53eb5098fe8ed39e9b2cf03f95b21cc538489624724f37030cf468e86f2faa8fb6669e976bc7194dc3320610627a"], +["zuLhkhDeAPaNQufRwfV3An7tks1rmP1YVXEJpsKifu", "33ce387ab49fa953544978a7d6bcdf4f1f2fed7428cf6cb5118acc7b3da2a89f4debeb8db3efc32556d6db0e5300017674afc25648ba4e1dea2195a1affb46d7"], +["MMaiONEGNXzGSZ2x0enSKDkIWWJgDGFIMdIJflezWXr", "a9442adc9d6f9508dd999c8e29d120bf4d3e39ba7136f671eb56f5002ed1fa6b9b2eebff12c85a51ee95c983995fdf6736dc88e977b8f9d6745fa40c84ce554d"], +["C2iQHRkM3bjIo6couJkKWSxsESPHJIY1A5SXxpiOAW4S", "638ef4ba085daf224799843c9bb0ed96b687dd20aa920028240f8250250b7b2d0ee97663f9985923dab76e8a76d20d6199553d7b2909779c116915b968c0fe24"], +["KOz0cqCqft1bDrP7gRN8NNqYWpoRrYqmWUmqW8gb0dy6u", "bd42b3a9325e012cb3b4b000820e4c3eec548877a141f3d8b5ad25114333956c2e3d952fe7e81808d4323226cd4851b1b27e1c4786d8e2f83100d73d5bfe634c"], +["RRdTl3CRwHRdhbM5TfCimrmfkqyMnx9xPK8GiM1O30rlam", "8627a76be25114fe79d17a093f65261c8080b091374e8c7e2707ce8551209668e144c637c4cb6bde2a844d972f20a78cc480ac9a2966a0057d4db85819e3af9e"], +["MzyGsM0RvZb4P2ApqBJ3kZhRtVFKhnGAX9mAmm00SkH1UHz", "da7890d5ad5989fec241149c37b8fd89d4c2046502f4aec186971afd85f6809c61224202726204d3f2a6ac440bb660026789595cab159d62236cb4081839698b"], +["pEf68rtAr8Swhhv0dHdIhE8QjaECiDmUZjyipgx3gpsLeFMc", "b8775c879a8c5882432d0f687a98709395b0def99024c2dcb01b84572bf76b8f1ca3948fec776fe8613513dedb1b4c74985edc6c6c732b696daaa2d07a98f2c9"], +["x1EYSPRpyNYT7wHEZrOvqWMH9VwG0lNC9cYsGivYP2u1Ocxp3", "735c719e5bb14a44bcbd37842ab3331f7fd0c85cad0820f7b1874009ad3d3a44c1136803e293a0965bffd3f7171cee52bee407c91c349f839159ad01b7f494a1"], +["V9AHezfET8FmSfCClEkRzrQXo8kswDO7xVkySUvidKMzlmXR2E", "4c234fcd7219f4c7b4f5eb7e6a6932609faf2d8bb1ba437b3eccf0091c51130e0f0fbfaa67ae7bbfcd772b590251a77ec45703884028bedb4a9c51833151d87e"], +["vEdDMorZPqIj0qen3qVWCN0mFOtGbTEsSk8YcgJzeNJdApmYgKl", "6982eb71d9d0704dac8777b8f264443b111bff6dd490e8b043ccfcea902db12b9cb54ced2024d112a88308155eb129c665b3eb405550104963e00f6e22e582f9"], +["o6HLlpczHiDbFk4jnKfGMxcYFqyTzEYihHgz1e0Vh7Kh3wdQfG3d", "9e3851642a5f248aaa5531d67e6c90e83b5864cf35b43b7c0f1977e2264eb2be66a095b5349d21bd82e3696c046f6eaf0a3f91d99b442e5ff84ffd359d166539"], +["kkVEWU95a4SdsCE9RSLxQndqNnbXFquFUEqimVKoMtcTPq8KoX90b", "c6f68913122edf98741527ed969bc13ba4c540ce10ab660fc50a0cea6b7fdff48f6591146911cfa4d537066516010bcf680776778bcce1fdf0ff92d513797844"], +["BVC3FCaQhkBHSTM3oKiSPDI28vHb7RNiTgHVFNuEYOV1HxQpKVAfsT", "5411b20eb0203a62eca998a25818cdc33877b07ed0bcbddb6b75f60e20cd7a8f047aa084febdb9b4cfe10406551d6e6165113ff089b40446e42ec60a06a5db38"], +["QakkZuFqRmZ7MLolg3xAT47SmGC019azBbwi9ae0g6SzeCe8PLVhLHw", "e215d85092900e4e3101117af8cc8ac421a0001f5565a8a026524355015aac48f9daa9e2ce9b2701158ac674fa7f206cbc08dcdc38e332d3c5490684f6396ff2"], +["QOk9AYlxaoyR4c3yL7771JBpz3ySmUZ5tAXTfweUaUSEBKAH0WYBSkiQ", "bb4b45288f8ba660ed0a6aa08d5b820df5066f341e39cc625428c6a5d257d63f2ff5ce6487d03d109faaf322609b971542680bb4a47e76fdf6d4e5d21f7d9bef"], +["oGvYdKhaeBWhJSK4rAe7fTqPLg4BRavFjHdoXSa6zHciY7W7QDd0G7YE0", "a41ece21c2a0185e7fc4c01e919beb1260f3ce50b8c1aac3d201436b0a5d7f315a218d1501eb1b89710bc700dc825b94fd57b681765ee896193c817a8b1a9b6a"], +["mXUAbYRfc2KHvbRwbUsYrHuyvIu4GbY9ltzsiopsyMifsRdpDNF8E8Rn6V", "e697d6c94e44370e077d8c4def4eaf2c8147aa6cc46a0559d0e3c45ebbe41903a9d4b601864f2d75040dbf4b5bdd1866112526da74622ff87505f467b9445f04"], +["JVU6xxbzCITqNIdaLbYpWTCnwWih4JmdGRGjUpVLdpGtgUv35OD98tOUp2t", "5a2db7b798b6a0ce4e6f9c16949e3615864dd7f1fbb164c3d60c8761c6a7582c38135e2d6ef581fb4d5075496f6968f2d8ae231dd1425e575d8b465007157699"], +["7afCnFD8iVing9aEm0quIsKHj6oLuEFe8rPX3UemkQTrKGIQtSOhDjK75Z7Y", "0f3ab709e5cd4b56c7d268e9f8f326fddfdbd89aa25f80c44e2b75ce122916245ee9c8ce854da36057ecf268fd1e4d87a592b68740f362e57446f0266b06e2e1"], +["sZYPgl5v9xA7Ss2aGvAzPjRUACf7Xsav1Xz02nesFCyMHoxj6AEEAz0hSkuOV", "fbd9a23db3f915abc42f13747f53206916f262a82f83fbda5a01a75fade85375e698149b9037833e831da4359bfb9eb5e090809f34e8609565e7e36a8c5a33d6"], +["oKG8teNc6pIHBgKJSaUxIfDYx5u4ASkr6EZWVYT9vinrtKqtHOc6Il02yXRP9m", "a55c9b12950ac64c89ff21406894d23ed594447d112352df96144122e95028b8e9dc9353edc5a31a665c495ed91e3bddcb4a8d022e1e6cd4be06e6ff5eb93c21"], +["sCi5AErDIFl0S2T9WSD79q8VnXiIUw3yHAcvcSY8OrGq2DgWNsi8e40xcRPAMjB", "2e5acf6ad2efcf4081e7ceae7238d46fcb5dc64edc7d17bd00c1d26875bb93254909abc7498b6da96504cc6056106a0a757094f710ce16b49444b06edeace8e6"], +["6QDrouBKlCka0c6qyaC4sAQ5IB5G8VqKanzVRt5SgizsxG1FWT9l1wQcgezlFmox", "a9fe3d6d9aa7ad3ad529900a2496edf7a0e7885288552abbcfc2e93403532c14ca1284876a7abb02bb3df2fe64c76717bba9a06b47cccce4ce54f31c0733079c"], +["KtFXyEFbqTLv4MmPkeN4E4Svzo6HKa6RTVlCbp3Zh7xy66HDTy4mshnic3cbudir3", "21bdfc6d98d4f4f52c815ef9fe0a36bb9dff4ba382dbd5346bcf3dd60c76bbb1adccb9b782bd7d5445b8f746c052963b5c6653e7d55a6f083a5728b989fa80ce"], +["dYeOMOomECPKx9mp6d4ZJ2yc0UBe3zxoES1t4HtqH1rj1rqZW19FiIumREobdH6Yej", "4cd1e1feb0b52c76309ebae058a97f2b713f3450bf63bbe39f0b293f8270bbbc5b3091c64baa4546a97804e76c4fe9acc1eac8cf47acd21761008eb876165fc6"], +["WTaoKpjViC21JJchxyeC495kAbLmH3rcA1Bk0ZLzjp8DWdRtz9s6vfttuKJRb8vEl9x", "a73fae40bb3b35230b21592a8b531d36d4db4306eeb2e6d07d782a339e8cec898345894128db1a061673627725b18efaf16ad882431525626d1c2f87e38a5b5d"], +["MwqaqyaKZAAt1siU2BYnmzNwuLDZ4VmPh9f08rLkE14rI51NYrDCohw5GmlvpLNhT04L", "152a45d59b3f6cdaebd7155f7ae4a70e5fc9999d624ac849ddd09640c08ebb2587aab0bbc1590bd36e947d2b36997b50f16bc1af87b1d700bf5da7737c92d1af"], +["AsKDR3ofT32vlLSgeOWqp18wy7tEKqOMxprgyq4zctp5jw5njxftt1hbccLLS9VwqEoue", "2355c1710eddde8f0a87039a7d166fae869190c3fe0caae8dcb88387726bf23cb317a19f8aa5eaa52f3f28c81083ed7971416732a612f119a6989ba852893141"], +["JgFbA0zEKoPPGMCm3NoAq5F5MfjL5TArvJyZJls8FBpKhBfQEvrNtvV9aQe7dyGNHjhMSY", "dd1caf6c99250f69e88c171b6a9fcb52f7e078bf8920fd60398de343cda026519e4910ec41d2673b7db316cb0ce044facc8bab82f9d721b818b55ce7dba05487"], +["vRTCjpaOUSbfk2SY5bwWRmQXz8V3dvCLRdfODFnsSmCfs09PfJGeX1Qu7VwBDlK77ZZES7p", "4a34e2b22a61b430b38188250f1f0778ab29ae71938d976578f38252c8bc8dcff7193e1a306501ef3dc48da2acbdfa8fb594be07c4038ab27b56b72462770d3f"], +["ROqEDrxbWOySlbeCWtqzmGht4u8eSDE8K8jHBEwV9hqCzC1FSIpPJI9yX22miBQSM2xfBoLZ", "51d6086f4a09e353192d803091d5daae1500c121445c1ce0710fe4592591c35b94d70d3fd257580717b7e4d76ffaa20464c622e22b31a8d3414405f4b78b7179"], +["yDPykDWkQTu8SJwC7w36vfYo0ro0YxU18kzaRvFnZ35SRwufCrJIZ2xRrfAQeFXDfwkamfWyY", "1bdd37aa50a5326f505b4278add6256e13a6b210998376c51b499830f093cbb46ec9c542b03659fa947d95b0371e32b3c07643c7e83b16a32d10dd8da8f0c292"], +["7rrZYexc5WNXwKQwW8C7WzuRmHQNaEzWBBsQ3fHFXzOG5zr0TkjPiirITXXtum235hzVEWHuZc", "3e79618d5574382e3d612f336e0501fc9ad79864370a9a5c956e2156581d1cad84c16f1ec328f769deba15951182a28ec5e7ee3eb11721b308af71ae801e8459"], +["VfNa4JYk4zouXjnypeYoAWiVLiyAfVtIWhHwuKyUv6NuDfHpAiG4cq7Gy0nHGPM3MnpKBl1RMhB", "1fdf48804b26aeb1ba60db756c55b14119cdbd8eeb55c6811f8973f60537e25c67ff94bc0b0dd918b9e8e217885f10602ac76761504d4621b9b15db8045295ff"], +["pXmgb7MdD54Azj58D1tZAbJwx4siIOqkXWFOuxTTcT2ChCQPnRXbu1p9sgt7gSLbJIfi8HSEEWVZ", "d799de4c1308e98de76e16bbf78ba95935214c8cfc0e5524e6667fc28962193b02149881df5c0aa8e5df0998ea188439391c3cd12b612c4ccd49374bcb9bf929"], +["Ko9zk5idDGucb7HbqF486d8nWfjORflsrT5ql7ZV8SXlxGzVK1qHKX32vLspJUfKwIBvYkGowmAo6", "fc594446650aa528c852940d7ceedaa5b08af031c86b3631a9c54fa4a13f1e0922d473b6dbbe75df4f34f261a89bf5724657e1b72051def053ea7984bc91f8cc"], +["NYRuK8zLcOnR6UAIYQ04MrXDVCChg9uZ9tuG5bUXjayN3oyjU4ZBu9yh6QsZq9S7HZUkMkZRCrMfww", "332e916e4e1d7984f8531fdd4cfc3c61920925d7813a8511fbdad7a85103f13f9f3b5cf10612a872f29ade38c79050807f8732257c32c5f656b4e8c8db3d3d6d"], +["8xwifm7m3KqBMCsFSkeuoliOUw2CGP0spCAykEwtur5HCrEemqjuS6vuibLMUa8KSmnJrX6XCnTE7tV", "15ebaf2e92722fd7c156235ca27df8f6b6a30aac46b576742ef5e161f40b0370bac3cf0f11bd255a6fc27075c0a4234ab3c70e57c6e8bec56815e6355ad4bdc8"], +["BSVA84OMXRPrIwNdnb36kILGMwatHNudF0T9k7AiiDbh8beSSfaI79nzpYcSPywxhz4LUvjfuozNOANW", "8a5ac23d252cd244d19cf89c196f20c87562ae733c5947b3450fca38ea0a8d13310442cf99387287f861a2248942f41e674129ece71d6ad402f111bd8dc9d97c"], +["ZhGfJjDX5MgEjgImUMOponlAck39UVF38u5HiWbACFVs0nxBxpZhg5aRTBaBLUo2tQGQs5j59JSqemTgc", "357604537f7cfa9138921e07ca7346f3b1af7f4d03d52ff5f9d006478d141c977439c0bbb47f2d15d2567ab18c5e5a44193782e89c5d5e34678a130f73a113a7"], +["WCJNxs17CLW0H42LsKHcQgPPS0btxbxxuejROqYY77M6SSfkZy5t22WBPGHXVuJyTunVqYMJQBegujvhoj", "a549178456f3c7ef2edd61bbe4588582375c4314aeb9beae6ee16eb045e3bdd605f5d84129e8992a51424f575fdce637d8c25b2f665e955855085d024b37f9ca"], +["nP9QJudjFHzy86DGmU8y3sY6YRRQJQ2NaWlCHQHVRoTUyn0Bcot86x4SJ31Lntk4q7KYeCTQFQ6hLCfp1oV", "06ec889e518d0cb6fee60abbf488609fabcf92045d47a2e91fc1b8dc71b2e7fcfdb30427d1e479d705240d5b9bae7f3bda7e5887516da6af32d02381af1d56d1"], +["BqAI47XI0tko57H2j61TKRKcb64Glu416PMy8kZEcEAd4Jv1Bx4ll2YtsRQhBEhdtAc4zhHkzAzBe9bSbIQX", "176c518db8df553323acdb0597cdf543493acdf25f090d9c3fedec1a3c8d415e56781271c6f2803b72c3c6ed90b55108c1b67bfe691ad03dea6db54cb62b3d93"], +["srWB0cEiTmgttmePIkc8mSAodn5ENhEHnLlUWeK9HD1rtDv0FL3fROsqjdUiPZI3Vb4OS8De1j9BoQq6sornU", "26aeec448b8ed2dc36744387a3536fbc6d1e16ce0c929bc7fa020257ffb3aca4006c0672a6e314251c4070f191a5868fd325fb1370658c30523f0fa629e005c3"], +["LaeWyjxHvEwdidkDe0RAr7Z95EfTjbtdBK0enTEhNVbpB1A2yf384YGNSWnmPCLiwuJIRJll3Ui6SJ5PrAqGEt", "2fac9a70454a3f0889b32276e9aa662394d6a2851ec11b5be14ebaaf730ab7c5b0a3d92ebe2dd19a98956c2a992118b612d652bbc8fed58256a882dd656582b7"], +["oSPAe068WS84EAxWQ4pO6MSClWBpOV4y3UogD6OC5y8ffnnUOUHAtvuT7kIq3hD3RlTYey9RKOUyj2Ih3rVBJJk", "264a4335f65e444d5ef030bab9e997648327af076ce6eda5eb81126676d6f729962cd31a5af4732d168d70b7fe69b303e803dee9e8d38c9dc457f59f9a95b850"], +["hNclQ9tfWQQwRlAdvF2hQhRVLXXXmcKx4BbIRbs146JFINlXuzls7125nL89Ys1Gj7ulf9412Y2N8pR7dzNmzaum", "d58aaab851bb1373c1efa238d92a42aedb16c5443fa17e9e578fb51587c73ddc04a132900115c72ec03704c41180b161ad0a9ec1068a48a1b45852b9cedf256d"], +["frw6XfftMMiJZSIhhb7dmc3VXQIRP5yBoItf8zxex1n8eCjHlXH8x9b0qDtljXedmBz47yfPpRD3TxHcrgHtxqnir", "32bfb243a5c8ec51b055cd0320e29446921e37c44020b84844254be4570e004a705c09a34ac00790cc68f79d93f7a0ea3335bb68e00f15966987f12f7096e0f2"], +["AlB6LR5R2VvBO2dmhzcfLdM2VyvC2EhuOeWz2SLGK2afhUwrRm7G3IoliQYILHvvHS85019KhE6iIsUmuwijudA0Qh", "4146dd3ac1467a4c5527335126064d4973ad0a150163ab8f86e2ca0bff6ea5c294da7fd98a2f5ac8f8bb8993b182c652ae8abc80ce77d2b09a5007d32db0258b"], +["d7WMaWfewy9YxCIUYVgpNeY62nGBJszJ6d4BeGRgz8DMTebCsydiFoD6GRAJh3mfUch9P9VpLo1s7TQpeS7Z44XWAl0", "2c6123c7423770bfb1cd3b1b4f0228499cc3a78ef3c5924ff38bcb594c22f5f6e32eecf5e333691205df0bc6c130072c739c046dcd1529b87e0d7cd1c79e54c0"], +["DpKuViF8jxzVfulhvgxzbU84AJgI9y0RRsIIgWj4z8WaV9pIGhPbh3X3kFd6Bm1rlhkNsvhc6Gy15lkws6HvqoPEJJvu", "ec4d367e32cec4bf2f7471e07494d8ea0b5948fdf270d4c5eb6daf34ff494e4d483a109588c68586079bed2a4600584c973148f1aac2833565ae840f226629ed"], +["XoUpYnfGkZjpZ4JNyWV9fsh50R4Ug0Wb7hQtrKuZaMNZ4QtEWox7rsOEaCHtddk1Q8sDkBWzkkfdTAVmyavfHzQa8ND6R", "1fbee2c432ae4eef44de3be731ed0f6d24739b8e8e82df2583c962f69572875b0b21b1c188294f4bcca39ad8510ca559ddc7845aa0f830a8541ca676f974c2f8"], +["ig8s8M4ECr2sctZLRwiB4IT55LBCPgt8xHHPPbk2I0x6slLP6yaFpLvcz8hAfAOY6lG3lCuMdxZjMnGsUZoEi4O64U4KFR", "aed4f7a30927873f6179c34cb54822841fa045e0a69626d29a22fe4de64f0f3500a7293bb5e9baab7cc8ff9bc81739d0ee330333f82c0c2b7feeef6623023d80"], +["Km1SRaxT79koWV1oLXnbv2zEZrpiRaHtDsrYEIg9wdtp6YNIP81AVtsb4bgV3UEIXIvGWqp7vDRV0gmEJmfrDCkusYkck6K", "710b0516f8c5670905fee40ef86252902d296dc005fcead8d0fe5691492d43a2ba0f44f507e52051495d7fc4fecac0488f1cfb470ae85c06cebfaec627144d67"], +["BujP8eXDGGMpTOqAikjSCIvtJKTxR6CHYtbYrpNeQLLDHblTMtIepVA0ymw4LpxpxHqjDDOPfOaiytpOChyloViH2ysKFj4f", "f743277e3606dd45b3800c8a280be03a72b0f8081e8cb5c4b46ef0b92911a779b81713ec67a65ada9bd654b0a2e2cb26e738518e93d4618f747122c1fef44d82"], +["esf2grHeygHGJ2nJixOtUs7Rstinw3b8KOTIF0j1MAw0VYVVyUr3XxFMP6axXwuBNxcwMLTlcHSo8RhqrQTl6lZM6cRELxPeL", "f9e710dddb96975f844f5a6f29cfbd981764f3e829d4ec59dfe4eda9772aa6213c404627dcd720bb2ea711a81ed260f5773c93cd94325863af2e394d0a87e3a2"], +["NCwLlsC0rcfVhe6LzhiZYrklBF07fSA5Ea6SlJRZL3fcgFC7hYxZnSmE0NQBvv2RW4pEyMRJlt721EQe0mueK46dWdDkNnVFIz", "c543412bb1878a89960370ffa106b1bf4de1453529a1e110661158c99dee8c9524a9c01b7dae1d439b4befe775b02df206994cf997ec818fe0e5dc6f4695eead"], +["LBTCr2tetr5OGnBF12mlpd4ARFU723WitXpjtsvy6tunu7sU2j81ecu72atcxPtDVQrlb9FeumMwv3omfDPDrJtsfJvyplBu1HD", "639474acef937e7000e868490aae0cdc8d42507dd08b06d55beead8a1cf52c9a23a90b1d599128c2cc47ac513deb36d3cfa40130cafceaabda1e7e6b2a9d1f5f"], +["93VRGsZR2AD7hUV8ti7LHhy23NdpEN6W4wbngPdqD3IIGsAmZLPFt4AMLqGBh1I4Mm5CD7cGpyzNDPnFJKEwPqfOYhJiMNIoW5mh", "c5f36b63c7fc2c494cb02cbd9f535614abfc822fea763d5f899ac7ed98c0086131f90093542245dac7870cb42288f158e3832fcf0c0a06618bf4c067c26ddeab"], +["HZwARgtWaf5he5AUX3KlbmPDHsu7l8Hca9GvhGYT8gCPV1bjoLMkcVDo8cqWhg6DuN8x06WNGvfiARdZEjuWTsfa3mE5Z9MHGGgJc", "64fa8426954d1fc51b708ddbac91b963c6e382881b563607e2b11b15b539dd49e3637143632f14a4240d235809080d428d070321b3428abdc677d1852c07138f"], +["TMoOoPAJq970L4wpxWzRi9hqGpk3UW8yO93h2jPdc7G7XbPfmSy8faQ85D2MLtkbiiVopuPxvEv4FnEd9sKZ2AvCqhppN54a6kRgKu", "357594bbd14ec39eb2fc223333c16795f6e9a29edfd559287d1ddce414aca3a2c3935514f92cb73cfa0a328fc8f4e2f2b29ab2f004222865cd6d693b5cb4cc2b"], +["vOLg0dddzpDQ8VkXUIC86wYzD3arbgKt8lw26VWfQ9fuTnrNiLv2SaScSdjN72JuUJaqXLlaU2XH02FSShILjiVnSu7W0a92xOYNsgL", "54ae804198bd91d9224d67b762a098db28649f441377fba85680649565bc9c329ae8d817ebddde6056eadfe2f110ff775c8b4888a8df6b584ff233e4da4b64df"], +["PV4RByrfU8fbrBpdJXzOGYVIsaMSggpO8rsShpx2pHbxkHMNu8DmsC7nH71xe58JjpSf5FzKDmGsLShfr42prhhifrrXk8CEJqX4BQlo", "0e4c8ba5802f4ed1ad186a4cf6f9326f92c5cbf5a5f94768b25ca5cc479dd65bc72daf489a77834bff0f90661da9be3dbdf0400c88a8e6228736718362f3845d"], +["ZfJOyzfNDAWgdoqmxcZFE5Bk6oLQtoODQSNlTyzCxFgYlOBRcMYM5r7ntHdDuV1z7PBYW6temUuEm7hu9Q9PSWn5QE9suyHtSK0P7WwB5", "e4687755d9344ae395557911371a9b1360db2e9f01bd98dcdf7be843a6c22f162eb96dd4fbbe5c51cdcf5c7ffb3495fa996630aea6794bc4873b9edba7973567"], +["u4UoLewEAOLg1ySvGnBRWL4trIV9AjEoWPtPqgwWfaOlGRd88KHRMNU5UJQu3VEbdeN5zShDC1Os0OI8Hf7OycOc9GDRNAVHJY0jtxblnL", "82381f5067c68856310f79becb5e633d0cd42ff91be120ad0f2f2e24c773f64ad082a495a0037ee02753d006b06244ca3b9b105fea6911c9e24464a3f4372805"], +["os27G9PlAxN7hCcp11xBk1AegGLFnH53snZFWX1RsJvV7gy0SF9WjaSj7yk8fePwstewIIGODdnj7uqZ3Mzspy1qK43K41n12rwbzI0sI3W", "eeebccbe4e809e5e6304d12189bf6fb835d0b579fe80915ad9159311358c8c02d3c91517e654c6e28a61411ae42e6c17174efc1959719618f45709c0134850ea"], +["enNYAeXJzdh3ahNmaU3Pi4oszoUIlk1TplOXURvhzEkATutRtibiwqrp9I3FzWdpUHUufama2gPy5afQw94WlsxZnrGAMNHLS7EAAMZVCdKU", "b14d51adec71376773b70fc956e79b3918d1b452aba484a51b9bada454e74c4cd7eb9804577e90a57502c1a29b5f058a13e4f598ace14c7d30869f43c7eae674"], +["OI0eZkD07tAQ5vVxwKdYHdAM13Td78k0gnIh5lvQT9G5P5DxoF6LjQ7QitzDF59eQWzjGcXM3wWQSdPXGPqFR6g62pQcJlW1Yo91HGRaAmebd", "732526cc45d9e22d8b1f339539a7be716627ca070d276c66ac715c2108a929319731079bd2a5f07c851bcff47ba7d8d4b8d2823bc1a4e416927d5a90d381dfe3"], +["dQ2kfvkXYfusOJjHQbAIgwfMY6zFcyZabbqzyJcUjre0okvUPZrnBBnumzQ7JHDsqbyA26DiAjs6AVBaAVthpdYieA4nfCXLD1McyBnBnaDYHg", "a955096df0d92d6f17054f991d7df1f6be81155f7c622d1bc208a7ff933a8461e5ec073ff4014e1e43f36497c833e5fb9d1acd286bb19bc79a669498a2624c59"], +["KOkXky7kk2u1Ux6XcX7JrPuenYxg9qmt3cMdDCBuCExH7x16BrUWx4tPurF8TcoES2tA0GUz9GMoAY0Rb2gozME5LxFp2vroZifmmQLX7LAjzm5", "ef10aa55af06a36ee2043fe42cb8a58bd074a19a0820f5783a867a5c369988db366134d4000afea24b48a83444105b32bf5dc223ce406aecdd26cce06937034a"], +["VEXpJ0dki5TNJhdaRZaD3H59xya3JSSNmv5o2fMgA9IYhtfuWrPtvt3kLnuNVay5B8NCWI3RryL3rjuCA3hi3ueZvl8zVKuPYisnIvZZNff8m8Rq", "834dd50c5bc17d252847e5b98c5a21744b84bf929934ecf4a45dd532b9d58648d94861c3fa9c4a6169940fc3bab2b72574e4f3e82ed5e02e42f689e40598de02"], +["hfAFeJ6ZpetBOvj4jTWPrYnmES6cJdQKcTSMDnpITyak6UA4mwwfGYaniRnjpGiAd0f1Bv9hA7bMKxyG9UhxleCE4tOlHEyoGddiOv2tADKMT30Wg", "642ee6af7c63f696685e71e0df2fa4c8afa01c1fbe8159b177f648b9d1530777d187cb4aa42649bc6e5f5a5f753ac7e343051f042ac92927a37ba1a274cdbfc5"], +["CvGDpHf5CVllAmjIB9E9lOSgIoGYaBCOONf9D0qWIdaMaZB76kLN1EWfbrOUUJ9ETd7qvbyClcbN0paCrcTnhhrjAjKKUO9hKEcs7rb9v4GKdftAgJ", "f3ad01bb9b67abf670b0e3ff45b4941cff96835535ee96b5525115df7486532f8b4b5e862a6003b133eabb75e2103aab834cdd0f396448d1bf73903c7c1da4b8"], +["ACv4w5j7F7117lVPk8xos2QusAAtsC8jbzdXRfK5FFVyQVCVBn5uNiiUvF1j3i4T4nkxxljU6YZnLapSnSqia7N90zH5mEGtiS3tuUVP1iTi9yDAlDq", "98a75c494863d46bd556ba134c2ba89196f2faaefd2eb226059e126c3e27871bda235430f58dc7b2c4812937aa635fc45ba1fb493bfeaa9373aecfbe9c46fbee"], +["0akY51UGdMn4XjaLUSnQm83zr2hc1Nn3d3PUsZtZCK3tjubABYAOUsEhx62koh9vcmpl503ElhKyZtRbhml2y25SODc3nNeo34fRBQ43etX4rLbhEkNj", "ac56fc99e4df81b4c430ad0e5d4e78a3dbdfecb4f952d234fb4011ae060dfbb0af14ca7c946003929fb73d6e3325738ca24976ff51213b272a4f4f41409d8e9a"], +["EwJlTYJXf9eXwUORofrOSnix5pyTVYB9fZ8ve7OU26jsZUWQ2QiyvLgvQPGZghuBWlkFwz2gvzqaivAk9KKL9062uJLtuHzpm5B4smlwi3Jlypsn5e6Ze", "a19e4747490f52333dcf2d5a9da2d5be1b4f315bda6fb2f061abfcc1c6f9a1fee90ab3a9a2089832725549613239e633d9fe4e8428bade1422b2503c45a2c70b"], +["BLET5uKVwAGmm9fCCe7B9Awyq5PRlq9yLKhnLyLh8n0BTa3LlTAZ0S15qufpjw8b2kCaueCry44HfGsq6bThwUoDDUCkCh2AI0kohw6me6i6XmYjpkpkbO", "0464fb952e608d5d70bb344b02895a59539a84800704fd6bbd0c98856c7e7592ce4958f669de3feee30d4a610354b910761096e895feb89a6b4035b75a9b334f"], +["s8ouMpQQ4O9MXasWSHg9VPqpGb0wdllgmAlug1LCvQ8scuz6rMP5Nk7W7DBHMoakM6xzSfuJZUPGnjg6ypSwK35ltUcRBef1lnrxEE7LBhi36LQxu98p9le", "e90e4086719e0bba29bce7e4936f220c43995874e3449971df763d3bd78ae63479cc3874229304f4a6dda30934ff06f7547c83fcd070a7acd3373346d1c87e09"], +["BnJ8pYfo4wPKHWkk0bykIZYjaH0PlYXZvPpjCXLxYL9VmBvV6qXProbSpKl1aazFCPDgIbUK05P8wMY2G3TVnvSl8me4Ja8jRaYpXlTH60MmMSkScEFJJz17", "20a2a034135409360a38a5ac71f0786cfb56ccd6ccebda7a7b228ee034933e38ff09560c9a34744c3f6690b9900c07f2fc0953c265af3e03a0327fba62fb90c5"], +["X1ntVz3Rw2djbhF9JpxdaDz1R5bPxN4L4WPnKp0oIxLGPlyKz7zebeXO9pzotnQCWA2ZLqRyZnw0M9nwJyvfsYCte9ougLU1IR64qnz8V0HCD3PJQMz1re0xW", "4b0e8db3d88c64d2587747a46293db7b589b6ed5fd2af57d0649fd4b067209412f2553950ced2f58170e78464ead03adcb2567a1bf84929b806823f66a4a5336"], +["JTOYfqeNf2Uk9B5Il8zz0WMo0hcBPmFoxD4S11RSIZysRN4YJbD78Zq2vA2xtUyMXKD0w8Z8gK3NfIQZ6xex58KSRVJwIUpcIA5IEM1OlQmtaPCbt3f9VaNxoi", "228e5683e97c7a49a91ab877c269393128fd7e5618c375082346177ec13f5c41c557d5ff059f06bfa6e7e211fc64f83bdbd94df868581fdc6a4b61f6fb80c212"], +["csrv1qh2ZX9GarmIhZaXhug5FYBFlOsnVU64Wm6BstKox3gsqEX7BeNpX0kVifUoOZC8yQNAMCMFFwnNgVxQEF4HOKt5lyQHQOfU0ayAasMiXdmZ3kXtJOwEsQS", "5e4882a6ddc53675fbf2e8ac9b9d7f578c360264f6df7d17a923d52c41b33d6543874c65f721e46e31fe98b166fb0bcb001f3d0cab8cf2178fcaac05ab530102"], +["6zF6Co9fnS3J0q5ctickMQ8gQmwbvv61SV8JrTAOx2MaXj3kE9D3tcsALidDEeNxQN3rp33UwqZBczAGFqqzzvoqCdu0Qw94BDzvtdbs8aZJxT6ypd6SVR23TuBx", "d6257c563ffee35ef32b1cf4fdcf9356c06de61e46bf4f92837ddd9ce60ea33191a30a153087060b753b6f00cea0a33a46710a6c50e00cb03649d085ea340b4e"], +["kwgeSuZIKZhJrHaXQfUfpJo9b3uYQnN5Baot5UVJtDe031Ck1P3Eo8LcMwJofozvpIbFGee52hBKuUgcSrhnL7T7Arb8tEn6dXTNBNVljJp5CCQzLH2yKxvBcXxSu", "f82d6ac9e8ab0b4d40accbc6cb86a4cd67c8d44ac86b41722a80e10271aaad8388f9f3b3ecd1292ee8790da01be123aabadfb0f24ccd18cb058e6ddca3ba4f58"], +["S1RX70KrZyE9tlxrm1XiRs8qWdHBHCxijsvvjx2Twwwoodh6YM9n1T9RMHdS8n4EtJ2JJPM1JXbhVeLopGeYE2nAVPchD58WlST00P1vPnmHbqHBDIut5LST1HwKXw", "a928bf2b691c1ea83bc6c11e368f2fbe800a72c5c39acb98089aa8cb36bd6d388bcf401ee86da1f34c939cbdb4f437abbd942cb0ab3a3a55db8cb88ca619e854"], +["ymUErkG5vVagvsFqjwKwybyACoAb4AIWVxjLR7bSCzapUX1m9ad0du1ZlCOjgjC54hI5bXHdG0SZGrV1arRudiHPgjebO6o3IuNYErSG1hlycWoWYRYMRSqMysrMec2", "7c9725ba58b6800f8ac84ba52a163c631804868014ba247dfc53f303f1166eed439865b49b77fbb370097d4f32519054419331723797394af6b1c0a50a832bcd"], +["fixNeL3NAKF9gnpQPUdy3kOlx283xdLBGmelkPE6jAUImP7pwBCak4TTxZe4T20Ee4DoTwk4hb9FTKNjKnl7x8Y0kdW157Av9ybV4eqwGmprxrxtZcEt8GcEDqNYpq5E", "da1292929371dd341be497fc8115494b8043ff3732f0cdae4f12e5288a077d21e8df44bc53ec6d9215e6736d00c27a750c86702229f47e1e53555ba1bd6f849e"], +["bBQRHvKaICyLT4j3OJcJYbb0OlJ1x8wKgzbv3OjMvkZRNNyXypXq4M3vU67BSotadnbZIJgAse8jjtf0yYptZQUAELqN2ocEaQriKFGlo87hTAkQCg2Z4kNLtagKV7umo", "f9c6334f3605cf7b7602bdc0911cf455896ed550bf8f0639b904e6b2d6bd20f19c595fe4627ffa1f0ed2bdd78505d370ad46e0613a0a0dc0f91a7d9e4a8f0d9f"], +["g7BXiugIdKL2pu0NKkiFN7pbjwNIJ02hn2xdq5RtPeZZc15tfhrKIXfYDhgNs0jigfuz2foUGJHqNXizwLyX7DAUJc9CtsRPedEcO86S2X4mUIeBnMnfUli8cqH7rGoNYD", "69bb33cbfbe5eeb48252a0485c1696a4542e76bb3bd8179ade5d0e9560c6e54e94cca98585f4681b142c8a82f0e56be50b4655cb2a7d5b95545a55b7a0375f85"], +["iPt1B2nw2jXrFouwF0qaBOHYIugAomQqEmss0AFvQJs7QTPQ119uNKjYiCqdbxwDNZd5JwPhkQl3tPARLmYNkyZYFRpjeuoFSxwxgHwTl87thM4Hmf7A4Nwp96Imu3k3epw", "a3172771f8b2e79365e70d525f486f8659b2fc4561f95aa9c3f954da77fb9b6bd3d42bef275d9bd153bf88eb17275fc3879eae98a650e75063d3fddce1489047"], +["PhqhiyGB8EEFHJe0FvafO7cHpedDjNXjeLcDZgnWVFk6ytqiQPFvZoFZQgRsWWEpsHumPP1PHxa1bhbEHIevuHXSajrTTXNIZp84tSJKxwIV7LsXVPSUuAUPjsp2cw4qzFbU", "d1a220321b3950130a300bf7b3106abbf62a370630a800ed678e6c94e3dbcf8c70e50aabcbec43a8a9c7b57aa7cc4b9039c7b0111e81f2e99a085207bd4ee4a5"], +["YBlYyTxFNUcZ76EyrjTF3FeUqnNt3k6021jw7XDEZtDem3zOQauCpwzI9kT88uj0YLXns4lZHJn3rEQ7xBsfrJ13uQiddcYZGuD2kafOvqOYJ6DLAgxPnsvIYkkoHTd3pGJMz", "0738fc87c43cd7266fea38b1bb5a0a630bd512082a88484791f15ddf107e819a1a52f3d59bc70051ca29c3eeb0e60cfdc4d89ba67a88d7243f9d9a487650d094"], +["9ltUEFhihA95WDE8nZMfGgfaeKZiGbNhinsvVmAc2YDBhICClqXmKmQuTYuziofIuNm8zasjew1gbos4nfnPbpiAeI2LMw3mfcaW71qRexJCCud5uy23MowzT61kjIVhFBm9Ij", "453de45bf1a8c875fd7163d481516570b06d4ce39641456ba232384a18e0147d67d01a8da8ce53de35c83b56261185d3da06d473017a0e6085baac7a1393a95e"], +["1GmfpO0vXaTEGaVxmWhDHJyZMDgPubLmzwhmR8TWaXe5LgVQzzejP8VA4ePe9mf1uGXzz5gGQK2hqgLBCHZzNImWRkVo14nLXmVvqsgUDS4QObjvIzRDjPWAcfdPnkOHvBIzejG", "655784011fc365af46f003e18fd1688d812ec2dc70dea512686a6a96bc9163414883c3a6418a7a2c1d78b83431a120032a762d92b355bbd0b55115a35b35678b"], +["kcaJUSxhRjo6BrehLXtdIGlutIXA8XEHkkkdie68lW1v3AA9XVp6mvKQD3OLMJ6y7duCm2UEmMfyXdIuA8tqj5PjyItl7yMvLIdHwlJX91vaaVYE3IuS7BR4nX0kjaTp8NKe45oP", "573f46894a19ed1dd3f435511c019f64c66900b3a10f64e9f3228cd14d89f7c85926d844c827366a0e1a4f810280e0dd3a22f9a086616c9aeeb067dab6e8c2e7"], +["EK9qWFYvQOoN3X9Ye4vVd4HKZtkbGOIoRoNYB5EUnM3JxdqvpT6c2NjBDS8qGYmMU82FzBpiyFZ3uiKtYgtanpvKCeCemDMKmtjPAHi2SrWRdPAWtEflVzePCCJBf6OmiXm0iyhKP", "a32240bebe318a9b1f908bd03eaba101d334c727aa4175fb380127cce3276dd942867a0bec119f7db36d735833b4cfdee6408ec4b33de0ea40e4eab51499fa79"], +["GSAi7cNsuTnHaTau4uIscAVplkcMFPquCC4rp8WLnNShIyxlTiMYojyItNizqslGyXeXIzn50eG9Bbh43Jv60yo5rtpeF4DVIWlOjLPPeFgvjM8GVbxU1TADIORBQMYUVM6IKELYIL", "8d352cb7c6f8cc46de23bd2e1ec3db92146d333ad76781024f268efd7244c200a77a85d9c7d6d2ae9d1b0033495f7a00e87ff395b9fd30bd54f622bc94a200b4"], +["WSZ82CQumKId2rjzEkMvb57OFT5r41b31bRQeQqWcu2ELFJETErs5mofH1EUXYT0fOucWUAMoimXpbvRkZeCCkicRbKuyWVewIh9v3PdQPP081QGpQdezlyqo77LEWUV3WLVLdWLTYy", "bc45829769cfc93fe39465cb1e89b662a2d4398885925703491ef31a0d4c3a4628711f11fbb4cdc739c4db4cbc9e5056a56c5dad54e65d10e4922ecb86fe4bc3"], +["w8MQMIowpXZyCfw35wzpTp48I9PHL88sFyFAEtOtSKtp16rQ0Lnb97N2FoxLZ16Omv0HuNaIxGIk6lF0OQftgBv4YWPtok7Rmo56DFtUxjZlvl5DuVwI9yny7P0VKS2VM04W9yu8edXf", "e998a04cd979cc8e7596871c0af85bfa90b80c03dfc02a08d7ad2bb754743f335927ced48a3bc3c676bb30f72f366756f6a679d5a76651327ec6de0fe12ca972"], +["KpSLJOZ94e2LGKYDgfGlURAJ0XXNwRROEph5hUZOe2JbE8fozNeEEe4iUUhkbnhZYwxl6zDGu4MqWSGcejiwBHlr057krCQ1CwdUFz8XeHioG9XfmeXNdN7aP9h7J9s65Vri391v7fNAp", "8947d9a6ce8dd2ef5c6121883ad5fb5432d40f5e88aaae0e900c60da832cbac0178b9add94274e95847b23394fc6655a7041b6b2030bca90c4429e8eb4e5a16f"], +["ubVO7cJkdQr2JgH3jBqa3UyojPNk1RIAJrZ70Rtz3TEML2Zi42c1hA4gSyvUScIkd8XpVjAG73HZhhkugxPCDi75R3481Vu0LlPhAXw6g2ZNeqUBIU5RqKg37zIIIMZQPCOoJssRX6aSbl", "7a455f52a14123d714b3a11e2c28ff802a4fe9f4a7af7894b1de2b07edf28ca0bd37385515c7393a3e9e28dad044c6bd49d3f66918a42fccffb957ce0099db5c"], +["w6sZdg8crdK6rgnqlxTUSYzhB7uvRciFdA3sSH5n9NoLzhgcduRXZQ4Lh7pQpdtC0yZGFCytErXCCIWhT3YdNAC3bajWoTAwDu8CHEOGLHjCi9R6Fy85GsVH8npJTTK1qtOKiQ6NjAxyP6v", "304d15f1b077d8cea504a6d12c4fd2e9ebaae750e5d4db1227d9d0af8f3dc936fdedc735144a8eb1b58c00a5e6520f39c708c8b4c51b4818e2d1a2e83395c777"], +["K9IDtLpQcr8ejkeqyXiKOohQol1RpkcsaWxSBIP3OLYAsHjO4MMi6j9eqwNgX5iaWBX90ViROTyccAILlvmcdjpEljs2h8KvYeHIWtB9gMIhaoguFNGwyRwHGblrZC9Mr914ZetksSAwAhc6", "90ea10d4d0cc38b8f7b2bbbec2026d72deedcc37cd65d8ed6fac8accdc7c0e591198f0e20d35d323ecb53ccfbaed850942f8585c1dae2280ff7f92d2ca309a62"], +["OwXxM0W8ee04m6WwUPhF85aROrXpeYmW4OqHk5Yntew3rUyOSCbs7GOxmc8OgNSQZlp9kZYSmUVFF6RByqX4IYL3JPElYSQOqm7DU9sw24BGY1xskyBupw7qtmyM4pz7zgqnu0385J3uXGtIv", "98cc09d85868c37d84f5ce0f7520544126ea50ac14060b3c860707c50d18097ec12276e0120770141c80fffc3e09f70295ab6d5d70ed9d813413a48c7a911595"], +["GjlVirmvDi7sFfVdvln46uVucLWOk449EBqXWBgz1OuWp0AZnbN1W3uvFFdLlz2DjY6SGvJ5DXATP0ZLCnpD7cq3YhVwapyuLndPcX7picaXa37B8PHk1fFpQOPsRF4b6uV5rIkhXlCpPUeLXw", "c2542785ac4c8bef5fb38df52059f1492d192f944e37dbf59f736a5d46e301b5956e9b8f1d3927a8c384f2102375cad69a944ace64a65073aa191424408e851c"], +["Le8UkzNYoGzqRFUikXNgPtEhCWw5FESZCjFhDGnjSjFXW9bmJSIcCnaWUknUn45qr5ZheeGfHaU6fJoeOIKWbbVTdEcRoiJzJRDY1Aua8JzLCaaBuqncWI76ug8c7OpTHxNhOcorlNSIoQsWaOw", "9d752ec39b2c39bd2bef04244c352220b8e0674d8c3fb3792df1f9b0d69e9354d4ede1de1f8ff898c8470b91986b293d19a3845bc9c286863890439b4765aebc"], +["Idmn7HkdHrLefgVwzPLHvSg6cWquFyFQwHTeZfbAEHD1Q8GszjSLmJ3bgRKeT6u7J21j78Z2unOvx42ZbeuBcRBjTdRzJ0KrxRCB5bVeYDfYImpu1dWnLjnbxKdoD8L9NyJBj8k0M6zQI4aGrtMR", "92c497521c43c41db11245de998e20c734103a4ccbc1c9f819bc53b54568cf7a8e4f48993471b85a245c9488d964755e29b0e45bd84901d86cd48cf9dd2b99cb"], +["xDBn9s802JitDVpG7zmxyloe5XatKYXhQdKgLzKiC2V7aHk1IdRVzO3CIonXcUc6y3bqc9u9pDYXCi5qm356ZkxebEBCT4FE4CSpm2HYj49yoFTVB7GzfZjJe5SyfOdPiyBQlJxxeQMYpmKNSJUyf", "dcc00970bbdf039b8a6fca317b5249be1ddb1c3f06547617205540fca3a3bd38ac652bf4fe8711989e8ad4332f73bad79d2864015e6b9e1301e1e36f13920146"], +["63AMDXFuClbR56EacfdQ6I0slFVkIt0CazRSixPk8XYU4FDfMoVpofPgQOu0aHkaExC5T0t8FhaEZ8ipigdYJiocz384oaIJg6E6n2ev8OVcpoJfxHgaHu99hprJ26Fljr1Wa28nwuhHPvs6jc7dwO", "5db1759928394dbdcd7d3a49c70b48f8700c5179eca588853704c3a20c52ea5c242759c58b61d013b11d2c2f56d6cd554ce61ae29ab4d68ab99f2e27822462f2"], +["fQxmJYS7irNQ1ldSaMe7AdgyVYUcyxtk3wXPkcVQEDZHtS0Ojv6lufPxrqQWWUBF8iqwgmSAr65OlfaL5yn47TkMBDrCtU4ZHnksbAFh3vd0pc6txfBqfvizZ6I1nLIr38bLaTWt9JOmi1ugf393XBq", "bcdff1473c1b7b1b6ebc6cb211335315d50a95df6949882e810eee495f312a115790c5121c71dc6b8fa49ef5ba27183756b5a8803f5562e49820a05cdaec3f42"], +["O0jZ9bZ9ISjBW1jTNUBrymxlLeSRXkP9kYIQeLsL02fZDLzeUng3oqmrdUYAMQc3dDvZWlqfCevAK6ue0P0nXML96JhMeSbW2jyNcmDfgVsQjZBiRPlK2cRnFkyllaTMUkYUuoGE6RDMenFkaHo5Lg4V", "58622d7dcae9c8563ddef2827663c5b8250229acfedc8dfa22b6f739ba59d990810121eff9336d11bbed44eed0ad00f509b2e4f55a4e80f816d89b48ee987cb8"], +["WJcmhuvoSrSVmPgn8vlnMMep05o3D9IT26CHJsf0UsKknvubTh9tfPxdfj6k4P3cW7PXvRNcKvdrKQcMKs7cZTYrWhkT1lLsrp7msfjovsmI4Zbqaa9m8al2hXZTyMCZyZUeRGtJlfHOMBuHSedxF49rU", "3580f4804a9ae0ca77fb9a0118a52c04d0639824f86b9214ef18264d84a0b9ca831928808ae0dff8a7a3c6e4e357be130e30b847fd166aed01942841512f8167"], +["Dph4gq1N6rkAzz5oYp4gecTyuvt72TtzijvMomPxoYLqEk1YtMwLEcqm8QqbjVglkhn4Y28BkIQ0S79TQsElvBGGtihZ5ulrLsVeJbFXLXtyLR1YLeFCXLlhh37CxwdVwAujWsSKr6stcq4oI3SVZrHe0L", "d863fb0df7f1352b4958c6d166f1bde95cc215bbf0b7af004ded4f5a08a3e39e6a8a589599fb7a10b8cfe14a73ec8392550f577e045537ea4ec99132834ef152"], +["7ZTyS62VblTcatGcUtVBj0R7Wfjn1wkjdbz6ClgFI7LavDW9WDziylMDpgHV7Bo1CBPa43p5FHjGKNxq8wFlNThqWB8QJBzi4lpFnrY0g8nKHPnv6LE7kVaWPbRlZClyCPEKhnS4XU8xziUtoazAiyymTtc", "cc0ded18f966bf7677d36874f828a20a0a1e94168f626bcd563787f87b86b64aed2bc1c9e0c0d264e57cbab8359183142706f3a6e34652103a2e1dab560e295d"], +["Mo8JTu5xOgCC67hXM1O2ABQ0TCwzJEh8rw4bA8LUYeAlJu7D96ux5PQgUfWGoijyIZ1p1MYyh4S53twgVZaQnKLixLrydyykGpYXQHZVgJztgct2TkgGPN8l9xVavbENbJ3geqOoukB2ClPYvJexHAk9Tlns", "87606d497d8ea8a2b75f6c0adbb0f144db28fa0bab0a1591ef659c90797e00ebf49c7c02f594e39531fdd65b5d76b4a8d2fb4ccdea33e9d1f18b36082c42c5cc"], +["zFD0OtRkgR0Z0DHx62cyfKQE7LJBdYx52aD5Y0EBcoMWgMEVxJiwytYz6lzhIC9NWCVIqsUdqVJMXLSfJI1KI9p6aZiim3IOelYHRGF3XDaL1emqMNc3my1heXpcCEkRc7Oh1hipwv75musb9awkwvMJddFHH", "6e398029deb329da050bbdd57d2bab1364a3c70c497d944cefc2d8d2a686a1c47f1ef7a179b305d70812819ef64195f57fabd6d0dd0139f294d1d80b6cad45c4"], +["qA4JovB2zCKEQMVUchMo3H839iBR7A6LA8MQcL7LAPmHxcatRTRapl1LFbExU8sU5kM8jF8nXPHAfylWD7OYe3P9VXJUVb1ge3KhmBFnwqMjZl7JHwxoJU5KjiHDMQANDVjf0HJYBDcvtWCmEvTecSf6Kr3oqB", "5cb4c27d77000d623ddce78af212bf9ae805f240e0ba9cc6e36757fa08ccadfab066e930cac30c2c485d3e3324723e3c98b8ac1eb4f77823ffa69937f4fac86f"], +["fcdFOhChgvUg8a8nVDDsxIFEGSAB1cJKSN8FhwjbqV23VxfdSyRijRM8AsZFqq9egyNqlSZOOAVlueXltEOEqgtSfqxYcq6l96bYrT0YKtz47zcTGaucI4zL9ExHppbtOhY1MxkqHNwUIrzUvUFOTvoM8plmGMv", "b492565b4eea4fb39e881a9637a1c1127033c5c29dda7d190b9cef100b991018ebded2a20be53760105d5519b75ec26d931a756a5d931b75956d35db132a9f13"], +["sswXOfOCWLJldVQqzPtdgSTj655LngNAIoowwCNo56u9cIyGId5Wmsj46s610rRUKe9Qp5lJMSDxxwlZNY6Ixm79cgczSOiiC717l4DSkxMW97yb4gl9FdAvw67FOtmzrqYeEgfFQJZYwQ1DvVttMDub6OVSW9Sp", "caf68c57ec32af19e5c98f2f2379d652d3899d62432eb2175b475552645ad654d767084d2ff0e8b3954756b548492ba21b163f47bd9415cb51eafff7f35f7a77"], +["lAdNk7VYN28hfb9yW4xxR4Z2HCTJjxN03P7gJDgumDQ5VviMyKllsvNqNmzWZtIeMOR6jT0dkhD9PLjfnOJGLo6xdlMj4cyxs2VDEOA49Iv0qXMEfvqGsvhIwJGZEZCa92fc2dpDF23M38RLCHxMyrD89yMvUUHVO", "d2719dbbd1a4978cb4373694e93cd7389c6bc3e771a268367367db0f4bf54960f16d8b35a92a4a08a75218589ff84fafd7e42207031eabaf4a5a468aa693e34d"], +["QQnuQY0Oy2lArSy3cRTPHWqjcPzD31IpBPo86bfzRXwCzZlMuAbVndggGs6xIsdQVOEGkienVaJF840pqE5ZHch7aNwHelhGFQPOKdwFQ2AoSO46AgNsTcVRUodPm7AQcP3WNjwSCyktuktha9J2W9do5INimqao1E", "ee250173a33d89640f2d95657fe4b6d0fe85642401c5e3e0287240fa0cd652c97b3dbd3626f7dd85581bc0f31447d7a3cee20c9ea1ca95e5d3462daa4103c413"], +["2juZiG6eMuo0EH3se2WJGUvVqbdpWnwLDGCmTVXpofqdReT4lvdzOSfsDHUgUHePPWC4cmq3YrT6sley16gnPJB4o3dOX7l53t0hp7hr9091wom5g6syiwCDkA652w7mplDu5CfdwL62KeSXDkwimzh62U8EHhLwYrP", "f0b2f6ab1e7a81d2f4c209fb45fbb1b8d6edac905211244ffaf4eafac3f98f68f931389a7d98253695e06d98d6fe8c82496e92c0ae70ac5a2fe1c1bd50e01750"], +["wNCYwyVrx8w1pbT3HXhf313obPHpY5jXgIswffpdIBWlIKjgEqP83z3cyDzu1gkqXDZVzO2jU40p915ZdPAdf8PDGLdFwahJoR29qdzKQseL76I6CafBwBVjTcwLIhLO3c6FW3c8sFnn3Gr9aWpMehVETikUys0xNKlH", "7ef9e93292ffbe0a44ac5a91734eb2cd02ac929adeac52c784150309ee549e1c3c1964a50571019c05ffc4a8fa1229b353ad14b2b68998de56bc7cd5a7281b81"], +["dYz8G1WAtTF8ksyA7O6CBU2kZOMiS5SWVEZKy5V3rJA7NijoyT53K1qCIsDuLbRsaO3qnrqsjCo8hB2iyjqir5eVh0JLlNJdkyZZcQFqGXebGT1zVkUj74YDilnaHJ7NVSMunZ9e2t9gAAl25kjV9i6kllKevcu8sw8LK", "bf36e164e7a1ea24b1bbaca797e1d36db2c064e054af62d49468dea68d20af5a6c16a762214b294d4eecaf3580ef466459714adedac333ff60b264c1b0f7760a"], +["WwwQ6fSMkZEAwAX3tBza7vmxtxeInY4qy5xeC94STBXGgAjLt43h33s1c39VhB0yu12cE92UGszhpCd0ap7NffNyJOm8ZwhpivoxFBTpXnFxvZ2hQx9YuPYGXWvxp9PbAp3GQXVGuIDiK6NMH17B6G98nph7Lr4hfq26nf", "9675feeed471fc7857e1a4e6c02b486dbda6936da53ab62906d0a0084acf3737615fe0ecb019a94aa3187cd58d36bdfe9907163e603712304da6cc72b4f0b43d"], +["5wtvaPiv3dbexLIBlUW3N9Gsx8kHHErJ1QEtxE2qqukeRpYpGE4QhzWI1gIc0a83HKKWWGRNMNK6tq7gtEwfm2DPXyZML6n0Nmnvokpm7Xp4iyS6z9xJzqxSg6uIJPwjW1XNQV6UtRLspml644075sMgYRzyI0fpza4Nzwy", "16a1f845f9884293a2f1775b6e4c8a131e04bf819c913fa86d1fa327eeaafda623ed7871290ba4e77eeee5b5d951f574bc11ca28ed74511b96f27914a8d4b6e1"], +["BV0VcnptCoIZjZqJwUxIcshtlSg2gwMs3AxLNHhgFk10he0cjcHyh0zUy9sXK5nK6edWS4JhT7VANipETXL3fHUxRu3lvg9Pt5rfyc2K2y3HzB3jCFCITD2WXBlLjd8sCICWxTX6dfJKoXfBQhJAAiSfw4OXLkN4oVQRbkGQ", "ca835426170002411091058f8cab36dad4d11711a646b80a21c1e2bbe2c7c978675fe883ca60eb7a8f9364f2297d26358eb3d2196cfe4bc6fa8a7a354643ffbe"], +["5N83rVqW3EMNEpCwcMhp2ck9DMRa148dM6aydtsQ0gYChoRzspL7G792322AWCTFDwbFfo5hoUO03f3zY6EpfEy3xh9CoK4mQHwC6ix19pXIBy3UBRv2rxU6ePpaGyXWZXiDAeKU94NaOaIU9AEIR94tEvSgHoeXReNIFkTj1", "941225c0b3b8eaa0de5dea18dd77e4b43997b12bf109547f967398c9065289d06991e0eacb6b445e59ea9ee676c7950682930e8a7f105d6f2e1578a7f74e77a9"], +["j5ghAFp77TK01LWQJx1PDyH5qacP9fHC4CSw3cP9HoA0wN8c9siGjRWfQFlVkvEwksfEF5OYZFkNkqb4DqlEdXtwZcPlvsRoL2UIl3bSsyzdkMqgYn9p1ICoxnXD7gxWfvJgTG7AckfMNarcNnsc7RzeDw9s1IQBdIgEskqXLn", "61ad8bca5b063a1fdfaa7da5bcdabcdcba20229f7ecd1a90e7bf81e86ec234775002fee75c0627dcc4efdb7666d439524e38b66ef3837cd65ad7d54e84bb4033"], +["pVWtdhnFZXqs6EQxUML4ciLtewDZrZCjyKFJQHTlVtIla1qmDikfVQHSogReXLFXQ4vGlJVH0CFOYNgtQD3EYvKXcLNp44eF2tX5J9mjG4DxzSftGOX88bkOpzavdZOqEKl3oH0INaPbDc5Aq0y8VGoZHeZi0Kn76aLWkPOUTj5", "5c170750271ffbf925acb566360dd54b17d28d3fc34f1b3a797da47b9f77b8b38e0c29b395582ef102f05421cf903a5d8398d2edb1e410208035a93a8a187382"], +["tpr1GsZ1hsD4VMHUYPtTcrC4JWTqFFkJ7q9FRq7jtu5S1JaOFFygc9eG6jmBHN8ZMR6XtdsgpLSD3dUtrRcsxZL3cuPItX0z8WgteLLBL1dKDPJrX78HzNC1bBcVR4wYdtJzodgCTWsriF5wNQbMdDWQqLmS1njCR9UjZg3345CZ", "368162b0557ee9f74ebb11174456b8b4289687115f33cb2e5ab8cd16bb0ba8de3b125aca468c402ebec1bf37236d0b68339677c03462ced4eb66c869be3cbc27"], +["2h1EZHNlXEqqnhKZkHQc1NAC7XUBhVFLHX9XUu3f1E83zFXQrSytVVff9Nar0bY5j8vLaN0xJtASLx4rwKVNZiyO2OCdkCQ6lEu91b3jFO1pqZ4jgVZITtsX30vFZuwwz3X8JjOLv26Z2PkshKxjCNxsQLUOJ5qIZ07t9KmUq8BZW", "1cda0a2b07ad10ddd31d085d84df456bf8fe5e6f6b543d1099a9a3c231753b2384efd8f3d3d6117125ceaa559e2991995a22b53b105cd461d8c20dd4d5c72268"], +["8sA75DP85rzV1sEx3N4Ly3X74TNjt48eD5k5OEhyJhkjcZ95nDB3p2SYVgenov5eoc4ec34qwNZcP4BPozF7uiJ6kYJa8NaCGbTgGWePlx5PDycyvhDxgHx5j38K91Hn9bppp9lG4nswPrKBJhaFsizqDztN8aHV9dwlE3OoCFNZ9V", "dcedd766399f1f85f2a318e2bac8f4cc13ad3f6b25d45bdbbe14e1ef3f8f0ff6a9544adde9ffe9047afa05466f5cd55dcee34bbd4b210d974248a4f65541d751"], +["DqHxBqQEqgfJUFjvn8VGRT2exWnXfEEXToTdnyYok2qccXHZBxRMmg9x66fkKjyPounc9axw6yub0K5CybzmbXGZKlJdWebHUKgodZvBvlzXteurQZ5mILDUpTTwaCQabnIP4VNLE74eLK0OD3aXAYElQSTMmBaAN4jWZHCCy9aavGK", "c4aa727e7aa62ad684ae2ae031cdefc3be866aeaff04862b58860cb2d4543b322714e6aab4dadb00870768f215829472ecd2426c10651f049aad63878f66e38e"], +["ygc7MIjLHKf7Pr0Vv17i1P3eDXBmiTnRfloGovajxPBcgdwrGEnKHqNNSLt9DYnOemjUBZlEPsvmgtBQZR9z2Kr4Wlt0KSLFryl5C7X523L4PeC7hkTOGnr8VUx6zgRB85sMFi8b1L4f50WVfii5bjmqlWBPdgmC6vybWE4L8qoaYxnM", "b80e6400ab41862a71370b1f90d29e7852321fce4aac3d02802caa6ef11106c402581121518ee541ca11c8e9962b1e149d3de08a2bbb57e8cb9665ac3dd2adac"], +["gbWbbGqlxp22VzIkn8mxXY4a3uFOrJlcnHElgRpBdvGUBsCSdQtA8pVrORWIjCwVh8sPlO7uZ1YIeHeumZdewAtZJgFwzbfGq54Io8cRU0ketfOlfgAVZ6u7t7g9k05ua7RZcMNIfGOZlaao5mCIinEV4yyqRYsVwuggfEKDxT3BP8QPG", "b9d5701fe586c7134f7b3f49766141ce68ea60376a6defb32f82f076b9ee5b9cc09d2864b079e9b3ebefc219e7a051708e7b9d938c83e3af917a090614c12586"], +["R0QGxK8IzibG6oC7184fZZFj5le1gqgBTaL9TRL2eesCxpVxT4RbCTx4KnHuxOaO1eUVctCW3eNzwzCBAB5F58hL5wH4ELFsow1y722KrnJwiyvetQpRcntob9iomzYybQYSljiUSYDIdtdnVwA7HQUAL00Gu2JoOK85cYzbpjHPQU6yYg", "193e6ae08897ef18a172c3f025136e48e3e6a9129b43d1c7aa87db121c1e6f3214fcccd16354344eb852dce67383e229360937d18c7286ff924b1aedd85339b2"], +["ttwU1oMI45TczqE7B8tv8334zFRdOqsvXYnoEQCLiSpvBlw3chPKsgwxoTJibo0FowIotsci4VodHNYwu0YFc6Di2ThGYj8YUpiFKIDiWp6FGKWRvfPinniSJUfDlBdB0HBmbCbrgrBaIJukFaZhCWCFDQ0LSEBv8StKksHCUUBbCbPedRr", "cd54343c58826a7f0daba2295dd357a713a98cb81a4e0d22dca4c1f316f2ef1d9e96384db0c84d40babd245eaf1dc1667611e840a4a21dd94ea84ba50a45e424"], +["L77snrjQXZcbqdMEUsfdPYEolFktf7L0rGlXLYS8cR6AobUKPpbin5HR4VrZTMSex3eqCiQRGH5C2dTIH2slFCvkwcjuvOFJkFh05AAYVEdO40lg6TecL072JgSUdX7U70EtwiyeXYlkiu4D9ksDNYOf9DB0clb9bwmIZUSknkYo1nkDMx3n", "7fe95b4c824c6b7fd8bc506e4f2e432ac7f0aeeac9592c7ea0649682daf6cf23d0a73db1d206886d92a3507c01852fa45a327179252b2ab0b83f36534f03f02d"], +["gbQ9wuL4Hj35sIZefne8qfTwIGuCfMf3P5zhyKbQYhEV6FPBnE9huQnb1trLTkPBUPKlZZhNwstXQ67cKnsSDDteJGLyd9Gn01kAIQv15AWutz0iF44hXNNZMfOXAXDzyROlrJk1PRNYceIEUWHBQzmT13lQPVhPGXT19oIJpLwwzF9DmVbUj", "9648df60b975a3257f1a08e836254cd2a6bbaf4afda2bc5061873cff4e5ee8f4adc9f4d3f6e3e6a511407bc259111c932b80774cf156aebd0088a3d307b6f7f4"], +["Y5y24HUsOZFdMFY871kF40mHN2Bdy8Cez4o6M7zojvu2lNJpGcHeN5DrNlr0TJF8v5TjiYUenUcvqdjyeVE86QAvWvIvJcRrJ0mkDw0hNX1VCyOeXJu2l70CbNKdNnTz19ESV0ggJCvvi6GeL86i41EIIy3H186VGg2HIrCNQU0iBXD6SOWytV", "e722b5ada590bb6187652d84b3a8efe329b2e028cc02785ce59ca122531a5ec5298bd7d5ebd93f967593bb0c54031115f74e268131a1f69cf5f0151a90f64d83"], +["k9G8udssRJpRIjTZ4rWj18pmBqwYWsoGip1IdD4IeGwn22oTGjzr8ubSSRsj6xgcoPPcr7uYOCggxql2RkindyzBeRlLoueTFgavRRLLBeGTY0Nv32zI6XlrFErE1lhwosR2bxGeFO5s2RoQpI6ThUA6qCe03USVDqBJNhBSjd6Ci9aFG1p3snL", "ed417b80bb6e81535c5c53ad6bcdd59d55ea4c592dd8ae2c438e9be171ea841a95eb212a30d37d31cfd5b88c4a0563f5534a68bc1726c9004546b887a133e0d1"], +["du9Y5stGEbch34OjOEywFSIeYJVb3u8SSi8BHJZgHMs4CYW84kYyfKwCFmeoeIOYFQDKMsIC8bYITx0zkGtOt7NPvDuLO0zYihO3dHdkLFK9wI7Wv6Br5nsM5uSWJQdy5DYGKUtJ8XKCE5O6E1KvZYL3SAOPq4s4JRcVDUFUI6H1bI84UzOD7Y98", "304524bf12360aa37e44951baceb5623f654313a7ad5995781bdc03549c4de3d0479df84ef614a06b58d8582000211c522ebc3675a45bd7adba85fe3508dc0ed"], +["WH2Pfc8nzbZmItyFhTm2fRvGuaINqYnHLyo0cHt351pe0YNUb74ROURlUWtG0G9jIaNqmi4LPhecC1kOFlfIaDY2NbzuQiWaSMVBMOc745Q2BgyEdjGFrOZVXPQDgRP5h7BPd1D8r19992hGSgUJCvtdH2XvdREq72apXS4VDEz9FhBpH4XA3DROD", "0863d8288e23a7c0e75cb8ce6f3a43e221da79f14b9612089e5eb1857098dbaecd699f918621834e5eac3a73eed497871819d95bf569988e0cc23fd399ea66ac"], +["tCJLJ31lcMYXmTfZ0Evga7S4WtSoCNHmeffzdHSbIg51gBTPmucHWw8JLb0JX1UZ69MEbhi2VayYkEYP8Y86zG1m6Zk7IQjK42zh6lnNqGVkEAVlNXtnmPyNlToErqyv4VqnCEQVaBG1ZB7JBnNn8KI4J6VToEybQ5uYIfIKoBNuO625MUanRqqw4v", "625106d038c481850bf5726f86a65f46aaab617032b83d4630a139b9641866fa2a1c82c1245ddec402a543f14c066361efd6425327bca8ee60318b779e6b1edd"], +["30kiuScbAwDxt4NsRCNZdUqtd8hpVB7MxurfgRRAoyWEuBMekTu1nART7bWpOm5f6APyA7cIjbdbILtIZWSyajx7g5vz30JtXiCtny5RzcKPyaz6ZRSIH7GaXLFXsobxxqxOcMnn4AsJoC0VP7fwxKFR0yfEVh5QrhjaeLnyL9vDbSpir9YOuzAKNvm", "2867d042beb04d41d95cab95e2cd81f634e99e74f81b0b0425ab50a9ac888c875c6758c81f133d3617be2382fee192d73f95c0f90017fafef8dde500cee8ffda"], +["1iMKu6xeMruCLrdEMocUTJPJCNtqTEcwQ4lLNOTxlB6L8soyx1RmwF0OAGgGRDTWa42rlR2aMj8PFDyi9L2U6RvtmevQ4IYODYCvQVtQMwmEoVYU96BQxrYG2gj4dkO0uF1WawAzsNuvoZUwf6BwQmgLcZYKzmYk7n8l5UIxbBFcbk54TcmtXIBGOyZO", "1a37909eed833c3162ec49a761e083e12993100da70681248f01f0ffbeb26d68af1fb1a48341a204aa2e268ae36738499b59cda896c3563019e0d6085183ab8b"], +["UF75uJrpCGCQxUvwLS3uS3aq8A6K19fDzWqHmLySMTmq7d77E6OBhzUEFyOLYyr4nMTsIkWrwYPc1IkLQJHXs06PLNcs1NOTQrgsWPCbwxjp5nhX3YHVmIPDoskJgJ9VrfoJEtfMNopFIz8TyPshvYldfgaVUMQHYiWuzEwWDjY07mm0CfrYbSaDIVR6l", "eb7242b3d3ee2ee2c425415385e14d2ac4e59593ea138e445ea4d0dd54083d91e58644dbeda50656096daaad0401cf6982fd0c32364d70fc49afd0b44f261360"], +["BmkZlJquyurrV1AS8P8XeuW9rIA4aNH89dfvlPWEinrXn093ZUZuJIb88cwT6Zm12WaytaVPUzVZji0OS0fQVFghb4ot58KoWiG7npjFxbu7NLN2Hg0Q6zPs1qG45e5fiyGo1AFjUhVJ67N52w18daLTsBIQZaIu2ML20QiOdyTV0Tctf7g4Jrzzt3NfRh", "e9693f34941ddda61c93b57c1baa81508ea42035a12b1a64b6fc1d71780c6a42c75aae18229c1c52595903871b943ac61a852b28a5b0a11d7b081fea7729b81a"], +["PQwPX4msHtj4lCh16N8U9IgitRkX4wUQ9ooMcX985WIfFO8IBvQfShB7Dy1K9JPT6854KSv5NNyoMlatzOLho2Opa8zAPAdvzK3eC2rz7wMqNYQEPMPVdGX0gjsvjQtwjrBfzOPR5DNW4CdpJs7798ztjuhgAQvqOOy265cDLZbFzZQLpb6TWJMKjGcQLyd", "9070b80028968980542ed8eca90422e47e1c32961568a462ef29c7e2213d2076b1d800216a5711f21e0ab900727008cfd07f096443865c80a3f9b61a1abf9097"], +["81Aleo683x0NHmzZDJwdBKxUVP3x7OR2VkTssEGwyQ6A6JsCcSkzgSSucNhqljSeHVIOetXK2ynbEYwoW10gPtguDxFgtJbvc1lcHRdKNue7qzrKF5Ztplla8KPFf7lNLG3IXUCdEOSjorQEQBybXbno46mX4NoqSCxPgos3Ut5hSdaLE17z8gZwH55xg6YY", "27b15edaca5f705a03a9fd455fc0f88f09558762b6a0b2711d27c328855670fefcb251652bab6c945123d07fffa4bd258ad2d99e922dd9375310bbdb49f9b931"], +["sqV3nni1IeOUzlJNOWATNLbkUyVuZ4UIzv4pyzDUj04dQsErIIZbjEEP1jiLN3nrHMaNINHcJRnr8oACBsbLoQ0fbbm6LqMZyN4w47glzM2DwfsaPovQvkjPxAq1zPeswBR25wksCweFtv2eAIKXfN4CCGBYL6VGbUzG8IcO7ej6BqdtBiSAY4ZuIJxxVssag", "b6ebfd83dd4f7c010fd6054b7fdab259080931925b5ad5284171d3ffd4540314baf88bf102d474da2aa5df29114e05186c489442f9f47f2c0d57c44a7a227b22"], +["Dye4AoBedr2rTDj3XgEQt97MkxWknnnfv5TEoXQqgWpGMKmETZl3v6kO5DHSe0vNybdY3ypRjbqEWebrzmSRViItQqR2BAi0BoGkod4pz2gDmIUFxuAuva18ysXKjyEK1IwrLQm4SNQC1zTRwW02spDdxz9QrjmBMGvVojJTp3zSN2tdw7EFpMqH03cG0wUH09", "e792978a139883eba281242b8ac351fdf9a8ae840d931112eb574e1cea1defa9b226e30d2226e25878521c96206c7ccc0c5dde8c6f86a9155fdaa321b0b2fe85"], +["UH3KZe4hU8pUt1rwJ98jmKiNMBm00tCvuCDPd2ANsUGaYtnRE01t5jj3jXk7rnTl9uNxZKDMDeob1lFDQIg1WWDhv4S80PNpfUriunzqTMJaLmX6SQjEuP9CdzAdr5G7FpoRIkgN5Vrok4XjsPzm5GSIML0gLc85TMLce7C0T9s2mPDdFNWLM6XSNILJ5dWvdBE", "9e00c0938942568fd0df4b21fd28bb6e61763119c0571dc8d6a6c045020c925df903f5359e3b11dd4deb8eb117a427f9c7ad21c38ae96379dc53c3e42bd38a6d"], +["cISfhV8LL1p122pre2Qgg2nSrF37czpqlz842EscmJzCZyQt2KQuwxl867fKoQ9QwUOdujA5vsSpH0ABo4n4eztwfpWAGLk2Y4VTYwxFDLi5f0Ly3fvuUN3BaUiHcqwTVtsRrDvIy5J7lKxwCOJjYHn5L4kEgGQj8xuvbEVqOqGa5wHFHM2d8s0dsy9zlrecL7by", "4e9f1ac181f9b9e45ca0378714694408316da522bf48021df8a24f2f51e7479c6261cd7be47221304c70eb116420e601fbfd5de6b3b515d00fb6eb1d570c28a6"], +["CDGpqTYAds74fj3Iy8smqrqqB044pagiQDRlUcpiF53Yoz2hf6n5iZ5CdXTkfqP9k2e1SUvECKDEDS2E2IHUAwgxlEMXKRVlYutPvjNJjjjILtNvzRDv3cyGiaco7LHTaXmNZNVBVxhYMuRI3kP1Kfa4H350PE7z55qsACiUvOWjy3mexay5ulmWm586kfQrkXRdI", "73c2166641544d91a9f0b212a311df11b62ecca3542b931b70364e32a59444e63eccb94a7073dd3ba5fdb7a952aae9bb808aeab5826bde2722f1ec6662c05e2a"], +["lDVWHaAartXJRddzG3AQBBgAPNQSUwPjK375bnPJHLTiudwuYZ1Q6OVZhXCj2Bn8BBsMQD27gDlpAVyH6WNv27lB54DjvqgXUirHWSSuSK4fRahon5gyJrML67D2cF3smfaVdt50jSgRqeChQ0lCJQ6JuMEPqL0uBRlkxAZ3iCleLAp8fex2ajlyMwWRQCRFsFT4gO", "091c2d3ae58affebaf62394cb414ee32532450017af729b096b4242460a8c0f0c64651b12605cb3d001639b70b30139cea23edcd876baf60a2680318881d0300"], +["As2mj0gaQ3i00FE3kD2svRnAruEUSWIu3oPMuRUEGVvFITw1I9RnZEKEjyDQig2psvEcrAQSWJkcOzhakaSerjOvPEzvnDYB4bMBzBuGL42zQTRnUOlFLQs7bdQd8dT9gpbO2fgJaic0DvZy3ojWCAEYg5Xdp9ReEPo5j4VLlhR1qnR8AfQSK7tdX3thWn1dWizsnP9", "d07369c11b889c8823368f4c5b376f98c57328b5fbe7c440eb16cde2d3ce36a5c75b0b7b7c1dd42cf4558ecbfdab06681befe469d8981097e64226956974a7f1"], +["0tBJxopN5VcuEerreAjWjuHmITvH24kIFqEl5QkZF7XPYszfoXXu1aYivE5SW6wWKCAuyi9MVWE9PRASwZbuJdsDh5uCdGPuC6cvxHV9CCSEk1K6Y5HU7KsxLrL3kzDLDW5E2LadeMQp3egwTJo31QTblM32foSuBTVMjPGZHOzLmJRWPOkShDuxhAJZEHujlVotC91s", "6e76a7fa5860d352e74a670c251c2a6e39b04638c8063dace27d8d1c6b0877293acc2fa1a6da9ceeeda4075730884c8dde3bfb3823757df6e6a2233ad15e81b3"], +["Tnq3QiImyWf5CeT86SUfiS7VtaaWvlrPzrX1vnLm3QRQTK0XXLGmQtGthSfQFXMYkSjqGkoc9CypFevUnNVT7OdW2aa7JksAe68mlt6rc9FvGL3992kxJFW17M3GX1FA8mJeLEwViupVRSLUrypxeqrXAx1xq1gbNtnsPHdAsR4TC4eV0bSaBmZz3qIhjRX0xFg8te5NJ", "74ba21e8aedbc37dbe1a2bbb613ffcf923239c2233ed03fbea8439921ef227d219641965207c36b1e7405cc595dea51a2f3b59bddf98a22a7a5c3b66f88a74a9"], +["TNc8qmCEbtWXheV4qohtC9qXe9fo5NknDS4p9TpU1vzrpirHDYp3ANpJFHywg8IpSeRe4kkFf7aEQVGwZjvlfD0uxJ00m2alpde5GPylD2srcqgiAOn2sTKzqevtSCQrZ38601jO32SUcNYybv6Y0QptvoeaJI1gr8tgRWZ6JpLZIO4cUvIh9lcehktfOFw0dqAmmPUBSG", "01bacd36f8e8d7285306ac24f8cbde06ee0fdec5fdca6f182d1c366c99bfe4023354519ee09a000999f4c1c049fb1dce36d66dd83dbb6af264f62329d952c94b"], +["kyY8QyqMZaPb5OuYxGy5sEw3toKr1ZrvOapzZvQJe2esGX7Dbjxfm53F7ibJBPHx5neSHNULG3dyImvZtAdn6lTapkDFAnVO4BaALB55KgOKC7mSJGlLo9gBZulR9lgyJGTMYXA8obyltDz3xw3R97oKJT88OIMNDBIrvR6XiYpYwcnQNqg6MJhOvbR6eERhJp5iAQy6EHJ", "38b9e28a5c9b4d3fee79ddad1f6c096e582a6b2370d56f5e119e55629f2ca2bdf817317376b90a227a3e3deca944b851ccdaadd853989e577fc140c652549e8c"], +["3123mkHfRFEVdIVoF5ZQZK55c9nVD64Q394zzrFHNGfHgZpSQAL5hUzGTJrh9UTcDW3Yb1NXoMCHsRDOcyyKAisyLcbqifietURqbYNKCbiA93Gkx3pCqbzZATK2aq5JaZhgPxdFHoVyKibCx4Hwf9FmmCPT6TJ20uO0UgtKo7a3gpHj1Bpdx0KoOWPYg2DNpHAqg7PPIC41", "845a8ec7e73cce025f83dd5d357e24c1a2b2bf4e4a5c934870fe3bfb2b6541f27747a558a466d2b87faad59dc95643990c656f16081ed5466b5f704a48ae8328"], +["4WnGo4iVMzDF2jWwvtxiru4670KialIEc1miYQ1bZ5g6qvrApl2Grkr5rkCVroYCp4gGc1VhGRRIZZbos8U0PQOoU19lT5UpHiwUaWPPvRLKuAAxEvtRwkrBIFfMrkX631nOl3BR72NuWVBMRW2AOZ0fiMdMGanYNccYa9N6dahOh477gW2LdHCNU79tNwD7jDGnucZl8Lnhl", "1b1f5fd8ddb66dfcfdeda1b0388d27d2ba79f11e9127af59e76178b128c350a195c09a33c2ca966e55fa45ddf5a592b9263be7a72dfd5100e69ff792ef13a992"], +["px4QQfcXj6ySpefbCAECsLG7tOKqHwRuBVqWtJOihuePOEjSDPiAQR4XsrjJKuaB0hs4uNysS9VjUmIZ3vYSfT9PFdeOiywy8qtq2LsafEfoUIEzpjoZbSqr2XGtM5lptSElpQxKy90BaFL2jUf3VycEiNPANPiCl0QAcqmb0zmc4qASEK1IXFXOBvUxZ0knJKolhZEuV4lI7S", "12f57f28dc6a979e2ac335561114bc3a1f23b399bbc26e26e1bc5a3087460fcc2db7aca01d73d84d142b8822920642d3a816e38228d6fb262708afd946708074"], +["8Q7UjgahX5AS7ETFJZf5kuVzLL0Jbb5WBHcUpP7ZGt8Qr47DN6OeAeWR19MRzeIaWh6YVWGngaTAkEf8dbFsSLpgTE4MCgXKZ7mHaFcOYuFZAY9FDiU7I6J2FS0EXlqjP2cHNh4CdCwJbhi73l0D9npSpZEU6E2QcwvszUVoQnXLQjX8nJn6hWrKFqtjG1xIDr3ysmlhWCsZ6yY", "25721d678e9c8081ae8817935ba8bb1e73668799658dc130f133a926aaabcf865e09084e85dce3e7a8f14f098f8f1e21da96a6af8c762c996e7af1e91189c205"], +["pt5SIwbNRhhk8Mu5n13qK0JqTsr3WNF2joRR4jxtTFoNuXTPGOKX4etFXfmgjzRRPhsZEEedOWwvv3pbPamL3YOB6Lrjoc3InhbBGBzt7koFPnGgP6h5CqzQV6x7kZeuq8GnOsqGKkgoA6eX2SSXuVjtOyagdox3G5mn1K7xnKFW8bCny13NelZ26csRkyRy8qDV1SiFsa9lR8fc", "4795d143aa27d9a262707e3ef4c3cf71fb6e0010b6b96b30b0a9e07af0a2ac25078558235e69aea19b04bdc24d47ce7c2410cf12b258e75a5bbc8bfbf2b3f78f"], +["sYYda2wPzfFPD2w3lxcv1zzI67faejqTjGVYUn25Qy2CL0rCTrGGjLByXOzsbCg7ZfmyxdhHgH5Gc4IhtX3LQdGhAZZmmxfvzX1mXYkNs1cGd43PUg2Tx7sDmj04mtqAUpFzzElycKQ92FaDG3NnuS7ww7p4ncDqtCkF4ZpA98OAUE5zcbkLLcsn9iXdguicNajJw0haFbz2eBZ4n", "b0583c1f78e5ba08742f1ecb46a0fa865e35a59780cb42942c91996d5b8caec23feaa11d9e5e3e51f0742c6fb5979971e9efa44163433abb3ba6b0cd8d2f3b12"], +["ewuAaZwUMaj8Ivbxe5HqnvMfUvKOhcLVgiZNtZbrOBZqbfEZyuDMQ3i8kGN1WxiwBcFCJIiQre6R80MkIRX7rXncW161grbP3CmWf02cj7Q9GoipaMLXOjuVZIgjUYzyTWWias2oolzReNGXdrp1xd9BZeyHe7uwuocwkjUmNUTDNCPhdFzusjfQNsdcflwFh4FW4c9FWlZeb4LXwu", "174f03019d2aa80b47fa14c2c1a915e48839a36ab61e1cb4012a13e6d2a2229581cc6efd7efe2e0ac4835128d3469ad0aa3119a13a04ace7042d3eb8fbe50118"], +["MdiL0pWr4X6N1dfcYR4UEOZTPjnd1P7Fq4jD27WId6nDvdQovX31FfmGwPIpn8YUsOOecsjbfv9T0LCiNpMjB8LPlk3UWpU7IcJsuzODJ1c2CHSbqxT50yL2oItlOR8hIkQ6VxZHCxhNrzEf43FSVgp7fs3d2dFDPJmmhJF2DHeNbr1EY4xBxDEAGZkLk71QFP6JlHVxmRQL3RbxOVw", "c3352f71730a39aacb2789b1cf50634407f233a22d9e14cd34733a50fa0dc7effc1cccee8d754777a56f2dc00be65001f79904395ca3897264f415963cfa1800"], +["uIB0h2CebWFiYdZy6HAIzsSALOaUM5bwdj5cUhvuuqCOEUdcP3saDsz1uIKrhXiRVQBUOTooV4uosoTMwoN4G4TzgK8ce9FOKuZgzcpwGgQML5T3KlYHWDcvspICRxshklWolRfcLpTjG6sKV4WdfVyKKxwtoLB2QIzddBnNw0oO4MG7JBhHlVXjl5h5GiCYsVuONbEvfPqeGWvCsCZl", "34c7c4c5519df845298e6c554babbaa662e709cb30292afef84880711381ea9e516ccef8260257f99982586cd52f6d8a361cf47c581375c7e7a9fbbfa00d5ecb"], +["xs02bfRXfWpBI8g1pTemOWmyFmURuLcPJlMxQMzCvEQrw0AZ0fKRs4P0U8DFadB02P5QyR0IziRC9phQZ4dcZ3yzkBhARNkQxf5RzXowMr2DpG3copI1099cfuKZ69RXmB8Oa8P2vIG65Q6K1rWyHiaAn5ZGyIDVeisiSFRH2ORolMvrm4wQP1VhfwSTKHBpK6k9XnYOMGaDcjcwyOgWA", "5d00d78efa69679b748747df668e845f9a63c9dc19ee6f485ff9240b0ce8d0eef00c8af4d688ecfb628d139897aa091ba7756b832bb3932cd411a544d60e2ffa"], +["IWacONh5TUaf9BVRG9MFCxkOWwoznu0sDNZDhXduzu8SLVshsSb7T1JHuc4GR6QhQnL8lw6zuqHwv1FPWoluiwyX3tD76dOtJPFEyNrCCHNvya2mMsntbjY9NRCS7d6beuxvWdlvxl1to4TeVeeB05wmZAbKzZqGcAqOpgGn0rbRt0JaHzKQCzxI2wNX2OXwelRxmhsdlnb0ysSyGy3DRT", "67771fd2c96250c6699f33de03cf8392e013cc7ffc98a7e84a510c08db4ec62fe188601d4dd09d8879fa6d80b1db16f466282a8504ed1e58f435a0595e2dc5c4"], +["Ds9WyWRhD8TCwPZN6qoTIbUywpili0loIMWp32Cy17wcAPud931OwyFtlWQzohTYG0PReai3PFn6t0IW0ywiCmt0DqQcqbALfL6Ybl8B7jQn0CeUbMsAvIr90gvzarJho09Vl7IRibRCY5S0XJxiyPRqBzr9u2NZeGhQZ7raeiDde3E0Yct8bgZ2gycZxlUi8OhUOR8JPvKVV0U6G7A4iGm", "1fa5246b141d16b5ea75f01d5436a1c2f9f5e0836b1d94297ece0d65120562c7f670d4cae21c6c5b5cdb03832c5226744308de4a92d7d3ff4b055c92c77e635a"], +["rEJiOGPbOc7vMXmASgGTdoOMHasRORnJVLzuwNoTEM2qjrcVUUTOAfWQaXCRjATTZfgEL6UHQawM97DcEI6w7HxrXkqOEMxpeVdm98c6rsBSejm9trUs0w437GlXPQuueD3m6YLWRyIFS9eV7FeUBJ5aEYo7uRhtTIGwMCA3fg3GUHpXgxzpb4oSgRHu19qrhsYB6pXakLsQjzYzRQSHoGDG", "5bd9bd761db29b706db1805cd34d08c4ce51174951fbfc746219bd50c40b9fea8922c3c98a292d9cc15c2b81c3993dc6dfaea566b5cb22b7fe267514faf91893"], +["yiackFLREPuus0z22hwhrQA74w4wcWo47YWWgkJbZgii6gMKgGr31O2ZK8OhzQNcYbk5TF5hgze0Qnu6ySu1eeLwFpKf0qNZeOK3ovab00J7CSFRQY47Ze3B1UtOSQzGn5c7pKVER4DP6YzOaRXJGvw61Lp3fZSUbwcA3mDKWfxmQQ8V5qHGRRax2s5PMY8KcHHl7ifoPtykGmXvOKdJJOxye", "c3f26b9f2773b9cc7213d01485bb65a9ec6a5a85e6e7baa59119fd44710915eca7226d6858e99bc0a58f03a4a3fc7b428972842db896be60b7d802efb8f1c4e4"], +["7lfMNSvm3wbTcVUnewHHOByoPK3gFVYugUGv3mfqNG2RJjAkvDSCKceoXPHjQO3OfHRChfTdhMCic39CruXe3T4qguoc49oEzAOAwcc8IiOFtzYBffOlkmdzUJCCs5zwAbas7HF7cCRyjfJhbbbkNqJV2U4kPvXuxPJv3EaWk3iz6rP2KZUiiofneHrEmftSQFPg5pdarpl5Kt2LY0EqMgTyrE", "192648bec60cd01f05abfb6e9c33f61e37e16a2430fa01bc8df4961ba3d476f95fa3d82fadaf6022f59ccafb30ade441a71eea34fdd81b8580b05925aa070178"], +["mj9JWqjo8G8q2OGr4TR8JFTCyp0xpclDwBbMVUxNN5BX5ynicGyvL3DeV3HicXicYM8mMlncVm7Ai6KNOguf2rvSaSKHV0OzPvkuuafhdtKqjwD4GwoTSdEO2sJGv0K9vDEsDfiJO7g1OO2ULnschQ67k842BFxrgj8alQLM5EVAvVCk0pgI0Z0H7qEIldC0wKrXUbBwvi4BscGAycMOBOUWUQ3", "5d072704cf2ae7643c5113ca2c38a1320bf0f26f936a29f70a1aaa1ea32abd49393472c1c2b0a9c98516968a08aac5cac77f948c4ad5d8eaebb851815e886892"], +["oVJzDSz3odEZ0yePlw6amZivyowBqDodnKHP9DdJzxGw5rhkowxZMFHcHrmarMNLyCbLL3dmiRfA1b2CiNVfyj85BiVM32toThBQ0VtUM9fPTQnCT04a3WQiUkyiw9Z3b2SZlc7pkqLMXvzA9uAjDE5RqmVOA9Ff0MdKQBws0r5zRHmi3nCEGU3dyn1JGSzIwiOwBPkSrz6wY2NGxm0LfUqZINkQ", "6ecf031630b08d3f61fbdaef030ddcbb9ab7c854c4b0ac9a37502b0ea0e0d6adffeef560613f39a77d45ce9336772c97924dacd7dfee8494ba9f4bcbc0fda39e"], +["YOmsh9zGzUjiQeyfmWmqwGocGDQTVD0XQrc4oFOpJfJlDoaiAv8HH6hd0hdyw1aUkET5AtOqO5ys4FPvRZJFPR7eij4HfSaQENvhggH271WFOt9FrOaPVQdMrNiZcmzRvAGl9qxMsahfwFuu8tk58nZ3LSfWpOsI32gFQsq4UOxHzNosCT0BgQur1FbHkpHze9JPs1LRHVbVHEqL8G5y6d0thhFeR", "312d35d626401b021b3fed0f0c9243461f89921ec15e6157a856add59b6d9752e66e47699e547d2720d09ea5ae3ed801a614137395c140ff3d9bc6964b98d398"], +["yHOTTYS0kNqpHMGlGJiAJl5rWzaS3DQIeULsIZ49j6JWWC7ObbCwU8WPuLiTDuW1ubn2AsJplWpepmNEQ483owMc13B8lIFjLcvAtx9J5UUp4dqRk8AdV1vhTZEv4i0zWFu2memXwDlx4S0kDIlPpL4589f2Rgmhp8KpiOIc0GDsD7xQCuZyWIocuyD5BGdM9YWY3d1f9vLMVgba4jZNiFLnLTXK9B", "1fa4b9ae5e5e03375b36e9262f32fdbe8a68d0aba58b71285c46854330245886a7c732f1bd71e6b83fce61b1a89bbadc3d1e1ccccad6b1ff870f00e33875d8bf"], +["VS07OuDsgtzTDNntaFN4hOkmQ4spXa4H5WqaaFGZIY61OeBnYhcrp2wjpPDDkLNtReUPpMOr71PA6bTecM6GwWXKsObRJ6j9cMsOH61PyOlgT5djDxOMVmQN1SiayROY0ftvWHha9BVHBwZBdrVDOtGBPhaBlHIBVVRhxh9JewyDUJnVTUtQSnQ2x4e43HyWNWdSrBmok8jlU7T0xTjFKWHKpZ6RQoU", "e7668bc8853f75c1928249930116cafeae8739eb57c30d2e0e42c1f131e219c429ab73f95d7bb4ab7904e9472d7dde16c669336cb45d131b945bae1434ba5016"], +["Wb934EHNh1P9vITT6fbmcXWFFA42pTXu5mgPG0NRJQCGikMUJDrQpdt5HBJY1DUxA13smIb49DszUBI6x3yJi2lVYpM0zWqqXz3PQzpzFzi9l0CPUIuOutCeHp5Bm0nVse9K3CtNjoNIzjTyH4jFDFylFC0SmYtnh7aiqjB2V8BWMqOPbpVcN6Ft2cMqhSnvWg1YWxMR61v5oSWwU69Jtt1Jia828ZQF", "3ab2cc32114ecf1b06de5566a1a74dd6ab4878cd9cabb741e429a505a9034e45e116379802e3034ce5fec26b91a87f6351464be271d40097a295aaa3cfda65f6"], +["rcPclopZPVOXoq5AqfRTJhWr7X21NsMgw5ymM4AkjaejKleZw5R1yeoT3eM3p6sxxHyL9OOqnV9jDoddwuAZnWQTyE48G7hSpgsVAk1VhfUohbeNUIOjkW3xLytjroU1phyyTktzWdOe21kpEp9wSorWyZHieyeZ7fzCENfPrwAPPiV4TQtmUzyxvhlyxlONQL1bUmCPb5pDd0AsGfB15qWbMmxKNHTgo", "a7cfb88916a6c95881e2b12cad5277d7a69000052a71810ae6bb1ceaca8229d9e561ce2d4ba1956296a5acba3dfd04d675ba18145d22b798850175d313831c8e"], +["Ha74CvqQYdKFwtI9RSXkyYZkvVW045Ikh9iTZGhzLWZxfGRSeqeeTDLVqkoHx6Q51stJprjRmwXzNC5HaQnI3PLcCKihTaM4tvqUVGvqsuk0IuUVXA8rCTSLMHLODJEwDKbnxx05eFYchGM3eOnFv8z1nQSEvAAj7kPJfz9xW1DApxIT8fbGqR7VF3oCXkJH1XoL9oX6MH2OUmhf7qc0pcCjdfQ4kmthI6", "b995e6f5650597a2889a259bf2f2687d673a8bac1867e68da86e8b49653f81128232ea05dcbeb1bba869d73d2d83781160b67409c723c2d1532c506086ed96e8"], +["VAid1nElmaKvHH5t9juo5zWIgQ2BPDlJAWUfgWDefM2zLYurDHYIFPNH9RlzjfQwKKEa0AkYicN9pAVc4KX24mR8zKiqhNprB6Dm6Ij21RUxARvbJ9ohQ948TA55xDUQBhWyzKFsphqaCuDc8GhEJeGYBV3hhzZwbFE999p44GvZNak4M3tDhvpJOp5YHu2iEIolm9hNl5u8BoRaeSTEE6jTkhaa8wgnzgO", "d6d70b2ae8d765aedc56c6be5955a56c0314c9bf8c133251f9a4ecbad4d3d362bb3e8a0d102df10adafa7d1b41ce054b07f942684a54b05c48364e44adce934b"], +["KUlnlSRa5CznfvYIDMEzhJx18BsxVdEzd4Mxlea3eJY1KY6yRM1hbCJ5hx8KjXUsSOEA7KVmxCrZpw9alPMmShmhYjVFcxvkPyghjWivc3poVyVJ4ER3MIpQhShXWrkvipYt1wk9XPWa8Me0uSZvPp29k5nXKbYMeCBhmsoWMfQrYZgaDoxmudyNBOno9MEup86qEwFGflLdpHIDC7o5LmvSiT3herXURKp0", "b861e2d47933d2886f31a11cc6d5a2076f46559fcf212db0e0e20a5e19127751b77d100c5783d7681fcb25c4b54dad108fd274c5f1df9d6028f6721a63802a19"], +["YdCX8VWO6kGq5F9ON4B5Kcilx1DdKMLVeXH3OPqHot27HC1UzgYIMpokUKI0SEWdNIYZ0SxMz6jP2Mozv7SofFOIUOHwkOB2O9Be65q4cM7ssPPFCUS9XkktDcRnmoSmNvcqETjFFE9ZPqv9BL5Dr9GOb6wsnC3qOcO1092qFVVmVM6inmRdmu7xmeACpOxqyAjtJsOph9Chr6Y1aL8FTzVNH61nKT2dfTIzz", "b935015c85985f80bb7dd2b880910d84b427b4fbc10bc49eee01a5d2200ed4f591c590e26b0b444e28f048e40e316e0c93d4d853aa869bae47a1da56d97dfb71"], +["0ed8Tve4iERfCxyCkFCVcOtu1QOtzhPBSKfA3otyp9uMxRwhxRjywPjzyXqyg8wQ3cwzpwiJXKxq5pQpe1PVfBYeaXoj7r6UpM2Q2lIqucgSePkHIc0v7lE2de0eaUcvR1y44zcGFbf5OTuTnYpPVjGKgEP5CT64DpshywRvympaEKICxukNFJFfPXLih0eogC3I45WJ2aVo4RvRCgpjhuFZijw1SzoXFWckze", "368a7cf26faab9c2ae4a73944e18652d6b36050248b51dbc8dc6f830bfe5631210310dc5a3502e084b52eec75eed5de1d097e0840c05908010fa5208e06d2b2e"], +["pXBi7sxWU4waLB09eb25Gal3mfaAIpNMOidK8OLTn7lGKaxwbH16e3a5QaHK76IePAr6uVZeM1NMEhPb6y74uzne6YrUoHjuuIcV42HOO15sleHLMC2OjOiODoUjWcPWRHXykpfNYKmJ20VxP7DEtteEA5sGisTovngmQ7HOO5BFI6ez3Hf7XK7ye8gC2swqCJbTsuBQCs94SJFvEYdCVZKHA8OdBdY6kQ96sGn", "23ec4d4cffe94d08d50562345593241a81872884498b6a6b2a592c84f6ea5feba670b6dda0866d0a735175eaad0e76785af91eb91fc2a8d811bd200d26e884b8"], +["ZMK7MHJkUXMzlcNtXRmhFK3t3nBlsv2CfY8xZFkq6gFbPkz83emxoaf4NKGrMAQSBi4f8tQr8fWfH5GBYa5UCnund8ikQQkQVVnRRKv9KP8SDORVmOthvAPIfUpBb4KGim63d0VUvlXlwdaSfmi8cT02d0lJK3n6XaRxYZyXNnzXsoNtIsnDmKMg0TZf3jLcM4gOeJ5NRR4fVEMVB6P8DvvjPEL9ocl2AjPJHi30", "c755e9dc6b1165121a20d11d5a3454d77312af4adc524ca503465150e065c1c7721c10b3feedf707dc03f4e2adbfd7a3bbe56c5741b3cc8e6ec626ac7ec36e18"], +["38HJPMSxBxje4hdBHNBmFfPtmwM043k0ni6yVlNQO2eFQY7Htd1uLvvhIFrVSP3ToJdBhBBcY4CK8qUpwZ7RsskUxVWB9XFzosICKZqULKVvyWVE8Dvy7kfXvd0KloKwRdaHJsu9DINOZ25tdGkquEdJa6tJEm1DcUZkyroEXWb6Li9z5pChGDue5syN6rATTPmg0tBAlQjyzK754ZkzTTTLCIM9VOjnQIxcQ4Qt1", "343cc515b81e90d0ead8d30fc7ff0035e8d3876d717635c755f4e17a714ab67c08b641facddc92003569723ca89602183e2fd168996f90bcf024ec7b13a0a753"], +["aPfU4zts2PLlIykNUTHRaxnj2HZGPjHoidoWANE4VLrDu4VOdCR3oQMZson9CZbJWdTFttskU5rpPJiIVpUtBpc7p5PWpYPZRZ1JOL4gB5jaxTFYIt0LcdXqKQGcK8GYBzHgniNhyGC0vKLzFozPN32qPbR36ws1TstVngF3xsKPDI1z50B77Fn09jcgKGzexl8SxBDTF6h2tbQhkfaPl63DRNCd666svspwYkKPd9", "8e22761530572afbc1bccf03a06cc6b0d0fc8f0f0d5a93af855d835d3d5cbee73dd363d73e5f172c875734441b2817859387ac9f824501e9e26d31b712f982ac"], +["0d7vnGzWjM0unguzrGW7AWWLxwYM5N3wUVzZ46FJoehsQwgXRttzAEEvIE4YCCCoUKqNAyWEw4bBNn0rPAKL82Y6dV8xfhEt7BdXmpP6V14nyALeOCZl5WxEkME3yAD5wJSoVu0ltvfaG8V68jEmUMd7dJJYUySTTw7kk5BEDcVv9dqd2NQ6xbRijwNG78aWXVzvWwzdQikrLsE04355o8aqwTfnt8eHLEJBN1y5pcR", "dd58b86c78f68732f0f6bfff18c55b956c27b64204217f6da6a1a4ea6645d4be1e5571b554c2b5fdbd696e081a0091b21b36d9a5fafef0b4b9828665c192d2b3"], +["BscCwAKZU8EzB9WHOXYi6ZGhVBQSLNNDbvo2WL9dDdvU3mPUu3ju8CU95FbITJ8GJ2kEMCjlgOoP0OYfXpZgagMPOH5nv8Kl1eCz2KG5xwU5N3GY1vcEcBgzIuMh6FxR6OzEEQqXJA7N9byqbwdH75JPf1vs5ZqLMMjLfwn9aRGURnKczzZTyOf6r1MHinOf0Qx7GkHExu8Ae7qce4mE5WzmmBhgrMXSfKjND9ZNJreg", "1e03f667498e4e020ac563c533cc8dbb748993caecb7fb78f265ca15b6a0d0125e81228c510d896c5addba9f6ba00ffa5276972e5f9b8bbecd9ca1a0eb0163a0"], +["cIDsIRIgZZFaGVXTr79FjFf17ADDc5dcnXdfwJ7NkeyCSKlHqB5HF9v21purF0ZJsWNIDbGw6B74Iz5czILckHOvjbddquMfbujajjkceDn22q2xKxq4x6NCOSacgZxRkPIzyiKPPNFRm4MRIwKnfyo4kVVMUhgYjK3dXTCzUsoohRFmFuKRzBV224AMSicifyufAIuX8KfgFCZMlgvjWvzlfdnbYW9D7grey1P1quJCB", "56b740da06d1ff03c7791aaddd09a1845b292c089458383d45011b1667243e8982ca315c49590f042e523db6a7bc34b72accf13123d9b2351221c59eb7ce64d0"], +["0ADRmCxwkxjgqBgejp4MjdrITJVEAUyGhgQTJWSApaOj8N6vuapO5JzLSzNKINCQ5wCkSQTcFM1SdPzfeu31fKLRxdV32zA4iBIKl7Sfr7U9TvRaQIqam6tZr1xsOnrfRSj9O7H6UZAGrNlrM78nAkcowADyoKn16rrJu8dwVLqA3xRo0Ji5UkcQL5cBavsXPA9cPHChsFZOGyQB8JGEqk0YwdERuX27MyQMRfp3LhpVZs", "7e88d1fda3b8c3b788ad27aec21e052504b78197e274cf964feb86cc6e978269121529cb20c687da9c67a28e7aa70bc9311e1bbb8a6eaf2fd87fe70c31861daa"], +["mNnEWJYFFdsilWDiMEbrJzANMStqjpL85M0tRV7CHWxQ3rf9H0d3CVSkx01RVCMVKZGzy6TpG7wvGNsENxceAMiOCxsuEgU8XTg8G83y7QuFxSmCVPBiVInTuLxDeUICBeKQYH8M3GsM1aX4B5HpIuyOTPW1688fHAjFqc2yYZWn8ZqfQK2yaLjBeWy4tjCh0u7EZMrsvEZdvpDnlonE6dAzUsdxvs78HcTGtFbvj6L3HUu", "4456c6334c6fcc090aba4df32a75922578edc023d7cccefdb6ab334946a537790bcb3dab07c03595b45f4208a55093ca255827164da0842e145d8939cac63736"], +["Pq275Kyzt04DnkEnFtgvOoNbAGH7vVHXtiIy47CKHllR4kY14aY24hjsRh0KOk8kWg6btvugGoiuswmYlswHuF0EWGONU7cPdOCmGayljbOFsjoP6L9p718YNoCIKtKN0B5JDBwfZnpFM6GCs8VGpsJTEt412K50jQAxHOWAU8lQTY97hVctTjfpPVoS47yhMv04nUe9nOiGDT07InekTGPz7Or1gLkFPDn25z3HBsBL6P4o", "53fa99780f903a4bc326a6de1298eb1fcaf4e8ceffdb0e3fcbc3a5798ffa818c4cd4008e3fecf141796d313644485df54e5ace1da9b5772d6bf29101a1d3b4a9"], +["jEztrKOR3le3WNGELknkrqdtSfkHn7C71NLqdjVwsDT0SYVF2DBbagisGbkYdigK02xNBnUEESwb5zI9H3iUJypcR3WupXYbJeMZNGqVJVfdD2f6Ya8rj15rd61nMIGnsd3K6Yv1O5QKRJmh9Nwoe9onwEv1YNy8Nj6mvRaBjFZchvpZMNSATMFsFuD4UCBmUS1iBehDvW2YlXqmYETrk97VWngOwA0OHAdgggduDLJOZHTVG", "f9c1983a7d1e5088ed6efa022a8186ebc5c482d20e7907c4fece3c60b5b4b8e20a40c2dfaab0a07764bc6173c8255264825bd57a844436cb754cdbeb7b2bfb07"], +["S8gBIcTlevUcTvOpbpnIeKEQTX84GbXeGNnDDktlEZzpPwji1d1I8WWQvTVDpoezBGF0QYZeNREeFG07ACR2Sr2vXIgrexezlS5OjVJDeEwu0R3AcbbucxLXi1WoY8xJrS5y2xpc5c2B5E8E8ewSQynWSy7ALqo82f4XR3IUUqIoX2UE0XN3EQci7Qug9iFgePoAxmemmSASNgMnQz7xCgHsuWJr08LN8FUYgwwdvqN9IJ91dF", "baf625aa154c14b34d8bad2b6e4b643522e1b29d525dee649f1d32c2576961fdc706f5d2f48a2d139efbf289cfcd3ead2a15101e341e23ab8f217b5ff4469356"], +["wvsDaBgJ5ASHh9HIKSK4TcTBbDyG8Utq7kh1UqC73UIHTaQRolfjW4JtM3me4dZw5UTaQUsEyEVAvpSRhmPur52RBPEZijTakPUXnAvu9QpjToWMPMXo9PzajRddSOleF3zVNYhivOConimDNvGxfY04KSPBU93EULshHlTCBDEPi67ZAFbHC92cofpHjeb7gXL7q3qkKdRr8ytRn53hKY8dtsusNGUKnaYkNDEi4aRP8uNdSfT", "79f0b50bea7599b65ed7a1f4abdffcc0072feadf5a8827f9fae97c223e69deb2251440fd3a6ff6d23e814e70525e3090d807736a82a145017316733745283840"], +["MDWClvD4gpfNhNaq0bTiTaWV5NRe9jGDbXtRXLnQ74MpXt0lwjTMuavnlwUQRr1hpufSetMA74m65VUSfSILmku3Gps73EaKGUjtAAfyapPr3tPJzwxaYfxdtSjaAgxm1fft0vfZHCIncI1Jonx0UAheXJGr3UawlKBb82hPyvXcxL68fLMRXwsuJhZ4Rh3lnFn4EaSibKxiFbTt6oTmkldM2J0jwWH49UkLpTn7AMf1XRIGG4rc", "9cb2c1266aef6380dafdda7857850d9a5f316520932b920453d9f3408b6045c8677f2e7ddd4289b06a5cade6ef3e1e6a164b26bea9b2cfb5f9de41ee0663a0d0"], +["knfHxGhrplbo9apIITGNkRFrh2PQSYLJUtUDClrUW11mafuUNbvpjnMDq26QM7HiT3afGZpDPDANFdCfjFPAEhecCLq2mIFD4Hx7qd6XqK8QBMoUwiMDvW2EdTPaqAnBRgD1XhhfjJODeeN8lV2sA7nL4kGKBulexACKMXkQQy9a2jnQ4h9vtxPeet8KG1dgznLWXW2yECZ2MbdMhWs55Fuiklk2PzN3kukZMQOaeMFnieoTE1X8b", "2cb3a8a0319d67434303d5f57ca02fc1e47f372ec437a72bbf7008b08dfa1e07ec0597138e632123b55dde39bd1cd7df2ff01a6499f3980960b2d09145699b85"], +["Ur3r1SE8xdZ8ZJkaADNAmbcEjSRm6Nyg89qsARkF2ZZ7oRk9dhK7HiBYL2DTbmaXSM6WuXT4CkW7PKGXbmBs6j2A3hMA0WvXqQDgvxjqMmjJA4lkZ1Enlxd2CnWaQDcxx0X1XeP3QAGaHRTtyU19VANa5DujqYuETtegw0J0I8V4dr7UrkdPGKtOhEEIwgAq1FpoUuQirYRijlUJ9tFg1r0wjE8mpbonIr0IUITomacEDUvbnvL781", "ec59dc936911377fc301a0a68741b841bcefbb6cad694b184643476053c367d69b35dc0cbe16d19531648ae72f3f3f2146a9f1d5b7affaa566889ed45431d501"], +["U1e8N8NmLqEZxdWQFP8WS7laKF32S26IvKS3FWM7MiTH1JEruWF1tBt6YMXtR8hYczcjvKVSkvvY2vpG8XbnJYOwcZwFVP8ppDyhfmDDEsuK35Lhn5eBvKEx4TQc6iRO7RQoIqwIUZ0190PqpL2JIMeWMz6BBEf9Z13EpsuRGm41iXEcoh8kzOHs7kJSsSnLpfuJwpdAfarFuUrKNx9rDGD3jtDiR4zIC06TPiDp26rrtGcXZErz135", "e889f41ef2c55fbc3ec693a3256a0e55753739a6b140cab4eaabecb85c0960bd19dfeee3ba33f8e7933ed5ea51300bbfab0e9e4de55f03a27062dc728ddaa488"], +["5TrOUlGcGIhC9HWBUUgzpRcaTQB0fxLAMBM27wex0afOseF7XDtvDZIBNMoL88VBbmAfLhdV1a0wkLrEM0K03yE9KxNijzqF6qXKspaiaWOE4BCBKYbfzGrNm5dSDR31MeIyQTG3jXSUjB5Mqt5AO0xhcSn0HIqVgduw6XG5AHOkzToBARDer6W6uya8NeNrvP6BQQcbG2ZlSW6nInbfqlIDjhUU30QrLTHbrfSAvIlTOqxKU7aIm3h2", "8b881cb8f8aaaaa36b14f9c4f595f17b9a81369a153e0f7304e87d304cee05b3364e987228fafea60912f70f770b60b9b753ffbec946e7b854649974ad3d8cff"], +["EbYPTtZ2fUs1Z16jTR01K7ad6r1mVfKG6vYQwWIrC51UXVn9e0pQSfeHFXO37PxiONL5q84jqOQCdMehIF0rsvrPAGQkP7uG2Ihfjy9D1YSkfvui9S2liYHU7QxjBGmIyVut5bsBPxKaIuaiPYtMl2Ww2Q00qhu6IrochSw62LMFAza0iWPlNYSfK35NJMPGe4RoHZKaBemDt0q6GI7AVxfPN7iLTE3fX88YwMkdpgZ4BV1CvB0ghvbXu", "1fd279a6fa9d988840663d5733ab9d017cebca4b5621c9725c534169364981c5f7efc040b1ae707473a399163f874e21cbf4641892f6de9743b59ccab5a40b40"], +["ePpsJCWP4wTgfPudb4J44fZvHgWmtLfub9ImyX5Lzltkt1jDmgwfguHl2o20cHyh8bRpkKqqyMe55T4pMQawfEEAqCzlHmZvlgLBOJdwUAsSkbmjwQrzKwxYAfunPeRpAA9c3FDcFyrBN7wTms4uXEiVxMF7b2HHpr1ys2Ap47cuhzvWVqdMWXggPcnqjbxhpzWQQYZ4rF0okgiW9qbd3Fduk5TJGtrd2dfuRJzJurtq0SPVxxVXz5jjJg", "e60dbdde1ac77a150817227b5869c2da0d12a4c5b546e63ae2cd7c5131f45b10b38dc6111dbe179111c3e3acefba7033bf3428054b2a9b1e0da928be3d64ca87"], +["lMyjyEQYP91FkJIdkmPMmxvtmjtznScDeLTTsyf8od799fWnhqBjhiEyfexeWn11kurp134WTK51kcOQQ4rBJTVAUuk0V8HlDCbNmIDdHSE21TEjmfELjetsPd8KkrZ2LF4juOSB7UCZgrC7EXQdgRnMxDEJ516FPMmmMXxzeY688OUpqWBpXhr3oHVJ7ij1yVVCeQTmMab5kdJUE4AyOb0HLeRUa432DqOkxWQO5GFFJikDwHz0mcFLUjv", "d404400c62275d4a3e8c9cb639b0805aec2b6d1eb558382234a60e970b95f4f7992f1502feb464cd23f4b05952b875e21d147d4a83f8f85fccefc1e1e6667c4b"], +["Q5Dd1eukoNj5ksP1Qp6VDd2vQJ5EfigvFZCjRgMFRctHL9Dc4SEgwtOtaAa0SsUuiNJRfMnGJMvFg9vw1rrMW1HKCjKonpMKGwQdr1YFZUCCSoJtvEBEsk6hqF3Nf6DAnFjqaR7nPOxn05h8eV0xglgWjM7wBGQbVBtlVHbPAg5wJB4Ph4JrliPeVPY8o0plCe3aNYeWXtE9HXai5OqcyA7PNKa8OoXGAaxBLl5Qjs2PbTftkCf0J1fhyh1x", "c6860b4399896d132a1432c7384904119337993d2d0e2c3a1094c76b713f77a21d1db4bd859fa62ea61996b23dd1bd7e2dcc4aa2c75bcaed102f6d09a4da7418"], +["8FIBwk2mEq1vapFwre4CDPzAFdhvTObyoiJqZiFGqwvFOwFhHA5jMATcK7V8VqBPkgnNoB1UcJqPl2jaXpk17xlaFREPsRYWnqtrtwpYUSjz054wwWx9Svuu8j3o7dqE5tnzx7Jwqj5l2tGAAZKGv1Dj4kk4lBV0OLgVBQpTWiG2ELBSJAOgEdjGPD6FokO3N8B8MAA7KYHSwoxAbd8NpCJtEhv7A7POOeHF6sHb5WGC3HdnWxDi0SfHDK4OQ", "09f661a8437ea6a38e34f654ee718cf8bad4fc476841721ab5deaf81785f52daf1d6c8316c7089a6d121fe32bd04723d6b1e224066196bc082f290ab1e3d564a"], +["lZrYkk9NDp8XFJAwwQO4iWoK510l9Tym4sT6Y7TBH7jMZfH06glyS9Hn05UX89sf3afAcEPuDPWAUf2U6mRw1EqUn1Q3pqUTjH8uF18JR84BMaIfNYLONPZQ8RTRmhKkK5ViosOoN2JCclJrEzv7ubrSImh2alCBpacuIKoGC4nJobEmDaJmhlGhn4n21vFUeJPIcM64um8tHtIkwxsJtZJujORNId47TwSKcIBBKuyts42QAxFzl45bE6LrAN", "5fadb59c064967b5f8e16a7ce0e29e08991d93d77011e2234a4a9003fed0295d021322fab6596077c69088a3c83c92bdf171519339e1c2f1d98b9378ff706b64"], +["wjqDXsVaNGqyBP9IusGO7pVYuB7Kh1oGnPK2RyqZsbOP2yctuHxJ5FvosD0bBJAxTocV2C1kdVjRBRazPQsWbwrWzByzSX0tcarM38ArJI1PReGigaA9eDj3DyXkFcmvfe68QB2gKfRNWqJG4cwIlM9YesCfEOLIe73n0pP2TvS8eEjZD5QqMbQv6M1BBLgh08bPMS8uC1eeMoWeOjt4qlhYdyxXkZiWvNRvRPfuB6vdDA5DKi3eATDuIC5nI7o", "49aff0b66718d7f6f1407caa7d3d52778866ca2823244bdd87d94b27073dca30f20208245671dba19fd878b3310250b04ba1f3f025e0b21ab91f9011ba9e01e7"], +["cib67nF5NcBFUDafQXucFKQFKMURdnWwnSK5D4z9WmMezDtSuls3YBT5tzktdzGs9xfoGhiI0VIK0ZsZK5jdStOLAkXR7yBY6oRyJpVEeRw4o5VWHovOZDPEID7Ewkl5KWgsp9uIAbQ8cqtL8UqsccbmnTdFay2GJtV1rPizeFL2tYnPGBkOihvsfz9ZugCi912BW5L0x8D9cUS5NN6z6csrHiNidlCxxHni2Axgf37kuhoovtARfl85wmIDgtUC", "3f5e679ece63a84ebe1901c8396a04eda3ad32d2d38df7f82d25a75916cca74e96a782460b1dc026ca3e223bbe5fae778cc9c702b1edbb2d7d5a4072ed05d8ad"], +["cfnbOGTORfXfD3DGMOp88lKrcC1QSzrOM5BsfaN6gvbwaVYVBygk0QhohaBMlkE6UaQEOSqOcMIXQlUbItAFT7rY44iH1Hcz8RJ50c08I1ydqG6uWHoc44uLaZody5e8G2VBJg4Tqo7C90fPhJODD6AXN0ptKjDT3jNsyHfPpztQm2jbH9pAVk9XeKMx5STnAcwsVsF4AW786TtPiZbpXiToAtypRXx2jd8x9cJ4Lb7RnKZTV2UkJvRClU7N94bcY", "e0ffb1483b5a7a61b313df51ef14234974cbe3568c2e01664439ce1feb5242d2dd64a4ceff08fd89cf601fb27f25a8890493b593a1f9b1b6e9a96359aa70963f"], +["AIdv9UsOtL0LcOSmF7rL01DwOu4Ztgwdd4TWCVW8hYB42ogJd96H0OcdE6YqlU9HDlz263giUJU6vdSB7N0XEyo3mWXImKiiUvARWrvmx1K6a0zC28EILCxVYGIZZOF0utNw5ZM9pchL9FXpqZ2d0rCadA6SOE4lDQVe7t0eyvMWU17QifzZLmFOT5H53HHOL4Llf5bmClxa6iMTh2p71b2UnCI3vdRgmIk6i1V2Jd6trAXYgbeBOqsrgRdMqomc5Y", "d279a30fdef19ea9c2d032b81fb387892476d48dea6f644f5b7273800390b956c1d4c2f61e1c311359fb7871f32de712aefc92d824349d0978c1870c1e4e991f"], +["lE2w9LJXp4OG3Ap9WXWSeBLvxyPWVxRBUzZ2Y2s8V85162zUkJluIkHErG0WHExW10u81W4ZnDuYdeQJLcRSDELK8VZZxoFeeTrBBUPpuC4wq5tHXR53eyqceIx2MbhNEJoRUNsnZiTPD3YEPCqr1SKCw8Nn14Eq32YuHVOoYWM6wTIJI4Tl6ZFGEyG7njki9frmRIY3YSAqYh0wXHijjiBfVoF9Du2iND2OxeAzGug3c2IddqeyOrzkYIcHfw4p6Ws", "dea948a2557ee81e2082f3ee256297a2bf0681a7ee69d01654223523c6c196eaa16e5ba18181f990fdd932400f1c774a9078f5b182d723a66195764c92812323"], +["JxxOV4JRy5TnF1M4NCnjDg2K0o4fSiNF2Jburlk61ZdBKdpe0S7bNAqD3QZFzauGsblzrUztvp1Q13rzaBvEOFH4lLKyK4WRUTVffZRVt7Xv7QPPxhVsc8Of5sfjNkj9ezDFTfaQAhKyoATmjKqWaU0hM1NyGEtjv3PkRPyVco6tjZtlbG2ssrfMGO7dn1vkmYHT6aaYqi2gjXV8W4Q7qOIgj5Yf42pFqlwd3wC8ErkazrURZqxi7frljphGgIKJ1xKy", "4b877188d817293b573bf06f9f1a89a333d985b63f2e9c8f892b736058a2a46fc728fa1bc1b414381078e0d331a6bd12203a52c7991c0d644a8ec669aca71809"], +["6uUmB5L8sxZVdXpdiOlNWUZLMkuqNKIzlQERafsMm3sUJOoaqESrCCOcvm5hZKRw39qpft6MbnkeZGf3DET4SbZnq65GjznQcchKVDWDNZO4uLyGAy4gX8XrcMEPrVv6RYjoryFverm4pYTHGgn4ZGqP1EkkF146M3v8QMFONHMMcGvR2vULzlaXLLDb8geWd5IkgtaWwrL7HS7tqqSXyriQnF76XE0vDb8AzCsEbotpSlQ23Pdkyeu5r902dHmi8V8Uv", "98880a306071915b7bfb0afbf40d568e716eb1cbc83f4fb39d1c548b4dabee5c571c4c5c98af957d566b2cd4ecd0adf435be72fd9fea1903a9b76a9a775995b7"], +["5hWpuFIjjdFgJB9zp5hE7PoJz8UPQDCbVnQk5HfDYHS7pwafaygAMPbxrFagIefvcjmVoGzAGOp1vPNOsRn5wcGOc3VVOFU8OwhElDVZBPAfLkJEquxHBPcnX721hjQ63GvtX198LdPa9rswNwuZzSQk7jhL4lSr03zyzC2ornAZfHYFPuIZGGeQMGK0HGUwfmpwP86zNvbnxH0dPBQfMCuNGwP60uIojBn5Rb58QovGrnV717ExmjtBVlYCFrzYzZ8kir", "95fef02ac7a3c06d44b9cb1d6935774a7f55955d41c1c14a74f763c9b62a51a36974d4d7be907509aef2e7b9ec35ed5a06fa053e4d491a4ad80cb02944d7ce89"], +["BtW4n00PINIKYDdXc8PjgDVIxBvFNBZ8pDhY46x4Mm2aWEaYiDytmaYw1RnLixeAsgxUJJiIwLzSbDtsucXot7Wf4a4rPBk7vDlC4uP2OWtxDEpEGfRelDYYCxfpJujn0SpJzqVwlrWA5H3VIh1czkqM1wWfPRygNC9iQjIdZMn5szQj6d2T8olFxGunSltEkJCpc9aZmNuvniPqElTvSnsSUWXaN8kSShHtow3qdiqKDlUw4UYtGgND7jg3RWEdwTXV1Y6", "e523dbc0d7000c5565ad562b001e3ca04443d695f798699cf3f2a90aa0e7036718f9f514f14357c6039396cbcfeeb2e13b6274057a962fd648ef404669142be0"], +["7fXYqoqafAYL1VhcBca5lZBV3RejYZPbSY6nYJohPS3zB6Ab5DkjbLlCjEJeBxAr4lFiJWCdcarbYITdRdryYiPrypPS71MJZKbYCtX2cIR1N8p0dsmXWFpNfOhuDHSZVzhjGi5bkexmgd5iG5nhHc0zfeRhTFkahRUF114oev8FXdzDB2LnLZpzV9VX2WlrtbPkfYoGaW5ARyrYdMXVG19Pbf0Y7hDMw4fJEjqFawE8RAQh0XZYUTzR5zYJUO2pT5TlASvi", "b6770879ed25baddc7ca4b134a39b3430b9d6079c51b21575e183f4ba75c941f370f970456b4d9b4ca2fec621b1078f5c9b78a7d1bd0deba20c1ec75e2253c78"], +["sWjXI7Qxqjbd29OKR7MdzJmBIEfS02QaELikUQuE0Qx8d7IxZAhpAZlZkXICqsn6gJ75Rgi7risbZ5uAbX7JR6jHyP3LGOco1CHeESS0kbqcM5Z1vz6SG1pb8LHDgyhjoDeUgEhcDMpNg48dTf0lqR2elYZC8mgJTDJCtxyccSHtcTQ6Da24ZagJm93WV2gP0N61RXFXnBMWylkdlNb3RlQu0FghkCnXBM3Lxw61LvJ8xu4kdJ6VWVvw6k7ZNegtygIAVPCSq", "e6250af67ba11254091b9f0d0370809ceeb319ff166d8fb2a9b4fac9e9f94119a5735dc33c30a33ba1c556dc94ff999da622a0541190babf2079877675e77144"], +["rvn99W8vW0t5Etq8OToIdKjlhSCJhfPCgE9nMmEOn2C4mmodjwWBPl3MSSYk7p1sDYxixSIPM3mZz6AVnAHlOjFbFttxuMiKzxsTu4QuTfKL2PJn0AJBTXYSMQhjgT6Vdo8CARc5YV5BlSwnXeGulnzoiGGk6VUdmjRXSYv4nxOWNO2W5UATUKwGwDRml3kDxg0RsSOe7lUAyZnHLI5tG6WwGgegKJaAQftuLSUshANttASbzyTtpMVtAvHY0q3pIaqR4gjGF1", "f41bf672fe6bf8d7c5509dfb3c3c00698d7594bfbb1857fa94d8512e6dc56809405bc447370fab546b47d6486ff379bdf374bc97dc7aafceeedf33e178a10100"], +["pCFQzkKI4RJossgDCy6Zvk2tJXypPoFlTjYfX9ZpjnQsVgmGmol9ATvVKmCZVvQaWRU7ELHlmxGPbQFHjSiSFuRL958dsKkdL2Zb8IRDYsdN9rS8RNXUCRsGIEagMcyIfu2ud4NPRlILZfi0HSNm2Kzgqc1Y5pIm50lsDCMRpzUf2jOaPSdkQCoMsN0xGsI8QOcTj2CsPqn2CRlguMbpDnyiBv3nJtdCp8pV62JrYugXELuBDKyuJRFwTxxX0cIc0nfdOxBnYtF", "aaccfe07c0a7eeacf79658cd4d5778658613450e15f4b2389f415da93395445dff6ab2621909d4ed6d1bde2e1df4a31e10f3e69b66508c1c4716ecfb69c23ae8"], +["WqInkuJ2KbIuMDQrjYXjKRgwfNvSAKpASXC72UosYpPAGqHhPsf9DSsJG5M3r7Y2RDcaEUBRpdhbUolI8R8iW9PHg7r2htd27EZ9rJm4ujgzJmv6kOl9FVdxGuhQUuU88kPxOZPwL9xtrpP3BHsd5YOcGtIW2sVLTD61jFGEa0RRQqIYCq9koR7EgvZaIrhYoqNyimtlry0Z7udt4W817vRBIEM9LQy2kI6O8vRQ3CCQ60GiCAWGQDXC4tote94Sv5Pg58kQFQOP", "4c173ee4d1795d259ae096e25b2594eb222c33ea80d992a2c5f798ab29a4a309cd70252f3e707da8d03504bc76fe73e893a33fbbcfc779977bc0f6949b0d018f"], +["bRgrFnHYSV8KTpbhDWSdIF5N2bEYhQn6GQAlS9TmA8Nuj9V1Hvk1KFcFaa6WT8alLE5PSdMpw1gtHj1oWZPHFeMGroqX7BM8kFR5BeceIihqoTPZpFzJ9r3wQJp1QDcgBKBqt3wa5RS0GLuiHTZ2p7jJreaZgTazcJDjQeTWQODjNytDkHYPjWm2Fk2OJsPIPErEYh7a4ty5IlHzLn1Bqkx0f4psZt6gHCizk2JGNQhXgLU8yxZ1sHHVAGBKcQRrD44QfxWzFjLCc", "e6130b1c07f10b46c1e2e0aae3cddc9bbe0056f007dcf601b666f1db36067fcbdf0f8adb60c6f1cb91ae7f49ddd17b9ae07b63dbe9755ae929dd640f9b834f0e"], +["3d6Cx0KuRB9bDSBH86IaV05vZ9AwjVmpuLzO95eNH2pKemT1DCeX5dsc5y2wSHF10cxnFkV98eAP7CwCYKiYt4SHojHSJ4TgPwZFriYIglZY2ivxZIuXOoNZ1v1p9Mi7W1wcmZf8MqlPT7KqJiXferUAq4zKuo1BpHZsQuZiFe3j8lBU6F6z15OeRqyy7fq7yPCrHoSyWos7TJEXOav03lHw0Di8z76AGRxxbeNmJ4bKoTOKCsWUXEH8KSxzCVIZVbgQMiVOnmpoCp", "70eff7a35fd66e88e7967d7f6564cdeec1c7ce10a33be6abb70dcf1ed383e8c4ce2723a76d1ea88d4e0a423098addf28147c7fc705dcf4d6f52f0cebac54255c"], +["x0murweWkYxIxK06e1U2pxMnJpY4hGyvrZ1Ja3pQV95g4oYobBDshdYKdZSWJnJvEeTlnpAaUt26n6BqYg8pHfFpc5u2vOAtGGdo3OIGrezvDKMi8jAPs2lDznrbSH4mw0FylV5lbLQkA1qQoGBbe03yxcGF8D66i1hpCV6OPyOL9IJdPcEp66FtcNGNIwEXWMzY27g2TGmTBzwZYTOQs2EpSjU2w41RPE3BeGVwh0lQr2oTvNjE0iv7xfhiJQn6g7su5fe5vgcLk9R", "18b527b4ea4b62e9cf0461a53968bebe2933290599d63e294f3dfb223c82bfa16b0cbda313257756466bf3d4bb52e0d1ab28b23f677444e3ffb67c68a0185a8d"], +["9TFzbHPBYdBLkQnpd844TkhlWBSSXpncQGnTJi1vXO2YKnuYZNO8xxpZb4GWIKHFpoRqHwOHALTm7B2vyc51L7h8VP2DVnUfa0CZNuJ1pcljfl8Mky8uHiNvY4fkdOg0RHmobcnN3uZAW3064fQbrFSaosKDopoTyh4Ox9oSL3bCncTfLCJJAZdza2yZAznmF5xEnQFTar9dCbHmYkd6tz8gZpDpb2WRLfIkLSF9j4T5syPzB6HjVBAkRibuoIebyWceESJmVNx4vExf", "45a7f45010b6a10b9beb80a208bcfd1742448b7e1366e1942e68ea66d595115487bfb0c67ef60e57ca1711cf0ab442beab1cdd895f6b333d2b66c780d4393cb0"], +["ja9JthKTFUMyE50x3xuXDjK9C5KoJId2rsqSWQIsYmZhaF3QMPC5uduBGrORgzNrFT0IxcutMbe9e5ApXOGZ89J2CUuDOOEVOftBrjjCMPecTGizyAWYZuBleCWFq22wyS8bOX0If2TtDhHeyKN5pqFpiBNF4Q6kNXNo1d1EWmMfc6JSNJFecPIAHxxtNMY3cSquszdtO7d4YkbqDbTTJs6iHr8tVbK5UQkuE85uvzNRnlXMUVaBI4gLnrV4sPIrOJ1wKYFKvcegE6wuI", "7eb68cff725c78a8a625b06d0d4de16451fe5e5c0df8a0a15a76289c0d052da223d41f2544289fc4fc4b261f8adb3151d49ac3f8c441b53fed8896dab4cb5c11"], +["fvMEZOgzrELSAXSa4OKLAZ0rzPC14IJ0QJtIw2ycRVCtRA7hjKEes7wNwAS9Qf1Gc9wXjXFquv5LK7qFjDPshp4YfxkEiz0otRQo20coylZdbHMXU1yhfr8n52WLwnyEfFsrpn63rzryxOsLNAR3QwneoXytMejosaCYESyBFr4pkd3yqMmU9hYioxbbLSRn2CLjLIS6ddHo4hOHiMi17CfnOq8YhqjFAWVFl8uQfWcDlEX8ck6JYMtEVarPTGdapErxP2Ojx4EgKNbPq4", "9d374e8fec8a717e072332ba6f41c738868939509821bae97eb906af907c3bc85e929a47d1b540df815244a7c1c9c989f176b2f2d5d66b94681cfbb4d27c1054"], +["JDICAeCW35Kcm1VGf4UHMqNwFsDhHmekC3gQEhpQ93nE1ldF22IwnHTeSvZ9vPrt6rS5X2OMT5yoCWZ7c77tAp327TtSW8jJAofAxUCvM2rVoFMqKc5jgIUM7R0Jzo07Vclwu02v33tJAXbvNRAqdwz1HDV1MrwOYzUuHG668raBVU6vLK3XkOoGA4y5JrhZZTqEbcxplhitIbOKe9U0ix3xGLuMikxosJr1ImXxxUd4wUWOsKoPPjtB6hRtIoFTdtwoXQNfzwm6vuX31Jt", "7ceeb8359e2544bec248fad680f0540ddd1eaca89974e11eebcb7bde39d4669dfed01a9c9243ebd2d585401fe6daaf152bbaef5866c04c0e4cfa26222b6482f3"], +["5BUtWWTaCOTGU4gWtUJnefF5gKc1QbM33wegmWcDDWxQjA7zQPbBNM6IA5mJ4yjsOqqYg8qradIjPUyNpmMF91FRkmJCb8S5mlaG21QFw1BrQAgwPETsJVQdyPZLQl8heEyHRjWwcPPzqBwfVatYM8EnHfNr55ofVmzDfRdf1K8prQtHeiI3HIchji8cOOB9Pi06cmJlWO5frV8K80OAELbkxBkWRbS9cHZfoovrqrWcT3LNS5Mrq2qz5IwodPLaOwdrWkkAyqZs11jK8m4c", "51e53b11b68619482e6013cbafe8c25a795cbdae8f9698ab1271807f798009461f63e688cd66e2e56e8a9bd41d7c0e90cbf7def35e2e2f16ae4c4a01a197430c"], +["5OfgEQm9k1hxUyVXyaa5vWOoIeippSiFaawHaSFtQCmY1tVMa3IXlLaUpADA8HbMArOq9qyRtGyADMBLkmh2tVdGi7WHy6lIbdvskvD70ajzmNsncZbHAhG0KQs1QWT86qd9guayR1gggxsnyrPaiBuHEwSqWSwFPL3Uf7frDJIwYSJqk3Q2Ze01mDtuq3L901joVN5JDuv77zeh8nzjzN0DB8I9A2hRhJIQ1ZLuLrcVwTUTFi3bjhPuxIJA80SxMpbmb3k0xiHpbNh6hhher", "c2d9b409e3d9696f2659dc7c0b05761c3c11a378829c78a3e8bd0d729893dc15ccb06e888742c1076087dc7b5f90fa4a447ff63e1e5ed4887427df4f928f05bb"], +["I1a5gwIB4BzPhjRlY7brY1dONG2SkOqO9pQNEd257AWRanJckx8lei0wbDe1OEOSkO52CmScWriwKVz0q0lyuOk01QmWmB1bI6PquVbdMpVUZVQNuCtlJS4ZNZ2ORkI65sBSgUjqRSDEhMNMOTkVlutb3gGVUfKfcceIOvfSlu2kUaTZ77z7VUfTYAirw39OSGkZx7MmXR3hanVzSmxIMBlzuNeXTgYcaJPKBrh7USWayloUNCj2x4EUbcvvQ6mffJ18hPimCdb25Jo08STdda", "4ebb3d7765629473b46676dbaf70b06c585f440aeacda2cb7fd5c6f26d4553f3099836ec81336488e2967a8fa8c5ee416ed611083131bfb34443796e1c87f8d3"], +["CPs7W0NiAOR30cCj3uRExg5dPg2muI1oYIgFOJCMbYrsbY1rx1vggodrG30Fsyu5W0PLiXAGTMCEkVINPr63pfx8JGNtAopwaEwrW6IF491AyciH9O1OFv1oG8IsfPZaVv3Vfu2m8l9omJVurOlmcD1mxYdmcFolxYWecPI8z41tbHH1rHHBlJmZqRGHm51xooIxp7Ut3qkhoI86TcPilTwLfAB1mbLiM2E2W49Xik4YNW2jZvJr1qNf0j3Nnk7FEMeL3KcEPKEZcDaOPynBTZb", "34bf109ef2fa71d6c10be4d5d8847328a6283b04c9b3efcab36ca12e053ed897d4eeab90b6a07a3bb287493a9915bb324556f01d317ecf33ee0c2484fefb7a2e"], +["BFqFgaEvKSF9rWPQCJ31Xlaaqxc7JZ2KhmJkFeAfHYzYT3X8QzyC547IkCebEs2HhAv3Blt0iu6GDRxFC2p1FgozIQgG1cT6ljoGQ3l8lSiuAstiKUwCzaOmxEYml8tBmhYetqT5URQjIAQlHQKVOTeWZGnaOS9dOZvYb2khPVLxvAHZHigmoevmOpJvRB7Nny09k56PhKd0sAKcGJDmyGh7wz24PUoS5NrSkGMbQjG0Ge7L8KqYYgGyJS6UfYdIPk9UIHgsByPC5cHqkzOvytLZ", "3dcb9a4fc5a5fdd685f34946c9817ca235931d4cca8d575bc5c21e169d4c5784e83558d437ca3a02e3ceccb4aa07b5db5bf91e672ff9936a5768bb68ae2396d1"], +["w90qAFaAVP8WuX3r9jII6i1EEUNa6ma7OwebJOzfFVN3HNCiiNHh9uBJnOftb27mOqz3HZCqEMNiHw7aBskezxKLelN6QOvmhjsSqHQdRnVboTTBruOaHMGi7SqcAIUMc1YGJO8cOksnkKpuZK6wTUe1SNW81Iute6LPW9GV5nGMaIgfLOJJ38UB7ywNto9VihDp2Bxr6vc0A6lzoKLFjegfV7L8fZlBb1KMIPWZTs5gSe5qp2Hcy179WpbWIObbgGqpHYmhsKxUjldwxkkAhfTRi", "cd1ccfd340a317005411c7db36735439242ea4743db7567f6dc42215cfa7db3cd2120f9de9eead48fd2b7b7e4f9bc79557f0abf3639cbfef09195f7668629556"], +["EsrDMPuoF0gKL4iAeDasOD3Uqg5QtuglXAkLj2JXMSmQrKc6nsWXSLrAVSXSavvupkX5pch1ld38TcbQLiyh0ojuC4njJPaQEkvJoYkG7m8y65FNRDgZvh0fosxzk41Q1qPoe5OMaAyJVICv574PRsjWsUlSnudxZy25d8JpZDT2Vh3YvFrGgKqCM6ZqW2ulDsjMIIKCPHaWRB5D40iQEQwGncVDRS0e8wdq5qUn0Tt3k1Q2nQMGttbwoyIop3leXRz7f4qJbhTmndEvg8zvjVZwzv", "867f702b4676a24286f29cd2020acac5342dc16b3099bfda2490df15191d85c4bb51529d9892b943e41ae66170e15bd756dcef1553e6cc541ee32f61d6ca782b"], +["3e3I4SE6D5HQnpi6GZyjKwa3ub0GRWdJTjKRcIdewRV5xN5EexOryoB03vlYisVgbPnyooAaM98OBRJpinTV0P6ENTH4ocQRxo1895GGoim6BGqJbPeP0TWzFcLXdJH6zHonkcaUccibbsSvjblvDL5JPwEzWTy7WiVCo9UEYMvJcggvvz7y5HmxJzlGalQw6a5cFLVEFc1KLM4oDKiCvIbYZYTIFchM5QniWPIhLe6zQaEwlawOPGBjCxhQw5cnglY2GIhwPFIYz7YmSFtA5ys047x", "0047546ccbc6c0ef86909cbcd326d154777abb5c8e755204136d0ad633d1b870d43ea6890cdedba090d64186023cb5bd9c394739d07603dee3f0d69e42714ed7"], +["gmXbbXEHV61KPo15CdxU1kkbZEJO6u0giutO8L0097YAnOeAZupmTJ0DJZskuWX23SI2Hoj0HbFtQA9ja0jQ9eiTpHV0hqKAibiwtFTfqa1ZdxkEUl8WV0QxcZJyxhtBtrQYyl8v4t20n7qg61Ohg4pPNf9cTXMl3p9V6PeFaQpjgiAZQPNORetJfnGldKMUsy5BE3wap1Nms7SnVP5KQSYWrvuKV1wPZZWjJk8VDygsxdKysEn76E0ECYEbRHdtSbgVJgDkcgDBnuWnBnXHbwbCbiAd", "909127c3b1423c5e46b20b148a97e5eaf9410ae2595fc58f92e234c6c3de4ede07ea0a01deab20d7da3d0568f40dd4295040d1b7c89b8b65cd8563e8d00c7bf1"], +["lvTDH7z8SaSWF1uK5jwjtw8dF2spLKbUHj8qVPTqGmKMzkCg8Id3z5fapjJcATp181SwLKJcle3WEgTgfAF8NrxWQI0J49X67hIGEKiYPQsEbcUO5vH2A1Qt6LEI692IqlZVgtYBzNY9V9eXgEq7149bp6gTS1OvyifuHANrcYqtYp5F0hQNZNl5MTM8UXIBL0iLof8nreFZihbVdh9mTsuyet3XYz8K3Li5eTLX4ASW3hfhUC7TWkOKnqXMbSxuWhzhqkFWcTIUSsd5GX1nUZxu6MYQE", "a18cf518d1f6d7c4da0d46ffd80e689fcf603642bbae2cd654692b9a9702cfaf7d69a57c698771ffa7e5f2be8d0f79ac502524993f6709905118d4f50a5fcfc1"], +["QqrL9sin9skWhHAlezJVn7qi4l0OqX5C1mnNxFZRMdqsKl9xXk0Ax54eqTsnakYEGHA4oeAUCr7d1nI7H5O1rCLNbIh0lLa5cdmKJQkCyvorUnw7IVNnGGp68TPvSdlMs8hOl7jBAvmZDy6U6svtwT0RauWlYO9lnv0SoyIQuJ6DQsBjMqzlWVPqclLWEJ8zKbWZxyosfnyfpW4hntpKxP4HELTShEWR9gs7lqt1o60iKaUMMkVB5fm5eYNUTvCS7BBz2xApPSDyiXRLred9SAh1kL0ygd", "c6fde7c0129d0d367349d804bda6419a29df80d92bebe18e76635bfea9a0a65b5405cab4ac327fe374a3a19acb3886aa8fa4291162fe9f94acba9f59f5d5eb7c"], +["bxGDJQDEcqIpm1RS5BHeMWXd3CpieAbA7K7zBqWOTyLIFfY7HgyteY4VhZXbk30F4eJm4J8Tl1VjboR6HDNAB67QuKsxwWsH8BFfTMIjrjQysYjj2sUDvgHplTjgybSlp81daKzEeJt2mOB79xsgWjdkMUsvKXrWZDcWMFkCwIYIQkibKVFqFM723vvYszjMiy8aqpy84G22RoP4eFepdv46YTEnikRWOkdIfXczV7noFr5P4zybDvXCT7heVenIOhvBeoUFSXD8csrkI4vRbxHyAZpDTwt", "6bf454c3a47cb7457488c09a021ddc2dfdc612d2097028b741338f93b20d085b2c279db5a7ce2b988e82116d9ecbd6cc8dfa2d47ffedcfd09fe954362af68b8c"], +["oD2vJNmyd08p8JkJTuSH0OJtomAhY5UVqFUdkHzMzNHAUpyhHpkgchjP9VJ6ZLe66ObHdEXvwGuXN8LgHlqRUlLsRPtaxY7wGILRTWdOTm2x3rLBNBUM4cfLCORHEFzbTgJmze2CGkAZLCA6PpGajIa7OoyfrieJfqy4yVb2u0y0gGOFzU8tFOpaN1Iyc6gbL9ZATMVISeRbRBB39KyP70peFAoHpP91QNBYj2J82lAjifS1W67aV8kgPX39Ch1vD9bEVMWrxLMCwDMzlMcZIVIYSDqvARdQ", "381f068d5dfdfe18fb20831874c0b064b207eb62b2fc7e5ad7320c98a8039c4d3e863d1776e01d260c9f1be428d669876f5a146183c5ff3129226530bafc6cdf"], +["ymQG4yp9pJ9V7qnzN2d76hDtOxgGFsdmKQbj1O5hylP0ZGbJMUMkLURbtykWXx5WH7htOPOjJSPaxMew215YomV1rYYUVre26lUftHD9DprABCHSpe5SSgOt78BWJNJwswM3ePtfbbI7NSJAiugRLtqkh8GOSVWLQBDq0lI2Eu7YPquYgVRdS0ckNn5FD7UHqiJexCuK88velTW173qIOel8gPwQNzESw43lpb7r9nRahbc8g0OojFCNqoAj8VVX5zhAou5SJ9dL2bVEq8rI2ZlRX9aqgo8vn", "c803f84d1679826eef141bdcb9f29ab39c5d009f3cb9d4737365a78a9abe3dcc06f96e41da6d98b96f8c44759f5407dd0dde428df2cebabeae0ddc422e9aef91"], +["znvqRdvbioSyFLZDOTcmMXB4FK9WOsrCQ1t3iXiKFHnesXwXqxlwZhyblo8SWtg9wLLcIinlWOoXnrg8vv3TDOaQ0r2tFyn5podtSedn5tf0ZERFDP8svEMRATaGBHp16cl7OJnGA9az0WdHTx1i9f99HQbpXj6b5fLXwqUidPUDvl11RlTVXWKXVLuDgYxLA4GTpchlsu4PVyQTsDHtD6ax7TuJ4JtF9xmWvYg5ZPfNFFF0mIiuC2GT8n0xehxqFTsdsqA0PZLS2zYbmGaCU0i6rGc9W66R5u", "3a8921ef292723170c32a587510023ecd190fe3f787442e14539fb8e47fcd6924caac67a251e441eea179ba758c879f3113eb23cb138a5a2507e7a4502fd51fb"], +["vXwDUHpadrGl52ppKEPEx8LjgzIvfBIwA0m6kUbgrpnGg3mdvGwztaWcKdsVQNgj9EKuRJgIWCzXs9EJNO3Isp1I0HoRxIzdN994gjuRuMWmG7VoqxNM90kXAKjE5jCOkI1cdUalJjiBwpw4pSxqhljGcDGIaONMFWqxjW9s4mktR2gZUhKQWsnK0zU5Q4xyTriXUOMOgsewKAkL6VrJUHF0OCeX4FvqiaYQju3vT8sbtVXtaxSvj7qjKFsoEWNp0h8N1kVu2V2K2Iy93nftbWa4YdQ0g5P8Luj", "a019a4146cf2ce0093e192f10c792b21c15c2979ca25d2275f16628a562b3515e38fa325d57629ff86f732a0f636e4af91a07d484ef3b3ae9dfc2cf3e05b3a76"], +["QN6iJFODxMqmRSMGHm1O2iijL1uaQcEJhoDXa8h46ANKRCxsgxarKQ3fG6kzMjG0UkcXPlhfmoSbShe06apOCacjsbvGBjej7JGN5teetIyrPDzAlY8KpSZsMUDIvDXhzhyHGttelXKm0pKMVqJIuKSDntkbjB9gpbiuBMDNLddeS67XezhV5oHUB20qSzADoQ5TP3lpW3eYWuKKKa6N2z2tDsqySC4Q2KpqVS0xGSpNU5ZwjDaAk2nT8ugCmVaxgyPTT70vxcBedaLR1CiYd228rSPpjdVPm6Jy", "055b203ee6f8626c458a38a053824a23257b38a299e8abda0e284cbf3c305f6d7a99753b90eab4b8776484347a0bef912da257d26c087a0c3be2bb194ac6b7b9"], +["RAzIXMrdOPFe8p8QFNyxnDKetluVNI7tANrcaG1rpyAoAWnt8qxwkgL4PtvflZT2afDe9Xe7LO49pgLqDOiphsGOtXo9VcMjeOR7pVeznKl74WMOq1SivHAaeqj22L2ZhHkWcb0qrbFAQCblZTbbv4KjhVUtHVRCSfl6wDkbPh5BtXJziwlS0kamTMDRm2MvHpcut7z5ZjofRYfsGOXx7EyB0K2iPvHuwzdkrIfT7BBpRD7urkGykAzvxHQKCMQ725O8877AVjXJkVPUEz5Amhg13AIfgYNP5nPRh", "66bbfb579af56ecfa2634bc6f125fe5729deeeccd44a36a07f8ad37dc579e3da0e3875c4058382ba9636c51f4d236f6e7385b63c588983bf1b0844a172966bde"], +["OblKhP5uKlMdhd5Cu0HFTDZCAEui3fOUeQoeahfR5sn6oR6LZkiMpEcvtXjnmtKGcKGjqnNfdAmFgqoZAaeBh45QSVwUynZT7Er6y9DlRqIurYFb5fNR0KGpnsAVwIMqXQl4PtLUaFyZRfU6CvJrwWP6CPYnIxCYiyeRgleTSUWHGB134OcnB1oARKr8ZmaPSOYD5eK3E7pvi8vvGJ1cp0pOW6D7lQF9MWsHiLx8ELITXLwEuF2HrCmiPvtIMrqd72wVkm7SHa3X22kjPCaT9m5YPyF822rWQ01had", "3e2736286783db9e47c88d0b21e9f2ac5678c1f5061cf82b40e58bd9bf947bdd59346cb187bd67e0ff249664f2124676ac8be805ba37a81ef3c882decbec2a8e"], +["zgm62NSMNeIfGUosDSQXIlATgL0KOsH6EuEb2UZJpn8ubSAcuSZ9qNkpun36bVGXNWnqJ5CLwghBqT22tAVO52VPngqDLG2DwhREmag0Xnxu6t2nSKOodJ14Q8bWr3bLcKN88WkB4se2WwMFQf2R8ZBfQsgGGg8bZ2ONKe6XvselnZyyG9UuKFa7VPmUilcXrg0fSodX5k9Ds06F9glr6ytMuxgxv4nUOrEFvMx5kNKmbCNhTUITTO3XFU0wWbWlIxpV9IdLvSM4OjRwThxM8pRtW1E8ZFIClQVR28V", "98bef39e937cdb3fd977b33f265202d0b306f076b09960658a653c570e9bb72d920128083dc2c8fcbadd07b4c289c1c8ea56fbce776e3cdd53e16e7f225a2874"], +["Z4lXGskkoV8yDdsIKMi8VQk3cxKEieFRJN66yQnUbPWBZJpSStZc83F0g6ZOW9tdnOpz3mRW8W9ri4q1c046MdFLkrfJVMaQ1UcP903Ah7Om3zXla2NWZ82adVNZyGiHqODTEnnbMwuxQHYkU23CLPhOE4eyBQFLVDLyo8bNoommVJMXzql0oqmS6AvAgOjyDwKbvV7yrIvHcC5erFQ5WNYP6ugiznojVEu3sdsYS5ntQHMz7V3dLzVOBaYDwDUqzhGWiKLvyqdKzg6ZP30JmevXwk2j5CW98Nsm8TeL", "48faff1aa0782ba9769e8e366fd176077d9ae7c06cbade231c9e0c8a9bb77b70d118eb3d3a3e705f90a05eb288f96e9e2d5b165a22a7e0987b8c66013d9a6aa2"], +["JDWgUWiropDc52b5bSePWpRU4GNbnXZ0pfRCCMyvsE0MwKqfY8cuGZaDkMDq0CBiBgUl437hzPq3G1AznhYagdn2BHK7bdUmvoeWmSBPbWs07pKTF40MyfD8sx0jEMKjZoVbDaBUkemOZVAyJlX5gNHdIN3SZLJ9MMbPE5fOjTtsAwEdbwSSw47lRMdABpexrnWPxyBVwjqwQwkSsL5B3xNjyAJS0KajJ5uqq1WadLezoaqYTYX437JmJ8tIZz9mgKuKeSpU94SOGgWqQd4TgVk7SHpEfdibQbuUvBU41", "04a212aa14d836b108585b256e32d0128e73809c23c0f6d7f2fec6d294a2fccb3736da823403b755df12ee7078dd1a55b9c4a8ad862dbcbfd771d01ac2ec2a45"], +["UU0T7VMHc7qYECCBXDd1VGX8GlXAeY3IlM8hqCxXIUdp8hFlTjRCEholURQFHqx3vcFwjZ1P7MEIpxxIXS6LB1koUXydHmRuHsLzNdBZdpAnqj8YhLLwAYmaMcljqs1mbTdEPsnzSIWW7F8jc5NTkd7pPQUZYwSLO4pL06y8zWd4DrSTzprw1QplT9FetKUVArO1JyP4RGLIA0MVAjQlG5owbhNLCA3vIwFOITdOF2WzTGRbv9czpJtQQ18DvnXoDXU5IUVHg7IBwnUI1Aiy1qpSWtUuuTE2FQ5yUsYycw", "37f73d56c2d7dcc6f532dcb07400f0be30f9ae304cf80f61c785ea92181336fdbeef1e59abd988ce7d2654c19abb83c9be7bac6bbc216d7b2947e63a9a6aa0a3"], +["86cOP31AUqODbMjrBwqRwdvGVYGRBXwLazshPukwOzos0VJSsSFN3ePaFJkwISLpJJq56jQhcd82DNFiiVkWMAqqz0tbRXqsWvjcrYlnHUbH47eoNVVaigjA3h17NzcDmBji1kebl53hHPzBT83EKpR4efEGtCzJixpE2A2f6eGMXYyuPMpr646yWBgfEuVmOdBxhYrdj9GAgPWMjPo87WJ4z04u1SiIOD4e2WKu9Nud2jIk3QzI503XaE0CuyZEzeKDmDukgGrqeQihM8GBPUrvNBQPx9yyeOs1JQrCreW", "c86cd95c5f9e501b0679e64e3506ea95165a6cb36b1b6cde6751b017af8c2af142c67431f15f65b68ffb7b53943a2cc320b9dbcd20c91b0b3da5f34f26da3bb2"], +["GchwhbiB7G6mqaItuxvxSHGFnJtpEIhGyFYU6YDWoDUEsB072rvRWMfT5vipVr3qbrei6t7WQ3ufMfcu2RALXWGamlK40CY2bJZWbRdASy0PZYhl8AJwfQiWbAOGd2WlCunQbDb3NoVX8PDwxBhtQRhDXxIwsJ84YXa5kY76lRPPNHCpf9CoNr9lAyFJKOiF5SgBDlGA1gJpwfFpQO95xR8yE2Ta6nMc0dsKm9PzHl9UjGLmWbBNCFoQavWfB9QODVejiR7G2CKX4WUzk9Ecub4GKwy5Ozv9kzmz6SInybfs", "67f6b28c51ba36cb5f918b43a7ee186d1d106ef77bb80d29699a6778933ae50e4cdf1a7bd737cca3bfd55791147d4a8bae6c1b297f12a1872def7cefaf7b0388"], +["jRBL5mfPdZCv1DRGkfvBmVyd8u7QlQSAZepg6voi8mDQrybjcerAPCLZLVjGRSd5ICnWVeVarDqhuhishvliVuCEu70T9tVNdb3iEmq8LOfHEApc034XaxZQVF2xlm0m9b48mMaoYhIJn06XPLIL841CMEkBEyPdZHsed770PSTmp8FVlseClZDjw1Vn6KU7IkulatxW3Scyh5MjAZN0oXlymichIYscdtsuKkhwoYPtVNMS0htuN2b0GCTpWllLFcxUODhgILHfQ7vivZbm3JmRv2FotjZEfLOBMlHM8jXOP", "2fb01fe995c675c41259acf6d8b0d4bb9844e9f92186cd1f1274497c2fc4e0f2f6618608c55365bb2046fc64e64899176e03d16ae1835090ec066ffb1c9b3097"], +["yCjbjnrW4s7pyy1F2U6by36Y6dIpL0dpFHozMHkXoNchvhfPB0TEVDAduLxa5vVLGsJiT4nB1z7aXaBgLw0j2UiC4VwOugkUgHZAA4xyb8LCHY1cjOAX6oAwAveWnMalYzYuk2TZGeK2eVtn1ch1Zz5foNKLA9iWswzm2hsMQOuinqb76IYPExEhrCOSQ7PAcRHihEBsNZvDHnfEWBD4dFZAe07xhsbVg86oLA9bZoL3GTUmlJcHDy6h6mfnbbAzaKbPFULaYrVNg5xpa7mv8Q4TiBTAvg26O9l8eRhxUWo9GC", "231991cbb0bfe4dd6afe610a5f5961ee6b2b75d14b7c0abd18de216de6924c4c3c14a16159a910f9705bbd784b942498c41e91f9976fee8d22aa0520b15d7c13"], +["uCDHPgIKuWT940W8xnefNfWWs2njPANra0GoQskDa3kGLTfhhtC63dlZHZ6G8QOK5o6LJWnTTmLE0h5eKaodQ5goLvwbedQMh8hoP2r6BVlt230vdvvw2zOiVI58LKFnu40vr3ZAkZzjFtjUyHPZgkT4ylYuTb6WyMNxLXb86MMAFRNnoxz3DnCPpT65hU2NaEt0AdoNmoktacvYZnDN4IFs3nvbHjkaHLMqIzc0LP4YT8SIDJAm2pUbA7IffS1ROG2BIKxx2dBZXIzGQy5ISTqXSHuFGo73aYKsoz7IGjJICn7", "50f4af62bfbd27630a325277c15616d8f4ce7aeda7148309b2ab2364bc8bbd9a27854a5ada3c1471ac8659b30b2238d36abb68dfc6da541d0ec680092863ec7b"], +["IacnWZHQCXOdaY2AtMg6uhRDGB4lWpgU20uveNlUSQLvaiZxOiNarQizYxY8NsB2odS4RKTnvIV6fSUJgWwdmYCDik7AzORKvMb7Id6ZyTxHgaASnbv1QfUzBRKDa77O8LscoyfdtEy9NSKgI5VFv0BXifGOaouXWnVbWXtpTNEkrwaCponBlWgL3LxCM73zKliywrTLYk99sJbwMCeHK0Ht5USVR8ClC0C9rVr4rYsXZFQ79SPRI99n486S9V24yJ6Gz58ENTEiFIQB9hDKBLZKNeinUF2TcY61ae9ZLOD2Hhdj", "93817c67854bbf01a41eae9c6f7707cb811135ed0cfea9243a443d803d626e4b6cbece8526e7393eca513ec2ddf8b671a0471ab600a63b53f91a36b501e1f916"], +["1OZemKoLmEZpjJ3KOsGbFVArWvOW93KzQycCXwGaLY28KDdWY8MQWSULSKiXwLo9lKybdivnz42hzNWwJflZTVEwGJzrfZ8G7mYXEYLK1dFb7S4aDe839dymD0aPRceroMy1jr2uD97p0iLn7ivQAMEMreS2RoWOufSOzkGvLjikCHQVZDwepDG49hXZZJnPTgHQO08ZLsRrztSSJOAyFl3FTB842Tq0orWruHe9iQRzu162In4s5W5GxtVxqpYT5Kpe8CceZ1NcSkHFIoKaLZfsarxy3VKfeIpuT2nUFUpHDRGRA", "cdcdf131c39ce510f7c47ab4b0aa583802081afca05f67662330ed2b1a772563d2fa86f3ab847f949db85abf6fd2cf9c3c2554ce6dd5a865c425064f71801dc6"], +["Rs4CEDpxjHZ0sel5OnahHVnjdeyPcVdfMPDTyViWUZA1AuQu3u2RA4K24oW5Se6nV6GwQM6UVCcpCgZtCLyEfGa6ufXuc1WZysiIUXy8cUH6H4DOEPUXq9HjnyjljXoa1VH4nvu7OKlfMdIPzr8bMoHL8pkVEiuGGfkpUiYKhROyhLfVCvKbG4NK0orD2ebuQ7q4UdkMMbr3jIqrEqVYwRltstKa1Rf4N2SBVCCP0pe8O8mQPHbNxKZtuxNVlv9xnIZiUFqip3HzMyehRoxxPhtx9zWMby4S7meG1lsjxRdvcBbA0Q", "317daf872dc2e902306683fa5f555ac83c8cab0c2ab1327b22ce1e7b716b31266c215aec04e31106f545fd412d75ac67ef7a8380eab13f90bc967ab81388fbb7"], +["Egqq3wqFhuJgejFmqfPlcDtnTUL4mA6T0PXCnGC0MACW8QDDAkH79mpVXj9ZkFQC89INaq66stz3MFdPC8bUhBdzgLYdZxKaw0C2z0mSW9JtoVUooj58s2VKmkmohBNz4QNkHbdlmE4DmRSLuEhX0RgB2HTXseBclfE6Y2bHzS4Z74g3KUG7wiI4IRg030unNL21uswi0NY1h690y4NT5hJjak8n42IFKk6xV0vVxL1ID3rlgAXg7c2PksHIjinyj5u49RLVApBItYd0j8nY9vsOlHPjoUu0HkPv9VASn17ZIHRcxr1", "6d9e63990817bd190629a7495099c73b0065c72781c81f033ccf7d4891f8087ca13f382a39c5e6fe22b61deebe7926493dddc2c0924c16e1e3e7cb502efee92f"], +["A8eo00MZK7AEfK2oPAyKm3LTgOtpkQcI7rOXi3XeS5C45QsRyUnQryoiJgKkkQySfqKJxYYtE6m676cPV1uJ0p90wLjNNEG3Pyup4DGfMZp1BM6pdtsWjvzg5E8Z2zbdNz0y0eYB7VUxHRVOy4IbLITNUHg8CUOwsYBu9MueQT9YjytS1A6WjRlurkIgAZkXXFbdg2iEgUSWArdeuvrvPyXXB5xkjE6jEHU5AnM9MHlWrthT5EHYHEAzFZ8N3B2BDwLuHT21hXPYXWNYIh77vChaVaIkSNx8iAVj9mHT0KypxwFJoZzx", "e4016a9a793f4a201ed44986cc9b2edef5a57997ce5da1d8919c80c934310ae91d2b6a57093727c695d32ffaa1e0e49fe9b0cdfbd375d3b12d93d59cc8e4408c"], +["en9OI5nxyS7b32DkOsjLYPQJqEWbFiBrmfpDvZ0HXpxkhz4vQU6dIIEcRTeWGIUDYtqUVv9BnbcagnudqsY4K4hOF8NJjIYVRfefvVevoIQOnOi6flaAWS3Xns2EkcBj06Q7qfk6P0n7lwLKyvAWLoK9RSP1ib9uTRaF6HSqacm8s1qShMIoNt8iTeAPPykiYfQZwMLCjkL4v7ryzGhZVytaGiXKt5pP3VnItrsmO0CjDKGwbwDhfUO8jlY6qIAHEdehnAU7rZqTY3zu26iuuZDgZ57BNFu0qoKpriXHzLUiNWrVR14k7", "cd990cdc7c241f2636c7659964fc6f8d02bd48f9266babb2f35c44e6ed5ccc14de5a8bb38f32fb5365d7199ca54e7d9603a8dadf7eaaa0a6882a45e6757734a1"], +["nNLffth78JHPnGzhuzsu4vjKmdOuY0fKrB1Hzc9SpeYjZB1Uf5kfv9fUsDYpUpCdxtZujGQhboDKlrcWgSuUU6O8zoBpK6M8k0FEUphvaXMrYCYrAfHpINJlSSYfqnm57KKC1MqSAq70cLnruSueMNWy4cAlvRmXcOtQjTEQHRGP3mDwqNcGNYTfGfHDcQZxtx4f0re7vQIOSrKpAdYQMqrRl5pHdOmMc0QgkwgzNcQXNL5S2H2XQxVggBc044SuLD0WtLN7B77f673JG8I6UNCNq6MyduHwcN8d84yVEbIeKrq96Tlfw3", "512b6fda4393cb8a6b91c31d326aebc8abea1ee61e607fdd268f3eb248ebc5822e7274c624e4c5b60a63ebd419cfcf41e52d002ae42e928fc363998580ce6546"], +["L9folX3uLK05p0irRvJCowphjlcsoudHMiE4eSpPd6sJM9EB4uHXpyHec8u6nXOLs7a7hCWxQDNJ2XXdC3hBcpYzTamaEKf9EdRJTWwlOrUFFcuCJhRznyZ0NtGbGgasmwrTBhDfYjmyEhNTylC0YHPMH1BC35gy2ftUvnhHNIR328DioD3j3azDkbnSYIckc9WhIEqz1lcoabCfuSzQpQY4jMdkenUEKp9c7zE0qdWuUPEsqbQ6RSKBnlQwshOhGbSyEjuHD1pkmD7EOYEB5vK3tcOQZJAAdfe8XUnuIOhMOqWQfthflS8", "22faa403329b1daac325915acfb57f7cc827bc2edc8c43586ae2cba85523f760b58c1da3931e8e73fe518cc4e504fd595f92ba21a8bdd2560224f2699afd6755"], +["qwyq5A5P65meNDBanJb6CT1UsJApkd9H3ijTFYf23ab1wBV5lemYKOHsylNlFvmMktvMNKL6vSHIs83rW7zXET9Cv5oogEEvV9HWU3Rf25X32wCSagea6WVbudptUhE1GvpapWVOkpUr7dyDdih9q8OxK5d5ZCNmeF6aWvrSTce3Dc7uCwmPywRFFp6T1WuMg31q4jzZnyUrjyl4sl3Y8d43ZkRiP4cZ6RCIi4oUClfOk6rvqu4753O5UNimuXCIznLQKGpsR85SUCVhZDgpHtAepPXZiApeGVufzl6wUDxazyaFxxeLkKxV", "9a9f6be5daba2ea77b58277fe3149897cfe0ef2cc7e0c8a8e70fd0f4982d8d87412421aa78acecb295b5747fcf6dd26456ea7753c0812db0c94fa5f63b9cc1c0"], +["qXfVwyxiVIU8QtMA4GQgF7eH6i5usnZ8tNI9hHXeEh3na5eKopWFSi1aoxZRRfsBz9MHRVi0BGSQbhsO1NXvJtgQ7lmWLIuVu2BKiKIHiSlaud21WmsgrlEsr9nAAGgLfBfGIB8vG4IeAjXzpc4BSGRF7kRAg4WwZJmSKHxCh5RfQaAeW1M7Npv7BrUwA0uoMQBMWgAj7KkvnjaxHmnrjXpVHdnVkUJyWgzcS2ukibmj64amawogZS8OZNL3XG0KCaPiY2BCBvW5j5luzO6cFLG4Rk8F8vPFCEAbYK6fBQcvEsq2nyR74ozV1", "f87b61b983acd3c05518011ecf55785f1c646d79000d95fe4b6bc5649f000b5e4816ac2d15a870de77993f48ff70413616d173eda06ac826be809c05259fbf84"], +["xFAshb6c6euy9J2TAAbJ24WsPbJUkCEHoMb5gsXQMOV03Zlpl7DmiAwzGoZ64tXU2WBb1EToR49211LIA8MVqKNDe9xCOTKr5pvuI8TrhMqmLpZhbZamebXUa5MaA3iApfy4eTrJLHC3jgdhiIoolsYuT2QMjRxknowHAuUSUsuYFDIWnG8aZERpZwgc2z9oaoXbWnQ4O5shVH5J8CIEMCWMbMDUywzBREOhJAW3u5PfuraDd6em6gqztHX71jkuhPQNyLjxeeY2NtV36YeVXlgpKaOSE5SHHtcIsfmBC4aYAHkvCj9zFQPa96", "90679fa4ea532ba0ee99b1afaa7bbbed39e69c412ac6db70b22643f4bf9716f94a55c23e217031235b445d74010cb757e6f2d81874501d934e488500083b5ff8"], +["N3LxToaKA2TlgAy0txRfShbCwxMcoTQIAkpP9zVLCmdpxcBY9I1RD0IcunKDoSjvaT9672PrCSStoMwLCfzTvNb1lGowCqegJaA3KDQOfesKc9KdgmkFt1v04SzHAuWOgyq6MopYvLp9dmaEtT5danmKhDLp8I2FRZdMc2Qdw0kx4ITst6Tdzjfy4QdeOwu8MQj537UNRkGY5KIBnOYHWxUbU4f1pOofdalHfR5WwrfLO1zbqBBPQzbaxTQrzvsEHiWq0GzjLautsONYF9kEWDpqrFyY5jylZgdhM4sHVoVRl7kpEsc8yI2Fwb4", "cd58d385b09b39c3c34e4fe5407c7579fdb98fb503315badc2170bc440289335ab26a9995447d4db385a39db6932f512da0ff21f4d21b18e12ba6ee8ed1be094"], +["NDdThEClCGnZ9GlcGWengY5G0SDa07wiuZLqX73cmlElA5NhT3LJWkbBEWptlCNvGkC42cl81Azi4SOyVcaUr7em77PYtkKmuw1mJq09mdyd2yirkSxOBnDKEoNz98uHpKVFJTHpP25d97F81bpmRl4Rp7hdex1pW4hKINlC5cUsNe9F8ebs1AK2TcytP52x81HCD94GhmNnvKfg48JS7UHcUDd50mXs5Ca1QC4dfLH4lGDvPxmZSOzQsMJz2plx2Xnf6p7A1X0fOqTkq3mmrffZHF7EJHljvmcc2KPPaqwBvgCUHkjY2VQT8QMY", "74d41764ee4ea09f5981c0f256d630d3d444a9f3a55e3986bd636ecf43f147d8a16bd8af2f9fd19b8e22ae0c18831ab909c297133fb11fde075ee33aaeaa93b3"], +["CUrGiJMt0Zgv3FmSYv8PugiSafvDjD1Bfj60GOZvnM4wycLZWH1LYK7bdKGjJurPbwunRHp1ocVd8R6tBpPRLLdY2iyiJWdpB0Hx5J9CNv3UDgCtYBMHS2Barj5FbXJ2yTNMZXa76bsFLR0iEQVPLtJNUtJyYuxY2H0fYfUg6U5mkTbPmiTjayyjNeQOv6FL4DpdFLchWeFr1BkRXdgpOTCrvP8LmpjhjD94DKnSCkbBpAkDX8FdGcSTWDIT73z95CqnVOPSuj22x5pmtNuce101Z5vUdDYvlXK534jfnQ2kshv5YSwLt3dvNOyiL", "c1d187d31f91ba11a0e6a5117360aa242f4f8f251ec5b0a77987b27b9a2b773735a1bbc89cb70eb6905c072071926b8e0102555852f7fb6faae08091e0dff48d"], +["RStmcOjcRjBztdtQgC5T8EZ1G6ZUkcuE6QPZZJhqDAEaC6FO4ViNIp1jX1FToRIhNbB2Ue5y2daWDYwp6cXKpSbOrEnb8H0dd10mI7xKtfbT0zW2BQqBtK9ByR1X56Tf1LZ0sRRgIMUXg6VXIyvrgjYtmI5l8dQXW9GyBLwMwz67taiLWIlmTsgQQ56SR25cLsiNwDNTx261k5prYdwMnLcoEb2n1C0QbAzMpxY3y4xd9bOaom37yKGQlQuYnabO9SdTofTklNGcVWJtjOFNQCJnBH287nKRNQI9xQSbYfpqqlOrJFbSww5QM46XbL", "3449acb9d78f1dc1e8495ea0e74aefe05d39b0d536dbfcf0a2d2ec4cec9842d1d2f645763e6955112e1ffc5741513e3e134c2f713e5065f672f86607e2eb5416"], +["h4S8XoEqqsWzQTIj3vZ9d6kgkBn0Ttd4qQJYU38WTt7iDXxiNiXRSZ3RtkuSCGdx156SH1l8LGpCqiEdb66yIIB7ihKBIvzp4HHitdD9RXdMgmSNsysHkr8jWUD0OWbCuBgA9cYUD1lkouWSAsbiwVwHU0z9Y25S2DStRPOa6zl93X3SeC3M8GGdmeVcOVWQYJ3Tv2x7FVgEQPsySRz4cF5emkgfRScqTCbyUpNXQl1UH6yYpF7TUMZsXlqMbClzKx9Nkpix883JQpTOY9metmHxNrbrGfw1nO7gX6vUeiI29StSOuAmUVrvnex9ocG", "9d498b7ef1ce57f2af89be4d6b870311a2a9755670c99ad138eefe1950859ce2f8acc081df2f8694d9467f07991daacd980ef7848c3aab4435b1c64d932540ed"], +["qnk0BcvfmcAmzewISu5h0csxqH73pVSWd3Qatb5exsmifsvgQeX0irfRVeBmyAQ6hXF2SYYvW8VpgQFWqG4cUilA0S9EMGOtb9BWJDVGACKEQQ6BQ76NRPA2kkHni9VgkdqnrsOKoJXf4phKCOiJiArTrvCCyB2jUYUKW3Kpswxa7Ui7GGVxjAO9ZTV008m77e4XXIzQvLmgqR4NA0wfe7bMwYbSrlqtUOhQHiR6TK1nAMxWDKcgCwoKzv3Km75cKqHVIeBF3NFRV9Ws3K6O0aihEAtWVPsxMD4syQrLCGDUPxK60LwFvZwbkH62z4WV", "f9333042ed6dbbcfeaea719c8d370229c9308a229504a533e8284c00807d86146879e2a7e5ea2a997dc8d1803c5740c8f7e36253008c44c6ec6aa708e7289ff4"], +["aD4IxvxYMPmbJQxPNtVNSdKb9aAPjN8RvL6juiAmXUPEDuapeQy9HSoDazlR3UDgGavW4hQTIxHXUalmTSTOLt2fxGmXqR0Q9VF3pLNlbsCA1qhkJOl62XwtFHrpWQKVnWUXtVRaT2Udl778D5Zy2TBP1EggaY1hUzgLnp5sHvJdy5lrTZNzUU5lLB9nlx4WYgOJHoZcr3AxPiTFsZXeoOWIiONXenOQ4IoPw06k3rBUCHRWfnVDZQzkkxwfYzIcnlYbkrX7Kehfn154Zf1MLnDMzFbzO7VFq2MawZNHovhFCwuECYIv57H7uwazCLBPC", "c361b50e7fbca612b22ad93eed4b79ab6c2b0b8f4cc0465b9c15c40293c454e0766c5446bcb00e16dba4f7e83a67eaa4d18817f7a5c1a2057be40d32de0c6722"], +["6VLvlNhybWGPl7S6naIbm6OsxNjs27oyMV5S09D69zTV5abieOwNIcUk1eTYvFORGavRCiB8oWyXHjLklaQJdr5if3osPzQANxGlHkwhMjrxI8Sv0xplet9XCvR3DOodcJYyWWGalVbzBHwSdbunAFuwSti8a0BoQzjI4pywCMs7fhAdJONgvvtclCvzpyF1XumamGPVWfd8ffsQ14A8d1GRV30VwSe7nvP4ecJTdEciw5XqbvatxXBR1Ryx3ldCae8sIExqJHNuJwLctvfDS4vGbJ9SzKNf8JacZf4epz7Eehfkq2iczBYhvrHZ1EFP7P", "f4e8226cbe34fa314ef48a47adf07104eab693fd580daf46a20a079ede55a759a512eef96bf633ad81f174a98d8dcd174b6fc4018fd016f655a9f75e3c89813e"], +["0VenXnWd6UUCI9gm9cCIIacyuw1tH1LDmQr8harED0nC1VMJg3tR1MoRG3KtO9bCw2ojz6JHIK24TEoNCVBlQfGjtgNmBRNiuWF7210ca9GLXreeYxk96jGnV6uFGtygMwNbdvQi8JXurjxBd66HfAiCKEJ6b5rYFNssIbYl3saKRhvJy9pj7HGXWnlu3yCIXK6smhiZ2ztlT4OrmzvQRG4LNvyWX6A1iYwvxQNrfEtmNj15C4k9D4QvjPbPg8ubsvgDttlag3qA9mPPFwTQwNl0yodUA6NXxbqkb5V9zxlzeACFOjbCwJVKkKw3EZBwtBR", "ba0d4f758d6af5e8bc8cbbe832afa48f9d054da4d8fabc682126e557c0a407bcb6d96c72f7275bc86324e683a47645518d40387225ccc2f0aff7eccaebaa8b25"], +["181E6JG8EplEnKN7FYPtiEludCsv16kLtzjMgExlKukbep66ex2emSzWwjnP5dBx6PgxQ08lSc12TSkBc31AiPvceBFXEfiB1Q0nhbrwk9ZkqLKCowrd0NavigS1Vw32lYldTUDEJAncu4eHQkxhdfSO66vIz6yLpFOV2hybgr6BVucgN0PVVMEYWhNESv5ahikxREiaodv2GneYWT1rqBtpfyhQUBplmJHDXfxCxp96kZQc4ftwQUquV82XGnDIENHf94a9naMH10uuQ98qGREJMsgebnv93yOb77K7XQ2gHH0WzdK076jNpj7ftir5t6V4", "db505dd81135a8b5922879ff55f9ec09b9ee8f86557ddd92cd90853c037eb66d3ed0e60c5411b5cbadb29eb5d11ba8dfb56a3708f4b76c804617158638b3b091"], +["zHUp5s7GSb5LjvD1EOprUDQUggygvUPqVfsdhk6IDmBBYYmAtG8HbJBMotsdGDBvGK7Mzzexe6Add8Sj8bhorQrdfLSNz8C9fagO9yfQxLWYPv1Wum1elwKOyZcPrltDmHsCCMvj7X7C7NK65CEXwDOdgfXczZs3Eh2Hj7J5nU8TsuIkkrw0EXLYOs5mZ7O0VXehaWKNJvH4nOgT8nh6TL3RIWHza4aQI1GN3K7E1yhzIUZ5aH26pJnhjjdUZ7Hjf0jwjzoTqHLBaPPbLQzF8uh19LndugGz4WNlPrVGAsSX8PoZbsL7sv14QWLnthTFCiZFn", "f704daa367b56f8f58b25a0aeddca29104a438eac964722b1e1c77a264f5d2efbfbf4ea861267ef4c1a7b10c9894f0b1d4e3c55bb1bb49edba2dee7b252f39b7"], +["DVMEz5Ph31bbpO8uBTog4YjC0Dp8jmv6nYFVRbzcOjHksjadSPWS1yJ4m4eaj1od8cvH9e8GoUjxsS7CuoiM31XWlGjwTGeJS3tnLjNFeJKIVIqWLjrVVEHQS1Mqr4cRl628jjbPHMbjgrfOf6F9w97oxlGw9crOw62A0IgprnpCCMSL0GUOjWdjlSV9NJzAGlfnO7HwBE5y4ZMKauQsoyLYUxJBbYAgZT2hGsYvZQUh4PxMsZn0gFR2zzI4YwUUrOWPdl5Ent4ttYG5EsSqiOBMwh5POwbyOOfnyI6DjvSIbGgntRBD0IK1JXmLxmyXYgL9Ey", "5e1e1cd3706d56fbeb4c45946235274b688ef748365b38a2702dff8670a6dc9aea6a381b6b477a261326b6b50b259248d3dbf99a442f28946053c576e3738a6f"], +["U9xyX036gWajp3NUourPq4SINN1uSK3JYw1qTUxwa6cvjE055oTEmgDfCjj55HtxOHUeYNzKsWtMszW0EhHXfKD1W4NIsze9NYMxIwJVLoZ5fBh0ojtDQwaqdRcJbAC28UxBk9xfBJYCwHfN3sa6T5jRp37NjrdTAl1NH4Dltk2mf2i1s2SFgSyCXhDCHD9B2Iz4mBAMpmndlY2wPzw3ePYFTQfgnzxz0wDGiCBlFfeyYKGN0M46rsBjaSo2CK72SfTih6V7sjga5irYllaNDUeCTdcC8kCjim9lfOxpDmMgsbKkzgAtve9NiXkrj5T7Ye8ThPo", "5d49a7a9c75a18f46557af98c2578e225d506dd174d8eb24ef0ded49b58443dc9b60042432bef4f01c83cfca4786d7c4bad94803205161b26c45a45b9b4905f0"], +["c63lWIjPUQzcdSzF5pTI0HUYiGGqhUVfNv0PbwcPLvroC1VVZQPdROxGoZNMJvMolCww9Sr4MexIKmndZmo44V5fkMocjJFuW7fOz0VYVXJdsIVVxiueDm8sY8ESrFmXfWxJ9qsrmo1eeIkryCHKfEYkvAeNmQmXjKizfrh2CeDX6hgDg121YocI3e81RmUFAQpGXB6qwe90znY82OXWICngITIjNzLZId7Rw7RF89caKQHhnwvkJJP2eEj0B4XKbTGvA7hUnjAJoZn7aX8oVJJbgyy6iKOkRv5Oh7PMXggmWddOHqTv1JRKpOHx1kpCzvX635qD", "e4771b4e8ec7ff0a7b0441ad48ff9f488d210f193349613404c033bcfc5be1b6058928e624d1eb207f3ceca6e282e6192f11a7c73f947d0e9b8aaf8159b5c84b"], +["n6NYZkCfLdXYG4y54waITT7GRlLtNSzBCi5OnyLdNGJyZ0YjEdhr1H2OnpZIKad904cSC49Isek9JqliGftZOq0Li8GjSHMGfsxyj3b4lZA9afAxC6pFJfolH3ZrpadI6NyjhDZMWVAqSYnJzwCamctsFF8DIr15U7dACrJrMZWVUrrqAmunf9B7ZcAo17NfQ8wPhX5Ic6KQNKwDzQ3gmWfnv0LKQiFBLChJGrrejoq1TY97pbvNqFyZw6gFmilLlQiVvESrBVuhjg8gPHIjfR3rTLcZIaW8prTpZHa5NzQhuXq8tbdHaPSArIRqsvhTPX1T2oVeu", "d92c13614e71e55ff255a768681a3c7b105e518e49ef39f1c1797089c0aa0272b867f71563b8542b296658cff9f0090085966e6f273873bc8ad37e8703f1b992"], +["Xfe4GD3meBzvLohi9aCbUiFVLWwLelVuXXcSYV2GI2dBo1fWSaRcOpb1Qda5xi33Yp1gHEOSDlYiGdXbEmfsy85FHmJSKxrsN2qa6xaK4ctsuWZrYg4IrqTnIfo384PK30zp1xJcyrS6BZLcEQT2qMxbnAnTi26NhmUQNjo78hGpPmJDGPxwDaDamjeMEQ440JfJRiEejbj8O8i4EDAtnYUmo487FktxWxM6InxcBRK3P9pRjw0JTS5menoGkvBkwoUPySSYGkhrZ07MgZrePNPzd2BYfhI3ArHJLwHQfVQLuE7uADtPrwOBT8axthnK8WvBopp3id", "78a70b879b0d079144345692fc26994a6e380da01e0bd4e2d181a4df6bd1bb023ee5b53a966e2e7fa9ff588429e8ec86bcdc13c347b93a9c7469d2856eb80f79"], +["XWChw1HGswxNYNqRuHV2TGvCDOPe9gihTSOjIjhU8gUU9pr4Gr4BYmkBPujHZBrD9g72XVBRziZ6t7iRcMfjthshsux8eokOIJZ8FL6KCHSBXZc5zYSVVKtpL7AEJ69vxSq5KAVMk6XSnM7o6JyoYE6r1Au4ECAlCA0LCUaeJhEN1eG9IwCFU3Z84oGmaWF2RWp5kPSM0glhZrFMFRsHTgrW9P55gIsrKvyl8kXMOXSdkKH2g6zXhyFDTSYlhlllDLwJOVeFw1iF4a7S7ui5a6pbv6eB5NIDkeRaKHWuVzYhSbQBHycJRF8cQEWl4dGMVaieUeQC1Ug", "b15949945b33136307b1705d569f787f0e09e769d38f13fb1bd05b77ee407d1902f4d22a9965cbda7e9fbf381693e36c3d04685ad1aba5a213c5d41d6ffeeace"], +["Ztvgjht9jvqmqkhFewPlH2KFlt2Av1g33Q9107W5MHmMJ77Ef5FfB35hZqeBNm98WCbcj82yoQmEDzJmMUVxdWZ0BW5VMirT47FvioMBPIL6Ee02lOK2J8ft5uOmYqZKjegXqzt13Zb6qPQmCwfbz6OvCbKb69PnOT8eCtvHJYOYqgW1OJS5ulfGqWwrRlJWBSTHBKaHa1vo9NosMPH4g1nHedb0ETZ00Gkolrn4fx1jitgByYITgUC8zM6VX5EMBb5ZVtazzpj6j55xOngpDnLFJt7ch9PgMxIDk65nzSJHO48p9d0EDZw57gAsd0qsKlQGc1McfYzh", "409dc87e910f3a9e930bb45f0a7e39757b90c755874427760d7ddff40e8783a77b0a9d3a7eb7150f9cca8ee6d0f411a936cd1d3899bbe59a35814a321d9a4faf"], +["k3TZ5ypCi7nSFMdV415JYpYzsTlZhhSwwGCFv9LElBNVL35TeF8SOQCxHhGEWrulfGkSpaDOjg4PH5I8k9zUEvcMQlBtkq8OKYrnag4QQITj4qMqgn8g6QqC6YsMfQdKbfbulk0GidsVR6ld11voS6EpSnsIEnH3HM09RpKI3QFnDD1ULuhs9NQryUENFmjwOTJkAjAJFWrgFyc4xnopY1zohZbtzJTNvYDzWjRxSrR07qLgMoDkEexoSgxDVZLbT4JoQTulNgFRqepqz5Ej0FLp7KibIkc2484jL6nylwGGueEItssZZQwz2g8a4qK2qNJ15Kl69i1Tj", "dfed9c6417e123924c3d0b42daaab9849015569e4295cae42f1971ea27c7352188e1b46ce44475825db5a27d1209395b86bd38e97cb1d2776860ad2955194fc3"], +["gXGY0b6MC6ZxLqI1vAyipfrswCE3OgabgCp4sbnwPhslh2B7l7uaw26En0uQmUHhh1U1TjVaPdmAB5oPeR8YQbrjnIZNUIlhMCNjquMITVIPO7n599ePXpfXPnyl8HOTamnItAhemYjWxlz70PpWMs9gol8rnb5J9k0oTCR4W2L2DtK3pbwbaa9UMh02GWMah8v7x3lMQTwCL62OyDX7ftbHzj8hjykgVAMwArgWKnQTBF3gfCU3jAJmRPwBbCOD04o2lhjNzaQ7ELFpty3RdLPNQMskieKd71arGnfmTXnywWNMIpT0cWhaTB8rEW5azL5EW2wxu62ytr", "ac3e4a47bcf4ff0ab2c88e907a2011f49bcbf229cdfbec4a1655d7f025777466bb7e07e193277ba8c8494d0dd574eceb51f6a6149dad0241f62ba879d2ce5810"], +["qV1838QuUJ9cFzkvEPf0XDb5vaHoOriZZFewjbuP3D6ngvEGVMGAttn5iRnvBFZagJQKoYWFbssD0Y3PkqD7EDWoVhUKIbpxNQsT6AOuKv1PDfynd0U7NhdvnlN5INMeNBqM09bTOdpspSR1DblaVtShgz6jnzFjP7uw4wwj2CiddILj95dg94Ee50yAuXoWZGuT5rLq1aQoc5jdI3wFgEHSJj6rvog8OEJQITpsOhrpejTnzSSOzzghXYsBirsNCqfjrqPI9lL7tt26XsFx3scZsSVgAW69yI9OSIKGQCOJrd4GHUijmexpz8rdfoYW0bO06RntUICkz1a", "0cc1d51d3f4f3c6ffce2273a1af654b3a0493f0c7f211e507bc7d1062fdecd1a408ecbef87ee5f4444623838dcbda5e8af64a1804a2650f6e5d6de007f853cc9"], +["VhySt0mtUrUbcsGC8dsQGq4k3iOMV4rvfafqs4hmePEPM9B7kQkGmBmxHdUHcF55mFyBsARzEKf34jL2JjC1DbTu8K2tzFdmtSD3VP6lCSe56F7WUfrgkk9GKPPgjoe2mPXfwRqQa4LL2lMbzUYh8cQVQNzIpUQZTlhg0SZegBcEcmsRqz12Icwtf4LXq1DKZ7dk7pwIBUrjCjFNscXUrynBRVtcLvpAH0G9Ww6nDJIcWpg4BcvNAlzNu558IHgMk4KtWabtR3IzoPkVUyzgMlxDUnetGdkkE1uvSluajTG8fVN41kT5unytjoMSmuPY9Eb50N46KT8cVHMs", "be945367a3b28e4892727ffbfd3907f4b2d2e23a2ba0e138df203d4f7cae20a114ce1a98921dbf1d0eb3958b615e538ed074b94a3655289199c57d5b2a7ff044"], +["1SDKjjz2C5RK3Dt2Cpaoxvpv5Qy6kjk0RFRnFX36wwHp48VwTOimOeOp43KJrD34J2l1xtmNkrxB3DccxdCVPcIg83lg6ZiKf2ov4NfXb4q5KeWI47Vdkg87kPVIbf68GFfybJuTDQGsZaUd1TdqM4KV1aU1In6u6CqA3lL8JKoTwZURDmhYpUyCosVGFE3JgLyQGr7wc69p4Sulz5JUNmRNpLyWYAk59OZlVizibWje1fREhJiPzI6ijS2AjeFXRlBYzQt5lXcOY04G4EvCSc6EiNSUhOPaC6AlSF4QJFR4Xm3dOC5Mn6tQVQ08igaZS1sH3EbxVwiTIVCCS", "67401b84fdc06dc23e275435fa3c5ae55f3c52c86b496040b73d33356d4a8d5ffb5f793ee9e0be068f23f255d6125b8f0ce22283b4db54f99d990fde42b5ea95"], +["hAuc4sSpAnB65f9vcfs91eRvgvNXNX0uyOcGGEt4HwUg17xu6SadiUQquW2gttA2DfrzlO9aca3O0jtrSQT5SdZdrDAYJWWxiXFjgJJ51xt3ogZ2tAMMzhmMkLN45ulYgQWmUXbOUdDFI7aow0KCl9WPdRq4hUO8TDlLY4ilVGklLOHWRuRkmncsMWMHqpI6q7ylDu2Xuxu7NnUPWgMeBhWrAfxgMziBDUPobfEzfNj5HhnRLCOxJ7endFFsUIk9cswaP861S1rhiIAL5YpgdFTOcMWUWnXG7NvVuH4Dl0aCJek4kTU4mHsTsaLiUrlqLbb5CFoJB8gCtLd7rY", "59b24abd4d9d359a8bf1fe31dc1d8b3c99a96e03fcf8eed81fb84922e0cbac6f80958fd83e1e893c765a4b6a35d2921341aba9bd2277eab6eb232dbbe64b225f"], +["6hOmudbxrBIZh0pEpZdOxCCXViuIJ8ju66WDUbbDGjpdDrEbzAGMCpA0sGltmokAOcRycfru9YYmW36QgQc7jCWztJ7BGeNYnBJX5v36S4WfvBgeMrNUlp1wvkmLF3gwLatnM2rbqAPJ38Y1nW3A1FU2WomMBguuMVuuvdrrVTj13mFFH8n6Le2rs9NXTlWDraP26REIGLziWiLaUh9G7klCrEIAI9bAEyDlwdKLvA77tShHbr1S2eK4Y0NVTsCqtrme5pb2ur2bshGwVQgKnJVEFiEWOPqtrbZeq0tIQsP0G95ioJ7ilygZPecIuKKySsAQHIdZbClg7TAWhk1", "e0caa269a890d1c27af08f1a668ee8b29cf70e65ed07128016a8abc70f11b735852749ae359ca01438315488102253188670accb0e149fcb401ea53a2dc08daf"], +["fqnIhgVDutWigHqGvSsrESwf5Z2Ym45Nk3dLva1d9UJM9lB3pGUuPNF93vlyZlVEPYKRCAhap1x9SczkzjmqSYzw6wAkHKMp53rSchMbUTxqwB01m0eA1UaF0jBw1PfEg7dTVnhuRbv9tDhcFZxgHF8SYP8BdwFGomDipX2gq6vU5WOXF3pH6lOjAVbLYWKgAiVOfYKFE0AGt3T6nkWEsaFWE0uN99sXlz6jRQZtZLjZUfKCHwWRr5y1HgLEdGSkcHQssu5hTVKWNfbT7dyEIAwLArTQSdMTkHIxHWp6fSqLALYAvSxwg02CipDjgbDXPWxBaJcg0oEqbGeGhViZ", "149e1cf05dd5756dc78dc411922be33452478f94e26b9d111fb09613253f833bc0cdf72dae5abeeab6b3bad0f81d5a2de448c2310b95c80e1ae991cbac02ae0d"], +["MgPkCIIJduiAhpxJQ5g814Nn8l3CP6cHYpaKvGCs3qzq0SzcVU1gB2YoEzg3racvvH1Ew6pfkClun4Fdk4UvtDV8BYjoWNmEihtU2YqBf8PjTq4Z64jKiy86AeCOSRsrxKQQy597sbv3C3Vl0xWHPxcSemZuBCiAUKGHkavpNeYNkmw5VCYzYs1mgICv3XoPyZHnkVA0SwWYpBs6FlgriHLM6n8cfHqowZDcT3OUfs57xmhVDcr6fRXzqWlj3aRbOB6QHf3Zje46p9bhwpQiDZicFP0dH6hgCuuWduTJFlbCZfqTGIonB2ezuWpdqzoGHHzPeFlCRFd1LPFbsFXSw", "aaf24b8016fa531df0fd9921de54086af95491c7fe654bd8fd01c2528115398f528f443384f31ec576e686286e851d4edd70349fed40cbe5097d4650e0c483a9"], +["MaA1t8mm0QqLN7jpGXCCE6sj2N6Y8E0vfaykdMZ75z8YmHD7PZCZNLTJdB8t3j3yT9zaoOCGHM1kfEMXPf8iYn7bBsemLnsod6rBvLVWCwzFJNep5q8hsN8H5lpkeloehqZK1uXSoRphCYiWvOJLHjdRkPpX3WutXJfHaHBNOaO9HBpLxbdzfxAF3EK8SeYaFmbGUXO7VSu24YFqFZ7tzn9xItDoL5sQ8zRJg0iHV1sLswiwjE7ZCRBIvBmLiP6yZZS5QzTIRMfwJtdvmBjDRlE7IM3COKzql8VRbOZgkLYQf1nzp5tHaDRd2Onlj09Nt5CdF655gNT43XLDyZO8LN", "c6ea4357060be05ba0017b7de591525132b1acd156a1539d871167559ddad1b6f0f1190e7c69ad38c3633e3593f24ef28a4af69e9ec591e2a46acac743a8166e"], +["dCbMfwu0qLLIkDtVmewbTdfOmjjuvPVzR2vRbIhHUee6VfZZceHRAptOKTSmuAAULaS90jeMPm1GZkNslO4hZDBl8JbpfzfARvZUka21x12dAWOxuXcybgbZveVAIdDc7SSj4viAsR3MLnaHKl4enNK0W6uWPqhLYATDLY7t3oY5XoFkqotsZGG1LAlLA0yBH46aTLjgdSytf3XbRhpAeXW33cz2zqh4RH1oyyd8OxSICrB1GLoatU1kBmp697GV7W4puSwEUtMg0evHdgFvqbTebYvgTgxIi8iGzgTY3KBzR8vlrkiR7BR6mg96aIEIDZ4OdBj4mPtkC1i3VptdhtZ", "baf7ccf0941979981e6c4832e3db807d0882167076e0b4a920c12bfb9fbd6dc4ba7f527d2174502a66886b76903b7134e708cb2f641a2d0f8d08ae4e11a0cb75"], +["248FizY6AQgpMEp5m0N2auwnOYrvCGVWihzrWHJijRd9oTFE68dTxBfq5w6T3epqvbPiIbl6M3FaIWjm61HvRNDUPYWfv9tWoJ8MuzgnwEOe2RVE3zo53xvY6vqeXIZqk09lDAA3oJrGTMUFhUYt0d17GXMnEDBGu5OlAIX41qiY6IV73ZriyESVnp6Kdshi1Kbb9jWueFyLfNXrkWluoVs3odcVMWbRaokyfjbnGR1jd9kFRVvainFbXul2sh9jNGJyLGvVMcbLjLBMUTw02VzqGLw5nMupQtSSy3TS92yZweKc8ZiCw3VsI8jtPDqz2cEKY8GigxAPQu222hJWDWpt", "fec57f25860e794cc67287575a8f18e2e7b653550d9d3f5532c2fa1efff158a84ce0b606aeb049eb5d3fe08a885ca554968cecb5c4c3afac5e8390836c997d96"], +["fNAMrxwR0EWxzjlFpFpyyzwIIVLz1VevRTV8Q77c7U9VjtnltseG3RfvS6ys7lc2Hl3BhGP7491VcMn9OZmA0mTtmBMbzOE82KqgquwpbFAhekLb0mFeyvLU9khkBwpG4YOFb4OV8sI7s8TNGcOffd2JkJLsq9T0YKe7OA3yXfiKlaut5fJXP97TIu5gFhHoXyi9kvvFGknUgi7kCMhl3zfsiDXZ9xgTZ6Ds9TNQtDTEgLDfwSVuwMAQlYqovpoJenjJODa5vrdxw8f1kU99j8B5QFwM5E2Nh1aqjlyp3yvQgzL3YCrZPFW4CjCWCl3a4LHljFbXi3RJhYvMD2VAG0V8x", "eee72d71abc6581e440f039feca8b300ecc0d1f6a04822ffdedd94576286f8c3c9fc57b6788362e1d06503dc0401737d922f61cb767791dabc4eaf18ab7bc85e"], +["131XQ2crDDO7eM9XYpjHge2wh8dMb323NRx5xOABEInbE9BjYg5HF4M0aZfhQUY7Ovgdod6uN6XvSpmsN7mV4oQIvqIVroc56KMJlMSyUsFS2znYs2FDsO3MqNnosKcCcYlOeAkHMgOWbo6KHAFXnRNP8pyEE9OWZfhRzbkN421Sgru8QjuQMmM6DTmM3OKH8et8RraKyu5tPb7a8YbjsRl1cJQIGvmKVfSV9dMMlG451YkdkeogRDtdQ4KCe40ecpioHIt4xbk4hUzCCRyDwzGBzBwyeeHwncCe1QyjTfXZXSgihwLxmzxj6b9VVSVu9Y0mhhGyjqq63rBbht2zs80fJD", "909821e2eb24b4f14e820324dfb4dea323abb68df3b210f4ff24cbb362ce591b56776ff197e05d93061488ba4fe9186b9ee9b287bf123b267049b09088107c82"], +["vYRuFlSx95EbsXqMPSyOl8zpsrygllq0wOTejcf4fL12olIZEUHgDcoObMGCmmPftRwJ1Biyi24kWPXI4g4DQZArj6T4ASQn4RXxjhihPLxctc1Ns3C4Jwlr7xjgQw46UeGRAiFxnpjesJj78XkqG4CmVuIn4TYVr6Nc4s5pjRsNrd042X54pgAAZJyzaFs42iG14AxfLY0WWK0PPVoZFFqXKJfJZeQW4JjI6RrcDxT3KPEGrJWkWHR1AwqoRV6YFtVXgXQ8zx7ZFqaiHg5dcjb3qgSDfXE1dTx2doQGkByCyl8PBviAuld73zm70S1jfAfqSkZpTd1B1MHj7ChJqAFuC3r", "a31579a3d043a67353c09fcdad729a9b708eef82f72ba4d4045d86ffc72e8ec94e43ed3e0b6e1dbdf8c8c02356682916b46099dbb98179019c664adc1bdacb83"], +["CnUjVIgkUq5zz1sUWB5lGAjdKpBvtoGcuVipDHnLpbn4eLXXNZrvfDDPQhYESwF4bHDgWwVktHu2NRSfxjccsPvj81KpaLuxCMmbf4J0k1BHSzJLCOmoL8blD9IRSojSoN61O6Z2maZ02QpnM1gZ8S1Ch4qJ850EoQo1RFU53kiiGG7QuDjcgyuqd5MmTcUDScBygIyQQW6FbGfB9kJnhnFgtI5CyAkq4fuGx7S0QEdtkHxVK3TdrtPopicyP9pKtQhZy1t7OW6oAc8BuSDlDNXYfv3nJXLz3tPcS5KceKer2NQMuBXCTt9rraoogydxIYCImq9Yb2yRakPkdi85jbJIUlvG", "86e155c231e80fd16467e4f9e11af84c76f70ffc9ef13d0613bc53820a55cc18818e1337447ea979c33f09d1f892a1c53fce5ebb135565da081c99cb6c2075fb"], +["KhYP6xdjBbVuvwo7HDoBarebVuJkrU0gTIGz6uaCcoue0LsG3I3XKsTbRwOPWcSmCMkGi0GBX0T3rULRnDOmeINKSSRuMjbtBrxjpO4MKLAhyUQAa5ixUzrOhIvYuI4Gh5C4DZgSukaIiGDr32DqJjkvLjIEzC2JXltJHSwo988WQiyuwGCLeqT0EhYb5hOIT2nluTQPwO0yXC5KEvIt0eZVpEnxTPkL5BX7sYIZCp30SEAsvb7rLCMTXIktpldZIQNArba4IJ5WG7olSTbpbYUu0RHALgRTQBsZ7NykJK0DKk5EBexuNMIBX3v3PidqhxKJdtbxKNK1u9kwuqYzMy7kD8SXn", "da20c8d90403fc41b47c9ffe1b8ca8f3ddee2e5f6ee494576f66a48fdd5b73e1ff8c0f566f395b3feb0c251139eb9c51f714c8691cb06ba443b9f3274a813148"], +["NsitrkEqCYMmgA9Nl8dAjeo0Ojj6k0COQVcvuhHyGyR1VMIusfxDKTxVIKtwuqli9bwhgqsnN70YTSnvN8XyfUmllUjjn9chb8lDU46FRUtxRbBqdY09seytjUxS3ckPTpA7dZeV278kjFzMfcDtFDFaRgDx5aWi6Il2Gsss3mdUEJXn2VhNwZgpDFtyNDHnQ1FQiovjO8liUBYzPoqxWpysLjh0Prhcpn8zuxoDNU1COSNdhaDJ40xNseuvwiZthPxE0X8ElEgzDxsel8FlsbjqyXOka4iNC0uRIalcNw7aGeI1CQkVWtY5cfPPJJqJXgPlFart3LPkn6YOIo309YnDeRv3pF", "a91b7b57716ef717e780a40c73ddddaf122d2bd14158c84a68495a61c856459bbad1dd650fd20471e38a43ca2f03e82887b766d3819c3e1b3757ee860aeaad74"], +["67PFQ3CJ8Tn8SrIyVIuwUPQvbk7r6QkeQntvP5HXGsBO7fo1PcNkNdSIYFpTfjT04AOAWUOsQqgsVDWQ268gL677GlXzH2I87UgmvQqTuBHQvA3NOjw2E2bA0WhFFuec5KHVCly3yAgQDkRQDTV8TXn7I8QlqCRMhMzRC8ETnR7JVncSJlg3UbhnRpJGY6JuopI5Yp4UxI0lnwAzk88oNF5OMGdgXUfTRJbb5koiN5Z7ZAl6OQKfgeuV72KRANVNDtcLw1yddj3VfGlAgFJDmYKGQJN8ioGXuY9R9AgX95MLcV9cP48w5I11gsvP4HYyjok87MFYNmTVFAKUCgu05DAM026AIHs", "bb3e6fe8972c24ce8641c7e4ca8641ea3845b3dae7fc058327b21c17bbee443f2466c71c7703d90492f9e6959c8c2edadcb3fd3e2e3bce10ef788c0181b8af10"], +["7wf6i3U6dKRUDj7T0sgFBDoVj3qkw9anUG97NH2tfah70zLo5nMdLKsYmZ0Srwr0uIawYNycE5uHcFEDV9bTgXbJcuCR1HnR2NKU5cnxblFV1Teg2nJ9FGydG6N8tnZqWAtbUhnQzm7OcAEx3HiyBwzYXMWRwNCJ0JmrLViE57f3awGDbVAOlfj3hN031hBqA4cFGGHGJlRScWCANJ951u3Jn7sZKBUOHBNfoiKznHQJHX3NkmYOqwo83OildGjcbIgrsQ8bE9MJ9QuBQ0miA2hBPKfQJwKINqh1AaQyIkrk4vAE5ipNsFKGlq9yiLWeazkQMosnDL22J6R67xBFOjbP1dgNOpNM", "04c0a42c0ea5511e0ce37001a146d6c4ad55337680afca94f856124a70e4e91ffba6e05ab7321996f540388dc7914dde901d6bde7d279292537f34bcc470344a"], +["xqk0Q7TslyDp1qnwZyjTbRv1SZ29rUuVVXCVgEeDIgtIDgd4tm0sAMPQjITmdy6ZbPvvre5x2bun9VICpf0KFmhayIJc59sxgUVtLPYwkZrxLyyL7yR63FvW3riETCKSEzmAM7IG9ubm1bc7YgSqkvjt1FOXBRHmYoBRaob6A7p8oOPQbVRKR6FXLuZphhSHuxUwD1BSEUTfXBT18Fk1Qlm32Zp4shGfuzMzC3v7bqtrmGGqQkdJg87x2q86C8RhtDUb5yDbvuAUivKv3LhbzyuZEedMVCMmfy6uPG2JbKGTT9HN72c7Bg9ptBRUbFnDJ7eVgwAKQEnvJ3yaLluUZpid8qDvRin8l", "3c8fabe0e16c56e4a69308a57f46d181e6b5a09071c6e49f482835a775f18204b4a2777bd92030371af770c8a1c011226cd5e2a59cfd0aded1a17e8425e0fec7"], +["qQ5V8XzPT2f2KnA5EHvCAPcxKvLy2jw1oMwy1VsHlvqrkv9zxIue9uqsqVx0O484wx3xFPt7udstywJozBRTuYh4tBISRw3EVQD4Tr4FJazNWRc8xSaHCYiUfzw1FgHfvwvhqMbOID89RFMx1a9gPLJ9cTIK1Gyg4D0S9M7F1QvsEfsYW8lsTMo2UTBmCA82PJYnFfTFPSVzizwXgfaetKtJ7PE5y8MDgIykeDAOZCPKk5QJHJebO7OQr6Vowy0xw1K1iuW6r1ej0TiRkzNB5xJjdXCHEK28z37mXAfMSkkLVIt5zdO4VetRo1XemfdGusFU7mEPtgHEyI9buxJRQ3saJsMCXmYJ7H", "ab3f729cfea0741b310d6a4ce6d98265b3e87b85873105baaf67d7fc86da42897897cfe4736bd45124b5d1d6dbc9bf674bbe36a3ed563ab302292f248f9d9d4a"], +["NMELHVFWycblQg43jxyyx9DgwSei0JPfzErEP4bAROgLjQDMSH60O2tBwJDSztFfrXomroOYVd2LDRnYuwF92rLsk3dtmq20f88HtABAQvsysX8YRkZKhms4lhhzFPqEpgs99YFVQHGSnFeDUXUbKRny1NsxGEmkd2mmwFUk6sY9djzJZef2sUhZlgbJlAuH7cU81HJCI9y9Ax0vBbMENzRYMXEDWkOzAYis7rGb5VdYt70hEBwhXFKBB5KugMAM6iXvKUC8uCkCtuDnO6FaHNHpt8ggWiWK0PLvb9Ujjql0SAbLukpo7ytCrDkGeVaEzCxxgPUwQJK4LyXTd4iqIaGFEhSxd8RKXof", "e0009caf307f73bf26866957176956d2a2129c070465bc45190813844e55bc91d4bcd75a02506eb8a07961a0f887ffcf762302b76fe62b88e7eac2ea3dee8d4e"], +["Qlfi3EWn1BDAkWihyhAH66EQeo3FEC4xfKK9JuO9spCu7NttnuWlSE7zPIc3LCPHIld1sRJTlMbZKY39IwbqDR63K7b312tOuA2mEZw1dNj8XPiapYCW3x1hkgkzHjRQjjEeHwZBvne0nNokIS9uzu0UNQEZtityjHpLIQjLWGb95ghpUGCR3QFrNzgLlMX64TcebqV5vLiiwIPP3M5cEDdrWJKocom9ohhx8l7x9jPk5Zyxp0p2Trfp2Ya5VKErhAzTtc53Srvwelo7TzK49jwD32aiHbO4jtpwuPd9GsTjCBj0vIEk2qb9VJcIl1ktSrB4SyoRjHfxvPjeWgdh00Uzptayeppzjagf", "035ae9ec0773d77a98edd79edc5b00f1cf8a8530f61b00141dbff17ad9406bdb62abbb3108f4f5bd15f4549763af57ad137ffb756fa42f4ce0afdef0fdabe351"], +["rMaEd2czLc8Gd4tUmUTKaR67HNv5hx3CSwofeNHxOmXYzHMgplneF2kl6rBuVm57LDWHc5TgyMILww9jNbMfX0IOrnx7Hp5jDYrVLAW3EEioxQnffjcqybMsp6DrYjZFk8amIHnZPHgLqQe1nyWiygxW0bKYxPt7dP8UEnsuNw52TAcXNrBLG39NFRkPYbE8JGCNnTdTEEsmUDrJKNeJEhnctKNowyweBOtFehv4EodxnkpB8ZVF5HmfX099Tqsu0t2ObcZPBjd2R93wMF54Pp3gPVqbumfn451SSnyOBInDZ3sHc3BF2Syjsv1h7AGglZw0K1TDMHVJ53anVI9qlpjQApzfWqk0455Ce", "718c45024b0d51fb3d8cade5789a0f65c82d5f5d4d54c54a7bdd74b3c21c7c02f3a6e4cfb883c79102916edb0259743c665b620645a55e223d714215825b07ca"], +["n6n7KiXnWjEkArXfZ7Fd2W5mMMZ34QxCUGit81uf6XZtzKGmVg492aj1FH7X2OKq1orsZEjpivwxjMVjuK06e0LbmWgwMUvv3Xhz8D9IMMRvXNS5dWGjscWTvltNWEvikWPjwX9KwiwvobzOiPuYPcqFLHxlvMpYevxBYsOamWtK6x1nlsLSpDy1xMPrjocJ5Zy5cXnbWS3OAiTSWsTvZ2e7va4LosFAgXNyRqIQHcRlajKGmv2nYFwUgQY4ROggBalpksvCpMwS8c4c15LVe8MFfxnSslTEHMHOrpqmn82Xr93DT75r4TfdsRVuCaTtJlWx73y4VrCZkMYu1Mvi2ViSDpYhbS0GzacYUH", "13034ab152b98cd7cffb259c59d32b815800d11d030a2622d858df9640f2dc142b98e11962524c68e8f1c62e19b92926ddd99623f0d29201544750b4aaede4b4"], +["DftTxKw1n8wuqn33hv2THTepo7AmDI4B6IlmbAB64aZi5ujcr4Om1M5K515Q6DlForFyHf1lAriDR3XS5wuwvY7B10ZPX1yBP8ljYzRBOBusFfQyU9BDfZmCt5eMIeDn7RtqHJ6A3eThnpbo9GzUrSNLWIIVOSjuxi1VFNMEjnwnKtt3Cl4Ow8sl7Z9c18xEdwGY1DT6QmSMIk68VK0DptyN6lVvFpUMsgDtdyOWCrx8HY7L2afFtjm3RuhRKdjnqypuy1u1CBdjp9YnEFlCI7ppJE42BA5hi5mFi0JnZeieXBjfLzoG8sUjdfy282quTadfKmd5D8bV9rJRCRel4JBmMvL6uBScYvnswLX", "9fe9da8b4c0ae08bfa202c5a05285cab6863d91bf63753639d02a969eeb5a2f605e3156412bf2c0daad21d07a0047108df00a38c777f89b76c10cb64f7e8c27f"], +["MklbxjTWYjSq8Z3adDajFrxr4kzXpXi59uWtQeZ9fcagETptYEYlonTa1Rlcdbt4jk94bTLReSQWLzFkS3J6HSp6CQd4eqQsNNI5aCPyWqQDupCjFS5v3aOClQ7UnUErI7qo1298F6uCi5mB1MAWM5YKtnsdyRUSSh293H6n0Ls18zzGYnkMlQStDQ9zpCZlYpzeDNwXDAK4pRUWddGeMWYDlobBbA25P5RHJXNuxExuySrQaY15JkypZG4yXe0qtjjpilOUfTOnYxkkX9ybGw3ITO6aslSeZB531SDUSBR6sVRRFkAlTkomcn8ijCXVJHIzXBZEO6QsouyzeSgTh431xQJCJxT67ZvqWgq1", "4ecf1a8803c58183bd75b13914bd43d5c63115f0db1625943317cd454f40948f08b198f18cf327bb9e05ceba0b70af319efa9863aa18a5e25871ab3eaa0f49c2"], +["vFuUvyUni16CaLE3q3LGh3YgkaH1l6W6F3qnoTAEER0x3yWkzviLB5tupSPjdwZUhlxF5HkLlFGfW41WeFkrgtYfYKDiGZ2o9Sm4FBCq0siQok5qAYAktAon7AiFFVsioy1t3wWKd5BP3MPXl3n6ECrqSf68Gmfpt0gkUMT4wAaULxxJn7nJ5NbMZH4kOl5B2ccJZCQ9qRtDwUGhUOaJ4vrewjsF7xRKKrRAo6eHqEBQmfNcHKhCP7KhfzdT7qQOwiFLAonLvtAQN3a0SMt0lsaJSODAbGtSYsWlfntpawnWj5Lo7B9TgwK7DqWSxPO4wZgN4DRUGU7aBaF3Vw2edluXva459Xbg2chZSJQk2", "ae6c04df6709428849883862d795a1ca6fe2390cb2d79318f09bd8d0e09456139a3dd231d88fecbff259b27ae1b19a04e42ee0fefb00f8dddd44f29b5de9613b"], +["cOi6khqVnlnLBeDcGdufs1r9YNaNpnfPwNHT21u5LzjybdJEMEwjuxteCi1isTRhvXq1UsMRLErQkCI1lDEVzpicXeUWYQi1J8z0aM4pRBPQH1HzYADqtUASYvEAt7c0fFMFCHZKNvTMcaIPtZzPfFxgWTjU8lp80lED5gjSwWSulaYXoJkF1fb6vU6Od4loqMaK3atlqsUN6EDRktNMZKbcNUDaM72uafm0gHSxX0xQBWiNWW7AoCLkJ8qPhmR9VAt6XiAOcNcTVbhk9JDmMXOFwCnaPMR6n4EJbhSjHLvuhVhew0jhRD79qjoiLT5uJZ5J319v96BZmFskG0myXvpXh6027UyMlTdloKJxqH", "0bf21ce6b84d656844fd70933e37fa0f1331e9c7a49fba9c8ea8b379b42cdd88c00661d652e8783803b7638ab4a9ab2966cda68200c504ed7e7f0c0d090f2dca"], +["y0bedsbbApDC0oWJXKJTHPqUW4TGDewNzCqEIjn6KH6ubAuXxTFyA92v86sYEfOyM2uKyBt1lbCH4gS5kN8JBLL4OiOx9EhoHZexneyyQn0AnlUgwMVPXDWYIzYLVXNsdzmPwecJPrLBr5WgBshq8iBliAwAoin1q60AnKpfY8ce6s66RFwteqqI4Ktducw5wb7sgPKjAus7OaHkVAK6qXBGte19LzTYxNyoEX0QdJuvksTrLITzPIIoxuYnMFBkvbqsnTz92RUD5ypwlte0QIxymHodlv3VXLzjJS0JBrGvzW4rcBQyS1G7r3CSQsVK6vW5ciyvUsG9SYbuCQ4zEUCiyZbHc37eTuWpCRzYCj5", "274963fbe8a58698c34183e8f0bb850587b8ce30dbedc24807481d5c3d8fd43fe83cb416355bca87bafe2c63e3384da20652d5ddc670cd402a2f9caadfd2831a"], +["R9UBADrQWf1cWCb3xT2cBVlsiPNYx316xGiHq32HQcHHOZpCvfMXfsimMpD5dcqVl6jWrU1TxgALEiUuCOClbpL25i8UorGBcOnlbW1oPer9xIpq6g5i0Zzwvzde5I00AATp4oqVaKVBSPFawFYZB6HALXgbZd325GcpaHpkKUkCDdO1cgwnMJWyGt3ixcwu2DSRrkYMmzpUihfTBBoJphxf0IfxQBkh2DUL4TEQEVw3obmUObmcWmS2RpnOKgvnz09hfxVggQ87zBoL3nT9LjsrUsuuckv1S08ueq2zjDFfmI6sv78JVbA0ijpwqKII7giHYqwqyDGyauKN4FHJXs0gtVg8t0T3sNAgrVLlSPPm", "494034aff341131feeb2ab82a083067a84fa52e97602ecff9601919da81c42e5d8f3c3da2ee95c061023293d3ffb36d017c0c2dde94a626ed048ff0d443e4368"], +["u8Hw2i1JMEs9Zd7zYTklgeouZFPQ2zmtoi0f8PjLiK1kJKGvmAJFGvlpTXRjcIbRA3yhwZwPsdtoIlG81KL07ScjSOBTZ5W67ViGgbEfwFHze1488X2ELmiwq5psDFXZqcEBaBFWAH24X8crK2di7XISToDxU5C7ZsDvBB7GrClgztZjglqW6HjN3FtFinjpX0K2WgQRz8v1C0M7LFeEiJIBgUC3F34DyI2MXYbpwJ16MxoFWwZJA6TbKHl4gH3BpekaMOFMGN0uLvLOubxRYBpiAFBZL7Gx8Gy9Mnrkt3zS2XZaZfPBkIiJlw7LtjHKAXxVUkd1HQciAZpqQ8RmPhIc3Jq1iAO6r07gR1YrgMcDF", "d0937d62782237999dec1d436307b19952fab3acf8ec3560fe6a5285636bfa2dfd97849cd11d03ffd45970879b47966b764957c1770e6f8eea9f592437722b47"], +["m7AbwhkEXREQ18dedYrUPP3ahUE2HKhMrXrWRMGWKO3xo8D5oCZprePhfzNE9zBH6jv4XuiV4Y2PiVmqGLYhjpTBVYPy3LgGw2Eu2hGY5KyxBe7vRCpVEekFlvIlVwWs5YdCxTo5ncba06dGMBbdetJ4pmActd2K6zqotshSqIepJEiMrLEe6GyrVeQs0QfF0LVkikQD7prl01SOx6paAU73aC9ibMiN7IMamnHbMEipL8YNdn8TMMqOMG623GJq6KtAG24urwuAxz12XjT9I1Mb4OtEPTwDBBdqJGs9O5RrSCiSnaxJwnbRXxmlALqsLDyCLG6gy6Gd8HWIlBFDc3vDV1gGaolgL3ZoE2gDQKGqx0", "d43e33ec5f5068f50ae8629eb2e94377092dfe05acbb5c3df5e3544066b0b668567a79fa4f79418b61f6ee493b5862afa90cdb63f3838492de667d19c8435827"], +["quvpUqtvQ7L8w0xlNGObWBJ6kV43hilxGQBv6EUdxH7y4Cichbpx91rOOYb4muW9E1Fh892Bd96xnKwJi49Nt0FxHnxjZBmgat68j2W4y0KA8Ih823ZcbAbZYMEeeOF4KxyqaozqjDKHDtUaIVnAvNRl4JfhqAtvGBRq7M2Ew3j5N9LMxbm952VjGX2r4YqYyUwVjyDqhKTsTg1oW2ZMKangIiOU2WgAeQkuKnlokkCcm2u3ZUsoVcaLdoAyLRj1vL6iHIlljv6LXcfyeXKw9CHnWyEJe88EWX2S3qMR2cEk89HMq1Q3XeRumBp8oXmayf7qjfmd4p0zgepvLOuVbCTWJwtQCN8s3vwJL2yhEIs66Y1", "efc5e13153f0687117049991fdf7dae87c433f11f4c6732406ecd8923b15850c88471339acadf0c1cdbc2b0cbbcb939fd09ae4475860611f798cf6cf5c8dfa09"], +["AdNuZ3K0iYjvX2mPL9mZhf9EOv2qsqyS1cMt6wcH7sfgNS8jr2GvXcaYpM5uLrcixNaQjnr1cxlhhXfpZShGaUZZrcZbAEgnOOyh0xZ9n1RLFZkzpkG9onAkF06iy8fw5bgsvab3tN7IriWaD354UpVpsv9WPubG2VMNQHVXvqTj5EOggZcwAytHPgxrFDmVdvDTGysVMgQLchaVNNv725K5cFjvvOxfMsQFvbIt7vgrSYl0yrRy65bhyiWVMrxkfEZtU0AnTd1hV5hYeCzqPjipPqV9KSA1z29SxLZpLDodP8IQgaXZErK7HWUqgKW355vkpqSHJQ1DwN931LD4mgZ3XvskaDH62k5FJrtJG2LblbGG", "eed00e4fe72df54cfae1fe911a4d62d1de194f88004a5b6228b8b3235ccaedbf11965c53af3433823690fa574f5b8da8b24abe4cd061cc581dca1ca8e583e95d"], +["DoBqehFHl5fNMf0iiOybPiG0oeFsGRSEi9OPz0FWRoC9bdzy8b5n7K9TJpOZbN4XMv9dkkH9C0e9LWT3JKvUW5eoezDFgMOTGPep1sQeTaSD6zRq7DDXl6tnXDUMsYUNzbmLvub23hd6tuey23HNUF6CflvOPql8LQMbx6o3LwLK7kj1waYFjV2ZMM0ZIFkpJlxoA5HLrtAvb0ZdzPstbsVe2G0BJvBnCoYPg7xcRSy4lqo9J3dAT1ZdF7bGwjLoRe11Rf0QUP1I5b9bPe34SCtPOG5igdsJLpIDiKqUI1HVwDoe6NsGY6aokcZo4GKvdNkgxDOYClACDUa4LBOWbFtTF0FoCrejUsO84Gdt22Xx96Cw7", "e42ce834df7144e9afeb216cb073da640e8973e4dade0fa0b5ee0626e619491e242b40f818a176ad3077877a0e5483e111bc54768b4008c6762ff6760049470b"], +["6PLRAWsXVFmmv8S93AKCheDHwf6xXFSKadcRfelCNxkllJLRiEdNIAmj9atZFccTFi1C4EWbRV0jiEWv7es6kcKa8HplgJZgpsX2oWEmacHpVJSyhGxLE7DAZKdbuQuczPXEVydemzNWHxbeS1OsKbYJQuyEzGBhtOyIgm9bgIGs8LBvnjq8BPCGi4ImzhSIAKkGaHiwSYGd3wBg2VpO2Sp0boyqcZBD0Y8Jbqn1Sfqc4cZwpAOVWZa6dNUw4VVYcsF5qaMDDQkNyElRcAkZ6u0XPNuesdM65PbyxXciDhH7T9Wbm430TmyKs2RAyi0Y1ldO7ErOIu1WFFOJsimwEGycxFE9grtIEUKUyMrxu99aDYHrfh", "4ce98a243535048a29c7c8b817dd27ada29cd1edf65381e74f21155dfef56cfb29e818ba340611c47dec8184e7926fcf65d2119751565dd74a8f2f0821b42d5d"], +["RozsHAezXRHuIjH55rsOYsbAjFDtURSHyTC9QxRyL77rDqeoZXtifpLIGACBEbwWJapnWAJFVQjzVO9pjoOK8riMvtICjVml69Wnyvmnm6rGsStk9MoLV1z8SJpx9VAEHgL0LmbJeWGeScCaTnC2MP8j7z5IBdK0RdX2GjPLaXzovR4On9z84HcfDq0mdG9MUdzhpqaALI7ZnDPjgqkJOPAsuwji5mWdxz2oYeTdVG9P6FF3q1Tva7I3YgNBS95MPs4fxZ3j68n4bHGGOBTFYLTmzoY2AjzLI7YqRBIJfKNlbMLGFb8l0672VAgYhjv6syxaIiiPfQUbETjWq4JEHUOUKOsROf4f97T2BH1BXV4BsYbbJKs", "5745e06687e9a36be6e72cb509ce6c73667c182eec50218958e6a497e4545fa58f72ce529dfbe4f7eb27b8056e025ff496be4059e5e907852d3dfd5eec7ad1f6"], +["QTZ9Qx7QvzQDvCdetWtiYbSRn5ylrzvTJvO2q8Ik9j8AykNKdimGpgaYoJat4vFDd22LbbIJlyj5AQpgRPl3E4nKVLHdNgcXtWZouZ9gul2pisYhq7LGtaVCHtZQeW3HliRWvrWsbYC2iZ9JSLaKVCNsBJNKhKyWOlADSB6gfqUu0ea2FrV7b66uXh8PR6uBvzxLtm5jAuyiMGnCdTvNkvyROgbq2IBamzaSp3E8JGxnxjsWOdLHzYDuilatRQKagj3P8VLII1LTGgptFpamZlAKMn8rGhZt2fFq6ExJEz3W1sHv1wPqycbja42qSmBnRWQO21NeWdC3OroDVTznpe9SjS2pgqjWD8bqYoQf6GeW5Hqq51fy", "962751c9cf29ac8b86e9f63f2333d83227200537acef63c74e9171f984ab42ce070950c7b95d25042abd2ab1b8d1a0ccaa6888274d2651579d520646b5d31206"], +["y0CcQTCWexxEBmE8jTg43cpBRUp8bjKNjWNpuMz8BfO7ix3C280626BwcpFoJEBtVByUEPJsBMTeF7DbU2IkITpMj6vAm53kQemuFFcQD9i7OQGZ9QmK1pOncpKlGAUI0bOUxVQ4Noox4EwBynfORaIBYp7cCEIu3BgzxLqXqZdllsM5TzXI2mOdt6AktghCCiWm9n598AdbPl3JNzlY8cMdWfHeVAhJPmoRcfsCmvINa8K1IPgA50NOFvknETyPqSJX9gG0nuPQAKPZUja7Unmo6u8c26VyqgurTtiqHHRzZvbobVuXV5MtUbCASQa3x978lW0veYAmHspA8J7QVWJuyl6ty5btxQsNKdE61IOUNjPoSJOOd", "b527a3496ba3af947ce713de3e3fe2e3f56f328e1dc5eff17f7549861a979a2c30259d0518209577e70436410a4304570d8a18992a7d76c958105d222b54da02"], +["YrVqwXeBWZwrLLZcyxOPpyo7opaCkuSu96uP6pzCzPCP1C5hoeoVGaFQWAQa72F2g07T5R0JmhMPM2U0Vg8mVaP9yIliybq9mnXGRyBPBNYASnbBM9xKOc87jhhL4GkDGjQU1jcBBl9Lm69NnBGKMivnd08VhWVmk3ohBMq7SBxPF81mv9q147vYejNrOPS7j4tGVxpnJjBpjCBsDzkfZ1kCBKmHYnL3FHuFRWxIlfQyWK3YEaU2rIsnONJc3qFpqGmmKM9VNvVpqX2x6IdVxdkgqMlX0mcrm0PYlKMMEP4I3gUnqI3FwKc07FxOHExzNFeoEf5Op6vaISSFbAvBTclXMKt2sIgNXjeG8id6KVicNrCtXGBLLr", "a4b7657af84b1007f3ab404da2832a950f93973a26f2187366973745b8e4571e6d8a7d981dd32707b0974307ec065a655e1cce878ec268959f8740971b64086a"], +["80q23fa5SYiZZDBzLgSgmWtjTnTh2TVOSHwp3z1r02gniE314t8LrDJTfkGxeAgmRViWAU1T0R1Ta2F1dBLHEMbQq6RSyeSvqtEPIHHl3HWly7pXuv8VCMrf1DqqPNmsubVq7NrguJUFpKYU0Cyh3SXiFzSuRAdqs8EdMqWLiSbVPnwZyxTAkQwZSY9DMw9PT3kZ59BBHLiDGlBUyqOinVBkdMDLcSHrdDNA3sUfdARiDCZ12nmw0KdrIsYKo6VxXvjKFLo5Z6tN5aYecXzYXVPBKuaszdCqKJ5m3eFwnwCC82FXSw6ASLUb87dUJYO4wSaD6bQs0eakjXNxuw9uUtsf2hhdNQUVBNRk1d6TdBb6ogDJ3hZkYGA", "e741e72769ba358674a34a6fc4c13620a9766a89d91bdceed48723295c1fa2041bb180d1e665a398ce81749310d528a2838aaddbaf49cd76c24ec65e07092bd5"], +["SxKA6cNN1DCqkaHYDtWzEHo3zKNrQOqA2UlJLRh4eBvAeAvFxPw84qsITyFAdqx2gDiCN3FzKPSFmsFSNpoIbTWIX65et6mT34rOywExRKEP0ZA60q6CGitWssyGyh2yWFHEwddIyoHtDBWcQI4RZjvSqQFXyhHeQg9jjYu5wsTmniQv3Zjdv8eifZDuTVMd7rX3IyL5PdboGOQeh46GXadUjUOjUn9GzKu3QdwTZM2cjKfhrv0na6Guilds1ue6UC3IUKRiD4lcbil6u3V6zEhN8qVpIwmxzmDNLOHPR9p1N7wmVQx4krh3mh3JV7Cj4F6MgrWeC9vIDwy0TjMlKx9pxRYNXsYRvmfw2ZQPuzqPeIjfA3A90qFO", "b29c840f58a55ea02ecbeda0bc0d9de6bd84c663a47605afa58bb89ba2587c53a8bbfb3e5d2a9d26f2f07a6b4c89af7437330b4820d18c235845f092b6585aef"], +["fHzQRmwnPqBG9nixxpfhh9XkSUiZUklOA9jzdxxGEJ9P35KxFruAXuH21xtl1VQKJ6j7kn1JqkJEoUzdujHvJSbR8geCooYX8Nq05xQPDYfKrI0hNvm8QJaCLz5N7kB03KpxhmCPtdoVKQGqmwpNyWZNPMpAnaEYnLWfJ9DU9PjR5zlyKX0pHUM05H2kDKbDOnaUMFDIlyRyt16U5a3RTqFTDCUQXbZKK9TcBaE54o04SsTpd3aoDHYL1e72fVDg7kmmlPX6rz6LwgdQTBBPq9SvCodi5W8TaQbKpPqhkzUc65k0vnEUjvJCxW7GHmyCw6Zl9TJWDtNbB7Ky0hNq5tXNAmqQ9yvp0znT7rJ85AMhSjDJ31vK5TukO", "e0d7ac2f42f9cabac7381ee9be11c401f02acebb8d229ae4430bec417e95e57664a2557621dfcd7b2b454c71066ee66c3be198fb12c112ca59509671c9b2ad17"], +["AztKi7oIsXcizsMjCf2MSnofSj4PqWsDWEvqrzlJkj4Ow69X0B0yKEn48N0FlOH3YZdJ9KFsvT4UYCiFSZDE1Wfyd0lsmTEo6H5vth5ItvdLMrmEzH5uXz5fNKHDEhB3hmHgoH89x0fmwWIkxfmW7rqW3dI9JLhxq9exHv9oYcsnJxcBDyNfqkdjfscdFupWAM6QiVze9p7Dia5moVVOaukaT10y3cjtI4bUKZix4H2uy0ppmwnamPfEtreGYBW2IRiLxhI6SUGBq1P1P4Lxrz5d2MiaJNCnxXsNhZDl3g6GrUXnnx3L9wYF45zmKZAbG5WuGeEwRg7YXUZDawwdYtxklYGmzkhagbXIdl6niflkYp7x04xeVDTojK", "dc3f9ed5c0e34aacf7c7d42245fff482ed9c9ef414f3aa01e30b8d3ff3bf74d3eb7f4fee248cdd107e9ff591d34490b36a3ef3366ccdaf3a1c459e01fb03cc14"], +["Zi4kb8VSXok2VpQ7DDgbGDrcbWq62BirCMgjSJEO4rxvZVPfuEGbm9nzZysv83SGsy91OjOkjyJw0tRbE4jVkaCtl8vcPIR3MsebadPcd6uH0FDTSqi4KEi6k0PFyXimKVMOYWv0OS1rIh27mfLv8cJnOwI3cAbp0reiykNAowxrEK9A4gHQOJwdLITMOq5ZsaoH1D8Daega6KuhgQzec64RBXewrnJI1d1Qs170Tg4GEAWk5PMyrgE2vTZbu5Bgv8LEHtzSR2HsIHAbTSd2JTgtJUfBBmaqUrDhU9qkfZHwXSiqkL30UfeXslg3ud5ub0duhGyuMMYjwYbt3W2euSiLWJUDEQocdqyfuPgFYYhZN7T9NFaW6gtHzZP", "7c993da3680bff222fb993a6dd7a9c21ff15b242224fc788f19ca6f58248a1bbc30c69876a686693945eb7ec97b6115c3a0552ae70c82812c2066aab0e6bdad9"], +["Ohmy8pWSL9iRxneVlGv6NHDhdMFKVQIVD9OSh1Bj9q3M4F1mh9Afy8vdPkgQGHW0zNjI8bX8u7zbyrZx6hVIOtKx0HhIkCxgZPrcgbjymhAf87Y8fUGcISLd5ZmdVoKlFFOzz7FJhmHB6mjo1PeFKSncrVNwekCCUHArJvus8GV48qLPK7zwVSZmgQqANk0eMO39TmfVUouvIZdl2cFVDJVKLouuP0jv6o2POAZUXMVkhjlJD4ED2QtD1cPk58BUyFzLEPGph3wuvXTfWvzsskdmjcuX8mnSmyfZ1EQNP9MM7GHQ0VS0i39NnugTaJKSEdAAZkVkyXrBToXcTKdxcOtIke88PDzeV9buHaoORgBtZxPMZwjip8v5otZI", "db4ec7b3650cacfbddd5b5d3c68ab6da707ceb0290e644e5a195d26752c834171911609e35011eeceafed89592600dfa5bd812f055fb1185cf0f41a365b6ffcb"], +["QEe3CBKGwD6Ptwcc8TbF2nL1njvSEIyWJYT58Zv4mc7PBxfcdEmck33H438duRZGoEw57IHrAcOQSMb1et6rZyG4jJLvQw4QVJvfq0dSr5vRQrITkZL40Przr8jISUT9BXSm17qOWAEg8XZNEPRlraCu8Y6kP4e47yeXNV0YfSL1ITTdRdH0ED9amXoKCpQcIhFoxmrkpVTd5borvbD5IyDBsXfbOe2YLpqfE8rEan4UybLXWIoEn8tu50OHt851DPONU1SxW3kNDSDp23IFSlDeDntV6G0CpbSw63XdtUXhx5Ts4WO0teSZFyEwy1U7fht8HOcpsAEWI7HNVNe34SVTDc5wV9MDjzlZ3C4X8Re0puyyiSiHjEHEO71Fs", "a11b6456752da95880f4ccb2b68e7fa2f2fd0792b9d441c99ffe92c2d9662c0878065fe15eee5569d6747305705dbd625945dde6ef4e1af1a57118f18481fe11"], +["IzroUThkQFCOIxyGBmxnRefHWUiRkkHiEE7jQy38AR39IYEB35fcNWHzp8qA9WVvZBEhyyLL00eryVs079mewToYwIM5w3XTS82fA819nH9AqwJ0THPraQylnnQDCcWlGgalM3wKeyE7vzK8WlSYaEY5sA6kUlSc6wh6atefN60ZHuKioiJAibZZCFxUoUrq0uoXT5uPeddWmfYWu6GwzJTCJ8CSIGAGy3vKTb58C7FwnIy694zKHyXAv4RRCWkl9KY9JNqIV9HJ4Kc7yvgovoS6uRuyHxPn78ztAveG9f4xzcTnsxpY58ZEMyMMhJ9kCIynpCr0waE0YWXsTtXJWJxJKLi65v7hqzdhJkNevXy1zos5FN7xZgxmZQWFPs", "74c3abde8a0eb56083d78c27c06f79186fbf92b97e2fcb05868709e8b4cf1a269882ab19a50548e9627a7944f8b4f35089910f955da1b3f386036855dc06c895"], +["0Y2eOUUyGUzi8zfz8rj1vXpuOMUDWtRDNO5CEL1HBmFH62VQ6kLxgK16FT7x21uIXjQ1dpZ5UdWpcjgshJjhTn9Qk2VyMYdhL3KMDujlxD6Vy6LGHtjgoLU9P6gl38xmbltTWEbAe5q6LfcTesuCEbMfVxpRWGB14Lf8QC7d8REkmQqgcgpMTf3nCPcysKVrKPcMDeqX28VOOt1JGx8RQklt5kULlcdiosQvOJ6TJJ4ufA9Q5shjsBValDXIoL4InCcuNqY7VTRTtkcUGjR1Ki5J7R3r0Y0t8CgNTdbgfnxOJpn2IXElvj7nLiJ1LGeOVupYVTBtEtcSkjkaaESfIk7hJSA5399XTZfK9HOEe5oDAuG54XcMRzBYP5EyKNF", "26c470d74b936ae71944389c76d7e5a523e5fca86a34edbb90d305de915d8abdb97ca0dce8f73e5b6ea7bac2f06e8e8f69ecef6331515f2143dd1a652c5f4d07"], +["ri39yzJodsj9zLJNCrYBKR6FTzDSvyHkcoLInB59oPUDkW8Qy4DhQDQe0JXCcniLROmQIV9O5J4NDOTdS0DB4O8dK8Y1Esne3sjFGJWV2mLcOeSrnNZP2aXnlJmBYUpiVPgPeuqMge8DeiE92asr7Dc9naPFhSjTnx0cznE7nLwvzYB0T6JUaNGSpSFPm28IsFN3Mwzd3lbmaDV9Pw9A9a5y3H7JVMyxi2gj1HwiGaSllAQQR58F8C8KeGTcFr5zCV7fM3HuhcEFu2MJjAirYNK96e8ywXplaj2np7jN8Y2okIYel90voY1qyEpX31Ol7Wvx3gKcYjC5ike7JUo0MHJMiBBKWpNRCaRLy7SQf6PLqrgMVWStth4Rmf2WOuEe", "135dc20969f8f4cd7c630591dbaf3b993bbf28f05f691078539d409d10848d9d041d83a81c127d84e732e439fb67c12b1357a534109922c2f343c79793889c93"], +["qLg2uPXncNidrZ95HhKoKR2CzNjfrReCrtzfkrJ1Wr5w0WUoFkLb2D2PPYX3s0j6S4tjIIz6ybylLuGbgA391yACt4MGEK7oKhHChLsyl4HfLxWn99FCBBb6EabXhoMGiQhpsRIFlxomPR9x9JdvXUcAbUiPSweNYjpBtNQ1XFo6rMrdfAHuRNh3rXa1zM4wmFnLnpkDJdbotGIp2OWYvgJGBOFFSS66LndY4F8h9qp7UiMRiHnKaX3cRsmF0NSRJ2V2mpuYjSJSVoF3GJAHkg7Fna75YRe3OV3jHC9DrqOS3dGoJI7yMLxVBFPFkwHOoKxVCxKFtlSGCuXuot8w9iiJCc6CwMeo7gH3YWtXAJuHir9oiJXTt7xFQUS67jcEB", "c550b9ef1eb8b3f64f092e56a05e5ad6ebe166bdb5acc9dba94c71ca7cf4d72fa328097c63d653cb11a5d16b5a682424ddd15bd734500d0a3c1e845ece530713"], +["cikIbBdoKm2ROBCJhLhpQU94ErL29hbkZrUdeY5Vd491bfQOGjQN2mrxrXqqucGBd4hupS7kGuH7TYf63fITxdB7AUr9yN7L42ub1YE7K4i7G07zFk8Y8acQ9o1L9oZyIYZiR6tRyIlwbzAFVNRpwGBZrRZZDkoHPTO81sEebTlLsq4dwA6KOjV3DpI358WGJN1cl1bRGu5tvnAfQJSTcRA5neAOMHKhXaM7DWIQE4HWP0ESBDGNjqcd5TMleBFYLa4l0Ku16o8pxkcz3nV04FPZE9eFrdlh3mkY9RpuvBgGqpTLj6bfaw8DqQGPVuyHVcVLo0zQ8i6Z0BqUIyiJFZkqWXZ339rIWCZMse7gSk8Ii3Q5bKyvgbEAQKArMgtg3s", "26d6035ad4c2486fe8d654f8dde5b48dbbaefe96b5bf01906efdce1910f5d4257b3ed2e3e226c7f8c4ba2321cdaec73155a0b7857a579de7e5dddb5561dcd090"], +["fDN64Zh6jUsG2SQrBCEzlG8LYbQWThRdikaEfZRpZd6wxn0QpEOT4HWoXjWmErJUsZPwAw3bpsVf213RYmjyTsOyqocbylOJ9ZwecWmDhpMAliA03fEz7UDuhdpmSjS26c1okicVuiG16lGyOgVhnwxkUfXOZoO0658s5GqulgRfHtxTCSJtGo8ckOCUKR3EFQYiG5ro7srKSyymo9found8iSeuTH9g4FwPq6Ic3Ix3yv2TJEgfKKZUkPm4o3QzVSZ7mlXrKB1vThS087MmGrYAymAQhUuBKvTBBiq01ek8KZBf5TyG6FhR4aZQHdB4Zd7fcvTildwqeRWRZ2Hh7Ap72fKYN9szVyJ503s1xudL2Cg1BUEIvJsXByKC7u6Q18J", "528206cf6f3b063b55ee06ca6f124be12bf496d8c3ded561668bdfba145d9e22765287e83e4c81b272422827a10a5202e105bacc965cf04fb835efec113de062"], +["37T1dGeupsFlvHqsBoR7a2WLlalclzSz5hsEot2ManoBVnxBL8MZKp29FUDyEv5FPOokcBAdsVQLXDPQ8nYaUzgN65hSHlcTcBQEP86VVSaJkFSKZNZzB65LFjJ1ImAaNjzyZcWHbYP0dkIMpER4UMyw8vlU9QnuHtAdXg3THIUhxzERjbILFkoqSxXss00PUXv5mL8NX5gmqYvekCakqZKrks0loT7aKCV5848jXdTeOd0U1JM3XVewCTTDciRudvDHYcBjKjzJqMMmPZC8awVmTqbUB1QzSzqmszFaEepjGg8TnffuSC2M4YE7OfUiuOhBDwPCwRDLVOcCuK5zscVLqwHpxR3DZZOPq4iRK9hP81rmOmPySwDAslPpwcIXJA2r", "5c777ce1691abec65daf32c68b3810612970c8337a4b20375c1dce12c77e9975ef216422f19843f687e9025d35c0530da4773178b35a5a8667bd75e4b014a8a8"], +["FgiwcOOWLWNvxAwXBULkwVz2sgPEdulPiGfg82CehLlMiBHVjaLHIhWI4QS5sDLEyDEMjVJ5wDXTLf9BHdT3fNwT7aURNpTJoaz3ArDX2hHmUQJIXDl94Vk19mID1JqCDyJG4PCq5CPXCvaSQrliq3dj8ZylTzpP1VVUeqzB19bDgyhoe68Bypi7mOUVBA9pb7PuAvVEDWKal1B782YqsvWMtuqgAS4khGqwncdXC2KBTQ9Lv3VfPJrqoCg4VKRprUnEudMczbL0TTA2f62kxfG4RiUg3advDdsTba6Js4vvnY7vOUExSfhJUZnVUas0QTLD0g5mwUgdOIAuQgItEux2SDc5yBMo0rvWdWJrm3UPAtOsIkGClFP6W3hg2kDwKHPIh", "de3430df62aa62db4c63a6ec11380f08fa24f5a34b19faaa12f210f8fc40173ea798501fad1232fec7d0b479f2e10db12cf68f2b8f077230dc2dd87f432ca779"], +["Zh7jgs7wIt9ffTfQDzYPMZIaxq0RgFtDAIogXZ7dnUf34QEd0F8VNiKh6D8nCcu53WHsvpfb3JXVCuZnAXuMxJGVRboUnEoDuTTH6fChCxynk7tV4ip6bYKX0Zjn8e5NPpQyfliZAK2M8VzCHHp0b3bkuLRkMSxxncvmu2CEVnQ6nb4muKegfPMwtXa0C3Xcdr5KZ7COfIQNAOiyWb7RwYfBRRnlNIXuPxVSEHu2FgjREzDFj1CZMu3Uv4qjSW2ylaiEz3Qxvr2IzoXMkqET6N0Z0f0ta3Vyu9ys27oR3GBYdvXBXx8iEmVGSs8JYgVfKC0FKfPO9H7VP67ieYLewCIt32201EEqvmTvV1WzRZPz9Sifi4VztTVlzH3eHvXhVsuhLV", "aab43985d653852822aae5ef467183b7515ff3ee518059b5ed88d56ef27bd04581fa3e693147321a0336e2353b043b99ddcdd276ab4d29d5f544b01d85452e53"], +["vAb5Hg59tzgr1UBf1JVoSIrnZxVtS9tN3iRcunuMgCiugfaFs43tWDrw2indNEjQT6BXSukOcNWG030Kiflk3v6NtvVDHDR36Tr7Dl0S7HfWPGcqxRrfoEEeu48DaEo35AVXqD1pImuardSxkvcUfazS4MkEL5xbdmGkdKbz9MyzPz5hnuk7vNhFoHpuvL3ptX91yWPmJAz31OIWenfGQYCNG5BsmEMPFv9fU6q6IwoEG4TlTBgg3o9PHCefiIEmjLn3Wyhyj80qBaRzykTZpqs14HPm2u5oWUWRnmAmBuhNp1uCswAT2Bk6pa2ZHK6KC2RpQmjc6OudI7MZLwPhEVkVF2kMT8pLa9f3GoQ8Xw0yQOdIHN6HvcrQTInR79yf9z4GE89", "034dfcc9d074b4b3acc20d166062bdbdb0b9179d174ae3468c6fb3ac13a11718ce1a8e8429ce9ac025c2bae3439c6ca00f7a74b6748b435308977ed1d97b8411"], +["nePUVWHmVLD3w5hzM360sZx7h0WswxQXEXKibzAlHT3HE0xlKOH7xc6uvCkg17xhKjoOOrj82bmKMBr8YZvIOkP0w5Fau9wOCg19NRqtDMzwDWzMuKXh1RJ0jkU3xxKOsJO91MK28EmJqfUGiWCSItkPDV48xunuQtwr1Zp6id53X6dHHL1bHgpxte3UXXcLE05LZmcSpEyIyNjadJw4EdXFUKzwiaO2RUgxXdjY2EnhWyeL5CGOkZleVUg2ccoLUPymbGgR7LxB6dSP8ydHzE9EPFc9zOibOD3WwsxI4MG3535YfhsPhH6CkEpOJIq2nHxZYtAsUn3JaTlMCoFvbYLOoaN8tX12edCAUXKuJ6YD2n8AlYf5Ioq2huEZDka4tAUCUBk4", "9d23af752835b3b4f6f88bdc69aa5f2e814a611ea3b7b35023f6acd5c62f188a3861c9f6ab96a4627eff5907b289c2942cf417dedf68bf9bbadfcc056f717ef1"], +["0tJ3ZpHUcZPab7cl22yR8SlvKQ2TaoNdkG33aAeyEmosakS1jXFJ9w4jsHJsZntAF2tahlD5gREQyBn87ApqPlPCahTFz5sMegGbDCzXrH17E9cU90gP42T1ggadKqJlfHxYrz3zJCwdUw45Xi4XSv3K9WxBRiASujozf6pGXg9DYCpkkAuIlELQRD2bylAnAcbjcOn1O6Bw9hBJjTkrEXQSUHuvE2C2gpDobHfrx16sIhudJjKtVCttdUMshxuwQnxSAsqtBI2kiSPn3yZ1Rw3ioGePsVgrxRWnuOB4Tv3ODJqXIsLl6tVL672ZtK2nSV94MRIEwNBPFunKdPGsdrvXzQCaxurz9SIuuEKUzShWbVwaehVv5Vm7bU8eX0hhwdXQZkKDs", "44429353221c45a9044e5a70b0ef153d9ebb456776078b1aa05cbca6f8d3597a2244dedad70590fd912e315b083732b9acebf7eda73925a609e6c341afe9f4c8"], +["FHKTKxrGLXLnjmh1pU5CsKduegxFyIrD93KKOTkH6d8NKWxRDigJSRFaiebeiiqEoMwE3WGt6zMRccSp1FaOXTk5iFEfvzXDQLVSSaopeZj0kKpW3ZTLedSa12LG2Ipu7w6Qu2IApkoSDDLYlNXi9mxVP39XEsV90Ze2ZT7DA6aim2VOVv4nXnKnyknBmhwqXhN7bpZTyuGwBI0bBeo6SIc98BDsFVufU5JgF0rLbt5wDJx5RKLvCYocrcP1OAjrJkOBFVWoarvfJNbdG7Y1HkkB0a7Y19jhD7EdwpUjP29tLteDRjpT6N8yaNbvYs4LoojhMe86f4PJNXMsuKvJkz3yhCgAvjdKV6tNYyWpHc8iYXYtpSeU1XH7aN859kFcrEheq2DELI", "8b995a410622464e13799b02475775c4e024dc096394d80932e1b785b59e8127acd224c464c321f155921a6bee5a8089b8c5a941c63f25b47798f13727f7d2dd"], +["lRXUcqbn2pEBg9WdyTpcoj6J1wD0VvL1ZZr5ulPI7RuJhEasHQdhpESRuEAwYFBwkbZyAKTdpcz5DVXDouvZHdxYZo6rVSVW3Eo7VQZoqCKKexuWGXK5SeLiOor4toR4RhZMLXiaWZARiERzNTXBnznHPrd22soI85RAIZSxjnwoKmbzpXW2x3GW5HctVq39fWmXBTcJK0kyuGEDcUtStH5oYRInLXuA1LVtlI9l7USevq8E7TRuWEmWVh1BpiVlge5He5GOXKpuuAs1D9H8o5fGseP4GWCqL2TGWeEqnIcmNDDt2ulkwLd6hxsIGyZKcv8tK7FZ4ZfAKIv0urgHcbEQ84jOObJCFoJSk7ag3DWKzS34lR2kUlNbxHQfeRJRMZUiTgOlqb4", "2f79b01d54c4a61eb5323a440af293c0389708e9e68710e36175e49b06668152e295980040f4c89967e5cc2e7a76acfcc6da452286e99cba4838293abc076c53"], +["1cNrPX4IGHo2rM63g9Z0x2b2bySHwvP7ZQHQqVVZ49orJVP90cd9UokZ0SMvvOTc6qvIcSsPAgXBC6rD42mT6iI38RMGCXOCAvZ1ZaUaEzHnRVOLSasZyO2n6JcVdtphT26jmQUVkJLupBTqgsUZ23Cr2yjsVihrEHWmwQP5sfDx9L9d3iILnGe6d3p683hAjpORSkDWO39zhPxT8h2FLNdQIzNXYmHy9cqXkJDkhmwYxC2G16vG9IZdKdVKtt5VnGTm2ld9aujQGRyggDj4cVDlT4vf8Zsl9KZLBsOXmzF2IxwGNtvWXalpnFVsivI4mvN7gyMMZBh9Gglgo3S7RxpZ9JPT92Vc5oPXvToQlKzJ7RvVKKI87mX15SC0Oz95fg1bYYzCJ1mC", "e3f00a73ea787a25e8be4d09bb8d018de7f75e6dc781d87f3f4cb5faef513c5ae6a11cb58f9479f4d737ae61c493fd34d8f3197c330a998d2513cc043691634f"], +["f7Uv7tCklJhHbI9TIE4KI8IODNmGLY3tSZl1S3F9E17AqeHn905ole1c0hVKrXuZVUjQwwU9GYh5T2q1akEboC2eTXWLp99goO5BQ9V8kz0eWsXMPe5cx5v21LJBx11Fv67rNGFQcaSuCb5y2ltfM3F6lcuck5d3dHfIOs9Lv3jmSb21NMsAcrTfIb3dbwATFSrAu64e9Nch0QY7E802UZukSXp9ETIkSgz6OwYpWQu0cCpQsBEfWvqATD7hu2mKxrjzF8yft4zzotkQyVj9o1663zkh74z6gNKWm0WEx4puiPlvqPThfPfHcmXG8qoiP05ibmjbONEI1VHMIwjh24bHTC07KOctfuhSGtjnPPSpT17cJMoVe28XsYl3yIO2rUeS0u2AnLVv7", "7482f1cac06b9f31d7e2d86edb43ca70c1553bf8908b45d0a8f583bfdd5e6fb4ee3c36d49a20928c90e06789b0cce982f64d5e0d5cfb71bba44d0226fe4fd88e"], +["VXcVjisWx4GHYCojGqJ9sCnvpUSqKecOpDZpPH8ve4KswOM1erukhsP9CktuQmZ21WRUj8lilZI7ynnfhBzm006GhFLjMKXlmvFffkcAJauFtQqWpvQuZBRnc0cZrukZVUwxMj9xnnNU0ml6uzUY7qQ1C8m9yFUdxlKZgP8fhKGsq25Jnu9npSRf4zps5eo64uOxW2FcMJzOt3IT4op7H1dlZmizAViVzNb4zNiOQm9PAdkaAl9I5CPQwwfaPsjBAqoH2q9v10cy0q9Ab23vK3WR2HGZSQMY1KhMbyVpKz0J0yEJN5Jen2eZ8yXZ2u3gcUCXUZMWSxrZFohO0qheseR0EqLfdei8ATYmV72Hp0bICrjVr6AjF1KJrMYAonWroHP4lBxjRAfX99", "87819c3a108f46574031ec9f6bb9385d1adbc9df53ee97ae8c1ad0ad7e60793655f9998a7728a06e67668534e67d440f8a519d81e130a265e698c3dd49d1247b"], +["uAw8uQSht7hC0eHwKNzsyP18Lzh7ObFKariXj0jj7mHUf0A3mTMijhXP90Y9xzeL8uoVcrj4VorFiJejpuULgMJ2kBlw5VkPSAVDV8NHuChqiOZxHHHxL5ulSyAPrXMhfNSvhO4gvfzklwrPNtG9eclFIMMSwQ1R1YBYPDCFJD3MQhqLFIe2JwqniA4WM6ZSdMZHUQ1JSOtmIBgf12yLfubYKh1VbwuWSaxx5Ak1XSjXQjnTIwW87MXBpPZHqpI0qgHvrY9RLY4qRAp10qqvF2bgil351QgKCxCkoQuQYceUJIj8J0O0vv8H0x7xt70JoFAmAwsvBHXxKaKkyRtrG9fFVVSNA4lVpZeDNKZg5ADE0xhjk2zZD0hFDBzVs9wypYW56GCTLlUv6BT", "93b5c466b9ea9c3e64261d9e7297e6e41c1bd8ab67f58e6419152e9e9d1ba32f9a928371f48cd4440a11a33fa768e4c249cc7fefded5c69c8d75788afcf1c5aa"], +["EXUASGD1m7rELUFZpIOfsVJSTk6pcm7hl3xYvgf35edvx1DCdXGnAHg3rjmkGzdolyhhldE37XjSwfF3tZdvg6RSga6Fu1MqH4FADiNkJcfZqjrttCFBbuC2WvRxMQ9WFnuBanbgGQZZkHOehylTc5gCfqiz1PzOyP0PiypInvxRyqX7nzUQdfabvqRcZ4iEHs15UH7WBEL6A8zpbdZxADzml67bvmRDbtQ2aRGpDWoJIaDrpdv1QBvYHobOHRvwayGjtrj5WJcwfFc3ygUiFYp6ORIUSGRhdqzibG307Z4oHcCXrzWoyALUP4Aqh1VNNfFeBXBtkZCZTmqukXu6a2TuF4qc5qab3F5jbLS4OytfpC0TQ6AGkwqXH1DnhqIwS5DEnVJIkW8zOtdp", "f8c0041801c203d9e177315954bc3d6c4f14ec0b52fa370ad8edc8c4d8c8690eae7679b512122b41c893a5d5874eed3a26c7fff03c9f5faa59981ddf62c55f66"], +["9z4JdRnH5kQN36tlAYsLmMbXk6CV314A8VjYFalcPr9mGjyzS15xKVZkD8XdeFtPXotDpCB6WUbnvlPuCIf0HlCNxW2WDngtsBv86qPMbbdOHdFv6XwHzDdAzpt2rd9LUWWAlgHo1s6zFVhahcqzj1CwfMKzvTCnxU6l2g1ijMcrlu0jpleEvzzAAm5XBD92in4mYilxE48AHVWabCCK1V7lAkuTeUzayBiqFYL5hKodQnSm6NzMcjGm1tdPdogYu51UKYzFbNrfbLWKBoG9H2YMakEKr8G9kQiHkZ2liPFGRE7URGoCRV7G0SmiZKsnziQFURwu3PYYKdNiOtHNO8GJBgxFnOUNvBq1MoFW4gJJL3Dm8Bdwj47RFWXnM2AXuKMd37znbeRRHSMqr", "eae0e4d3f2bb94472f7ca001538cba3e6754741c3ee0479cd0b897a6392bee8ee4cb8c26221c1915455a73bb4e2bc7aba7564a6e027314c038e3fd808fd0cb67"], +["YqspyeBKHpoBZdlrgbRsplYJDNsD0sENZV102QzgCx8E1JexbcjzXwttrXXtAeBf8Ow3Iw1GmZmRxVRB6H44dpQJzpjgSxWsdiOqmrcgpjjMvf2kp741oxCLhYT7A8kE9nm67JG9lYI6pBBNWyT0JHkKdmhzKVu3grkSV3X36nM8PdXREpKK9EZboHZa18CePEqfTyrk7k3JH7NoU1jUX5dPFxUvOoHmBMm1kEtYmRhugp8ZY4kre6awMDxCOixVRsAT8CH145TsNRJ9Mr2zp1b9oIpyTLWhfWqVtCjJ6JQn53PNmE6TnOZxgvDCvvfbepo4BXQtzYYki2Qk2jSrOxh7GY0iJD5XP6lzyLkOlOzzcqFW4GxzoTivh2mlVrCDcFjiDDagg5QA7suBex", "9ed815019d0b86474ba5d6e65134267508b3ac1a158f446b0ff478f3fde44046b656ed48a3175795843e7b0b69acfd34393351ff99c48869b67847f4124b82d6"], +["URfrzVxsEPYHRwpO6vz6RXMBzntihvFM26TibfbKqQPP6vJwboCcOXLgIx77ONRpLXE4tWoGikWo8lCIIcl6hm9z0WI4Qz6oTJnPi0SmDVKAZ6vtcAUYrD59bTcZPW0nwU7N1qble7V4YPca3kLbI3X2iW1c0cyeDyNOJAiBuxx8kt6ZaSAfPUwVuefBlOQrLXu0TdFVRAxOtjNXYhGC5upB4hng6SpAKG4LvRrMluwc0gEn9VgJsD8TeLz3spRQNDAnbk6OACkWTEYJl8APgB43aIV88qfPjl1iRZgvEwuKk0cEiublB9lEkq8iPVXKHFXh9sNzOH11F4vhSKQuqrVChJnnuD7xHw1kY6kBtdWVRBn6w9FiFD7qaJS1pqtbtVLE7tnHZmwsuM9TdT0", "c6bfe3fa591d9dd4f635b5b3d084f01f04ebf58cc9502179f2200235dadf53a89db6da7959a412ce9953969e29a4be199880454ad85558e93c7409ed7fff68ed"], +["GkFWbNlXw7SoYuFZAQwEck1rNCp9GVtbQEMc03Lc4zvJSGEl0ixgHdfjEWylEG5iKze1g3vH65gqeMkLejc1tX0MHPLJisZDfAraucFA6TkgODsRxOgDVAwr7kpTMyudLhsH0LdR1vwOaulDehcHhpDzjnfvM0T2oADR2RJ9P5LqwEI3DcNkCeohKBUZIUQYA3oEkqkNiC7C2HHiOiNyb9vNXVCiXLCjqB0RFOUTn6d0NfHyMXXYB0QQfdxq6dXF4gvavEZNTUbwwVzNVrfrDkMlJDzWAUl8e7X9xDwRzQAultFeihrYfqZjp5r3IAikUGFpfagIrr5azrkBcAWvjncJxTSdTEIBuQrhd4i4pZKyr5Uro13H5gk7dBnHH8MovTpLmVporZe3weEhi98X", "9dffe2a08d82be3bed628d8b5ebf01c75457562af74cd000c1affdaeea5fb8c91620a165b2702041b8cf532bfad70877fdc5b557019ea08157df7e9a5888cf89"], +["zpdrUMyNH4dxnLXrYecBN4XetizwiPf0xspWMo8ALGIfZbiRiV01UzSiHnowK0LlTxFewPHueUE4gnnNnjtO2WJtNNEm0FARlSOaC8s75AwFsCWVZ5u2swIIwVmDt54Qg1xlP7aBZTG1Y5WmlzpAmFFsZmRwz4E2EDSy6qJ6EYSv9JqexCqNEmGSEvNe3sw2bUY28hVEKGXZvoIhDaOibolcyvpX9Py5Wy7CgSY1T3v0OYjkImIoXHtFzb15W0QGTQE3MIFZgWUcgKxSVMkApveHW83qEpXAvRxSKmYjeskhZ1N8otxxJ8bkX1blKTfBeVoD9HjfOroAzt3Ui9EjMKHx42yXSYnxY2C2nAioQ901YLlzwdrEPQOQzyKBPtSYgL5YP1gsu2NwyXEUWEAAs", "1053c65e38f9d83506a2e2687c63c144fcd719311ccdb9d08909bd970e28992e9ddb63e70275b6b7cb1af61bd83bbcae44a6264e6c67853944c2bf8d13f8001d"], +["lkXv5nAcjdu8MWfQwINvG5CsEsIVdNr2ZgiszQ1BYawk3V2YvSZ1UYku68PDQwWgxsQ6sy9VveSUm7FW54zCpxHtCRY9Aujzen1bmxKDjQWMtfYu9yYKNaZMTk4jp5zLkVzFxX0KCAJtweNaNeZKr7Vol1klK2JgJ49iLM4GnREK59dthHTxrm536y590CGUU9f3ZfYImSqP2ZQHYZ8TqGLWJkqC94fascWrW9DTil2i79q8cjsrdevTW06NiLGJOTNJlTmIDNninigx3SrRJMoj21FrBLyAUTb45d3l3GuaHLV9NpZLXmjtKAftete70pXmKihv231utLnKWcuJxot7KuYeiSZgHjFzed1w6jvQwxtukBF1EIG05XHbqh2JAfSto97KNPSJuVqn1tvO0n", "21ed136cf213c5dacd37a8ff14cf1851e702712648a04be0d66d5388197178032ab250479c50a50087bd14397c11d984b51d39c02667334ee6e0f358339afb4b"], +["CJBHVxqu8FXRCnZ1LLBDZwJ04V5lyMe22Lhuj1GotW20IkIaDtp0vd980qmPlUwmv18hmlqpxqTzvcKL2D5oYBiKG4A03ljT7YcH6PUc7BHGgTmY149ecOOgKMYl91NtLBqpUONTLuyL3QoJJRkvE9J1I2jy0vNniNxb51g2IUIhlpiUrGoMYtKD6npsOAD8UbIlxR9RV98hJx6P43eiHCevsfKT6IG0R1LKQLz1pOywuw01cfFz4UFBbeWq20QvBtRFQY629LFse3AxwFfYbCTZvHsHnQhvFWRuxvEnecvJKt1VWtE3FRVIo9e4KXtjNdYXk0S7HpFsz7eyo1Nazl2HyMc7cXWKJnvw3G5gCAIUStceN4MaeHn23RzzyL2bpuYfdXg5z5kUBpl5Cy6ma27", "822514512e97a081dea685089257a14b74147a831481e747f605f9819f42814daa1b6db5a26338ac1173ae5a537748a6af7d22d78fd9e3d026845d4ce25a5f56"], +["zKAElqCpRjzk03gzmOT99kxjbpqm6e2NYfHTqsYKgHgEqs8oyuXIsEEFVi4jyK6hcOX1AvdKMsRXGO4q5WPh5r2IGjhhjyG3e64Dyx5ua4RSUUKys84oqtHlRxyQWK1SIGDNQXq6NLoMj41K3PrYK9ZcSWucSqdEhs34xnUkLcxP5dGHZwFBnGxlxwezdanyfkDdB2IoACsMEo0dUnwwF6l0ctWbq5hci9ZekpqVBGaSkRqULi17NWSM5viiz6vogLS9ioQ3zRfBiBQ4bLleJCmE88jVbdHIH6GIvsd8ghS06MBlliBicE9CHYUw78ZGHMS92ms6K3v19A6HbvgDLiz1Ol6mLtselVmCJ1HcmaJzRLq61c6invVWY8zTDKMpOVmh7JnzeiomtI1nGXKOnNVW", "e6a0a10b704e750523a6a334091d5ba54acbfc026aed60098aedd861577c99dd8b516fcaee4fc1b718c9e45af1bcc7ed6c90a23a8375972e6af103c6b14e3324"], +["E8oIvVeqmOkh85nqdVNjzKA1YQfGZvcMstERiA4bxChn8OPuwuM2ODOkqEI1AoAmhjKptweDFbj32COvFnG2Ix8N6Xk9J7SUv2mk5ogGBem8dATypl75o5eiS8YNIHZ4QJAToTCkZJHPiUI5bzyf067eW1lhWsXyghASHyO0TAvgxpTzT5avFNBEdBrj3FwpiHKtL4YLq3yVBn3e7Rn8euSFFR5Xq0SgP0ICEqGBh5M36FgApwbwnrXYa6PG5CI1cdcpd5ZAzyno5UtY3uyWsqegpzQRsEPK8G7hFITA2j5I7KOmGFVbKuiUNuQmTjIVbDMAFKDlm40UnN4JRqSaiTbvwJSyMqcWjIX6kkKF9l3Zp0xXEoBjxyVZ4pT93FkwGdHkAo2Vv2XvpIIrSerK1FJn4", "27c565becc9549d4c700786f30b2ed5afcadc94278272a3c904b3ca4bf76a443e989e419e4ee30ef0e49844a78d3dffa0de0be2c996c1535e5443a66aac02dd5"], +["CCqe2hSM1SUsSXKyl4PdiMpdiNfCIKbM89L0GEr8PYRrvQTGC3W9WyisyAnPbpgUXpaSR9LR5tkAdgIrj5MqxIn5ARMbO8BMiJNKEoDTmUZ5lXjKP9tUlG1b2v3SRbfsPPnzJlgZwpMSRCVCxlEOewvg2ykCcNIrkKYpg4gUgNn9vkUgvaSBlCi4nsN5nqoSxKGDtd5sPmpiI7a5xt3BenzHK76jh2lUSVHrz2bBIpbj90Ba2QlkXl2TuQRaFbW0HFvMgMR6w3RX1ARc2Q9Pr43dTaaAsyuQV0WmtSnXSzXtjG4U15FEWTmP2EUK4tA5e7REahmimrEERYOEVGN7xvKZnUIcj2qXUcaOurCWz26F4LjhZYb19yn6xtGEhp5Wr9291Z4Aolh97yV3fQYA6ujRQr", "8a5919ede23170bce8a813135033c8f0eb8779e669a49433415bb01783185e59f03e2438497d63ce931bf680f2d13c71ad32957ecdd0630f793e8c66ef9d9796"], +["cKfWIzVOSjzgS5bAPQvrmYAelH1LfdtMLhOTHwJKWnH5JdNRlLMEvR0pe95HzO3WJs1oVilxzcS6yfaZCzfEikQtxQice21kxwMAIlOPaCWtL37xQZ74JNDGLYYYICX9PhZ6soRFRUVeitN5gfArVEL1YYDvGfkhuYqYivn78IGIQHMKtYJIUqk9PvYxb6rscs1t4AaghzrsnUhxaQpmNIObpNvtyXH1HXPRIgXhpYhVZQyPUJS2SWVVvH2G3ec6BUBtROyAWbZrHq7tyi2WijdeXgsAfFi2tCxyX2rMuROa6kXDLheBAHY7ZQChHd2Pb2YWqaDRBVoNNWJebPsTZtmUtLjKYlo0R9CAMwJ8gPLDgs8HjExPdlgxR9Rlly35CznWy6toXg8pODVLF6wZsIzjQj4", "617edca86ebce1a621bd170223968b9ef52f872407faef9be6d903e8f3fb077fa97b0aa0aa52455c662b3007b8fb2328938a236f84eb123c62d3605cfc0dd330"], +["XE47Wm1ZIb53ghCKFD8Z0SYoevBQcIX589DTaJNcQkA2Iv6kYqrch25Pm9shIdEExMppBRUG4qzP2q1HKNeMdHVrDBi4F8J1YYujbWCgfZCSjbqyss9GesH1QkRLRAaM4AGwNu4oi9YQF8KEXPXkHDd0kJyiH9SzNPbFVEBksl7HH3jjsICb8vHe86a4HJTM364pjObORNcJaZfyS7yZttDqLbMjQUFc685Tl0nFqj2SPEjcec8oV50INXSaLHad4IhMkLFpdQLWQ1H5QGkpmbIwJ4epflZgSrVBGLo2uKpgEWDEkzoTNxv1Yh5vxbVSsJEVlJvPrCvPxAOw9pN8V2sDY43t7hRRjhI2mULfyGySgEoWpvTAmnw6ZmZGjHgx5LzIs47cOyWp11P5JKYaf46gLMUt", "9f1d0e34e7118b19354ccacf05d69853a33e3bf26d03fcb6f41dbfd446700141b7f894a530d9c49d6d11e2d13ef8cdf9d7537cba0569bb4bbc742b7b5a0c3491"], +["LWC7jXL87guKB5UokuytfbGWsFheMp2EAxq9GTfxFSLpvtaSWa8iwqWar3c5gn5yt7yEZH8DE38MFoU9iDckiU7tmXPLFQPpDgtjbwyuVW0DJjrF9KuxcBeJYgbuyJvnkkOYZ6sK7Sbwi6tNHDSI7WfzSJl5vNVMq4a6ztAYpkzI6so8II013eAjfjgpnYRoLskJ9uuD7cuk9G1QO8iLqTM7HL4MKQawpdAxejjlCVLZ5G9AqRizYlMNnEu9lPcx2PKQmYMQHNUNjOfDbjnHAPxpKHrzYhaBgCxTKZ493C4onFL8PYAd5ifKwSq6mTlXbwWygpGOvUveVcJGrK8iM84k4uTPc9mU7Kfk6md6HWjgcNF3R5L8V74j6imeTfWWsIJIELRBDEt74lGRslUZSpm2sVw7V", "c5e6df0c4180e3796cf95efefcdda0ca05f6a6964ba502763145dd36abfeb0f4bb4de0bf43d9a2463ddb947e4b79c34a79a2cb44f7edc2a7d4bd59979db6498b"], +["aFoPXEd01BIpr8c2ZRiyWdSk6RJ2uDZTS0CppP2Xnn8iVUVIOHjWxQBQMfvWVCM6w8e6x8p8tcDXEJzcxt7T5m8IKvY8ZWmSA2b3cRrlSJy9IDJgHB8ajKkkgAiITgFNtA0CWf3g8aTmZRsGEBdfNCYrdzjbegXxzjqyBLvHnVScVUuiShN3GaoFb3MHCTMDw5ye1OloXR05LwFEurSygX9DDiGGxTakL8lJv2egROIEGsGcqD7uGEiHOQx1oOWEp5OvH6RI4HcPBOQLjhuTETO83aTuAfdTCdxjZIlwhTos8oetlGa5OtUNuivLHm35hy7gHocHfoJgwhCuwZsGb1uR6p1EK4Hdg8jZGEnZ173aHm11cQ839Uv3I3VPi4ZfaxPLGdmAlx7xZIkcFGyNNKFRpLsa67", "ca4880f5a7bc18302afc9bcb98ca49f3f78a6b36c8ab4db2c77ef804aca85aa01d19a2e188f6b3895931879ce5272fcfbf33ad1da96375e378eb7cac062bbf92"], +["hjN5V9dYgtWrSzzxZKI4pVtK4LMOsixRiM1nqNZFWrC05nbAH9VEpcI3CJHd8QX8McPk0L7P0MFotwG1NAV4pCqxPhmPTpvTf3DSwyXVW46DL1pPlowDjcE4gZh3yn8RPiZVS34XClfk2Wyj2JMcf09xeiyOaCIy1MKzK0UsLVk5KWhhyyBUdHYdENj4uCND41RFUFM8t8OoeO4e8hBdlCrRsmupuVzyZdhS1GLhFKHn1QXj0B7UQLCgRyHbJvkhVlH8O6644K4xgDYDawWWhVK3U8XOtLfpxQDVNPADvHjcoRAtUG6WF2ObL9lJW4MSYMunpPIoCPFM4eGO6xuvfFf0xIlbjDiTSNvtHPFPXAlmRq4V4ZUppV79e5xvrcRwyfwTgGevooWwDkISuiKfTPzJojeTC28", "b1fe5a5d0d48d6623467f536e1ae242fe4e6a8a10835a3cbeeedee39ef8541af2dcfac2281a13d23970422ef3339d99258d2f9b410a37bca8b8d9b3a7a1312c7"], +["EvJYfaqeDxwC8okYRPRCPRTrNvj8g4At0yora1wjSC9KMybDJgds1BY0ljCHc516B507xU7jdUAwzVKwsRujOXlOROEqG0AZKb3xLPrg5da59E2t2qNKROYzK4ZrHIR7DH9tfdARe9VXFZO3wbURlCM8n9DgZWukY6IozROJkjGDMfbFRpwtXhaPVndly8t3U7odOoSA1kcjmZyvLKG4po5wKaaFwdwvymbzyKqg4Xn4QknfQDvKwm8HWlN5pJyP2qbzE0thMvdve1GvvcVHZDGdzrbgaCtS0XBRRIg5CmRqd7B0g9bloQGEVCLVrxt7k6Jcak7Lr7ucVO8BwiK2o5UrHVn2lWOIqPSOTS0FjuMcDJuGF3O3Ju8mMaP5KxGQbpETVNWSVPeQPRUyP6gucqXSGKujK2FJ", "a3986d9ea19ee3a001f3155f66c40c486c2fa1ad4ea1c0833f36d33f074b1aeb50b6d0cfde197c02601da7366fa721f2b2317f0392feb49fc659fb100fa4bb46"], +["8MmNu58UuRglJPfYsdHuT1GPIm8QfkA90mTNvwRkmPKyvFzzXUknNiAD1ntFh8N4b1ctp1OaDJnLFKQZHFUok3CQlKxOXeLXSL4NbsJky282OTG41izHGDj4GmanhYUgV8ibzFWMRSMXXHjMldYM5DbLMXQYRW5Ttn77SGc4MNeUcAPQak0aw1sTaSu5BWWBKEHzil68F0PJVYmShE5UAaIHU0NlNvOFhlPwhP62ke8auQHKrsKEAI3SagLBTGdNmaLkLgTddzRDGyKXCzAaSTtESyBwA2gEuN0hS1xUN6dLibQAW4uj05x66uJaek6YrQE8HP9fzFWrLbY7rnbCXGaSjf8XaIOd7gocbtCWhlffEDCeRlIQn5lL7EdJ6DrOI1ThZowuTPglylRwwmc8PjJH7yoplTk5y", "b328c39f12eec8e81ef37ce853c1a905776c77cec1769d43f0bd89239aadb5d700874ce13d8c47072ae2758d6e9cb5816ab5a264894971187d1641dccb122714"], +["7Zl4f6naOd6XUvIjPjG353ayyqtl7bgrIeRdn1YDNhNsoTXrC7RBOXK6OO4ACLvjbbL2TtO5mJ6GkJi3j83hwBBW0vdyg9hKJNuTNYNy3U16ZYU3yEejXn1fnonUBUzNnxoFFFankWIjDU6qHQwAfLSjb8orXU5jfAPS80wwqxWfK8BsI2vZlHIACt7TK98lEclesiYW8WAY4ZAY9Jp9lEqQrv156INif3XKePZZHxSuWKZEw1KF3YIMwuG95Z1O289xjLXjdBXeJjt0eM3ZK0BeCzJtHPzT22CyJcOz6tQofurO6fAR2ohuAekQm96I4oM1s0ADJvzxf6NvBPKG1IeiuoGnhVRkYB2SlA52ocOpBB8pYapwT9Ba9oRnKdiTlwfVEtkq2PKv3TeMVILMVaMkW4eMj0THBs", "ad0b37ddf70c432c2725ae7a4c1614d4a48fdf23e3a1ea2b1e27d679f07af76538e5aae790f879a0c8254ee4b77e4994ca0076e0655af4aab0b0c3b0f52ff186"], +["rpgoKVqmxeuFhNlPac7uj2Yk9EVpPfeimIuJkAsBDKIL9bneQfXQbXE43ZAcDFZUv7QIJirLqGWkJ0RKajHhmc5YV4eDIcjcPIp2qwrVkVf7HAhdGyzBoFaxthrbheEggriCxjxLeML4vsIrIEahfsnSJiy5tO8EF4JVEL3wiMOfSJVMbDixTzjnaLLaevc7ycAVTyjNoEMCXeZaId0lP5EUR4EDhbw4pTzZ8ViD5UvlBmgqYUzZuUEnkQaEhtQ48y67pX9sDIHQ2Sq5F5TZ77Y5LLhwHeuEDKzduwuvVWgjynXBfWAIbExDTmI4ESbKeaSlSmtnlmvPFvhocuBNHUtEcQBE0SsEpvCRAAbF4ROupPLeMgFKohC0cO2oVVzUjl4vw7ErOtmWxm195aZ6bfV7O9SVChUsmsT", "b7b192b6d29b08b50bbcaee968bd22f945ce3658a01f9e3ae164327119f7a8ac7c969889d05f3c765e48f18788bcf9227217ed56721e2d5ca962af4de3294f29"], +["pICHXkUkWXxGrH63kCIthDl5V5NAnYMlqnuXwJcGB1itUpD9NrCf5aTQnoDCSsB3uzPNWsKMFHFRR8L7qlORAmsz9JQihDgjzmsdREm6RwPBfyLt7Y6xZrAxBRJYlpdvdaI7e6jrSkOYJP6bbRXrupugr5UyG6NG6ikFoYwVZwOqkDYQr3txLlj0hygu1xZvavixrOmHGENZc2TFlKHrvO965SSmD5nVoxmJcO628im17I27TQpdL9bBeQU0XhAk95geC4Du1HLdNdYj38gUIFUBCLT67y40y9f6Zpf0FmO7gsHPMaHn47JMlZbQhB29WcH40sKLnGk2TAMlBsfZvnBH8IHoyVA4HPst2zGUr51lS9MIFOJuhQLIxe011UYAQfHtE7XnrPsQycg3vwpfA0zOhRII5RaoYj7U", "3130bf6b704284587e03eff38173d0ac3fef281aa7707b3d1374e673a05879223a9b08fea24c17e79ff74dc5ed36a5e021faffb4ed9ad7bcb342693d1d4dab48"], +["DtRXl8mBllUVrhA1e9HLToEmFIs5YCBje28QTY0kkTEyda69VPL6MZYTI7Anv7AsGGKw1YMy0IxddBJlVl0y5TSgvNJoNdr8E9nUDAYD0LP3pTk10p7M0WMCs526bmVpTrEUQOlWjo0WEqHOMLbtdiDjqDwWgzWGavK5GxufHioEcAGTLVW001thKW9BIIHXXffKmrlkvzwB40fZt7UTLYKoWpzvMK5rxAPVEhjAjdempsTfgUoU5JXibpsXMHxga3HdVQJqT1HEB2sNfWxxDe6XTALAwSJXkqRBScIyh8XsHFLiqoNuMS3jN2612qPazx9UnHWHbpEKsMbs77VwL7yXivR4taSSLu6YrCof377mNKLr0w8HjQgQPv0sUbi0bMyAv8qFPGCZdPNwgeEN7F2ay6hz3lWdIDOCG", "c30cd508d475a7f42ab4ae666b8e2481b7104a8809af0b3e93ff493dc8f9ccc8e6d57e6c659f9dfa4631598cfe127625c3799adef399c7a0eb530bb3dea88793"], +["GKa8Vr0xwSJeVXOGmXXPgauWZkKb6c0x8jB6WLh121uRbCGwXHG9MxpT478fohj0KhqfFCafrQvmBe0ZX2YrG6Yls9KFx2ivEaiQIyFPvDxZqWO09abtbgDrhhk803sJ5HDgA8TlQQdeM8qbrVEu8imjis66Z9j5tCvVdZqCv5FOesYMbi3Dduhp2o3K9WH2AIrObNYLAV0Njr0Ud455I1UTc7jTIpHmA9tnyzs4RYJYzWYETVp4LsyD7F5ENO25lmK1gnheuzgPJmaDRFNmbDDerXcUvcDM1eSnxEkxJyFqcqHQBsip7spdTGfNcl4yNQKcAKF9PNsZ1uVM4WgMEYa3bK6YTvc0D39diy1TvVHmh3LkPTc49aUjHPKx7Sv0HlqxJD8uT6gjLlD49iGi0a3GBz7bRzn976RXw3", "044737aab642fe55e4cfbc44e97591c174b04cecf22604a225c8f330a6337b5e293a7ad296e4a65a4974f35b7acf5da469af737525b9740ac3d15075f2ec867c"], +["o2UZcaMqqniIpxhrY7izZxVXi7cPtPjVdN9HYnwUdSaT36MEpttPfVTIIG2yusJFBfLsakBB6n5gjGfVI3T6qiqiZQqJ6NrnbBAbUyFXPD4gB69OFlSM49dfxNMRE0gZbwmSxcTue9W2o8A17nKOMl1HnJDiHRuhY0Vz1TJndYxzm0BlrfcebwHRjiT2Zi4kAzXQ4KEY1wHENwSGwbG2kgvW9wpaYLqT3LLxjnz5DDeTzknzwSRtJkBixewXI4C8GzaWQPbCYagrQrJyNP9SYHNyTeJejO6cyDGbCiglFqJ23Ex9gqaPRRj4WutWxeNBqmTh1VJ2ilJJpdonB4sSNmFJ7alB4gw4WRLhIfstqDLbzpJgLVTSXswPkghHxWXZSVYIAItxlr6zGxMf5ikEnhN329odzqphEh6xGyn", "edd9b32f7b421feff217a9cb70824c9bf7c2e3dcc8836db393da45f1364c6e31ff7d27cc6c2fdb07a9ec8ffadfa9760cec6032c308a5e324ba78faf9a872bcfe"], +["E5UiRtkgfhlGdF7GMqF8JcBZmsvTE33iEOzDThkBp4PKMp4PvW1fIuO5qPY9H7b03OqZsMO6jDbStHm74DuvzcRcan6OED2p0IcLhNaF3EOMIC3oa7vDLewQTADkyIox9bgq8Il0tnI05E1V4w9GT1wnC6sT9nrNHipyKv8kuGvMtg5FWYiDSyFYnAyLHO1vErZjjg98oWOCgZNOZ9GMPqm9cTAVK4GOOy7LjxhAcmbZ9jtw0V9yn9d8ArQUmkjApygjO5wGGgNuLNguK8GNGD720mQzGEHOtoYy26hTjOX9daH6INmVvAatQpEPm3DaQc5IoGmYIoKwyGeSpalee400vEuns6Bss7aj08KoqU5MBmmR0UQzXH47FTv2uO17DmhHdFcmGyOvLmbTTxkighQavkbLJcrRuJYbWWqB", "fa51e9256f8e84856b7275aff74fad35db3a2269e2389b751839ffbce617aae1671fdf07a61d7abd475572f4a7bf5fc20083d1214f891f30e6e9b54907d743bf"], +["9uOOrQF1yw4Q1g8ZSoJ8UjD5Wc8a7iH62N3KbRSRiLBvsqpnEI9EbvKAARpgYGpX3bzGxEKtX8DLnp9TpmzqBy00ixv4Nt0DLtZp8IUr9dJhd3c9S22LHqp6hzCwYoKSVwhtS31P5nd61RNZ6QwfVA7MeLyEsPbUTDdc4hHei2jYWXtlyzn23LGQFmyVd2lj3li8Ij9tnf18VojXgBek0keYUCKt2V2ZGnN2b57JlximiwUiIat09K97AmV1QG9SoYhwCNbJmphPNKmGR5WJ54Vh6AL4mTNLbaHr2pfmG1aRXDk4BCiP08HwNGDPRPDRrwxLlJSQ5JMeq4ydLUbupcn7n6IKYd3Tj1Xejd2bJkCFCrehwtOcN08FYHV6Tapsdf5qL28NPgA1omwXGKqERGGxd3LoEPsq0XdWoGAfC", "afe7a0eb9197e33c5f849ef98cbddd50bcb5670a85c768392e617c7357e8b713ebd241635e81be59308764d694fb592c4b180899ae98ab22f271be2b42c213e5"], +["nFeGb5ohrK1kXWcUp5fGE1A9bWMSabdJgNZrLgnK7YisUoD1pQx2VfDR4fgOpCP2mc4Ehgz7sLZggj6mt6iKgnB57ZPiSF2lfxu5zmLXbk5jEhZ3VfWNsS9U3q0sj43FMMWKPHNi7oOP2ZEgF0Rd944zZ2BIy6BZPmO9wbhz06ddozFzQVYsMZesdgpzJg0IH3Z9J8hlaSHkDnkpKekNb0sqHXsSUIi0Q0ZAmDPtsBqU62cJqglKqaxEAeqSzSCCxzPd13qMgbn7B2tNnmIJoLu0ijhK6z5lKEtif2ov3Z1eROqd4Xc1dzW0axRdnARmhm4rgvpU9bI4WlcUHxG4Mok8iDXOstPW9Kx8CG1NNl1aVetxMHPqQCxCrJhkZYptRJXg500X3ocWzH7nah6lFMASQACTqnhk5BJL9QodpX", "c064ebefbfce0b846fa86190e237686707582e5d5c8268b6fe9caaed6ff9030793d1c20b8d78d13004c409bcac7fde0546498ec9c67d96d7b38af6904381f999"], +["lhLZDPs9Dy5BXIvForZ4QN85pLFK9QQrwQ7ECQyeRYSHONHK0B6J6LfaDd9CykMMiZLl5FcUlTmJ6e7lB363exX2evvQODPvYNCy0MnzTNXspv2BUPi8kf0D6ZxCWiL2MXmEhdSEUG6odt2k7GJMIyQaAYHfRmYcoXS6NTAx14cVFFT8ZYNEcm1n367P0YvZ65rea98EKYCyYeq8wG6wy4oapR48KGa2Q7bUg1JofbsMGmcnOI0ymyUdJDfVs7SDzVOYK01ITzrUIw92OhGHW5xnZrHsAv38frIzDGZulzrhsAdrprTO7tEDjBJbnlpFnvW9SDO798M1gNv5FZoLDkvdx0CU3R56jRfKXNkJ94mDo8gdfJgjFF0WvH9gfgHjkNa3ydUBKvxeZCKW2Y8oJU3IybbOKTf21izvLJ9W9MJ", "c9b43900ab7d85610303ed457c8554b01909bb7cc5badb2e3f001b6799f6befd9b3b261e33cdd58c1983e88504f77f8b695cf9a721eaece211ff3cb96e269b49"], +["G9hG5uUne3MiQ4iq9eeM8PZQo8UJ7ubv9YKEvdfzBG23SOZHrCaM8VESCQ6ueucIaf9vkRvrY6EvO2aeapnLCfxCHhbNNlKm2PxctDxKjruqVEVh11I5QIC0lonmMSXmzuwnIZn7fcBSqJdtaUeRh6CDIWlZxP3KNeFlL0ZAJsoa5BYBF3Js708mFaYtKPiWskYj3iJKWmLFQQvYoCrYhychKMpVoi0DPxlE9PDOm2efGcLm2jlflZTCkYuxpfFeHHxS3Cw9HZm3Zd0FLvCjeHQoeBpVDEpEuh9HE8TsuT1MTULNLs59FH8XNSkIU6QmvQThFw8vL72LuMPrtrlPJ2OSqmUORzTPTDFKrkdb9vEXvRtipVgQJBDilybyIJUrizlWiouvZSLk57j8pFEwjJUZyEW8jZJGfCcy0svX9ZNb", "c56e39e89d2c8e953312adba11d4b55bd67083eac8a0cf9b046ec5f9f502cfebfec8311cfd099408ff1ca2046bf25fa197d5ef8834061ff2548e36ac48db980a"], +["U03PRP3f91pO0ziMx50OvaYSIcRlVtbrNA2wG2OuzQfbmSKEpreD2JKjVAzPYosLJhhhYAqGvjk7wLh86654OpDIRU4M6Yb1T4QFOFi7XUApra3pFwTv4Fiq1GKQTtI0466L3qa5YYXwbkBRQAKpJUWrGj2IMOgSWu5Bjh9E3HF7Fyb4FQCyYpndjH7hN4m6l3ljF3SLNpHynl1u0Ax3NH6sCCMSOuvHFpvHIUZW21QFW6cGStc5GP1X71DcClLmzenYdpLX6LyiyTijco3mjqVuIqPpmuQg9h4oZaYQC2nRj0qFut7YfIMZf9lOKI8jbgqudyK1k00SdFCIHgbwZ8ijZwCojBjAknXujrwiUIZbkLSGqfY3fDJAnzn50fnJDqhZcpN0KJeWNjcQFvspg3a9snmSnviELOj6VLweRtHeQ", "8699e380356768df3a4c16375aa7559ef94a842c0e76d78d0ff0ab43a9d94086fadb22e424db7b972b0e6221960b84529f5ce8b7f24f6df164c877850136840d"], +["OOXNd3HZ7zHvQkbRabYf0NzUqjuXfQcIcqUagmJnQtDWC1x4NLCTPd0ox8sXwilVn9REUF9G5c75WgJeAgXGqCKIRD1vgXzR8qHhRzrIYXlv9LcU4LXiozt2hyEuZww5puk3mVdC2oWohJirdymQPgbh2CS15TPkQRCFCyrio0hdwIg6GfLziCXB3zweYThkQ5PMCySHJCVkoe17g6U7n2GOWnKkuPmxEyuWnPs9XNwP77tUDYiYpRNoqxG02LMusyfezhNn58LioGlleKaJFx8cmFR0yOY7xZ12sJRm7L7mYnL5GfmpV9ecZ3ESNQnW1OO5XfRaMmYL7VWFEqKO13kQYHYkK6HpfryoEowaNysi5Qs9m1dqHdCvq1Wq4HrnVWdxK7XkCMAIRxpl9t9vvqunsPjukavHevfUCkxMldj3Bg", "0616f65874598cb860bd60add77c5eadc59c417db9f78ab415539cd2ca9577b96027796f1d811694fe925ba35e8168adeca4ea529091437854d1e6509be2f68c"], +["SF5e412s5vTcc7o7dPOOh3xGD9bdbE07RKmnPax6S5UroMdlC6KFGbRvmws6m7J6miF0B7Pu9SJWeqvfBJC1pwiuj8R5NMTB3dI7qkYs3PZOU1h9xiiLvUHMQPJnOujC3qYly2LcjGlJcu0OBqPCEm2tvWr4m8kQlUTdvzidOoDVNQvrTWQxLLsAy1DvI3zYoc6dsPXQTc0k9ekokBaADZAGtCUzvjif2T0AMz65qNUGCbtTUKaRyYnTw6x8ctBilBadYkhdnoEE711HPqZ6x6gp5lavUijN8iNrDLhapWGsvmSzSHSuwVEKpFSWqHOTAuztlwjGTZe7l8qWKK1XrZZXIo725djIVNksvjLcaUHvsImwuRarZwUSjDbUU4WarT2Ta2ij4ms3WtOOarLZQLVqPPKIU4J05PaKFXFKGedTgHE", "bedab1227dfc588867cd0eb9261f3ce2b5950edd546c748a5c94512af5ae470e88cd914e886319e8a01b14f5b8021d8fd563baa9a55a1b2ed23b4be8985e9ca8"], +["M24YF0t87DpGa27DcyjzZdrcFfsNCPInGygJI9h9dgaHjoeyyz5rePvAPdKMfmhRccO2kmfM1SM8JkJRrInmYRDtZJlWYzrABXu308xsLUFhlCric0cZLxYDNmiyg0ebbrteDLj7ixisb5l8Yjg3kDcWyj8DCDOfwU75tXtxj0ZkSfpF1KarQOy5EIVH5NFJj0JjTRIZtPUmHaIVM9hBkPBE0NFV9ZjsYBnyssC7uVJZTtZ1zh4Y5ae7Mg6MJapw6Iu52YtaOdJ9fezCgvYdHxOYzXPh6e6HtSRe7GoEwmoyleL63RcKw6wMKu7Zc4g4286vErSgqWwzxQerx3hM5coE0637Q0ZQLRL5i7ayPUFFhhbBVq9AsaSjvzWYA1bf33CWGeRh2QxPKq05paqeTah17I3hB4yW8V6d29doJqM2BHoz", "378956921b95b2b1fcf9873af5595aa5623c05a45ae8dca1ef6962b9468ac7dbee91bd65d8c4994c1a17c71bca7b3559e239a3c14706a6f3a9a55f93beffcf39"], +["Rx8R26ZSTG80VN9SRRTXsiJKJK7HvsBp1tPVwact3Rp7V5WkaqMq1eYaUdvdhyY8pdDM5TbtmRm4hQ08GwHTwaF2BfMkatjy9DYYeTMnCZjvA9YblErBBmyaF2L2xeJEAyHkVS9xHyNzTZCLcCfwqTjYmYaFu5SwQ7jtH3D5G9Faz6jWDEmlDTZp8XrbLE8AWbrjGNIbDlitkClzmib4VvsTW6DJJEqvUaQMp5WS5jJGROT6ZxzUoVixBaipqBMfAfz5vpDaff6cSud9BjwJSFpbJ6c2lo9PeL9aWbmuiXCKC0oqtcLgM3ieQtl1g0TG3Iug7DVtBRjxpT5tdl8xYDqaS0agRE6yan4VhXtX0kJ84EPSxzyIlEcZsSo0LYTDEJPcDkdhpTtz9RX79zwOh0qR3MvH3t8KyAnDiez3su13sPLeu", "1ffd810e0dff784bd5db739b205428de4f1de418b7632c739794da22e9a9b3c9efce0b1b25ee40a4d612adae92131e050f71adff5889eccb75c85667f72d635c"], +["khRJh4xUHZCItfwIYinKLK5LjbfeputLAz635rTJ6Q6267gRRIc0iFv5xraoy1QRWH1TZWDjL1CqsLSLORRqaqXteSXRtmp2cHFQZRpabguRlIoY1vpdxkIfUk2CvDOJ8ywTuZY0he0NTYbBp9wDshYV2AfgwvG2O9Mr1xjn9IFY0QNrgamCjOe0doXJe8odsheX5Ftj0q5KtNMDJWZ0gVpgkVhczWTtjTib7ZDRkVJ8bGUF5tXM7gYq2q3sXb96b9na1qez20scQ33dBFKG8MKhQg5FuWXPSYxgsM3hSbGuaDdOcxmcvLMNdFNpQOBTd6Tq19kaaqDzWYMjxdXaKZOOcgJftL0mXeTrGlzP0SgQ4v39bClB2n6JhgMv3BSMmhi2KnMOtjz5trC2vEqBG7Gmvx778Fsnf6Q3o3Nhld7tT1HZaY", "45517e0bdf7ca7223607ddf72447981c1316b0d2a0324695c0c7b640e20b6c6fc50a5317a4ad6b5c6cc6bd308c281b6b81047269b100c4c9b3edbfd8f9a667e2"], +["Q3PSzW9qGI4USG1T2tUiOhBHle1OxD4FLwRJodSPaCQjz00ycsrWVVIh0zHXu2VK3daYS3Eh76FQO80e0mepDkjhAPk9qW6akthwBhOmS2s3BWIVKxoh55ma2FxmzNo4UddTBYZswA8IsTPPdhDsPMmCGyXM1QgMOQ1JjD8mfnQkTlKvDoNnH3KYicozpUZ6V7daAMD5zKyeKFUih5DEtin8SRKEPebsQoGXj52l3XIfWMQvHLqXegj9FBLggetpky9FNL0vyUfi8infXsRTDABjsNxnmYMz3KxLRuxFq2LALYUBUKYuA5yrHATQeyzCQ64LpoH7s6ixWPWD6Qu8eYW1w4z8Je6PPK4dn9AlB91zYf7XDwykJa7Iqnm46vyBy2ysrGvdZWAly79Lkze3ctWw36Fx6BsxCfUKWyh0rYDemGNsFbY", "ecba4de4ed749313945dcf74a0116e19bf803a3b74daa8f6b93e94ff4e6d1e035da526945e765436dae25f951d8d8b46038b5dc5405d90837606f4357294608d"], +["Ha1jw61WJBfPoGSkKfnT4H2Jmq410eRmlKCI3iIqgLjcS33kWdJXQvHeaxvTaNdrzy0DgveS3Mh7eKesvYufelxSWt9xARLvgKTlsENHANzkhxKbDsJmc3DUZhjUyx0ctKqnjxYCe6DGLWKlByR1yH9Yz8SIowon1BkB5UGvN0qZBzwmeUHXUfF97IwUmtZz3jGC7r4cAUeRI2ZcJDGTWyjsqWwjNrilDsnhMZBLTs3dao2EQO4Bt6YVujRcCmAxrGmZlsHDpdM2xg58XkaDxKWAkdHW5ODeF4185yX9fZdAlFprSAbB7BiMBwWIFwzEZB77LGzlrYZKYCUyad7WJw7CzBPeePQplSBUnJP9rb3TCXBFjiYmNqNxX9k5SfkK1T3XCkw0BbqW0FtEl68MYXlfGojtTBwi6a2SEy97cNLP5LW8RxkX", "10084cb623a07831944600cbe0fe3166b61e01fd3fe33c6831a62c37ff84fd5e43c31536e0892429a9c360b7c891c16c3d8482a6fe352e26b224ea0ff61639dc"], +["vNxVphulg6TphZpXD36ULTEZ3I9La67CWGt9gGP8fbwjBpjFfTx9WLoARw5pDuGbvtJeBzGCXAOSslkZcSmg8W2PzTMyvkDlYVl0wZV6vkr18C3KEWRXJuufuVy2WuNNJ9317861V0oWt7ttZyR8NkpdZmx6bUz7shtMrvWODu6lQ8abkPqaW84Zpya6tLYRTBsbqBvt9AGXVVceqwCH6IMxh1egDhB5XknUdL3pHSMdVm6Rzf2uxDB4AMTByrWy2SYDeI7cr5BaLZ4H7ZcfeP6dvv3sL9KkvhTo7SPbVwoNFQP5K3zikTr5ZQX6oCctKatSlXT9Uh2smITZuw8JIrWvDHeS98dYNLHkLmXJcaK0hjoZp3o81pXXTRDlZGxA0RrdoXyNDjtQEwTtgu0P8mTxnjbWkLK8i7Yiss5AVFbepV5mQshdN", "09141caa3c34679c17e78c80dd70ccbc00a6f14d38151c03e63d7cda2f2bf3634559097465ad2442acd9dda6743ff726d8eb259656d62c126cc69d0f2880a852"], +["VaQTcOxodWTkjMBYTAcp597jEK9GM8wnLn3ygdiYcTvFAPkJ4ZgYS78ruuhGruKVtyQxS63uekiCOBh9QWgcA0LT9oMnnIb0YyVaLOTN6LTM2UsaXlttaZvzcWci97wkyIek3ACEi90nW5qFZkWFKVxTONYRXZ2hXCIRod7HDgoLCTu3nAwUeebT9IcVaZ8NgS3dKGa756WzWU4BD3tUD8I9hCtqN14jv9UOxU4fD1SBEMzH4blbS9dp4iauggY2Ce17Lge8GrnYIDiJ05hMqosfERmMrJTvmEx7dLkV7JJIjUCvoBJOLsGKK90dUHBUIqrzycLEcX6tkOYeVqkC6buc3BHEkh41nPBk0YZPKgj3vXQtJg30a5A6DfLw3K6cuEckjcI0YhALv8TnKLhgNjm6tpf1tpjShsXWWbzdMOBoHzfc2rzWRV", "4a1e02a619f7ea88db5190c69f07cf42a0d1dcd1c4f52ceace55734d837c52c77631a919e34a45b8941dd5bc5f1e451283fc3b4f816f778e9d8484231823abda"], +["AkVhSQQjRK04lbgyCX75gmLbu3vgEiTiPYFS2pMQZ1irQY2X21lfucnsOlEIC8eBWYmLNxU5qrfFPxoMTCNRUD8n9iRud5isH3hiAc4TibsKAEhOI2vavFmbTRlRsNSmsJb4pBt9NLkiZy0RjXy2Yr2fBr3016UMaP46o1pMLtYKyIhRAjT2VAGoU7NXxKoL9Q5HDPSdIQGbhyYKvkx4rEcCEFjcht99F7mQSRLy1NMSPaaqT5sny4uHMlWnI4Es04Ym6mnE1hYCexLGRPtmLyXLBM1RX90CKAif8xVS2tNa0MILejhCdDygqhLdZOM0zCKcIpwlkmvR5f7mdGCC26siXpppB7KDsuRRCpxpc69nRZ4yIGoqryRCtwQVs6QruVpNJ9ONycTWU6gM76qML2r68Q4lSYkb2b7JVRQKWt2d4HhXWmtm27I", "583574a3e7aeb1ecf3a5ecbc929148f357da3a73f7884137a585986ccb5a6508796c8ed4c828156971c2043cb742f523ad138dec75405473d6fce3f3d66ebaa7"], +["WPCYtUh8I6OIUCwMUGBuSBrc49lf30V6IdlT7PeHXPawCS0OylHWi88EjCmhMD5vX0C8EVVY2UtTD21q7otVGG5rsIkNz67lEiBeE4xhVpMdiqq1VHXjDtDW4wP9zmhECcgu4WBNPFkMtmUGImRHiA8GksOsTN6iUro7UygFKGfXtB8pmipMfSEDli9IHrLWNofLKXID6b5ZeUNj6P23JbgilTGiRjpqcsE0TlMplJz0kCOHOlt3gF4KIdrm0GAiRvFO5TvLbmITj4Ary9XKFnkz2orKhvO9bvwL4AmyR9OtbzNYwLukAhxHTXYeG64b4Rag4nn3kvxB7VrsdYkZuPdlLAEIzIipn5kNU614PwaqF8MteDEiOedjXA7RjzxZWWvZt3hS26Qipf0ff9Lyxa0HpoLHIwxoHA9B4ZHxS2hcxjyIaYCQpfOs", "d80bbd821003faa92ed45bdea0d12775cde6a8c00994ccc45e6d1832bd229c7dc9d510df360b145e3bf7067e84a1c8cdad1f83a2b3cf5db303bb95d7cd5d6619"], +["3tiM144l2GMvFRQpkOIAxG9x52w1HnTE55YEMXJtJABlOgJ9OFcm3Tkle14oyokPNTKYYa1Oeps8CIuLe1TMHga20qBV0qXLLAb1PRHbuqie544AybI97q8IYqCAR7xpJuKyCqj4TYgsvN8umFoaIEr5Fos9sZnVhcu930WjwhIIkKw0NtgAJjPBZMriW0vLbz2qNZfe5DSFfgF1HJkvQypjwooArfJKtVO3cKy1a7tXzWY96gQQxhciGHE0RDejfL1SF9xsjeUuqtwwciW7N2aiJUwLZkxPyXJv8caLZy8MlfgcqUxhR3q3q7Abym4ozBqTCcS5MZmzmRInJTiL8PyCPtoAIQmbzKnrWrlBN86myEz2E4SwleWRXW3BJHQS82KXczLQpuEbtrYZVAFjNSwICW0lh4Np7wnOKJxOrAbAXhgOTBtAPqnDy", "3bbb5af3c9871affa6c5d1c257c89842011f72116b07257d136aa9968247a8b0727c49a6dd0a7e98a3230e1b48723258ba15cf822c3981782bbc2f4017e94e3c"], +["BPVUf68Q3ut4Eaai4K5sanzzXYPMQkvCN0SxIPi5EtlXNgigh4GUhoor8VK2pmTXqbwTPGCHzPLgKZ63sQ62QA5XazxQpfF0AN2TizlWOYHCnAkbWah74WBWI0TWoJU6BhmyM8vyMARwJiaJFx46YBzdLYavQUtyhkIYMTj7oSTAftvJZjBry7nLwcvGScPcRagvBFdwde8QtQV9VgnEuTXKVTD7qTePKnwIPc0ZHcjRlGeQtA0ue6kfGLtZ49jjaOw647tcO6vFrclFoCyqqAW5Ob88PzDnaAnXq3wLUBrJsReHrYLnAxUwFh6VGEs7WFTpXTxrlhcZjhcdFrNUFQ9sHHTd1Vxw73JN0bGXIXq2vxEuSaYuHTu7OLRdlvHGbV34osCtY1viWzHt6X7On18dDeqPyoFqaU8Bj8INWV52FSVCyrNb3pXtci", "0ab567c86d0981de7089972b3fe0d86957570b6ed6484af8ee2cfd3d5b9721684d20ad611ca6e461fc4207888b6beed2295269c0453bd9a8e44a078f1b47f795"], +["epaaXFhuCu4cUhgKqsSmCXNdkvplk2dc9CSZJnslBqi4k7zUaDXjNf1N3qYVkpqO7j9GPrQn8TNPCfgHPsqq0JXESxY38678mLa0YZowvGvVIBfveMKAaR2E3c79nunEN3uDfRccU8yQCPFpGMBM1UR7vmqF2JheL6HRi2tHwBiBWMYxiZ0iZEGF51V8ts9NaZD7TBoATkbYDD6T1RTdaFIFxTpbAj3ofnztMcySwMNeegW8OaW9OynZiXTbq1QMc0GSZgZ7KEl4nuiGhEt6CA8QgVuwefftZeEfIUa6jL0Woz98DND0lRPtnxn1kbIenX2LBaaLAzBBrnR7uCUnZKbZ2M3wcCazLFCp3l207nyJiYjSS7E04EXvp0WIfUO3wPIZ7bWIl7mbR4jXpxhWhGHBzGtPzwJ0L384UgaI1wTflVjtzLd00wouXld", "db56720ade8dabe293fc806e3b4c0771782206fce3f6f5dd50a480e71710643630aa9739ec4e03a4e53ba021332c5c741fa78d4cc65bc454c4479a82d82adf5b"], +["0I4s94JyOOOrHhfYW1dF9QR0GSD7mKIiPp3IqRPF9vOuwutWVSJFtsPOL9NuU5G5Xw5ftlkfDlfTKysSfbzYsVX5xyqe5OYXo2Ru6sLrEr9Y8BmyuoJxJokTwDk9ATaJRrhUA0Ia2mvuSgSHUPJyw5KPS7Z7zpjl4yhnIURdfloMuEt7HLc0m2kav1ZFXVo3PmYYCsPJrKi2Ml4W4KRt7jAfkD6BELVffIkb8CMFQbADRr8MLJNycVO3PgPhWHTdOwQnWbCcyJ2vRPqCv0QCfU2z80fl7C7SQVJmcTl79gLHpTU06puGMnBx6V7X8OAEhGwSnn7HBWSETn0Ihq3pDfesLDCEIV2dVKtp7GVK53kVdS6Oj1AlFU9efTbBbarPGM9wujKpyRVP4RMOiNPcOY7hgzYsGkbU5JUMxbU5oRnBmk1GxPPzyNFMFQpg", "d9ac73f6a6aab4270ec2a363846332d23146f56f25b40426fdab38851e9cc742b40145c9ba0b8e779000c9d6071f8159ae7a34e62a4982a6402c9c1cdd00bb5e"], +["sD35VYd7y6tPvVTryjpbndNnzKPn0aCfH6cO88F77BLfpQbZit71008OmseioqjH3Tb8enih53leTXWwLCygoWcQSV7DCa5a7DEbHPaCdD2o89h5d63z7aQzoRfQHm5uXipzDi0kBoEAsivu1sSuAi5WhGYN7ArpnWZPwtMTSJvlUpxTRav2zY1nHw8WQpeHowtuDGuCxRZSCxca1SpFc21xNrgMXH5i2TmHzO34VvjxBOEtl920re1xeRGlDVS8fqCYucDGy76jtrm5NGlWlz8NYG0vSOGFw5U4zaChxQqlVWN1vva0i8BaQJjqywZqjnPz4prHeKbhTrmVcJsmVsY6nEjpFOnXz9Ky0ihZATyidR3A9RVtxVqChBDhBRvwNRSUbzxrcCBK3fLcek2BRerZt4pDmXR7FflITqTPap13lyddpVJwULxgBg5E3", "4f4e7d7cd2eaf8d45f6a4ce1e467ef217b462444f322295f3b0e7a12c0f04fc88d821b4ad1b8b51c3d99c693737f3d58f94409e2b2bb6c193e72c39f854d9fb7"], +["c0e0oNxg0lZqgEN0lEK95VjkAK5yO8SNU3uOUsRnioN7bQ2A2V7AMPMCGulNitsvzyczYm74ZGTWRQZS7r35BVVQPr8pZFwAS59kJ92qcsraneMNc1cBM3jRPtqAXfsdOvJThmoAB4wIhihzz5Pt1cagGOoBUsWSo0MWCfwxtbLT0ix5d9ZTjIIAEn2eNbAiBnTZSzq7LcoQEBnbLIsWSiTD8qUSwthEa7eSaeuaShIBJYjJlYE7aTaYTgwh8Xs0OvSvm42Pg3arWwPTR2RTfUKx0O5JCl4fNGb5hWpjviszQhYl8ppOKeJjuBl6x4EHSLvbZ2l270xhRLgr68sRQiMsJDIW64eTYniUsRjGPRo65D52Ol5b7dOyju2OQtsRq9VDgOPme8TYt8hMNWLcfNr0psSgk8UbjRl6gHCV1quyJQiOQoRxDMHzlHkjpW", "be2a09c71ca3eb6b53de0c2b1dacaff40f099d2ef880a49a9bc4cd301d6e101ffa34f540dbcc7815f388cd17cfb0421b1046613eed7781b37839464f348f4936"], +["OaNAnA9RSDvbAJn5tuWzTQ1jSKGagZPjgjWVXDVX2EQSFvpR2qlhp26fA64H150NTsOwr93LPN2fKg3Y6bXr05mfRHRZRkpYKUmd7qNqlaJPdkGNTDoblkufBrHPQwUFhaGvKOaMgFiOO4gN6nHvq6tuzUPYZTc1Yn9HJAnn0hO2GIL5xppbQz9nNMUVFYmkGNZmZHW549uNySkwNb6CJ6wpCQWOyhjeW4Buw3ZMAZAuYXi0LMw7Zm18s619r86CqNSu2JnnY5ugHIRUibezJmW7dK0l8YKAEPgyQgiskWoEH5hYBqbyGA1vGC19xhfUqdC403DzyH1NviZxKebl5iJiBf9IA7CqQbGZzYhS5P0TTMIdQwIZCY0NevvteI3YSkUuZkeZNA5Li5zlWJeyERQc3DxFKnMeeS2iyby5OzFa0Ne0UDbNsvGRT2GnMhz", "86dc88fd6c38df7c56d856645535a14b8f737c74d4ed65904f5697e7179d927b2061ddee13f50720d136352b553087f97b282d9f0ac5372cec2a5baa60194dd7"], +["FsmMNVD4WY6DxaOGJwIeagCjXDdDMDNkYDYyLBUYTHDXB9RNm1Wv7rX0oId68cs1rq1Xbno9WyIuAW1atIiFx1y7L35yPzSULtCNEVhEStegdETvor0QoNUMSR2V276GGpxudIhgWDJdXAWHYlWHjrCKpYie2S3sOYHEkySN748LYwFxDclGcOnFa8gv8O1pecEgGnWMjqYjulVJDjhyZx4ht01ICllEO3BswgvQ5ygiLKgaKkqMQjv1ziBz58tYooMztZ2lHvtjbOrHDTJHhihXruHDHmNSwEj02stMpuP8Vb6UC1RGikJpiup4ypX8Jd5RGuYfy4SoUKDCEufDxrSPCdHfPhrs7cMYh3YxNLAlB3I8LaPAxWvYPfPSa9ybs5TOsgl773lieoxHHI9YoExzFfV0WGXhqButIGOgx6Z9M5xGJOw0CBausbEesWjM", "36c2062ed084672addbd1cef8de1102210c359e4184e94e72fde4ce382c10a31d5de5a14518284b1a35b8cef94112cc02ed69c61ac3a24a0dcb2975710eb358e"], +["QWTqEj2MszJTWvzz5mfNbmQaxcdfCiMu0Dbq6RqnI42QRTNenV0FeGtEIsZjHBCx8Ebq02XR1oCUFsatmm0eRcOvmhl97X0tJ3aICP2d4rCxEIKmhU7ke9D5gE94wVDjkzPdKp71ayWpM4QLwHqWBMkyrSYG40j1jAP1Eu9aGTWsSQkCCgOkpz4D6ysZHD4X7o6VQZ6kzu6FujKWP97lyHegVs9y2nhJHiaYSvsdakjQDCtHuT2lWr1bBwt5LTiNFAKMy0lV3uuVPdCXokA5BSs62leYhFHVFfd7cSipp5mDkY3NUYWAnmmRsNOOq3QmKYcHbN4zhMMnhl6AcDqyXInSgToy3BYdkbSXDUAdwl4ldcAdE4q142tv6aUnGySMAA3BmJHQ6SBkVummRcKnxmMp4rUoLikuebwFSDt2DQXyVJFZY79GS2qkxjc6rdTqM", "212f78f30d9bb2ceb5f5e846350268686e946033f6b865302ff962f77490c838cfb306565e5e7f5a5d9bf78fd7a87163934103e4e20661d7a5fcb74338f981a1"], +["Uae262A1tjIVDOAB4ilRu0zecyNbpcZ0JS4uYrDV9m5BMtIg38qZUzMV7xZQPuQAvQBejv8nH4ZVc8E36ACzkk27qnEBFmlTqprl3XyO00mE5pcYaG4U2CtS9meLsQBop4tzeEUcoBBrpVTAK0HYFOwDzmKYfkYi8BovBQjbQpYynMVPE1eGlwS5BPoSKuqA4jTudSMEKFzqKpkwUO5wShmZtvlpDm2XwwYcl2hJ23vSReE4VUHH3lCGKoCJsPMWlpbNOO041sAQTsH9iIRBSl1PxxICD4s8UWHzeTnoCusNY2gbE4fc2Vc1H18qEBNemyNhTxDA6CwbQH2MVGoTDWUtB5Ie6J0kxYcEPodb0ywMzvOdeRCwwtotD5G9XSNscd2IaF38zPmn3Aj7hg9hKnSO691L7C11rTryMe3ZCWN0ZjlqixZhmURcCpAnklCRq8", "beccc9bc69f28dc82631e7d283e82b656e43950cf1d5c5393a14c16053bd8898f3ac5932e4e043f134cca5e9b12deb39b1817b435c7bdc84d568f3dc647021f4"], +["kq1ClxSnIlbPCZNuNJFNtjcY0ow3BvryiquknnXX5esiZP0RTGJ21peMMMUJ1RSoRI7jUH7mGorulZMVOusssu7uAqN3inm1FqGJwCs3Gdgrqn9B7qbnmo6vpdndVODxV0lenFOAAgqRtz4zIQZGiFZJy2ulA5gfEL2FuP1qsSi7a2Iu8gEXUoEkwDZzZTGuHR2kjh6WAvNnP1OxH5KTcQT8EZVhyCm6PjePbF8ruO2NYuKVJYqj1vmVZDGlDwwI8FvFHg6DCczJCM8uizX6lZDL7hQRBEoqF2yPwFQvwvCWAIs880HdKqeZqDARxWpsHMM3QBYjTJ6FIH5OlIMcLQuU1BGisdmxhSLEe7lMlxi5bTTaRyPNTQ9tVDSE5G4kUBYe6lTNkDixhw6z8AZmlltmUfowRABJq1we3MB0l3l0hEenP7vC7SBHtOdNxu4Qev4", "3e68cd823371d4c3d8a31802b4dc4cb445221aa738da92a43846346ed4a293441ee9d41d5c9bb1863288915caaaf9178b567a54d74420fd7a926f2e2457ad88f"], +["Eds0bJswKR3gjibG8ohCqrxKROTNnX61i8qepTKiKz1Kpu4XyXi42pRQGmznChTv5QaDObIwVvmDptglyOPCzLR16LEwQc5hSmFNSy6SrZS9Oc4mplgtWh2K4mL9KzzsPeUwJN6I2y9LrPfCDmDP6fJZdBRLVz0NzDypYeeyLMYiKx02W1SPyGqFiZqoxtfWAOJ0uiHpTlo2IqEoa2EajeChAt7BkmTstkxDGxX2SaaHBTKTPl2c1vNTwUJGA8GYTqvEaiqI2CUFMtMEsDjegFu6bi88w6TyBc0AIbeALHf7rpAJBbhTOxSVUVc9DrGxvdK7vfy0o5Ef8SnZCJG6vIH3D4XDBXtGZCwQuHFfjBCEBXD73NBh5IZguE33hQw9QzsjfsKv5saGehUmKVMnlWRW9aO2yQla04rwUB1O9KDWHejPxewHaK2llnNqUuLLz9m1", "a49e728196ecc4298e3781bcd4d5afb2936c70a17a32bf28ef013396326d13e343f39f4c94e1af0eaadc4f47d4caa4b51d1087c3b518f8fde6bae71e85fd82a8"], +["9djl4szMOPuGoWOo4ErClU2GpIAZxLahi25CYS0gjVlwzh2kOda9xliqSAYE8gLCQuJvLjRWIPPO3KMNOMIdIhjy2sCvy7lEi6Zte1bjx1YVX7EVqSJn26k97v79pxAsP4u1wxM5NNYtgMAHTkfKJA5Gmnyl4BYmc10fKapcyzQm2eQAao7mj7BGDl0tYtm6lLcaKzRipJgTSdZ28XRvIbuzn219JGa1LLdcxqL3BKFp1SKqDLbLBNS5VbeYJHE1mQUt1cmhEM2TJzGTWxAOyv31gj7dn9TnoU0jLWQZx5p4Z6XG5uVhKO9Imovk6oNcx6v4cT2XXFteBoRw2gLr2vbXakIhLOt5zDjJQj4jMGqoTWx7sIUo9odRPxGFo3d70EQXdktaHLDPsNpuAblhA07NRF0scLpboE6gDqYWXMz6RouNZqVgkhajLETWPS3qC82tG", "e8d170a4a337e6c2d5d9ce4fec5fb2a2cd78060273450d6a1d1fb70fac51ba3c76a636e7156afc8304d614faaa955eea003a83df36c3a09f846a8a6b850b7cac"], +["z5LoBKIWFJ7GLFkhJ7zJsGwD4meeeY6RFbY20YcOUZcCJtvycmA1viR9IaICkGy31XFbfGLZ6rpzPKFLZeubJhh2EQYAMnHIkEQ24VmP7c83lmKXdVAlJiAzdq3Em6c6a1UgMQ7qPFE0gznuMmJClRoF61AWOAdZ0VZwjgwjHqTUau1NfhXI0eCyOkCGv6y2D9IgGcRuyrDJsoiUJoRsZUMFiB0auJD0qKymGFwWsCafogSijVfTLLkMWLKwcgjoZQbUI8Lth1ulSTvbowQiiRmJUBz1GPCBSSknIpB6YXaUNxMevV3wQvPC4sqZhYzHPZxFeGZHL1PO54NSX0M7PpFmxOWnoPoNESzvTA4a5mFlqsSNakRslKwGRljdMq6iHSMLKMLuWQIZiKDZpuZZ5rKIKu83qMSCln00wjThTxlgxJXFiFYjYTqKtSRuJV8pPgURht", "690fd4734f83461a5f76505b9544b2c926106f6e24c57012f11874e0914e10a0cd2eb98cf119b010a0bd904126d1d5c08230d9806bf49c0d7d066a86546216ff"], +["HBsNY8OxbtLF0H6G7Jtv72fk3TKzqLgvu0G7NM6wnJE6NldNsjDO8DYG0S3SALWQv52K519nR77lBrddHu02PxNI3ECvSbsU9wgeQ3ylMR2Lz497YKQXbMl2eiKd0qILvhUAeIKdk3kWHpFhCHwDIY8R3i2VoyfvfUokSdPgF0y4appzWE6HaV1sHhTyUedW0PTcX8c0zLo6GQT3kuN6H78OrmkTtTEjqyM6US18qKtuI17O5VB5HwjP6EzTNWAzY0KjkpDNvpEbZAF7HqqjyXw6jy7ut5SIiB4KysSXQf27gKw248gVVl6qvN9fBkItoXq8CN5UoH7cBklb3L5PSAuFPQxflHQ2CVm8BH5a9ejQpzqZlUB5VyjbqpOpOeeiAXpRNI85jp4rpntNs6vFaWyrAdtl1SK3MmsEtBn0VdWi71JW6fYduAeTWa2vuHYmLRbamrA", "dfda06264bb7510efdcb0060c0f2cb1064399b673aab018e06cfa25cb20d982cf55761b2f75a9f63091ec8525644816ea7a261f6fc34f25f0fb57e5735d43fb7"], +["vSZzWIBYuAqRBJeg6fKwAg8bwBprtXcSxkhnYpaeliRKPMpFsyd1aO5B6UEvgBmjDHIypdGcCMkfx5r0cFpe3x8PfiBFiVfz0sgbcIcUzmuwZJCU2K6mns2RI5QlmBRXAGSSlRr7BllZZFshNULjxvZtTjJthRC5MP3q8jAIpgbZftKMXQECk9q7pIlEFmFNl1Inm7TmXneu77WJnpT4ddwmqk06z07z5Au4BmPSV4TVb6uM30TBLvnqnFRrLCbcyGZV2aImFUBHtlPrxYIiP0Anm2MnIlmL9ISGuQntLoJprg7OGgrFLEuQu2pKuhFgeY1AugdtCNcCEgXjH9i4t9qDtFT72KtLnIKfKezdOuK2ECj4pgecA1SGZHT8gLT0WO0t8lt2GhUy6sZRl4ktWrvV2EIlkQQBNOHHVUsxc7chMAIWm8fmM3NuLkh1IMtEHuaYOy0f", "1445952512b9219cd81af4d398e5784cdd9b4cd85e5d5dbe5906c3131ad4f29ef45458c7c02a92b5774c65f97b31a203e9e8ad5c830aabd551fe8f58da091cf1"], +["sKi7uOcqO6aBPTAlMm4A2KiGWnfVqDDXqLUYbVRGLSRvHRNTO7fsUu0kViob3sJHywDjpLSHtGmDUvvmMk4E8VpvoJEgcdqKqugosuGDgQSP8EeJ0ZRocNye1qV5E0YMnynhM6ghqfESjgYF6GCJmh079RzSA9Fkt3t30A3dg76bophTXvxXGnfAwpWbMH5ahVRtgjHhtsLsVU2G9BkegkxbxZFgu0USrNsbbeIcjNejO0IjwLCLaOkAU1wdBg8qqKlVXLJHUfucvfKq8S7dH8W2bKCcELT8EIdWpPSCqcnIUYGKrnm63F1rLK0N7LqWgBCT7K4pCsI1Aaw8BXw7e7JhzkpUpmOHZId6kAMnD6Ri8RG1OZclLc176PurFfRH1CEn8nFMpbWOLQiUExtHctmxbYHFenWuobLynYsNWOo3lqxd2uCICzxGGnsipAMAiUDBaviXl", "f7c35e96d86092d1549a564f244027b78d2d051fe3cd714f4fb039018e45bdf0673d8dee252d6d5dc70c97aefb48efed54e847ddb01715d7787c94556f7f0cdb"], +["K5fEw5qm6sP4iPlDneLvzToTgOPkAuC3sulLlKQMd8J0zSG97X6DoVRrsJbKD4FUwamvIr48sJLc9V7kbbsJJ6FhyU9wkTA3YurXGsID31jKVi3iLJ37PpzPl7eB3vpExieJWeOH1JbSzF0RgSeGhHibKscE6fpEcMmcJsltGBGY3vZiRwfNhv4JlC42RyC4Rtq4FyA5k9rauE7UhZuUsPwL0HOpYD8QWud3IlOwRldpsY6jZzQ1UYSmAL5XCmBt8u5W5qagMJOeTvN96Evdsu4GdXci1MSaGfKCxgA7NXM9M0o9nVJIbLIdxCDxXHqVgbOl3ZTZW3IbWlFcEVzdGupK4oXvCy8ROjFVLfVNP2qs8RdsMPninhd7wwBVf1dKDVsOO1AblpBke0oLmM0QslBTQqoyOAiv1mOFmcK7bc7v2SpakrCpTE6Ab18y5E6fYtDXxULVQR", "2c3b7532d85d5b2b16ed8bed3f91d743506e94a6f71bad2ac0dd315badb27ae8bb81ed45afe19dea6c71a49a7e8ed88122d7b0747fb51e549cf24c04a3346560"], +["6y8hx0hAz0GAnYo7ki5cPGQqLgbbBC4zK5KmFWKUqyWjFRWBcgLoqcM3qNkxyc2LTzUKJ6YWlrXO8A9H5yi2oahlsqhoOTGGZhPx02qTyPmdXFB3on8VhYsD9cgWimi1NhiyxohT6GzF73GF5bk7DS2CXc2AxTWbZoj6c4CwpO3kaI5wZeQBjiSLcjsbwdVBwSMkUuYLYgElEGqI4kAGt6ngAIwQ1d4gk5s1QdUoviVbH2hfoEQZRpSP7ast6oTCFO3qtp4qxQJUFxrqRtkJznb1KatBttsRNoaF3Mx4f7yGo0MuTCiQxbTANiGO3xGT2DB2X9jFOYM4Dm5E2PioAafAeURuS42hYSXOG7dQkn2T6qyGY0WJpd9PWCNaCic3ndnubAn7dtxO9ElMZdB0aLyP1sAXABpLbJ0wmKAl1tkw82sE3nqYYGB8im2jBWJbNF98gAAYS4G", "256af0351e4440fc1e3ab201a4e9d7014312e6b16d2fd92a273640d3dee73100996588d5f3651d1835aad2d97497042dad59249264f12ffc2fcec3a58920a7ca"], +["USTAVoXrkuXhJfdpYwfv24DNcMYZH3IdkY77MczTGRS3GpEGve6Tod0mrTzMXmRdeim2mXgmSkGRhySlmgzQuvJqYzV7sylk4NTOmAchY7CnBNpsWFeFKsUZZc5jUo2IIMTJQPy0NUibjV0ImplQ0CvFoNUd0qLAejKohUbClnsYEDMKeYJdJKxGU3xgiQPE4qR66259npcsD2qJpkC8lAd3MqkB8X6aKuvQEngJscL9jCxA69ZI81FJ071NXQqOfWETX5nL9kiVgDm6xyndut2KDQmM5oIkt9l1YIzzqIdoW9LAr0L6NyufZrvNZQF4wydmdAPWAQ9ejWI6eDA41xcjqECG0lljNA0497m5n6xGIoO5yYcs9KrbpLbbX0vyn9QqOPghA5hJ1RpAbaoutfa8sKgcoclGBntImY3EEdaOcn0Sf6mbRTqJdJkqydRebNNVpbYmhV34", "ace1127e6d775f051372d6a4bbb048ef2a21a578f78de26a47e00e4ba647b570488e530f4ed67dcd2feb35d2dd2a1ec8b8fa337aee19bcc4c20f23c4daf2c8dd"], +["sug9psFxWOOAQWGp802dfONEIaDzGBjemD3SvLjov4qZjvBP5zRZ2Vj9Mmtms09y17EhlxNbqo6AnE3jfVsUYNlni292NPWdYpqDVPKBo7uALbNLNhIXIsDfdMmidVo3qrS1pkhB5EBX95SNkV5L0bmrGrsru5BYCIzzQTfHBuAt0TjVOMzG0Wr8bY8j3XjL67QGC85m0p7S0OJQh9f84aitpkAVVDYlzgKPiaInJiUNzaghHNT2WEhuYDEXd2iUbZCAePQVntL22zu2gDs9h7oilkhYECmGKwaj2ldRS3xrrhmj7Z6fMOR8665C82CLCK8RH6ptLQ81J0uPbhwkY0izQFIZ4ppNPPCNm1OlnR46QORte8IHMlkznIMMJzqvbJMW7dJ7bu3DMvLLzSPvjfa0niiT2mItwOT4ZY2OjibIk0ejihU4xmVT7DL9CvYosk2CXIV3JcrgI", "a5d873dc894ca98bde92fc0c5a7915459b679311d5bf014247449e744ad4b881a50bdc11566819085b0a837e1b5c7fa11bcb1136a300ee73675b53f16e521908"], +["rkQP3eqfMeufLWSI9JOdJtCErlKR3Vu7K0hCi55DTeByQQJ4fM9iVcw7vwo6ZeUsCRGxPJyNPrLdhVp4wq2ZLKdWwpWEEhW17k7POesIpMmcQGLr2ZDrW4WYlN2kWn2lodqZkyTJ5vPgSMl62hMuZxm9UZcuxgMXZkc1VEs6POhExIS8EvCXNBmJj87RmsdqJCvCvC4cmgCyj4DeEh8zP5VnE5uWukAhouGsLQzhUJ5YeTn2Q6BUp7EldZvnjexyWDQ0JK5gYqxGvOHu3IxfQnbBi9j41TJIfqrJwNA3SeGEA3WzvR1dVbn2B3T8qETFJCMAp4bjLxRw5WCljoCA02oL8U1Piiudgw3uGXwiMqTVvsGU2s5Qsmrf0dYJDo4LxHzgOZviyZNunisnCCqBFXWcsYCavp3weUfwOWwh2UdZ83etsJElEecNnsuUCzgoNUeybwo0yJfZAb", "8abd7282731ba9436adafd1b2c029a71081d093cca9655bce30b4848df558da8fbae6bd04030aaa1703002fdd94d55ca7d1655186cde663627105ed2e7eb1cf8"], +["4o23MdM06S0rCXXVmTybl4RXEeIBrpwLNqSlCQMcRX5AYO6ZP0I7XrNJc1oHXiKttgABGX3CVHhPbY95x4n5CblbpSgGOY3c0mc04G9r6TS7J4wwNSvYX3W6EkWYTRxCesGQlOvKu1XXNWU63g4FDKmE18SuyBFesPaxAvzvEOFKubgvxhvHGrXRjgUerks5JRnrk5aRVmdWWmCT2EnVY0hLFeqNW8jTdhRgdYxxZWyb38ENGBF1ythIZ6JIOYazdD1HHs6vwXMoaeRhb1bwOTYgTbSZtBvj22Cq6tME49mtmZSGWQ2L86q4z681bKKBjQMgDnRSDCKdO5Vi1CTX5NNTRmNW6THk5FCm53rdyDCzt8CwGrnLYJD3PtgrEMt7KumZbi1rAo8zZMqGeDal3bsY9Zx63YhDocNbYoyU2WlGJ4xHs95d2YEVqSfLxCu68yyX5ctepz19FqL", "3c4dc5da96bf2706634792d06ab2dc72280015417edd0004d8824c7ff227553792566e4c8f76b46b1a71dec3b7bba23ac42dabd34fce5fb78ab6b9171e754b7e"], +["IRo2zSdvHF04qmFJ80MkY6pb5Ui9umrQX9HYhU86YvPgQB2kJQa4tAjT8Wfn7iYPVg6weLonnqDuN74IFZGNCJMpUCmMa9VJQhJg3qDC1rnBPQCr9wDVd9ujgewjrCemIBVpGcaRrNalT7PR2U404evOUotvcRln6fVTVFGtvqLj1oMR4QbBBmUgoiHYvQFtSFxpXmYAMwt1B5TmNMxpSvnxn9n5tCSKfQpUt9mzHvJTCL5QKZ4mirUS5nlO6Od63ZpuqRQHmfYNrIQim4sWZA49gpoWAvId7SAusLT57daQuXJFzwHIXJ7k4nRIWVETRk3wYn9uKc572wohwsqkeCpu8rx4L4X7xQMJ4YYUV1uA1PzW761MTlTCKe7r095dd2X3FVNNeYrgFBxIGPfBU18FgUkBs2BxUHxJs1J3Eq92VIHX5pfTNTH9TS7AyHBAtQRagET3efY1R7RD", "c0c27446e3ab509912ef8e23c2c6ee69c2bf63619338f0efcf3632e0160de64e774f05e1fbd5734d1c26ab30aa38cdabcc5341f324d2e50ccef500eb842b7ea6"], +["uCNZGu6lP4XxaVCpKOAn4p6BALcwETlMWdp9xZvpvoxcaCrqo6zkr9wEmEZBW8qR0fCvzdHEC1XJdpD24d69RZy7fKVZHni6N9r2kPsfZq4qfnd7f6W4z1xgQHpgViYqqOoMqf1l3jjmDVTm7pvkl1V8z50MyXBgupzrcm8WjXmT8pDbz46xeZZgl3DGUuwvhV9uDX00149pVTw4uNr5IE4L9DebJBajPedS6dqWWl1p8FXgsYzhVCd2H6cjPG5HjEPDwDSzBUPM5qLx2qtqQo7qpjaK0czNWk9cmN8Qoc7E0sRhHud6Fu1TQ0s4SjJ0ZfeGk35BRun5sGMzCOIQLtCi5iXwwkPtdJ3PiV9XHpnovV0PSg3gsGGnEE9iRTzvLKOKgPvTcO43YwBRz1kTQYUCITo5djeRdXhg5g9N2Hfw4tGeRpTEfL2Yr8HzQot3m4mjcEvDJ0qfaoAyM", "f5691d786ca8f04158e2efdc84d049cc9719221b795c34b4295849034c050c479df3cae3e8566c82c878ab5e7c956faf7a6696dee99c4870b7977155aea1c85a"], +["1HKzDfodKhT5Zo581gsiO5OfPkweOMJzJNP9JF6HHyJI3ybMuRLlIu8DpLYqMzfVJ3ALgZWuMTybGlMg1lEzSb7ow0VaTEApxA94xC3rhoHOcHiKxvxm5m2AFecbLDEUCYN27Wc3kocOcJgE4NUIzauFk756vjE4YpYHMUfLkpHHO2UlKvrJmfzS3KMGj8kPGAF3hvS7bX96pFsI14dfrdQ9JJMrHs54RcvaaA5dX0Pa4stB88i1HDU4cVp1G4FEAw4kL8BZJFnWT9TjYYT4ZciJG6ttU6WMDpU88F512v10jHm4Rjvzck5bPYT3t7t4su2VMcaTMOAOOpdUJJ0Ok2k7gp3TSSOhuikzURhXTy2gJRht5Hvvi3RThVL93fUfP5YiL29PAT48waqZREjXZNLpDvxJc82uZ9ArEP9qtJQzwksaNGNd3e2FSXRPPX8WOM4AQVcezOLRUdG2e3", "69518fe81b02164b0b784b7de1641b8d2749cec3a2ccd5c8920db093c5b6ee8c75a0b8bdaaf416a6e44ae1adf06fb3e7c982e1dc5cab3483776b30e496b8c76d"], +["hb5sF6eCTmZlel5n1Je5F7Jj1pxAiSF1LY2RakzYpeaUziV0et5lkiD3SPcZzpplIv1RoJmLsyPuhDx0ghzqNR7dAayaXL8IFyYuRqNAuAI1KPqsGKX6HHeyCAu5JY6LHsT8nO7e7z2JcP0vKcdkZ1MZwERdVtZEY0sR15BKYL0LXoJsUe5FjBb6B2DmJ8CYaKKdkiXPZ2h4OvtCzMt9Z1Nrmk2tdPc6cV24qlkezRrfPAcRBXPUxiR9Wm4AU3L67lmyjpEOzUVmQXyz8O31Jrfj2AIcaHAJt5iTWfuHXz8kXSLNm4GrtRXsyVFIdTZS3H0odpeFAre0YXlnfDGDNY1pmLDliIUdA2Tr1RG9Ew3DvO0Gts15GKNvgIvYvIapt22EMbfyYGVmAmkMFqz9x0m1vnvfKJTmNBcGNvQehGdwTSHJQaKEki85e4vfypu6Myn8PWrqh1toT6CIRCv", "bf288f79608b1bfe2c3c47e625a99ea65f393954017ab57c4f3f61e67a92cc9fd9c38d74edcbe012009d0e59e56e551fdac43eb0eac64fea3a178a3da2b6d5d7"], +["JaQbQ15C74KaHyqwFCHaW4lIZOOSTmzxDyR6UvGFynRhraBgMSxIh9v1lmqRp9gbDxVErVR6ASPfI8SBIZiW1CRATpvs7cTTSgkgpkQAPMarc13Aaj7HNRfnc7PS3CYImVEaERPNr0y8zZEXotyn7KG3oeBffZcBCweo3mKeGLXKii7Q0tbEwgMF934EuZJlLO4xWQHGXvmX8I0coOoK2S7Z8gj4OiY3aN7fXRAbCBtM4FGsLeB2hKcSksNlAhNoyGTKIDWQGHNoHssBnGr3FEESegM4GMQu63AKFB7Q9NzoZCi80CBxpq9FBCbotMnRhe3U6YJupvyJRKSEwSaUXVOwIZcQmZzz3scSvNYcP8uE86LFenWeLw7cVzG3SPN1Yiiv9xivK8PHfWUSoI0shR6nGw6AXxUXDOgH0JhA2rXmQIVAamZGSxMMCskp9Q5IEI0hwCo0ZRnFDHnLC3tw", "74ebf61f4e458b2dd311d2fdedbbaf3099713a850f851d0ad0bbd301fc61ecac3fc090d199e7b47f1aa24340a7818a010f806681c97dc24be1c293dee2b477a1"], +["jjkOpl2fc6cxXQ3dxsM0h8DrLR8vLyb3t3QhoXKqF9oCg9cVDenoJsPcra1Km2FKoAl3TOLmk7RjMFvANb0xQuH9Pw9nSsAn51HpLFedTEAuBgykWrcswHkxP7DWJkAT3DWRoMTUjWjtaSfo5RNXOpGE70NOZEapkklXsmUXao0KlrMZdXeKcOmqJtkSlAWU6cZgwZ6GczmV0MFR00luJq1GFO9bwEKYkUNwG0Vtxsa511PRfcRDjNbgZ2rFcLRxizrX8DAeF0cyANyGkDQ9HTlQu1ZlFYYAymHS9LKVNSKj3SabA5AgjSjcPCUnejNt9a9wXA8n7xWxFCXqYsWhMLue8eRhgB3xWqVQEAnQozjJG1If8Hj9qKZcuSOTd4wrS53c1x1UYEfo2A0DtJk7nERr8zBxAA6yZKckoxdlpzQutHkuFN2zNZA3Z6q6OyCbNXBlDIRTcLjgSgAi4tSCi", "42aba21fbd3f682ec51189b2c54b4068ace5cb6a1d1b5ee985b446373229a2629b3260290501c2febb70ad13aeb5c695bc6261dd599b4e65ee3b6539b7cc4511"], +["pzzyqe0SgZG4yzmozir9MlgdZ5uOXvqmk1AO2Cpe3vpBzIXwzQFu6Ak95wjrDv2kfnq7k15aeVpp4HQjNAR4HiYGpG9wYOgsFWVrinqCjJ7jBPQiSY5COTbOSlOpPiFqiS5CLVdweECi1XIPDDCnaZcknJhkDhB4KFLJjR2oznvop9rSaZrKvDH2G9WtZT0q2rXwWczfbTHwUP4GWfsjvC1DqGc3Lo2Cs0zoC0nKQvEz0Q3AjiQxX507WLw2b3lHRHxhcVDf5fEEspjCewheKEtzjqfD0dNX1qRZtts7mXCBQsR6Xid6AOabj0NTljkJjN6FxNbfjQyN5LW77l8qbuJZQ03fFbSicTqHk5dc1T1YEFPraRlxQexBtI3IfrjKqHQIAGBBxmf9BIssl4REjrHVz6aTCadiiWsoypDGTi7cunfKawxd0KrgtSxn78apxGFZwoJaZxtGiogMEcm0FU", "7202a73b0ca69de088470d0cd820faec425110d915bf62a779e53f1780b0a31a7d6c8f515c80a5763b9ac7e94f0f6ac344e1128da5c9f0300136910ca29b22d7"], +["o7ssesYNAfKnG1EM5yX6N8wNGpdK83qM6ySaS2SscYyEP0jaw3NpEpfXlskgu4j4EXzsR4xAFSbXhgmrC8WLDQ9U3aJbvwsDMiNpH8MH2HBLLTuRyEGj1yKbt6bhjyKGD8ZME17AxftjOf0BmGqU5biM1gXp5a486n9yyGZYPyxdJgAVghtxWTZfgsugfQRIAPDumR2TWuzTmCm65B4b7m1U6dVKvfC9ayntYGgbAyLt2cXXidPmzurp8U93dXdMSBOuQ3yRXCQ6XukUg4dxVP82EXMcEw0SY8ggaFpkMj6llAv47ijTdSD7Q4W6szyoTYRHcGqTpcBa3Lk1GnaHGZGXHUNj0i47u7NfNehT6ZBGskaMs3n6MO3ZZxaM2UG50uFxXzjqrmIpa3x4K2uw323nVWggwwpiBQxDdSYYFzY7ztnHaFHICSblqsDwBhPXVhN89DJiMS3wdGhVxWd8bbS", "be3c197c20f8f781f0388f1203188a7966130389b16bba34d7ab79cfbb3bc182c6328b4f6b3c11e6f71ff1f46ad70a7976e696ae9b8ac7d8afa794c023be4ccc"], +["yvZptD7RIibqbRfSNd3flMWpmJvlr346GGDsAxoZTCmvPbBMpW1pBsn97VwogHJr8wcXJgnvftIkoGEOxF8QDqAlZcYNBuNlv47iR1X2FBxmo12R2mOmWASCz6RZiSd8pNzxJZUcuSTOFUDjl0jmHulFArJw4EfmdcCcGYAlWVO9dD1lLyjLxQ2uqN4WSu1oLpwMqPsvo2GqwQBprbgn76TYzgDne0WeZDP9KXjVLuUc4G51nEvX1pg0bIlC2HMS9Je0qkvRkbyIZxVKCkGFl8BR4vg9vyRMw0AwEvh2K0N0qHBO4DTveSB899enmXibjUEm0yTHaQrwk3YR55ZJGlp7aagop0T2nhZbBARQ9pdXX4Lew5QbsgWITeT69baYXEqt6kmqBs3nRoGNk2rd3PROxMiEwic2rHhn5eHMshtq7X1N1XfN1hRT7bqp3PcCUO93BGpwCmDPXdhi9Zz7GRCu", "82fb7cef1d6484d117ac5a7dde6ff7b908ed67257ebd2aec53cbb4274349d61e0bbf40f182bbe7b0d4084732652161f76ce1ceda9fd7c4c44a737d4221ab24a9"], +["hhFph7PXvhWplcBpFGhNNHj50inF42cq4k94CwNoZaaCSU1x9pYbaA7QDLNQMAu0wP1XFgHp05gB54E0YzwVoE38U7mSqW3dYh0uWZFp8QiJg0M0Br9aFjape1gdTdMweAzsSd5j2WcVb4HNMaXQvrui1UPqPcOI9hWNmk8tIV2AtEO83mXbmk7gzkInZCRCZ5cib6kHnVIncbgKENE93LnXbVHXjxpn3MRyfbtlb8MqcfHtC4iKSbUTPwGsVlziPpiZM6BCIJWesmF8DyyFJ3bx8VH5LWhNz8daOB2feI3wU27JKCm3e2BzUM7J7O58PJbMeQVdxFy4lopo7ZjKBGTDkHTWACGjaXNHXV4JxpjRRnHnltsRn5eMDpN0fAbLgLQ1HSaWCdMzJsqFXNqB0zVNRN0j89KJ8Bnu256jty3st4P3QlOJHEJoQ2dDnWvOxx7q2Rozf4zDvhzrnfZpyJ867", "875b71c7acffaa0151d3c95f87446e3b2ae7e58f9cc90eaef475f92c6148344e04acfddcd5c158363a3cb0e0f31779b2958927a5f3d1bf33013dca3c0f1e1edb"], +["zzq5GHRNDXfY3cnVEUcvFiiGtvptR6ioFitmBEfoNzaaEitAZEldcz60kQ4V7Fq5Si4mUfvNANTgYtGHdY9JOA5vkkpW9E1Vddy1sVfZQaZVqSW2kA0X2SXOsswk6UCCiUSCPm4DjNrzYoiA9EYZ77L5jdoYmTh508jrrC29wGHP59oYAuzsaxbUUtH85uKXEcTIcakfJBIlTMBhW2nMInP57HmSOqSbTBRZIPUiczJ8XvjtrXLh4DSVWfc5HVBiHfyPuceCXexR5oCqRTa1lBcoqoRKvWd9cYRLhEV1OOtmAmEaenP0lre39Ne7L0543hlLZf6zJ3dHb1z3eDewKUbHblSSNqigOOusatrPmgufbuj253KNV0tow9EKPnLJeNfVSsbrrcvNfra4SmfJTiqpbxKJplfqHaUhAJ5rrVyAzvxwZXqIYTj6jPAZ7isjpIYrjV8wk9fuEq2gEx870ZqDVW", "2db298cea111ea5f2d926bd8acb9cfc9a6c64f68d4cd7d8486dc8a9795b0056848ed975bf961be0b18ca4fe294a8c0fc7493cbb3cc0eb8315299fde33c714242"], +["UAtq404CmJMoRDNA5DZahxSk5tupqausFOd2t9Y7pNgHmjEQdEJz1D1lsRXdfBCUgxs12IQ7yvoJkGRTrjTuYUliD7m3ZVwqZkwrT4uVhczWF9cn0OiHWbyPg0xynZdVLvrMdHstI04LckTctnQDMDdPjuQ9VyUgS0St0gSIp76nWvmXk8oTKSeiluTABD4PQG3XSBu7ERdpBt9nJ1kgu4oxX4BXZZWpmV99qy1GFNBq5KUZdeJJN5fgx1ZNxEsXoqsu7Re6rSFssp50Xh112mwpCckFDHlBWc4g0ELMAAIcyXBQDH3pGbVj4r1iO3drsG13Nv89XAkCvyePgm9U2k1B5x44rtTaCZ7r9YYMrLyDzWrP7do0K3mpItflF65sPS91AvGVFsnraNR6ASUPmQiiad7Tmp72enCke3jG0V6SmUJcuU0qQyN8VXFhR2kvOtAQv889IG0zyF3KJzXx8D2UFPT", "cfcd284f368faae07b57d2855cfb4dcbb0cbd44a2a242b5779faf7c73723de4eee7da932ddd83c66b154c8a5a3844d9f3cc24a7b214fb0df2645b038dff52381"], +["IZD7TZ8mavIU0WC7tOlVsiq5EMUJ00sN1485mb20el1YdNu73shL9QbQakcOogEiPTig93EiaWhIQG85fJz67khMYPB23QgwtznrFRANnZwPNn2lDuIMBw2bI5sTSlgoIX8M9xNrv6nPdckuHvomnYsBkbulGPEc9EdyCl1ejltmtbfxrkqVCsHcrof77Ff3z4HIzNA8WGb1Zjl6YfDfyNjIvnSuRps7u4eiNzc9NhwZHc46nn5wZ3nmNQPs5u6qYpdDg0AK6SH65xjsz19EAPv6YDFduvshWkIuFGpxtYrh15kIe3nSvuSBmmea45xChmbUhE7A7x6vL5cdal7BVNcMJAZmqvcg5nHFTcJ5s5oKLBykNyPele7N8wwn01YWSGUcupR1b4w2QQYRjiofxFwfHNwDKFpCaa9uELNyiWQh7dYPbcUvURWHjCyVlVhUDZcMMnZjtRtjLYVn91dZjc2Blxut", "e03707c61984f7d4953a6c3c741a7b6234bc0da555073ebaab15357d0e40eedd14e340399e47a8ac0efdfc1aad8f18d707518ea556fd7ef3ad3de5c0edf9f527"], +["fZ4gPSDlLEat2Ant35FlxcA0elAo0xl1DSsk3gsSj7peK8qTQZV7iKBoov1LmnSEfZvUOwt5exUBm14p9CP0iAaBKI7lWRXbl4Hw34PbsboztOLSwYK9tBhdNIpwz4ssof33tusQpamvcnzzb3iqIOkDD8FE1xEYIsmo5XX0zbjqN6mYzjAOrL5YMZmYJ59coBtYCqKN8iD71OWBSYXg3RfuC8hjXnKJjMef7eCVZgFboEZeIGYnLpyIzM5C2Q6e9B1KuMpjRk7VbqUOGej6cHvMSFplYd0gWa8oowGEmA6XPdyItqcws2SYpMqYmRMwggOLiIf1jgELw97Vdsdw4FeFs5gYkrJfQO4x6mZlKGZGy3uqTcbBYXraCUqhAtlL7mmuKkSKCyG6WpwMkiVFW1tmz6WZuoyRDZRGLgAUasvcjZWGiDhn3c5Jr30xiSifyrnmdmlopmh6osyFn1I5PnUmyfPWe", "bb08b483a4e38afc99a52deafde4341394715ce6f1baecc1d6ae2357ec9849f148633df301817b34316d485b17f15ca03da2ee1031a90263f9f7c74bc97f4f6a"], +["jqzpBA5txUY16Fj8eHTo4IRbaOqWbmSoJI97DtWHoB1oqL2EX5Nh7EIFiblPlpA3MFO4W1cm8GlLjqkPmhmi6qGeuKkVeFZfXE70MwzbEThufGsRvFY6HZT1IaPEc96eL7BfGwIXgaeesYFKgvsqtMn2uEUZJqaXjnl2u0p5wOH5am672QUMfBl4zb9J2pAJXgW2A1all0d11stOQpSgsz7u2EzKYW3092D3bvi7YimWIPkzcGRlgv7qJHTCo0MY0QagvST8fj6jrQz6bEoITBwSzEiAJecYwOvmSUfNikfsLqxESzXqTXWwtcGvr5rNr1gw61UlA0MwUsReyKlLV5z0EBk8ZLggG3svwPY0S67HyFR9yXwaEUivXv2YxEkJKfQfSbU7UxnCzTPcQTfKHbhQqWGVgF8JMaAx9CanrDiIL9vUVIRVaaKJgqNvVmxcIeV3k0O1t6LBirPXRH7AVbetvGAb5x", "43a75e7f6f4297d3a1efcb3d99ac673ab508f61091cb08e23df16a6d3800990f0848f0ca92709467a6fa61b86cb956d0aa2c450e2909008237b8fdba1a0bfc94"], +["0GhTIulXAqcucJVJJcew5MB73jr8rGQf79CRnfR6ymDahpc4pnQMEf9IXq6gYZI4XK0aBJ5YpCL9PvesVdcgdbYiL1cFl51yynINGMCp53bFVsTO0MHq3ZSDnFRzB75YD5MsQ9DBpH7XZb5SlTaFertGSrSvX4kDYIX46pvLxq0UsuKmakb5uUVTkCzmEBGcWEN0Q9fEhl32QiIrCJmw1Ozv0apC3FpL3K4a1gko4keTVlpuD9KtAtLade5yyCN8VGAnlcSWRId1o7foTXlSwIUb7wEMtXIpephT1CFMOSRKIzOyEyKcojjiO5tLCoLHOV8KWn8gtLuec2BuDKb0TYN0igyjKv7WVlQ2dDCl5TahIBziM98Atjs6gocGOJ1M6l7D5wQRRPCUtyjz3UrgyhncD9mK9vvDH9HhNM9ZoRgaqrTwtfow8gMsJwGBpT75BOadQY1KHuJJ6Ob0ti4qocSIJ59JRwi", "427a9dddf68475f7d8e10233681385d290e97a9e335beb4818be7267087e77c6975798861df9a9155fb4f2f78800dd12475e4a5b6ea7c5ccd4048624c65726c0"], +["AyQCoTcX55T1pmuGldQpzvJE5o9gSi216VtnbseTJN2rhYWduwvpkNA7P1DW3tcuri6VoatvfbqYN1cmZtnoFhQmKcnlkJAIhwtPCoBAjFtAORfF83QPk6zkaHGY8Q5so34ZSupzDnTg8bmVvTwSp9WeSuuzaZgOxBMfrCs17ufBi9vH6Auc7bIiIFIcZvmCpMbvQUTcuZZ1Cd9TvMPMYVfm2wocNYzhglwwx57YqM716YLRia3hOpNeXuAhqju4MCdSANobyOYjH2pEN30xhr8ngx5VG49HxbH8509QU5ZRfZ6p5KYCvFqiAraslpOlGJxSNHnysZvmWwqJZpo70lVuMxRlMKUNVSP4ES13cFkSrihyP4BTE1VJ7plwHv8opSwdfcdRp56Xib1tavpcYXz0d7eqSxHV1PFKBTF6xzg7rVqe4ZN5BemzVyXtNRZKMIyzDVvE4M845NJxwQFIgCkZEI12AhtH", "67e5270c942f15f32fd12a9c59a5d430e6c1e29dc08d957ee8e51bf5f1a108f65bf77f953ea5bcdff2547e23ba06db37e487cdbbd37ba595126e9d2fbd14e6a7"], +["AUrOxp5NLrb7rQs0yebnnUhBxTP7SwlazT4euUoYGSmwdzGIq0VAj7Fpbfsp4izcmhn7hu1uDJq5R8YWmrOI0dgeF8c1rsBOgKBhG6LVkdoBFbVpJGCfd3DKf3fN1Kep8Kb0e30G14mVPei7sbqItpZxhmSfvD8tTrsY67wmXtQXQpehNGgnQmKU1r85dNnzLybJxrO5WUknzZUbi3davv5LDCk1IYYjByOY8x9YYsd6sUPlsJYd5Z1KfyRvrgWDRwfwCsh1LQD866yH5jWv3u34nNj8pAfyFAiQpiylEhXF0GYkas3iPQdlg7hIhmEbTTsotOVZr9CNBCbjjnDXcJu0lTAqvj4MhmqyZjlfIYuwxEt8CGx0RXVNTmrlPvbyQqRT9SjA5XB7YFx12McY0vDth5ZcEmDTCiF0ji3Kk9vQCsM30xOCwcg62o0gcarOXpE6h8eI309gcvxNuBieF20XnpfTKuuXG", "0efd262a1952f038b6b7f826ccca4ff2fdf5c8cf89327922a6b6596f7fcc49a2d9fd19592940ee21b2b6d2b9723aea1be192ff3a0b81f62f186adae998ad1976"], +["UsSE8Vi15xDdmjLdfYLwo4PCtYQ5OWkLIA47Ij4uylJadGaJChA82zzZ1GRanFgdXA47uzBFnD7j7W8r6Iy6Sq5Y85NRNRJWUXJQA7QhUzgBDSxUAbxZkFptZj1CYJzrhZfbuJafuTgKyREDxbtweDBNBB46wznS8t7gOisckDHKDUFts8Hs77RElJUHu4gHMnyx6yXJ89acykMNLAdQCUaY1SW4A3Xzk1kihqHTecdj7Zi62wnL0xz2a5zUhJ6njqInEMxjTa1cTKFv2pxln4W2xyULDjK3rGKeA8KnuQlo750CcknAnj2BOafkenY1VBWOEpbyjXyn9Tw8LpLU0S6vngVvxumiO9h3ICTCqjGcIrHf3QSHe7hXdUqb7Sdb3y0ZAh0d5JBQ5r75YrubHQUVSksyeRGMzpWaZNlRcudgYHmmrLF44Fzp2dpzcMzKzTfDVs6aDbCQuo2kvTRecwWOAlhiMJPBqo", "8fe40af4403af777fa98a08e6ab6ec034d09c852f0103b764cff45664487e884229fd801eb7e104c39fa83b7552e60b2b1ad76758bf4003e56860d45fadbd000"], +["YPadYmOUK5izUQ98TKm2S6LTv4upHOk8GF5wdh2nU09PHvuQSXOdekVTf06HsFXAGg5zlsClI4QrrnCh2GFUOg65AkiDzLp9Fg1mfzaly8gb2okNnXhLQVHlyPYLcuz6QUh7k7LOujmdPsnry4Aq8RGmDwuYkwIhQOPxl25rfYy8MVCLWc4FFLQ1XT78HSKgjOPe0vB27P0mioxF4lb4SMvKrqyy1Q2NuZlq7ieOaeVvOcUi78dHXyCXeCR7jgQqtgAwWoDQ4iPu2JQRBIzhMZhCvOtgbBLg7v4CIAO1Z0hNPt974d361ZiVKHjR98mRgoHSUnz94EBJrZn0TE3rJj6QmPbMvAgQDoXWdvFO4gbGAKQS2mRwXet2cy5JHYTa3vKVQPDvN7kdMZU37f2OmkSDxrYOBNZIRjzeDy7ugW7QiGNfuyRimYEr2dAEtqAz5sC6uhrHTKLxSaPcm1rxQFOTuQB2gZb0hPV", "f6022d300c04b7293b725434e9f137828f684fa733faaae390c918e6e4aece62d8a6134a4240e7ee10cde0a1d0826129b7373ecea3d929f9ac7bcddbe49184ba"], +["PdEDeLiEziY7Xq6mEgAJOmfRXtx1zC8lbwmH7edpfMnQ0XRZFcBPvnDGQ38xg7kG58wGnqIhm6PLxN71cb9Nl8eEVBg23JTe8QMqnnRRkuCKEHMH8XwK1gew4SGAmKhmM8x6rQQJckWkYHmJnJvQ9KNKCnPCGoY3l7vvi3mVpqKodfGsMIrZpuxN3qDsyOoEhHaEPyJOGXLPLN9dudd9kLGgGmrRvwj9Aoww6wHawSknDO5YjdVLcWKkaU1Igm7pMdSiynk62vv6AONsOsbrBX7MQF9jFzsRf3kfJVSMivjvB0t9p1REqqrVD8s50rIoes7qGRJ6yYbWTP8IRtdRxk5TXAVDkb5oov2KVNGOR5eB1ovevpFn1hLVaUNiOIbxsLRanizEkH6afZehCS6UYoSqqnahLnWwiXPi7LBuip1nQX44rYI7x9lIxFrki9Imw6bEgl0ogWsCdezOOVPNXhqyqmDZG2UqwVHX", "0e45cc9ca60611fa2322ad21a02d6002b81467609e93c4f94f8d27dc71a21dfa33eddb315050495f54d1d73b82a1856733229c72f4994a47f7f1fa61894d38fb"], +["Xz1TvLwyTz1kaZFNYs7wRrLV4sEujJrvecGeopqpAZKnEZdtf4lS7HwFmWCrrSE96VTZ7HcAjKLsEafF8z9dAfTQ93BKPmuq3pB0lFth6hRQdo5OEEIzSPoESUUL9038pbiLQlATYbgCgrXxlm0Lcz13DetZ9tlStIFxTXqFHuOndj2EtvFeNMTZoXEUqj2KXGMnXxZvwCEw78CDapywQJ7eFRKVN3lYHxzFJAxWR56YdjPjpHf5voAz9uk3BbogC991ebi2oxF62mzEHnJtmFEv287DnjwQ6J1XX3yzsaeZQrwPs234zbfiwxCCGgdwXqOJRptL8VTy27aPKiVlswG62vMlsQLCEfd4vJc76TiZRIgsx1563CYiushwZLbJtNE0xOyWd3eSbEllHOcvTpEkOos5GK9dyIUCJ7nwvuFzomovDjZSC13S7jUd3wIp2D1m1II8MupyVUAueLHyOVFintz5HYyPIDpW6", "c019939b9cabdb053773b05b3f171cd1c16c6f306c6ea706046f56f0e357fdb4b4a6cfceb3eea30f45e081360036b1db9ef094b3007201819deb40c9fcf4065f"], +["Cm8HEDk6B8oL6sOGh1SwIbIaBqGn2pCz75IkXJf2mWHVjvZCx93NsROn5KDmu7LuCwiCl2ZpYcOkusbdjpKpNZHatk6g6oH1hUltPgr3kHexooea4gdIEDYjubvXAdbYQo7whOnTu16nWcU59y1DcFUkwbhtCVGwD31zl6jD6WX1hnMn5Ate3R7yTgznniQeWSldeezoKkEbhUlCNyKl20LtYteOiFgFXtKRjiIqVYSNGKBK8DWCIIepRYkFpVbOABlvBShF0jXgvZtN1Q8D55ZLSxQuipM336qjTpNPlS1HNqkXrn36gACcDFj1rX6A5UPQv5v9IumZTu0Iv6uhMS8isI8tzwvJXrVupI1qG80hMhqSIIK7uoZDVSnyn1vFsDVimLxVEal5bY2uzEn76iYCXNJnY1IWVsAkho6OnAHTc4J8YIGZM7GqWEhekuEixT9Qxi4rbNmankyKPG1qItU096PWHigzZEl5K6", "cba302c1279b0b2b8963cb57e7d1128e4e73844b445c314ed691597be350df954de931570ac6ee275af95f822fefe87c56d4e9d3c1decc2d9e9008a8c39f2281"], +["aDVlhQNGVjwyPjxYWLYH3hPSoaHMBKWURRDz52njTbC3iCAePIA3CYhrXTuLElL91KiGBlUl5ACcpvHYlvoYxOIWlmhyoxWhoS7Fe1JwbgZHId3f37hZod8ET2GWrJSsVH0wbqsB4AFgUqMYfZryLFGikipZqxENwc9jFlTuAKScHeI7YHAfED5OLbloIB8bGAMA0iPAxfvzMU1bGE2qpNkQRULrfeRW7sLm2haaGHqWslsRevgO95eBNYzffgyygDqe9hymumjRtkRnh6gh2YHkgcbKPAh6EyFccThd6QPEx87J06C4hwUAE5TE1LXvitdIfc6bviatT14mYzJUHl59q9nuFqGSiED48VPYNq2zdeYTudVTK7wqkP3Xyso3A0OHikMpEDb3pnA5t410Dby9hsBvNf8c6o0oaHjwBH44adCDtHXogchFn1FFPxFXPYgtZfQXDxZpYvjpV9aAl16MWrplk3Q7JhIjBaS", "ba5027c652b687665ea9634033c069590b506c6d89eb033889ada7e920db45d115b485d58e7f85f90ddf2c8bd51b20039c5c6bbf1d680b127c5f59ad2cdc7376"], +["w60AYOrO0Jw4EqI1Kn1D9sS2YJK1fLzEDMHFZXhPJ03RcZoGbKlc0oBREsFMDOOzyYyrdxRvQcYXI3Vrypxy0rKeO9OTPlpaCAkaZyL3BZxD6CQKg9Mw0glTPkkyWRcWVLGe6SjlztxItacaStiq4NTZhLxGVwroQPFox1pcTeQoxILyEgfvxhAZlPoH3NgCkXHTBpw8UMuUC1NoO5xEyh0IO0FGLeZ8gqwYbEmjgrJwQHd1N91z0rAMIy3JNOPPj5yjHR7YuhhefAdE92hL5dSnnuOUhsmjn5DhbkkWcOrAEsrCFUlgYFipyFiJEBv0tPLOw4g3UH7DNFjmJ8wwvotSftRKuKqJJ9stI81ppwxaoS3PiiAEoKTDrATVYlLcAZ3qJarrBnIUNi3KE2bW81nLSeyGiDP6ov3cULWWK2okD0rGbLgeyt7CMy9a5KYU3GJO503YzJrJTNsYD7Eu5pJazZW3ac8v5A2mLmmr", "d3accf659a56e1f9ba4fcb42aede8e6795190c48dd9a833ef561910415222ee7dab46948f24a91570bafc2dcec2526eb6a38bd91698ca697e5aca421224c54ce"], +["baAWScsbzAatdJ7IpBXw5P068TRTDpsrBAhaYApNeQoF1QxQfFXPbYHXTEiYF2G12r4RMGbQTaOo96nj8IYnwFsevNXg492wVQvYngzDoWz30pd36z9N7aLRMeek97T05mKDbo22bfhfScWqqWRLUugf272b2Dw61YNQPf2TJ7QsZAwYIknzZFVsswTG2yZxKvqi6FwPccGSXSEI59YOhnaXGc89gMjaefEjjZ28RYVtpY5luAjp7tso66HbQeudwF5ulzwxLVkKPSFWtVNYvkpMG3xr5R7zAIHIBxfAZuQdwLcFfjjrd26bMuPLw5bTDCBA1Us6khwy7ip0YKXcuaIA50fFjzEBLxJm3vXvzgMVZDtcNkHjB2gqNtSRm0OFTnMzzqj8TEqUQxQRIi2eGiigiX8SrA1MFy30GZOkN1oT2o0qegrICdrAOIgjTQDC31AyIBdCt6tmybCQevbwldJiHjMNKFWAxGio4PcSU", "2906159bcc35e3452c8766a080ed8ea09f2b4bf090c11e0e68da54207bec699f696fc57d90a88fed60d6b464856d873048aa27a89fa627212e551577a355f79d"], +["8ZuCZHLbgrJ4FnBINiVXAiPVlvChWsG5Dtya9k5LSjqmyTlzzrMIEYqCxmy8ge6Lss81pWamEzQgVmuN7II6zPCB3uzGWIdpZOhwtxcHQnrOCbeFuQaClSEIBzGZfcgDNHy7HbAPhDCO6euXFOrggBK9IFubZnsNoxBWhEfKJV2xAlmlVQhNOoVkbSiejtUrQwvFIJlQ2fqBZqLf21HgFn3Imco0FhUmdlCAXiPmo8cWYnfxa6f2uAKYso6W1opXSYkBJjaxtC5lO96LMnsjQH0yD8T7kvOSOujxw47Ki3y5KYxjoj4rKlGDYExgGktx3491WqVTL739ROMMxJwcDoM7hgoEw3DAAqxqbaIb4OLj9Xu6cx1yZ9G7nSC684EdNfkWIyREtwkEYUVvs5uqHmooyGljxcfInAE0vpXYVaAcA1pMOtgmDoyZ5tTz5JnDALkR0qgQZUuy8aOxJ3tfa5KFMKb5HqN23i0RKvt4p4", "059d9f8fa86d6b12e21acd7dd5c9372407a5f1da0865ae7757d400365078ee6bbe288d25f60d423cc1c906cf455da6daf1cc43640b6cfe7d286811bdca44860e"], +["k9eumo3I57gA59jDHaLfkn17CgnJn8Ag7w4pMBVZaHPSAqUPI8i1QrV6NmvZgGGi0XJORqixvCcgY0vlWzfEZswp2v1hcRcOcWaDXC4oesMTpde4PEsdZU9I02aGNxeGRIHe5jI4sdRZtorxfMdTlOQnIc5IKxfPpxwohrN8t7SynQVFdB6PpEwOZaieB8fOv2MOdfiTh1wLmTv8ZRgl4weMVh4UvpY972Usq8VoKO7GLbqpCEbN2xDHs1b4OpTo3kc1bfcE7JmabvdruH3iWz6bps9QsAtRlsdh77WQKZZ6tTjZzjEQk0X7J3aPIdglp4jakl7lXHWWJYirW9qYZ72qL1zK3BhL5EFEJLjqYOd5c8tWlaVB8vvHsFjxf8HRDlOnV8Liy2d8UYEwa9gN6csBtPavKCIVpsvNlvQHKI1uofqUnwpPtZVXGs2GJDoxMFRRWghpuGmoyHY4JgNVHuQm2wa2Nn9KO1n3s706mvA", "b38199cc099678ca174cd8fa7f359d050dfe61be082768015ac5911fb2df720247ce54ae84d8871dc7caa2cd4df5324ead73014cca3c8fb90e78d23ff47cd596"], +["FpYxV5j6kp9q5gcn7CO3CPZ0j5TbeJ6cOgJ6VlwDPY6HEgxfcJKJFrUi5NmsNhW2mHN2ydLFi8R3VaRcSybvQBEs4NL3pY3an3yADDEVKg7Q8i92bLyhaW8eE7W3cdkcgBwVy6Zfv7Zl4xQtkbMOn49owKHJkLcD1TNzWVXh9KL5iYynUuOsRXU3WgIjLhJWqNTEfzjsgCmX3yZQ05RwKjZiblxg7RmMbBD7VjD1E2AtbWghmwFWJslXMU66TjgXU8dh0Md9K3tdf0XfnFQ0xQ1boo80XNuFsnBMCF6xD01FKzykmcHxrPX5RPi1L14NvzzpKefZzJjWEdbaT6FkPxH8Lxz8TwSo9J4ApUOrMotNtmu910ktWqCBsHr5yGoWSVzq9vutIfZ5pW5RmJZ927UhEzarmKyxeISskiLHz0GKJ0p2EikOxqoFAmPYUPZcWW1wbvmNUd5WfWPMVsQXB6FbHkdNd3k8nzGc5RQlupuC", "6c5f1ffc90b945c18ad1cbdd6c495fd3a6616aff67cddaa70a2817e7f1f292e59cc2cd0139ea01e936860a3121183a98b75241fe4335fc916365910fa29670cc"], +["WIME37LfdBXqCmxnC3YX6NUFWZvIF23SfF2Y0sLQYGkv9bPtQ5smKfhqO7gbNFjtvfHhGm3aoxS6oRWvCKOZjzLwyjl7iCj0NLiDDOvWTou2RZI4BRWdU6Qd043HAUhN7G2K7HMwJVxC1w4CcxZVpDlVO1QBVlgmunMLKECKiyKhiGkOM3S4x9CwuhH5xIzcCfEFoCf4wfUR0um9pcbwl1mODJx6S9KH1Jsiq6YO6xSXUBmSzwe0k15aaQCB7BgtYm2TFv599jqDw8X2h5jptPp64oqREEeCRkGumaU2nSrcfTmZZVEku6Zs57WrkP7zMhjyeb3HNhBnPPObufipC1ogMdINvx4nDmSJobaE74nHA9Ba0W5FM2VPokKadkPYb2BX8pCWreo13rGHXhhuLBCrxie2w39VQ633dQynKFqlWmupXGZqtk0LQI6sy8xjhKXpaP0UdinYFbQOeqk8Ex5KVWL8vLilif7uyyq7gu1tD", "52783a3c489cc0f7269a1de0056669e40ab79e56859b7820baa7e5872078da30a59667637bcf400b24f2d63d5a97c38773324ec286e1f465deb998d747eb398e"], +["qxgZPaorspATnPu7b9XqNwc4a76lac23MSBPYk4BtN2Zart8d2oLje9UTRPbTQdg4iAJhDLQqBAZlLuGNwj49ZAC4VJK4CvG743zwpGS1a51h8Ga4I8xqlHcwJy0CyqQKR90De8ndoKXlAYRbmJwX1F1IcftfjCR4S6roQ93nn4UKyoXO6cAr4KiRmcrauUnKviefmZxTsNicHjKNe1uovoXrfu8rcEcBh5vNgTjSadlSU7F4q6RmXWOoxMDIB5swGklaZLnFhchs1Vr04h8lAhRbyg1WGaKLmRscKPF0oQ3bjazOcoqMsFaBHq9eP5R7gRSG9coFEsVQYKaNV2Imt6ostJR8h1ZVXkJPtt6yAjXwyTr5yf6GcoyWJi0S0a3HTtQyT5nUonwC2Kt0b308CjcilWWv4sooQ3b5CY5F0VmN58QgXDJX1OYpf0pi4P2xgU5k34vDFKkOYIiX4WZwS6wfo99DOOWf0l1yHpXR3jWZ5", "4ad59ab9883a9edfbc37c6ad35af43ffef7f8a8b0947635e737dd380aba190f31c573dba52c19dbc43415621d3609a2b82375606e0587e6967ac402604279a63"], +["DDHfarEfTruc7hElFxVuHat512vEr1OO5MwwvgmVwysOcVwSjx65Sc6WgskXzaY6wX8KiNxNdB9iVpWJVVO9FEg3RVliNJQCB2jHTBVD2gcxiikwxeRpttTtglChar4Sa3QrAmM4ZAzR6S9JSJXYB1x2DoDSbqy23hbo4cJKV1HjtPvXTFXlUh6j0sjhnNDrjIAZQF8MPv3qCag0fxCe0HODt2Y7SEl8t5ztvgzFUcU34YkUTHf4cIbKuYtIuKp6dxJWsafVVdWAYjMP4NRFWmIV3xT3YgURiojbz7xSzS1Gp4W4OPfT1voSunWBWzm0WXa0HP7c9PXNgLMXPksMEuhBCcOcxAh98IAH8U7bYrWiOefpJPe8g0km5wbeRYBUczFfBDhd6U0vD6kNZNPotwj4TB3GgaRhVaWH8NX1E5FaqeqlWtaVQe0WCrfkghhcOVPIVZ73i6iarJ0IOZzCSVRfN4MAbR6FDi8CXWwTQKkwljX", "1ef72b9a7adda0e7eb0e55ef846b39dd5d63a2d4eee2d9b7ca4181c3add6f058bd510302f9845aed24ac851f67fabcf16ba880b6234016eca440bcc94db686a5"], +["EVgot9zjCMwM0q82YxWDsnGtzvdLSCS5KtyREHGvK09KAlAkSczari0cIbLiYKIJKdReLDKXS0RY4pzFWAgb8rTUFrQHbvKmLHYR4EwvgqeIoa93bhLsfmSUsOv2pSuZm0rtRuKDdzcw50Iuqz3Ecg91r5yVPPzgJ4QkdLf0rpkrr706u3qrgBVWj7YScwsZCfJbie0G8DaPmIyfBj36zGm8bjOheNI84LAVI35Pvt2EM5ReKnWM9ntotw8GAl82WsD1lRIRiBQg8ux427ovwDwTUNKAXYqUI78cMI0WNJdeo7nZptaaSnjPy047kjNVtO6qQ7gDtbFQGh9ZI3XBnnJfBk8jNwMkNpxmyzTnls4vhsQEgU6u9rvsWIGC2IQXoT2TXWv6eoQnfxw90z4gNdOIdI7CI3J5xIudx1d6WkmbadaDreIBgYBBzPSXSzhRJbokVSlMtuWZrMIlKhGcvGHzKP4DjjUTALGJfTcwbOoeBQMr", "b04917e8c7b0087d1ed4b170ad3f0aff359797efcfadd1bff40c0d99748d0389f8c86179a80482746e86d6984bfcb46a567cc40285fc329338135df2e8e1ca69"], +["GGUa4Pc5iu4Dju2zxErUqJsH3J6JS9wCm1G8kJmyQDpopyb56yQeJcOaLmM4hs7HbEcBNVfnG0cxOR52Mc0MWK7Kchax7s2dwZ5AgGikUkEArznDqVjWopBiXgkuThXACIsyMW9MCT6BoqmY1fVBmBKyCXQJdlekRQLx41qzhXXa45x66OrKHghJwzqZ3pKF1XuVwZ5mhr86o6upOWgvhwbpjCz6VBr3lpm75J7K63ODNdsf7Tc7a0YArdMdijWOQfaVd7d1TQPlf2z3acjXiIgyhJYlEl52TiPIsxM8aJMfMD3ahSbnt2a1brBNWP7GovhhBcf0jj2gOEHNFTmyKs0dyrwS0sWc07XSqRCjBv3XAaamyTwlONbRYWf6OZ6QJqZEJzr0TdfyeZ3y286hvvQ2R4Tqsr7zJd9K2SIGmXxXcwQfRs3ikQ2u4GSU3MBg8UtqbtgcLD5Aw3zCi1Vbq89dF9xnfjCq1PqimMd2lNFoNV70M", "bd32b5231084b43df6627ffb407111baf443191b53b4e06fe74825cdf1735c4f9225c085df5be59b0ae877beaf1eaab53a3b9aed0263e56bccda6360f657add5"], +["pYOz1bNDFr6BRaPhAl5nzme8QtInwmVIq036POeklmLRDpNfgEGzI5r5HmmVxfYeucdxbvNfzUx88DdS1hSA1lkzUEjgMGpeWozR7oz9lgtJqGfgaykPrgnbBbXvjXovoTww6cgIqrvjNLnLY8jXB6qPPV1X2A7o3yI3iXbF4wBOEGN0DmSPouYbr1sHn0jlYHYtDdP3sbmsGn7oCBl8Dx39yTGe7YdgUmqXsMGoQEvkMoDceCtEmpSnNXTD8OfQdj9FJo7rYddchDd4hyQJrVvCUEzALKSY9a4hWZd6fuhGcP0n0onZJmsIicbDuXtFwNlcJfh0asuv8afvYMAd0DTPoe9LPgTmHTIY6eIrmfd2ggl0MFXxVXOYysBjFQ3v2dCKTJuEonXWLBWh5vXqjzVzGKxMWHq0WCxDjDPCz1RFxb274ueUgTuOeY7Ktb5Yv3Ol29MoVnInVgDqdaunrt0ww1lougEYkbicpPYECwcwWt5Cne", "c259a52d881077f11199dc0c4aefdefc541b11a86cb696e89c5b47746dda0e5f0e09cc31765d3a3727b85839a0611968a6a1c4180b32f27e680f744462866e5a"], +["u5EBiQCG4oBcqPQgdjJ2iMxkF6zpUjxwsuI3GxRd1VWIENlv5BVrclBZn9M9xD8mGAQpl8CgaTpv9JDqL2TZjlZ5a8jSSUz8U1ULRq3s1UtusVJLGFSUjBewctM3zrtgFOgUElySeOwbm5NxxiPN0cGCr7659fnZREzp7fyYMzQwBHCFsIV9TFgDveJU6QD1BSM3o3BjANb1760qcC9SyQ3OSdyw8AB1GkFNBfPAF3xD9ktyjVU2MyT9DhegHSlOHsTCl8NqE6LsHJ9JICcHxHFobzqUgWEA5gsZTdBhkGTdYU7nC6D3EdsvNuWkDIANSccFbppBsA2USPHF4chL611MdzjIkhpoXoUE5blnf7f30nHulCZxLvqwHDFyiGpXTk01kANmgQZ466R9fjL9ULN7y6wyqA9TBaEklY6KkzyN4eLjvxstKKj8rK2jZHxsYRiuZwUzWamDpx0voNWHSVqaEYUDycypC7tzEAwTBFAXdWYQiIX", "bd9a4a56952c39708281400ca50ca2d1a734ed59d7ec08aeac6327222ca4e1bd4e748d6623a40ed5786e81ecf49e5b6319fb7b052dd3e65bd5273f6084e65cc7"], +["vsLYsq5YszjAvO8mt4BPGJ2ekvW1eYOxLEVGpQSbUXHWKBX2NeCkUEdcWCDNS3IdEizPsGT4QlTetgic8QauGFA0saS3eDgFLGdjvbpO7nHsQtnZZQhOaK71GhdoIGObR2zid5l94OV63bdYILs5dXOGqkzVm2gGMYKlgmCrzguZMhFGH1nhdeAjLD7kfHCQ0MRIk9sZxxixKd98hkMco6SpOtRy5vCtk5tSjHfZpHY3WK2rO8Vc3SwqY1lyXYezFUkiNRmjFy9fRzTuX7bpf3TMq5EIxRR3NfCM1uEQ1oBAuaNMa2YlpvgExCrv3lztV7cPvCVUuNtQA0IFnc6HdICu0lcCUq5xkAH4ISU7rwQxn8wamvQAK1YwP3HEzlZJjUB6e1PECwoLAQmXKdzxxJtSV8K1jSnuPp2ZfePd9dThSUW9SOu9PiS9bR3NpFffmT3OxOdDtZ5agJ67cXEfNx0BXsCjXJfuHakfmbVKTTQYqHeU6YqR", "f196ebe28d6bf7e24879fe5deeef12357ab65dd00fde3088a1ddfa331b1c5e179dfc9b4aa433b156b37ecdc84a50215f266aa79e96c627fce14765c818fd4b20"], +["nbD714UQf675mCevlPHAuo1OG55PvyZOLw7BVqhn1MGQjHxR6bu1ovjt28XPDFCrkTu3RatIj7m2kgzMYhaUJnXEe7AOpsuNfRy9YDGGWFwxXbCJMHL3qHXZNw0Vi0Y6l02w4DSQvNBSweO7PRtByF2MYNQqT31P1bQcrVz4762HhOPTA0QMsvaOn1BTU9g63B3ZCaTtt0StHujEnJ0yIdbufYveU1twTFrzu16T9PiipBDCAjzDKRp4T5jq512MlgSRPtvg8dAB7NMav222sEFx9KPWRUXXtFQTlu5WkdngMeI86bPdzPkUJxLbS4MrqM2rFt7A6kTnaMYlL0wHigxQole0zBq5ROXMb7z0ekrvEPWl8sLSC42Y2EBLyCFpeI1sFjwk1IfpKJRcij620cdgaSP49DhColzkpGWGd6TgDdJvlznNP5JuXMJXieaqumwpPIGuflRoO85qRH83Nuy8aNGcdW7n6xX5Gorlc98BwbkIeQZUb", "5db32da9a540bb1e026059b7432b78191b5c4bd1989e7111191c0ace5318531749f05244c1ea38c569fe91c56e1ea1c4635acd20ecfbae84d15c18c815c68a16"], +["x7EGyYvaXT4fyYtjd701Fmj6lkJuLJMPNLU2yFa51ILPEdQUuxYNwlkkYx2hbBZjaYpq6gHxUvmBibUlvNew1DRqMNKtOio58PxEmSeUmCYxbtMjX91JNhPHdhVQ52y7bBsg9PxGY7ozJmIjn9z3nCeDls3EBzis7uUFYN7UaTqqLYiKysSZOhLQVrCTvs8Uhs9GmofF7rpzWjNAVHTe8uj9FlGc7pNJFNsKvxh7fKkZh8PcwePqbhWf1qQhojJLrYmN8nWTncrivTnmfJKyVZ5Q1EMimyoHu9IDgIyzjyF3JpFOBzVJurdmGJrobzg6z5LTk9KF90yOSvihsRo0RMWlep7af86T3bjqoENHeGASWuHe5dcs4vaRr2j6dO7BiUdJnKoarj1OJHavfJaRlPYsQ2ng0f0qcVjAiS3d0STIgNf9jXV1a1BW8Px7HLTYHdtfaxXPW9inCKFeJy6Dky4agc3myEzesfwRcg5zjuWy2Uqu8IyDJc", "b37947bebead132125e2b347e4fcb6b42396484f0bb7186f3aa2c2d10f51a51bc7e93c2c50d548741108d9f6b8517e4b45d97915e03b406602322e76652eb241"], +["hiSKFWkCp6lkWGCIOvP5ATotWs0yZjVij8Dabxo6yM9X1tdfyWNKToDw9oL2THe1kUT9co6sO5kaLZybNKg5K0N1BppRL7gYAze24DAfzMmLm4CfwIJJKyer2O3Nk82vr6JXoQjG2ieAk0sMtAY5bJYdj1K4wYtNxbZUHQZXYH5wuloDAnZrkaVH2ADR6RBMJqR7gkJobh5bZzN49kpfajdjoBC8348MS4vGgd5Ll3L4hImuKlEo5XpZ4hbudB3WMRph51Iy3AjNRXq4mX9VMoEYc30Dcow74j5oPYkjOaM5pZWPWfd3WWg3DwVvggHPx8m5ZE1h1bOo8YpvjcPRClg5QK2xn4YoU8Qxtr4C5MIPCaMhLtIRGpyyLC22VPsV3UHj3gDN1tcDf9dPRSbZrNBIiRwhD3sp0SHnRluEovaNERJli2QcUh3FFKVlLhv0GTvneoj2k2yxE3RrKTQKv1fCQS4vYtIeMYezz8oYkLYH7AG7mMcpwUB", "6c242ed540c6d030e473d1cc275d0e57820ac64748f1d4bad6a19c6687dbe2e7189978a8a9a7a16d5de9df1400297b43f416a3bd568680c0f2f761c68280091c"], +["EVGQo1L86ZO9edWput9satDDjmOHOj11Nn8H5Sa8SXC9l1Ghv4WRnRQZdxWNO37BjsjY8DCumPRQTkGeomE8PYMV9TrdVkYoZDYWTud5wzFUtkQshztp2tAUeRwJIcQMDIty9HkzeATuJvBNCcXmQpm1sm16TS7tUdz9tuRnKcnU6c0zGzPQlXgpz00WDGRnUuoRFYEPW6qLDmA4tJnluCYjRZMok3v2CvZi5uBs8INAcFNbSsYIwtS30lW9iUOsSTFpqjL4AGwZoPAJcJt7swC2BIxGGjuU2UyCZpP5cRDTAR0gvA0CjCJ7IS7xJoWzcx6OUkTviv977aqFhoTUS0xHhZH2gg9cYqHVbOhWdw6RzcmFb2gcQrzlAK1mhTBsfrYGhDtoY3gPqnVEBpOshuRBLioLTtErfdNQANVX2yl4lYVF2vrvbHW8d9UkjlSkOKWUBLJgCmSuyrJzeD5LGIDvdoLUS4aLuMHDSFAOrx8quqcjhAT6dilm", "862d300cbb8ff11119cb068516ed99ae0badccf77d36ecccf7f503f62ac6b744ff32f7a59dc412e9bd0750c4aeac58bfafd65d7b1bc9ee36f7e95cc6e308b398"], +["3sTESIBMwxvQ18w2Y6gplD6ASUmlpNorgbZSZgvPyjLAR4cx0x6hXJVUfSaMM4RrdZ8AOGlgZeDW2ou4kpdnUbabbqqtXdK7stc33opvg8eG0hoNQfbI4Kqt5ow63L9i9VlO3qAaDcqoXepWHhyAdQJ9xMBrtg16pUdf7LmkqD7Kmhuw9U3XzxltLkGeCALTBLzJL4sjfrh70P2Ixornfgotu9s9IbJ4tERqa8MI7D8r9TjesoMhox2CoaakEvOhXzMiXumL2fIxerrBKjGAf5egjMBPzGuFhnmXLJv2wjBBxPDQ9ZhBBhPa8B6aB6Aakb6ZrU68kYxBVPUmJZsa8FKzEuwrwCfbQHs2vphnUmo0WnmCHBo2xfRPocEBMvR8qcbhRFGnyXejQYNacoiQo8H84EHN9LVQvCegWdcCnF4IBId8qwSjFQ9wXo8YKU0HYSREzWIT69OgwVuPlUb3vdeCco1fVGi3y3sgewCbG0p09hHjjjB7goMbz", "bec493ea303f0fc35ebe2d5828db05e5074d83b468fc5bebecc950e82c240fd4432ea73934f3d5a2c18c346be3f8949d906e502f9683ad726faa6e46e0fa2251"], +["X6v6mLeH4CM2SB5CSugQPYO6AWXMV707XWM0BUe0CcqQ7ZADGhBzUVPP1wFKpN36eu1CwqpPuWTG2itkJoFMnEJJWtHdVXTU2MwVbAggSKiulEM2Kkqm20CFuNVp5a8THmQz3VhqGJjVlnQgfa0vRD1TwfTZnsLNBW3CXuZ0diD4l1JcsB9uyeNBYsg7fXkmWWIO5QcxNV9327BPC67XrvxTABqLqWLB9MDLMQS3O2ejYljHmekISEHxg2FJNfisl8rxiHgwznFxd3F3FQjOpA8joSwprKFfil9t0Rh5Yvg2DYDrnNY05WuxJ4XIfmBbeyovguj7FTsrwStgNSaWI7EtFVKqwzL2SDfErtVuTCQ9Gx1D3NuhAamJ103gYF79agrwvX07JAmMvQ9BG9SVaibMtPU6Y0RXDaNnjUTtO0NEwxCyPBg4hi0GiRY3hPYOG0ND3iPOxLGhu0q4z1GPWqffGAYbvsdnc13Avn1EAfTItegVfMeQGCFLIz", "5266d0dd2c1feea32449d102edeed7983fc73957eec0ceb1c1da5e643c53f387c073e889c6498d4e4dc2bfba43782f0708ed40dfec716e63d83fe0ef2a18b018"], +["GrQI8We42wBvxrnf0wJhiLtYs54Zt29kZnU1Ic6nirOmxebvMQ5orwr7hmHIRtfVW3VgI2OJ2xBh18HEvKy2lIxWkkSwjQ8dz22SmblEOm9TYH9MOIkEeIKKKBzptF2WQMJll2R7AvogHE48otnyWLZ7NYACmln4uNzA5rjLrcNvXnEvZNyF56ELdmLxnOisbdqtwEgGdrXUpXlv1Umf2PdTyNI2rf2gWSuFJL2SgxiiC56S2jtBsdm2tM7BpqHlUveX0XGIEPUrSG8niHaIXuChhtP7CQRkKZmXtneTpIuQY4gybWRaKWIesIqpXM473MeOvCkKpRBXVzAmOCSfObMYySXie0NNCWBu8xEyw5hFGLDq1EYucopUfnUfsbUSSHDnO8efp79CjFxsywmKIsObeVYaJBoB84Bq2Aihei28BMIM5aVW8oluhsovHSl7w03TYmewURXGUcEO0cDWhzQ2wYprEZA94XiwWhdog1w1e7419qsc2j3klo5", "c024a80a7632710e271d5e4a39cb245f44c8d1f56887d49fd143259755768ec5d08d729449ab2ad7bd16ddc8ee06825fc4234d1550f8cc5f9bcddc9a3449671d"], +["6mSIxDztoc8zHC7uqFrdXBKvRVObF8cOemz5pOh9OFp7gpA4AOr4oT7JjeIlyATS6nwatzVgtm493AcQjIqUlTDmrAaxlB4N11T4sGIb3asLESoQy4TaJqoJ33kmLzMYpi27dY6degcBkXqeI5gc9L6sfcfynT5BBggLt1cLb3pCbUIoE5Tx5bxsbN3xQ21jcVCC6Sby5JRbWfHtkPps1jz4942HfosetyLEcwyHB4ia0LzJR4ctkGzQNNzXkMOrDdpMPYt3mXXfF5N5fBEhTowQR61DTTzbLlSfTJ2sIYsq5qVOjXsc5ElUAtyyDU5Jj8qZsT41bueaAkCgke9ADDAPWFRMf8gUhAXwNHw7EVM7p76sdo0XBPAE9HGHmNn037Qg0R6133Ayb5j9q0iCOfPbk9D8od0tTfyOWFB09K59YV2IugkF1bUOgdIdwV7pY8ZaTIxHV5VQGCGiLRAJFAUCQtSKnkT4L3KzvewyFinq0zLRLURP5VLomYNb", "fcda2f31a1cff7676af9b2ae5b38437e5dfe6e83103c3d1aa9dc8e5f5d201fa61d6a9e27f9a3ed805d1554289c08eb9fe9c603d070b6042e75f7538930641d1d"], +["67yxin4TzKBnawvdEwfUQujz9aXsC1oseDdKSxVT5BT78zOq5L32d6Q84rXdVplqLaUrCQZJWFeJCKDDOTTidnXewxv7GAIpGSYtbMwxYQUEAFPLXePqMPSj79ZudEEvH6oE9DolA45LKyL5XuzYsJtIdY6VZUV0xpeufNTdlUnoowtkN6IOI9VBeRr19ZWKw31mE8Kw3lpYbQbAUSsDbMgKLdyl48PPQQGy4uJwQDtUeosTirU2W8Xq1EupJJS1Bpz5F39afUj2Zc0aHHvjvaGF3rxlnqwEVrTm3vgdFNalTgEBSKsaM4AXld6Zzf3kL7puuSUNCN2LU1pnlH4SfxsVqlzfPXWjqTaoomRmiuZiY60NsU1qpOqucHwOuCw37tO6RlBnH8p9BlhjwFkht8lMEWH4KtRxIvXkZVHnR77A0b2FoC5TkTVGHrGyiht879PvsJ44gFLKkFFNulysAxcYPviKNc2XSby9Pbxltv3HOJKNS4gUyHUStxgMD", "50c61bbd2b9ee0ee4c757d46e7cc8833e7090f1de80e53b7385cba198e380744879ece7c2b591ead1c3d372afe75fb5369fb267021df362f66e78101c2131dea"], +["wf2UFXbau9Hfad6r3SdiBqH183JXVVVBY3NFeuqgwDVopasVoBmHmrkYxqfAL2XBdo45FuQIiyOAPkfDWFbkNw3JmC9wlfsoqaISEcRO6J4guNSfRLa231LyX88NiY9LmzBBG8c3XPafYL94xYn6OzzbJ6l5eKBRKfs76pai9RceKjtBSbFArA5c7RRX7HgwOWFkBFLUzjD9p76mJUiHx87BaX9GUpBv13976m0iMSRYpM8zjof5rlBlLmTRV1mSyyBbl8harLTLQ21XGvEroXKIKgUOlj2HYMD9btbp8wENivjb75SbNdGsIyrk3wq5Cv4W7sKi8ybJ4QxU97Q8W5oSNCTr3Wwa4JLTquGnvtWyaV8Xo2PPbYGf1PVtdACGhkRHE5NpymscxrqP7SUmOVsEuDFHARjYnJ3PDLo1KVBZn5MhUy7CJgmXiE3KjPsT1qI4y0ZtWCSE27VUPqmIMGzpIujhedVmEXU5FC4agCE1bDlGf3xNQZoBTTTa2L", "325512fd0739808cf8377b9622778ab647586576ffb83616b2ea8360de70550a288e5d94424d4add7d38f7e19eb919ecdb66038a578ef31479d66be429a09f9f"], +["VCXpeutHB0N78rRurHT2n4Su0OUMWKcVoh9yIhOKmUfAKALixkJKdoxTHR22bm3wi0ux7n3ZU6r67PdydTynD9cp9fftGVdYceSpE0WYD2mtcxZ1oow2VHV7LP2vObGl7YHViQfeI0KmTHDFcq3G9hyAgOPsPl5p2pZ1aDCduExUZxrLwBGS3vcKl7fkozwV3td2Bq98XpeZ3o7yuboc1eQq5CyfbwKqfp7lNjrxv7RFjd4LYsBMycT8KWLAYE2gCZDmlCmdbOhHTaVp0rDQlA0f73IPQAQIeJl9P34l8sLTjOMvlR2gFJHG6W1NGopaUWyBkk5PVYHMpEBSBQ25MLMqiiLGDTVu2VtJcVAk3sUgj2ZtiVdBwc1Ag6vnoS10Wak5r3l1NRRR25qQmRrLPzaebyPRAxWBWoLEEkhafj4uuYGn5ICs3dQTG94sPW6uCveIi3pXxLYl9p7i3x0EiLZgPHK7nfcerI2azCPjvoglBe38eLKuduu8pMod1LF", "220285eb701b2ed0540e5d6335309248ad7dd7b90e96a1750fbd4518067d98f047929c6470337fcd406d979199accfa77dc4fa61a003630f5c1a6ea9660e2005"], +["f0ilba2N7eZVqbuQDnf443herbvoZfWIReBJrbGD0kkgVGhkRkRzdmZX4UM007Rb1RgGBeK9DhK8KDuNUtwcdZ8vEb0vdNgJbRH0FNrnW0UJ0pzTKqNXlWqDngLF5A93fUCb8D4PYeEFg95zR6BluwkfKT5AXav7zgVsT7W8cKVTCoJtzBEYtOKektbzl0irE0qUuFZXU4qBcZKeMAIbdK3YAaPcBqU2DDnupl4hx7v4Byi4TBee5VN8RikEiucZgrhp36TNAZrfoMTSfigXcHj1YEQ0LV0jO7yLcOUUs3b3FZSup2Yik94VoKWv86ElMWEWWuyclHcIFQcLyyVNUj3lsD9iPr6RrHF9WHpZfSgBnQhiT9l7eqBmQqNfxSBvncjtczuoWJ7ZtGMOMbGA74QwIZTGqswXPbDhzsTtuPM1DriwvlRkXaNeyBGAMG5wcDbiFem49aDppi6wRqwFS3i0100oifSHmRUjhai94uSRUdseBh2V3OYIL04wKt9a", "556818eccbc2a8acb70c6bb867d3f0a4fa96b4a0f95e8857c13ccdd81828ec8dc7433f4ea241f8936573fdffc87929fe4f21ff1a3c2825d6b3b79119788d505c"] +]; |