@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.43 → 0.0.1-beta.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 (47) hide show
  1. package/README.md +224 -33
  2. package/dist/src/kaspa.d.ts +86 -18
  3. package/dist/src/kaspa.d.ts.map +1 -1
  4. package/dist/src/kaspa.js +119 -31
  5. package/dist/src/lib/constants.d.ts +38 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +56 -5
  8. package/dist/src/lib/iface.d.ts +28 -17
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +2 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/keyPair.d.ts +6 -2
  15. package/dist/src/lib/keyPair.d.ts.map +1 -1
  16. package/dist/src/lib/keyPair.js +7 -4
  17. package/dist/src/lib/pskt.d.ts +257 -0
  18. package/dist/src/lib/pskt.d.ts.map +1 -0
  19. package/dist/src/lib/pskt.js +439 -0
  20. package/dist/src/lib/sighash.d.ts +34 -13
  21. package/dist/src/lib/sighash.d.ts.map +1 -1
  22. package/dist/src/lib/sighash.js +115 -56
  23. package/dist/src/lib/transaction.d.ts +81 -21
  24. package/dist/src/lib/transaction.d.ts.map +1 -1
  25. package/dist/src/lib/transaction.js +167 -44
  26. package/dist/src/lib/transactionBuilder.d.ts +23 -17
  27. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/transactionBuilder.js +53 -22
  29. package/dist/src/lib/utils.d.ts +17 -3
  30. package/dist/src/lib/utils.d.ts.map +1 -1
  31. package/dist/src/lib/utils.js +45 -11
  32. package/dist/src/register.js +2 -2
  33. package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
  34. package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
  35. package/dist/test/fixtures/kaspa.fixtures.js +76 -11
  36. package/dist/test/unit/coin.test.js +129 -9
  37. package/dist/test/unit/keyPair.test.js +35 -1
  38. package/dist/test/unit/pskt.test.d.ts +15 -0
  39. package/dist/test/unit/pskt.test.d.ts.map +1 -0
  40. package/dist/test/unit/pskt.test.js +383 -0
  41. package/dist/test/unit/transaction.test.js +259 -64
  42. package/dist/test/unit/transactionBuilder.test.js +3 -31
  43. package/dist/test/unit/transactionFlow.test.js +67 -2
  44. package/dist/test/unit/utils.test.js +63 -4
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +7 -6
  47. package/LICENSE +0 -191
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const assert_1 = __importDefault(require("assert"));
7
7
  const transaction_1 = require("../../src/lib/transaction");
8
8
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
- const sighash_1 = require("../../src/lib/sighash");
9
+ const constants_1 = require("../../src/lib/constants");
10
10
  const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
11
11
  const COIN = 'kaspa';
12
12
  describe('Kaspa Transaction', function () {
@@ -86,12 +86,12 @@ describe('Kaspa Transaction', function () {
86
86
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
87
87
  const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
88
88
  tx.sign(privKey);
89
- const sigHex = tx.txData.inputs[0].signatureScript;
90
- // 65 bytes = 130 hex chars
91
- assert_1.default.equal(sigHex.length, 130);
89
+ const sigHex = tx.txData.inputs[0].signatureScript ?? '';
90
+ // 66 bytes = 132 hex chars: 0x41 push opcode (1) + 64-byte sig + 1-byte sighash type
91
+ assert_1.default.equal(sigHex.length, 132);
92
92
  // Last byte is sighash type (0x01 = SIGHASH_ALL)
93
93
  const lastByte = parseInt(sigHex.slice(-2), 16);
94
- assert_1.default.equal(lastByte, sighash_1.SIGHASH_ALL);
94
+ assert_1.default.equal(lastByte, constants_1.SIGHASH_ALL);
95
95
  });
96
96
  });
97
97
  describe('verifySignature', function () {
@@ -129,6 +129,109 @@ describe('Kaspa Transaction', function () {
129
129
  assert_1.default.equal(tx.verifySignature(pubKey, 99), false);
130
130
  });
131
131
  });
132
+ // ── ECDSA (v1 address) signing ────────────────────────────────────────────
133
+ //
134
+ // These tests cover the auto-detection path in sign() / verifySignature() /
135
+ // signablePayloads when the input's scriptPublicKey ends with 0xAB (ECDSA).
136
+ describe('sign (ECDSA inputs)', function () {
137
+ it('should sign a single ECDSA input', function () {
138
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
139
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
140
+ tx.sign(privKey);
141
+ const sigScript = tx.txData.inputs[0].signatureScript ?? '';
142
+ assert_1.default.ok(sigScript.length > 0, 'ECDSA input should have a signatureScript');
143
+ // 66 bytes = 132 hex chars: 0x41 + 64-byte sig + 1-byte sighash type
144
+ assert_1.default.equal(sigScript.length, 132);
145
+ assert_1.default.equal(parseInt(sigScript.slice(-2), 16), constants_1.SIGHASH_ALL);
146
+ });
147
+ it('should sign multiple ECDSA inputs', function () {
148
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInputEcdsa);
149
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
150
+ tx.sign(privKey);
151
+ assert_1.default.equal(tx.txData.inputs.length, 2);
152
+ for (const input of tx.txData.inputs) {
153
+ assert_1.default.ok(input.signatureScript && input.signatureScript.length > 0);
154
+ }
155
+ });
156
+ it('should produce distinct sighashes for ECDSA vs Schnorr inputs on the same key', function () {
157
+ const schnorrTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
158
+ const ecdsaTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
159
+ const [schnorrHash] = schnorrTx.signablePayloads;
160
+ const [ecdsaHash] = ecdsaTx.signablePayloads;
161
+ assert_1.default.ok(!schnorrHash.equals(ecdsaHash), 'ECDSA and Schnorr hashes must differ');
162
+ });
163
+ });
164
+ describe('verifySignature (ECDSA inputs)', function () {
165
+ it('should verify a valid ECDSA signature with compressed pubkey', function () {
166
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
167
+ tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
168
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
169
+ assert_1.default.ok(tx.verifySignature(pubKey, 0), 'ECDSA signature should verify');
170
+ });
171
+ it('should return false for wrong public key on ECDSA input', function () {
172
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
173
+ tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
174
+ const wrongPub = Buffer.from('02' + 'ab'.repeat(32), 'hex');
175
+ assert_1.default.equal(tx.verifySignature(wrongPub, 0), false);
176
+ });
177
+ it('should verify all inputs in a multi-input ECDSA transaction', function () {
178
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInputEcdsa);
179
+ tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
180
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
181
+ assert_1.default.ok(tx.verifySignature(pubKey, 0));
182
+ assert_1.default.ok(tx.verifySignature(pubKey, 1));
183
+ });
184
+ });
185
+ describe('sign + verifySignature (mixed Schnorr + ECDSA inputs)', function () {
186
+ it('should sign and verify each input with the correct algorithm', function () {
187
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.mixedSchnorrEcdsa);
188
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
189
+ tx.sign(privKey);
190
+ assert_1.default.equal(tx.txData.inputs.length, 2, 'should have 2 inputs');
191
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
192
+ // input[0] is Schnorr (scriptPublicKey ends 0xAC)
193
+ assert_1.default.ok(tx.verifySignature(pubKey, 0), 'Schnorr input[0] should verify');
194
+ // input[1] is ECDSA (scriptPublicKey ends 0xAB)
195
+ assert_1.default.ok(tx.verifySignature(pubKey, 1), 'ECDSA input[1] should verify');
196
+ });
197
+ it('should produce different script types for Schnorr and ECDSA inputs', function () {
198
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.mixedSchnorrEcdsa);
199
+ tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
200
+ // Both produce 66-byte (132 hex char) scriptSigs but via different algorithms —
201
+ // the last opcode of their scriptPublicKey is the differentiator.
202
+ assert_1.default.equal((tx.txData.inputs[0].signatureScript ?? '').length, 132);
203
+ assert_1.default.equal((tx.txData.inputs[1].signatureScript ?? '').length, 132);
204
+ // The signatures themselves should differ (different sighash algorithm)
205
+ assert_1.default.notEqual(tx.txData.inputs[0].signatureScript, tx.txData.inputs[1].signatureScript);
206
+ });
207
+ });
208
+ describe('signablePayloads (ECDSA inputs)', function () {
209
+ it('should return a 32-byte hash for a single ECDSA input', function () {
210
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
211
+ const [hash] = tx.signablePayloads;
212
+ assert_1.default.ok(Buffer.isBuffer(hash));
213
+ assert_1.default.equal(hash.length, 32);
214
+ });
215
+ it('should return distinct hashes for each ECDSA input', function () {
216
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInputEcdsa);
217
+ const [h0, h1] = tx.signablePayloads;
218
+ assert_1.default.ok(!h0.equals(h1));
219
+ });
220
+ it('should return different hashes for Schnorr and ECDSA inputs on the same index', function () {
221
+ const schnorrTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
222
+ const ecdsaTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
223
+ // Both transactions have the same structure except scriptPublicKey type.
224
+ // The ECDSA hash applies an additional SHA256 step so the result must differ.
225
+ assert_1.default.ok(!schnorrTx.signablePayloads[0].equals(ecdsaTx.signablePayloads[0]));
226
+ });
227
+ it('mixed tx: Schnorr hash at index 0, ECDSA hash at index 1 — both 32 bytes', function () {
228
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.mixedSchnorrEcdsa);
229
+ const [h0, h1] = tx.signablePayloads;
230
+ assert_1.default.equal(h0.length, 32);
231
+ assert_1.default.equal(h1.length, 32);
232
+ assert_1.default.ok(!h0.equals(h1));
233
+ });
234
+ });
132
235
  describe('explainTransaction', function () {
133
236
  it('should return a TransactionExplanation with correct fields', function () {
134
237
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
@@ -152,89 +255,117 @@ describe('Kaspa Transaction', function () {
152
255
  assert_1.default.equal(explanation.outputAmount, '299998000');
153
256
  });
154
257
  });
155
- describe('getFee', function () {
258
+ describe('fee', function () {
156
259
  it('should return explicit fee when set in txData', function () {
157
260
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
158
- assert_1.default.equal(tx.getFee, '2000');
261
+ assert_1.default.equal(tx.fee, '2000');
159
262
  });
160
263
  it('should compute fee from inputs - outputs when fee is not set', function () {
161
264
  const txData = { ...kaspa_fixtures_1.TRANSACTIONS.simple };
162
265
  delete txData.fee;
163
266
  const tx = new transaction_1.Transaction(COIN, txData);
164
267
  // input: 100000000, output: 99998000, fee = 2000
165
- assert_1.default.equal(tx.getFee, '2000');
268
+ assert_1.default.equal(tx.fee, '2000');
166
269
  });
167
270
  });
168
- describe('signablePayload', function () {
169
- it('should return a 32-byte Buffer (Blake2b hash)', function () {
271
+ describe('signablePayloads', function () {
272
+ it('should return one Buffer per input', function () {
170
273
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
171
- const payload = tx.signablePayload;
172
- assert_1.default.ok(Buffer.isBuffer(payload));
173
- assert_1.default.equal(payload.length, 32);
274
+ const payloads = tx.signablePayloads;
275
+ assert_1.default.equal(payloads.length, 1);
276
+ assert_1.default.ok(Buffer.isBuffer(payloads[0]));
277
+ assert_1.default.equal(payloads[0].length, 32);
278
+ });
279
+ it('should return two Buffers for a two-input transaction', function () {
280
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
281
+ const payloads = tx.signablePayloads;
282
+ assert_1.default.equal(payloads.length, 2);
283
+ for (const p of payloads) {
284
+ assert_1.default.ok(Buffer.isBuffer(p));
285
+ assert_1.default.equal(p.length, 32);
286
+ }
287
+ });
288
+ it('should return distinct hashes for each input in a multi-input tx', function () {
289
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
290
+ const [p0, p1] = tx.signablePayloads;
291
+ assert_1.default.ok(!p0.equals(p1), 'per-input sighashes must differ (each commits to its own index)');
174
292
  });
175
293
  it('should throw when transaction has no inputs', function () {
176
294
  const tx = new transaction_1.Transaction(COIN);
177
295
  assert_1.default.throws(() => {
178
- tx.signablePayload;
296
+ tx.signablePayloads;
179
297
  }, /no inputs/);
180
298
  });
181
- it('should return deterministic hash for same transaction data', function () {
182
- const tx1 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
183
- const tx2 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
184
- assert_1.default.ok(tx1.signablePayload.equals(tx2.signablePayload));
185
- });
186
- it('should return different hashes for different transactions', function () {
187
- const tx1 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
299
+ it('should be deterministic for the same transaction data', function () {
300
+ const tx1 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
188
301
  const tx2 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
189
- assert_1.default.ok(!tx1.signablePayload.equals(tx2.signablePayload));
302
+ const [a0, a1] = tx1.signablePayloads;
303
+ const [b0, b1] = tx2.signablePayloads;
304
+ assert_1.default.ok(a0.equals(b0));
305
+ assert_1.default.ok(a1.equals(b1));
190
306
  });
191
307
  });
192
- describe('addSignature', function () {
193
- it('should apply a 64-byte Schnorr signature to all inputs', function () {
308
+ describe('addSignatureForInput', function () {
309
+ it('should write the signature only to the specified input', function () {
310
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
311
+ const fakeSig = Buffer.alloc(64, 0xaa);
312
+ tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, fakeSig);
313
+ assert_1.default.ok(tx.txData.inputs[0].signatureScript, 'input[0] should be signed');
314
+ assert_1.default.equal(tx.txData.inputs[1].signatureScript, undefined, 'input[1] should remain unsigned');
315
+ });
316
+ it('should write different signatures to different inputs independently', function () {
317
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
318
+ const sig0 = Buffer.alloc(64, 0xaa);
319
+ const sig1 = Buffer.alloc(64, 0xbb);
320
+ tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, sig0);
321
+ tx.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, sig1);
322
+ assert_1.default.notEqual(tx.txData.inputs[0].signatureScript, tx.txData.inputs[1].signatureScript, 'each input should carry its own signature script');
323
+ });
324
+ it('should produce a 66-byte script (push opcode + 64 sig + 1 sighash type) for the target input', function () {
325
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
326
+ tx.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64, 0xcc));
327
+ // 66 bytes = 132 hex chars: 0x41 push opcode + 64-byte sig + 1-byte sighash type
328
+ assert_1.default.equal((tx.txData.inputs[1].signatureScript ?? '').length, 132);
329
+ });
330
+ it('should append SIGHASH_ALL byte by default', function () {
194
331
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
195
- const fakeSig = Buffer.alloc(64, 0xab);
196
- tx.addSignature(kaspa_fixtures_1.KEYS.pub, fakeSig);
197
- assert_1.default.equal(tx.txData.inputs.length, 1);
198
- assert_1.default.ok(tx.txData.inputs[0].signatureScript);
199
- // 65 bytes = 130 hex chars (64 sig + 1 sighash type)
200
- assert_1.default.equal(tx.txData.inputs[0].signatureScript.length, 130);
332
+ tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64, 0xdd));
333
+ const lastByte = parseInt((tx.txData.inputs[0].signatureScript ?? '').slice(-2), 16);
334
+ assert_1.default.equal(lastByte, constants_1.SIGHASH_ALL);
201
335
  });
202
- it('should apply signature to all inputs of a multi-input tx', function () {
336
+ it('should produce a verifiable signature when given the correct Schnorr sig for that input', function () {
203
337
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
204
- const fakeSig = Buffer.alloc(64, 0xcd);
205
- tx.addSignature(kaspa_fixtures_1.KEYS.pub, fakeSig);
206
- assert_1.default.equal(tx.txData.inputs.length, 2);
207
- for (const input of tx.txData.inputs) {
208
- assert_1.default.ok(input.signatureScript);
209
- assert_1.default.equal(input.signatureScript.length, 130);
210
- }
338
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
339
+ // sign() computes the correct per-input sighash internally
340
+ tx.sign(privKey);
341
+ // Skip the leading 0x41 push opcode (2 hex chars), read the next 64 bytes (128 hex chars)
342
+ const sig0 = Buffer.from((tx.txData.inputs[0].signatureScript ?? '').slice(2, 130), 'hex');
343
+ const sig1 = Buffer.from((tx.txData.inputs[1].signatureScript ?? '').slice(2, 130), 'hex');
344
+ // Rebuild unsigned and apply via addSignatureForInput
345
+ const tx2 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
346
+ tx2.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, sig0);
347
+ tx2.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, sig1);
348
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
349
+ assert_1.default.ok(tx2.verifySignature(pubKey, 0), 'input[0] signature should verify');
350
+ assert_1.default.ok(tx2.verifySignature(pubKey, 1), 'input[1] signature should verify');
211
351
  });
212
- it('should throw for non-64-byte signature', function () {
352
+ it('should throw for an out-of-range index', function () {
213
353
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
214
354
  assert_1.default.throws(() => {
215
- tx.addSignature(kaspa_fixtures_1.KEYS.pub, Buffer.alloc(32));
216
- }, /64-byte/);
355
+ tx.addSignatureForInput(5, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64));
356
+ }, /out of range/);
217
357
  });
218
- it('should append SIGHASH_ALL byte at the end', function () {
358
+ it('should throw for a negative index', function () {
219
359
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
220
- const fakeSig = Buffer.alloc(64, 0xab);
221
- tx.addSignature(kaspa_fixtures_1.KEYS.pub, fakeSig);
222
- const sigHex = tx.txData.inputs[0].signatureScript;
223
- const lastByte = parseInt(sigHex.slice(-2), 16);
224
- assert_1.default.equal(lastByte, sighash_1.SIGHASH_ALL);
360
+ assert_1.default.throws(() => {
361
+ tx.addSignatureForInput(-1, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64));
362
+ }, /out of range/);
225
363
  });
226
- it('should produce a signature that verifies when signed with the correct private key', function () {
364
+ it('should throw for a non-64-byte signature', function () {
227
365
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
228
- // Sign properly with private key to get a real signature
229
- const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
230
- tx.sign(privKey);
231
- const realSigHex = tx.txData.inputs[0].signatureScript;
232
- const realSig = Buffer.from(realSigHex.slice(0, 128), 'hex'); // 64-byte Schnorr sig
233
- // Now create a fresh tx and use addSignature instead
234
- const tx2 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
235
- tx2.addSignature(kaspa_fixtures_1.KEYS.pub, realSig);
236
- // The signature scripts should match (same sig bytes + same sighash type)
237
- assert_1.default.equal(tx2.txData.inputs[0].signatureScript, tx.txData.inputs[0].signatureScript);
366
+ assert_1.default.throws(() => {
367
+ tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(32));
368
+ }, /64-byte/);
238
369
  });
239
370
  });
240
371
  describe('Serialization', function () {
@@ -244,21 +375,48 @@ describe('Kaspa Transaction', function () {
244
375
  assert_1.default.deepEqual(json, kaspa_fixtures_1.TRANSACTIONS.simple);
245
376
  assert_1.default.notEqual(json, tx.txData);
246
377
  });
247
- it('toBroadcastFormat should return a JSON string', function () {
378
+ it('toBroadcastFormat should return a REST API JSON string', function () {
248
379
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
249
380
  const broadcast = tx.toBroadcastFormat();
250
381
  assert_1.default.equal(typeof broadcast, 'string');
251
382
  const parsed = JSON.parse(broadcast);
252
383
  assert_1.default.equal(parsed.version, 0);
253
384
  assert_1.default.equal(parsed.inputs.length, 1);
385
+ // REST API shape: inputs use previousOutpoint
386
+ assert_1.default.ok(parsed.inputs[0].previousOutpoint, 'inputs should use previousOutpoint');
387
+ assert_1.default.equal(parsed.inputs[0].transactionId, undefined, 'transactionId should not be at root of input');
388
+ // REST API shape: outputs use scriptPublicKey object
389
+ assert_1.default.equal(typeof parsed.outputs[0].scriptPublicKey, 'object');
390
+ assert_1.default.equal(parsed.outputs[0].scriptPublicKey.version, 0);
391
+ });
392
+ it('toBroadcastFormat should include required wire fields', function () {
393
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
394
+ const parsed = JSON.parse(tx.toBroadcastFormat());
395
+ assert_1.default.equal(parsed.lockTime, 0);
396
+ assert_1.default.equal(parsed.subnetworkId, '0000000000000000000000000000000000000000');
397
+ assert_1.default.equal(parsed.gas, 0);
398
+ assert_1.default.equal(parsed.payload, '');
254
399
  });
255
- it('toHex should return hex-encoded JSON', function () {
400
+ it('toBroadcastFormat should include signatureScript after signing', function () {
401
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
402
+ tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
403
+ const parsed = JSON.parse(tx.toBroadcastFormat());
404
+ assert_1.default.ok(parsed.inputs[0].signatureScript.length > 0);
405
+ });
406
+ it('toHex should return hex-encoded internal JSON (for round-trips)', function () {
256
407
  const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
257
408
  const hex = tx.toHex();
258
409
  assert_1.default.ok(/^[0-9a-fA-F]+$/.test(hex));
259
- const decoded = Buffer.from(hex, 'hex').toString();
260
- const parsed = JSON.parse(decoded);
261
- assert_1.default.equal(parsed.version, 0);
410
+ const decoded = JSON.parse(Buffer.from(hex, 'hex').toString());
411
+ // Internal format: transactionId at root of input (not previousOutpoint)
412
+ assert_1.default.equal(decoded.inputs[0].transactionId, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].transactionId);
413
+ assert_1.default.equal(decoded.inputs[0].amount, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].amount);
414
+ });
415
+ it('toHex and toBroadcastFormat produce different formats', function () {
416
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
417
+ const internalHex = tx.toHex();
418
+ const broadcastHex = Buffer.from(tx.toBroadcastFormat()).toString('hex');
419
+ assert_1.default.notEqual(internalHex, broadcastHex);
262
420
  });
263
421
  it('fromHex should reconstruct the transaction', function () {
264
422
  const original = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
@@ -287,5 +445,42 @@ describe('Kaspa Transaction', function () {
287
445
  assert_1.default.deepEqual(restored.signature, tx.signature);
288
446
  });
289
447
  });
448
+ describe('toBroadcastFormat (REST API shape)', function () {
449
+ it('should map inputs to previousOutpoint shape', function () {
450
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
451
+ const api = JSON.parse(tx.toBroadcastFormat());
452
+ assert_1.default.equal(api.inputs.length, 1);
453
+ assert_1.default.ok(api.inputs[0].previousOutpoint, 'input should have previousOutpoint');
454
+ assert_1.default.equal(api.inputs[0].previousOutpoint.transactionId, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].transactionId);
455
+ assert_1.default.equal(api.inputs[0].previousOutpoint.index, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].transactionIndex);
456
+ });
457
+ it('should not include amount or scriptPublicKey on inputs', function () {
458
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
459
+ const api = JSON.parse(tx.toBroadcastFormat());
460
+ assert_1.default.equal(api.inputs[0].amount, undefined);
461
+ assert_1.default.equal(api.inputs[0].scriptPublicKey, undefined);
462
+ });
463
+ it('should map outputs to scriptPublicKey object shape', function () {
464
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
465
+ const api = JSON.parse(tx.toBroadcastFormat());
466
+ assert_1.default.equal(api.outputs.length, 1);
467
+ assert_1.default.equal(typeof api.outputs[0].scriptPublicKey, 'object');
468
+ assert_1.default.equal(api.outputs[0].scriptPublicKey.version, 0);
469
+ assert_1.default.ok(typeof api.outputs[0].scriptPublicKey.scriptPublicKey === 'string');
470
+ assert_1.default.equal(api.outputs[0].amount, Number(kaspa_fixtures_1.TRANSACTIONS.simple.outputs[0].amount));
471
+ });
472
+ it('should include signatureScript as empty string for unsigned inputs', function () {
473
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
474
+ const api = JSON.parse(tx.toBroadcastFormat());
475
+ assert_1.default.equal(api.inputs[0].signatureScript, '');
476
+ });
477
+ it('should handle multi-input transactions', function () {
478
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
479
+ const api = JSON.parse(tx.toBroadcastFormat());
480
+ assert_1.default.equal(api.inputs.length, 2);
481
+ assert_1.default.equal(api.inputs[0].previousOutpoint.transactionId, kaspa_fixtures_1.TRANSACTIONS.multiInput.inputs[0].transactionId);
482
+ assert_1.default.equal(api.inputs[1].previousOutpoint.transactionId, kaspa_fixtures_1.TRANSACTIONS.multiInput.inputs[1].transactionId);
483
+ });
484
+ });
290
485
  });
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJEQUF3RDtBQUN4RCxtREFBdUQ7QUFDdkQsbURBQW9EO0FBQ3BELCtEQUFnRTtBQUVoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7QUFFckIsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0s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TSxRQUFRLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcseUJBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELGdCQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2REFBNkQsRUFBRTtZQUNoRSxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWpCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEsR0FBRyx5QkFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFaEQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFNJR0hBU0hfQUxMIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9zaWdoYXNoJztcbmltcG9ydCB7IEtFWVMsIFRSQU5TQUNUSU9OUyB9IGZyb20gJy4uL2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzJztcblxuY29uc3QgQ09JTiA9ICdrYXNwYSc7XG5cbmRlc2NyaWJlKCdLYXNwYSBUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ0NvbnN0cnVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTik7XG4gICAgICBhc3NlcnQub2sodHgpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0eC50eERhdGEuaW5wdXRzLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnR4RGF0YS5vdXRwdXRzLCBbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIHRyYW5zYWN0aW9uIGZyb20gdHhEYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmZlZSwgJzIwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lkIGdldHRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBzdHJpbmcgd2hlbiBubyBpZCBpcyBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHRyYW5zYWN0aW9uIGlkIGlmIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHsgLi4uVFJBTlNBQ1RJT05TLnNpbXBsZSwgaWQ6ICdkZWFkYmVlZicgKyAnMDAnLnJlcGVhdCgzMCkgfTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIHR4RGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaWQsIHR4RGF0YS5pZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduYXR1cmUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHNpZ25hdHVyZXMgZm9yIHVuc2lnbmVkIHR4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBzaWdzID0gdHguc2lnbmF0dXJlO1xuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ3MubGVuZ3RoLCBUUkFOU0FDVElPTlMuc2ltcGxlLmlucHV0cy5sZW5ndGgpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3MuZXZlcnkoKHMpID0+IHMgPT09ICcnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzaWduYXR1cmUgc2NyaXB0cyBhZnRlciBzaWduaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBzaWdzID0gdHguc2lnbmF0dXJlO1xuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ3MubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5vayhzaWdzWzBdLmxlbmd0aCA+IDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2FuU2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgYXNzZXJ0Lm9rKHR4LmNhblNpZ24oeyBrZXk6IEtFWVMucHJ2IH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBub24tMzItYnl0ZSBwcml2YXRlIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHR4LnNpZ24oQnVmZmVyLmZyb20oJzAxMDInLCAnaGV4JykpO1xuICAgICAgfSwgLzMyLWJ5dGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBhbGwgaW5wdXRzIHdpdGggYSB2YWxpZCBwcml2YXRlIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIHsgLi4uVFJBTlNBQ1RJT05TLnNpbXBsZSB9KTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdHgudHhEYXRhLmlucHV0cykge1xuICAgICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0LCAnRWFjaCBpbnB1dCBzaG91bGQgaGF2ZSBhIHNpZ25hdHVyZVNjcmlwdCcpO1xuICAgICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0IS5sZW5ndGggPiAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBtdWx0aXBsZSBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQgJiYgaW5wdXQuc2lnbmF0dXJlU2NyaXB0Lmxlbmd0aCA+IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIDY1LWJ5dGUgc2lnbmF0dXJlcyAoNjQgU2Nobm9yciArIDEgc2lnaGFzaCB0eXBlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3Qgc2lnSGV4ID0gdHgudHhEYXRhLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQhO1xuICAgICAgLy8gNjUgYnl0ZXMgPSAxMzAgaGV4IGNoYXJzXG4gICAgICBhc3NlcnQuZXF1YWwoc2lnSGV4Lmxlbmd0aCwgMTMwKTtcbiAgICAgIC8vIExhc3QgYnl0ZSBpcyBzaWdoYXNoIHR5cGUgKDB4MDEgPSBTSUdIQVNIX0FMTClcbiAgICAgIGNvbnN0IGxhc3RCeXRlID0gcGFyc2VJbnQoc2lnSGV4LnNsaWNlKC0yKSwgMTYpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxhc3RCeXRlLCBTSUdIQVNIX0FMTCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlTaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIHVuc2lnbmVkIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGFmdGVyIHNpZ25pbmcgd2l0aCBtYXRjaGluZyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgeC1vbmx5ICgzMi1ieXRlKSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCB4T25seVB1YiA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jykuc2xpY2UoMSk7XG4gICAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHhPbmx5UHViLCAwKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igd3JvbmcgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3Qgd3JvbmdQdWIgPSBCdWZmZXIuZnJvbSgnMDInICsgJ2FiJy5yZXBlYXQoMzIpLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHdyb25nUHViLCAwKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIG91dC1vZi1yYW5nZSBpbnB1dCBpbmRleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCA5OSksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4cGxhaW5UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gd2l0aCBjb3JyZWN0IGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLmlkLCAnJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24udHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFtb3VudCwgJzk5OTk4MDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24uaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24uaW5wdXRzWzBdLmFtb3VudCwgJzEwMDAwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdGhlIGZlZSBhcyB0b3RhbEluIC0gdG90YWxPdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICAvLyBmZWUgPSAxMDAwMDAwMDAgLSA5OTk5ODAwMCA9IDIwMDBcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5mZWUuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdW0gYWxsIG91dHB1dHMgaW4gb3V0cHV0QW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXQpO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQsICcyOTk5OTgwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEZlZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBleHBsaWNpdCBmZWUgd2hlbiBzZXQgaW4gdHhEYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguZ2V0RmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb21wdXRlIGZlZSBmcm9tIGlucHV0cyAtIG91dHB1dHMgd2hlbiBmZWUgaXMgbm90IHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHsgLi4uVFJBTlNBQ1RJT05TLnNpbXBsZSB9O1xuICAgICAgZGVsZXRlIHR4RGF0YS5mZWU7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCB0eERhdGEpO1xuICAgICAgLy8gaW5wdXQ6IDEwMDAwMDAwMCwgb3V0cHV0OiA5OTk5ODAwMCwgZmVlID0gMjAwMFxuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmdldEZlZSwgJzIwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hYmxlUGF5bG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIDMyLWJ5dGUgQnVmZmVyIChCbGFrZTJiIGhhc2gpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdHguc2lnbmFibGVQYXlsb2FkO1xuICAgICAgYXNzZXJ0Lm9rKEJ1ZmZlci5pc0J1ZmZlcihwYXlsb2FkKSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGF5bG9hZC5sZW5ndGgsIDMyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguc2lnbmFibGVQYXlsb2FkO1xuICAgICAgfSwgL25vIGlucHV0cy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGV0ZXJtaW5pc3RpYyBoYXNoIGZvciBzYW1lIHRyYW5zYWN0aW9uIGRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eDEgPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCB0eDIgPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQub2sodHgxLnNpZ25hYmxlUGF5bG9hZC5lcXVhbHModHgyLnNpZ25hYmxlUGF5bG9hZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGlmZmVyZW50IGhhc2hlcyBmb3IgZGlmZmVyZW50IHRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4MSA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHR4MiA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBhc3NlcnQub2soIXR4MS5zaWduYWJsZVBheWxvYWQuZXF1YWxzKHR4Mi5zaWduYWJsZVBheWxvYWQpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZFNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFwcGx5IGEgNjQtYnl0ZSBTY2hub3JyIHNpZ25hdHVyZSB0byBhbGwgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBmYWtlU2lnID0gQnVmZmVyLmFsbG9jKDY0LCAweGFiKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZShLRVlTLnB1YiwgZmFrZVNpZyk7XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQub2sodHgudHhEYXRhLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQpO1xuICAgICAgLy8gNjUgYnl0ZXMgPSAxMzAgaGV4IGNoYXJzICg2NCBzaWcgKyAxIHNpZ2hhc2ggdHlwZSlcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCEubGVuZ3RoLCAxMzApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhcHBseSBzaWduYXR1cmUgdG8gYWxsIGlucHV0cyBvZiBhIG11bHRpLWlucHV0IHR4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXQpO1xuICAgICAgY29uc3QgZmFrZVNpZyA9IEJ1ZmZlci5hbGxvYyg2NCwgMHhjZCk7XG4gICAgICB0eC5hZGRTaWduYXR1cmUoS0VZUy5wdWIsIGZha2VTaWcpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoaW5wdXQuc2lnbmF0dXJlU2NyaXB0IS5sZW5ndGgsIDEzMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBub24tNjQtYnl0ZSBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eC5hZGRTaWduYXR1cmUoS0VZUy5wdWIsIEJ1ZmZlci5hbGxvYygzMikpO1xuICAgICAgfSwgLzY0LWJ5dGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXBwZW5kIFNJR0hBU0hfQUxMIGJ5dGUgYXQgdGhlIGVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZmFrZVNpZyA9IEJ1ZmZlci5hbGxvYyg2NCwgMHhhYik7XG4gICAgICB0eC5hZGRTaWduYXR1cmUoS0VZUy5wdWIsIGZha2VTaWcpO1xuICAgICAgY29uc3Qgc2lnSGV4ID0gdHgudHhEYXRhLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQhO1xuICAgICAgY29uc3QgbGFzdEJ5dGUgPSBwYXJzZUludChzaWdIZXguc2xpY2UoLTIpLCAxNik7XG4gICAgICBhc3NlcnQuZXF1YWwobGFzdEJ5dGUsIFNJR0hBU0hfQUxMKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHNpZ25hdHVyZSB0aGF0IHZlcmlmaWVzIHdoZW4gc2lnbmVkIHdpdGggdGhlIGNvcnJlY3QgcHJpdmF0ZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIC8vIFNpZ24gcHJvcGVybHkgd2l0aCBwcml2YXRlIGtleSB0byBnZXQgYSByZWFsIHNpZ25hdHVyZVxuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3QgcmVhbFNpZ0hleCA9IHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ITtcbiAgICAgIGNvbnN0IHJlYWxTaWcgPSBCdWZmZXIuZnJvbShyZWFsU2lnSGV4LnNsaWNlKDAsIDEyOCksICdoZXgnKTsgLy8gNjQtYnl0ZSBTY2hub3JyIHNpZ1xuXG4gICAgICAvLyBOb3cgY3JlYXRlIGEgZnJlc2ggdHggYW5kIHVzZSBhZGRTaWduYXR1cmUgaW5zdGVhZFxuICAgICAgY29uc3QgdHgyID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgdHgyLmFkZFNpZ25hdHVyZShLRVlTLnB1YiwgcmVhbFNpZyk7XG5cbiAgICAgIC8vIFRoZSBzaWduYXR1cmUgc2NyaXB0cyBzaG91bGQgbWF0Y2ggKHNhbWUgc2lnIGJ5dGVzICsgc2FtZSBzaWdoYXNoIHR5cGUpXG4gICAgICBhc3NlcnQuZXF1YWwodHgyLnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCB0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXJpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCd0b0pzb24gc2hvdWxkIHJldHVybiBhIGNvcHkgb2YgdHhEYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGpzb24sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKGpzb24sIHR4LnR4RGF0YSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG9Ccm9hZGNhc3RGb3JtYXQgc2hvdWxkIHJldHVybiBhIEpTT04gc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBicm9hZGNhc3QgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBicm9hZGNhc3QsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYnJvYWRjYXN0KTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWQudmVyc2lvbiwgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLmlucHV0cy5sZW5ndGgsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvSGV4IHNob3VsZCByZXR1cm4gaGV4LWVuY29kZWQgSlNPTicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcbiAgICAgIGFzc2VydC5vaygvXlswLTlhLWZBLUZdKyQvLnRlc3QoaGV4KSk7XG4gICAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oaGV4LCAnaGV4JykudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLnZlcnNpb24sIDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21IZXggc2hvdWxkIHJlY29uc3RydWN0IHRoZSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgaGV4ID0gb3JpZ2luYWwudG9IZXgoKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChDT0lOLCBoZXgpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC50b0pzb24oKSwgb3JpZ2luYWwudG9Kc29uKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21Kc29uIHNob3VsZCByZWNvbnN0cnVjdCBmcm9tIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvbiA9IG9yaWdpbmFsLnRvSnNvbigpO1xuICAgICAgY29uc3QgcmVzdG9yZWQgPSBUcmFuc2FjdGlvbi5mcm9tSnNvbihDT0lOLCBqc29uKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzdG9yZWQudG9Kc29uKCksIGpzb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21Kc29uIHNob3VsZCByZWNvbnN0cnVjdCBmcm9tIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsLnRvSnNvbigpKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUpzb24oQ09JTiwganNvblN0cik7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnRvSnNvbigpLCBvcmlnaW5hbC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcCB0aHJvdWdoIHRvSGV4L2Zyb21IZXggc2hvdWxkIHByZXNlcnZlIHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcblxuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChDT0lOLCBoZXgpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnNpZ25hdHVyZSwgdHguc2lnbmF0dXJlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
486
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJEQUF3RDtBQUN4RCxtREFBdUQ7QUFDdkQsdURBQXNEO0FBQ3RELCtEQUFnRTtBQUVoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7QUFFckIsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0s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LElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUUvQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLDZCQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1RyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSw2QkFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFNJR0hBU0hfQUxMIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgS0VZUywgVFJBTlNBQ1RJT05TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBDT0lOID0gJ2thc3BhJztcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC5vayh0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnR4RGF0YS5pbnB1dHMsIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodHgudHhEYXRhLm91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGEgdHJhbnNhY3Rpb24gZnJvbSB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaWQgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGVuIG5vIGlkIGlzIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaWQgaWYgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlLCBpZDogJ2RlYWRiZWVmJyArICcwMCcucmVwZWF0KDMwKSB9O1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgdHhEYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgdHhEYXRhLmlkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hdHVyZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgc2lnbmF0dXJlcyBmb3IgdW5zaWduZWQgdHgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBhc3NlcnQub2soc2lncy5ldmVyeSgocykgPT4gcyA9PT0gJycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHNpZ25hdHVyZSBzY3JpcHRzIGFmdGVyIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQub2sodHguY2FuU2lnbih7IGtleTogS0VZUy5wcnYgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIG5vbi0zMi1ieXRlIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguc2lnbihCdWZmZXIuZnJvbSgnMDEwMicsICdoZXgnKSk7XG4gICAgICB9LCAvMzItYnl0ZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFsbCBpbnB1dHMgd2l0aCBhIHZhbGlkIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgeyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlIH0pO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdFYWNoIGlucHV0IHNob3VsZCBoYXZlIGEgc2lnbmF0dXJlU2NyaXB0Jyk7XG4gICAgICAgIGFzc2VydC5vaygoaW5wdXQuc2lnbmF0dXJlU2NyaXB0IGFzIHN0cmluZykubGVuZ3RoID4gMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpZ24gbXVsdGlwbGUgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXQpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdHgudHhEYXRhLmlucHV0cykge1xuICAgICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0ICYmIGlucHV0LnNpZ25hdHVyZVNjcmlwdC5sZW5ndGggPiAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSA2NS1ieXRlIHNpZ25hdHVyZXMgKDY0IFNjaG5vcnIgKyAxIHNpZ2hhc2ggdHlwZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ0hleCA9IHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnO1xuICAgICAgLy8gNjYgYnl0ZXMgPSAxMzIgaGV4IGNoYXJzOiAweDQxIHB1c2ggb3Bjb2RlICgxKSArIDY0LWJ5dGUgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ0hleC5sZW5ndGgsIDEzMik7XG4gICAgICAvLyBMYXN0IGJ5dGUgaXMgc2lnaGFzaCB0eXBlICgweDAxID0gU0lHSEFTSF9BTEwpXG4gICAgICBjb25zdCBsYXN0Qnl0ZSA9IHBhcnNlSW50KHNpZ0hleC5zbGljZSgtMiksIDE2KTtcbiAgICAgIGFzc2VydC5lcXVhbChsYXN0Qnl0ZSwgU0lHSEFTSF9BTEwpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVyaWZ5U2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciB1bnNpZ25lZCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBhZnRlciBzaWduaW5nIHdpdGggbWF0Y2hpbmcga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHgtb25seSAoMzItYnl0ZSkgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3QgeE9ubHlQdWIgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpLnNsaWNlKDEpO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZSh4T25seVB1YiwgMCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIHdyb25nIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHdyb25nUHViID0gQnVmZmVyLmZyb20oJzAyJyArICdhYicucmVwZWF0KDMyKSwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnZlcmlmeVNpZ25hdHVyZSh3cm9uZ1B1YiwgMCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBvdXQtb2YtcmFuZ2UgaW5wdXQgaW5kZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgOTkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIOKUgOKUgCBFQ0RTQSAodjEgYWRkcmVzcykgc2lnbmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgdGVzdHMgY292ZXIgdGhlIGF1dG8tZGV0ZWN0aW9uIHBhdGggaW4gc2lnbigpIC8gdmVyaWZ5U2lnbmF0dXJlKCkgL1xuICAvLyBzaWduYWJsZVBheWxvYWRzIHdoZW4gdGhlIGlucHV0J3Mgc2NyaXB0UHVibGljS2V5IGVuZHMgd2l0aCAweEFCIChFQ0RTQSkuXG5cbiAgZGVzY3JpYmUoJ3NpZ24gKEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGEgc2luZ2xlIEVDRFNBIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZUVjZHNhKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ1NjcmlwdCA9IHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ1NjcmlwdC5sZW5ndGggPiAwLCAnRUNEU0EgaW5wdXQgc2hvdWxkIGhhdmUgYSBzaWduYXR1cmVTY3JpcHQnKTtcbiAgICAgIC8vIDY2IGJ5dGVzID0gMTMyIGhleCBjaGFyczogMHg0MSArIDY0LWJ5dGUgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ1NjcmlwdC5sZW5ndGgsIDEzMik7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VJbnQoc2lnU2NyaXB0LnNsaWNlKC0yKSwgMTYpLCBTSUdIQVNIX0FMTCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpZ24gbXVsdGlwbGUgRUNEU0EgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXRFY2RzYSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQgJiYgaW5wdXQuc2lnbmF0dXJlU2NyaXB0Lmxlbmd0aCA+IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGRpc3RpbmN0IHNpZ2hhc2hlcyBmb3IgRUNEU0EgdnMgU2Nobm9yciBpbnB1dHMgb24gdGhlIHNhbWUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2Nobm9yclR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZWNkc2FUeCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlRWNkc2EpO1xuICAgICAgY29uc3QgW3NjaG5vcnJIYXNoXSA9IHNjaG5vcnJUeC5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgY29uc3QgW2VjZHNhSGFzaF0gPSBlY2RzYVR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQub2soIXNjaG5vcnJIYXNoLmVxdWFscyhlY2RzYUhhc2gpLCAnRUNEU0EgYW5kIFNjaG5vcnIgaGFzaGVzIG11c3QgZGlmZmVyJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlTaWduYXR1cmUgKEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBFQ0RTQSBzaWduYXR1cmUgd2l0aCBjb21wcmVzc2VkIHB1YmtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGVFY2RzYSk7XG4gICAgICB0eC5zaWduKEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4JykpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSwgJ0VDRFNBIHNpZ25hdHVyZSBzaG91bGQgdmVyaWZ5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igd3JvbmcgcHVibGljIGtleSBvbiBFQ0RTQSBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGVFY2RzYSk7XG4gICAgICB0eC5zaWduKEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4JykpO1xuICAgICAgY29uc3Qgd3JvbmdQdWIgPSBCdWZmZXIuZnJvbSgnMDInICsgJ2FiJy5yZXBlYXQoMzIpLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHdyb25nUHViLCAwKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYWxsIGlucHV0cyBpbiBhIG11bHRpLWlucHV0IEVDRFNBIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXRFY2RzYSk7XG4gICAgICB0eC5zaWduKEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4JykpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSk7XG4gICAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbiArIHZlcmlmeVNpZ25hdHVyZSAobWl4ZWQgU2Nobm9yciArIEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGFuZCB2ZXJpZnkgZWFjaCBpbnB1dCB3aXRoIHRoZSBjb3JyZWN0IGFsZ29yaXRobScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5taXhlZFNjaG5vcnJFY2RzYSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMiwgJ3Nob3VsZCBoYXZlIDIgaW5wdXRzJyk7XG5cbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICAvLyBpbnB1dFswXSBpcyBTY2hub3JyIChzY3JpcHRQdWJsaWNLZXkgZW5kcyAweEFDKVxuICAgICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApLCAnU2Nobm9yciBpbnB1dFswXSBzaG91bGQgdmVyaWZ5Jyk7XG4gICAgICAvLyBpbnB1dFsxXSBpcyBFQ0RTQSAoc2NyaXB0UHVibGljS2V5IGVuZHMgMHhBQilcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAxKSwgJ0VDRFNBIGlucHV0WzFdIHNob3VsZCB2ZXJpZnknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBkaWZmZXJlbnQgc2NyaXB0IHR5cGVzIGZvciBTY2hub3JyIGFuZCBFQ0RTQSBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubWl4ZWRTY2hub3JyRWNkc2EpO1xuICAgICAgdHguc2lnbihCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpKTtcbiAgICAgIC8vIEJvdGggcHJvZHVjZSA2Ni1ieXRlICgxMzIgaGV4IGNoYXIpIHNjcmlwdFNpZ3MgYnV0IHZpYSBkaWZmZXJlbnQgYWxnb3JpdGhtcyDigJRcbiAgICAgIC8vIHRoZSBsYXN0IG9wY29kZSBvZiB0aGVpciBzY3JpcHRQdWJsaWNLZXkgaXMgdGhlIGRpZmZlcmVudGlhdG9yLlxuICAgICAgYXNzZXJ0LmVxdWFsKCh0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykubGVuZ3RoLCAxMzIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKCh0eC50eERhdGEuaW5wdXRzWzFdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykubGVuZ3RoLCAxMzIpO1xuICAgICAgLy8gVGhlIHNpZ25hdHVyZXMgdGhlbXNlbHZlcyBzaG91bGQgZGlmZmVyIChkaWZmZXJlbnQgc2lnaGFzaCBhbGdvcml0aG0pXG4gICAgICBhc3NlcnQubm90RXF1YWwodHgudHhEYXRhLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQsIHR4LnR4RGF0YS5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hYmxlUGF5bG9hZHMgKEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSAzMi1ieXRlIGhhc2ggZm9yIGEgc2luZ2xlIEVDRFNBIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZUVjZHNhKTtcbiAgICAgIGNvbnN0IFtoYXNoXSA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQub2soQnVmZmVyLmlzQnVmZmVyKGhhc2gpKTtcbiAgICAgIGFzc2VydC5lcXVhbChoYXNoLmxlbmd0aCwgMzIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGlzdGluY3QgaGFzaGVzIGZvciBlYWNoIEVDRFNBIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXRFY2RzYSk7XG4gICAgICBjb25zdCBbaDAsIGgxXSA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQub2soIWgwLmVxdWFscyhoMSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGlmZmVyZW50IGhhc2hlcyBmb3IgU2Nobm9yciBhbmQgRUNEU0EgaW5wdXRzIG9uIHRoZSBzYW1lIGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2Nobm9yclR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZWNkc2FUeCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlRWNkc2EpO1xuICAgICAgLy8gQm90aCB0cmFuc2FjdGlvbnMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgZXhjZXB0IHNjcmlwdFB1YmxpY0tleSB0eXBlLlxuICAgICAgLy8gVGhlIEVDRFNBIGhhc2ggYXBwbGllcyBhbiBhZGRpdGlvbmFsIFNIQTI1NiBzdGVwIHNvIHRoZSByZXN1bHQgbXVzdCBkaWZmZXIuXG4gICAgICBhc3NlcnQub2soIXNjaG5vcnJUeC5zaWduYWJsZVBheWxvYWRzWzBdLmVxdWFscyhlY2RzYVR4LnNpZ25hYmxlUGF5bG9hZHNbMF0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaXhlZCB0eDogU2Nobm9yciBoYXNoIGF0IGluZGV4IDAsIEVDRFNBIGhhc2ggYXQgaW5kZXggMSDigJQgYm90aCAzMiBieXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5taXhlZFNjaG5vcnJFY2RzYSk7XG4gICAgICBjb25zdCBbaDAsIGgxXSA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQuZXF1YWwoaDAubGVuZ3RoLCAzMik7XG4gICAgICBhc3NlcnQuZXF1YWwoaDEubGVuZ3RoLCAzMik7XG4gICAgICBhc3NlcnQub2soIWgwLmVxdWFscyhoMSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZXhwbGFpblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB3aXRoIGNvcnJlY3QgZmllbGRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24uaWQsICcnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYW1vdW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHNbMF0uYW1vdW50LCAnMTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0aGUgZmVlIGFzIHRvdGFsSW4gLSB0b3RhbE91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIC8vIGZlZSA9IDEwMDAwMDAwMCAtIDk5OTk4MDAwID0gMjAwMFxuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLmZlZS5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1bSBhbGwgb3V0cHV0cyBpbiBvdXRwdXRBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCwgJzI5OTk5ODAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmVlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGxpY2l0IGZlZSB3aGVuIHNldCBpbiB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbXB1dGUgZmVlIGZyb20gaW5wdXRzIC0gb3V0cHV0cyB3aGVuIGZlZSBpcyBub3Qgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlIH07XG4gICAgICBkZWxldGUgdHhEYXRhLmZlZTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIHR4RGF0YSk7XG4gICAgICAvLyBpbnB1dDogMTAwMDAwMDAwLCBvdXRwdXQ6IDk5OTk4MDAwLCBmZWUgPSAyMDAwXG4gICAgICBhc3NlcnQuZXF1YWwodHguZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbmFibGVQYXlsb2FkcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBvbmUgQnVmZmVyIHBlciBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcGF5bG9hZHMgPSB0eC5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBheWxvYWRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQub2soQnVmZmVyLmlzQnVmZmVyKHBheWxvYWRzWzBdKSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGF5bG9hZHNbMF0ubGVuZ3RoLCAzMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0d28gQnVmZmVycyBmb3IgYSB0d28taW5wdXQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBwYXlsb2FkcyA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQuZXF1YWwocGF5bG9hZHMubGVuZ3RoLCAyKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwYXlsb2Fkcykge1xuICAgICAgICBhc3NlcnQub2soQnVmZmVyLmlzQnVmZmVyKHApKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHAubGVuZ3RoLCAzMik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBkaXN0aW5jdCBoYXNoZXMgZm9yIGVhY2ggaW5wdXQgaW4gYSBtdWx0aS1pbnB1dCB0eCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IFtwMCwgcDFdID0gdHguc2lnbmFibGVQYXlsb2FkcztcbiAgICAgIGFzc2VydC5vayghcDAuZXF1YWxzKHAxKSwgJ3Blci1pbnB1dCBzaWdoYXNoZXMgbXVzdCBkaWZmZXIgKGVhY2ggY29tbWl0cyB0byBpdHMgb3duIGluZGV4KScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRyYW5zYWN0aW9uIGhhcyBubyBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eC5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgfSwgL25vIGlucHV0cy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBkZXRlcm1pbmlzdGljIGZvciB0aGUgc2FtZSB0cmFuc2FjdGlvbiBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHgxID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHR4MiA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBbYTAsIGExXSA9IHR4MS5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgY29uc3QgW2IwLCBiMV0gPSB0eDIuc2lnbmFibGVQYXlsb2FkcztcbiAgICAgIGFzc2VydC5vayhhMC5lcXVhbHMoYjApKTtcbiAgICAgIGFzc2VydC5vayhhMS5lcXVhbHMoYjEpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZFNpZ25hdHVyZUZvcklucHV0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgd3JpdGUgdGhlIHNpZ25hdHVyZSBvbmx5IHRvIHRoZSBzcGVjaWZpZWQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBmYWtlU2lnID0gQnVmZmVyLmFsbG9jKDY0LCAweGFhKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDAsIEtFWVMucHViLCBmYWtlU2lnKTtcblxuICAgICAgYXNzZXJ0Lm9rKHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCAnaW5wdXRbMF0gc2hvdWxkIGJlIHNpZ25lZCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0LCB1bmRlZmluZWQsICdpbnB1dFsxXSBzaG91bGQgcmVtYWluIHVuc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdyaXRlIGRpZmZlcmVudCBzaWduYXR1cmVzIHRvIGRpZmZlcmVudCBpbnB1dHMgaW5kZXBlbmRlbnRseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHNpZzAgPSBCdWZmZXIuYWxsb2MoNjQsIDB4YWEpO1xuICAgICAgY29uc3Qgc2lnMSA9IEJ1ZmZlci5hbGxvYyg2NCwgMHhiYik7XG5cbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDAsIEtFWVMucHViLCBzaWcwKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDEsIEtFWVMucHViLCBzaWcxKTtcblxuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKFxuICAgICAgICB0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCxcbiAgICAgICAgdHgudHhEYXRhLmlucHV0c1sxXS5zaWduYXR1cmVTY3JpcHQsXG4gICAgICAgICdlYWNoIGlucHV0IHNob3VsZCBjYXJyeSBpdHMgb3duIHNpZ25hdHVyZSBzY3JpcHQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgNjYtYnl0ZSBzY3JpcHQgKHB1c2ggb3Bjb2RlICsgNjQgc2lnICsgMSBzaWdoYXNoIHR5cGUpIGZvciB0aGUgdGFyZ2V0IGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXQpO1xuICAgICAgdHguYWRkU2lnbmF0dXJlRm9ySW5wdXQoMSwgS0VZUy5wdWIsIEJ1ZmZlci5hbGxvYyg2NCwgMHhjYykpO1xuICAgICAgLy8gNjYgYnl0ZXMgPSAxMzIgaGV4IGNoYXJzOiAweDQxIHB1c2ggb3Bjb2RlICsgNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlXG4gICAgICBhc3NlcnQuZXF1YWwoKHR4LnR4RGF0YS5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnKS5sZW5ndGgsIDEzMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGVuZCBTSUdIQVNIX0FMTCBieXRlIGJ5IGRlZmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDAsIEtFWVMucHViLCBCdWZmZXIuYWxsb2MoNjQsIDB4ZGQpKTtcbiAgICAgIGNvbnN0IGxhc3RCeXRlID0gcGFyc2VJbnQoKHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnKS5zbGljZSgtMiksIDE2KTtcbiAgICAgIGFzc2VydC5lcXVhbChsYXN0Qnl0ZSwgU0lHSEFTSF9BTEwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmVyaWZpYWJsZSBzaWduYXR1cmUgd2hlbiBnaXZlbiB0aGUgY29ycmVjdCBTY2hub3JyIHNpZyBmb3IgdGhhdCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuXG4gICAgICAvLyBzaWduKCkgY29tcHV0ZXMgdGhlIGNvcnJlY3QgcGVyLWlucHV0IHNpZ2hhc2ggaW50ZXJuYWxseVxuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIC8vIFNraXAgdGhlIGxlYWRpbmcgMHg0MSBwdXNoIG9wY29kZSAoMiBoZXggY2hhcnMpLCByZWFkIHRoZSBuZXh0IDY0IGJ5dGVzICgxMjggaGV4IGNoYXJzKVxuICAgICAgY29uc3Qgc2lnMCA9IEJ1ZmZlci5mcm9tKCh0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykuc2xpY2UoMiwgMTMwKSwgJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnMSA9IEJ1ZmZlci5mcm9tKCh0eC50eERhdGEuaW5wdXRzWzFdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykuc2xpY2UoMiwgMTMwKSwgJ2hleCcpO1xuXG4gICAgICAvLyBSZWJ1aWxkIHVuc2lnbmVkIGFuZCBhcHBseSB2aWEgYWRkU2lnbmF0dXJlRm9ySW5wdXRcbiAgICAgIGNvbnN0IHR4MiA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICB0eDIuYWRkU2lnbmF0dXJlRm9ySW5wdXQoMCwgS0VZUy5wdWIsIHNpZzApO1xuICAgICAgdHgyLmFkZFNpZ25hdHVyZUZvcklucHV0KDEsIEtFWVMucHViLCBzaWcxKTtcblxuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eDIudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksICdpbnB1dFswXSBzaWduYXR1cmUgc2hvdWxkIHZlcmlmeScpO1xuICAgICAgYXNzZXJ0Lm9rKHR4Mi52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAxKSwgJ2lucHV0WzFdIHNpZ25hdHVyZSBzaG91bGQgdmVyaWZ5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBhbiBvdXQtb2YtcmFuZ2UgaW5kZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eC5hZGRTaWduYXR1cmVGb3JJbnB1dCg1LCBLRVlTLnB1YiwgQnVmZmVyLmFsbG9jKDY0KSk7XG4gICAgICB9LCAvb3V0IG9mIHJhbmdlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBhIG5lZ2F0aXZlIGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguYWRkU2lnbmF0dXJlRm9ySW5wdXQoLTEsIEtFWVMucHViLCBCdWZmZXIuYWxsb2MoNjQpKTtcbiAgICAgIH0sIC9vdXQgb2YgcmFuZ2UvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGEgbm9uLTY0LWJ5dGUgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguYWRkU2lnbmF0dXJlRm9ySW5wdXQoMCwgS0VZUy5wdWIsIEJ1ZmZlci5hbGxvYygzMikpO1xuICAgICAgfSwgLzY0LWJ5dGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NlcmlhbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3RvSnNvbiBzaG91bGQgcmV0dXJuIGEgY29weSBvZiB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoanNvbiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQubm90RXF1YWwoanNvbiwgdHgudHhEYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgcmV0dXJuIGEgUkVTVCBBUEkgSlNPTiBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGJyb2FkY2FzdCwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShicm9hZGNhc3QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC52ZXJzaW9uLCAwKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWQuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICAvLyBSRVNUIEFQSSBzaGFwZTogaW5wdXRzIHVzZSBwcmV2aW91c091dHBvaW50XG4gICAgICBhc3NlcnQub2socGFyc2VkLmlucHV0c1swXS5wcmV2aW91c091dHBvaW50LCAnaW5wdXRzIHNob3VsZCB1c2UgcHJldmlvdXNPdXRwb2ludCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5pbnB1dHNbMF0udHJhbnNhY3Rpb25JZCwgdW5kZWZpbmVkLCAndHJhbnNhY3Rpb25JZCBzaG91bGQgbm90IGJlIGF0IHJvb3Qgb2YgaW5wdXQnKTtcbiAgICAgIC8vIFJFU1QgQVBJIHNoYXBlOiBvdXRwdXRzIHVzZSBzY3JpcHRQdWJsaWNLZXkgb2JqZWN0XG4gICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIHBhcnNlZC5vdXRwdXRzWzBdLnNjcmlwdFB1YmxpY0tleSwgJ29iamVjdCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5vdXRwdXRzWzBdLnNjcmlwdFB1YmxpY0tleS52ZXJzaW9uLCAwKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgaW5jbHVkZSByZXF1aXJlZCB3aXJlIGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWQubG9ja1RpbWUsIDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5zdWJuZXR3b3JrSWQsICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLmdhcywgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLnBheWxvYWQsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgaW5jbHVkZSBzaWduYXR1cmVTY3JpcHQgYWZ0ZXIgc2lnbmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgdHguc2lnbihCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQub2socGFyc2VkLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQubGVuZ3RoID4gMCk7XG4gICAgfSk7XG5cbiAgICBpdCgndG9IZXggc2hvdWxkIHJldHVybiBoZXgtZW5jb2RlZCBpbnRlcm5hbCBKU09OIChmb3Igcm91bmQtdHJpcHMpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuICAgICAgYXNzZXJ0Lm9rKC9eWzAtOWEtZkEtRl0rJC8udGVzdChoZXgpKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpLnRvU3RyaW5nKCkpO1xuICAgICAgLy8gSW50ZXJuYWwgZm9ybWF0OiB0cmFuc2FjdGlvbklkIGF0IHJvb3Qgb2YgaW5wdXQgKG5vdCBwcmV2aW91c091dHBvaW50KVxuICAgICAgYXNzZXJ0LmVxdWFsKGRlY29kZWQuaW5wdXRzWzBdLnRyYW5zYWN0aW9uSWQsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzWzBdLnRyYW5zYWN0aW9uSWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlY29kZWQuaW5wdXRzWzBdLmFtb3VudCwgVFJBTlNBQ1RJT05TLnNpbXBsZS5pbnB1dHNbMF0uYW1vdW50KTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0hleCBhbmQgdG9Ccm9hZGNhc3RGb3JtYXQgcHJvZHVjZSBkaWZmZXJlbnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgaW50ZXJuYWxIZXggPSB0eC50b0hleCgpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0SGV4ID0gQnVmZmVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKGludGVybmFsSGV4LCBicm9hZGNhc3RIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21IZXggc2hvdWxkIHJlY29uc3RydWN0IHRoZSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgaGV4ID0gb3JpZ2luYWwudG9IZXgoKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChDT0lOLCBoZXgpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC50b0pzb24oKSwgb3JpZ2luYWwudG9Kc29uKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21Kc29uIHNob3VsZCByZWNvbnN0cnVjdCBmcm9tIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvbiA9IG9yaWdpbmFsLnRvSnNvbigpO1xuICAgICAgY29uc3QgcmVzdG9yZWQgPSBUcmFuc2FjdGlvbi5mcm9tSnNvbihDT0lOLCBqc29uKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzdG9yZWQudG9Kc29uKCksIGpzb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21Kc29uIHNob3VsZCByZWNvbnN0cnVjdCBmcm9tIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsLnRvSnNvbigpKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUpzb24oQ09JTiwganNvblN0cik7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnRvSnNvbigpLCBvcmlnaW5hbC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcCB0aHJvdWdoIHRvSGV4L2Zyb21IZXggc2hvdWxkIHByZXNlcnZlIHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcblxuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChDT0lOLCBoZXgpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnNpZ25hdHVyZSwgdHguc2lnbmF0dXJlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvQnJvYWRjYXN0Rm9ybWF0IChSRVNUIEFQSSBzaGFwZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBtYXAgaW5wdXRzIHRvIHByZXZpb3VzT3V0cG9pbnQgc2hhcGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGFwaSA9IEpTT04ucGFyc2UodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChhcGkuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQub2soYXBpLmlucHV0c1swXS5wcmV2aW91c091dHBvaW50LCAnaW5wdXQgc2hvdWxkIGhhdmUgcHJldmlvdXNPdXRwb2ludCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0ucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLCBUUkFOU0FDVElPTlMuc2ltcGxlLmlucHV0c1swXS50cmFuc2FjdGlvbklkKTtcbiAgICAgIGFzc2VydC5lcXVhbChhcGkuaW5wdXRzWzBdLnByZXZpb3VzT3V0cG9pbnQuaW5kZXgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzWzBdLnRyYW5zYWN0aW9uSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgaW5jbHVkZSBhbW91bnQgb3Igc2NyaXB0UHVibGljS2V5IG9uIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgYXBpID0gSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0uYW1vdW50LCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0uc2NyaXB0UHVibGljS2V5LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXAgb3V0cHV0cyB0byBzY3JpcHRQdWJsaWNLZXkgb2JqZWN0IHNoYXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBhcGkgPSBKU09OLnBhcnNlKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgYXBpLm91dHB1dHNbMF0uc2NyaXB0UHVibGljS2V5LCAnb2JqZWN0Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLm91dHB1dHNbMF0uc2NyaXB0UHVibGljS2V5LnZlcnNpb24sIDApO1xuICAgICAgYXNzZXJ0Lm9rKHR5cGVvZiBhcGkub3V0cHV0c1swXS5zY3JpcHRQdWJsaWNLZXkuc2NyaXB0UHVibGljS2V5ID09PSAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLm91dHB1dHNbMF0uYW1vdW50LCBOdW1iZXIoVFJBTlNBQ1RJT05TLnNpbXBsZS5vdXRwdXRzWzBdLmFtb3VudCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHNpZ25hdHVyZVNjcmlwdCBhcyBlbXB0eSBzdHJpbmcgZm9yIHVuc2lnbmVkIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgYXBpID0gSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aS1pbnB1dCB0cmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBhcGkgPSBKU09OLnBhcnNlKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0ucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dC5pbnB1dHNbMF0udHJhbnNhY3Rpb25JZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLmlucHV0c1sxXS5wcmV2aW91c091dHBvaW50LnRyYW5zYWN0aW9uSWQsIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0LmlucHV0c1sxXS50cmFuc2FjdGlvbklkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==