@bitgo-beta/sdk-coin-sol 2.4.3-beta.50 → 2.4.3-beta.500

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 (55) hide show
  1. package/CHANGELOG.md +756 -0
  2. package/dist/src/index.js +6 -2
  3. package/dist/src/lib/ataInitializationBuilder.js +16 -12
  4. package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
  5. package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
  6. package/dist/src/lib/closeAtaBuilder.js +69 -0
  7. package/dist/src/lib/constants.d.ts +29 -7
  8. package/dist/src/lib/constants.d.ts.map +1 -1
  9. package/dist/src/lib/constants.js +31 -7
  10. package/dist/src/lib/iface.d.ts +44 -3
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +1 -1
  13. package/dist/src/lib/index.d.ts +11 -7
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +27 -15
  16. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  17. package/dist/src/lib/instructionParamsFactory.js +235 -32
  18. package/dist/src/lib/keyPair.js +5 -5
  19. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  20. package/dist/src/lib/solInstructionFactory.js +105 -35
  21. package/dist/src/lib/stakingActivateBuilder.d.ts +2 -2
  22. package/dist/src/lib/stakingActivateBuilder.js +10 -10
  23. package/dist/src/lib/stakingAuthorizeBuilder.d.ts +43 -0
  24. package/dist/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  25. package/dist/src/lib/stakingAuthorizeBuilder.js +89 -0
  26. package/dist/src/lib/stakingDeactivateBuilder.d.ts +10 -0
  27. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/stakingDeactivateBuilder.js +71 -24
  29. package/dist/src/lib/stakingDelegateBuilder.d.ts +42 -0
  30. package/dist/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/stakingDelegateBuilder.js +120 -0
  32. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  33. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  35. package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
  36. package/dist/src/lib/tokenTransferBuilder.js +13 -13
  37. package/dist/src/lib/transaction.d.ts +3 -2
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +94 -12
  40. package/dist/src/lib/transactionBuilder.js +16 -16
  41. package/dist/src/lib/transactionBuilderFactory.d.ts +36 -7
  42. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  43. package/dist/src/lib/transactionBuilderFactory.js +54 -7
  44. package/dist/src/lib/transferBuilder.js +4 -4
  45. package/dist/src/lib/transferBuilderV2.d.ts +11 -1
  46. package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
  47. package/dist/src/lib/transferBuilderV2.js +56 -10
  48. package/dist/src/lib/utils.d.ts +13 -4
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +77 -20
  51. package/dist/src/lib/walletInitializationBuilder.js +6 -6
  52. package/dist/src/sol.d.ts +65 -21
  53. package/dist/src/sol.d.ts.map +1 -1
  54. package/dist/src/sol.js +551 -60
  55. package/package.json +10 -9
@@ -4,13 +4,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.instructionParamsFactory = void 0;
7
- const web3_js_1 = require("@solana/web3.js");
8
7
  const spl_token_1 = require("@solana/spl-token");
8
+ const web3_js_1 = require("@solana/web3.js");
9
9
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
+ const statics_1 = require("@bitgo-beta/statics");
11
+ const assert_1 = __importDefault(require("assert"));
10
12
  const constants_1 = require("./constants");
11
13
  const utils_1 = require("./utils");
12
- const assert_1 = __importDefault(require("assert"));
13
- const statics_1 = require("@bitgo-beta/statics");
14
14
  /**
15
15
  * Construct instructions params from Solana instructions
16
16
  *
@@ -32,6 +32,14 @@ function instructionParamsFactory(type, instructions) {
32
32
  return parseStakingWithdrawInstructions(instructions);
33
33
  case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
34
34
  return parseAtaInitInstructions(instructions);
35
+ case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
36
+ return parseAtaCloseInstructions(instructions);
37
+ case sdk_core_1.TransactionType.StakingAuthorize:
38
+ return parseStakingAuthorizeInstructions(instructions);
39
+ case sdk_core_1.TransactionType.StakingAuthorizeRaw:
40
+ return parseStakingAuthorizeRawInstructions(instructions);
41
+ case sdk_core_1.TransactionType.StakingDelegate:
42
+ return parseStakingDelegateInstructions(instructions);
35
43
  default:
36
44
  throw new sdk_core_1.NotSupported('Invalid transaction, transaction type not supported: ' + type);
37
45
  }
@@ -73,7 +81,7 @@ function parseWalletInitInstructions(instructions) {
73
81
  function parseSendInstructions(instructions) {
74
82
  const instructionData = [];
75
83
  for (const instruction of instructions) {
76
- const type = utils_1.getInstructionType(instruction);
84
+ const type = (0, utils_1.getInstructionType)(instruction);
77
85
  switch (type) {
78
86
  case constants_1.ValidInstructionTypesEnum.Memo:
79
87
  const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
@@ -103,7 +111,7 @@ function parseSendInstructions(instructions) {
103
111
  instructionData.push(transfer);
104
112
  break;
105
113
  case constants_1.ValidInstructionTypesEnum.TokenTransfer:
106
- const tokenTransferInstruction = spl_token_1.decodeTransferCheckedInstruction(instruction);
114
+ const tokenTransferInstruction = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction);
107
115
  const tokenName = findTokenName(tokenTransferInstruction.keys.mint.pubkey.toString());
108
116
  const tokenTransfer = {
109
117
  type: constants_1.InstructionBuilderTypes.TokenTransfer,
@@ -133,7 +141,7 @@ function parseSendInstructions(instructions) {
133
141
  instructionData.push(ataInit);
134
142
  break;
135
143
  default:
136
- throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + utils_1.getInstructionType(instruction));
144
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
137
145
  }
138
146
  }
139
147
  return instructionData;
@@ -150,7 +158,7 @@ function parseStakingActivateInstructions(instructions) {
150
158
  const instructionData = [];
151
159
  const stakingInstructions = {};
152
160
  for (const instruction of instructions) {
153
- const type = utils_1.getInstructionType(instruction);
161
+ const type = (0, utils_1.getInstructionType)(instruction);
154
162
  switch (type) {
155
163
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
156
164
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -191,6 +199,45 @@ function parseStakingActivateInstructions(instructions) {
191
199
  instructionData.push(stakingActivate);
192
200
  return instructionData;
193
201
  }
202
+ /**
203
+ * Parses Solana instructions to create delegate tx
204
+ * Only supports Nonce, StakingDelegate
205
+ *
206
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
207
+ * @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
208
+ */
209
+ function parseStakingDelegateInstructions(instructions) {
210
+ const instructionData = [];
211
+ for (const instruction of instructions) {
212
+ const type = (0, utils_1.getInstructionType)(instruction);
213
+ switch (type) {
214
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
215
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
216
+ const nonce = {
217
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
218
+ params: {
219
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
220
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
221
+ },
222
+ };
223
+ instructionData.push(nonce);
224
+ break;
225
+ case constants_1.ValidInstructionTypesEnum.StakingDelegate:
226
+ const stakingDelegateParams = web3_js_1.StakeInstruction.decodeDelegate(instruction);
227
+ const stakingDelegate = {
228
+ type: constants_1.InstructionBuilderTypes.StakingDelegate,
229
+ params: {
230
+ fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
231
+ stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
232
+ validator: stakingDelegateParams.votePubkey.toString() || '',
233
+ },
234
+ };
235
+ instructionData.push(stakingDelegate);
236
+ break;
237
+ }
238
+ }
239
+ return instructionData;
240
+ }
194
241
  function validateStakingInstructions(stakingInstructions) {
195
242
  if (!stakingInstructions.create) {
196
243
  throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing create stake account instruction');
@@ -219,9 +266,9 @@ function validateStakingInstructions(stakingInstructions) {
219
266
  function parseStakingDeactivateInstructions(instructions) {
220
267
  var _a, _b, _c, _d, _e;
221
268
  const instructionData = [];
222
- const unstakingInstructions = {};
269
+ const unstakingInstructions = [];
223
270
  for (const instruction of instructions) {
224
- const type = utils_1.getInstructionType(instruction);
271
+ const type = (0, utils_1.getInstructionType)(instruction);
225
272
  switch (type) {
226
273
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
227
274
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -242,39 +289,90 @@ function parseStakingDeactivateInstructions(instructions) {
242
289
  instructionData.push(memo);
243
290
  break;
244
291
  case constants_1.ValidInstructionTypesEnum.Allocate:
245
- unstakingInstructions.allocate = web3_js_1.SystemInstruction.decodeAllocate(instruction);
292
+ if (unstakingInstructions.length > 0 &&
293
+ unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
294
+ unstakingInstructions[unstakingInstructions.length - 1].allocate =
295
+ web3_js_1.SystemInstruction.decodeAllocate(instruction);
296
+ }
297
+ else {
298
+ unstakingInstructions.push({
299
+ allocate: web3_js_1.SystemInstruction.decodeAllocate(instruction),
300
+ });
301
+ }
246
302
  break;
247
303
  case constants_1.ValidInstructionTypesEnum.Assign:
248
- unstakingInstructions.assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
304
+ if (unstakingInstructions.length > 0 &&
305
+ unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
306
+ unstakingInstructions[unstakingInstructions.length - 1].assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
307
+ }
308
+ else {
309
+ unstakingInstructions.push({
310
+ assign: web3_js_1.SystemInstruction.decodeAssign(instruction),
311
+ });
312
+ }
249
313
  break;
250
314
  case constants_1.ValidInstructionTypesEnum.Split:
251
- unstakingInstructions.split = web3_js_1.StakeInstruction.decodeSplit(instruction);
315
+ if (unstakingInstructions.length > 0 &&
316
+ unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
317
+ unstakingInstructions[unstakingInstructions.length - 1].split = web3_js_1.StakeInstruction.decodeSplit(instruction);
318
+ }
319
+ else {
320
+ unstakingInstructions.push({
321
+ split: web3_js_1.StakeInstruction.decodeSplit(instruction),
322
+ });
323
+ }
252
324
  break;
253
325
  case constants_1.ValidInstructionTypesEnum.StakingDeactivate:
254
- unstakingInstructions.deactivate = web3_js_1.StakeInstruction.decodeDeactivate(instruction);
326
+ if (unstakingInstructions.length > 0 &&
327
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
328
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate =
329
+ web3_js_1.StakeInstruction.decodeDeactivate(instruction);
330
+ }
331
+ else {
332
+ unstakingInstructions.push({
333
+ deactivate: web3_js_1.StakeInstruction.decodeDeactivate(instruction),
334
+ });
335
+ }
336
+ break;
337
+ case constants_1.ValidInstructionTypesEnum.Transfer:
338
+ if (unstakingInstructions.length > 0 &&
339
+ unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
340
+ unstakingInstructions[unstakingInstructions.length - 1].transfer =
341
+ web3_js_1.SystemInstruction.decodeTransfer(instruction);
342
+ }
343
+ else {
344
+ unstakingInstructions.push({
345
+ transfer: web3_js_1.SystemInstruction.decodeTransfer(instruction),
346
+ });
347
+ }
255
348
  break;
256
349
  }
257
350
  }
258
- validateUnstakingInstructions(unstakingInstructions);
259
- const stakingDeactivate = {
260
- type: constants_1.InstructionBuilderTypes.StakingDeactivate,
261
- params: {
262
- fromAddress: ((_a = unstakingInstructions.deactivate) === null || _a === void 0 ? void 0 : _a.authorizedPubkey.toString()) || '',
263
- stakingAddress: ((_b = unstakingInstructions.split) === null || _b === void 0 ? void 0 : _b.stakePubkey.toString()) ||
264
- ((_c = unstakingInstructions.deactivate) === null || _c === void 0 ? void 0 : _c.stakePubkey.toString()) ||
265
- '',
266
- amount: (_d = unstakingInstructions.split) === null || _d === void 0 ? void 0 : _d.lamports.toString(),
267
- unstakingAddress: (_e = unstakingInstructions.split) === null || _e === void 0 ? void 0 : _e.splitStakePubkey.toString(),
268
- },
269
- };
270
- instructionData.push(stakingDeactivate);
351
+ for (const unstakingInstruction of unstakingInstructions) {
352
+ validateUnstakingInstructions(unstakingInstruction);
353
+ const stakingDeactivate = {
354
+ type: constants_1.InstructionBuilderTypes.StakingDeactivate,
355
+ params: {
356
+ fromAddress: ((_a = unstakingInstruction.deactivate) === null || _a === void 0 ? void 0 : _a.authorizedPubkey.toString()) || '',
357
+ stakingAddress: ((_b = unstakingInstruction.split) === null || _b === void 0 ? void 0 : _b.stakePubkey.toString()) ||
358
+ ((_c = unstakingInstruction.deactivate) === null || _c === void 0 ? void 0 : _c.stakePubkey.toString()) ||
359
+ '',
360
+ amount: (_d = unstakingInstruction.split) === null || _d === void 0 ? void 0 : _d.lamports.toString(),
361
+ unstakingAddress: (_e = unstakingInstruction.split) === null || _e === void 0 ? void 0 : _e.splitStakePubkey.toString(),
362
+ },
363
+ };
364
+ instructionData.push(stakingDeactivate);
365
+ }
271
366
  return instructionData;
272
367
  }
273
368
  function validateUnstakingInstructions(unstakingInstructions) {
274
369
  if (!unstakingInstructions.deactivate) {
275
370
  throw new sdk_core_1.NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
276
371
  }
277
- else if (unstakingInstructions.allocate || unstakingInstructions.assign || unstakingInstructions.split) {
372
+ else if (unstakingInstructions.allocate ||
373
+ unstakingInstructions.assign ||
374
+ unstakingInstructions.split ||
375
+ unstakingInstructions.transfer) {
278
376
  if (!unstakingInstructions.allocate) {
279
377
  throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
280
378
  }
@@ -300,6 +398,9 @@ function validateUnstakingInstructions(unstakingInstructions) {
300
398
  else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
301
399
  throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
302
400
  }
401
+ else if (!unstakingInstructions.transfer) {
402
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
403
+ }
303
404
  }
304
405
  }
305
406
  /**
@@ -312,7 +413,7 @@ function validateUnstakingInstructions(unstakingInstructions) {
312
413
  function parseStakingWithdrawInstructions(instructions) {
313
414
  const instructionData = [];
314
415
  for (const instruction of instructions) {
315
- const type = utils_1.getInstructionType(instruction);
416
+ const type = (0, utils_1.getInstructionType)(instruction);
316
417
  switch (type) {
317
418
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
318
419
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -380,7 +481,7 @@ function parseAtaInitInstructions(instructions) {
380
481
  const instructionData = [];
381
482
  let memo;
382
483
  for (const instruction of instructions) {
383
- const type = utils_1.getInstructionType(instruction);
484
+ const type = (0, utils_1.getInstructionType)(instruction);
384
485
  switch (type) {
385
486
  case constants_1.ValidInstructionTypesEnum.Memo:
386
487
  memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
@@ -412,7 +513,7 @@ function parseAtaInitInstructions(instructions) {
412
513
  instructionData.push(ataInit);
413
514
  break;
414
515
  default:
415
- throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + utils_1.getInstructionType(instruction));
516
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
416
517
  }
417
518
  }
418
519
  if (memo) {
@@ -420,6 +521,108 @@ function parseAtaInitInstructions(instructions) {
420
521
  }
421
522
  return instructionData;
422
523
  }
524
+ const ataCloseInstructionKeysIndexes = {
525
+ AccountAddress: 0,
526
+ DestinationAddress: 1,
527
+ AuthorityAddress: 2,
528
+ };
529
+ /**
530
+ * Parses Solana instructions to close associated token account tx instructions params
531
+ *
532
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
533
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
534
+ */
535
+ function parseAtaCloseInstructions(instructions) {
536
+ const instructionData = [];
537
+ for (const instruction of instructions) {
538
+ const ataClose = {
539
+ type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
540
+ params: {
541
+ accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
542
+ destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
543
+ authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
544
+ },
545
+ };
546
+ instructionData.push(ataClose);
547
+ }
548
+ return instructionData;
549
+ }
550
+ /**
551
+ * Parses Solana instructions to authorized staking account params
552
+ * Only supports Nonce, Authorize instructions
553
+ *
554
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
555
+ * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
556
+ */
557
+ function parseStakingAuthorizeInstructions(instructions) {
558
+ var _a;
559
+ const instructionData = [];
560
+ for (const instruction of instructions) {
561
+ const type = (0, utils_1.getInstructionType)(instruction);
562
+ switch (type) {
563
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
564
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
565
+ const nonce = {
566
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
567
+ params: {
568
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
569
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
570
+ },
571
+ };
572
+ instructionData.push(nonce);
573
+ break;
574
+ case constants_1.ValidInstructionTypesEnum.Memo:
575
+ const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
576
+ instructionData.push(memo);
577
+ break;
578
+ case constants_1.ValidInstructionTypesEnum.Authorize:
579
+ const authorize = web3_js_1.StakeInstruction.decodeAuthorize(instruction);
580
+ instructionData.push({
581
+ type: constants_1.InstructionBuilderTypes.StakingAuthorize,
582
+ params: {
583
+ stakingAddress: authorize.stakePubkey.toString(),
584
+ oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
585
+ newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
586
+ newWithdrawAddress: ((_a = authorize.custodianPubkey) === null || _a === void 0 ? void 0 : _a.toString()) || '',
587
+ },
588
+ });
589
+ break;
590
+ }
591
+ }
592
+ return instructionData;
593
+ }
594
+ /**
595
+ * Parses Solana instructions to authorized staking account params
596
+ * Only supports Nonce, Authorize instructions
597
+ *
598
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
599
+ * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
600
+ */
601
+ function parseStakingAuthorizeRawInstructions(instructions) {
602
+ const instructionData = [];
603
+ (0, assert_1.default)(instructions.length === 2, 'Invalid number of instructions');
604
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
605
+ const nonce = {
606
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
607
+ params: {
608
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
609
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
610
+ },
611
+ };
612
+ instructionData.push(nonce);
613
+ const authorize = instructions[1];
614
+ (0, assert_1.default)(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
615
+ instructionData.push({
616
+ type: constants_1.InstructionBuilderTypes.StakingAuthorize,
617
+ params: {
618
+ stakingAddress: authorize.keys[0].pubkey.toString(),
619
+ oldAuthorizeAddress: authorize.keys[2].pubkey.toString(),
620
+ newAuthorizeAddress: authorize.keys[3].pubkey.toString(),
621
+ custodianAddress: authorize.keys[4].pubkey.toString(),
622
+ },
623
+ });
624
+ return instructionData;
625
+ }
423
626
  function findTokenName(mintAddress) {
424
627
  let token;
425
628
  statics_1.coins.forEach((value, key) => {
@@ -427,7 +630,7 @@ function findTokenName(mintAddress) {
427
630
  token = value.name;
428
631
  }
429
632
  });
430
- assert_1.default(token);
633
+ (0, assert_1.default)(token);
431
634
  return token;
432
635
  }
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkNBWXlCO0FBQ3pCLGlEQUFxRTtBQUVyRSxtREFBcUU7QUFDckUsMkNBQStHO0FBYS9HLG1DQUE2QztBQUM3QyxvREFBNEI7QUFDNUIsaURBQXFEO0FBRXJEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHdCQUF3QixDQUN0QyxJQUFxQixFQUNyQixZQUFzQztJQUV0QyxRQUFRLElBQUksRUFBRTtRQUNaLEtBQUssMEJBQWUsQ0FBQyxvQkFBb0I7WUFDdkMsT0FBTywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxLQUFLLDBCQUFlLENBQUMsSUFBSTtZQUN2QixPQUFPLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLGlCQUFpQjtZQUNwQyxPQUFPLGtDQUFrQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLG9DQUFvQztZQUN2RCxPQUFPLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hEO1lBQ0UsTUFBTSxJQUFJLHVCQUFZLENBQUMsdURBQXVELEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDMUY7QUFDSCxDQUFDO0FBcEJELDREQW9CQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxZQUFzQztJQUN6RSxNQUFNLGVBQWUsR0FBNkIsRUFBRSxDQUFDO0lBQ3JELE1BQU0saUJBQWlCLEdB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UztxQkFDVjtpQkFDRixDQUFDO2dCQUNGLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlCLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksdUJBQVksQ0FDcEIsdURBQXVELEdBQUcsMEJBQWtCLENBQUMsV0FBVyxDQUFDLENBQzFGLENBQUM7U0FDTDtLQUNGO0lBQ0QsSUFBSSxJQUFJLEVBQUU7UUFDUixlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLFdBQW1CO0lBQ3hDLElBQUksS0FBeUIsQ0FBQztJQUU5QixlQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzNCLElBQUksS0FBSyxZQUFZLGlCQUFPLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7WUFDbEUsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDcEI7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFZCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBbGxvY2F0ZVBhcmFtcyxcbiAgQXNzaWduUGFyYW1zLFxuICBDcmVhdGVBY2NvdW50UGFyYW1zLFxuICBEZWFjdGl2YXRlU3Rha2VQYXJhbXMsXG4gIERlbGVnYXRlU3Rha2VQYXJhbXMsXG4gIEluaXRpYWxpemVTdGFrZVBhcmFtcyxcbiAgU3BsaXRTdGFrZVBhcmFtcyxcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuXG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIE5vdFN1cHBvcnRlZCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLCBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQXRhSW5pdCxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIFdhbGxldEluaXQsXG4gIFRyYW5zZmVyLFxuICBOb25jZSxcbiAgTWVtbyxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nRGVhY3RpdmF0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldEluc3RydWN0aW9uVHlwZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgaW5zdHJ1Y3Rpb25zIHBhcmFtcyBmcm9tIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHlwZSAtIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gIHR5cGU6IFRyYW5zYWN0aW9uVHlwZSxcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEluc3RydWN0aW9uUGFyYW1zW10ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgcmV0dXJuIHBhcnNlU2VuZEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGUpO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gV2FsbGV0IGluaXRpYWxpemF0aW9uIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjcmVhdGUgYW5kIGluaXRpYWxpemUgbm9uY2Ugc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8V2FsbGV0SW5pdCB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkNyZWF0ZV0pO1xuICBjb25zdCBub25jZUluaXRJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlSW5pdGlhbGl6ZShcbiAgICBpbnN0cnVjdGlvbnNbd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcy5Jbml0aWFsaXplTm9uY2VBY2NvdW50XVxuICApO1xuXG4gIGNvbnN0IHdhbGxldEluaXQ6IFdhbGxldEluaXQgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5vbmNlQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2god2FsbGV0SW5pdCk7XG5cbiAgY29uc3QgbWVtbyA9IGdldE1lbW8oaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKTtcbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gU2VuZCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE1lbW8sIFRyYW5zZmVyIGFuZCBBZHZhbmNlIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IE1lbW8gfCBUcmFuc2ZlciB8IFRva2VuVHJhbnNmZXIgfCBBdGFJbml0PiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBNZW1vIHwgVHJhbnNmZXIgfCBUb2tlblRyYW5zZmVyIHwgQXRhSW5pdD4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXI6IFRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnRvUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0cmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXI6XG4gICAgICAgIGNvbnN0IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbiA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gZmluZFRva2VuTmFtZSh0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgdG9rZW5UcmFuc2ZlcjogVG9rZW5UcmFuc2ZlciA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgICBzb3VyY2VBZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5zb3VyY2UucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2godG9rZW5UcmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBtaW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBtaW50VG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogbWludFRva2VuTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgdHggYW5kIGRlbGVnYXRlIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdBY3RpdmF0ZSBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8+ID0gW107XG4gIGNvbnN0IHN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBTdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DcmVhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0luaXRpYWxpemU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5pdGlhbGl6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcbiAgY29uc3Qgc3Rha2luZ0FjdGl2YXRlOiBTdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlPy5mcm9tUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICBzdGFraW5nQWRkcmVzczogc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplPy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgYW1vdW50OiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZT8ubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZT8udm90ZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdBY3RpdmF0ZSk7XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuaW50ZXJmYWNlIFN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICBjcmVhdGU/OiBDcmVhdGVBY2NvdW50UGFyYW1zO1xuICBpbml0aWFsaXplPzogSW5pdGlhbGl6ZVN0YWtlUGFyYW1zO1xuICBkZWxlZ2F0ZT86IERlbGVnYXRlU3Rha2VQYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGluaXRpYWxpemUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGRlbGVnYXRlIGluc3RydWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVhY3RpdmF0ZSBzdGFrZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zLiBTdXBwb3J0cyBmdWxsIHN0YWtlXG4gKiBhY2NvdW50IGRlYWN0aXZhdGlvbiBhbmQgcGFydGlhbCBzdGFrZSBhY2NvdW50IGRlYWN0aXZhdGlvbi5cbiAqXG4gKiBXaGVuIHBhcnRpYWxseSBkZWFjdGl2YXRpbmcgYSBzdGFrZSBhY2NvdW50IHRoaXMgbWV0aG9kIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6IEFsbG9jYXRlLFxuICogdG8gYWxsb2NhdGUgYSBuZXcgc3Rha2luZyBhY2NvdW50LCBBc3NpZ24sIHRvIGFzc2lnbiB0aGUgbmV3bHkgY3JlYXRlZCBzdGFraW5nIGFjY291bnQgdG8gdGhlXG4gKiBTdGFrZSBQcm9ncmFtLCBTcGxpdCwgdG8gc3BsaXQgdGhlIGN1cnJlbnQgc3Rha2UgYWNjb3VudCwgYW5kIFN0YWtpbmdEZWFjdGl2YXRlIHRvIGRlYWN0aXZhdGUgdGhlXG4gKiBuZXdseSBjcmVhdGVkIHN0YWtlIGFjY291bnQuXG4gKlxuICogU3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWFjdGl2YXRlLCBNZW1vLCBBbGxvY2F0ZSwgQXNzaWduLCBhbmQgU3BsaXQgU29sYW5hIGluc3RydWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiA9IFtdO1xuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBVbnN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWxsb2NhdGU6XG4gICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Bc3NpZ246XG4gICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNwbGl0OlxuICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuICBjb25zdCBzdGFraW5nRGVhY3RpdmF0ZTogU3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGU/LmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIHN0YWtpbmdBZGRyZXNzOlxuICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQ/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHxcbiAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGU/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHxcbiAgICAgICAgJycsXG4gICAgICBhbW91bnQ6IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdD8ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdD8uc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdEZWFjdGl2YXRlKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5pbnRlcmZhY2UgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgYWxsb2NhdGU/OiBBbGxvY2F0ZVBhcmFtcztcbiAgYXNzaWduPzogQXNzaWduUGFyYW1zO1xuICBzcGxpdD86IFNwbGl0U3Rha2VQYXJhbXM7XG4gIGRlYWN0aXZhdGU/OiBEZWFjdGl2YXRlU3Rha2VQYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlIHx8IHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24gfHwgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0KSB7XG4gICAgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhbGxvY2F0ZSB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhc3NpZ24gdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIHNwbGl0IHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKSAhPT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbi5hY2NvdW50UHVia2V5LnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbXVzdCBhbGxvY2F0ZSBhbmQgYXNzaWduIHRoZSBzYW1lIHB1YmxpYyBrZXknXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLnNwYWNlICE9PSBTdGFrZVByb2dyYW0uc3BhY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgIGBJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdW5zdGFraW5nIGFjY291bnQgbXVzdCBhbGxvY2F0ZSAke1N0YWtlUHJvZ3JhbS5zcGFjZX0gYnl0ZXNgXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtlIGFjY291bnQgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgU3Rha2UgUHJvZ3JhbSdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09XG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbXVzdCBhbGxvY2F0ZSB0aGUgdW5zdGFraW5nIGFjY291bnQnKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgPT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIFN0YWtlIEFjY291bnQnXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nICB3aXRoZHJhdyB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nV2l0aGRyYXcsIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyB3aXRoZHJhdyB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVdpdGhkcmF3KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3OiBTdGFraW5nV2l0aGRyYXcgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtZW1vIG9iamVjdCBmcm9tIGluc3RydWN0aW9ucyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtNZW1vIHwgdW5kZWZpbmVkfSAtIG1lbW8gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRNZW1vKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLCBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pOiBNZW1vIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKS5sZW5ndGg7XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSBpbnN0cnVjdGlvbnNMZW5ndGggJiYgaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10uZGF0YS50b1N0cmluZygpIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgUGF5ZXJBZGRyZXNzOiAwLFxuICBBVEFBZGRyZXNzOiAxLFxuICBPd25lckFkZHJlc3M6IDIsXG4gIE1pbnRBZGRyZXNzOiAzLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBpbml0aWFsaXplIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8QXRhSW5pdCB8IE1lbW8gfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUluaXQgfCBNZW1vIHwgTm9uY2U+ID0gW107XG4gIGxldCBtZW1vOiBNZW1vIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgbWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmIChtZW1vKSB7XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZnVuY3Rpb24gZmluZFRva2VuTmFtZShtaW50QWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29pbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNvbENvaW4gJiYgdmFsdWUudG9rZW5BZGRyZXNzID09PSBtaW50QWRkcmVzcykge1xuICAgICAgdG9rZW4gPSB2YWx1ZS5uYW1lO1xuICAgIH1cbiAgfSk7XG5cbiAgYXNzZXJ0KHRva2VuKTtcblxuICByZXR1cm4gdG9rZW47XG59XG4iXX0=
636
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaURBQXFFO0FBQ3JFLDZDQWN5QjtBQUV6QixtREFBcUU7QUFDckUsaURBQXFEO0FBQ3JELG9EQUE0QjtBQUM1QiwyQ0FBK0c7QUFnQi9HLG1DQUE2QztBQUU3Qzs7Ozs7O0dBTUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsSUFBcUIsRUFDckIsWUFBc0M7SUFFdEMsUUFBUSxJQUFJLEVBQUU7UUFDWixLQUFLLDBCQUFlLENBQUMsb0JBQW9CO1lBQ3ZDLE9BQU8sMkJBQTJCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsS0FBSywwQkFBZSxDQUFDLElBQUk7WUFDdkIsT0FBTyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxLQUFLLDBCQUFlLENBQUMsZUFBZTtZQUNsQyxPQUFPLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELEtBQUssMEJBQWUsQ0FBQyxpQkFBaUI7WUFDcEMsT0FBTyxrQ0FBa0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxLQUFLLDBCQUFlLENBQUMsZUFBZTtZQUNsQyxPQUFPLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELEtBQUssMEJBQWUsQ0FBQyxvQ0FBb0M7WUFDdkQsT0FBTyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxLQUFLLDBCQUFlLENBQUMsMkJBQTJCO1lBQzlDLE9BQU8seUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsS0FBSywwQkFBZSxDQUFDLGdCQUFnQjtZQUNuQyxPQUFPLGlDQUFpQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELEtBQUssMEJBQWUsQ0FBQyxtQkFBbUI7WUFDdEMsT0FBTyxvQ0FBb0Ms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bnN0cnVjdGlvbiB9IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEFsbG9jYXRlUGFyYW1zLFxuICBBc3NpZ25QYXJhbXMsXG4gIEF1dGhvcml6ZVN0YWtlUGFyYW1zLFxuICBDcmVhdGVBY2NvdW50UGFyYW1zLFxuICBEZWFjdGl2YXRlU3Rha2VQYXJhbXMsXG4gIERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uLFxuICBEZWxlZ2F0ZVN0YWtlUGFyYW1zLFxuICBJbml0aWFsaXplU3Rha2VQYXJhbXMsXG4gIFNwbGl0U3Rha2VQYXJhbXMsXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5cbmltcG9ydCB7IE5vdFN1cHBvcnRlZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLCBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQXRhQ2xvc2UsXG4gIEF0YUluaXQsXG4gIEluc3RydWN0aW9uUGFyYW1zLFxuICBNZW1vLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplLFxuICBTdGFraW5nRGVhY3RpdmF0ZSxcbiAgU3Rha2luZ0RlbGVnYXRlLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zZmVyLFxuICBXYWxsZXRJbml0LFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldEluc3RydWN0aW9uVHlwZSB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBpbnN0cnVjdGlvbnMgcGFyYW1zIGZyb20gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0eXBlIC0gdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgcmV0dXJuIHBhcnNlV2FsbGV0SW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICByZXR1cm4gcGFyc2VTZW5kSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICByZXR1cm4gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBub25jZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFdhbGxldCBpbml0aWFsaXphdGlvbiB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PFdhbGxldEluaXQgfCBNZW1vPiA9IFtdO1xuICBjb25zdCBjcmVhdGVJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuQ3JlYXRlXSk7XG4gIGNvbnN0IG5vbmNlSW5pdEluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VJbml0aWFsaXplKFxuICAgIGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkluaXRpYWxpemVOb25jZUFjY291bnRdXG4gICk7XG5cbiAgY29uc3Qgd2FsbGV0SW5pdDogV2FsbGV0SW5pdCA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogY3JlYXRlSW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgbm9uY2VBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aEFkZHJlc3M6IG5vbmNlSW5pdEluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGFtb3VudDogY3JlYXRlSW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaCh3YWxsZXRJbml0KTtcblxuICBjb25zdCBtZW1vID0gZ2V0TWVtbyhpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBTZW5kIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTWVtbywgVHJhbnNmZXIgYW5kIEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2VuZEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgTWVtbyB8IFRyYW5zZmVyIHwgVG9rZW5UcmFuc2ZlciB8IEF0YUluaXQ+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IE1lbW8gfCBUcmFuc2ZlciB8IFRva2VuVHJhbnNmZXIgfCBBdGFJbml0PiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcjogVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24udG9QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uID0gZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCB0b2tlblRyYW5zZmVyOiBUb2tlblRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLnNvdXJjZS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0b2tlblRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnRUb2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzKTtcblxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBtaW50VG9rZW5OYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUluaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgc3Rha2luZyB0eCBhbmQgZGVsZWdhdGUgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgU3Rha2luZ0FjdGl2YXRlIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhY3RpdmF0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0FjdGl2YXRlIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0FjdGl2YXRlIHwgTWVtbz4gPSBbXTtcbiAgY29uc3Qgc3Rha2luZ0luc3RydWN0aW9ucyA9IHt9IGFzIFN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNyZWF0ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nSW5pdGlhbGl6ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVJbml0aWFsaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlbGVnYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuICBjb25zdCBzdGFraW5nQWN0aXZhdGU6IFN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGU/LmZyb21QdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemU/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICBhbW91bnQ6IHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlPy5sYW1wb3J0cy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgdmFsaWRhdG9yOiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlPy52b3RlUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0FjdGl2YXRlKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVsZWdhdGUgdHhcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWxlZ2F0ZVxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlbGVnYXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVsZWdhdGU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcyA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nRGVsZWdhdGU6IFN0YWtpbmdEZWxlZ2F0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLnZvdGVQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVsZWdhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuaW50ZXJmYWNlIFN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICBjcmVhdGU/OiBDcmVhdGVBY2NvdW50UGFyYW1zO1xuICBpbml0aWFsaXplPzogSW5pdGlhbGl6ZVN0YWtlUGFyYW1zO1xuICBkZWxlZ2F0ZT86IERlbGVnYXRlU3Rha2VQYXJhbXM7XG4gIGF1dGhvcml6ZT86IEF1dGhvcml6ZVN0YWtlUGFyYW1zW107XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGluaXRpYWxpemUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGRlbGVnYXRlIGluc3RydWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVhY3RpdmF0ZSBzdGFrZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zLiBTdXBwb3J0cyBmdWxsIHN0YWtlXG4gKiBhY2NvdW50IGRlYWN0aXZhdGlvbiBhbmQgcGFydGlhbCBzdGFrZSBhY2NvdW50IGRlYWN0aXZhdGlvbi5cbiAqXG4gKiBXaGVuIHBhcnRpYWxseSBkZWFjdGl2YXRpbmcgYSBzdGFrZSBhY2NvdW50IHRoaXMgbWV0aG9kIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6IEFsbG9jYXRlLFxuICogdG8gYWxsb2NhdGUgYSBuZXcgc3Rha2luZyBhY2NvdW50LCBBc3NpZ24sIHRvIGFzc2lnbiB0aGUgbmV3bHkgY3JlYXRlZCBzdGFraW5nIGFjY291bnQgdG8gdGhlXG4gKiBTdGFrZSBQcm9ncmFtLCBTcGxpdCwgdG8gc3BsaXQgdGhlIGN1cnJlbnQgc3Rha2UgYWNjb3VudCwgYW5kIFN0YWtpbmdEZWFjdGl2YXRlIHRvIGRlYWN0aXZhdGUgdGhlXG4gKiBuZXdseSBjcmVhdGVkIHN0YWtlIGFjY291bnQuXG4gKlxuICogU3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWFjdGl2YXRlLCBNZW1vLCBBbGxvY2F0ZSwgQXNzaWduLCBhbmQgU3BsaXQgU29sYW5hIGluc3RydWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiA9IFtdO1xuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9uc1tdID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWxsb2NhdGU6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFsbG9jYXRlID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBhbGxvY2F0ZTogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQXNzaWduOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFzc2lnbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBhc3NpZ246IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFzc2lnbihpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TcGxpdDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uc3BsaXQgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBzcGxpdDogU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVTcGxpdChpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kZWFjdGl2YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kZWFjdGl2YXRlID1cbiAgICAgICAgICAgIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVhY3RpdmF0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGVhY3RpdmF0ZTogU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2ZlciA9XG4gICAgICAgICAgICBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVUcmFuc2ZlcihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgdHJhbnNmZXI6IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuc3Rha2luZ0luc3RydWN0aW9uIG9mIHVuc3Rha2luZ0luc3RydWN0aW9ucykge1xuICAgIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKTtcbiAgICBjb25zdCBzdGFraW5nRGVhY3RpdmF0ZTogU3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBmcm9tQWRkcmVzczogdW5zdGFraW5nSW5zdHJ1Y3Rpb24uZGVhY3RpdmF0ZT8uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICBzdGFraW5nQWRkcmVzczpcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbi5zcGxpdD8uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uLmRlYWN0aXZhdGU/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHxcbiAgICAgICAgICAnJyxcbiAgICAgICAgYW1vdW50OiB1bnN0YWtpbmdJbnN0cnVjdGlvbi5zcGxpdD8ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgdW5zdGFraW5nQWRkcmVzczogdW5zdGFraW5nSW5zdHJ1Y3Rpb24uc3BsaXQ/LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVhY3RpdmF0ZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5pbnRlcmZhY2UgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgYWxsb2NhdGU/OiBBbGxvY2F0ZVBhcmFtcztcbiAgYXNzaWduPzogQXNzaWduUGFyYW1zO1xuICBzcGxpdD86IFNwbGl0U3Rha2VQYXJhbXM7XG4gIGRlYWN0aXZhdGU/OiBEZWFjdGl2YXRlU3Rha2VQYXJhbXM7XG4gIHRyYW5zZmVyPzogRGVjb2RlZFRyYW5zZmVySW5zdHJ1Y3Rpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlIHx8XG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbiB8fFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdCB8fFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy50cmFuc2ZlclxuICApIHtcbiAgICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFsbG9jYXRlIHVuc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbidcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbikge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFzc2lnbiB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdCkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3Npbmcgc3BsaXQgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIGFuZCBhc3NpZ24gdGhlIHNhbWUgcHVibGljIGtleSdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuc3BhY2UgIT09IFN0YWtlUHJvZ3JhbS5zcGFjZSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgYEludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGFsbG9jYXRlICR7U3Rha2VQcm9ncmFtLnNwYWNlfSBieXRlc2BcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2UgYWNjb3VudCBtdXN0IGJlIGFzc2lnbmVkIHRvIHRoZSBTdGFrZSBQcm9ncmFtJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKSAhPT1cbiAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIHRoZSB1bnN0YWtpbmcgYWNjb3VudCcpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSA9PT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB0aGUgdW5zdGFraW5nIGFjY291bnQgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgU3Rha2UgQWNjb3VudCdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZnVuZGluZyBvZiB1bnN0YWtlIGFkZHJlc3MgaW5zdHJ1Y3Rpb24nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nICB3aXRoZHJhdyB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nV2l0aGRyYXcsIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyB3aXRoZHJhdyB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVdpdGhkcmF3KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3OiBTdGFraW5nV2l0aGRyYXcgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtZW1vIG9iamVjdCBmcm9tIGluc3RydWN0aW9ucyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtNZW1vIHwgdW5kZWZpbmVkfSAtIG1lbW8gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRNZW1vKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLCBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pOiBNZW1vIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKS5sZW5ndGg7XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSBpbnN0cnVjdGlvbnNMZW5ndGggJiYgaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10uZGF0YS50b1N0cmluZygpIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgUGF5ZXJBZGRyZXNzOiAwLFxuICBBVEFBZGRyZXNzOiAxLFxuICBPd25lckFkZHJlc3M6IDIsXG4gIE1pbnRBZGRyZXNzOiAzLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBpbml0aWFsaXplIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8QXRhSW5pdCB8IE1lbW8gfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUluaXQgfCBNZW1vIHwgTm9uY2U+ID0gW107XG4gIGxldCBtZW1vOiBNZW1vIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgbWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmIChtZW1vKSB7XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuY29uc3QgYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBBY2NvdW50QWRkcmVzczogMCxcbiAgRGVzdGluYXRpb25BZGRyZXNzOiAxLFxuICBBdXRob3JpdHlBZGRyZXNzOiAyLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjbG9zZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXRhQ2xvc2VJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxBdGFDbG9zZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUNsb3NlPiA9IFtdO1xuXG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGFjY291bnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuRGVzdGluYXRpb25BZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICB9LFxuICAgIH07XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYXV0aG9yaXplZCBzdGFraW5nIGFjY291bnQgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYXV0aG9yaXplIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemUgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BdXRob3JpemU6XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlQXV0aG9yaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLm5ld0F1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1dpdGhkcmF3QWRkcmVzczogYXV0aG9yaXplLmN1c3RvZGlhblB1YmtleT8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiA9IFtdO1xuICBhc3NlcnQoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMiwgJ0ludmFsaWQgbnVtYmVyIG9mIGluc3RydWN0aW9ucycpO1xuICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbnNbMF0pO1xuICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgIHBhcmFtczoge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gIGNvbnN0IGF1dGhvcml6ZSA9IGluc3RydWN0aW9uc1sxXTtcbiAgYXNzZXJ0KGF1dGhvcml6ZS5rZXlzLmxlbmd0aCA9PT0gNSwgJ0ludmFsaWQgbnVtYmVyIG9mIGtleXMgaW4gYXV0aG9yaXplIGluc3RydWN0aW9uJyk7XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplLFxuICAgIHBhcmFtczoge1xuICAgICAgc3Rha2luZ0FkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgb2xkQXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5mdW5jdGlvbiBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb2lucy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU29sQ29pbiAmJiB2YWx1ZS50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzKSB7XG4gICAgICB0b2tlbiA9IHZhbHVlLm5hbWU7XG4gICAgfVxuICB9KTtcblxuICBhc3NlcnQodG9rZW4pO1xuXG4gIHJldHVybiB0b2tlbjtcbn1cbiJdfQ==