@bitgo-beta/sdk-coin-stx 1.4.3-alpha.43 → 1.4.3-alpha.430

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 (74) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +24 -9
  4. package/dist/src/lib/abstractContractBuilder.js +2 -2
  5. package/dist/src/lib/constants.d.ts +2 -1
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +5 -3
  8. package/dist/src/lib/contractBuilder.js +10 -10
  9. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +62 -0
  10. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
  11. package/dist/src/lib/fungibleTokenTransferBuilder.js +131 -0
  12. package/dist/src/lib/iface.d.ts +56 -0
  13. package/dist/src/lib/iface.d.ts.map +1 -1
  14. package/dist/src/lib/iface.js +1 -1
  15. package/dist/src/lib/index.js +23 -9
  16. package/dist/src/lib/keyPair.js +18 -19
  17. package/dist/src/lib/sendmanyBuilder.js +11 -11
  18. package/dist/src/lib/transaction.d.ts.map +1 -1
  19. package/dist/src/lib/transaction.js +31 -15
  20. package/dist/src/lib/transactionBuilder.js +12 -12
  21. package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
  22. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  23. package/dist/src/lib/transactionBuilderFactory.js +9 -2
  24. package/dist/src/lib/transferBuilder.js +4 -4
  25. package/dist/src/lib/utils.d.ts +25 -2
  26. package/dist/src/lib/utils.d.ts.map +1 -1
  27. package/dist/src/lib/utils.js +141 -62
  28. package/dist/src/register.d.ts.map +1 -1
  29. package/dist/src/register.js +5 -1
  30. package/dist/src/sip10Token.d.ts +22 -0
  31. package/dist/src/sip10Token.d.ts.map +1 -0
  32. package/dist/src/sip10Token.js +128 -0
  33. package/dist/src/stx.d.ts +146 -2
  34. package/dist/src/stx.d.ts.map +1 -1
  35. package/dist/src/stx.js +420 -11
  36. package/dist/src/tstx.js +1 -1
  37. package/dist/test/fixtures.d.ts +119 -0
  38. package/dist/test/fixtures.d.ts.map +1 -0
  39. package/dist/test/fixtures.js +147 -0
  40. package/dist/test/unit/keyPair.d.ts +2 -0
  41. package/dist/test/unit/keyPair.d.ts.map +1 -0
  42. package/dist/test/unit/keyPair.js +144 -0
  43. package/dist/test/unit/resources.d.ts +97 -0
  44. package/dist/test/unit/resources.d.ts.map +1 -0
  45. package/dist/test/unit/resources.js +144 -0
  46. package/dist/test/unit/sip10Token.d.ts +2 -0
  47. package/dist/test/unit/sip10Token.d.ts.map +1 -0
  48. package/dist/test/unit/sip10Token.js +374 -0
  49. package/dist/test/unit/stx.d.ts +2 -0
  50. package/dist/test/unit/stx.d.ts.map +1 -0
  51. package/dist/test/unit/stx.js +470 -0
  52. package/dist/test/unit/transaction.d.ts +2 -0
  53. package/dist/test/unit/transaction.d.ts.map +1 -0
  54. package/dist/test/unit/transaction.js +83 -0
  55. package/dist/test/unit/transactionBuilder/contractBuilder.d.ts +2 -0
  56. package/dist/test/unit/transactionBuilder/contractBuilder.d.ts.map +1 -0
  57. package/dist/test/unit/transactionBuilder/contractBuilder.js +421 -0
  58. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts +2 -0
  59. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts.map +1 -0
  60. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +187 -0
  61. package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts +2 -0
  62. package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts.map +1 -0
  63. package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +140 -0
  64. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  65. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  66. package/dist/test/unit/transactionBuilder/transferBuilder.js +347 -0
  67. package/dist/test/unit/util.d.ts +2 -0
  68. package/dist/test/unit/util.d.ts.map +1 -0
  69. package/dist/test/unit/util.js +326 -0
  70. package/dist/tsconfig.tsbuildinfo +1 -0
  71. package/package.json +13 -11
  72. package/.eslintignore +0 -5
  73. package/.mocharc.yml +0 -8
  74. package/CHANGELOG.md +0 -127
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const transactions_1 = require("@stacks/transactions");
42
+ const bn_js_1 = __importDefault(require("bn.js"));
43
+ const testData = __importStar(require("./resources"));
44
+ const src_1 = require("../../src");
45
+ const { KeyPair, Utils } = src_1.StxLib;
46
+ describe('Stx util library', function () {
47
+ describe('address', function () {
48
+ it('should validate addresses', function () {
49
+ const validAddresses = [
50
+ 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
51
+ 'ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y',
52
+ 'SP2T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY',
53
+ 'ST1WVJMS5VS41F0YMH7D2M0VHXRG4CY43ZJZBS60A?memoId=4',
54
+ 'SPSZBZ3W0JC2MEBN0M9PAM2QB5SH72QYEQAMN6HD?memoId=0',
55
+ 'SP3BV7092K9ZS9NJ9ZYMPXE69SV6Y6072M7HEZ49E?memoId=255',
56
+ ];
57
+ for (const address of validAddresses) {
58
+ Utils.isValidAddressWithPaymentId(address).should.be.true();
59
+ }
60
+ });
61
+ it('should fail to validate invalid addresses', function () {
62
+ const invalidAddresses = [
63
+ 'SP244HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
64
+ 'ST1T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY',
65
+ 'ST1WVJMS5VS41F0YMH7D2M0VHXRG4CY43ZJZBS60A?memoId=NaN',
66
+ 'SPSZBZ3W0JC2MEBN0M9PAM2QB5SH72QYEQAMN6HD?memoId=',
67
+ 'SP3BV7092K9ZS9NJ9ZYMPXE69SV6Y6072M7HEZ49E?memoId=testing',
68
+ '',
69
+ 'abc',
70
+ ];
71
+ for (const address of invalidAddresses) {
72
+ should_1.default.doesNotThrow(() => Utils.isValidAddress(address));
73
+ Utils.isValidAddressWithPaymentId(address).should.be.false();
74
+ }
75
+ });
76
+ it('should generate multisig addresses from compressed public keys', function () {
77
+ const pubKeys = [
78
+ '0263e1f2f322fb74224e210f9d616fce14d10fa89520dcde3d6d02514cdb16846a',
79
+ '02d5de9e1b9c13fc7b67446ebcff4fbb9aa6b1933f907e9aabf32f48d6e0a5064d',
80
+ '0296c4b8353c4a938173f80706df480cf6f85523b428d59ee81d9effcf61e5eae8',
81
+ ];
82
+ const address = Utils.getSTXAddressFromPubKeys(pubKeys);
83
+ address.address.should.equal('SM1W9PBVTZA9SRNBQJ2A05R3T0ZVYC94PD0AN9KDG');
84
+ address.hash160.should.equal('789b2f7afa939c5577909402e07a07f7e6249668');
85
+ Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.TestnetMultiSig).address.should.equal('SN1W9PBVTZA9SRNBQJ2A05R3T0ZVYC94PD0A9GGMZ');
86
+ Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.MainnetMultiSig).address.should.equal('SM1W9PBVTZA9SRNBQJ2A05R3T0ZVYC94PD0AN9KDG');
87
+ });
88
+ it('should generate multisig addresses from uncompressed public keys', function () {
89
+ const pubKeys = [
90
+ '049742b908579ffd225d5e1d9486471f19a101dd04b7a81d11da882e7ac7f3e042989c311524a3335e15dec9338a07bd21b6e4444b6b7744d314cc926a1f0383db',
91
+ '0464097ccbc22905ec6f678c846346294033e11a216d133abf6af252294695b3538d65f65b188b6e72e1890e7738f9e221944e618dea1178ef749717b35492de6a',
92
+ '042c608408352ab41477ad9dd1cabca9e712de2dff3c5c8bfa4b5f7f1a0f74a32402a826d2ce5f3a6b01c16aeebdd304e235791958bbf97a08b5d4e9dd4db399b7',
93
+ ];
94
+ Utils.getSTXAddressFromPubKeys(pubKeys).address.should.equal('SM2TF8C003JE5YA8B43C2ZAY0K95QFVJNV86FCCQ4');
95
+ Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.TestnetMultiSig).address.should.equal('SN2TF8C003JE5YA8B43C2ZAY0K95QFVJNV90P7YGS');
96
+ Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.MainnetMultiSig).address.should.equal('SM2TF8C003JE5YA8B43C2ZAY0K95QFVJNV86FCCQ4');
97
+ });
98
+ it('should generate multisig addresses from compressed and uncompressed public keys', function () {
99
+ const pubKeys = [
100
+ '04d6f0f7d97a72979596a17fa2946eaeff3703250a62640271eea59477f5b19f39ad01ce2a53025eba365a4f40dd085234194d1d06aefec2a9d4439be0f3c2df34',
101
+ '02f6d0597fb6d5467203d080e17f7b4f767ead59fc303b7d7261a832cb44305bb0',
102
+ '034c80f991410082824aee4ca48147082997d44e800da9877e694f9cb64b3cb64a',
103
+ ];
104
+ Utils.getSTXAddressFromPubKeys(pubKeys).address.should.equal('SME8PKRHSCB699FEK59F7T7CBB225KH1MCKM67EV');
105
+ Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.TestnetMultiSig).address.should.equal('SNE8PKRHSCB699FEK59F7T7CBB225KH1MDPBVKF9');
106
+ Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.MainnetMultiSig).address.should.equal('SME8PKRHSCB699FEK59F7T7CBB225KH1MCKM67EV');
107
+ });
108
+ it('should not generate multisig addresses from invalid input', function () {
109
+ assert_1.default.throws(() => Utils.getSTXAddressFromPubKeys([]), /Invalid number of public keys/);
110
+ assert_1.default.throws(() => Utils.getSTXAddressFromPubKeys(['badkey', 'badkey2']), /Invalid public key/);
111
+ assert_1.default.throws(() => Utils.getSTXAddressFromPubKeys([
112
+ '02f6d0597fb6d5467203d080e17f7b4f767ead59fc303b7d7261a832cb44305bb0',
113
+ 'badkey',
114
+ ]), /Invalid public key/);
115
+ });
116
+ });
117
+ describe('amount', function () {
118
+ it('valid amount', function () {
119
+ Utils.isValidAmount('10').should.be.true();
120
+ });
121
+ it('invalid amount', function () {
122
+ Utils.isValidAmount('-10').should.be.false();
123
+ });
124
+ });
125
+ describe('private key', function () {
126
+ it('should validate proper keys', function () {
127
+ const keys = [testData.secretKey1, testData.secretKey2, testData.ACCOUNT_1.prv];
128
+ for (const key of keys) {
129
+ Utils.isValidPrivateKey(key).should.be.true();
130
+ }
131
+ });
132
+ it('should not validate invalid keys', function () {
133
+ const keys = [
134
+ '66c88648116b721bb2f394e0007f9d348ea08017b6e604de51a3a7d957d5852409',
135
+ '688648116b721bb2f394e0007f9d348ea08017b6e604de51a3a7d957d58524',
136
+ '0x66c88648116b721bb2f394e0007f9d348ea08017b6e604de51a3a7d957d58524',
137
+ '',
138
+ 'bitgo-stacks',
139
+ '66c88648116b721bb2f394e0007f9d34 8ea08017b6e604de51a3a7d957d58524',
140
+ '66c88648116b721bb2f394e0007f9d3rrxx908017b6e604de51a3a7d957d58524',
141
+ ];
142
+ for (const key of keys) {
143
+ Utils.isValidPrivateKey(key).should.be.false();
144
+ }
145
+ });
146
+ });
147
+ describe('public key', function () {
148
+ it('should validate proper keys', function () {
149
+ const keys = [testData.pubKey1, testData.pubKey2, testData.pubKey2Compressed];
150
+ for (const key of keys) {
151
+ Utils.isValidPublicKey(key).should.be.true();
152
+ }
153
+ });
154
+ it('should not validate invalid keys', function () {
155
+ const keys = [
156
+ '0421d6f42c97d23ec2c0dc21208a9c5edfce4e5bc7b63972e68e86e3cea6f41a94a9a7c24a1ccd83792173f475fdb590cc82f94ff615df39142766e759ce6387',
157
+ '0321d6f42c99f7d23ec 2c0dc21208a9c5edfce4e5bc7b63972e68e6e3cea6f41a',
158
+ '0aa68c2d6fdb3706b39f32d6f4225275ce062561908fd7ca540a44c92eb8594ea6db9fcfe0b390c0ead3f45c36afd682eab62eb124a63b460945fe1f7c7f8a09e2',
159
+ '',
160
+ 'bitgo-stacks',
161
+ '0921d6f42c99f7d23ec2c0dc21208a9c5edfce4e5bc7b63972e68e86e3cea6f41a',
162
+ '0321d6f42c99f7d23ec2c0dc21208a9c5edfce4e5bc7b63972e68ezze3cea6f41a',
163
+ '0x0321d6f42c99f7d23ec2c0dc21208a9c5edfce4e5bc7b63972e68e86e3cea6f41a',
164
+ testData.invalidPubKey1,
165
+ testData.invalidPubKey2,
166
+ ];
167
+ for (const key of keys) {
168
+ Utils.isValidPublicKey(key).should.be.false();
169
+ }
170
+ });
171
+ });
172
+ describe('transaction id', function () {
173
+ it('should validate proper ids', function () {
174
+ const txIds = [
175
+ '0x209a3e196195063b2e5195232087a71fe2329a6dc8d2fca531d48c5a7824f679',
176
+ '6a590378c059f78fb698ec0af1ff610586cb1a52ee79fdae69e56430fde08cf4',
177
+ '0e0149bc2c819f3ae40cef95ca58955c80bbc9e15f8c7c651c7b86c2214b7f02',
178
+ ];
179
+ for (const txId of txIds) {
180
+ Utils.isValidTransactionId(txId).should.be.true();
181
+ }
182
+ });
183
+ it('should not validate invalid ids', function () {
184
+ const txIds = [
185
+ '',
186
+ 'bitgo-stacks',
187
+ '0x209a3e196195063b2e5195232087a71fe2329a6dc8d2fca531d48c5a7824f67',
188
+ '6a590378c059f78fb698ec0af1ff610586cb52ee79fdae69e56430fde08cf4',
189
+ '1x209a3e196195063b2e5195232087a71fe2329a6dc8d2fca531d48c5a7824f679',
190
+ '6a590378c059f78fb698ec0af1ff610586cb1azz2ee79fdae69e56430fde08cf4',
191
+ '0e0149bc2c819f3ae40cef95ca58955c80bbc9e1 5f8c7c651c7b86c2214b7f02',
192
+ ];
193
+ for (const txId of txIds) {
194
+ Utils.isValidTransactionId(txId).should.be.false();
195
+ }
196
+ });
197
+ });
198
+ describe('transaction memo', function () {
199
+ it('check for valid memo strings', function () {
200
+ const memoStrings = ['', 'This is a test.', 'Okay', '!!This is thirty four bytes long!!'];
201
+ for (const memo of memoStrings) {
202
+ Utils.isValidMemo(memo).should.be.true();
203
+ }
204
+ });
205
+ it('check for valid memo strings', function () {
206
+ const memoStrings = ['ꜟꜟThis is thirty four chars long!!', 'It was the best of times, it was the worst of times'];
207
+ for (const memo of memoStrings) {
208
+ Utils.isValidMemo(memo).should.be.false();
209
+ }
210
+ });
211
+ });
212
+ describe('sign and verify', function () {
213
+ const keyPair1 = new KeyPair({ prv: testData.secretKey1 });
214
+ const keyPair2 = new KeyPair({ prv: testData.secretKey2 });
215
+ it('sign a message', function () {
216
+ should_1.default.equal(Utils.signMessage(keyPair1, testData.message1), testData.expectedSignature1);
217
+ should_1.default.equal(Utils.signMessage(keyPair2, testData.message2), testData.expectedSignature2);
218
+ });
219
+ it('verify a signature', function () {
220
+ Utils.verifySignature(testData.message1, testData.expectedSignature1, keyPair1.getKeys().pub).should.be.true();
221
+ // handle compressed and uncompressed public keys properly
222
+ Utils.verifySignature(testData.message2, testData.expectedSignature2, keyPair2.getKeys(false).pub).should.be.true();
223
+ Utils.verifySignature(testData.message2, testData.expectedSignature2, keyPair2.getKeys(true).pub).should.be.true();
224
+ });
225
+ it('should not verify signatures', function () {
226
+ // empty message
227
+ assert_1.default.throws(() => Utils.verifySignature('', testData.expectedSignature1, keyPair1.getKeys().pub), new RegExp('Cannot verify empty messages'));
228
+ // wrong public key
229
+ Utils.verifySignature(testData.message1, testData.expectedSignature1, keyPair2.getKeys().pub).should.be.false();
230
+ // wrong signature
231
+ Utils.verifySignature(testData.message2, testData.expectedSignature1, keyPair2.getKeys().pub).should.be.false();
232
+ });
233
+ });
234
+ describe('stringifyCv', function () {
235
+ it('Int type', function () {
236
+ const input = { type: transactions_1.ClarityType.Int, value: BigInt('100000') };
237
+ Utils.stringifyCv(input).should.deepEqual({ type: 0, value: '100000' });
238
+ });
239
+ it('UInt type', function () {
240
+ const input = { type: transactions_1.ClarityType.UInt, value: BigInt('100000') };
241
+ Utils.stringifyCv(input).should.deepEqual({ type: 1, value: '100000' });
242
+ });
243
+ it('OptionalNone type', function () {
244
+ const input = { type: transactions_1.ClarityType.OptionalNone };
245
+ Utils.stringifyCv(input).should.deepEqual(input);
246
+ });
247
+ it('OptionalSome type with uint value', function () {
248
+ const input = {
249
+ type: transactions_1.ClarityType.OptionalSome,
250
+ value: { type: transactions_1.ClarityType.UInt, value: BigInt('100000') },
251
+ };
252
+ Utils.stringifyCv(input).should.deepEqual({ type: 10, value: { type: 1, value: '100000' } });
253
+ });
254
+ it('OptionalSome type with tuple value', function () {
255
+ const input = {
256
+ type: transactions_1.ClarityType.OptionalSome,
257
+ value: {
258
+ type: transactions_1.ClarityType.Tuple,
259
+ data: {
260
+ hashbytes: { type: transactions_1.ClarityType.Buffer, buffer: Buffer.from('some-hash') },
261
+ version: { type: transactions_1.ClarityType.Buffer, buffer: new bn_js_1.default(1).toBuffer() },
262
+ },
263
+ },
264
+ };
265
+ Utils.stringifyCv(input).should.deepEqual(input);
266
+ });
267
+ it('List type', function () {
268
+ const input = { type: transactions_1.ClarityType.List, list: [{ type: transactions_1.ClarityType.UInt, value: BigInt('100000') }] };
269
+ Utils.stringifyCv(input).should.deepEqual({ type: 11, list: [{ type: 1, value: '100000' }] });
270
+ });
271
+ it('List type with empty list', function () {
272
+ const input = { type: transactions_1.ClarityType.List, list: [] };
273
+ Utils.stringifyCv(input).should.deepEqual({ type: 11, list: [] });
274
+ });
275
+ });
276
+ describe('getAddressVersion', function () {
277
+ it('should succeed to for valid addresses', function () {
278
+ // Mainnet single sig
279
+ Utils.getAddressVersion('SP1DN2NGRB2R3W75ST0GAA7DBV1VEBBWYZ1D33DEQ').should.equal(22);
280
+ // Mainnet multi sig
281
+ Utils.getAddressVersion('SM468VETKA5DB15HWG2QM7Y04EFQKV44R9D6D0QC').should.equal(20);
282
+ // Testnet single sig
283
+ Utils.getAddressVersion('ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0').should.equal(26);
284
+ // Testnet multi sig
285
+ Utils.getAddressVersion('SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX').should.equal(21);
286
+ // With Memo Id
287
+ Utils.getAddressVersion('SP1DN2NGRB2R3W75ST0GAA7DBV1VEBBWYZ1D33DEQ?memoId=0').should.equal(22);
288
+ Utils.getAddressVersion('SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255').should.equal(21);
289
+ });
290
+ });
291
+ describe('xpubToSTXPubkey', function () {
292
+ it('should succeed to convert for valid xpubs', function () {
293
+ Utils.xpubToSTXPubkey('xpub661MyMwAqRbcGS2HMdvANN7o8ESWqwvr5U4ry5fZdD9VHhymWyfoDQF4vzfKotXgGtJTrwrFRz7XbGFov4FqdKKo6mRYNWvMp7P23DjuJnS').should.equal('03f0f3581a4256797fa8478cb6b1da6588f4c4bedc80ab2601e3a1572cf57b6156');
294
+ Utils.xpubToSTXPubkey('xpub661MyMwAqRbcFEzr5CcpFzPG45rmPf75DTvDobN5gJimCatbHtzR53SbHzDZ1J56byKSsdc8vSujGuQpyPjb7Lsua2NfADJewPxNzL3N6Tj').should.equal('0262b7e86c1e36e45d451263b54a1c3d740abeab61d221d1175fc3fdad752853ab');
295
+ Utils.xpubToSTXPubkey('xpub661MyMwAqRbcGP1adk34VzRQJEMX25rCxjEyU9YFFWNhWNzwPoqgjLoKfnqotLwrz7kBevWbRZnqTSQrQDuJuYUQaDQ5DDPEzEXMwPS9PEf').should.equal('036529a0e41cfd1a9d265b74f8d0002c92c5aec10d4239000260a25cfd54e4726c');
296
+ });
297
+ });
298
+ describe('getBaseAddress', function () {
299
+ it('should return the base address', async function () {
300
+ const addressWithMemo = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255';
301
+ const baseAddress = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
302
+ Utils.getBaseAddress(addressWithMemo).should.equal(baseAddress);
303
+ Utils.getBaseAddress(baseAddress).should.equal(baseAddress);
304
+ });
305
+ });
306
+ describe('isSameBaseAddress', function () {
307
+ it('should validate if base address match', async function () {
308
+ const address = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255';
309
+ const baseAddress = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
310
+ Utils.isSameBaseAddress(address, baseAddress).should.true();
311
+ const address2 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
312
+ const baseAddress2 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
313
+ Utils.isSameBaseAddress(address2, baseAddress2).should.true();
314
+ const address3 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255';
315
+ const baseAddress3 = 'ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0';
316
+ Utils.isSameBaseAddress(address3, baseAddress3).should.false();
317
+ const address4 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
318
+ const baseAddress4 = 'ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0';
319
+ Utils.isSameBaseAddress(address4, baseAddress4).should.false();
320
+ const address5 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDF';
321
+ const baseAddress5 = 'ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0';
322
+ assert_1.default.throws(() => Utils.isSameBaseAddress(address5, baseAddress5).should.false(), new RegExp(`invalid address: ${address5}`));
323
+ });
324
+ });
325
+ });
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qix1REFBMEc7QUFDMUcsa0RBQTJCO0FBQzNCLHNEQUF3QztBQUN4QyxtQ0FBbUM7QUFFbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFNLENBQUM7QUFFbEMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxTQUFTLEVBQUU7UUFDbEIsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sY0FBYyxHQUFHO2dCQUNyQiwwQ0FBMEM7Z0JBQzFDLDJDQUEyQztnQkFDM0MsMkNBQTJDO2dCQUMzQyxvREFBb0Q7Z0JBQ3BELG1EQUFtRDtnQkFDbkQsc0RBQXNEO2FBQ3ZELENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsMENBQTBDO2dCQUMxQywyQ0FBMkM7Z0JBQzNDLHNEQUFzRDtnQkFDdEQsa0RBQWtEO2dCQUNsRCwwREFBMEQ7Z0JBQzFELEVBQUU7Z0JBQ0YsS0FBSzthQUNOLENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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LENBQUMsRUFBRSxDQUFDO1lBQ3hFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6RCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQVc7Z0JBQ3BCLElBQUksRUFBRSwwQkFBVyxDQUFDLFlBQVk7Z0JBQzlCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2FBQzNELENBQUM7WUFDRixLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtZQUN2QyxNQUFNLEtBQUssR0FBVztnQkFDcEIsSUFBSSxFQUFFLDBCQUFXLENBQUMsWUFBWTtnQkFDOUIsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSwwQkFBVyxDQUFDLEtBQUs7b0JBQ3ZCLElBQUksRUFBRTt3QkFDSixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ3pFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxlQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7cUJBQ3hFO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDZCxNQUFNLEtBQUssR0FBVyxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixNQUFNLEtBQUssR0FBVyxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDM0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1FBQzVCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxxQkFBcUI7WUFDckIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RixvQkFBb0I7WUFDcEIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRixxQkFBcUI7WUFDckIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRixvQkFBb0I7WUFDcEIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RixlQUFlO1lBQ2YsS0FBSyxDQUFDLGlCQUFpQixDQUFDLG9EQUFvRCxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRixLQUFLLENBQUMsaUJBQWlCLENBQUMsc0RBQXNELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLEtBQUssQ0FBQyxlQUFlLENBQ25CLGlIQUFpSCxDQUNsSCxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztZQUNyRixLQUFLLENBQUMsZUFBZSxDQUNuQixpSEFBaUgsQ0FDbEgsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDckYsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsaUhBQWlILENBQ2xILENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1FBQ3ZGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUs7WUFDeEMsTUFBTSxlQUFlLEdBQUcsc0RBQXNELENBQUM7WUFDL0UsTUFBTSxXQUFXLEdBQUcsMkNBQTJDLENBQUM7WUFDaEUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1FBQzVCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLO1lBQy9DLE1BQU0sT0FBTyxHQUFHLHNEQUFzRCxDQUFDO1lBQ3ZFLE1BQU0sV0FBVyxHQUFHLDJDQUEyQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTVELE1BQU0sUUFBUSxHQUFHLDJDQUEyQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLDJDQUEyQyxDQUFDO1lBQ2pFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTlELE1BQU0sUUFBUSxHQUFHLHNEQUFzRCxDQUFDO1lBQ3hFLE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRS9ELE1BQU0sUUFBUSxHQUFHLDJDQUEyQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRS9ELE1BQU0sUUFBUSxHQUFHLDJDQUEyQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDO1lBQ2hFLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUNwRSxJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsUUFBUSxFQUFFLENBQUMsQ0FDM0MsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEFkZHJlc3NWZXJzaW9uLCBDbGFyaXR5VHlwZSwgSW50Q1YsIE5vbmVDViwgU29tZUNWLCBVSW50Q1YsIExpc3RDViB9IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCBCaWdOdW0gZnJvbSAnYm4uanMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgU3R4TGliIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuY29uc3QgeyBLZXlQYWlyLCBVdGlscyB9ID0gU3R4TGliO1xuXG5kZXNjcmliZSgnU3R4IHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2FkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJ1NUQjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnLFxuICAgICAgICAnU1QxMU5KVFRLR1ZUNkQxSFk0TkpSVlFXTVFNN1RWQVIwOTFFSjhQMlknLFxuICAgICAgICAnU1AyVDc1OEs2VDJZUktHOVEwVEoxNkI2RlA1UVFSRVdaU0VTUlMwUFknLFxuICAgICAgICAnU1QxV1ZKTVM1VlM0MUYwWU1IN0QyTTBWSFhSRzRDWTQzWkpaQlM2MEE/bWVtb0lkPTQnLFxuICAgICAgICAnU1BTWkJaM1cwSkMyTUVCTjBNOVBBTTJRQjVTSDcyUVlFUUFNTjZIRD9tZW1vSWQ9MCcsXG4gICAgICAgICdTUDNCVjcwOTJLOVpTOU5KOVpZTVBYRTY5U1Y2WTYwNzJNN0hFWjQ5RT9tZW1vSWQ9MjU1JyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB2YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkQWRkcmVzc1dpdGhQYXltZW50SWQoYWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRBZGRyZXNzZXMgPSBbXG4gICAgICAgICdTUDI0NEhZUFlBVDJCQjJRRTUxM05TUDgxSFRNWVdCSlAwMkhQR0s2JyxcbiAgICAgICAgJ1NUMVQ3NThLNlQyWVJLRzlRMFRKMTZCNkZQNVFRUkVXWlNFU1JTMFBZJyxcbiAgICAgICAgJ1NUMVdWSk1TNVZTNDFGMFlNSDdEMk0wVkhYUkc0Q1k0M1pKWkJTNjBBP21lbW9JZD1OYU4nLFxuICAgICAgICAnU1BTWkJaM1cwSkMyTUVCTjBNOVBBTTJRQjVTSDcyUVlFUUFNTjZIRD9tZW1vSWQ9JyxcbiAgICAgICAgJ1NQM0JWNzA5Mks5WlM5Tko5WllNUFhFNjlTVjZZNjA3Mk03SEVaNDlFP21lbW9JZD10ZXN0aW5nJyxcbiAgICAgICAgJycsXG4gICAgICAgICdhYmMnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBVdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gY29tcHJlc3NlZCBwdWJsaWMga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleXMgPSBbXG4gICAgICAgICcwMjYzZTFmMmYzMjJmYjc0MjI0ZTIxMGY5ZDYxNmZjZTE0ZDEwZmE4OTUyMGRjZGUzZDZkMDI1MTRjZGIxNjg0NmEnLFxuICAgICAgICAnMDJkNWRlOWUxYjljMTNmYzdiNjc0NDZlYmNmZjRmYmI5YWE2YjE5MzNmOTA3ZTlhYWJmMzJmNDhkNmUwYTUwNjRkJyxcbiAgICAgICAgJzAyOTZjNGI4MzUzYzRhOTM4MTczZjgwNzA2ZGY0ODBjZjZmODU1MjNiNDI4ZDU5ZWU4MWQ5ZWZmY2Y2MWU1ZWFlOCcsXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhZGRyZXNzID0gVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMpO1xuXG4gICAgICBhZGRyZXNzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdTTTFXOVBCVlRaQTlTUk5CUUoyQTA1UjNUMFpWWUM5NFBEMEFOOUtERycpO1xuICAgICAgYWRkcmVzcy5oYXNoMTYwLnNob3VsZC5lcXVhbCgnNzg5YjJmN2FmYTkzOWM1NTc3OTA5NDAyZTA3YTA3ZjdlNjI0OTY2OCcpO1xuXG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uVGVzdG5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NOMVc5UEJWVFpBOVNSTkJRSjJBMDVSM1QwWlZZQzk0UEQwQTlHR01aJ1xuICAgICAgKTtcbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzLCBBZGRyZXNzVmVyc2lvbi5NYWlubmV0TXVsdGlTaWcpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnU00xVzlQQlZUWkE5U1JOQlFKMkEwNVIzVDBaVllDOTRQRDBBTjlLREcnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBtdWx0aXNpZyBhZGRyZXNzZXMgZnJvbSB1bmNvbXByZXNzZWQgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwdWJLZXlzID0gW1xuICAgICAgICAnMDQ5NzQyYjkwODU3OWZmZDIyNWQ1ZTFkOTQ4NjQ3MWYxOWExMDFkZDA0YjdhODFkMTFkYTg4MmU3YWM3ZjNlMDQyOTg5YzMxMTUyNGEzMzM1ZTE1ZGVjOTMzOGEwN2JkMjFiNmU0NDQ0YjZiNzc0NGQzMTRjYzkyNmExZjAzODNkYicsXG4gICAgICAgICcwNDY0MDk3Y2NiYzIyOTA1ZWM2ZjY3OGM4NDYzNDYyOTQwMzNlMTFhMjE2ZDEzM2FiZjZhZjI1MjI5NDY5NWIzNTM4ZDY1ZjY1YjE4OGI2ZTcyZTE4OTBlNzczOGY5ZTIyMTk0NGU2MThkZWExMTc4ZWY3NDk3MTdiMzU0OTJkZTZhJyxcbiAgICAgICAgJzA0MmM2MDg0MDgzNTJhYjQxNDc3YWQ5ZGQxY2FiY2E5ZTcxMmRlMmRmZjNjNWM4YmZhNGI1ZjdmMWEwZjc0YTMyNDAyYTgyNmQyY2U1ZjNhNmIwMWMxNmFlZWJkZDMwNGUyMzU3OTE5NThiYmY5N2EwOGI1ZDRlOWRkNGRiMzk5YjcnLFxuICAgICAgXTtcblxuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdTTTJURjhDMDAzSkU1WUE4QjQzQzJaQVkwSzk1UUZWSk5WODZGQ0NRNCcpO1xuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLlRlc3RuZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTjJURjhDMDAzSkU1WUE4QjQzQzJaQVkwSzk1UUZWSk5WOTBQN1lHUydcbiAgICAgICk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NNMlRGOEMwMDNKRTVZQThCNDNDMlpBWTBLOTVRRlZKTlY4NkZDQ1E0J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5cyA9IFtcbiAgICAgICAgJzA0ZDZmMGY3ZDk3YTcyOTc5NTk2YTE3ZmEyOTQ2ZWFlZmYzNzAzMjUwYTYyNjQwMjcxZWVhNTk0NzdmNWIxOWYzOWFkMDFjZTJhNTMwMjVlYmEzNjVhNGY0MGRkMDg1MjM0MTk0ZDFkMDZhZWZlYzJhOWQ0NDM5YmUwZjNjMmRmMzQnLFxuICAgICAgICAnMDJmNmQwNTk3ZmI2ZDU0NjcyMDNkMDgwZTE3ZjdiNGY3NjdlYWQ1OWZjMzAzYjdkNzI2MWE4MzJjYjQ0MzA1YmIwJyxcbiAgICAgICAgJzAzNGM4MGY5OTE0MTAwODI4MjRhZWU0Y2E0ODE0NzA4Mjk5N2Q0NGU4MDBkYTk4NzdlNjk0ZjljYjY0YjNjYjY0YScsXG4gICAgICBdO1xuXG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cykuYWRkcmVzcy5zaG91bGQuZXF1YWwoJ1NNRThQS1JIU0NCNjk5RkVLNTlGN1Q3Q0JCMjI1S0gxTUNLTTY3RVYnKTtcbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzLCBBZGRyZXNzVmVyc2lvbi5UZXN0bmV0TXVsdGlTaWcpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnU05FOFBLUkhTQ0I2OTlGRUs1OUY3VDdDQkIyMjVLSDFNRFBCVktGOSdcbiAgICAgICk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NNRThQS1JIU0NCNjk5RkVLNTlGN1Q3Q0JCMjI1S0gxTUNLTTY3RVYnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gaW52YWxpZCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKFtdKSwgL0ludmFsaWQgbnVtYmVyIG9mIHB1YmxpYyBrZXlzLyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhbJ2JhZGtleScsICdiYWRrZXkyJ10pLCAvSW52YWxpZCBwdWJsaWMga2V5Lyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhbXG4gICAgICAgICAgICAnMDJmNmQwNTk3ZmI2ZDU0NjcyMDNkMDgwZTE3ZjdiNGY3NjdlYWQ1OWZjMzAzYjdkNzI2MWE4MzJjYjQ0MzA1YmIwJyxcbiAgICAgICAgICAgICdiYWRrZXknLFxuICAgICAgICAgIF0pLFxuICAgICAgICAvSW52YWxpZCBwdWJsaWMga2V5L1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Ftb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMuaXNWYWxpZEFtb3VudCgnMTAnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ludmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMuaXNWYWxpZEFtb3VudCgnLTEwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcml2YXRlIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByb3BlciBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5cyA9IFt0ZXN0RGF0YS5zZWNyZXRLZXkxLCB0ZXN0RGF0YS5zZWNyZXRLZXkyLCB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJ2XTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkUHJpdmF0ZUtleShrZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSBpbnZhbGlkIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlzID0gW1xuICAgICAgICAnNjZjODg2NDgxMTZiNzIxYmIyZjM5NGUwMDA3ZjlkMzQ4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNDA5JyxcbiAgICAgICAgJzY4ODY0ODExNmI3MjFiYjJmMzk0ZTAwMDdmOWQzNDhlYTA4MDE3YjZlNjA0ZGU1MWEzYTdkOTU3ZDU4NTI0JyxcbiAgICAgICAgJzB4NjZjODg2NDgxMTZiNzIxYmIyZjM5NGUwMDA3ZjlkMzQ4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICAgICcnLFxuICAgICAgICAnYml0Z28tc3RhY2tzJyxcbiAgICAgICAgJzY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDM0IDhlYTA4MDE3YjZlNjA0ZGU1MWEzYTdkOTU3ZDU4NTI0JyxcbiAgICAgICAgJzY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDNycnh4OTA4MDE3YjZlNjA0ZGU1MWEzYTdkOTU3ZDU4NTI0JyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoa2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3B1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbdGVzdERhdGEucHViS2V5MSwgdGVzdERhdGEucHViS2V5MiwgdGVzdERhdGEucHViS2V5MkNvbXByZXNzZWRdO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoa2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgaW52YWxpZCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgJzA0MjFkNmY0MmM5N2QyM2VjMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGU4NmUzY2VhNmY0MWE5NGE5YTdjMjRhMWNjZDgzNzkyMTczZjQ3NWZkYjU5MGNjODJmOTRmZjYxNWRmMzkxNDI3NjZlNzU5Y2U2Mzg3JyxcbiAgICAgICAgJzAzMjFkNmY0MmM5OWY3ZDIzZWMgMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGU2ZTNjZWE2ZjQxYScsXG4gICAgICAgICcwYWE2OGMyZDZmZGIzNzA2YjM5ZjMyZDZmNDIyNTI3NWNlMDYyNTYxOTA4ZmQ3Y2E1NDBhNDRjOTJlYjg1OTRlYTZkYjlmY2ZlMGIzOTBjMGVhZDNmNDVjMzZhZmQ2ODJlYWI2MmViMTI0YTYzYjQ2MDk0NWZlMWY3YzdmOGEwOWUyJyxcbiAgICAgICAgJycsXG4gICAgICAgICdiaXRnby1zdGFja3MnLFxuICAgICAgICAnMDkyMWQ2ZjQyYzk5ZjdkMjNlYzJjMGRjMjEyMDhhOWM1ZWRmY2U0ZTViYzdiNjM5NzJlNjhlODZlM2NlYTZmNDFhJyxcbiAgICAgICAgJzAzMjFkNmY0MmM5OWY3ZDIzZWMyYzBkYzIxMjA4YTljNWVkZmNlNGU1YmM3YjYzOTcyZTY4ZXp6ZTNjZWE2ZjQxYScsXG4gICAgICAgICcweDAzMjFkNmY0MmM5OWY3ZDIzZWMyYzBkYzIxMjA4YTljNWVkZmNlNGU1YmM3YjYzOTcyZTY4ZTg2ZTNjZWE2ZjQxYScsXG4gICAgICAgIHRlc3REYXRhLmludmFsaWRQdWJLZXkxLFxuICAgICAgICB0ZXN0RGF0YS5pbnZhbGlkUHViS2V5MixcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFB1YmxpY0tleShrZXkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIgaWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhJZHMgPSBbXG4gICAgICAgICcweDIwOWEzZTE5NjE5NTA2M2IyZTUxOTUyMzIwODdhNzFmZTIzMjlhNmRjOGQyZmNhNTMxZDQ4YzVhNzgyNGY2NzknLFxuICAgICAgICAnNmE1OTAzNzhjMDU5Zjc4ZmI2OThlYzBhZjFmZjYxMDU4NmNiMWE1MmVlNzlmZGFlNjllNTY0MzBmZGUwOGNmNCcsXG4gICAgICAgICcwZTAxNDliYzJjODE5ZjNhZTQwY2VmOTVjYTU4OTU1YzgwYmJjOWUxNWY4YzdjNjUxYzdiODZjMjIxNGI3ZjAyJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgdHhJZCBvZiB0eElkcykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgaW52YWxpZCBpZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eElkcyA9IFtcbiAgICAgICAgJycsXG4gICAgICAgICdiaXRnby1zdGFja3MnLFxuICAgICAgICAnMHgyMDlhM2UxOTYxOTUwNjNiMmU1MTk1MjMyMDg3YTcxZmUyMzI5YTZkYzhkMmZjYTUzMWQ0OGM1YTc4MjRmNjcnLFxuICAgICAgICAnNmE1OTAzNzhjMDU5Zjc4ZmI2OThlYzBhZjFmZjYxMDU4NmNiNTJlZTc5ZmRhZTY5ZTU2NDMwZmRlMDhjZjQnLFxuICAgICAgICAnMXgyMDlhM2UxOTYxOTUwNjNiMmU1MTk1MjMyMDg3YTcxZmUyMzI5YTZkYzhkMmZjYTUzMWQ0OGM1YTc4MjRmNjc5JyxcbiAgICAgICAgJzZhNTkwMzc4YzA1OWY3OGZiNjk4ZWMwYWYxZmY2MTA1ODZjYjFhenoyZWU3OWZkYWU2OWU1NjQzMGZkZTA4Y2Y0JyxcbiAgICAgICAgJzBlMDE0OWJjMmM4MTlmM2FlNDBjZWY5NWNhNTg5NTVjODBiYmM5ZTEgICA1ZjhjN2M2NTFjN2I4NmMyMjE0YjdmMDInLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCB0eElkIG9mIHR4SWRzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gbWVtbycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnY2hlY2sgZm9yIHZhbGlkIG1lbW8gc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lbW9TdHJpbmdzID0gWycnLCAnVGhpcyBpcyBhIHRlc3QuJywgJ09rYXknLCAnISFUaGlzIGlzIHRoaXJ0eSBmb3VyIGJ5dGVzIGxvbmchISddO1xuICAgICAgZm9yIChjb25zdCBtZW1vIG9mIG1lbW9TdHJpbmdzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRNZW1vKG1lbW8pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaXQoJ2NoZWNrIGZvciB2YWxpZCBtZW1vIHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZW1vU3RyaW5ncyA9IFsn6pyf6pyfVGhpcyBpcyB0aGlydHkgZm91ciBjaGFycyBsb25nISEnLCAnSXQgd2FzIHRoZSBiZXN0IG9mIHRpbWVzLCBpdCB3YXMgdGhlIHdvcnN0IG9mIHRpbWVzJ107XG4gICAgICBmb3IgKGNvbnN0IG1lbW8gb2YgbWVtb1N0cmluZ3MpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZE1lbW8obWVtbykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIGFuZCB2ZXJpZnknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5UGFpcjEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuc2VjcmV0S2V5MSB9KTtcbiAgICBjb25zdCBrZXlQYWlyMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5zZWNyZXRLZXkyIH0pO1xuXG4gICAgaXQoJ3NpZ24gYSBtZXNzYWdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLnNpZ25NZXNzYWdlKGtleVBhaXIxLCB0ZXN0RGF0YS5tZXNzYWdlMSksIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuc2lnbk1lc3NhZ2Uoa2V5UGFpcjIsIHRlc3REYXRhLm1lc3NhZ2UyKSwgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUyKTtcbiAgICB9KTtcblxuICAgIGl0KCd2ZXJpZnkgYSBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBVdGlscy52ZXJpZnlTaWduYXR1cmUodGVzdERhdGEubWVzc2FnZTEsIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSwga2V5UGFpcjEuZ2V0S2V5cygpLnB1Yikuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgLy8gaGFuZGxlIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5cyBwcm9wZXJseVxuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5tZXNzYWdlMixcbiAgICAgICAgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUyLFxuICAgICAgICBrZXlQYWlyMi5nZXRLZXlzKGZhbHNlKS5wdWJcbiAgICAgICkuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5tZXNzYWdlMixcbiAgICAgICAgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUyLFxuICAgICAgICBrZXlQYWlyMi5nZXRLZXlzKHRydWUpLnB1YlxuICAgICAgKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmVyaWZ5IHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlbXB0eSBtZXNzYWdlXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoJycsIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSwga2V5UGFpcjEuZ2V0S2V5cygpLnB1YiksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0Nhbm5vdCB2ZXJpZnkgZW1wdHkgbWVzc2FnZXMnKVxuICAgICAgKTtcblxuICAgICAgLy8gd3JvbmcgcHVibGljIGtleVxuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKHRlc3REYXRhLm1lc3NhZ2UxLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEsIGtleVBhaXIyLmdldEtleXMoKS5wdWIpLnNob3VsZC5iZS5mYWxzZSgpO1xuXG4gICAgICAvLyB3cm9uZyBzaWduYXR1cmVcbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0ZXN0RGF0YS5tZXNzYWdlMiwgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUxLCBrZXlQYWlyMi5nZXRLZXlzKCkucHViKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmluZ2lmeUN2JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdJbnQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBJbnRDViA9IHsgdHlwZTogQ2xhcml0eVR5cGUuSW50LCB2YWx1ZTogQmlnSW50KCcxMDAwMDAnKSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoeyB0eXBlOiAwLCB2YWx1ZTogJzEwMDAwMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnVUludCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IFVJbnRDViA9IHsgdHlwZTogQ2xhcml0eVR5cGUuVUludCwgdmFsdWU6IEJpZ0ludCgnMTAwMDAwJykgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKHsgdHlwZTogMSwgdmFsdWU6ICcxMDAwMDAnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ09wdGlvbmFsTm9uZSB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IE5vbmVDViA9IHsgdHlwZTogQ2xhcml0eVR5cGUuT3B0aW9uYWxOb25lIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBpdCgnT3B0aW9uYWxTb21lIHR5cGUgd2l0aCB1aW50IHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IFNvbWVDViA9IHtcbiAgICAgICAgdHlwZTogQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lLFxuICAgICAgICB2YWx1ZTogeyB0eXBlOiBDbGFyaXR5VHlwZS5VSW50LCB2YWx1ZTogQmlnSW50KCcxMDAwMDAnKSB9LFxuICAgICAgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKHsgdHlwZTogMTAsIHZhbHVlOiB7IHR5cGU6IDEsIHZhbHVlOiAnMTAwMDAwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ09wdGlvbmFsU29tZSB0eXBlIHdpdGggdHVwbGUgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogU29tZUNWID0ge1xuICAgICAgICB0eXBlOiBDbGFyaXR5VHlwZS5PcHRpb25hbFNvbWUsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgdHlwZTogQ2xhcml0eVR5cGUuVHVwbGUsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaGFzaGJ5dGVzOiB7IHR5cGU6IENsYXJpdHlUeXBlLkJ1ZmZlciwgYnVmZmVyOiBCdWZmZXIuZnJvbSgnc29tZS1oYXNoJykgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHsgdHlwZTogQ2xhcml0eVR5cGUuQnVmZmVyLCBidWZmZXI6IG5ldyBCaWdOdW0oMSkudG9CdWZmZXIoKSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0xpc3QgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBMaXN0Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLkxpc3QsIGxpc3Q6IFt7IHR5cGU6IENsYXJpdHlUeXBlLlVJbnQsIHZhbHVlOiBCaWdJbnQoJzEwMDAwMCcpIH1dIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDExLCBsaXN0OiBbeyB0eXBlOiAxLCB2YWx1ZTogJzEwMDAwMCcgfV0gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnTGlzdCB0eXBlIHdpdGggZW1wdHkgbGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBMaXN0Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLkxpc3QsIGxpc3Q6IFtdIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDExLCBsaXN0OiBbXSB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEFkZHJlc3NWZXJzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBmb3IgdmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTWFpbm5ldCBzaW5nbGUgc2lnXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU1AxRE4yTkdSQjJSM1c3NVNUMEdBQTdEQlYxVkVCQldZWjFEMzNERVEnKS5zaG91bGQuZXF1YWwoMjIpO1xuICAgICAgLy8gTWFpbm5ldCBtdWx0aSBzaWdcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTTTQ2OFZFVEtBNURCMTVIV0cyUU03WTA0RUZRS1Y0NFI5RDZEMFFDJykuc2hvdWxkLmVxdWFsKDIwKTtcbiAgICAgIC8vIFRlc3RuZXQgc2luZ2xlIHNpZ1xuICAgICAgVXRpbHMuZ2V0QWRkcmVzc1ZlcnNpb24oJ1NUMVNSQ0E5M0NFMVdEOFRFRzI4QlNXQkZSNjhKMjRaVEFCMkZBSjAnKS5zaG91bGQuZXF1YWwoMjYpO1xuICAgICAgLy8gVGVzdG5ldCBtdWx0aSBzaWdcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCcpLnNob3VsZC5lcXVhbCgyMSk7XG4gICAgICAvLyBXaXRoIE1lbW8gSWRcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTUDFETjJOR1JCMlIzVzc1U1QwR0FBN0RCVjFWRUJCV1laMUQzM0RFUT9tZW1vSWQ9MCcpLnNob3VsZC5lcXVhbCgyMik7XG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFg/bWVtb0lkPTI1NScpLnNob3VsZC5lcXVhbCgyMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd4cHViVG9TVFhQdWJrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNvbnZlcnQgZm9yIHZhbGlkIHhwdWJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMueHB1YlRvU1RYUHVia2V5KFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0dTMkhNZHZBTk43bzhFU1dxd3ZyNVU0cnk1ZlpkRDlWSGh5bVd5Zm9EUUY0dnpmS290WGdHdEpUcndyRlJ6N1hiR0ZvdjRGcWRLS282bVJZTld2TXA3UDIzRGp1Sm5TJ1xuICAgICAgKS5zaG91bGQuZXF1YWwoJzAzZjBmMzU4MWE0MjU2Nzk3ZmE4NDc4Y2I2YjFkYTY1ODhmNGM0YmVkYzgwYWIyNjAxZTNhMTU3MmNmNTdiNjE1NicpO1xuICAgICAgVXRpbHMueHB1YlRvU1RYUHVia2V5KFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZFenI1Q2NwRnpQRzQ1cm1QZjc1RFR2RG9iTjVnSmltQ2F0Ykh0elI1M1NiSHpEWjFKNTZieUtTc2RjOHZTdWpHdVFweVBqYjdMc3VhMk5mQURKZXdQeE56TDNONlRqJ1xuICAgICAgKS5zaG91bGQuZXF1YWwoJzAyNjJiN2U4NmMxZTM2ZTQ1ZDQ1MTI2M2I1NGExYzNkNzQwYWJlYWI2MWQyMjFkMTE3NWZjM2ZkYWQ3NTI4NTNhYicpO1xuICAgICAgVXRpbHMueHB1YlRvU1RYUHVia2V5KFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0dQMWFkazM0VnpSUUpFTVgyNXJDeGpFeVU5WUZGV05oV056d1BvcWdqTG9LZm5xb3RMd3J6N2tCZXZXYlJabnFUU1FyUUR1SnVZVVFhRFE1RERQRXpFWE13UFM5UEVmJ1xuICAgICAgKS5zaG91bGQuZXF1YWwoJzAzNjUyOWEwZTQxY2ZkMWE5ZDI2NWI3NGY4ZDAwMDJjOTJjNWFlYzEwZDQyMzkwMDAyNjBhMjVjZmQ1NGU0NzI2YycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QmFzZUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NXaXRoTWVtbyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWD9tZW1vSWQ9MjU1JztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYJztcbiAgICAgIFV0aWxzLmdldEJhc2VBZGRyZXNzKGFkZHJlc3NXaXRoTWVtbykuc2hvdWxkLmVxdWFsKGJhc2VBZGRyZXNzKTtcbiAgICAgIFV0aWxzLmdldEJhc2VBZGRyZXNzKGJhc2VBZGRyZXNzKS5zaG91bGQuZXF1YWwoYmFzZUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTYW1lQmFzZUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBpZiBiYXNlIGFkZHJlc3MgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYP21lbW9JZD0yNTUnO1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3MgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnO1xuICAgICAgVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzcywgYmFzZUFkZHJlc3MpLnNob3VsZC50cnVlKCk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3MyID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYJztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzMiA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzMiwgYmFzZUFkZHJlc3MyKS5zaG91bGQudHJ1ZSgpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzMyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWD9tZW1vSWQ9MjU1JztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzMyA9ICdTVDFTUkNBOTNDRTFXRDhURUcyOEJTV0JGUjY4SjI0WlRBQjJGQUowJztcbiAgICAgIFV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3MzLCBiYXNlQWRkcmVzczMpLnNob3VsZC5mYWxzZSgpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzNCA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzczQgPSAnU1QxU1JDQTkzQ0UxV0Q4VEVHMjhCU1dCRlI2OEoyNFpUQUIyRkFKMCc7XG4gICAgICBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzNCwgYmFzZUFkZHJlc3M0KS5zaG91bGQuZmFsc2UoKTtcblxuICAgICAgY29uc3QgYWRkcmVzczUgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFOREYnO1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3M1ID0gJ1NUMVNSQ0E5M0NFMVdEOFRFRzI4QlNXQkZSNjhKMjRaVEFCMkZBSjAnO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzczUsIGJhc2VBZGRyZXNzNSkuc2hvdWxkLmZhbHNlKCksXG4gICAgICAgIG5ldyBSZWdFeHAoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzNX1gKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==