@bsv/sdk 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/cjs/package.json +8 -4
  2. package/dist/cjs/src/transaction/broadcasters/ARC.js +13 -2
  3. package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -1
  4. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  5. package/dist/esm/src/transaction/broadcasters/ARC.js +13 -2
  6. package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -1
  7. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  8. package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -1
  9. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  10. package/package.json +2 -1
  11. package/src/compat/BSM.ts +51 -0
  12. package/src/compat/ECIES.ts +557 -0
  13. package/src/compat/HD.ts +348 -0
  14. package/src/compat/Mnemonic.ts +295 -0
  15. package/src/compat/__tests/BSM.test.ts +38 -0
  16. package/src/compat/__tests/ECIES.test.ts +90 -0
  17. package/src/compat/__tests/HD.test.ts +405 -0
  18. package/src/compat/__tests/Mnemonic.test.ts +177 -0
  19. package/src/compat/__tests/Mnemonic.vectors.ts +172 -0
  20. package/src/compat/bip-39-wordlist-en.ts +2053 -0
  21. package/src/compat/index.ts +4 -0
  22. package/src/messages/EncryptedMessage.ts +70 -0
  23. package/src/messages/SignedMessage.ts +87 -0
  24. package/src/messages/__tests/EncryptedMessage.test.ts +36 -0
  25. package/src/messages/__tests/SignedMessage.test.ts +53 -0
  26. package/src/messages/index.ts +2 -0
  27. package/src/primitives/AESGCM.ts +479 -0
  28. package/src/primitives/BasePoint.ts +21 -0
  29. package/src/primitives/BigNumber.ts +4619 -0
  30. package/src/primitives/Curve.ts +1163 -0
  31. package/src/primitives/DRBG.ts +102 -0
  32. package/src/primitives/ECDSA.ts +164 -0
  33. package/src/primitives/Hash.ts +1420 -0
  34. package/src/primitives/JacobianPoint.ts +410 -0
  35. package/src/primitives/K256.ts +116 -0
  36. package/src/primitives/Mersenne.ts +123 -0
  37. package/src/primitives/MontgomoryMethod.ts +160 -0
  38. package/src/primitives/Point.ts +852 -0
  39. package/src/primitives/PrivateKey.ts +195 -0
  40. package/src/primitives/PublicKey.ts +154 -0
  41. package/src/primitives/Random.ts +55 -0
  42. package/src/primitives/ReductionContext.ts +528 -0
  43. package/src/primitives/Signature.ts +235 -0
  44. package/src/primitives/SymmetricKey.ts +75 -0
  45. package/src/primitives/TransactionSignature.ts +189 -0
  46. package/src/primitives/__tests/AESGCM.test.ts +338 -0
  47. package/src/primitives/__tests/BRC42.private.vectors.ts +33 -0
  48. package/src/primitives/__tests/BRC42.public.vectors.ts +33 -0
  49. package/src/primitives/__tests/BigNumber.arithmatic.test.ts +572 -0
  50. package/src/primitives/__tests/BigNumber.binary.test.ts +203 -0
  51. package/src/primitives/__tests/BigNumber.constructor.test.ts +176 -0
  52. package/src/primitives/__tests/BigNumber.dhGroup.test.ts +18 -0
  53. package/src/primitives/__tests/BigNumber.fixtures.ts +264 -0
  54. package/src/primitives/__tests/BigNumber.serializers.test.ts +157 -0
  55. package/src/primitives/__tests/BigNumber.utils.test.ts +347 -0
  56. package/src/primitives/__tests/Curve.unit.test.ts +192 -0
  57. package/src/primitives/__tests/DRBG.test.ts +18 -0
  58. package/src/primitives/__tests/DRBG.vectors.ts +167 -0
  59. package/src/primitives/__tests/ECDH.test.ts +31 -0
  60. package/src/primitives/__tests/ECDSA.test.ts +58 -0
  61. package/src/primitives/__tests/HMAC.test.ts +59 -0
  62. package/src/primitives/__tests/Hash.test.ts +121 -0
  63. package/src/primitives/__tests/PBKDF2.vectors.ts +119 -0
  64. package/src/primitives/__tests/PrivateKey.test.ts +17 -0
  65. package/src/primitives/__tests/PublicKey.test.ts +66 -0
  66. package/src/primitives/__tests/Random.test.ts +14 -0
  67. package/src/primitives/__tests/Reader.test.ts +296 -0
  68. package/src/primitives/__tests/ReductionContext.test.ts +279 -0
  69. package/src/primitives/__tests/SymmetricKey.test.ts +58 -0
  70. package/src/primitives/__tests/SymmetricKey.vectors.ts +40 -0
  71. package/src/primitives/__tests/Writer.test.ts +198 -0
  72. package/src/primitives/__tests/sighash.vectors.ts +3503 -0
  73. package/src/primitives/__tests/utils.test.ts +108 -0
  74. package/src/primitives/index.ts +8 -0
  75. package/src/primitives/utils.ts +665 -0
  76. package/src/script/LockingScript.ts +30 -0
  77. package/src/script/OP.ts +219 -0
  78. package/src/script/Script.ts +426 -0
  79. package/src/script/ScriptChunk.ts +7 -0
  80. package/src/script/ScriptTemplate.ts +36 -0
  81. package/src/script/Spend.ts +1379 -0
  82. package/src/script/UnlockingScript.ts +30 -0
  83. package/src/script/__tests/Script.test.ts +369 -0
  84. package/src/script/__tests/Spend.test.ts +248 -0
  85. package/src/script/__tests/script.invalid.vectors.ts +925 -0
  86. package/src/script/__tests/script.valid.vectors.ts +1120 -0
  87. package/src/script/__tests/scriptFromVector.ts +42 -0
  88. package/src/script/__tests/spend.valid.vectors.ts +2288 -0
  89. package/src/script/index.ts +7 -0
  90. package/src/script/templates/P2PKH.ts +109 -0
  91. package/src/script/templates/RPuzzle.ts +140 -0
  92. package/src/script/templates/index.ts +2 -0
  93. package/src/transaction/Broadcaster.ts +42 -0
  94. package/src/transaction/ChainTracker.ts +22 -0
  95. package/src/transaction/FeeModel.ts +13 -0
  96. package/src/transaction/MerklePath.ts +259 -0
  97. package/src/transaction/Transaction.ts +602 -0
  98. package/src/transaction/TransactionInput.ts +63 -0
  99. package/src/transaction/TransactionOutput.ts +37 -0
  100. package/src/transaction/__tests/MerklePath.test.ts +181 -0
  101. package/src/transaction/__tests/Transaction.test.ts +413 -0
  102. package/src/transaction/__tests/bigtx.vectors.ts +4 -0
  103. package/src/transaction/__tests/bump.invalid.vectors.ts +8 -0
  104. package/src/transaction/__tests/bump.valid.vectors.ts +4 -0
  105. package/src/transaction/__tests/tx.invalid.vectors.ts +281 -0
  106. package/src/transaction/__tests/tx.valid.vectors.ts +364 -0
  107. package/src/transaction/broadcasters/ARC.ts +115 -0
  108. package/src/transaction/broadcasters/__tests/ARC.test.ts +115 -0
  109. package/src/transaction/broadcasters/index.ts +1 -0
  110. package/src/transaction/fee-models/SatoshisPerKilobyte.ts +71 -0
  111. package/src/transaction/fee-models/index.ts +1 -0
  112. package/src/transaction/index.ts +6 -0
@@ -0,0 +1,203 @@
1
+ /* eslint-env jest */
2
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
3
+
4
+ describe('BN.js/Binary', function () {
5
+ describe('.shl()', function () {
6
+ it('should shl numbers', function () {
7
+ expect(new BigNumber('69527932928').shln(13).toString(16)).toEqual('2060602000000')
8
+ expect(new BigNumber('69527932928').shln(45).toString(16)).toEqual('206060200000000000000')
9
+ })
10
+
11
+ it('should ushl numbers', function () {
12
+ expect(new BigNumber('69527932928').ushln(13).toString(16)).toEqual('2060602000000')
13
+ expect(new BigNumber('69527932928').ushln(45).toString(16)).toEqual('206060200000000000000')
14
+ })
15
+ })
16
+
17
+ describe('.shr()', function () {
18
+ it('should shr numbers', function () {
19
+ expect(new BigNumber('69527932928').shrn(13).toString(16)).toEqual('818180')
20
+ expect(new BigNumber('69527932928').shrn(17).toString(16)).toEqual('81818')
21
+ expect(new BigNumber('69527932928').shrn(256).toString(16)).toEqual('0')
22
+ })
23
+
24
+ it('should ushr numbers', function () {
25
+ expect(new BigNumber('69527932928').ushrn(13).toString(16)).toEqual('818180')
26
+ expect(new BigNumber('69527932928').ushrn(17).toString(16)).toEqual('81818')
27
+ expect(new BigNumber('69527932928').ushrn(256).toString(16)).toEqual('0')
28
+ })
29
+ })
30
+
31
+ describe('.bincn()', function () {
32
+ it('should increment bit', function () {
33
+ expect(new BigNumber(0).bincn(1).toString(16)).toEqual('2')
34
+ expect(new BigNumber(2).bincn(1).toString(16)).toEqual('4')
35
+ expect(new BigNumber(2).bincn(1).bincn(1).toString(16)).toEqual(new BigNumber(2).bincn(2).toString(16))
36
+ expect(new BigNumber(0xffffff).bincn(1).toString(16)).toEqual('1000001')
37
+ expect(new BigNumber(2).bincn(63).toString(16)).toEqual('8000000000000002')
38
+ })
39
+ })
40
+
41
+ describe('.imaskn()', function () {
42
+ it('should mask bits in-place', function () {
43
+ expect(new BigNumber(0).imaskn(1).toString(16)).toEqual('0')
44
+ expect(new BigNumber(3).imaskn(1).toString(16)).toEqual('1')
45
+ expect(new BigNumber('123456789', 16).imaskn(4).toString(16)).toEqual('9')
46
+ expect(new BigNumber('123456789', 16).imaskn(16).toString(16)).toEqual('6789')
47
+ expect(new BigNumber('123456789', 16).imaskn(28).toString(16)).toEqual('3456789')
48
+ })
49
+
50
+ it('should not mask when number is bigger than length', function () {
51
+ expect(new BigNumber(0xe3).imaskn(56).toString(16)).toEqual('e3')
52
+ expect(new BigNumber(0xe3).imaskn(26).toString(16)).toEqual('e3')
53
+ })
54
+ })
55
+
56
+ describe('.testn()', function () {
57
+ it('should support test specific bit', function () {
58
+ [
59
+ 'ff',
60
+ 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
61
+ ].forEach(function (hex) {
62
+ const bn = new BigNumber(hex, 16)
63
+ const bl = bn.bitLength()
64
+
65
+ for (let i = 0; i < bl; ++i) {
66
+ expect(bn.testn(i)).toEqual(true)
67
+ }
68
+
69
+ // test off the end
70
+ expect(bn.testn(bl)).toEqual(false)
71
+ })
72
+
73
+ const xbits = '01111001010111001001000100011101' +
74
+ '11010011101100011000111001011101' +
75
+ '10010100111000000001011000111101' +
76
+ '01011111001111100100011110000010' +
77
+ '01011010100111010001010011000100' +
78
+ '01101001011110100001001111100110' +
79
+ '001110010111'
80
+
81
+ const x = new BigNumber(
82
+ '23478905234580795234378912401239784125643978256123048348957342'
83
+ )
84
+ for (let i = 0; i < x.bitLength(); ++i) {
85
+ expect(x.testn(i)).toEqual(xbits.charAt(i) === '1')
86
+ }
87
+ })
88
+
89
+ it('should have short-cuts', function () {
90
+ const x = new BigNumber('abcd', 16)
91
+ expect(!x.testn(128)).toEqual(true)
92
+ })
93
+ })
94
+
95
+ describe('.and()', function () {
96
+ it('should and numbers', function () {
97
+ expect(new BigNumber('1010101010101010101010101010101010101010', 2)
98
+ .and(new BigNumber('101010101010101010101010101010101010101', 2))
99
+ .toString(2)).toEqual('0')
100
+ })
101
+
102
+ it('should and numbers of different limb-length', function () {
103
+ expect(
104
+ new BigNumber('abcd0000ffff', 16)
105
+ .and(new BigNumber('abcd', 16)).toString(16)).toEqual('abcd')
106
+ })
107
+ })
108
+
109
+ describe('.iand()', function () {
110
+ it('should iand numbers', function () {
111
+ expect(new BigNumber('1010101010101010101010101010101010101010', 2)
112
+ .iand(new BigNumber('101010101010101010101010101010101010101', 2))
113
+ .toString(2)).toEqual('0')
114
+ expect(new BigNumber('1000000000000000000000000000000000000001', 2)
115
+ .iand(new BigNumber('1', 2))
116
+ .toString(2)).toEqual('1')
117
+ expect(new BigNumber('1', 2)
118
+ .iand(new BigNumber('1000000000000000000000000000000000000001', 2))
119
+ .toString(2)).toEqual('1')
120
+ })
121
+ })
122
+
123
+ describe('.or()', function () {
124
+ it('should or numbers', function () {
125
+ expect(new BigNumber('1010101010101010101010101010101010101010', 2)
126
+ .or(new BigNumber('101010101010101010101010101010101010101', 2))
127
+ .toString(2)).toEqual('1111111111111111111111111111111111111111')
128
+ })
129
+
130
+ it('should or numbers of different limb-length', function () {
131
+ expect(
132
+ new BigNumber('abcd00000000', 16)
133
+ .or(new BigNumber('abcd', 16)).toString(16)).toEqual('abcd0000abcd')
134
+ })
135
+ })
136
+
137
+ describe('.ior()', function () {
138
+ it('should ior numbers', function () {
139
+ expect(new BigNumber('1010101010101010101010101010101010101010', 2)
140
+ .ior(new BigNumber('101010101010101010101010101010101010101', 2))
141
+ .toString(2)).toEqual('1111111111111111111111111111111111111111')
142
+ expect(new BigNumber('1000000000000000000000000000000000000000', 2)
143
+ .ior(new BigNumber('1', 2))
144
+ .toString(2)).toEqual('1000000000000000000000000000000000000001')
145
+ expect(new BigNumber('1', 2)
146
+ .ior(new BigNumber('1000000000000000000000000000000000000000', 2))
147
+ .toString(2)).toEqual('1000000000000000000000000000000000000001')
148
+ })
149
+ })
150
+
151
+ describe('.xor()', function () {
152
+ it('should xor numbers', function () {
153
+ expect(new BigNumber('11001100110011001100110011001100', 2)
154
+ .xor(new BigNumber('1100110011001100110011001100110', 2))
155
+ .toString(2)).toEqual('10101010101010101010101010101010')
156
+ })
157
+ })
158
+
159
+ describe('.ixor()', function () {
160
+ it('should ixor numbers', function () {
161
+ expect(new BigNumber('11001100110011001100110011001100', 2)
162
+ .ixor(new BigNumber('1100110011001100110011001100110', 2))
163
+ .toString(2)).toEqual('10101010101010101010101010101010')
164
+ expect(new BigNumber('11001100110011001100110011001100', 2)
165
+ .ixor(new BigNumber('1', 2))
166
+ .toString(2)).toEqual('11001100110011001100110011001101')
167
+ expect(new BigNumber('1', 2)
168
+ .ixor(new BigNumber('11001100110011001100110011001100', 2))
169
+ .toString(2)).toEqual('11001100110011001100110011001101')
170
+ })
171
+
172
+ it('should and numbers of different limb-length', function () {
173
+ expect(
174
+ new BigNumber('abcd0000ffff', 16)
175
+ .ixor(new BigNumber('abcd', 16)).toString(16)).toEqual('abcd00005432')
176
+ })
177
+ })
178
+
179
+ describe('.setn()', function () {
180
+ it('should allow single bits to be set', function () {
181
+ expect(new BigNumber(0).setn(2, true).toString(2)).toEqual('100')
182
+ expect(new BigNumber(0).setn(27, true).toString(2)).toEqual('1000000000000000000000000000')
183
+ expect(new BigNumber(0).setn(63, true).toString(16)).toEqual(new BigNumber(1).iushln(63).toString(16))
184
+ expect(new BigNumber('1000000000000000000000000001', 2).setn(27, false).toString(2)).toEqual('1')
185
+ expect(new BigNumber('101', 2).setn(2, false).toString(2)).toEqual('1')
186
+ })
187
+ })
188
+
189
+ describe('.notn()', function () {
190
+ it('should allow bitwise negation', function () {
191
+ expect(new BigNumber('111000111', 2).notn(9).toString(2)).toEqual('111000')
192
+ expect(new BigNumber('000111000', 2).notn(9).toString(2)).toEqual('111000111')
193
+ expect(new BigNumber('111000111', 2).notn(9).toString(2)).toEqual('111000')
194
+ expect(new BigNumber('000111000', 2).notn(9).toString(2)).toEqual('111000111')
195
+ expect(new BigNumber('111000111', 2).notn(32).toString(2)).toEqual('11111111111111111111111000111000')
196
+ expect(new BigNumber('000111000', 2).notn(32).toString(2)).toEqual('11111111111111111111111111000111')
197
+ expect(new BigNumber('111000111', 2).notn(68).toString(2)).toEqual('11111111111111111111111111111111' +
198
+ '111111111111111111111111111000111000')
199
+ expect(new BigNumber('000111000', 2).notn(68).toString(2)).toEqual('11111111111111111111111111111111' +
200
+ '111111111111111111111111111111000111')
201
+ })
202
+ })
203
+ })
@@ -0,0 +1,176 @@
1
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
2
+
3
+ describe('BN.js/Constructor', () => {
4
+ describe('with Smi input', () => {
5
+ it('should accept one limb number', () => {
6
+ expect(new BigNumber(12345).toString(16)).toEqual('3039')
7
+ })
8
+
9
+ it('should accept two-limb number', () => {
10
+ expect(new BigNumber(0x4123456).toString(16)).toEqual('4123456')
11
+ })
12
+
13
+ it('should accept 52 bits of precision', () => {
14
+ const num = Math.pow(2, 52)
15
+ expect(new BigNumber(num, 10).toString(10)).toEqual(num.toString(10))
16
+ })
17
+
18
+ it('should accept max safe integer', () => {
19
+ const num = Math.pow(2, 53) - 1
20
+ expect(new BigNumber(num, 10).toString(10)).toEqual(num.toString(10))
21
+ })
22
+
23
+ it('should not accept an unsafe integer', () => {
24
+ const num = Math.pow(2, 53)
25
+
26
+ expect(() => {
27
+ return new BigNumber(num, 10)
28
+ }).toThrow(new Error('The number is larger than 2 ^ 53 (unsafe)'))
29
+ })
30
+
31
+ it('should accept two-limb LE number', () => {
32
+ expect(new BigNumber(0x4123456, undefined, 'le').toString(16)).toEqual('56341204')
33
+ })
34
+ })
35
+
36
+ describe('with String input', () => {
37
+ it('should accept base-16', () => {
38
+ expect(new BigNumber('1A6B765D8CDF', 16).toString(16)).toEqual('1a6b765d8cdf')
39
+ expect(new BigNumber('1A6B765D8CDF', 16).toString()).toEqual('29048849665247')
40
+ })
41
+
42
+ it('should accept base-hex', () => {
43
+ expect(new BigNumber('FF', 'hex').toString()).toEqual('255')
44
+ })
45
+
46
+ it('should accept base-16 with spaces', () => {
47
+ const num = 'a89c e5af8724 c0a23e0e 0ff77500'
48
+ expect(new BigNumber(num, 16).toString(16)).toEqual(num.replace(/ /g, ''))
49
+ })
50
+
51
+ it('should accept long base-16', () => {
52
+ const num = '123456789abcdef123456789abcdef123456789abcdef'
53
+ expect(new BigNumber(num, 16).toString(16)).toEqual(num)
54
+ })
55
+
56
+ it('should accept positive base-10', () => {
57
+ expect(new BigNumber('10654321').toString()).toEqual('10654321')
58
+ expect(new BigNumber('29048849665247').toString(16)).toEqual('1a6b765d8cdf')
59
+ })
60
+
61
+ it('should accept negative base-10', () => {
62
+ expect(new BigNumber('-29048849665247').toString(16)).toEqual('-1a6b765d8cdf')
63
+ })
64
+
65
+ it('should accept long base-10', () => {
66
+ const num = '10000000000000000'
67
+ expect(new BigNumber(num).toString(10)).toEqual(num)
68
+ })
69
+
70
+ it('should accept base-2', () => {
71
+ const base2 = '11111111111111111111111111111111111111111111111111111'
72
+ expect(new BigNumber(base2, 2).toString(2)).toEqual(base2)
73
+ })
74
+
75
+ it('should accept base-36', () => {
76
+ const base36 = 'zzZzzzZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
77
+ expect(new BigNumber(base36, 36).toString(36)).toEqual(base36.toLowerCase())
78
+ })
79
+
80
+ it('should not overflow limbs during base-10', () => {
81
+ const num = '65820182292848241686198767302293' +
82
+ '20890292528855852623664389292032'
83
+ expect(new BigNumber(num).words[0]).toBeLessThan(0x4000000)
84
+ })
85
+
86
+ it('should accept base-16 LE integer', () => {
87
+ expect(new BigNumber('1A6B765D8CDF', 16, 'le').toString(16))
88
+ .toEqual('df8c5d766b1a')
89
+ })
90
+
91
+ it('should accept base-16 LE integer with leading zeros', () => {
92
+ expect(new BigNumber('0010', 16, 'le').toNumber()).toEqual(4096)
93
+ expect(new BigNumber('-010', 16, 'le').toNumber()).toEqual(-4096)
94
+ expect(new BigNumber('010', 16, 'le').toNumber()).toEqual(4096)
95
+ })
96
+
97
+ it('should not accept wrong characters for base', () => {
98
+ expect(() => {
99
+ return new BigNumber('01FF')
100
+ }).toThrow(new Error('Invalid character'))
101
+ })
102
+
103
+ it('should not accept decimal', () => {
104
+ expect(() => {
105
+ new BigNumber('10.00', 10) // eslint-disable-line no-new
106
+ }).toThrow(new Error('Invalid character'))
107
+
108
+ expect(() => {
109
+ new BigNumber('16.00', 16) // eslint-disable-line no-new
110
+ }).toThrow(/* new Error('Invalid character') */)
111
+ })
112
+
113
+ it('should not accept non-hex characters', () => {
114
+ [
115
+ '0000000z',
116
+ '000000gg',
117
+ '0000gg00',
118
+ 'fffggfff',
119
+ '/0000000',
120
+ '0-000000', // if -, is first, that is OK
121
+ 'ff.fffff',
122
+ 'hexadecimal'
123
+ ].forEach(function (str) {
124
+ expect(() => {
125
+ new BigNumber(str, 16) // eslint-disable-line no-new
126
+ }).toThrow(/* Invalid character in */)
127
+ })
128
+ })
129
+ })
130
+
131
+ describe('with Array input', () => {
132
+ it('should not fail on empty array', () => {
133
+ expect(new BigNumber([]).toString(16)).toEqual('0')
134
+ })
135
+
136
+ it('should import/export big endian', () => {
137
+ expect(new BigNumber([0, 1], 16).toString(16)).toEqual('1')
138
+ expect(new BigNumber([1, 2, 3]).toString(16)).toEqual('10203')
139
+ expect(new BigNumber([1, 2, 3, 4]).toString(16)).toEqual('1020304')
140
+ expect(new BigNumber([1, 2, 3, 4, 5]).toString(16)).toEqual('102030405')
141
+ expect(new BigNumber([1, 2, 3, 4, 5, 6, 7, 8]).toString(16)).toEqual(
142
+ '102030405060708')
143
+ expect(new BigNumber([1, 2, 3, 4]).toArray().join(',')).toEqual('1,2,3,4')
144
+ expect(new BigNumber([1, 2, 3, 4, 5, 6, 7, 8]).toArray().join(',')).toEqual('1,2,3,4,5,6,7,8')
145
+ })
146
+
147
+ it('should import little endian', () => {
148
+ expect(new BigNumber([0, 1], 16, 'le').toString(16)).toEqual('100')
149
+ expect(new BigNumber([1, 2, 3], 16, 'le').toString(16)).toEqual('30201')
150
+ expect(new BigNumber([1, 2, 3, 4], 16, 'le').toString(16)).toEqual('4030201')
151
+ expect(new BigNumber([1, 2, 3, 4, 5], 16, 'le').toString(16)).toEqual('504030201')
152
+ expect(new BigNumber([1, 2, 3, 4, 5, 6, 7, 8], 'le').toString(16)).toEqual('807060504030201')
153
+ expect(new BigNumber([1, 2, 3, 4]).toArray('le').join(',')).toEqual('4,3,2,1')
154
+ expect(new BigNumber([1, 2, 3, 4, 5, 6, 7, 8]).toArray('le').join(',')).toEqual('8,7,6,5,4,3,2,1')
155
+ })
156
+
157
+ it('should import big endian with implicit base', () => {
158
+ expect(new BigNumber([1, 2, 3, 4, 5], 'le').toString(16)).toEqual('504030201')
159
+ })
160
+ })
161
+
162
+ // the Array code is able to handle Buffer
163
+ describe('with Buffer input', () => {
164
+ it('should not fail on empty Buffer', () => {
165
+ expect(new BigNumber(Buffer.alloc(0)).toString(16)).toEqual('0')
166
+ })
167
+
168
+ it('should import/export big endian', () => {
169
+ expect(new BigNumber(Buffer.from('010203', 'hex')).toString(16)).toEqual('10203')
170
+ })
171
+
172
+ it('should import little endian', () => {
173
+ expect(new BigNumber(Buffer.from('010203', 'hex'), 'le').toString(16)).toEqual('30201')
174
+ })
175
+ })
176
+ })
@@ -0,0 +1,18 @@
1
+ /* eslint-env jest */
2
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
3
+ import ReductionContext from '../../../dist/cjs/src/primitives/ReductionContext'
4
+ import { dhGroups } from './BigNumber.fixtures'
5
+
6
+ describe('BN.js/Slow DH test', () => {
7
+ Object.keys(dhGroups).forEach(function (name) {
8
+ it('should match public key for ' + name + ' group', () => {
9
+ const group = dhGroups[name]
10
+ const base = new BigNumber(2)
11
+ const mont = new ReductionContext(new BigNumber(group.prime, 16))
12
+ const priv = new BigNumber(group.priv, 16)
13
+ const multed = base.toRed(mont).redPow(priv).fromRed()
14
+ const actual = Buffer.from(multed.toArray())
15
+ expect(actual.toString('hex')).toEqual(group.pub)
16
+ }, 3600 * 1000)
17
+ })
18
+ })
@@ -0,0 +1,264 @@
1
+ export const dhGroups = {
2
+ p16: {
3
+ prime: 'ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd1' +
4
+ '29024e088a67cc74020bbea63b139b22514a08798e3404dd' +
5
+ 'ef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245' +
6
+ 'e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed' +
7
+ 'ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3d' +
8
+ 'c2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f' +
9
+ '83655d23dca3ad961c62f356208552bb9ed529077096966d' +
10
+ '670c354e4abc9804f1746c08ca18217c32905e462e36ce3b' +
11
+ 'e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9' +
12
+ 'de2bcbf6955817183995497cea956ae515d2261898fa0510' +
13
+ '15728e5a8aaac42dad33170d04507a33a85521abdf1cba64' +
14
+ 'ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7' +
15
+ 'abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6b' +
16
+ 'f12ffa06d98a0864d87602733ec86a64521f2b18177b200c' +
17
+ 'bbe117577a615d6c770988c0bad946e208e24fa074e5ab31' +
18
+ '43db5bfce0fd108e4b82d120a92108011a723c12a787e6d7' +
19
+ '88719a10bdba5b2699c327186af4e23c1a946834b6150bda' +
20
+ '2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6' +
21
+ '287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed' +
22
+ '1f612970cee2d7afb81bdd762170481cd0069127d5b05aa9' +
23
+ '93b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199' +
24
+ 'ffffffffffffffff',
25
+ priv: '6d5923e6449122cbbcc1b96093e0b7e4fd3e469f58daddae' +
26
+ '53b49b20664f4132675df9ce98ae0cfdcac0f4181ccb643b' +
27
+ '625f98104dcf6f7d8e81961e2cab4b5014895260cb977c7d' +
28
+ '2f981f8532fb5da60b3676dfe57f293f05d525866053ac7e' +
29
+ '65abfd19241146e92e64f309a97ef3b529af4d6189fa416c' +
30
+ '9e1a816c3bdf88e5edf48fbd8233ef9038bb46faa95122c0' +
31
+ '5a426be72039639cd2d53d37254b3d258960dcb33c255ede' +
32
+ '20e9d7b4b123c8b4f4b986f53cdd510d042166f7dd7dca98' +
33
+ '7c39ab36381ba30a5fdd027eb6128d2ef8e5802a2194d422' +
34
+ 'b05fe6e1cb4817789b923d8636c1ec4b7601c90da3ddc178' +
35
+ '52f59217ae070d87f2e75cbfb6ff92430ad26a71c8373452' +
36
+ 'ae1cc5c93350e2d7b87e0acfeba401aaf518580937bf0b6c' +
37
+ '341f8c49165a47e49ce50853989d07171c00f43dcddddf72' +
38
+ '94fb9c3f4e1124e98ef656b797ef48974ddcd43a21fa06d0' +
39
+ '565ae8ce494747ce9e0ea0166e76eb45279e5c6471db7df8' +
40
+ 'cc88764be29666de9c545e72da36da2f7a352fb17bdeb982' +
41
+ 'a6dc0193ec4bf00b2e533efd6cd4d46e6fb237b775615576' +
42
+ 'dd6c7c7bbc087a25e6909d1ebc6e5b38e5c8472c0fc429c6' +
43
+ 'f17da1838cbcd9bbef57c5b5522fd6053e62ba21fe97c826' +
44
+ 'd3889d0cc17e5fa00b54d8d9f0f46fb523698af965950f4b' +
45
+ '941369e180f0aece3870d9335f2301db251595d173902cad' +
46
+ '394eaa6ffef8be6c',
47
+ pub: 'd53703b7340bc89bfc47176d351e5cf86d5a18d9662eca3c' +
48
+ '9759c83b6ccda8859649a5866524d77f79e501db923416ca' +
49
+ '2636243836d3e6df752defc0fb19cc386e3ae48ad647753f' +
50
+ 'bf415e2612f8a9fd01efe7aca249589590c7e6a0332630bb' +
51
+ '29c5b3501265d720213790556f0f1d114a9e2071be3620bd' +
52
+ '4ee1e8bb96689ac9e226f0a4203025f0267adc273a43582b' +
53
+ '00b70b490343529eaec4dcff140773cd6654658517f51193' +
54
+ '13f21f0a8e04fe7d7b21ffeca85ff8f87c42bb8d9cb13a72' +
55
+ 'c00e9c6e9dfcedda0777af951cc8ccab90d35e915e707d8e' +
56
+ '4c2aca219547dd78e9a1a0730accdc9ad0b854e51edd1e91' +
57
+ '4756760bab156ca6e3cb9c625cf0870def34e9ac2e552800' +
58
+ 'd6ce506d43dbbc75acfa0c8d8fb12daa3c783fb726f187d5' +
59
+ '58131779239c912d389d0511e0f3a81969d12aeee670e48f' +
60
+ 'ba41f7ed9f10705543689c2506b976a8ffabed45e33795b0' +
61
+ '1df4f6b993a33d1deab1316a67419afa31fbb6fdd252ee8c' +
62
+ '7c7d1d016c44e3fcf6b41898d7f206aa33760b505e4eff2e' +
63
+ 'c624bc7fe636b1d59e45d6f904fc391419f13d1f0cdb5b6c' +
64
+ '2378b09434159917dde709f8a6b5dc30994d056e3f964371' +
65
+ '11587ac7af0a442b8367a7bd940f752ddabf31cf01171e24' +
66
+ 'd78df136e9681cd974ce4f858a5fb6efd3234a91857bb52d' +
67
+ '9e7b414a8bc66db4b5a73bbeccfb6eb764b4f0cbf0375136' +
68
+ 'b024b04e698d54a5'
69
+ },
70
+ p17: {
71
+ prime: 'ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd1' +
72
+ '29024e088a67cc74020bbea63b139b22514a08798e3404dd' +
73
+ 'ef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245' +
74
+ 'e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed' +
75
+ 'ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3d' +
76
+ 'c2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f' +
77
+ '83655d23dca3ad961c62f356208552bb9ed529077096966d' +
78
+ '670c354e4abc9804f1746c08ca18217c32905e462e36ce3b' +
79
+ 'e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9' +
80
+ 'de2bcbf6955817183995497cea956ae515d2261898fa0510' +
81
+ '15728e5a8aaac42dad33170d04507a33a85521abdf1cba64' +
82
+ 'ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7' +
83
+ 'abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6b' +
84
+ 'f12ffa06d98a0864d87602733ec86a64521f2b18177b200c' +
85
+ 'bbe117577a615d6c770988c0bad946e208e24fa074e5ab31' +
86
+ '43db5bfce0fd108e4b82d120a92108011a723c12a787e6d7' +
87
+ '88719a10bdba5b2699c327186af4e23c1a946834b6150bda' +
88
+ '2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6' +
89
+ '287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed' +
90
+ '1f612970cee2d7afb81bdd762170481cd0069127d5b05aa9' +
91
+ '93b4ea988d8fddc186ffb7dc90a6c08f4df435c934028492' +
92
+ '36c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bd' +
93
+ 'f8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831' +
94
+ '179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1b' +
95
+ 'db7f1447e6cc254b332051512bd7af426fb8f401378cd2bf' +
96
+ '5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6' +
97
+ 'd55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f3' +
98
+ '23a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aa' +
99
+ 'cc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be328' +
100
+ '06a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55c' +
101
+ 'da56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee' +
102
+ '12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff',
103
+ priv: '6017f2bc23e1caff5b0a8b4e1fc72422b5204415787801dc' +
104
+ '025762b8dbb98ab57603aaaa27c4e6bdf742b4a1726b9375' +
105
+ 'a8ca3cf07771779589831d8bd18ddeb79c43e7e77d433950' +
106
+ 'e652e49df35b11fa09644874d71d62fdaffb580816c2c88c' +
107
+ '2c4a2eefd4a660360316741b05a15a2e37f236692ad3c463' +
108
+ 'fff559938fc6b77176e84e1bb47fb41af691c5eb7bb81bd8' +
109
+ 'c918f52625a1128f754b08f5a1403b84667231c4dfe07ed4' +
110
+ '326234c113931ce606037e960f35a2dfdec38a5f057884d3' +
111
+ '0af8fab3be39c1eeb390205fd65982191fc21d5aa30ddf51' +
112
+ 'a8e1c58c0c19fc4b4a7380ea9e836aaf671c90c29bc4bcc7' +
113
+ '813811aa436a7a9005de9b507957c56a9caa1351b6efc620' +
114
+ '7225a18f6e97f830fb6a8c4f03b82f4611e67ab9497b9271' +
115
+ 'd6ac252793cc3e5538990dbd894d2dbc2d152801937d9f74' +
116
+ 'da4b741b50b4d40e4c75e2ac163f7b397fd555648b249f97' +
117
+ 'ffe58ffb6d096aa84534c4c5729cff137759bd34e80db4ab' +
118
+ '47e2b9c52064e7f0bf677f72ac9e5d0c6606943683f9d12f' +
119
+ '180cf065a5cb8ec3179a874f358847a907f8471d15f1e728' +
120
+ '7023249d6d13c82da52628654438f47b8b5cdf4761fbf6ad' +
121
+ '9219eceac657dbd06cf2ab776ad4c968f81c3d039367f0a4' +
122
+ 'd77c7ec4435c27b6c147071665100063b5666e06eb2fb2cc' +
123
+ '3159ba34bc98ca346342195f6f1fb053ddc3bc1873564d40' +
124
+ '1c6738cdf764d6e1ff25ca5926f80102ea6593c17170966b' +
125
+ 'b5d7352dd7fb821230237ea3ebed1f920feaadbd21be295a' +
126
+ '69f2083deae9c5cdf5f4830eb04b7c1f80cc61c17232d79f' +
127
+ '7ecc2cc462a7965f804001c89982734e5abba2d31df1b012' +
128
+ '152c6b226dff34510b54be8c2cd68d795def66c57a3abfb6' +
129
+ '896f1d139e633417f8c694764974d268f46ece3a8d6616ea' +
130
+ 'a592144be48ee1e0a1595d3e5edfede5b27cec6c48ceb2ff' +
131
+ 'b42cb44275851b0ebf87dfc9aa2d0cb0805e9454b051dfe8' +
132
+ 'a29fadd82491a4b4c23f2d06ba45483ab59976da1433c9ce' +
133
+ '500164b957a04cf62dd67595319b512fc4b998424d1164dd' +
134
+ 'bbe5d1a0f7257cbb04ec9b5ed92079a1502d98725023ecb2',
135
+ pub: '3bf836229c7dd874fe37c1790d201e82ed8e192ed61571ca' +
136
+ '7285264974eb2a0171f3747b2fc23969a916cbd21e14f7e2' +
137
+ 'f0d72dcd2247affba926f9e7bb99944cb5609aed85e71b89' +
138
+ 'e89d2651550cb5bd8281bd3144066af78f194032aa777739' +
139
+ 'cccb7862a1af401f99f7e5c693f25ddce2dedd9686633820' +
140
+ 'd28d0f5ed0c6b5a094f5fe6170b8e2cbc9dff118398baee6' +
141
+ 'e895a6301cb6e881b3cae749a5bdf5c56fc897ff68bc73f2' +
142
+ '4811bb108b882872bade1f147d886a415cda2b93dd90190c' +
143
+ 'be5c2dd53fe78add5960e97f58ff2506afe437f4cf4c912a' +
144
+ '397c1a2139ac6207d3ab76e6b7ffd23bb6866dd7f87a9ae5' +
145
+ '578789084ff2d06ea0d30156d7a10496e8ebe094f5703539' +
146
+ '730f5fdbebc066de417be82c99c7da59953071f49da7878d' +
147
+ 'a588775ff2a7f0084de390f009f372af75cdeba292b08ea8' +
148
+ '4bd13a87e1ca678f9ad148145f7cef3620d69a891be46fbb' +
149
+ 'cad858e2401ec0fd72abdea2f643e6d0197b7646fbb83220' +
150
+ '0f4cf7a7f6a7559f9fb0d0f1680822af9dbd8dec4cd1b5e1' +
151
+ '7bc799e902d9fe746ddf41da3b7020350d3600347398999a' +
152
+ 'baf75d53e03ad2ee17de8a2032f1008c6c2e6618b62f225b' +
153
+ 'a2f350179445debe68500fcbb6cae970a9920e321b468b74' +
154
+ '5fb524fb88abbcacdca121d737c44d30724227a99745c209' +
155
+ 'b970d1ff93bbc9f28b01b4e714d6c9cbd9ea032d4e964d8e' +
156
+ '8fff01db095160c20b7646d9fcd314c4bc11bcc232aeccc0' +
157
+ 'fbedccbc786951025597522eef283e3f56b44561a0765783' +
158
+ '420128638c257e54b972a76e4261892d81222b3e2039c61a' +
159
+ 'ab8408fcaac3d634f848ab3ee65ea1bd13c6cd75d2e78060' +
160
+ 'e13cf67fbef8de66d2049e26c0541c679fff3e6afc290efe' +
161
+ '875c213df9678e4a7ec484bc87dae5f0a1c26d7583e38941' +
162
+ 'b7c68b004d4df8b004b666f9448aac1cc3ea21461f41ea5d' +
163
+ 'd0f7a9e6161cfe0f58bcfd304bdc11d78c2e9d542e86c0b5' +
164
+ '6985cc83f693f686eaac17411a8247bf62f5ccc7782349b5' +
165
+ 'cc1f20e312fa2acc0197154d1bfee507e8db77e8f2732f2d' +
166
+ '641440ccf248e8643b2bd1e1f9e8239356ab91098fcb431d',
167
+ q: 'a899c59999bf877d96442d284359783bdc64b5f878b688fe' +
168
+ '51407f0526e616553ad0aaaac4d5bed3046f10a1faaf42bb' +
169
+ '2342dc4b7908eea0c46e4c4576897675c2bfdc4467870d3d' +
170
+ 'cd90adaed4359237a4bc6924bfb99aa6bf5f5ede15b574ea' +
171
+ 'e977eac096f3c67d09bda574c6306c6123fa89d2f086b8dc' +
172
+ 'ff92bc570c18d83fe6c810ccfd22ce4c749ef5e6ead3fffe' +
173
+ 'c63d95e0e3fde1df9db6a35fa1d107058f37e41957769199' +
174
+ 'd945dd7a373622c65f0af3fd9eb1ddc5c764bbfaf7a3dc37' +
175
+ '2548e683b970dac4aa4b9869080d2376c9adecebb84e172c' +
176
+ '09aeeb25fb8df23e60033260c4f8aac6b8b98ab894b1fb84' +
177
+ 'ebb83c0fb2081c3f3eee07f44e24d8fabf76f19ed167b0d7' +
178
+ 'ff971565aa4efa3625fce5a43ceeaa3eebb3ce88a00f597f' +
179
+ '048c69292b38dba2103ecdd5ec4ccfe3b2d87fa6202f334b' +
180
+ 'c1cab83b608dfc875b650b69f2c7e23c0b2b4adf149a6100' +
181
+ 'db1b6dbad4679ecb1ea95eafaba3bd00db11c2134f5a8686' +
182
+ '358b8b2ab49a1b2e85e1e45caeac5cd4dc0b3b5fffba8871' +
183
+ '1c6baf399edd48dad5e5c313702737a6dbdcede80ca358e5' +
184
+ '1d1c4fe42e8948a084403f61baed38aa9a1a5ce2918e9f33' +
185
+ '100050a430b47bc592995606440272a4994677577a6aaa1b' +
186
+ 'a101045dbec5a4e9566dab5445d1af3ed19519f07ac4e2a8' +
187
+ 'bd0a84b01978f203a9125a0be020f71fab56c2c9e344d4f4' +
188
+ '12d53d3cd8eb74ca5122002e931e3cb0bd4b7492436be17a' +
189
+ 'd7ebe27148671f59432c36d8c56eb762655711cfc8471f70' +
190
+ '83a8b7283bcb3b1b1d47d37c23d030288cfcef05fbdb4e16' +
191
+ '652ee03ee7b77056a808cd700bc3d9ef826eca9a59be959c' +
192
+ '947c865d6b372a1ca2d503d7df6d7611b12111665438475a' +
193
+ '1c64145849b3da8c2d343410df892d958db232617f9896f1' +
194
+ 'de95b8b5a47132be80dd65298c7f2047858409bf762dbc05' +
195
+ 'a62ca392ac40cfb8201a0607a2cae07d99a307625f2b2d04' +
196
+ 'fe83fbd3ab53602263410f143b73d5b46fc761882e78c782' +
197
+ 'd2c36e716a770a7aefaf7f76cea872db7bffefdbc4c2f9e0' +
198
+ '39c19adac915e7a63dcb8c8c78c113f29a3e0bc10e100ce0',
199
+ qs: '6f0a2fb763eaeb8eb324d564f03d4a55fdcd709e5f1b65e9' +
200
+ '5702b0141182f9f945d71bc3e64a7dfdae7482a7dd5a4e58' +
201
+ 'bc38f78de2013f2c468a621f08536969d2c8d011bb3bc259' +
202
+ '2124692c91140a5472cad224acdacdeae5751dadfdf068b8' +
203
+ '77bfa7374694c6a7be159fc3d24ff9eeeecaf62580427ad8' +
204
+ '622d48c51a1c4b1701d768c79d8c819776e096d2694107a2' +
205
+ 'f3ec0c32224795b59d32894834039dacb369280afb221bc0' +
206
+ '90570a93cf409889b818bb30cccee98b2aa26dbba0f28499' +
207
+ '08e1a3cd43fa1f1fb71049e5c77c3724d74dc351d9989057' +
208
+ '37bbda3805bd6b1293da8774410fb66e3194e18cdb304dd9' +
209
+ 'a0b59b583dcbc9fc045ac9d56aea5cfc9f8a0b95da1e11b7' +
210
+ '574d1f976e45fe12294997fac66ca0b83fc056183549e850' +
211
+ 'a11413cc4abbe39a211e8c8cbf82f2a23266b3c10ab9e286' +
212
+ '07a1b6088909cddff856e1eb6b2cde8bdac53fa939827736' +
213
+ 'ca1b892f6c95899613442bd02dbdb747f02487718e2d3f22' +
214
+ 'f73734d29767ed8d0e346d0c4098b6fdcb4df7d0c4d29603' +
215
+ '5bffe80d6c65ae0a1b814150d349096baaf950f2caf298d2' +
216
+ 'b292a1d48cf82b10734fe8cedfa16914076dfe3e9b51337b' +
217
+ 'ed28ea1e6824bb717b641ca0e526e175d3e5ed7892aebab0' +
218
+ 'f207562cc938a821e2956107c09b6ce4049adddcd0b7505d' +
219
+ '49ae6c69a20122461102d465d93dc03db026be54c303613a' +
220
+ 'b8e5ce3fd4f65d0b6162ff740a0bf5469ffd442d8c509cd2' +
221
+ '3b40dab90f6776ca17fc0678774bd6eee1fa85ababa52ec1' +
222
+ 'a15031eb677c6c488661dddd8b83d6031fe294489ded5f08' +
223
+ '8ad1689a14baeae7e688afa3033899c81f58de39b392ca94' +
224
+ 'af6f15a46f19fa95c06f9493c8b96a9be25e78b9ea35013b' +
225
+ 'caa76de6303939299d07426a88a334278fc3d0d9fa71373e' +
226
+ 'be51d3c1076ab93a11d3d0d703366ff8cde4c11261d488e5' +
227
+ '60a2bdf3bfe2476032294800d6a4a39d306e65c6d7d8d66e' +
228
+ '5ec63eee94531e83a9bddc458a2b508285c0ee10b7bd94da' +
229
+ '2815a0c5bd5b2e15cbe66355e42f5af8955cdfc0b3a4996d' +
230
+ '288db1f4b32b15643b18193e378cb7491f3c3951cdd044b1' +
231
+ 'a519571bffac2da986f5f1d506c66530a55f70751e24fa8e' +
232
+ 'd83ac2347f4069fb561a5565e78c6f0207da24e889a93a96' +
233
+ '65f717d9fe8a2938a09ab5f81be7ccecf466c0397fc15a57' +
234
+ '469939793f302739765773c256a3ca55d0548afd117a7cae' +
235
+ '98ca7e0d749a130c7b743d376848e255f8fdbe4cb4480b63' +
236
+ 'cd2c015d1020cf095d175f3ca9dcdfbaf1b2a6e6468eee4c' +
237
+ 'c750f2132a77f376bd9782b9d0ff4da98621b898e251a263' +
238
+ '4301ba2214a8c430b2f7a79dbbfd6d7ff6e9b0c137b025ff' +
239
+ '587c0bf912f0b19d4fff96b1ecd2ca990c89b386055c60f2' +
240
+ '3b94214bd55096f17a7b2c0fa12b333235101cd6f28a128c' +
241
+ '782e8a72671adadebbd073ded30bd7f09fb693565dcf0bf3' +
242
+ '090c21d13e5b0989dd8956f18f17f4f69449a13549c9d80a' +
243
+ '77e5e61b5aeeee9528634100e7bc390672f0ded1ca53555b' +
244
+ 'abddbcf700b9da6192255bddf50a76b709fbed251dce4c7e' +
245
+ '1ca36b85d1e97c1bc9d38c887a5adf140f9eeef674c31422' +
246
+ 'e65f63cae719f8c1324e42fa5fd8500899ef5aa3f9856aa7' +
247
+ 'ce10c85600a040343204f36bfeab8cfa6e9deb8a2edd2a8e' +
248
+ '018d00c7c9fa3a251ad0f57183c37e6377797653f382ec7a' +
249
+ '2b0145e16d3c856bc3634b46d90d7198aff12aff88a30e34' +
250
+ 'e2bfaf62705f3382576a9d3eeb0829fca2387b5b654af46e' +
251
+ '5cf6316fb57d59e5ea6c369061ac64d99671b0e516529dd5' +
252
+ 'd9c48ea0503e55fee090d36c5ea8b5954f6fcc0060794e1c' +
253
+ 'b7bc24aa1e5c0142fd4ce6e8fd5aa92a7bf84317ea9e1642' +
254
+ 'b6995bac6705adf93cbce72433ed0871139970d640f67b78' +
255
+ 'e63a7a6d849db2567df69ac7d79f8c62664ac221df228289' +
256
+ 'd0a4f9ebd9acb4f87d49da64e51a619fd3f3baccbd9feb12' +
257
+ '5abe0cc2c8d17ed1d8546da2b6c641f4d3020a5f9b9f26ac' +
258
+ '16546c2d61385505612275ea344c2bbf1ce890023738f715' +
259
+ '5e9eba6a071678c8ebd009c328c3eb643679de86e69a9fa5' +
260
+ '67a9e146030ff03d546310a0a568c5ba0070e0da22f2cef8' +
261
+ '54714b04d399bbc8fd261f9e8efcd0e83bdbc3f5cfb2d024' +
262
+ '3e398478cc598e000124eb8858f9df8f52946c2a1ca5c400'
263
+ }
264
+ }