elliptic
Advanced tools
Comparing version 0.1.0 to 0.2.0
54
1.js
@@ -0,21 +1,41 @@ | ||
var assert = require('assert'); | ||
var elliptic = require('./'); | ||
var curve = new elliptic.curve({ | ||
p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ' + | ||
'fffffc2f', | ||
a: '0', | ||
b: '7' | ||
}); | ||
console.time('curve load'); | ||
var curve = elliptic.nist.secp256k1; | ||
assert(curve); | ||
console.timeEnd('curve load'); | ||
var p = curve.point( | ||
'79be667e f9dcbbac 55a06295 ce870b07 029bfcdb 2dce28d9 59f2815b 16f81798', | ||
'483ada77 26a3c465 5da4fbfc 0e1108a8 fd17b448 a6855419 9c47d08f fb10d4b8' | ||
); | ||
p.precompute(256); | ||
require('fs').writeFileSync('/tmp/1.json', JSON.stringify(p)); | ||
var ecdsa = new elliptic.ecdsa(curve); | ||
console.time('gen key'); | ||
var keys = ecdsa.genKeyPair(); | ||
console.timeEnd('gen key'); | ||
console.log(keys); | ||
var msg = new elliptic.bn('deadbeef', 16); | ||
console.time(); | ||
for (var i = 0; i < 1000; i++) | ||
p = p.dbl(); | ||
console.timeEnd(); | ||
console.log(p.validate()); | ||
console.time('validate'); | ||
var v = ecdsa.validateKey(keys.pub); | ||
assert(v.result, v.reason); | ||
console.timeEnd('validate'); | ||
// Sign and verify | ||
console.time('sign'); | ||
var signature = ecdsa.sign(msg, keys.priv); | ||
console.timeEnd('sign'); | ||
console.time('verify'); | ||
assert(ecdsa.verify(msg, signature, keys.pub)); | ||
console.timeEnd('verify'); | ||
// Wrong public key | ||
console.time('get key 2'); | ||
var keys = ecdsa.genKeyPair(); | ||
console.timeEnd('get key 2'); | ||
console.time('verify 2'); | ||
assert(!ecdsa.verify(msg, signature, keys.pub)); | ||
console.timeEnd('verify 2'); | ||
// Just a benchmark | ||
console.time('verify 3'); | ||
for (var i = 0; i < 80; i++) | ||
assert(!ecdsa.verify(msg, signature, keys.pub)); | ||
console.timeEnd('verify 3'); |
var elliptic = exports; | ||
elliptic.utils = require('./elliptic/utils'); | ||
elliptic.bn = require('./elliptic/bn'); | ||
elliptic.rand = require('./elliptic/rand'); | ||
elliptic.hash = require('./elliptic/hash'); | ||
elliptic.hmac = require('./elliptic/hmac'); | ||
elliptic.hmacDRBG = require('./elliptic/hmac-drbg'); | ||
elliptic.curve = require('./elliptic/curve'); | ||
elliptic.nist = require('./elliptic/nist'); | ||
elliptic.ecdsa = require('./elliptic/ecdsa'); |
var assert = require('assert'); | ||
var elliptic = require('../elliptic'); | ||
var utils = elliptic.utils; | ||
@@ -13,8 +15,12 @@ function BN(number, base) { | ||
this.length = 0; | ||
// Montgomery context | ||
this.mont = null; | ||
if (number !== null) | ||
this.init(number || 0, base || 10); | ||
this._init(number || 0, base || 10); | ||
} | ||
module.exports = BN; | ||
BN.prototype.init = function init(number, base) { | ||
BN.prototype._init = function init(number, base) { | ||
if (typeof number === 'number') { | ||
@@ -25,5 +31,25 @@ if (number < 0) { | ||
} | ||
this.words = [ number & 0xffff ]; | ||
this.words = [ number & 0xffffff ]; | ||
this.length = 1; | ||
return; | ||
} else if (typeof number === 'object') { | ||
// Perhaps a Uint8Array | ||
assert(typeof number.length === 'number'); | ||
this.length = Math.ceil(number.length / 3); | ||
this.words = new Array(this.length); | ||
if (base === 'little' || base === 'le') { | ||
for (var i = 0; i < this.length; i++) { | ||
this.words[this.length - i - 1] = number[i * 3 + 2] | | ||
(number[i * 3 + 1] << 8) | | ||
(number[i * 3] << 16); | ||
} | ||
} else { | ||
for (var i = 0; i < this.length; i++) { | ||
this.words[i] = number[i * 3] | | ||
(number[i * 3 + 1] << 8) | | ||
(number[i * 3 + 2] << 16); | ||
} | ||
} | ||
return; | ||
} | ||
@@ -59,4 +85,4 @@ assert(base <= 16); | ||
if (q > 0xfff) { | ||
assert(q <= 0xffff); | ||
if (q > 0xfffff) { | ||
assert(q <= 0xffffff); | ||
if (!bigQ) | ||
@@ -84,2 +110,3 @@ bigQ = new BN(q); | ||
dest.sign = this.sign; | ||
dest.mont = this.mont; | ||
}; | ||
@@ -93,5 +120,6 @@ | ||
// Remove leading `0` from `this` | ||
BN.prototype.strip = function strip() { | ||
while (this.words.length > 1 && this.words[this.words.length - 1] === 0) | ||
this.words.pop(); | ||
this.words.length--; | ||
this.length = this.words.length; | ||
@@ -104,12 +132,5 @@ // -0 = 0 | ||
function zero4(word) { | ||
if (word.length === 3) | ||
return '0' + word; | ||
else if (word.length === 2) | ||
return '00' + word; | ||
else if (word.length === 1) | ||
return '000' + word; | ||
else | ||
return word; | ||
} | ||
BN.prototype.inspect = function inspect() { | ||
return (this.mont ? '<BN-M: ' : '<BN: ') + this.toString(16) + '>'; | ||
}; | ||
@@ -123,3 +144,3 @@ BN.prototype.toString = function toString(base) { | ||
if (i !== this.length - 1) | ||
out += zero4(word); | ||
out += utils.zero6(word); | ||
else | ||
@@ -134,7 +155,7 @@ out += word; | ||
while (c.cmp(0) !== 0) { | ||
var r = c.mod(10000); | ||
c = c.div(10000); | ||
var r = c.mod(1000000); | ||
c = c.div(1000000); | ||
assert.equal(r.length, 1); | ||
if (c.cmp(0) !== 0) | ||
out = zero4(r.words[0] + '') + out; | ||
out = utils.zero6(r.words[0] + '') + out; | ||
else | ||
@@ -157,2 +178,39 @@ out = r.words[0] + out; | ||
BN.prototype.toArray = function toArray() { | ||
this.strip(); | ||
var res = new Array(Math.ceil(this.bitLength() / 8)); | ||
res[0] = 0; | ||
var q = this.clone(); | ||
for (var i = 0; q.cmp(0) !== 0; i++) { | ||
res[i] = q.andl(0xff); | ||
q.ishr(8); | ||
} | ||
return res; | ||
}; | ||
function genCountBits(bits) { | ||
var arr = []; | ||
for (var i = bits - 1; i >= 0; i--) { | ||
var bit = '0x' + (1 << i).toString(16); | ||
arr.push('(w & ' + bit + ') === ' + bit + ' ? ' + (i + 1)); | ||
} | ||
return new Function('w', 'return ' + arr.join(':\n') + ':\n0;'); | ||
}; | ||
BN.prototype._countBits = genCountBits(24); | ||
// Return number of used bits in a BN | ||
BN.prototype.bitLength = function bitLength() { | ||
this.strip(); | ||
var hi = 0; | ||
var w = this.words[this.length - 1]; | ||
var hi = this._countBits(w); | ||
return (this.length - 1) * 24 + hi; | ||
}; | ||
// Return negative clone of `this` | ||
BN.prototype.neg = function neg() { | ||
@@ -164,2 +222,3 @@ var r = this.clone(); | ||
// Add `num` to `this` | ||
BN.prototype.add = function add(num, base) { | ||
@@ -186,4 +245,4 @@ if (!(num instanceof BN)) | ||
var r = a + b + carry; | ||
result.words[i] = r & 0xffff; | ||
carry = r >> 16; | ||
result.words[i] = r & 0xffffff; | ||
carry = r >> 24; | ||
} | ||
@@ -198,2 +257,3 @@ if (carry) { | ||
// Subtract `num` from `this` | ||
BN.prototype.sub = function sub(num, base) { | ||
@@ -225,3 +285,3 @@ if (!(num instanceof BN)) | ||
if (r < 0) { | ||
r += 0x10000; | ||
r += 0x1000000; | ||
carry = 1; | ||
@@ -247,2 +307,3 @@ } else { | ||
// Multiply `this` by `num` | ||
BN.prototype.mul = function mul(num, base) { | ||
@@ -267,8 +328,8 @@ if (!(num instanceof BN)) | ||
var lo = r & 0xffff; | ||
var carry = (r - lo) / 0x10000; | ||
var lo = r & 0xffffff; | ||
var carry = (r - lo) / 0x1000000; | ||
if (result.words[k]) { | ||
lo = result.words[k] + lo; | ||
result.words[k] = lo & 0xffff; | ||
carry += lo >> 16; | ||
result.words[k] = lo & 0xffffff; | ||
carry += lo >> 24; | ||
} else { | ||
@@ -280,8 +341,8 @@ result.words[k] = lo; | ||
k++; | ||
assert(carry <= 0xffff); | ||
assert(carry <= 0xffffff); | ||
for (; carry !== 0; k++) { | ||
if (result.words[k]) { | ||
carry = result.words[k] + carry; | ||
result.words[k] = carry & 0xffff; | ||
carry >>= 16; | ||
carry += result.words[k]; | ||
result.words[k] = carry & 0xffffff; | ||
carry >>= 24; | ||
} else { | ||
@@ -299,2 +360,3 @@ result.words[k] = carry; | ||
// `this` * `this` | ||
BN.prototype.sqr = function sqr() { | ||
@@ -310,17 +372,17 @@ var res = new BN(null); | ||
var uv = a * b; | ||
var v = uv & 0xffff; | ||
var u = (uv - v) / 0x10000; | ||
var v = uv & 0xffffff; | ||
var u = (uv - v) / 0x1000000; | ||
if (i < j) { | ||
u <<= 1; | ||
r2 += u >> 16; | ||
r2 += u >> 24; | ||
v <<= 1; | ||
u |= v >> 16; | ||
u &= 0xffff; | ||
v &= 0xffff; | ||
u |= v >> 24; | ||
u &= 0xffffff; | ||
v &= 0xffffff; | ||
} | ||
r0 += v; | ||
r1 += u + (r0 >> 16); | ||
r2 += r1 >> 16; | ||
r0 &= 0xffff; | ||
r1 &= 0xffff; | ||
r1 += u + (r0 >> 24); | ||
r2 += r1 >> 24; | ||
r0 &= 0xffffff; | ||
r1 &= 0xffffff; | ||
} | ||
@@ -337,6 +399,8 @@ res.words[k] = r0; | ||
// Shift-left in-place | ||
BN.prototype.ishl = function ishl(bits) { | ||
assert(typeof bits === 'number'); | ||
var r = bits % 16; | ||
var s = bits >> 4; | ||
var r = bits % 24; | ||
var s = (bits - r) / 24; | ||
var carryMask = (0xffffff >> (24 - r)) << (24 - r); | ||
@@ -346,5 +410,6 @@ if (r !== 0) { | ||
for (var i = 0; i < this.length; i++) { | ||
var c = this.words[i] << r; | ||
this.words[i] = (c & 0xffff) | carry; | ||
carry = c >> 16; | ||
var newCarry = this.words[i] & carryMask; | ||
var c = (this.words[i] - newCarry) << r; | ||
this.words[i] = c | carry; | ||
carry = newCarry >> (24 - r); | ||
} | ||
@@ -368,10 +433,18 @@ if (carry) { | ||
BN.prototype.ishr = function ishr(bits) { | ||
// Shift-right in-place | ||
// NOTE: `hint` is a lowest bit before trailing zeroes | ||
BN.prototype.ishr = function ishr(bits, hint) { | ||
assert(typeof bits === 'number'); | ||
var r = bits % 16; | ||
var s = bits >> 4; | ||
if (!hint) | ||
hint = 0; | ||
else | ||
hint = (hint - (hint % 24)) / 24; | ||
var mask = 0xffff ^ ((0xffff >> r) << r); | ||
var r = bits % 24; | ||
var s = (bits - r) / 24; | ||
var mask = 0xffffff ^ ((0xffffff >> r) << r); | ||
if (s !== 0) { | ||
hint -= s; | ||
hint = Math.max(0, hint); | ||
for (var i = 0; i < s; i++) | ||
@@ -384,5 +457,5 @@ this.words.shift(); | ||
var carry = 0; | ||
for (var i = this.length - 1; i >= 0; i--) { | ||
for (var i = this.length - 1; i >= 0 && (carry !== 0 || i >= hint); i--) { | ||
var word = this.words[i]; | ||
this.words[i] = (carry << (16 - r)) | (this.words[i] >> r); | ||
this.words[i] = (carry << (24 - r)) | (this.words[i] >> r); | ||
carry = word & mask; | ||
@@ -400,2 +473,3 @@ } | ||
// Shift-left | ||
BN.prototype.shl = function shl(bits) { | ||
@@ -405,2 +479,3 @@ return this.clone().ishl(bits); | ||
// Shift-right | ||
BN.prototype.shr = function shr(bits) { | ||
@@ -410,5 +485,50 @@ return this.clone().ishr(bits); | ||
// Return only lowers bits of number (in-place) | ||
BN.prototype.imask = function imask(bits) { | ||
assert(typeof bits === 'number'); | ||
var r = bits % 24; | ||
var s = (bits - r) / 24; | ||
assert(!this.sign, 'imask works only with positive numbers'); | ||
this.words.length = Math.min(s + 1, this.words.length); | ||
this.length = this.words.length; | ||
var mask = 0xffffff ^ ((0xffffff >> r) << r); | ||
this.words[this.words.length - 1] &= mask; | ||
return this.strip(); | ||
}; | ||
// Return only lowers bits of number | ||
BN.prototype.mask = function mask(bits) { | ||
return this.clone().imask(bits); | ||
}; | ||
// Add plain number `num` to `this` | ||
BN.prototype.iadd = function iadd(num) { | ||
assert(typeof num === 'number'); | ||
if (num < 0) | ||
return this.isub(num); | ||
this.words[0] += num; | ||
// Carry | ||
for (var i = 0; i < this.length && this.words[i] >= 0x1000000; i++) { | ||
this.words[i] -= 0x1000000; | ||
if (i == this.length - 1) | ||
this.words[i + 1] = 1; | ||
else | ||
this.words[i + 1]++; | ||
} | ||
this.length = this.words.length; | ||
return this; | ||
}; | ||
// Subtract plain number `num` from `this` | ||
BN.prototype.isub = function isub(num) { | ||
assert(typeof num === 'number'); | ||
assert(this.cmp(num) >= 0, 'Sign change is not supported in isub'); | ||
if (num < 0) | ||
return this.iadd(-num); | ||
this.words[0] -= num; | ||
@@ -418,3 +538,3 @@ | ||
for (var i = 0; i < this.length && this.words[i] < 0; i++) { | ||
this.words[i] += 0x10000; | ||
this.words[i] += 0x1000000; | ||
this.words[i + 1] -= 1; | ||
@@ -426,38 +546,2 @@ } | ||
function findShift(a, b, minShift, maxShift) { | ||
var shift = minShift; | ||
var q = new BN(1).ishl(shift); | ||
var max = b.shl(shift); | ||
var i = 0; | ||
// Use binary search to determine proper amount of shift | ||
while (true) { | ||
var next; | ||
var c = a.cmp(max); | ||
i++; | ||
if (c < 0) { | ||
next = shift >> 1; | ||
maxShift = shift; | ||
q.ishr(shift - next); | ||
max.ishr(shift - next); | ||
} else if (c > 0) { | ||
next = (maxShift + shift) >> 1; | ||
minShift = shift; | ||
q.ishl(next - shift); | ||
max.ishl(next - shift); | ||
} else if (c === 0) | ||
break; | ||
if (shift === next) | ||
break; | ||
shift = next; | ||
} | ||
if (c < 0 && shift >= 0) { | ||
shift--; | ||
q.ishr(1); | ||
max.ishr(1); | ||
} | ||
return { q: q, max: max, shift: shift }; | ||
} | ||
BN.prototype._div = function _div(num, base) { | ||
@@ -489,7 +573,9 @@ if (!(num instanceof BN)) | ||
// Find maximum Q, Q * num <= this | ||
var delta = this.length - num.length; | ||
var f = findShift(this, num, delta * 16, delta * 16 + 17); | ||
var shift = f.shift; | ||
var q = f.q; | ||
var max = f.max; | ||
var shift = Math.max(0, this.bitLength() - num.bitLength()); | ||
var max = num.shl(shift); | ||
if (shift > 0 && this.cmp(max) < 0) { | ||
max.ishr(1, shift); | ||
shift--; | ||
} | ||
var maxLen = max.bitLength(); | ||
@@ -502,7 +588,6 @@ var c = this; | ||
c = c.sub(max); | ||
r = r.add(q); | ||
r = r.binc(shift); | ||
} | ||
q.ishr(1); | ||
max.ishr(1); | ||
shift--; | ||
max.ishr(1, shift); | ||
shift -= 1; | ||
} | ||
@@ -512,2 +597,3 @@ return { mod: c, div: r }; | ||
// Find `this` / `num` | ||
BN.prototype.div = function div(num, base) { | ||
@@ -517,2 +603,3 @@ return this._div(num, base).div; | ||
// Find `this` % `num` | ||
BN.prototype.mod = function mod(num, base) { | ||
@@ -522,13 +609,5 @@ return this._div(num, base).mod; | ||
BN.prototype.divm = function divm(num0, base0, num1, base1) { | ||
if (typeof base0 !== 'number') { | ||
var x1 = new BN(num0); | ||
var p = new BN(base0, num1); | ||
} else { | ||
var x1 = new BN(num0, base0); | ||
var p = new BN(num1, base1); | ||
} | ||
BN.prototype._egcd = function _egcd(x1, p) { | ||
assert(!p.sign); | ||
assert(!p.sign && p.isOdd()); | ||
var a = this; | ||
@@ -541,6 +620,5 @@ var b = p; | ||
a = a.clone(); | ||
x1 = x1.clone(); | ||
assert(a.cmp(0) !== 0); | ||
x1 = x1.clone(); | ||
var x2 = new BN(0); | ||
@@ -576,4 +654,7 @@ while (a.cmp(1) !== 0 && b.cmp(1) !== 0) { | ||
// Invert number in the field F(num) | ||
BN.prototype.invm = function invm(num, base) { | ||
return this.divm(1, num, base); | ||
if (!(num instanceof BN)) | ||
num = new BN(num, base); | ||
return this._egcd(new BN(1), num); | ||
}; | ||
@@ -589,2 +670,3 @@ | ||
// And first word and num | ||
BN.prototype.andl = function andl(num) { | ||
@@ -594,2 +676,35 @@ return this.words[0] & num; | ||
// Increment at the bit position in-line | ||
BN.prototype.binc = function binc(bit) { | ||
assert(typeof bit === 'number'); | ||
var r = bit % 24; | ||
var s = (bit - r) / 24; | ||
var q = 1 << r; | ||
// Fast case: bit is much higher than all existing words | ||
if (this.length <= s) { | ||
for (var i = this.length; i < s + 1; i++) | ||
this.words[i] = 0; | ||
this.words[s] |= q; | ||
this.length = this.words.length; | ||
return this; | ||
} | ||
// Add bit and propagate, if needed | ||
var carry = q; | ||
for (var i = s; carry != 0; i++) { | ||
var w = i < this.length ? this.words[i] : 0; | ||
w += carry; | ||
carry = w >> 24; | ||
w &= 0xffffff; | ||
this.words[i] = w; | ||
} | ||
this.length = this.words.length; | ||
return this; | ||
}; | ||
// Compare two numbers and return: | ||
// 1 - if `this` > `num` | ||
// 0 - if `this` == `num` | ||
// -1 - if `this` < `num` | ||
BN.prototype.cmp = function cmp(num, base) { | ||
@@ -601,3 +716,3 @@ // Fast number checks | ||
num = -num; | ||
num &= 0xffff; | ||
num &= 0xffffff; | ||
this.strip(); | ||
@@ -657,1 +772,125 @@ | ||
}; | ||
BN.prototype.forceMont = function forceMont(ctx) { | ||
assert(!this.mont, 'Already a montgomery number'); | ||
this.mont = ctx; | ||
return this; | ||
}; | ||
BN.prototype.toMont = function toMont(ctx) { | ||
assert(!this.mont, 'Already a montgomery number'); | ||
assert(!this.sign, 'mont works only with positives'); | ||
var res = this.shl(ctx.shift).mod(ctx.m); | ||
res.mont = ctx; | ||
return res; | ||
}; | ||
BN.prototype.fromMont = function fromMont() { | ||
assert(this.mont, 'fromMont works only with mont numbers'); | ||
var ctx = this.mont; | ||
return this.mul(ctx.rinv).mod(ctx.m); | ||
}; | ||
BN.prototype.montAdd = function montAdd(num, base) { | ||
if (!(num instanceof BN)) | ||
num = new BN(num, base).toMont(this.mont); | ||
assert(!this.sign && !num.sign, 'mont works only with positives'); | ||
assert(this.mont && this.mont === num.mont, | ||
'montAdd works only with mont numbers'); | ||
var mont = this.mont; | ||
var res = this.add(num); | ||
if (res.cmp(mont.m) >= 0) | ||
res = res.sub(mont.m); | ||
res.mont = mont; | ||
return res; | ||
}; | ||
BN.prototype.montSub = function montSub(num, base) { | ||
if (!(num instanceof BN)) | ||
num = new BN(num, base).toMont(this.mont); | ||
assert(!this.sign && !num.sign, 'mont works only with positives'); | ||
assert(this.mont && this.mont === num.mont, | ||
'montSub works only with mont numbers'); | ||
var mont = this.mont; | ||
var res = this.sub(num); | ||
if (res.cmp(0) < 0) | ||
res = res.add(mont.m); | ||
res.mont = mont; | ||
return res; | ||
}; | ||
BN.prototype.montShl = function montShl(num) { | ||
assert(!this.sign, 'mont works only with positives'); | ||
assert(this.mont, 'montShl works only with mont numbers'); | ||
var mont = this.mont; | ||
var res = this.shl(num).mod(mont.m); | ||
res.mont = mont; | ||
return res; | ||
}; | ||
BN.prototype.montMul = function montMul(num, base) { | ||
if (!(num instanceof BN)) | ||
num = new BN(num, base).toMont(this.mont); | ||
assert(!this.sign && !num.sign, 'mont works only with positives'); | ||
assert(this.mont && this.mont === num.mont, | ||
'montMul works only with mont numbers'); | ||
var mont = this.mont; | ||
var t = this.mul(num); | ||
var c = t.mul(mont.minv).imask(mont.shift).mul(mont.m); | ||
var u = t.sub(c).ishr(mont.shift); | ||
var res = u; | ||
if (u.cmp(mont.m) >= 0) | ||
res = u.sub(mont.m); | ||
else if (u.cmp(0) < 0) | ||
res = u.add(mont.m); | ||
res.mont = mont; | ||
return res; | ||
}; | ||
BN.prototype.montSqr = function montSqr() { | ||
return this.montMul(this); | ||
}; | ||
BN.prototype.montInvm = function montInvm() { | ||
assert(!this.sign, 'mont works only with positives'); | ||
assert(this.mont, 'montInvm works only with mont numbers'); | ||
// (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R | ||
var res = this.invm(this.mont.m).mul(this.mont.r2).mod(this.mont.m); | ||
res.mont = this.mont; | ||
return res; | ||
}; | ||
// Return negative clone of `this` % `mont modulo` | ||
BN.prototype.montNeg = function montNeg() { | ||
assert(!this.sign, 'mont works only with positives'); | ||
assert(this.mont, 'montNeg works only with mont numbers'); | ||
var r = this.clone(); | ||
r.sign = !this.sign; | ||
r = r.add(this.mont.m); | ||
r.mont = this.mont; | ||
return r; | ||
}; | ||
BN.mont = function mont(num, base) { | ||
return new Mont(num, base); | ||
}; | ||
function Mont(num, base) { | ||
this.m = new BN(num, base); | ||
this.shift = this.m.bitLength(); | ||
if (this.shift % 24 !== 0) | ||
this.shift += 24 - (this.shift % 24); | ||
this.r = new BN(1).ishl(this.shift); | ||
this.r2 = this.r.sqr().mod(this.m); | ||
this.rinv = this.r.invm(this.m); | ||
// TODO(indutny): simplify it | ||
this.minv = this.rinv.mul(this.r).sub(1).div(this.m).neg().mod(this.r); | ||
} |
@@ -7,9 +7,10 @@ var assert = require('assert'); | ||
this.p = new BN(conf.p, 16); | ||
this.a = new BN(conf.a, 16); | ||
this.b = new BN(conf.b, 16); | ||
this.mont = BN.mont(this.p); | ||
this.a = new BN(conf.a, 16).toMont(this.mont); | ||
this.b = new BN(conf.b, 16).toMont(this.mont); | ||
} | ||
module.exports = Curve; | ||
Curve.prototype.point = function point(x, y) { | ||
return new Point(this, x, y); | ||
Curve.prototype.point = function point(x, y, isMont) { | ||
return new Point(this, x, y, isMont); | ||
}; | ||
@@ -21,2 +22,6 @@ | ||
Curve.prototype.pointFromJSON = function pointFromJSON(obj) { | ||
return Point.fromJSON(this, obj); | ||
}; | ||
Curve.prototype.validate = function validate(point) { | ||
@@ -29,7 +34,58 @@ if (point.inf) | ||
var rhs = x.mul(x).mul(x).add(this.a.mul(x)).add(this.b); | ||
return y.mul(y).sub(rhs).mod(this.p).cmp(0) === 0; | ||
var ax = this.a.montMul(x); | ||
var rhs = x.montSqr().montMul(x).montAdd(ax).montAdd(this.b); | ||
return y.montSqr().montSub(rhs).cmp(0) === 0; | ||
}; | ||
function Point(curve, x, y) { | ||
Curve.prototype._nafMul = function _nafMul(p, k) { | ||
var naf = getNAF(k, 2); | ||
var acc = this.point(null, null); | ||
var q = p; | ||
for (var i = 0; i < naf.length; i++, q = q.dbl()) { | ||
var z = naf[i]; | ||
if (z === 1) | ||
acc = acc.add(q); | ||
else if (z === -1) | ||
acc = acc.add(q.neg()); | ||
else | ||
continue; | ||
} | ||
return acc; | ||
}; | ||
Curve.prototype._wnafMul = function _wnafMul(p, k) { | ||
var w = 4; | ||
var naf = getNAF(k, w); | ||
// Precompute window | ||
var wnd = [ p ]; | ||
var dbl; | ||
for (var i = 1; i < (1 << (w - 1)); i++) { | ||
if (!dbl) | ||
dbl = p.dbl(); | ||
wnd[i] = wnd[i - 1].add(dbl); | ||
} | ||
// Convert everything to J, if needed | ||
if (p instanceof Point) | ||
for (var i = 0; i < wnd.length; i++) | ||
wnd[i] = wnd[i].toJ(); | ||
// Add `this`*(N+1) for every w-NAF index | ||
var acc = this.jpoint(null, null, null); | ||
for (var i = naf.length - 1; i >= 0; i--) { | ||
var z = naf[i]; | ||
acc = acc.dbl(); | ||
if (z === 0) | ||
continue; | ||
if (z > 0) | ||
acc = acc.add(wnd[(z - 1) >> 1]); | ||
else | ||
acc = acc.add(wnd[(-z - 1) >> 1].neg()); | ||
} | ||
return p instanceof Point ? acc.toP() : acc; | ||
}; | ||
function Point(curve, x, y, isMont) { | ||
this.curve = curve; | ||
@@ -43,2 +99,11 @@ if (x === null && y === null) { | ||
this.y = new BN(y, 16); | ||
// Force montgomery representation when loading from JSON | ||
if (isMont) { | ||
this.x.forceMont(this.curve.mont); | ||
this.y.forceMont(this.curve.mont); | ||
} | ||
if (!this.x.mont) | ||
this.x = this.x.toMont(this.curve.mont); | ||
if (!this.y.mont) | ||
this.y = this.y.toMont(this.curve.mont); | ||
this.inf = false; | ||
@@ -54,6 +119,6 @@ } | ||
Point.prototype.precompute = function precompute(power) { | ||
this.precomputed = []; | ||
var q = this; | ||
for (var i = 0; i < power; i++) { | ||
q = q.dbl(); | ||
if (!this.precomputed) | ||
this.precomputed = []; | ||
for (var i = this.precomputed.length; i < power; i++) { | ||
var q = (i === 0 ? this : this.precomputed[i - 1]).dbl(); | ||
this.precomputed.push(q); | ||
@@ -68,2 +133,26 @@ } | ||
Point.fromJSON = function fromJSON(curve, obj) { | ||
if (typeof obj === 'string') | ||
obj = JSON.parse(obj); | ||
var res = curve.point(obj[0], obj[1], true); | ||
if (!obj[2]) | ||
return res; | ||
res.precomputed = obj[2].map(function(obj) { | ||
return curve.point(obj[0], obj[1], true); | ||
}); | ||
return res; | ||
}; | ||
Point.prototype.inspect = function inspect() { | ||
if (this.isInfinity()) | ||
return '<EC Point Infinity>'; | ||
return '<EC Point x: ' + this.x.fromMont().toString(16) + | ||
' y: ' + this.y.fromMont().toString(16) + | ||
' pc: ' + (this.precomputed && this.precomputed.length || 0) + '>'; | ||
}; | ||
Point.prototype.isInfinity = function isInfinity() { | ||
return this.inf; | ||
}; | ||
Point.prototype.add = function add(p) { | ||
@@ -90,6 +179,9 @@ // Mixed addition | ||
var m = this.curve.p; | ||
var c = this.y.sub(p.y).mul(this.x.sub(p.x).invm(m)); | ||
var nx = c.sqr().sub(this.x).sub(p.x).mod(m); | ||
var ny = c.mul(this.x.sub(nx)).sub(this.y).mod(m); | ||
// P + Q = O | ||
if (this.x.cmp(p.x) === 0) | ||
return this.curve.point(null, null); | ||
var c = this.y.montSub(p.y).montMul(this.x.montSub(p.x).montInvm()); | ||
var nx = c.montSqr().montSub(this.x).montSub(p.x); | ||
var ny = c.montMul(this.x.montSub(nx)).montSub(this.y); | ||
return this.curve.point(nx, ny); | ||
@@ -99,2 +191,4 @@ }; | ||
Point.prototype.dbl = function dbl() { | ||
if (this.inf) | ||
return this; | ||
if (this.precomputed && this.precomputed.length) { | ||
@@ -107,25 +201,40 @@ var cached = this.precomputed[0]; | ||
} | ||
// 2P = O | ||
var ys1 = this.y.montShl(1); | ||
if (ys1.cmp(0) === 0) | ||
return this.curve.point(null, null); | ||
var a = this.curve.a; | ||
var p = this.curve.p; | ||
var x2 = this.x.sqr(); | ||
var dyinv = this.y.shl(1).invm(p); | ||
var c = x2.mul(3).add(a).mul(dyinv); | ||
var x2 = this.x.montSqr(); | ||
var dyinv = ys1.montInvm(); | ||
var c = x2.montMul(3).montAdd(a).montMul(dyinv); | ||
var nx = c.sqr().sub(this.x.shl(1)).mod(p); | ||
var ny = c.mul(this.x.sub(nx)).sub(this.y).mod(p); | ||
var nx = c.montSqr().montSub(this.x.montShl(1)); | ||
var ny = c.montMul(this.x.montSub(nx)).montSub(this.y); | ||
return this.curve.point(nx, ny); | ||
}; | ||
Point.prototype.mul = function mul(k, kbase) { | ||
if (!(k instanceof BN)) | ||
k = new BN(k, kbase); | ||
Point.prototype.getX = function getX() { | ||
return this.x.fromMont(); | ||
}; | ||
// Represent k in a NAF form | ||
Point.prototype.getY = function getY() { | ||
return this.y.fromMont(); | ||
}; | ||
function getNAF(num, w) { | ||
// Represent k in a w-NAF form | ||
var naf = []; | ||
k = k.clone(); | ||
while (k.cmp(0) !== 0) { | ||
var ws = 1 << w; | ||
var k = num.clone(); | ||
while (k.cmp(1) >= 0) { | ||
var z; | ||
if (k.isOdd()) { | ||
z = 2 - k.andl(3); | ||
var mod = k.andl(ws - 1); | ||
if (mod > (ws >> 1) - 1) | ||
z = (ws >> 1) - mod; | ||
else | ||
z = mod; | ||
k.isub(z); | ||
@@ -136,18 +245,21 @@ } else { | ||
naf.push(z); | ||
k.ishr(1); | ||
// Optimization, shift by word if possible | ||
var shift = (k.cmp(0) !== 0 && k.andl(ws - 1) === 0) ? w : 1; | ||
for (var i = 1; i < shift; i++) | ||
naf.push(0); | ||
k.ishr(shift); | ||
} | ||
// Add powers of two one-by-one | ||
var acc = this.curve.point(null, null); | ||
var q = this; | ||
for (var i = 0; i < naf.length; i++, q = q.dbl()) { | ||
var z = naf[i]; | ||
if (z === 1) | ||
acc = acc.add(q); | ||
else if (z === -1) | ||
acc = acc.add(q.neg()); | ||
else | ||
continue; | ||
} | ||
return acc; | ||
return naf; | ||
} | ||
Point.prototype.mul = function mul(k, kbase) { | ||
if (!(k instanceof BN)) | ||
k = new BN(k, kbase); | ||
if (this.precomputed && this.precomputed.length) | ||
return this.curve._nafMul(this, k); | ||
else | ||
return this.curve._wnafMul(this, k); | ||
}; | ||
@@ -162,3 +274,3 @@ | ||
Point.prototype.neg = function neg() { | ||
return this.curve.point(this.x, this.y.neg()); | ||
return this.curve.point(this.x, this.y.montNeg()); | ||
}; | ||
@@ -168,5 +280,7 @@ | ||
if (this.inf) | ||
return this.curve.jpoint(new BN(1), new BN(1), new BN(0)); | ||
return this.curve.jpoint(null, null, null); | ||
return this.curve.jpoint(this.x, this.y, new BN(1)); | ||
var res = this.curve.jpoint(this.x, this.y, new BN(1)); | ||
res.precomputed = this.precomputed; | ||
return res; | ||
}; | ||
@@ -185,13 +299,19 @@ | ||
} | ||
if (!this.x.mont) | ||
this.x = this.x.toMont(this.curve.mont); | ||
if (!this.y.mont) | ||
this.y = this.y.toMont(this.curve.mont); | ||
if (!this.z.mont) | ||
this.z = this.z.toMont(this.curve.mont); | ||
this.precomputed = null; | ||
}; | ||
JPoint.prototype.toP = function toP() { | ||
if (this.z.cmp(0) === 0) | ||
if (this.isInfinity()) | ||
return this.curve.point(null, null); | ||
var p = this.curve.p; | ||
var zinv = this.z.invm(p); | ||
var zinv2 = zinv.sqr(); | ||
var ax = this.x.mul(zinv2).mod(p); | ||
var ay = this.y.mul(zinv2).mul(zinv).mod(p); | ||
var zinv = this.z.montInvm(); | ||
var zinv2 = zinv.montSqr(); | ||
var ax = this.x.montMul(zinv2); | ||
var ay = this.y.montMul(zinv2).montMul(zinv); | ||
@@ -202,3 +322,3 @@ return this.curve.point(ax, ay); | ||
JPoint.prototype.neg = function neg() { | ||
return this.curve.jpoint(this.x, this.y.neg(), this.z); | ||
return this.curve.jpoint(this.x, this.y.montNeg(), this.z); | ||
}; | ||
@@ -212,7 +332,7 @@ | ||
// O + P = P | ||
if (this.z.cmp(0) === 0) | ||
if (this.isInfinity()) | ||
return p; | ||
// P + O = P | ||
if (p.z.cmp(0) === 0) | ||
if (p.isInfinity()) | ||
return this; | ||
@@ -223,18 +343,18 @@ | ||
var pz2 = p.z.sqr(); | ||
var z2 = this.z.sqr(); | ||
var pz2 = p.z.montSqr(); | ||
var z2 = this.z.montSqr(); | ||
var s1 = this.y.mul(pz2.mul(p.z)); | ||
var s2 = p.y.mul(z2.mul(this.z)); | ||
var u1 = this.x.mul(pz2); | ||
var u2 = p.x.mul(z2); | ||
var r = s1.sub(s2); | ||
var h = u1.sub(u2); | ||
var h2 = h.sqr(); | ||
var g = h2.mul(h); | ||
var v = u1.mul(h2); | ||
var s1 = this.y.montMul(pz2.montMul(p.z)); | ||
var s2 = p.y.montMul(z2.montMul(this.z)); | ||
var u1 = this.x.montMul(pz2); | ||
var u2 = p.x.montMul(z2); | ||
var r = s1.montSub(s2); | ||
var h = u1.montSub(u2); | ||
var h2 = h.montSqr(); | ||
var g = h2.montMul(h); | ||
var v = u1.montMul(h2); | ||
var nx = r.sqr().add(g).sub(v.shl(1)).mod(this.curve.p); | ||
var ny = r.mul(v.sub(nx)).sub(s1.mul(g)).mod(this.curve.p); | ||
var nz = this.z.mul(p.z).mul(h).mod(this.curve.p); | ||
var nx = r.montSqr().montAdd(g).montSub(v.montShl(1)); | ||
var ny = r.montMul(v.montSub(nx)).montSub(s1.montMul(g)); | ||
var nz = this.z.montMul(p.z).montMul(h); | ||
@@ -249,3 +369,12 @@ return this.curve.jpoint(nx, ny, nz); | ||
JPoint.prototype.dbl = function dbl() { | ||
var p = this.curve.p; | ||
if (this.isInfinity()) | ||
return this; | ||
if (this.precomputed && this.precomputed.length) { | ||
var cached = this.precomputed[0]; | ||
var res = this.curve.point(cached.x, cached.y); | ||
if (this.precomputed.length > 1) | ||
res.precomputed = this.precomputed.slice(1); | ||
return res.toJ(); | ||
} | ||
var a = this.curve.a; | ||
@@ -257,14 +386,23 @@ | ||
var jx2 = jx.sqr(); | ||
var jy2 = jy.sqr(); | ||
var jz4 = jz.sqr().sqr(); | ||
var c = jx2.mul(3).add(a.mul(jz4)); | ||
var jx2 = jx.montSqr(); | ||
var jy2 = jy.montSqr(); | ||
var jz4 = jz.montSqr().montSqr(); | ||
var c = jx2.montMul(3).montAdd(a.montMul(jz4)); | ||
var nx = c.sqr().sub(jx.shl(3).mul(jy2)); | ||
var ny = c.mul(jx.shl(2).mul(jy2).sub(nx)).sub(jy2.sqr().shl(3)); | ||
var nz = jy.shl(1).mul(jz); | ||
var t1 = jx.montShl(2).montMul(jy2); | ||
var nx = c.montSqr().montSub(t1.montShl(1)); | ||
var t2 = t1.montSub(nx); | ||
var ny = c.montMul(t2).montSub(jy2.montSqr().montShl(3)); | ||
var nz = jy.montShl(1).montMul(jz); | ||
return this.curve.jpoint(nx.mod(p), ny.mod(p), nz.mod(p)); | ||
return this.curve.jpoint(nx, ny, nz); | ||
}; | ||
JPoint.prototype.mul = function mul(k, kbase) { | ||
if (!(k instanceof BN)) | ||
k = new BN(k, kbase); | ||
return this.curve._wnafMul(this, k); | ||
}; | ||
JPoint.prototype.eq = function eq(p) { | ||
@@ -283,1 +421,13 @@ if (p instanceof Point) | ||
}; | ||
JPoint.prototype.inspect = function inspect() { | ||
if (this.isInfinity()) | ||
return '<EC JPoint Infinity>'; | ||
return '<EC JPoint x: ' + this.x.toString(16) + | ||
' y: ' + this.y.toString(16) + | ||
' z: ' + this.z.toString(16) + '>'; | ||
}; | ||
JPoint.prototype.isInfinity = function isInfinity() { | ||
return this.z.cmp(0) === 0; | ||
}; |
@@ -0,143 +1,1075 @@ | ||
var nist = exports; | ||
var assert = require('assert'); | ||
var util = require('util'); | ||
var elliptic = require('../elliptic'); | ||
var BN = elliptic.bn; | ||
// Just a common base for instance of check | ||
function NIST() { | ||
this.p = null; | ||
} | ||
module.exports = NIST; | ||
function NISTCurve(options) { | ||
this.curve = new elliptic.curve(options); | ||
this.g = this.curve.pointFromJSON(options.g); | ||
this.n = new elliptic.bn(options.n, 16); | ||
this.h = new elliptic.bn(options.h, 16); | ||
this.hash = options.hash; | ||
function w2b32(indices, n) { | ||
var src = []; | ||
for (var i = indices.length - 1; i >= 0; i--) { | ||
var index = indices[i]; | ||
if (index === -1) | ||
src.push('0', '0'); | ||
else | ||
src.push('w[' + index * 2 + ']', 'w[' + (index * 2 + 1) + ']'); | ||
} | ||
src = 'return new BN([ ' + src.join(', ') + ' ]);'; | ||
var fn = new Function('w', 'BN', src); | ||
fn.name = n; | ||
return fn; | ||
assert(this.g.validate(), 'Invalid NIST curve'); | ||
assert(this.g.mul(this.n).isInfinity(), 'Invalid NIST curve, G*N != O'); | ||
} | ||
nist.NISTCurve = NISTCurve; | ||
function w2b64(indices, n) { | ||
var src = []; | ||
for (var i = indices.length - 1; i >= 0; i--) { | ||
var index = indices[i]; | ||
if (index === -1) | ||
src.push('0', '0', '0', '0'); | ||
else | ||
src.push('w[' + index * 4 + ']', | ||
'w[' + (index * 4 + 1) + ']', | ||
'w[' + (index * 4 + 2) + ']', | ||
'w[' + (index * 4 + 3) + ']'); | ||
} | ||
src = 'return new BN([ ' + src.join(', ') + ' ]);'; | ||
var fn = new Function('w', 'BN', src); | ||
fn.name = n; | ||
return fn; | ||
function defineCurve(name, options) { | ||
Object.defineProperty(nist, name, { | ||
configurable: true, | ||
enumerable: true, | ||
get: function() { | ||
var curve = new NISTCurve(options); | ||
Object.defineProperty(nist, name, { | ||
configurable: true, | ||
enumerable: true, | ||
value: curve | ||
}); | ||
return curve; | ||
} | ||
}); | ||
} | ||
var p192 = new BN('fffffffffffffffffffffffffffffffeffffffffffffffff', 16); | ||
var p192_2 = p192.mul(p192); | ||
defineCurve('secp256k1', { | ||
p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', | ||
a: '0', | ||
b: '7', | ||
n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', | ||
h: '1', | ||
hash: elliptic.hash.sha256, | ||
var p256 = new BN( | ||
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', | ||
16); | ||
var p256_2 = p256.mul(p256); | ||
function P192() { | ||
NIST.call(this); | ||
this.p = p192; | ||
this.p2 = p192_2; | ||
} | ||
util.inherits(P192, NIST); | ||
NIST.p192 = P192; | ||
P192.prototype.t = w2b64([ 2, 1, 0 ], 't_192'); | ||
P192.prototype.s1 = w2b64([ -1, 3, 3 ], 's1_192'); | ||
P192.prototype.s2 = w2b64([ 4, 4, -1 ], 's2_192'); | ||
P192.prototype.s3 = w2b64([ 5, 5, 5 ], 's3_192'); | ||
P192.prototype.mod = function mod(a) { | ||
a.strip(); | ||
assert(a.length <= 24); | ||
// a should be <= p^2 | ||
if (a.cmp(this.p2) > 0) | ||
return a.mod(this.p); | ||
var cmp = a.cmp(this.p); | ||
if (cmp === 0) | ||
return new BN(0); | ||
else if (cmp < 0) | ||
return a.clone(); | ||
var w = a.words.slice(); | ||
for (var i = 0; i < 24; i++) | ||
w[i] |= 0; | ||
var t = this.t(w, BN); | ||
var s1 = this.s1(w, BN); | ||
var s2 = this.s2(w, BN); | ||
var s3 = this.s3(w, BN); | ||
var r = t.add(s1).add(s2).add(s3); | ||
return r.mod(this.p); | ||
}; | ||
function P256() { | ||
NIST.call(this); | ||
this.p = p256; | ||
this.p2 = p256_2; | ||
} | ||
util.inherits(P256, NIST); | ||
NIST.p256 = P256; | ||
P256.prototype.t = w2b32([ 7, 6, 5, 4, 3, 2, 1, 0 ], 't_256'); | ||
P256.prototype.s1 = w2b32([ 15, 14, 13, 12, 11, -1, -1, -1 ], 's1_256'); | ||
P256.prototype.s2 = w2b32([ -1, 15, 14, 13, 12, -1, -1, -1 ], 's2_256'); | ||
P256.prototype.s3 = w2b32([ 15, 14, -1, -1, -1, 10, 9, 8 ], 's3_256'); | ||
P256.prototype.s4 = w2b32([ 8, 13, 15, 14, 13, 11, 10, 9 ], 's4_256'); | ||
P256.prototype.d1 = w2b32([ 10, 8, -1, -1, -1, 13, 12, 11 ], 'd1_256'); | ||
P256.prototype.d2 = w2b32([ 11, 9, -1, -1, 15, 14, 13, 12 ], 'd2_256'); | ||
P256.prototype.d3 = w2b32([ 12, -1, 10, 9, 8, 15, 14, 13 ], 'd3_256'); | ||
P256.prototype.d4 = w2b32([ 13, -1, 11, 10, 9, -1, 15, 14 ], 'd4_256'); | ||
P256.prototype.mod = function mod(a) { | ||
a.strip(); | ||
assert(a.length <= 32); | ||
// a should be <= p^2 | ||
if (a.cmp(this.p2) > 0) | ||
return a.mod(this.p); | ||
var cmp = a.cmp(this.p); | ||
if (cmp === 0) | ||
return new BN(0); | ||
else if (cmp < 0) | ||
return a.clone(); | ||
var w = a.words.slice(); | ||
for (var i = 0; i < 32; i++) | ||
w[i] |= 0; | ||
var t = this.t(w, BN); | ||
var s1 = this.s1(w, BN); | ||
var s2 = this.s2(w, BN); | ||
var s3 = this.s3(w, BN); | ||
var s4 = this.s4(w, BN); | ||
var d1 = this.d1(w, BN); | ||
var d2 = this.d2(w, BN); | ||
var d3 = this.d3(w, BN); | ||
var d4 = this.d4(w, BN); | ||
var r = t.add(s1.add(s2).shl(1)).add(s3).add(s4) | ||
.sub(d1).sub(d2).sub(d3).sub(d4); | ||
return r.mod(this.p); | ||
}; | ||
// Point and precomputed 2^N powers of it in Montgomery representation | ||
// x: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', | ||
// y: '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', | ||
g: [ | ||
'81e643e9089f48979f48c033fd129c231e295329bc66dbd7362e5ae17e22dee9', | ||
'3f851fd4a582d670b6b59aac19c1368dfc5d5d1f1dc64db15ea6d3a2dbaef7ff', | ||
[ | ||
[ | ||
'18623ccba0ee23ce0b62e1e014040471354afc88b285a04e0640ca7a0490e249', | ||
'7f7712157b93134b3a0f64bda2cc6584fd25167dc75ce17d12d6233bacd0a3fc' | ||
], | ||
[ | ||
'57e6951ca769b7de9fbe79f9b379e037571e4d3b9b132f3daa13e8c86a0c5c69', | ||
'9a2dbb209e02b9c3e5bac23d6a1839746dd1bf9400d1361372e87ea7f5ec0b0c' | ||
], | ||
[ | ||
'88630cfa83a8c376af358ab408c8b7a060c0bfa606728f2316207010b4b8d33', | ||
'b43f997949086075193c47f1ea48b27b292c94ece7dd34ceb03c71ca2c2ef695' | ||
], | ||
[ | ||
'f2007d526d9948952ed69488f3f45a78d77162cf43dec541a38519a6e24ab567', | ||
'6b9ec0f2e973c0e6e1d02ce631ad7535538b908855c928b252bfb8db528997e4' | ||
], | ||
[ | ||
'd1c0e47be6cf2393e19cc4fe000a29acc8229d708ed2437c2cd2b5e56a3f7518', | ||
'734a1a4359aeab408bc0f94e530eb07674374a341f8cab7d04a2a0123f3abf4d' | ||
], | ||
[ | ||
'8bbcf71f86167c317b23fa350f79dcad6f0e400a1a959cd8c0c00c51c5e3a9e4', | ||
'5413fb651654589117a04bde169768dba32df911f6a91f8a4e4fb78f8d62864c' | ||
], | ||
[ | ||
'530b36ceacef824de65a27831fe18424baa6dda27cf329eda00fa6313b00c355', | ||
'92c43520968b2f8cdaad292cd58757a15e982da1c18ac5bee2fc9ab0b46d91de' | ||
], | ||
[ | ||
'79cef38ff606e4c31c9d2f4edff79f1835086b7c2024c94cfcb4bdc410757935', | ||
'512c3a42dfcd74e023b6f049955153627c2be007e10df3b48c82cee71b19f40b' | ||
], | ||
[ | ||
'18b94b4713f604867081c61d838e774aad02f81775f1000bfe04a93854817fac', | ||
'1b6e9b27763e717fe3818474c34d950be67ab5ef0dd49ee154230edd749947a3' | ||
], | ||
[ | ||
'f5a0f4033b7e89cb9f68786a0679a18668fe168ddbbeaadb47b9e1bb2a40dc0', | ||
'530cc3e4dc133b6190f9094db5f974f227ec0293549ddc215ebe7d2ce18a5f5' | ||
], | ||
[ | ||
'c2f19024b2b7b7a908234a2b3f43716d395846aaadd62f7de2cebe0798367478', | ||
'dc4b14168e68f122a165029cbf6ea0e11536a3d7adab7e52b72395319a03c5c2' | ||
], | ||
[ | ||
'9c0bde99755bf7919bd70b4a6e9f8aa001a156834431ed116c76885bc21a63a0', | ||
'307be489bce3f59658dc8daad44dabfe233422662644c34714b6ca8f90f66554' | ||
], | ||
[ | ||
'5df455e6f0c5c9663940c4be7b2361c03325d7b4b720bd80ffeb1a76f0adc933', | ||
'72f60db0067652861e5afbf991aaed980cd80bf0a4cc8a6ca7dfd97e3f151b21' | ||
], | ||
[ | ||
'624ceaeda196b06c39f5e0f89a609f28d321824861c6c0749f73b1682ac9958d', | ||
'2e7ce8d09ae8893ab968eb37aae611324cd765629f2067875485b0a3a47fb12c' | ||
], | ||
[ | ||
'd4c6a641ee668cc8e8a1edb3e5216e993ff46b1930d6a46b260bbfa6757d7a00', | ||
'8f9f7804862d3efe18ecda874d8d5468b15374a4b5047f273938fafe808a0950' | ||
], | ||
[ | ||
'a5c6c230aecdacb3e4b0ac7afd029c1c45ee21fc87d728472e39690a33ea65c8', | ||
'ae9d2208a0867e1f22f9382ceb7a9b21a5ec7a4bc742b043b7f34ffde4685ba0' | ||
], | ||
[ | ||
'eb1f6c1fd6a297097ddc650598761ba39fa521b63549ad1d910ba6e677c26002', | ||
'95e1cf76e99c7a4d8e8d733ff90728c6b0f39b86090af18a2ea43e6ef8bafd02' | ||
], | ||
[ | ||
'e3321a2331559245eef966d467dd29b2573c15b709812c4198dc506ad556ab4d', | ||
'd3daf8a9add060a647d9ca97e169539615d43ea05e9a8257f5392f107d25fcab' | ||
], | ||
[ | ||
'c561e9c579b1bdb3f1ca5e1840794d46e632ebddc4127d95cdc2c706a850bacc', | ||
'4227aa0ec7c8ff13a5eeac1b63f97770d106284f4631f6ca6f7ed12d7f4d7757' | ||
], | ||
[ | ||
'99a71b1bac7deb7a4d9d08b3b5828cbcff12d439515ff5d53d5d056aed76f778', | ||
'37dbe3c16011241ed24e35f6d343520d85465e5e7f89ab6137eef321436deb17' | ||
], | ||
[ | ||
'6116f0fede8ed970c880eaa01dd4b01fdccac2a7c4e3d6d063ff057809fb351d', | ||
'bf0f02c1dad6a634e1c988a732a8bf4c40f2a9a609996d4f9b552d83aca15a53' | ||
], | ||
[ | ||
'98e204dd2d59c14bd3094f73b0e729231930a8b707ee22d0c2419fd28616bd75', | ||
'ae09c8c8340d9057c84a68fe361ea7d5d9825428f01f753fc65a245c72d5abef' | ||
], | ||
[ | ||
'84c6248b822a9a37122fcda4748fbd1cc32b8e0f98986b078f84b15102b097f2', | ||
'e3dfab25acf4eb9f1b455c8ea94210768b4d38574501694477516032bb3142b1' | ||
], | ||
[ | ||
'9ff060a70bfc59172e66b4dffb9e311108822731948505f1f30e548d61d2c70f', | ||
'508fb2b42b5e11ffbd8d2b1faa21c5ae3d6b90b7bcb26d4e514b1ede7f9a9f26' | ||
], | ||
[ | ||
'19cbb4be645868b6209e17ed7811954e2372d71c023806dac9fee0a5fdb5156d', | ||
'aa7d33db261a6cd08bdaa15fe866661f15380220f5184ed00d02b2c367eea0a0' | ||
], | ||
[ | ||
'360a8ac855f8ec6c14a14278e145c62c48e9c9271f3aa8807c4992d51085f361', | ||
'c6b8dadc0b1203103d39c73b8a239a3e4db0f1fe99621f5aca2af7ecc3522051' | ||
], | ||
[ | ||
'ced3f21f2c9af358ddd8297a2176cc422d0c1be5c66fadac9e378fbad4d06e29', | ||
'92efdae73a0fdc604ac7f2998a199ce2b707f1c785fadf6a271698d37fafa172' | ||
], | ||
[ | ||
'22cee0955924a75ae11d44a2d18bfaa1dcd50a06ad9e0af4f0250e34b6e5be4d', | ||
'e1ad45e9f40c0138aa2a3125fdaf3fca473ec3798d3edc7336db5f0e23308ea1' | ||
], | ||
[ | ||
'a31d0483ee9338b3636741b29a523f119280b9c05e6183ae863d1b09b2ded0bb', | ||
'c0d59743bc15edb69c6b48740fdc53d3266e189203414ca782e9db7dc6a8a71e' | ||
], | ||
[ | ||
'91ddae7912926ac023d28604cc2dade6b946d4af1ba09ab097726a6b37693d99', | ||
'72ab52a6474b56ff8ef73cb4f4f9e3f810acca720ddc70564db45f15f90e29ae' | ||
], | ||
[ | ||
'ba5efd9a10d36100e771b626da4ac215c3ebada129b871b4028f92e27b041e04', | ||
'1325161d621df1a9030fc62e29b81b2cd7fec6334b9d0e93982e7a894b5bf1b5' | ||
], | ||
[ | ||
'b436f386109b4e9ef9133702cd5d56af4095525fe1d2dd9f30222bfa476c2223', | ||
'2479a7c394b50998f120c4a670b81d349b5f127619927f0b4f8ebadb8dc0bf5f' | ||
], | ||
[ | ||
'1d3f188bff86c24cc3fc6e16e0251dbaa506d8bb30cff5f9065b1856fb2d2f6f', | ||
'f17da77f0001710aa7081db3b87f92c63f14011a233126d33d0392198b07c102' | ||
], | ||
[ | ||
'3672681533aaa6aa34cc99e731d4c353842d74695921e6c7829ea525f20fe15b', | ||
'f6563844506fc9651aed2de269adbea8dcb67db62f9483c620d21a37570b03ed' | ||
], | ||
[ | ||
'17e81a4530aacd51f71ff256f595a04f80e557b4613386257cbb5b08920cecde', | ||
'af6ee9bca94409791e48de6b1e9af8abd27708d3065a364750d6df6f8a384756' | ||
], | ||
[ | ||
'a558161ac906f6f6a154cc23a0a78aa2bdd58a729aed26c3f3edf59b2471004f', | ||
'24a09c39ec4c70799f90a5a917fb59609b54e610b5662f43a53c195b8626f1d3' | ||
], | ||
[ | ||
'7a7bd0b087b69ccfd8ae5fe0adbbe890d6557dfaf02439c27978609419197db3', | ||
'f419a334d84e59c1b14459e07b67ae608be925a7ee104702c7ad93d74da3c48f' | ||
], | ||
[ | ||
'19286cd8c4e5a5c05647c3d28aaff052f846d64c46858ad65476fdae61e1e356', | ||
'22abba66be4dc0c8a026c48b282577ada62460ae4880845a07a7082ce4c6cc9f' | ||
], | ||
[ | ||
'cee032905523d53cf9d9868a8e0a61f41e2341c2ea9b825410fd7e184f91fa08', | ||
'12d02d59044ba53e47846c9acbd7c3c8f503a954b36dc899e18cbfcd500f3ecd' | ||
], | ||
[ | ||
'7e206f5f040b8b24942a08955bbf75753e44ad81a39a40b4cbe1f9c61d9eed93', | ||
'b2db2a4267c78e1436c2e876ca47b851296c3fb66b0f39463c8a16f13e0ee917' | ||
], | ||
[ | ||
'6f94a4503f65132f9b0b1ebcd49f67cb5e512eb0d786ad768a66de2590c7178', | ||
'db3f73bd703bc2dfc7db252b5d1585b57ec65d9f86dc68054b980511dbdec9e5' | ||
], | ||
[ | ||
'f113c2e1db2c4153ccf567db487d1a4289b0a50d5137d97ab495bc4a29574e59', | ||
'b7f694c0f893f4137b2a603dbac5ba5a1d2e66fa691934b690faa5ebd1e87afd' | ||
], | ||
[ | ||
'8f6db65f6034364c8277be19c46f7f9d4309f36eca3cf15c205af91f412402fe', | ||
'9cff57869396af83eb828b2aee808e322f8a8b8eaf049d852871f059402b9a37' | ||
], | ||
[ | ||
'a106b32602649495ed09e9952038466885d7d5b186da90fbb078b0b2f3a663f6', | ||
'bd8145ee9146fa2490613ccfa9b0c41056d98b63c51375197f54badbbfd6946' | ||
], | ||
[ | ||
'8b1bdb750e7dac18fe61276df7a88c1b96f6d669473bdf91018dec6c7fa8bb15', | ||
'c554ac610987cfe29b0dbc4b1a54fe55ed7c610dbc3ff87fb0ce1c0c1a3298b9' | ||
], | ||
[ | ||
'c1b8e06b323296e75bc57f39433bd4b5738e4c08453c118ab509c21c53159735', | ||
'f397f3f3697af9e8a4304ae166ace1e59d1de93c447acf5fe6c386d23bb3efa8' | ||
], | ||
[ | ||
'2735ee32f4295ff2531ea132b77e29cc7f5c07e0fbd94329a703ad2f987aa001', | ||
'76ac3d75e0e134381526cbcbd8796df720f228ecbc8ab4dc2a83581ee527823c' | ||
], | ||
[ | ||
'f354d265a85a7d3bd453bf4619fa9d88b68810434ea2e8b6be30d7ec690ccb34', | ||
'46640ced889ed1ccadedeaa81c00a8ae770d165317107e91c6edb84854c843c6' | ||
], | ||
[ | ||
'b769ac6317768717895b4053ae34399e51a80bd00a39ab4fe0a88c5935fc27f5', | ||
'4d7901ddc8491b5e37ee83a65e949af3cdff35e863840b24d814a48419f8ed4' | ||
], | ||
[ | ||
'69b5afa18ce64f544c3e23ae1eb36190ad3d8a0a9b4a8751950cbb52c470ddb2', | ||
'542c046baf45dc63f33d45f1a3d771ce3beee93d717c65584bed45539ac27cc9' | ||
], | ||
[ | ||
'33931af490e761f04aa20bf0d108646dd0e3f756cd6c6b30d315523c27197be', | ||
'36a029abea7bcae3d0578336fc35b23e9249eaf1407a4133ef88a2ab161a052' | ||
], | ||
[ | ||
'd30dc90a3c3c7ffc2b420f22c654ebb73df5ee9b99db729ff47ea6f3491459e9', | ||
'6af64fc944a199ec5a5d57cc17b85488840754a82c9b1edc38d58bf560cc5ed6' | ||
], | ||
[ | ||
'df46c894c45f3001591591b6aeff8049f1efed5253ccec6f4ef69968ff6d4ce8', | ||
'ba8d9ac64b362479a8615e29be22f6096f8e5eb11e3ae47bfafb21c19148b9d7' | ||
], | ||
[ | ||
'3526281ec3e3d8e237f9af86274217af089305f874c06d7409cae0168d8529a3', | ||
'327c5fa48ff343fa21fdc1cabe1ab254bf72f7e36af1665e1d7ec61cfd7a2ba9' | ||
], | ||
[ | ||
'9a00270c215642e02d49fad3feb4c4b2d11755973362e25c92d1967a29244e8d', | ||
'525b9be537c812ebc4ede69daa90023090e7cdb8e81d80d06976a311ccfe3b63' | ||
], | ||
[ | ||
'15457989fb31e86b766e52094a50e14595b420413a74f6f459f7b4dc25a96324', | ||
'98eaa14c9519a8080c953d28afd08c33e40fb4e2f5450f45e46b804680e16e85' | ||
], | ||
[ | ||
'735f36e783aa3dc6acf7b90e35bf5b1d6219dbcade03d02479b1ed5e9e9aaef', | ||
'6fd6412ea0ecf13ba028b995846d7a5d3dc1be5897d9aa393fc3995dbaa9c118' | ||
], | ||
[ | ||
'5909eb601f9913897633b13c66d4406d8b643c27da179a519bf552a42ef563f', | ||
'5e37dbb00980d76845bb2299fc2341d33124163ed0a6ea2c6a65372bc3fc082e' | ||
], | ||
[ | ||
'9d2919cc47f615c8385ff71007fe8cc6a9cff570e0b4866dd33d8642faa81054', | ||
'6ccf8f65643257f0ac589583e96d6f52baf59e82d6827f9c32c8efa7a797c9aa' | ||
], | ||
[ | ||
'74d8d85ec25f80ef334ff50d656e1ee7688f8881beda938b651ce6328cfd3713', | ||
'a61f17823f531088deb51df6e90c26af5831c18d4dab3c9e13eae400c03a1c37' | ||
], | ||
[ | ||
'210cb3f6efb30ca8b52594b17c9baefab69b8d1d01759d6db7491f69e3ec4f16', | ||
'e006bf8999648fe7642e69c7f87caa5ee71cdb2df60ba8c5545b12739502a894' | ||
], | ||
[ | ||
'8acecbbddaa65f8c3ea2e0055dbf4164a5d28a4ac99446866ea46e4cf21a5d53', | ||
'6d543ce387405282e6ac2da26eadf6626bb951bc3f0465f1802eee82632cf91c' | ||
], | ||
[ | ||
'3a69558ae0bb1d2439a6d5c8ddb9cf350bc0e9d69311685752669df4c4fa3ed6', | ||
'71178186192cb2dd94fc99243a2f9f96658df6eb98b4eecbe2cbc42fd3e8091f' | ||
], | ||
[ | ||
'276680ccc851a39cdd9c462ef8a9cf3fe27c6a195edbf5b6b50eda732e98730c', | ||
'1a49b77f23719cdced315c48b8fa3e614800006b0ba84cc8e079a5000aa11c61' | ||
], | ||
[ | ||
'4ee6847710d86defd5d6f24cc5d6e0ad363af24d4b0c6f9c2dc74b052ccaab2f', | ||
'bccfdc730e783a7ee58462dd69d7983d90a19d760b044fac77740c0a836cb0e5' | ||
], | ||
[ | ||
'4542a637260eae19642255cbc346592072d143f676d4e407723822fffc160449', | ||
'f471e116ea53bf88ae06b995c119183127e5f14c89f1e778312ef6100a4c881e' | ||
], | ||
[ | ||
'd4037b60c19a0ecc3adc4f0caa7d42d2dfe2626d02cbaaa8ad365615cbc05c67', | ||
'b52933cd943161bccfa0820e1184f336af5ad4db28bfdaf348a376950f5e56d1' | ||
], | ||
[ | ||
'a18196426f1eaec3cdb311d3b2a63e1361f201978659cd8906b35984caefaf0c', | ||
'750ed2b0d1d8f288285a2c7a68e76541341af13c7eced29fc1bb42cdf66a93ca' | ||
], | ||
[ | ||
'3337d6265e61a30e5951245e4be7791885861059bbcc7c70082bfeeeb19f8d1c', | ||
'2debe0b554e5b3fc84e2840ac9ca064f5363e112257611991c276b3dbc7323d2' | ||
], | ||
[ | ||
'ac699d5c131aa213c3796cc6066192bdd078523400758e60c5ef28fec46f6036', | ||
'498df131a1d3d30929ab49a82244a3dbd7486c1b30f5e09eb3fa4b925d050586' | ||
], | ||
[ | ||
'3f63051a8cd005de65db0ab3204b5d42d4373e7366aabf4886cbe661198ecfbb', | ||
'8eef27aa50fe8973a4816f3785c5192265e993b4a71f08dd738b5a006af8dd19' | ||
], | ||
[ | ||
'bc62745779456e067cc69da5b14d827c2c8213c6272451d6903021d38bd13059', | ||
'f8657ee1acc93507dbe881f77b27f5f0272347ca2bc9d3491003d037e5c15a57' | ||
], | ||
[ | ||
'7d2ab7a53f5c0f621709d51e0e6b599459b268a8f8a441d48ee6e7a5cc299e56', | ||
'1d3e43d3817bdfef0469d2a9e82a379371372eb94143830c5185aa0dae661f9' | ||
], | ||
[ | ||
'50f46037867b0cf892307f20caebff6289d15365b855b06359301499f4b7dc3', | ||
'eaa17e87266395896bc119ccc8c6db9f5a7cff0c764963cd9f8831f601026a5a' | ||
], | ||
[ | ||
'ff59f0a9009a45c1a421b7ee6678eaaefcbd5dc8f779734a74e34ffd59e7ecb', | ||
'424c986e792bb2a261f6f3284db8dfa18f977731f0fcc3d34b5f918e80351e42' | ||
], | ||
[ | ||
'8c157dd0a5374187eb0a1d7c124c106080c2cb1b65007269d56560b4747a0009', | ||
'e48336bf5a070b6480c758a8d2c2524ff17b1579ac26918236452dc6d5e857e9' | ||
], | ||
[ | ||
'4624803b6a34d1228dad14acc8df2bfbd125de0953c76a0122b6fac7718f4269', | ||
'441fd9ff0ec046a3890cf028c9e6d3a9d7f08bb2ace072101d67011bdadbe385' | ||
], | ||
[ | ||
'e71551a8d50c7638f79232c9225e84613b633ccffebd31f441a4d65ee99c8427', | ||
'2440eae5b044efe90b60842a79f78c0c05d4d6e874dfff4eaaa477a9b6df8abc' | ||
], | ||
[ | ||
'43bd659b1b8d24690b57339915c0c57e6ea0c173075ec50d8d301588548d7adb', | ||
'b819879b6aa0a78a449724da747467f4b15edb0c43866c0f314caaf88c3ad5ad' | ||
], | ||
[ | ||
'153f53004fca400dc602351925e578a95ccd098a8b68debe0b2579aa0233ce52', | ||
'13b77bfbf58688fcfc4ef6f075a443a5327909a0246beeb025456c2266622db0' | ||
], | ||
[ | ||
'116505d1db396f3270f90a66c91c053944f9e5f65ccbab0cee895867b48486b4', | ||
'8d24c5a774015fd41b157b1e52b2cd35b467d8a3b158f9b862a96e150c17bfd3' | ||
], | ||
[ | ||
'61fad6321904c5c4aaf9dc9c96d5d35fa794be31e71c1affe0dfed9480606dad', | ||
'c0e2f1b7e78a0f9010f1829c1da5507e1fd96e570ba1d3219a6524f2a93b9b7d' | ||
], | ||
[ | ||
'1ae127ac2f427bc735fc201b8c060c29c45d0695d9900d654b904b44a2f888cc', | ||
'9f646a59ea850c7b37a5ef62585591e67e9e310eb1664fc8ef4afb61135d4db4' | ||
], | ||
[ | ||
'2abd039449df4613486a950061cf3ad655b14e47fefa01fb5b141a94c39dbf50', | ||
'7e2382eb6d9157cb745d746cd72bf921f47a9b2794ab12c7b8ea6f7aafdc15de' | ||
], | ||
[ | ||
'ba1305ef6c3c44c89c449c188d13e7fc612134a33914a9d073880e61f698c4a0', | ||
'3d0f2edb54982820de0c62e1f50810870828aae44e4ed32aad7b742a2100d44c' | ||
], | ||
[ | ||
'15a660e05e7cfc9b50ee21d60ef87040accf21880aaabd3669804b61661ba505', | ||
'de8964f3dbb6ffdf340f723f2dff04fa4a50cf38f949aca8a0f6341afc247604' | ||
], | ||
[ | ||
'950690d755a273562447d2348874557294b18121ff10302204dc4a0a72b635dd', | ||
'834781f22f4e263c546f47ac40622e793b9c068739e6b35ae7245c9412332a12' | ||
], | ||
[ | ||
'a51ef6a4e00e0fd0aa44b2d1d46db1ca523f5334696a94c75fed662277b64a74', | ||
'75caa651aee201df72f6017cfbea50b2677993d9612c492d9a298b39dd2682b8' | ||
], | ||
[ | ||
'b51b91e9f040246393a17f86c0b714652c421b3cfe5b5b373614fc25315dab56', | ||
'e657c40475a25ffbac8e5d738e1e9f8bd01fbc257b708f7983229b81fa425677' | ||
], | ||
[ | ||
'3c7a7e72534cb1fd0bfceffc35a5c073d108a66ff59370d8c2b174ccaf8c35ef', | ||
'70b14681f666da5e0ab41c85b373fdadf4bb553c07f69087848d099e4c9ed90d' | ||
], | ||
[ | ||
'41317b21d17bcb4f27eac0017cbd0df9224c4eca47906fc2fdd8ed8807843455', | ||
'a134d357d24e9beda22a3ea8a0aacd22428dedddf12ac24917023b60d2836806' | ||
], | ||
[ | ||
'c62c6dcd9be21d8e1ed8f091e24d0825d126e5221d753f52e23a0ad2eeba39a2', | ||
'a62b0d64c72a93c9aa988de1b7e65caf2fa26481a6c714bca978028532ad58f0' | ||
], | ||
[ | ||
'80efd26b0950f16375c396202f3505eb6d71757fa67e5f78945ac004286bb735', | ||
'6c63a02c32843dea5a49bcc740544487919d890b14828f6b00f83cf39e478bd1' | ||
], | ||
[ | ||
'6d94219df22d27300bb0767ed8dac6f86063c3c4e1ac66572866933e2212de01', | ||
'1a364a3b41de910052ca94258bdee7eb8fc052a44243a9f057605d82931e20a4' | ||
], | ||
[ | ||
'18fab47f841d759b6f29e51c9807134a8b3c0600eadbeb08288cb03d0e81e10c', | ||
'7903dd0d803ccd5793df5594ff5b39c1b37d3acdcdb20e2a00bcac2d1397258e' | ||
], | ||
[ | ||
'f924bef72c1af90dd2b85686ed4060d9fc7c9e500a563f0f65f52b7512a43aba', | ||
'b04144323a9634b54ab5de579f69b4e2efbf13a963708b3fdab095d96b212b0d' | ||
], | ||
[ | ||
'118dff45dc51631e65799b83cda41ed5770b8da078c1840a3018b0266f2d7853', | ||
'756e323d6f219d2472de2cf9f0b18f3b38f0a86665941e18d705e96b4672613' | ||
], | ||
[ | ||
'36569d637303680a3b75b370092b54da8fd3b8227c64b6eceaf1b7a7325c4e2d', | ||
'414e463067353fadd1bc16975e576e2138ce37bfc61362f9985c2daa101520f7' | ||
], | ||
[ | ||
'bdb56f09f55c62c5844342f04427121b48c768c393de8f91ee3f969218bba68b', | ||
'b5475d1f338db2e434d5f8fd2accced28455a84c3833afacd5821fc74efff1c7' | ||
], | ||
[ | ||
'362c3dafdf8bbad527a2c607bdef0de340c4ae29207af95e0570b71b62387bab', | ||
'40c279d15a2323ba7a6b7334124a7d147ce7591a2956b17b4fc2a9f95f0cd2fc' | ||
], | ||
[ | ||
'39c20628722591d59b1b55c689dc7390642c13a80c38d03f2f49143ad40ea37e', | ||
'14b4d76462c2e0132eb88f8aa0f8d41c107c2720d89f983044180feab5cb5185' | ||
], | ||
[ | ||
'96df4f311cee67d1b0fcfeabd465cc28b9929d3e223774dd15e68a88daf56fb3', | ||
'51e8b48edf3a998fe2c6bce68a4d528a90bd15b33b5d1fecb3aff415325d646c' | ||
], | ||
[ | ||
'fd477a7c975ea7712d06cc258387e7cdbe7bae9c37e6d86368c53bee1abbd834', | ||
'454f467baa67e378677aec9096a77ef75a9d1b5a77b165ee2e034c44d2c89647' | ||
], | ||
[ | ||
'5c194b050a14d175512520360fd3217a5774f4ddc19852f1b75df7c7302470c3', | ||
'3e63848ace3fd80d232cdcc9ecc58b56af0fd3fb80ae6e2c3ec10f33e00c6931' | ||
], | ||
[ | ||
'6d31426bfc58ea83ac877e0a93983d9f3d8f0837e532ea9446ad0acd850cb85e', | ||
'37dc1eed053decc7cc8678449327e37f9f78281fdb0cee8ce87afcb24096d2c0' | ||
], | ||
[ | ||
'dcf48dc2535365626ccdb80144de37572b70b9b594c351648a1ff59e55702a4f', | ||
'3afd8d641e93adfac3bee45d6a2534ebbd6857df5f36b027b7119a55e38cd29c' | ||
], | ||
[ | ||
'78d0dced390630729dcc0533db00fcf9729be33ce8a2f95397bda4cb8ebd3d3b', | ||
'a35ce16cbe8a02af4a7dbfcf0291109c502dd58b4d49cba136eef006f216befa' | ||
], | ||
[ | ||
'd2e00c625802147f341b264eb89fa710ca4982bf923c8cfa7a7ca521e08649fa', | ||
'352204d3ee3dcb4ba505d1846d4e4a9cadff5b3572b257f4431edc31dc810bec' | ||
], | ||
[ | ||
'9b647a128bb31fa85ecbe331cb7aa0090dbd12148e1882aabac3a07ae8139760', | ||
'6544e2bf83cfa93656bcbc355a48896464115f1b018227bac0683a6730df89d1' | ||
], | ||
[ | ||
'81d57eb38a33df2bb1c7d369f1d26f8abcdb14639542c266f8ab1fa8b34a028f', | ||
'bea15264764e0f1eee24aa827c7e3f04fb8aa50495e23a09ac2fe4333b81069a' | ||
], | ||
[ | ||
'3fb894bd1ad7852a0d7f9268dec2a0827e9dc538f58e69dc0933f4e51543b2b6', | ||
'8393292baaaa7aa9ac1d6954e935812da1b2527bc9a0dc98514af5e728a86548' | ||
], | ||
[ | ||
'c4552e6f73484c6cdbef514a82737d920f9627c2aa04daf18e7aee27f43de8e4', | ||
'9f23dbb5487724fe97658c8195822dd3dc3b6a879a4556d5746e8133d7106ba2' | ||
], | ||
[ | ||
'c07d6dea31b3d7ec506ec3a7ae15b32503f6ab850d3b04930cc9f7fbcd94d9ab', | ||
'b14c768d876920e3124491719b38fa422e43faf88fc0517a3b5c09f653824c2e' | ||
], | ||
[ | ||
'3e53eec43c20e1c5d05f86c7a61f9476f3b8206a0a77d1a6e7de7cdff411f420', | ||
'4890e1fe4b90f2e16f372a0ecfc4e5b9df4a57cd1e0306a0cfb1f9a53125b49a' | ||
], | ||
[ | ||
'bd30de5442d455effafc6704b7b23c046988d7a90cc9ca087707929c3cca1140', | ||
'14737fd5c7b97e173942e9b86eaa821d1d9d41d94ffa00fb45dd2574fa8212e' | ||
], | ||
[ | ||
'dc0a927a85dcf2664a3cc47bee2c10d45385b45d569f45f39b64b9bfddfd3b68', | ||
'8024a20f793d282e68030445354223bdbfd7c69b383fd9c52cb3b8cd9f308772' | ||
], | ||
[ | ||
'da1975f844faa69d28072a5b5e3864d89b5c9779d9852fb3b41b062c3c9307e2', | ||
'49b5a476a28a3c886b0cf6f97fb64f1f657cd648a7736be79c48901c8fdeef21' | ||
], | ||
[ | ||
'73c3a21f0a91f95b031f2263dcb46044616839210d92c6db79ed3742e7170589', | ||
'34558c6cef3a4285b1245085cb608f90e8b6d77415e7bae3a171c36bd1060cdc' | ||
], | ||
[ | ||
'246f5ddf7ad0f0436511603c42d1f747d37598cd530741ba072db1c1fb7e7336', | ||
'afce4d991f4753d1c9cb04dbe872570d85d7a7349deadc8fb015ace0e484a0af' | ||
], | ||
[ | ||
'31020432c3b8e36746a7a8e9970a54195e96ff22de8830b37b0a33708de35b78', | ||
'8e9c907f98d51e0992234575856adb552d969932e19cb58f88c4e5f6d78d701d' | ||
], | ||
[ | ||
'973c74f446dc7d79966be0e00351641b3f2bfae66c00b0f71b570e1bd2de1974', | ||
'93648b48be0622b2ec85c56c64c70fbf2b50ccfa3d438ff5d6eb2604f54cf363' | ||
], | ||
[ | ||
'ac5b4fecdc8566d126568de0d8bab5db1c89891f133225ddd3edb56b7682edc5', | ||
'ff90a1023ccb2a2fbb05c2aafa221f36c915e9f10be28c722ff7a0f73d90afe8' | ||
], | ||
[ | ||
'824a1596060347b0d510790ef0a6d5a6d3f368897f9d2f5eb45bc71e99abb731', | ||
'a6ec7c35cd57c7c5655c7887c9b89c18f0d11430c72081ca274dc40eaafb103a' | ||
], | ||
[ | ||
'11fb6752b875272b2dce3d4600aeaea47f4d3c459344fc3fec6c68e620547eb0', | ||
'c5eaf4400262a9ea091adecf457bd23a4d78bdb04b4e6e32935ec3c48a2b5c91' | ||
], | ||
[ | ||
'de8d9b6c5a26e09aec5c76435c04946a81357ffb60b0c42c441420a8bd80fd51', | ||
'e69edf17fee1a0ce0a4697d0d19c370a064d0834a8f7724ee94721d799502dc7' | ||
], | ||
[ | ||
'8c5ffa9f2a826ac3c9a473cebddda5b2f45187d58ded63607d9ff52297e77025', | ||
'9cb27b8b785dd210522cf960f2a870b77ff183fd9cdcdfb013c633b5926dd0ac' | ||
], | ||
[ | ||
'e682411d98c1b4efff0cb78744e2ba1a071d2c7836b6afb61c560c6d3e7d05a4', | ||
'1b1e05608c2ed2187e10633be9fc7949ab8da44fbea5d6cd6960ebaf5b2266aa' | ||
], | ||
[ | ||
'e88d514ad0157ea68b3db0772fff7df1d4a4e11c8821fb0f9d275d7f9956d384', | ||
'afb709cfdf1c7865939879278783b8be06c395cc8b83a330215fb654cd6caf42' | ||
], | ||
[ | ||
'8356b1204b9083db3cfdd8c65e8e9184ccee5ef569f77659e0e25f0d786d5dce', | ||
'a2e3458cdf60c755cb76cd08e848ae85dffa611efe1b23542586a5dd352942c0' | ||
], | ||
[ | ||
'b88f81fb64fd083886e71d3ca0375246d343384878a57e4ded7eeabcfa7eced9', | ||
'fc41aa5278f731fac7723385f9b49c59b5489f92395b9863b59d58ca1d00811a' | ||
], | ||
[ | ||
'345d52e3eca58340cdb35ef22ca374c32ead3445b80826bca63e9ac4b7230f63', | ||
'8c3243806a8abf6f368183e1f8a6fba53937d5f9e6d29eb7ac89548bc9a6c52d' | ||
], | ||
[ | ||
'd0766c53d7671d6137bbb39f63213568a707c066e269768143df734d33b624cd', | ||
'3d029377ae910254b05a758124e895f03b9577d36dda615911dd90e4e41e8cea' | ||
], | ||
[ | ||
'a0ead591977b661e7986cf67ece5e9a0c99e14ef252dad7ebb859b8e375077ed', | ||
'2bb0c1afc17f8c726afe793200c5f4872a712d54749258a649c7441732725c6e' | ||
], | ||
[ | ||
'9e6eacc37256b6c712c46bbf4a949c3f726d9dda99164a9cd93b508cc1095bf5', | ||
'8f05f38cf8ef331b89ff18afef02874651e3ee1273185515cd9bb1eb0f64f122' | ||
], | ||
[ | ||
'1ce36d6a25d515e72a038a3f2e6273dae4fcc28fae1141e94fe042cda02ebdba', | ||
'53ff736f92d75c124656ac53b5a95f2211bd25172d5018153e8a2c5073b5e48' | ||
], | ||
[ | ||
'a85d1c081136bbbc213bc1037ab96c90ef4f98de1836bd627d47f1582f3e0be8', | ||
'3dc0847e118e33789a1ba17b11b196a141225e9cc314d0118d94074341707e61' | ||
], | ||
[ | ||
'7ecdd912adfa1c5675e4b46c376e65978e8dffa6b4a84a72b4f82209c9961f0a', | ||
'efea6ea4391e190486116b65982e035cf2d9d8ffc2525d2716fbfab25c666d81' | ||
], | ||
[ | ||
'21c86c3065d125a70613f2509587d0c8ff597fd42abaa6182edd86cb8fb82c1', | ||
'9f5c66085c5509eb80c17347a2a271c223cd9bb1534643c2f6f6f225400e5d51' | ||
], | ||
[ | ||
'70a9d5d14d921d41b004a9df51c763486a41c6685428b5e38901804709f61978', | ||
'63bc331d479e449d1b51dd70307904dc946697782140cdca0b73a4846971e48a' | ||
], | ||
[ | ||
'b61ebf9617507c880e9c1b88971bdf6d7848f8de2aef07196be23d0a975feda0', | ||
'4b3db705b737b478bc5008a94fbc748e3eb39e27efe5db7881e1cccf58d1f63a' | ||
], | ||
[ | ||
'12d8b71c4951b8ecb43151c36ab664dcacde01f28742c97c5160a6a395b60e3f', | ||
'75a733bfeb842e9e7f32d75e9d0611c1fca494e511db0c074e467b4df69962b1' | ||
], | ||
[ | ||
'945b97f86636edde2d71b08c1a63a2647e3c94424de0f4311570c2df730c720f', | ||
'c9515440be2c16d9ee0e78153e74ab92f831226b52aae30baf127ba0e400f22d' | ||
], | ||
[ | ||
'd5088e821939e4979ec870a2f9ed58595ab16187f2da644edab1721ea9be0466', | ||
'99fe2a1bf492b4fa9feacae37c7a09d3ee8fa2597b7d0e3ef8e78403e2774c1c' | ||
], | ||
[ | ||
'16659aab2dcd2c60f8e2afd51c0a1dc83d3ba418b8af1c2ea0d0e0fb01a5b8f3', | ||
'34b7856a966271d9b384153f6b097efaa00a431ebaf2b4b17fe8de754916e548' | ||
], | ||
[ | ||
'533bb6fedc75e44ce06b7e2b0f5e325f679c3e13ec96e50e56c67b9d2f4e332a', | ||
'2b336b851c1a2b1915c83409f7c1a0f4929faf3a6ddb00a0dd19b0fa80e017f7' | ||
], | ||
[ | ||
'3f13c4a1fe47318f50d741659aec4acbbf4f19cdbd9fe41b28f46d07196c249a', | ||
'6a01d887d25258506bcd04be1922cab6b1f23a30bfbbc28b08f67e1348ebc927' | ||
], | ||
[ | ||
'23018b4758345195e83fd319b979a4df68b68a54824cab5e18deca987b5fe40e', | ||
'b1d023c31d99f5eb3f361051c6410fda343eaaea7dd7f36d542cceebb1adbab7' | ||
], | ||
[ | ||
'a134214dec62b89a2a033020458bc9d38c0a2e76af5d639e286678df5dd90e4e', | ||
'b950a4f5129f9062645cb5251f1165fa8ab7e4293f553ee3a3384a584ec29e14' | ||
], | ||
[ | ||
'fad5a529c0a50e2cd2e3facdb1d3cc64012727d6f02f6550f96b2a3efaaca34d', | ||
'1f80ae6900c97a77e7be862cdd9e5c5b4af6d8e85b9cef39985ce1a9aaf27e07' | ||
], | ||
[ | ||
'bd4db75ae21e0ce8b03a5067a8efcd03eacc2d41dbe39ff3282b6bc87410202f', | ||
'1e81db39e2058d2c0fab457b5ee4a90f18661e6cb67a4754cf603dafd0d8cc5b' | ||
], | ||
[ | ||
'4aa12bcdd212fcbb9e99f2e3dd2388767f663bbd4408d93a5c3e5c5840256267', | ||
'cfd45e4a0c9ae03ecbcddfa88781523438d0006ab750b00fa6c247a8a3e81267' | ||
], | ||
[ | ||
'50ddfb89e17f8eca1f8047f86680a630916eab297072106fc1808052fe6a27c6', | ||
'2f82f45c3dc6bad5fbc8dd1844b7eb660582f137aecea124d3b7f8dff54fe3a8' | ||
], | ||
[ | ||
'4b60ec1388c7bf55e3665c327b5f6cd9e995a72017c755aeb3ade5c3815933b4', | ||
'13189759d03f59c82145145f33d488c400e8ef4d345685121ecdcb1a44ea57ea' | ||
], | ||
[ | ||
'c57893b9eeda56853bbeb02f0629267c8a5680c87a9bb4501fc8ebd8bdad4b23', | ||
'877a3a1bbb6a212536745e215d6d0c59048816f5cc222c68cd4a7f80ca2008f5' | ||
], | ||
[ | ||
'92c017d7b631314393cae367cb8c57a71c274738cde737adf5f9e72c84927a4d', | ||
'523175538403ee6d0c15bc9faccd59b583899cf50a93baa0a5af5ef12301f0d6' | ||
], | ||
[ | ||
'f88e1ae81d1dcc1b763c15b08f5466e3230237d731c69c4ea10ddae6686023df', | ||
'f8686c0bca447d73341f148080c797b4874044fd0a4b0880727f9bab9ee43eb6' | ||
], | ||
[ | ||
'a4bf0951291a4393d66405cdc3bfd96ec12670897c7c4cc120e21c7124b186e1', | ||
'638c025dbc7df2086e8f4381a53ce3e8fb0d9b0b8e9b95e03be947f2d3f92101' | ||
], | ||
[ | ||
'e2b02ad88eddbbb66f9bbbb1032834f599454e879bafd446b86f3e7d33409745', | ||
'1eabd8e2be33f08810257b76486e82717980e5c6833313ae5260e6a977646574' | ||
], | ||
[ | ||
'c4e3514fb0ff8636039ed5e9be26525d02cd7db0d1bce9acd537a2177a0b2637', | ||
'aff2f4ef1d851d46766072b55e569a3458a46204f13df99a081ba8ba751b5b83' | ||
], | ||
[ | ||
'3233b474f901c9c1545deb2349683007fdf0458db72e5bc75f9df69a89f50180', | ||
'b396b1eb78bea3f7f04c199421e72f39bc7f2b6b2116a1b2f97be8798456dc56' | ||
], | ||
[ | ||
'65ad5853e08dcfff6e7a8cf18ee2ba305bb293ddc1d56cb503d27c1ba2545ae5', | ||
'701299d0b136da48893aaace8ac62f65ba01fa6c260230865c7f6b593b57920f' | ||
], | ||
[ | ||
'917cac1f4c264da009aa6f5e22e2bef3dd5292b8fab9931f6ffbf5513350df18', | ||
'7f6278c1b1805ae471e05925d35b50a9894e9c5df57243fe34e30430bceb9aa3' | ||
], | ||
[ | ||
'67bf939d3f6d97ff605874da6dec1b7d476867fd36f051af9463c33510d85aa7', | ||
'387503bbfd259bc7ed87e251d0394da0189436ca4de3b9996d4bb95a9bf7bc5' | ||
], | ||
[ | ||
'30214c5938135492d92ed45ce8fb12485a4d3b01ae580579c7aa3d1cb47f91ea', | ||
'3ae0efcd76882972b4780b5f9b5bca9b3f0cd1e63f4f807060e77d3cdb20987b' | ||
], | ||
[ | ||
'fcf8557bde6ebbeef18e17ebae29765a181aae98fb3e01cd5ea3ba077eedd3dd', | ||
'ff3697add84e6255fa5bd0fc7d80d0e239f907508636c53bd9233ae4efcd580d' | ||
], | ||
[ | ||
'971a58a123f0a73c18dc9e6146ffa741617a46544c138eb9ef2df1f7216f9175', | ||
'7e518e868d093ab89fc499591520f9b6b01d5d89e7d9fa8742256d422371ce7b' | ||
], | ||
[ | ||
'61043c282f693eb3c54da2ab894b9aab82996e18eb3ab10b3b54a34cde5a34c4', | ||
'1f0acb18a7ec6a7d5d465450aa1526dcd2cf19ee26274776fdff0af64501c5e5' | ||
], | ||
[ | ||
'4bb18739ac3f8180bd9f33be5a617f3d9a8f7e350ded978ef75e0887bafeb5fe', | ||
'c5ad45e6688201a4eabe7751b3119457e26af2431fad0c862f676db9d6037d13' | ||
], | ||
[ | ||
'345fce55e87cf391d83ced4c3c451a4c3c18627bf17a8e98578a3e5d870ca1c3', | ||
'2daf419f9ab838d0323a57064a11a998f43f1963c9c1669fc74ceb0dbfc084e6' | ||
], | ||
[ | ||
'e4a0f24817d6ec23232c2fce07ce237e94f13642ae7264816a7516063928dbd1', | ||
'b9bce3bebac0263731da85e18282f9fb48322f0d21ecee441a9b649420b00f48' | ||
], | ||
[ | ||
'5a1546d0b7b7a67898ca3ed125a428994f22aafcfa8eacbc71da82e05557d421', | ||
'a45aa718530846c0fd26c3c94d52156ba81619a42a807f5a2683b6189bf60702' | ||
], | ||
[ | ||
'5631cb042f940f6abf274e8585f67834eb853ddb0e0ecdb7ff1e3c7fec263fdc', | ||
'49fd9f34669720be768e51e8325e17e33fb504f646f4da9316062f797889d471' | ||
], | ||
[ | ||
'78698de1e94d49068259351894ef09665bd37c6bbce9fdcca2d240dc3fc79267', | ||
'94ccdb9e93c4dd7e9c73cd5bd55565ff480ab33cf25ac5f73754545b00b06d7b' | ||
], | ||
[ | ||
'26aecf177625fcad4c2ad6f96fb010647c4281b3e50c95c41f39159dc3ac9512', | ||
'4fa46a5c2a1d893d211ac9053d0710a03071cbb543a91d37ba555d9a607fdff6' | ||
], | ||
[ | ||
'fb39cb4199b1065dc7a6697576a121fabef0f2045fc580c04700ab1752ed9219', | ||
'a212c71d9d4cb8302beabc5a6d666874602584bfb73909d32e50b5b8a265b316' | ||
], | ||
[ | ||
'19b770fddbccd296eef1a91959a233826e3e7d3bbe1a5a1e41e6c6f01997fcfa', | ||
'f33491e624edd29cb08894e4d35acefe0a70e2717959f34ef2d04beb3ecfb597' | ||
], | ||
[ | ||
'1fad727438db4365cefeab2e78c65804ca1b18c17fa9c330050eabe6a9289704', | ||
'7f3ed1f05d90654113b363461be3baf8f234322f231c8c325ed5feafe76b05cb' | ||
], | ||
[ | ||
'd5caf25b7ec20349e7b2a2c1d86e4105c8c37f86e8607811a6c18abd30bc4282', | ||
'52695f4ee15b9e656d73419146034dbccfc175fb1996c39b2d14c8890bc45d0b' | ||
], | ||
[ | ||
'18a622097c7dd8265d11e855237dc78bd33e4c9bb3eb63129991cca850f64c0b', | ||
'116a1ab25bf0c1c691c628a02937bf8a327174b46475dda70c971cbc82b646e0' | ||
], | ||
[ | ||
'ab1f28831092850f4f84e5b42038747b3ae5b73b3343e4ce5f7e05d92aa11cf', | ||
'96281ad5c6c2ca32723384c21bdd1e0ae6cedd31ac2cba74ebb141202d1ec39f' | ||
], | ||
[ | ||
'a82291d3db51aec0457e1209e8a2b3a25898fb5ef06c048abe2721859eb42ee2', | ||
'986b010b61315b6ca9c8709c7307f196c9d0d7821a7c54fa5694d79a8b68c70f' | ||
], | ||
[ | ||
'22f26d6219098cb6b0b7a898debc25ddcca61c9269a25600956ae7b114ce391d', | ||
'76abcbd035cdd4ad753cfba7a5125c98bf1dcaa6bbf8abe68868163c5b0feed7' | ||
], | ||
[ | ||
'c353e384225ce8c80b3eb2c3dcb9e2687e1823f496bdba7ca7b846ffdec6576c', | ||
'3a93c17e054eaed41d56846418c792f0e672bbad3cabcbe05e65dccc095b3eef' | ||
], | ||
[ | ||
'3e8009982c272eaa685dfc0bd30c3ecf67262bf1c8ddd643f6531224849ed25b', | ||
'3e0a1e1c1efc86a4f3c6167756877fedff544c6bae8b875f17349ccfc77e7327' | ||
], | ||
[ | ||
'9f0686d7972b5845918654903689fd3573fd74da3bee6bad976b8352b9fe9fbb', | ||
'cfe8e11ec23e298c0d5c2035f28ce4d1952ba06ec49cc0650da92c7b558ef22d' | ||
], | ||
[ | ||
'2c5de950758deca300a12e78d3b8be529ce99619d47356db16b9f53976cf6d1', | ||
'3a27b3e4a6ee10903010b3a3a15fea39845b0864391219f5c942adf107d31004' | ||
], | ||
[ | ||
'd19dd74b6cab8ff7a4cba66cc6cbbe7333fdd0abd08b508cfefdef88aad182a3', | ||
'9911070c22d827ebb3b4fa51545d57899359f8cb4027a0a68ae7fbd41a5674df' | ||
], | ||
[ | ||
'6494b59726b24e5237e1a8ef7b847f2f247995f810659fa9ac0ba98818fa90ab', | ||
'7052422a6897396d999ebfbeae701e6b1746962524003409fe17bf43656847e' | ||
], | ||
[ | ||
'db9e3945bd18c1a306c2a10cae351787d7cbf247626e7a8804d814e56f5729a8', | ||
'23e674c00648a8142afa423a80019125be281aab15c554a5fea55155ef3f3c74' | ||
], | ||
[ | ||
'431f9dd6243d766dbe2bb164d96d4ef48b71be71fef056b924c2098c187b7e89', | ||
'4bef31cb7bbfc379f5e35026fa488ce0dbfa7e24947691a16ad3198db0fbc2ad' | ||
], | ||
[ | ||
'45aaab0f752c7019de13396209be191dc43436f7c1d9ccb578242be9dd9495f3', | ||
'815119e8204c6d6e02958c49589ecf14d1bf6f5027b62232136355f5ef7973ca' | ||
], | ||
[ | ||
'f1f2c46eb36131ba22b299f78972926ce89abe40eb2caa9d45c63c962ebbd213', | ||
'5f0315dde611488c1fdf17e9f9dae63e890c6787cb87da5f6431b24d6536dd5a' | ||
], | ||
[ | ||
'de72e9a4af14d8d9138da021c6c3c232d9097d2f563f006453ec224ee36562be', | ||
'42ae09bd39ac083f5995b00aa1055b902a6718a1d8cb76f28778081f7e1216c0' | ||
], | ||
[ | ||
'cbf1258054bcea7410097328964fdcbd99f62269c875ffe4560927884f7fdd50', | ||
'b58fe0eb747a39498a5c1f5eb0be15d3b877ff26a946c9353f31b70ba058bf15' | ||
], | ||
[ | ||
'50501b5091d4dbf8fd6e88302acaabd2522a65500a7de4fd2ee3a7d285ab2f56', | ||
'7930ac644bb580a50c5f12777a784eed0f758f7c607061ed696481e5ce4990d7' | ||
], | ||
[ | ||
'5fd6437ee72ece1ca9e16a919dd1e0947326319e673ee1c3e68861b634614a1c', | ||
'd16b233d95dba6c591ca98e557576313ce88849e412dd26cb9289e98132ed394' | ||
], | ||
[ | ||
'ac92731b9549058b490f102ae90a544c629bdd7073aca65d14b9465d23173290', | ||
'f0ed703b876c0e7cf43e52ee6446d98efc0c934623ec1260d66e581e859a4ef2' | ||
], | ||
[ | ||
'a82a0b9b0b6cd565b9104fd877781dc3779d2387a00e57e129f0d77bc0fbe4d', | ||
'b3d5a18c1af3513c225d8b53338b8eacb6ff06ac644c878d3441c23f00e9082e' | ||
], | ||
[ | ||
'86ed3684dfd5aacc7064c5fa0d31400dd8e724916a12056cf10c24869c8b1a2c', | ||
'7f070a6029320af3ea668d7c6192a452f906bc5bd6ed9d76dce976387c7c83b1' | ||
], | ||
[ | ||
'918dc69ab69a1793670135f89feb018e20f42294545d45b173531fde5fdea8df', | ||
'4e403f18c5efa9e51daab5e7bc3d42422f1da2a4265311f51bc728486ff3b178' | ||
], | ||
[ | ||
'5206ec9ffdbb38ed36735d668bec1d31640b0232d58c7d42fcabcdc52be66fa', | ||
'4e5fe3f6a563354314cbbfddd1f6c5d9f700b79307e6c674a5690e2acc769de8' | ||
], | ||
[ | ||
'e679ec6f4d2c1a6d263d0a41f539ad851f6196af6c0a26b8f917286ce064239c', | ||
'b5b403b60243e32b34720a203bea7f615b7e94d3b330cf7fc664e38ab72f4a28' | ||
], | ||
[ | ||
'497968c82c07ab4bbabbc84ba4834a59a923203036689173e4881f5f949043dc', | ||
'4a9326e6768fb1215b5613e243b3b698cc656baf7707f8d0cd71319a15352003' | ||
], | ||
[ | ||
'b9498c5ef58c7f68e7c94ceb8dbfff73f3fba7fd7b3c8abceffd5d74981dd34e', | ||
'4667fac1044c1eee5f63177f67ec7ce489153411fa76066a3030c5fb82cec9c5' | ||
], | ||
[ | ||
'9e8262e4f1762b8a0f6f18f8a905cb90cc24f8f6fe9c025a4eac4b0be9a84c1e', | ||
'70ba905a880efbb4e8192fa17c0a34ba3e03880a6bc78c35576bfe31df098155' | ||
], | ||
[ | ||
'97a81aa0c59074ce4fc96831e8c6ee3e04d9725dbb9cb490dc63e2c8f926f77e', | ||
'3638f689850a7c7215aa0e9805090aebb53fa6f8eb4b73b0155235163048b1fa' | ||
], | ||
[ | ||
'ff4e742f182c67d92e66ad6bf5efa3b8345c33d6fc4c474036f60b2c436cc403', | ||
'5230bd7308f7622db290d6495f26f8d3fd11ac27c3cc5599ff20f711cafbc89f' | ||
], | ||
[ | ||
'535135b06a598cd90f73232b75c3ecb76de7e3c2e27942edaaadeba64ead625b', | ||
'51bf638df7353b34911c450f34c8a5f12326b5bfe66081734cecd66bd7da9ac9' | ||
], | ||
[ | ||
'33b0a2d04f4da7ffb211a0027b825a61b2514bd3bb4e8e17c0461f008a490512', | ||
'7499360c8ff33338d3eb339253f6966ae299b066164ce85a916ae093790af316' | ||
], | ||
[ | ||
'7196535cf7300bfbe4a77a63f4814eeaeb3ea4451072d2dc325eb82fcdcc33df', | ||
'9a6edf11867896d53c7278209c1192d6bd64fac1b1eff8a5961c0d837918a414' | ||
], | ||
[ | ||
'd4f20138499dbfe9c42a0ac615ab9c457c5a6154894dcc1ba0afe675b69a03c2', | ||
'a7be0eab0392061417e1e6a551302525d12924866be1bab1ec2a6d9ed095b126' | ||
], | ||
[ | ||
'9467e64f1b3cf27718717c31a6eefbaa750516bf750a24e70ccf9945f8790974', | ||
'488ec1fe62445e094ce7cf9733549a96a8b796a7d9be3c7e8543cc30e067f7ad' | ||
], | ||
[ | ||
'b6cf6d33a6e0cf2b86b881b18ada64e49b74861ab412f4d0f1da3bcbf7b60cf3', | ||
'b21e1bae2685a0bac706ffc059f9ef6fc89f6ce49a6dd93a954c94d513567693' | ||
], | ||
[ | ||
'79bd08eb1d4e91478310bc3a5735c604c77af98427bfe0b23f24e4f28ff84927', | ||
'a4a64dcf6e237cbfdbf8ae6b043b58061b9beb214867a7549b94f4c7d65d68b3' | ||
], | ||
[ | ||
'd415283339d50249e3bdd1313b1e13e7db08e9728cdf90e18c97ff075dd5580b', | ||
'1d3b0adcee4df2171040895828d7259e0e414d05d4cd427da926df59e8e0bb28' | ||
], | ||
[ | ||
'cf5ef7e760cdc4ef1b7f743b7b47724e222eb568545e9b96cf87dd28f81aea5', | ||
'cabe71879e8025b5f5aae063eec85a574113a96c0055fd712b377af4589e8b0d' | ||
], | ||
[ | ||
'c4b5c334d187441e86f74d28e9ea106bb8f04b30b7b45e44c0d48516e5b9d633', | ||
'15d26f594d6567f579e7ec06f9e2252fc9c9243d1fe201bf544b3bd4b9ba2823' | ||
], | ||
[ | ||
'971eba12c4e5abd35eae635ea5a87b68297f87875e499f58eff11615d1582b2a', | ||
'161987d76aeab32c050b87970992ebebc94b224f2f393b42881bea74457af01d' | ||
], | ||
[ | ||
'7560d80b1b195132def0137cda369653a4b37ea8b7191b9019c6cd37c920482f', | ||
'a3375cac528da855d3bb737df692644fa496b7f3de6f3ada88126742ca0edc83' | ||
], | ||
[ | ||
'4c0d91b2797e520308651061e240df9475450fd149e823fdba1119e22c4d7e6c', | ||
'5e0c8db6c3c6a3e28d8a1e631bf262c9f2500993dfaa5707a9f04ecee2e8155a' | ||
], | ||
[ | ||
'bc618bdd36196f194b5bbc58f8274edcaadeb5d4b6b6bc995172ecb0e9fdecd7', | ||
'27be701a87b1ec2deb4dd4cc6235cb042750f110369df12bf616d0b9f965a1a8' | ||
], | ||
[ | ||
'f106769e4de7ecaffebff2c634df504b5d7ec5f93bccb7f307596869d0da3d05', | ||
'd7f4ce56c557ec0f088fd430f523a7cdeb6b7340b78910d7283b85ce65ad793' | ||
], | ||
[ | ||
'a91403e806a5e9ced27f1438308151c73d0d0f7d0d8fb97121a1bdbce1057433', | ||
'a532856d060cfd48e5d2d78daa09b3560bdc675660a6ac61f97d946a1e0315e1' | ||
], | ||
[ | ||
'8532d4a7bcaff3afef1fffeb247a53a18cdcd5d7c445c662def7ee5e8c69e3c1', | ||
'e6318f7c9186ec2a14242f2df3ef7da6d78326df5bae099d6b98bf7a28fc6878' | ||
], | ||
[ | ||
'a812c11300d5851f714602fe22b55dc83ca2fbe900492724e7be568795eb4626', | ||
'de76ad255a91bdd7bfc2088af9df29809cd7eb0ed826f86d1c1509eba434d942' | ||
], | ||
[ | ||
'58f34328cba4b2c8a80826a462087b2e01d56c13682a88eead2ca8681f0de7bc', | ||
'2a661a7d05ee45f50863c39b6b61a2850dbfa79ad618d88dd7c9f6f29a3c5e00' | ||
], | ||
[ | ||
'a970b0bfc8f384f68eca6d745003a1c57efeb9cb88cc2b1238b582dcf7470fb7', | ||
'765986f3956a554994b3e813feac553443464d8b1f2c1c0bee944d6dcc258e3b' | ||
], | ||
[ | ||
'a4ac3fd8f96a7cfacc5c9636fe8309473288436a66bc955110960ea6374020ba', | ||
'42220fdd26609439c22a22fd413a88682792202dc479125f9d0ebe07a42279a' | ||
], | ||
[ | ||
'b7c42755f6cb4865663fa76831b938bddd09757eb9e7215eb13209e815792814', | ||
'98f3a7ba6a5e461d4451f68e82d7853ed79c3ada925c2e4b49a85e03d207aefd' | ||
], | ||
[ | ||
'4738dedb4bfa475f0cf0323f526d15179ce767ec57c2a431997616dad798ed06', | ||
'55dc2e31b4f56103d62f07af518a12df159b4bb5d53ef325f639ce048deee175' | ||
], | ||
[ | ||
'd88e2edb9a43a750809c23662a1d49dd1451322ca3021cd2e9b319a41a8fea72', | ||
'bf40c79fd1a16b0ec952544c77b84143c24579cc9eaa64fcb9c78e59f5b06251' | ||
], | ||
[ | ||
'8316e55ab6f7f5ea14340bf55abe2679509ec67cd0e7003f5ad0b1deb0c91b', | ||
'498fa22e5ae0809585855763655ba86a6aee85bc0354d2f024a0fb414f6e476a' | ||
], | ||
[ | ||
'58ee8f6436993f52d4caa6616dc98c582af3d3bbbcfbb250a1938b6f5ad1e973', | ||
'61479103af01552faa07b27dd63a7919963274ba1532341726fb40a2a229941a' | ||
], | ||
[ | ||
'b9e12dab068051a44ada9e1e3f0b7d9cd89803801039301b67aba07f6e088958', | ||
'6e686cbb5a5124bcf11c37cbf26ab6f690324aed83fccc4b173f87e19b942285' | ||
], | ||
[ | ||
'6752300d5f0144fa436f8ce4e80fe305838cadabce43a2c733bd9a1d929aa609', | ||
'bb533dc33009a65fb45d1d5d26c59deaa63a6b474d46f42e032b535823b661e2' | ||
], | ||
[ | ||
'a7fcf41039d167f0d2cb23df2f4c629f78296ac52c9e0c282d4dec2e9a51618', | ||
'7988f09f48ed5acc8d9f847360d0d3e320e3fe1a1b85bc4db1b8c45b06b72400' | ||
], | ||
[ | ||
'2452adc36bab49cacf2e0c0572e1ce65542b91985eb32afc5b77708fc5b09272', | ||
'62daae90b4bba6c3bd373ceeff57ddf3e0468c310d6ee626cd44dc4ce841f78d' | ||
], | ||
[ | ||
'b535107da26163b04a05b54df42da4fee47ad73b673480f864e88b8a2a6f77e7', | ||
'4f4f019a751d6c3600dc14ea7ddb6270a2fa71142e67ae012aa5dcbed06af2d1' | ||
], | ||
[ | ||
'f4b899d1952cd7a0f75234f56a39fde262b782f6d15bb7c1dbd304ceb584ccf1', | ||
'6a18bbc9d0eaf854bcd9baac6f43cef970466be5531d05a39cc4e870bb772fcb' | ||
], | ||
[ | ||
'c2bb30a611c3dda2f08a934368ae8f393a5462676a18402d63d3638ea8af9a16', | ||
'd19021a6b8844654ab2b7e1921b4a8846ec4780fa19833701f8654764f6f9732' | ||
], | ||
[ | ||
'd6732748a805134810731cf028904a22a4e399855f07e6b97f1164d209de0b05', | ||
'763ea7455bebe06db7c2d15e3b93de92011af04d56af2fec9ac3e12139881530' | ||
], | ||
[ | ||
'69fcc756818b686a5115a1452e0fc2ffbd761d272ecd9c65a09e5ab4f90084f0', | ||
'30d853c6e9e195dc258d16e6ef01a60435d4fe3a361043d59b3e61af9fe7be06' | ||
], | ||
[ | ||
'f01d4629e52df071ef918327b5e5a175a2f4b1946d25365e6469a66a7b69b262', | ||
'7907eb62ea2c7ffefc21c624c2a91fa5e2d300058097f70f28729ffef3e508f5' | ||
], | ||
[ | ||
'd8d4ee4e3c52e9173ca9800a87b7b8ee299d67ea69d91c14a623439c6375777f', | ||
'c1b195d1906b6a871517ad9796c762f84535bd33c298923f63f286b55e99ca0a' | ||
], | ||
[ | ||
'6c00c2a20132b1fab5a955cee93bc7930697aacdaf0c3925682ef12ee6d965cc', | ||
'700f390518566e04520c3a987713e4a111c6231ce8ad69eec6ca5287cfbe91d' | ||
], | ||
[ | ||
'852be6cd7f0d80c8dfe2a5effd19e7dc1a8163e2df1d8641c22ed74a2ceab1a1', | ||
'1f40955be6c80ed5e6c50632d62effb5a8237a4c6b2d55a1d23f54aff401e046' | ||
], | ||
[ | ||
'c3e44fa0cd83613c06b9436f2528957aba671efbb823552a5f69ea9a7de6fd86', | ||
'4296a00a4a149d75e9f54eadcfaeb80b11ad5682f838d0c6f187bed8fff5e975' | ||
], | ||
[ | ||
'585ddee8cbe756f137ac1878ac2a02e3544a1ef5d4355d337059fd7b2d604f0f', | ||
'5411d502f740ca2bc7ddc6a603c7a052af123d6110ef25bd1cf0c04c7d31d121' | ||
], | ||
[ | ||
'5537c9b8e4b1a652cc6c39f0f61a266f09b405b6570363cc923794c643077a1b', | ||
'f0fcfbe1e190269e9fae855878301b77717d8f1365808920c368bd263d04487a' | ||
], | ||
[ | ||
'5ea7171204ca961a2bd334b4cf46a4ce4b9a6ff8cbe95ba5ce7fe90641aca8b2', | ||
'52592f46c9f47a716c7eb1d4951a8a60bc1ca40639deb74b514211151c64b7f0' | ||
], | ||
[ | ||
'ec5df2808e4168a8a674c2e61dfa896ffeb2aca380f2ecfbb2e4169ae8155898', | ||
'9260276af46d9238393ffb008395c5981de86cb8222fe2180fe9f3b96b9dd577' | ||
], | ||
[ | ||
'dd23397e19efda2dac072dd6bba6656991275be3abb00ddf617ce403babe4b3a', | ||
'190e2cb733468ea91d33635c4f8e129e4ec35e495527237219993725f58b3644' | ||
], | ||
[ | ||
'2c90ddcb9979bdf37f3a36cf8d48c28e4b2cc114885193d73c1384ab5ce7dc84', | ||
'a3336af807aab976b296fde82ed04026e48da7765ffe2ba2287ab108286b0e8d' | ||
], | ||
[ | ||
'ea52f14e4bc0b3e7e34de04ac50c17d44a38a7262757f68e3f45362692ab3353', | ||
'85ab6f117a3c534b7f17cd2bc7851dcf1b089238cb42c3d0a8a5575ac9ac839' | ||
], | ||
[ | ||
'f540a6aecddc61eb4ca6bc43bfaf7268f2776f6d23b3b02bcf5baefbf8710521', | ||
'c22ed7802414cc3fa241d7d1f855a46fa1b2db83105534afbedc2c016b69e19f' | ||
], | ||
[ | ||
'2930bf115a732f75a16505bccf2ac06f7c22691decd76ab16dfa18fafd2d21b', | ||
'ca5f208a027f8a75de6aac24d967b74a4baf0bd4c46a7fd44d58aeecbe8c7e99' | ||
] | ||
] | ||
] | ||
}); |
{ | ||
"name": "elliptic", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"description": "EC cryptography", | ||
@@ -26,4 +26,5 @@ "main": "lib/elliptic.js", | ||
"devDependencies": { | ||
"browserify": "^3.44.2", | ||
"mocha": "^1.18.2" | ||
} | ||
} |
@@ -125,2 +125,19 @@ var assert = require('assert'); | ||
}); | ||
it('should support binc', function() { | ||
assert.equal(elliptic.bn(0).binc(1).toString(16), '2'); | ||
assert.equal(elliptic.bn(2).binc(1).toString(16), '4'); | ||
assert.equal(elliptic.bn(0xffffff).binc(1).toString(16), '1000001'); | ||
}); | ||
it('should support montgomery operations', function() { | ||
var p192 = elliptic.bn( | ||
'fffffffffffffffffffffffffffffffeffffffffffffffff', | ||
16); | ||
var m = elliptic.bn.mont(p192); | ||
var a = elliptic.bn(123); | ||
var b = elliptic.bn(231); | ||
var c = a.toMont(m).montMul(b.toMont(m)).fromMont(); | ||
assert(c.cmp(a.mul(b).mod(p192)) === 0); | ||
}); | ||
}); |
@@ -12,5 +12,3 @@ var assert = require('assert'); | ||
var p = curve.point( | ||
'18', | ||
'16'); | ||
var p = curve.point('18', '16'); | ||
assert(p.validate()); | ||
@@ -17,0 +15,0 @@ assert(p.dbl().validate()); |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses eval() which is a dangerous function. This prevents the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses eval() which is a dangerous function. This prevents the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
2075993
24
3152
0
2