@bitgo-beta/utxo-staking 1.1.1-beta.826 → 1.1.1-beta.827

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 (135) hide show
  1. package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
  2. package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
  3. package/dist/cjs/scripts/babylon-sync.js +126 -0
  4. package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
  5. package/dist/cjs/src/babylon/delegationMessage.js +285 -0
  6. package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
  7. package/dist/cjs/src/babylon/descriptor.js +97 -0
  8. package/dist/cjs/src/babylon/index.d.ts.map +1 -0
  9. package/dist/{src → cjs/src}/babylon/index.js +1 -1
  10. package/dist/cjs/src/babylon/network.d.ts.map +1 -0
  11. package/dist/{src → cjs/src}/babylon/network.js +1 -1
  12. package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
  13. package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
  14. package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
  15. package/dist/cjs/src/babylon/stakingManager.js +120 -0
  16. package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
  17. package/dist/cjs/src/babylon/stakingParams.js +132 -0
  18. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  19. package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
  20. package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
  21. package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
  22. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
  23. package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
  24. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  25. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  26. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  27. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  28. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  29. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  30. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  31. package/dist/cjs/src/coreDao/transaction.js +34 -0
  32. package/dist/cjs/src/index.d.ts.map +1 -0
  33. package/dist/{src → cjs/src}/index.js +1 -1
  34. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  35. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  36. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  37. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  38. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  39. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  40. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  41. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  42. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  43. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  44. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  45. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  46. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  47. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  48. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  49. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  50. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  51. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  52. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  53. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  54. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  55. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  56. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  57. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  58. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  59. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  60. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  61. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  62. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  63. package/dist/esm/babylon/delegationMessage.js +239 -0
  64. package/dist/esm/babylon/descriptor.d.ts +48 -0
  65. package/dist/esm/babylon/descriptor.js +91 -0
  66. package/dist/esm/babylon/index.d.ts +6 -0
  67. package/dist/esm/babylon/index.js +11 -0
  68. package/dist/esm/babylon/network.d.ts +7 -0
  69. package/dist/esm/babylon/network.js +29 -0
  70. package/dist/esm/babylon/params.mainnet.json +152 -0
  71. package/dist/esm/babylon/params.testnet.json +212 -0
  72. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  73. package/dist/esm/babylon/parseDescriptor.js +155 -0
  74. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  75. package/dist/esm/babylon/stakingManager.js +83 -0
  76. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  77. package/dist/esm/babylon/stakingParams.js +86 -0
  78. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  79. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  80. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  81. package/dist/esm/babylon/undelegation/index.js +3 -0
  82. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  83. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  84. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  85. package/dist/esm/coreDao/descriptor.js +35 -0
  86. package/dist/esm/coreDao/index.d.ts +4 -0
  87. package/dist/esm/coreDao/index.js +4 -0
  88. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  89. package/dist/esm/coreDao/opReturn.js +175 -0
  90. package/dist/esm/coreDao/transaction.d.ts +28 -0
  91. package/dist/esm/coreDao/transaction.js +30 -0
  92. package/dist/esm/index.d.ts +3 -0
  93. package/dist/esm/index.js +3 -0
  94. package/package.json +26 -10
  95. package/dist/src/babylon/delegationMessage.js +0 -285
  96. package/dist/src/babylon/descriptor.js +0 -97
  97. package/dist/src/babylon/parseDescriptor.js +0 -159
  98. package/dist/src/babylon/stakingManager.js +0 -120
  99. package/dist/src/babylon/stakingParams.js +0 -132
  100. package/dist/src/babylon/undelegation/unbonding.js +0 -111
  101. package/dist/src/coreDao/descriptor.js +0 -38
  102. package/dist/src/coreDao/opReturn.js +0 -183
  103. package/dist/src/coreDao/transaction.js +0 -34
  104. /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
  105. /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
  106. /package/dist/{src → cjs/src}/babylon/index.d.ts +0 -0
  107. /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
  108. /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
  109. /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
  110. /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
  111. /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
  112. /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
  113. /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
  114. /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
  115. /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
  116. /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
  117. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  118. /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
  119. /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
  120. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  121. /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
  122. /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
  123. /package/dist/{src → esm}/babylon/index.d.ts.map +0 -0
  124. /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
  125. /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
  126. /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
  127. /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
  128. /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
  129. /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
  130. /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
  131. /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
  132. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
  133. /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
  134. /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
  135. /package/dist/{src → esm}/index.d.ts.map +0 -0
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getECKey = getECKey;
40
+ exports.getECKeys = getECKeys;
41
+ exports.getXOnlyPubkey = getXOnlyPubkey;
42
+ exports.fromXOnlyPublicKey = fromXOnlyPublicKey;
43
+ const assert_1 = __importDefault(require("assert"));
44
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
45
+ const testutil_1 = require("@bitgo-beta/utxo-core/testutil");
46
+ function getECKey(seed) {
47
+ const { privateKey } = (0, testutil_1.getKey)(seed);
48
+ (0, assert_1.default)(privateKey);
49
+ return utxolib.ECPair.fromPrivateKey(privateKey);
50
+ }
51
+ function getECKeys(key, count) {
52
+ return Array.from({ length: count }, (_, i) => getECKey(`${key}${i}`));
53
+ }
54
+ function getXOnlyPubkey(key) {
55
+ return key.publicKey.subarray(1);
56
+ }
57
+ function fromXOnlyPublicKey(key) {
58
+ for (const prefix of [0x02, 0x03]) {
59
+ try {
60
+ return utxolib.ECPair.fromPublicKey(Buffer.concat([Buffer.from([prefix]), key]));
61
+ }
62
+ catch {
63
+ continue;
64
+ }
65
+ }
66
+ throw new Error('Invalid x-only public key');
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JhYnlsb24va2V5LnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsNEJBSUM7QUFFRCw4QkFFQztBQUVELHdDQUVDO0FBRUQsZ0RBU0M7QUE3QkQsb0RBQTRCO0FBRTVCLDhEQUFnRDtBQUVoRCw2REFBd0Q7QUFFeEQsU0FBZ0IsUUFBUSxDQUFDLElBQVk7SUFDbkMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUEsaUJBQU0sRUFBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ2xELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxHQUFvQjtJQUNqRCxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXO0lBQzVDLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLFNBQVM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IEVDUGFpckludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGdldEtleSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZS90ZXN0dXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFQ0tleShzZWVkOiBzdHJpbmcpOiBFQ1BhaXJJbnRlcmZhY2Uge1xuICBjb25zdCB7IHByaXZhdGVLZXkgfSA9IGdldEtleShzZWVkKTtcbiAgYXNzZXJ0KHByaXZhdGVLZXkpO1xuICByZXR1cm4gdXR4b2xpYi5FQ1BhaXIuZnJvbVByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFQ0tleXMoa2V5OiBzdHJpbmcsIGNvdW50OiBudW1iZXIpOiBFQ1BhaXJJbnRlcmZhY2VbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gZ2V0RUNLZXkoYCR7a2V5fSR7aX1gKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRYT25seVB1YmtleShrZXk6IEVDUGFpckludGVyZmFjZSk6IEJ1ZmZlciB7XG4gIHJldHVybiBrZXkucHVibGljS2V5LnN1YmFycmF5KDEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVhPbmx5UHVibGljS2V5KGtleTogQnVmZmVyKTogRUNQYWlySW50ZXJmYWNlIHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWzB4MDIsIDB4MDNdKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB1dHhvbGliLkVDUGFpci5mcm9tUHVibGljS2V5KEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFtwcmVmaXhdKSwga2V5XSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB4LW9ubHkgcHVibGljIGtleScpO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/transactions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const vendor = __importStar(require("@bitgo-beta/babylonlabs-io-btc-staking-ts"));
41
+ const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
42
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
43
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
44
+ const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
45
+ const testutil_1 = require("@bitgo-beta/utxo-core/testutil");
46
+ const babylonlabs_io_btc_staking_ts_1 = require("@bitgo-beta/babylonlabs-io-btc-staking-ts");
47
+ const babylon_1 = require("../../../src/babylon");
48
+ const parseDescriptor_1 = require("../../../src/babylon/parseDescriptor");
49
+ const fixtures_utils_1 = require("../fixtures.utils");
50
+ const key_utils_1 = require("./key.utils");
51
+ const vendor_utils_1 = require("./vendor.utils");
52
+ function getStakingTransactionTreeVendor(builder, amount, utxos, feeRateSatB, signers, descriptorBuilder) {
53
+ const staking = builder.createStakingTransaction(amount, utxos, feeRateSatB);
54
+ const stakingWithdraw = builder.createWithdrawStakingExpiredPsbt(staking.transaction, feeRateSatB);
55
+ const unbonding = builder.createUnbondingTransaction(staking.transaction);
56
+ const unbondingWithdraw = builder.createWithdrawEarlyUnbondedTransaction(unbonding.transaction, feeRateSatB);
57
+ const unbondingSlashing = builder.createUnbondingOutputSlashingPsbt(unbonding.transaction);
58
+ const signSequence = [signers.staker];
59
+ if ('finalityProvider' in signers) {
60
+ signSequence.push(signers.finalityProvider, ...signers.covenant);
61
+ }
62
+ const unbondingSlashingWithdraw = signSequence
63
+ ? builder.createWithdrawSlashingPsbt((0, babylon_1.forceFinalizePsbt)((0, babylon_1.getSignedPsbt)(unbondingSlashing.psbt, descriptorBuilder.getUnbondingDescriptor(), signSequence, {
64
+ finalize: false,
65
+ }), builder.network).extractTransaction(), feeRateSatB)
66
+ : undefined;
67
+ const slashing = builder.createStakingOutputSlashingPsbt(staking.transaction);
68
+ const slashingSigned = signSequence
69
+ ? (0, babylon_1.getSignedPsbt)(slashing.psbt, descriptorBuilder.getStakingDescriptor(), signSequence, {
70
+ finalize: false,
71
+ })
72
+ : undefined;
73
+ const slashingWithdraw = slashingSigned
74
+ ? builder.createWithdrawSlashingPsbt((0, babylon_1.forceFinalizePsbt)(slashingSigned.toBuffer(), builder.network).extractTransaction(), feeRateSatB)
75
+ : undefined;
76
+ return {
77
+ staking,
78
+ stakingWithdraw,
79
+ unbonding,
80
+ unbondingWithdraw,
81
+ unbondingSlashing,
82
+ unbondingSlashingWithdraw,
83
+ slashing,
84
+ slashingSigned,
85
+ slashingSignedBase64: slashingSigned?.toBuffer().toString('base64'),
86
+ slashingWithdraw,
87
+ };
88
+ }
89
+ function spendStakingOutput(stakingTx, descriptorBuilder, type, changeAddress, { sequence }) {
90
+ const network = utxolib.networks.bitcoin;
91
+ const witnessUtxoNumber = stakingTx.transaction.outs[0];
92
+ const witnessUtxo = {
93
+ script: witnessUtxoNumber.script,
94
+ value: BigInt(witnessUtxoNumber.value),
95
+ };
96
+ const selectTapLeafScript = wasm_utxo_1.Miniscript.fromString(wasm_utxo_1.ast.formatNode(type === 'unstaking'
97
+ ? descriptorBuilder.getStakingTimelockMiniscriptNode()
98
+ : descriptorBuilder.getUnbondingMiniscriptNode()), 'tap');
99
+ return (0, descriptor_1.createPsbt)({
100
+ network,
101
+ }, [
102
+ {
103
+ hash: stakingTx.transaction.getId(),
104
+ index: 0,
105
+ witnessUtxo,
106
+ descriptor: descriptorBuilder.getStakingDescriptor(),
107
+ selectTapLeafScript,
108
+ sequence,
109
+ },
110
+ ], [
111
+ {
112
+ script: utxolib.address.toOutputScript(changeAddress, network),
113
+ value: BigInt(witnessUtxoNumber.value) - 1000n,
114
+ },
115
+ ]);
116
+ }
117
+ function getTestnetStakingParamsWithCovenant(params, covenantKeys) {
118
+ return {
119
+ ...params,
120
+ covenantNoCoordPks: covenantKeys.map((pk) => (0, key_utils_1.getXOnlyPubkey)(pk).toString('hex')),
121
+ };
122
+ }
123
+ function wpkhDescriptor(key) {
124
+ return wasm_utxo_1.Descriptor.fromString(wasm_utxo_1.ast.formatNode({ wpkh: key.publicKey.toString('hex') }), 'definite');
125
+ }
126
+ function mockUtxo(descriptor) {
127
+ const scriptPubKey = Buffer.from(descriptor.scriptPubkey());
128
+ const witnessScript = Buffer.from(descriptor.encode());
129
+ return {
130
+ rawTxHex: undefined,
131
+ txid: Buffer.alloc(32).fill(0x11).toString('hex'),
132
+ value: 666666,
133
+ vout: 0,
134
+ redeemScript: undefined,
135
+ witnessScript: witnessScript.toString('hex'),
136
+ scriptPubKey: scriptPubKey.toString('hex'),
137
+ };
138
+ }
139
+ function parseScript(key, script) {
140
+ if (!Buffer.isBuffer(script)) {
141
+ throw new Error('script must be a buffer');
142
+ }
143
+ const ms = wasm_utxo_1.Miniscript.fromBitcoinScript(script, 'tap');
144
+ return {
145
+ script: script.toString('hex'),
146
+ miniscript: ms.toString(),
147
+ miniscriptAst: wasm_utxo_1.ast.fromMiniscript(ms),
148
+ scriptASM: utxolib.script.toASM(script).split(/\s+/),
149
+ };
150
+ }
151
+ function parseScripts(scripts) {
152
+ if (typeof scripts !== 'object' || scripts === null) {
153
+ throw new Error('scripts must be an object');
154
+ }
155
+ return Object.fromEntries(Object.entries(scripts).map(([key, value]) => [key, parseScript(key, value)]));
156
+ }
157
+ async function assertScriptsEqualFixture(fixtureName, builder, scripts) {
158
+ await (0, fixtures_utils_1.assertEqualsFixture)(fixtureName, {
159
+ builder: (0, testutil_1.toPlainObject)(builder),
160
+ scripts: parseScripts(scripts),
161
+ });
162
+ }
163
+ function assertEqualScripts(descriptorBuilder, builder) {
164
+ for (const [key, script] of Object.entries(builder)) {
165
+ switch (key) {
166
+ case 'timelockScript':
167
+ (0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getStakingTimelockMiniscriptNode());
168
+ break;
169
+ case 'unbondingScript':
170
+ (0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getUnbondingMiniscriptNode());
171
+ break;
172
+ case 'slashingScript':
173
+ (0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getSlashingMiniscriptNode());
174
+ break;
175
+ case 'unbondingTimelockScript':
176
+ (0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getUnbondingTimelockMiniscriptNode());
177
+ break;
178
+ default:
179
+ throw new Error(`unexpected script key: ${key}`);
180
+ }
181
+ }
182
+ }
183
+ function assertEqualOutputScript(outputInfo, descriptor) {
184
+ assert_1.default.strictEqual(outputInfo.scriptPubKey.toString('hex'), Buffer.from(descriptor.scriptPubkey()).toString('hex'));
185
+ }
186
+ function describeWithKeys(tag, finalityProviderKeys, covenantKeys, stakingParams, { signIntermediateTxs = false } = {}) {
187
+ const stakerKey = (0, key_utils_1.getECKey)('staker');
188
+ const covenantThreshold = stakingParams.covenantQuorum;
189
+ const stakingTimelock = stakingParams.minStakingTimeBlocks;
190
+ const unbondingTimelock = stakingParams.unbondingTime;
191
+ const vendorBuilder = new vendor.StakingScriptData((0, key_utils_1.getXOnlyPubkey)(stakerKey), finalityProviderKeys.map(key_utils_1.getXOnlyPubkey), covenantKeys.map(key_utils_1.getXOnlyPubkey), covenantThreshold, stakingTimelock, unbondingTimelock);
192
+ const descriptorBuilder = new babylon_1.BabylonDescriptorBuilder((0, key_utils_1.getXOnlyPubkey)(stakerKey), finalityProviderKeys.map(key_utils_1.getXOnlyPubkey), covenantKeys.map(key_utils_1.getXOnlyPubkey), covenantThreshold, stakingTimelock, unbondingTimelock);
193
+ describe(`Babylon Staking [${tag}]`, function () {
194
+ it('generates expected staking scripts', async function () {
195
+ await assertScriptsEqualFixture(`test/fixtures/babylon/scripts.${tag}.json`, vendorBuilder, vendorBuilder.buildScripts());
196
+ });
197
+ it('matches inner taproot scripts', function () {
198
+ assertEqualScripts(descriptorBuilder, vendorBuilder.buildScripts());
199
+ });
200
+ it('matches output scripts', function () {
201
+ assertEqualOutputScript(vendor.deriveStakingOutputInfo(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin), descriptorBuilder.getStakingDescriptor());
202
+ assertEqualOutputScript(
203
+ /* I don't know why this is called deriveSlashingOutput */
204
+ vendor.deriveSlashingOutput(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin), descriptorBuilder.getUnbondingTimelockDescriptor());
205
+ assertEqualOutputScript(vendor.deriveUnbondingOutputInfo(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin), descriptorBuilder.getUnbondingDescriptor());
206
+ });
207
+ it('round-trip parseStakingDescriptor', function () {
208
+ const descriptor = descriptorBuilder.getStakingDescriptor();
209
+ const parsed = (0, parseDescriptor_1.parseStakingDescriptor)(descriptor);
210
+ (0, assert_1.default)(parsed);
211
+ assert_1.default.deepStrictEqual(parsed.slashingMiniscriptNode, descriptorBuilder.getSlashingMiniscriptNode());
212
+ assert_1.default.deepStrictEqual(parsed.unbondingMiniscriptNode, descriptorBuilder.getUnbondingMiniscriptNode());
213
+ assert_1.default.deepStrictEqual(parsed.timelockMiniscriptNode, descriptorBuilder.getStakingTimelockMiniscriptNode());
214
+ assert_1.default.strictEqual((0, parseDescriptor_1.parseStakingDescriptor)(descriptorBuilder.getUnbondingDescriptor()), null);
215
+ assert_1.default.strictEqual((0, parseDescriptor_1.parseStakingDescriptor)(descriptorBuilder.getUnbondingTimelockDescriptor()), null);
216
+ });
217
+ it('round-trip parseUnbondingDescriptor', function () {
218
+ const descriptor = descriptorBuilder.getUnbondingDescriptor();
219
+ const parsed = (0, parseDescriptor_1.parseUnbondingDescriptor)(descriptor);
220
+ (0, assert_1.default)(parsed);
221
+ assert_1.default.deepStrictEqual(parsed.slashingMiniscriptNode, descriptorBuilder.getSlashingMiniscriptNode());
222
+ assert_1.default.deepStrictEqual(parsed.unbondingTimelockMiniscriptNode, descriptorBuilder.getUnbondingTimelockMiniscriptNode());
223
+ assert_1.default.deepStrictEqual(parsed.stakerKey, descriptorBuilder.stakerKey);
224
+ assert_1.default.deepStrictEqual((0, babylon_1.sortedKeys)(parsed.finalityProviderKeys), (0, babylon_1.sortedKeys)(descriptorBuilder.finalityProviderKeys));
225
+ assert_1.default.deepStrictEqual((0, babylon_1.sortedKeys)(parsed.covenantKeys), (0, babylon_1.sortedKeys)(descriptorBuilder.covenantKeys));
226
+ assert_1.default.strictEqual(parsed.covenantThreshold, descriptorBuilder.covenantThreshold);
227
+ assert_1.default.strictEqual(parsed.unbondingTimeLock, descriptorBuilder.unbondingTimeLock);
228
+ assert_1.default.strictEqual((0, parseDescriptor_1.parseUnbondingDescriptor)(descriptorBuilder.getStakingDescriptor()), null);
229
+ assert_1.default.strictEqual((0, parseDescriptor_1.parseUnbondingDescriptor)(descriptorBuilder.getUnbondingTimelockDescriptor()), null);
230
+ });
231
+ describe('Transaction Sets', async function () {
232
+ const stakerMainWalletKey = (0, key_utils_1.getECKey)('stakerMainWallet');
233
+ const mainWallet = wpkhDescriptor(stakerMainWalletKey);
234
+ const amount = 55555;
235
+ const changeAddress = (0, descriptor_1.createAddressFromDescriptor)(mainWallet, undefined, utxolib.networks.bitcoin);
236
+ const feeRateSatB = 2;
237
+ const utxo = mockUtxo(mainWallet);
238
+ let stakingTx;
239
+ before('setup stakingTx', function () {
240
+ stakingTx = vendor.stakingTransaction(vendorBuilder.buildScripts(), amount, changeAddress, [mockUtxo(mainWallet)], bitcoinjslib.networks.bitcoin, feeRateSatB);
241
+ });
242
+ it('has expected transactions', async function () {
243
+ await (0, fixtures_utils_1.assertTransactionEqualsFixture)(`test/fixtures/babylon/stakingTransaction.${tag}.json`, stakingTx);
244
+ // simply one staking output and one change output
245
+ // nothing special
246
+ assert_1.default.deepStrictEqual(stakingTx.transaction.outs, [
247
+ {
248
+ script: Buffer.from(descriptorBuilder.getStakingDescriptor().scriptPubkey()),
249
+ value: amount,
250
+ },
251
+ {
252
+ script: utxolib.address.toOutputScript(changeAddress, utxolib.networks.bitcoin),
253
+ value: utxo.value - amount - stakingTx.fee,
254
+ },
255
+ ]);
256
+ });
257
+ if (finalityProviderKeys.length !== 1) {
258
+ return;
259
+ }
260
+ const finalityProvider = finalityProviderKeys[0];
261
+ it('has expected transactions (vendorStaking.Staking)', async function () {
262
+ const vendorStakingTxBuilder = new vendor.Staking(bitcoinjslib.networks.bitcoin, (0, babylon_1.toStakerInfo)(stakerKey, changeAddress), stakingParams, [(0, key_utils_1.getXOnlyPubkey)(finalityProvider).toString('hex')], stakingParams.minStakingTimeBlocks);
263
+ const txTree = getStakingTransactionTreeVendor(vendorStakingTxBuilder, amount, [utxo], feeRateSatB, signIntermediateTxs
264
+ ? {
265
+ staker: stakerKey,
266
+ finalityProvider,
267
+ covenant: covenantKeys,
268
+ covenantThreshold: covenantThreshold,
269
+ }
270
+ : { staker: stakerKey }, descriptorBuilder);
271
+ await (0, fixtures_utils_1.assertTransactionEqualsFixture)(`test/fixtures/babylon/txTree.${tag}.json`, txTree);
272
+ });
273
+ it('creates MsgCreateBTCDelegation', async function () {
274
+ const fVendor = vendor_utils_1.getVendorMsgCreateBtcDelegation;
275
+ const fBitGo = vendor_utils_1.getBitGoUtxoStakingMsgCreateBtcDelegation;
276
+ for (const f of [fVendor, fBitGo]) {
277
+ await (0, fixtures_utils_1.assertEqualsFixture)(`test/fixtures/babylon/msgCreateBTCDelegation.${tag}.json`, await f(bitcoinjslib.networks.bitcoin, stakerKey, finalityProvider, descriptorBuilder, [{ ...stakingParams, version: 0, btcActivationHeight: 0 }], changeAddress, amount, utxo, feeRateSatB, 800000), fixtures_utils_1.normalize, (a, b) => {
278
+ // The vendor library serializes the signature as BIP322, while
279
+ // our implementation serializes it as ECDSA.
280
+ // Strip the pop field from the MsgCreateBTCDelegation.
281
+ function stripPop(v) {
282
+ const vAny = v;
283
+ delete vAny['unsignedDelegationMsg']['value']['pop'];
284
+ }
285
+ stripPop(a);
286
+ stripPop(b);
287
+ assert_1.default.deepStrictEqual(a, b);
288
+ });
289
+ }
290
+ });
291
+ async function testCreateTransaction(type, params) {
292
+ const unstakingPsbt = spendStakingOutput(stakingTx, descriptorBuilder, type, changeAddress, params);
293
+ const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(unstakingPsbt);
294
+ params.signers.forEach((signer) => {
295
+ (0, assert_1.default)((0, descriptor_1.getNewSignatureCount)((0, descriptor_1.signWithKey)(wrappedPsbt, signer)) > 0);
296
+ });
297
+ if (!params.finalize) {
298
+ return;
299
+ }
300
+ wrappedPsbt.finalize();
301
+ const tx = (0, descriptor_1.toUtxoPsbt)(wrappedPsbt, utxolib.networks.bitcoin).extractTransaction();
302
+ await (0, fixtures_utils_1.assertTransactionEqualsFixture)(`test/fixtures/babylon/${type}Transaction.${tag}.json`, {
303
+ psbt: unstakingPsbt,
304
+ transaction: tx,
305
+ });
306
+ }
307
+ it('creates unstaking transaction', async function () {
308
+ await testCreateTransaction('unstaking', {
309
+ sequence: stakingParams.minStakingTimeBlocks,
310
+ signers: [stakerKey],
311
+ finalize: true,
312
+ });
313
+ });
314
+ it('creates unbonding transaction', async function () {
315
+ await testCreateTransaction('unbonding', signIntermediateTxs
316
+ ? {
317
+ signers: [stakerKey, ...covenantKeys],
318
+ finalize: true,
319
+ }
320
+ : {
321
+ signers: [stakerKey],
322
+ finalize: false,
323
+ });
324
+ });
325
+ });
326
+ });
327
+ }
328
+ function describeWithKeysFromStakingParams(tag, finalityProviderKeys, stakingParams) {
329
+ describeWithKeys(tag, finalityProviderKeys, stakingParams.covenantNoCoordPks.map((pk) => (0, key_utils_1.fromXOnlyPublicKey)(Buffer.from(pk, 'hex'))), stakingParams);
330
+ }
331
+ function describeWithMockKeys(tag, stakingParams, finalityProviderKeys, covenantKeys) {
332
+ describeWithKeys(tag, finalityProviderKeys, covenantKeys, getTestnetStakingParamsWithCovenant(stakingParams, covenantKeys), {
333
+ signIntermediateTxs: true,
334
+ });
335
+ }
336
+ describeWithKeysFromStakingParams('testnet', [(0, key_utils_1.fromXOnlyPublicKey)(babylon_1.testnetFinalityProvider0)], (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByVersion)(5, (0, babylon_1.getStakingParams)('testnet')));
337
+ describeWithMockKeys('testnetMock', (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByVersion)(5, (0, babylon_1.getStakingParams)('testnet')), (0, key_utils_1.getECKeys)('finalityProvider', 1), (0, key_utils_1.getECKeys)('covenant', 9));
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JhYnlsb24vdHJhbnNhY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLGtGQUFvRTtBQUNwRSw0REFBOEM7QUFDOUMsOERBQWdEO0FBRWhELGdEQUErRDtBQUMvRCxpRUFPMEM7QUFDMUMsNkRBQStEO0FBQy9ELDZGQUFxRjtBQUVyRixrREFROEI7QUFDOUIsMEVBQXdHO0FBQ3hHLHNEQUsyQjtBQUUzQiwyQ0FBc0Y7QUFDdEYsaURBQTRHO0FBcUI1RyxTQUFTLCtCQUErQixDQUN0QyxPQUF1QixFQUN2QixNQUFjLEVBQ2QsS0FBb0IsRUFDcEIsV0FBbUIsRUFDbkIsT0FPK0IsRUFDL0IsaUJBQTJDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUUsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsc0NBQXNDLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxrQkFBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztR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QW1DLEVBQ25DLG9CQUF1QyxFQUN2QyxZQUErQjtJQUUvQixnQkFBZ0IsQ0FDZCxHQUFHLEVBQ0gsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixtQ0FBbUMsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLEVBQ2hFO1FBQ0UsbUJBQW1CLEVBQUUsSUFBSTtLQUMxQixDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsaUNBQWlDLENBQy9CLFNBQVMsRUFDVCxDQUFDLElBQUEsOEJBQWtCLEVBQUMsa0NBQXdCLENBQUMsQ0FBQyxFQUM5QyxJQUFBLHdEQUF3QixFQUFDLENBQUMsRUFBRSxJQUFBLDBCQUFnQixFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3pELENBQUM7QUFDRixvQkFBb0IsQ0FDbEIsYUFBYSxFQUNiLElBQUEsd0RBQXdCLEVBQUMsQ0FBQyxFQUFFLElBQUEsMEJBQWdCLEVBQUMsU0FBUyxDQUFDLENBQUMsRUFDeEQsSUFBQSxxQkFBUyxFQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxFQUNoQyxJQUFBLHFCQUFTLEVBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB2ZW5kb3IgZnJvbSAnQGJpdGdvLWJldGEvYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuaW1wb3J0ICogYXMgYml0Y29pbmpzbGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBhc3QsIERlc2NyaXB0b3IsIE1pbmlzY3JpcHQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7XG4gIGNyZWF0ZUFkZHJlc3NGcm9tRGVzY3JpcHRvcixcbiAgY3JlYXRlUHNidCxcbiAgZ2V0TmV3U2lnbmF0dXJlQ291bnQsXG4gIHNpZ25XaXRoS2V5LFxuICB0b1V0eG9Qc2J0LFxuICB0b1dyYXBwZWRQc2J0LFxufSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5pbXBvcnQgeyB0b1BsYWluT2JqZWN0IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL3Rlc3R1dGlsJztcbmltcG9ydCB7IGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbiB9IGZyb20gJ0BiaXRnby1iZXRhL2JhYnlsb25sYWJzLWlvLWJ0Yy1zdGFraW5nLXRzJztcblxuaW1wb3J0IHtcbiAgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyLFxuICB0ZXN0bmV0RmluYWxpdHlQcm92aWRlcjAsXG4gIGdldFNpZ25lZFBzYnQsXG4gIGdldFN0YWtpbmdQYXJhbXMsXG4gIHRvU3Rha2VySW5mbyxcbiAgZm9yY2VGaW5hbGl6ZVBzYnQsXG4gIHNvcnRlZEtleXMsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uJztcbmltcG9ydCB7IHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3IsIHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uL3BhcnNlRGVzY3JpcHRvcic7XG5pbXBvcnQge1xuICBub3JtYWxpemUsXG4gIGFzc2VydEVxdWFsc0ZpeHR1cmUsXG4gIGFzc2VydEVxdWFsc01pbmlzY3JpcHQsXG4gIGFzc2VydFRyYW5zYWN0aW9uRXF1YWxzRml4dHVyZSxcbn0gZnJvbSAnLi4vZml4dHVyZXMudXRpbHMnO1xuXG5pbXBvcnQgeyBmcm9tWE9ubHlQdWJsaWNLZXksIGdldEVDS2V5LCBnZXRFQ0tleXMsIGdldFhPbmx5UHVia2V5IH0gZnJvbSAnLi9rZXkudXRpbHMnO1xuaW1wb3J0IHsgZ2V0Qml0R29VdHhvU3Rha2luZ01zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb24sIGdldFZlbmRvck1zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb24gfSBmcm9tICcuL3ZlbmRvci51dGlscyc7XG5cbnR5cGUgV2l0aEZlZTxUPiA9IFQgJiB7IGZlZTogbnVtYmVyIH07XG50eXBlIFRyYW5zYWN0aW9uV2l0aEZlZSA9IFdpdGhGZWU8eyB0cmFuc2FjdGlvbjogYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uIH0+O1xudHlwZSBQc2J0V2l0aEZlZSA9IFdpdGhGZWU8eyBwc2J0OiBiaXRjb2luanNsaWIuUHNidCB9PjtcblxudHlwZSBUcmFuc2FjdGlvblRyZWUgPSB7XG4gIHN0YWtpbmc6IFRyYW5zYWN0aW9uV2l0aEZlZTtcbiAgc3Rha2luZ1dpdGhkcmF3OiBQc2J0V2l0aEZlZTtcblxuICB1bmJvbmRpbmc6IFRyYW5zYWN0aW9uV2l0aEZlZTtcbiAgdW5ib25kaW5nV2l0aGRyYXc6IFBzYnRXaXRoRmVlO1xuICB1bmJvbmRpbmdTbGFzaGluZzogUHNidFdpdGhGZWU7XG4gIHVuYm9uZGluZ1NsYXNoaW5nV2l0aGRyYXc6IFBzYnRXaXRoRmVlIHwgdW5kZWZpbmVkO1xuXG4gIHNsYXNoaW5nOiBQc2J0V2l0aEZlZTtcbiAgc2xhc2hpbmdXaXRoZHJhdzogUHNidFdpdGhGZWUgfCB1bmRlZmluZWQ7XG4gIHNsYXNoaW5nU2lnbmVkOiBiaXRjb2luanNsaWIuUHNidCB8IHVuZGVmaW5lZDtcbiAgc2xhc2hpbmdTaWduZWRCYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUcmFuc2FjdGlvblRyZWVWZW5kb3IoXG4gIGJ1aWxkZXI6IHZlbmRvci5TdGFraW5nLFxuICBhbW91bnQ6IG51bWJlcixcbiAgdXR4b3M6IHZlbmRvci5VVFhPW10sXG4gIGZlZVJhdGVTYXRCOiBudW1iZXIsXG4gIHNpZ25lcnM6XG4gICAgfCB7XG4gICAgICAgIHN0YWtlcjogRUNQYWlySW50ZXJmYWNlO1xuICAgICAgICBmaW5hbGl0eVByb3ZpZGVyOiBFQ1BhaXJJbnRlcmZhY2U7XG4gICAgICAgIGNvdmVuYW50OiBFQ1BhaXJJbnRlcmZhY2VbXTtcbiAgICAgICAgY292ZW5hbnRUaHJlc2hvbGQ6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IHsgc3Rha2VyOiBFQ1BhaXJJbnRlcmZhY2UgfSxcbiAgZGVzY3JpcHRvckJ1aWxkZXI6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlclxuKTogVHJhbnNhY3Rpb25UcmVlIHtcbiAgY29uc3Qgc3Rha2luZyA9IGJ1aWxkZXIuY3JlYXRlU3Rha2luZ1RyYW5zYWN0aW9uKGFtb3VudCwgdXR4b3MsIGZlZVJhdGVTYXRCKTtcbiAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3ID0gYnVpbGRlci5jcmVhdGVXaXRoZHJhd1N0YWtpbmdFeHBpcmVkUHNidChzdGFraW5nLnRyYW5zYWN0aW9uLCBmZWVSYXRlU2F0Qik7XG4gIGNvbnN0IHVuYm9uZGluZyA9IGJ1aWxkZXIuY3JlYXRlVW5ib25kaW5nVHJhbnNhY3Rpb24oc3Rha2luZy50cmFuc2FjdGlvbik7XG4gIGNvbnN0IHVuYm9uZGluZ1dpdGhkcmF3ID0gYnVpbGRlci5jcmVhdGVXaXRoZHJhd0Vhcmx5VW5ib25kZWRUcmFuc2FjdGlvbih1bmJvbmRpbmcudHJhbnNhY3Rpb24sIGZlZVJhdGVTYXRCKTtcbiAgY29uc3QgdW5ib25kaW5nU2xhc2hpbmcgPSBidWlsZGVyLmNyZWF0ZVVuYm9uZGluZ091dHB1dFNsYXNoaW5nUHNidCh1bmJvbmRpbmcudHJhbnNhY3Rpb24pO1xuICBjb25zdCBzaWduU2VxdWVuY2UgPSBbc2lnbmVycy5zdGFrZXJdO1xuICBpZiAoJ2ZpbmFsaXR5UHJvdmlkZXInIGluIHNpZ25lcnMpIHtcbiAgICBzaWduU2VxdWVuY2UucHVzaChzaWduZXJzLmZpbmFsaXR5UHJvdmlkZXIsIC4uLnNpZ25lcnMuY292ZW5hbnQpO1xuICB9XG4gIGNvbnN0IHVuYm9uZGluZ1NsYXNoaW5nV2l0aGRyYXcgPSBzaWduU2VxdWVuY2VcbiAgICA/IGJ1aWxkZXIuY3JlYXRlV2l0aGRyYXdTbGFzaGluZ1BzYnQoXG4gICAgICAgIGZvcmNlRmluYWxpemVQc2J0KFxuICAgICAgICAgIGdldFNpZ25lZFBzYnQodW5ib25kaW5nU2xhc2hpbmcucHNidCwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nRGVzY3JpcHRvcigpLCBzaWduU2VxdWVuY2UsIHtcbiAgICAgICAgICAgIGZpbmFsaXplOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBidWlsZGVyLm5ldHdvcmtcbiAgICAgICAgKS5leHRyYWN0VHJhbnNhY3Rpb24oKSxcbiAgICAgICAgZmVlUmF0ZVNhdEJcbiAgICAgIClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2xhc2hpbmcgPSBidWlsZGVyLmNyZWF0ZVN0YWtpbmdPdXRwdXRTbGFzaGluZ1BzYnQoc3Rha2luZy50cmFuc2FjdGlvbik7XG4gIGNvbnN0IHNsYXNoaW5nU2lnbmVkID0gc2lnblNlcXVlbmNlXG4gICAgPyBnZXRTaWduZWRQc2J0KHNsYXNoaW5nLnBzYnQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCksIHNpZ25TZXF1ZW5jZSwge1xuICAgICAgICBmaW5hbGl6ZTogZmFsc2UsXG4gICAgICB9KVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzbGFzaGluZ1dpdGhkcmF3ID0gc2xhc2hpbmdTaWduZWRcbiAgICA/IGJ1aWxkZXIuY3JlYXRlV2l0aGRyYXdTbGFzaGluZ1BzYnQoXG4gICAgICAgIGZvcmNlRmluYWxpemVQc2J0KHNsYXNoaW5nU2lnbmVkLnRvQnVmZmVyKCksIGJ1aWxkZXIubmV0d29yaykuZXh0cmFjdFRyYW5zYWN0aW9uKCksXG4gICAgICAgIGZlZVJhdGVTYXRCXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFraW5nLFxuICAgIHN0YWtpbmdXaXRoZHJhdyxcbiAgICB1bmJvbmRpbmcsXG4gICAgdW5ib25kaW5nV2l0aGRyYXcsXG4gICAgdW5ib25kaW5nU2xhc2hpbmcsXG4gICAgdW5ib25kaW5nU2xhc2hpbmdXaXRoZHJhdyxcbiAgICBzbGFzaGluZyxcbiAgICBzbGFzaGluZ1NpZ25lZCxcbiAgICBzbGFzaGluZ1NpZ25lZEJhc2U2NDogc2xhc2hpbmdTaWduZWQ/LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIHNsYXNoaW5nV2l0aGRyYXcsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNwZW5kU3Rha2luZ091dHB1dChcbiAgc3Rha2luZ1R4OiB2ZW5kb3IuVHJhbnNhY3Rpb25SZXN1bHQsXG4gIGRlc2NyaXB0b3JCdWlsZGVyOiBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIsXG4gIHR5cGU6ICd1bnN0YWtpbmcnIHwgJ3VuYm9uZGluZycsXG4gIGNoYW5nZUFkZHJlc3M6IHN0cmluZyxcbiAgeyBzZXF1ZW5jZSB9OiB7IHNlcXVlbmNlPzogbnVtYmVyIH1cbik6IHV0eG9saWIuUHNidCB7XG4gIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW47XG4gIGNvbnN0IHdpdG5lc3NVdHhvTnVtYmVyID0gc3Rha2luZ1R4LnRyYW5zYWN0aW9uLm91dHNbMF07XG4gIGNvbnN0IHdpdG5lc3NVdHhvID0ge1xuICAgIHNjcmlwdDogd2l0bmVzc1V0eG9OdW1iZXIuc2NyaXB0LFxuICAgIHZhbHVlOiBCaWdJbnQod2l0bmVzc1V0eG9OdW1iZXIudmFsdWUpLFxuICB9O1xuICBjb25zdCBzZWxlY3RUYXBMZWFmU2NyaXB0ID0gTWluaXNjcmlwdC5mcm9tU3RyaW5nKFxuICAgIGFzdC5mb3JtYXROb2RlKFxuICAgICAgdHlwZSA9PT0gJ3Vuc3Rha2luZydcbiAgICAgICAgPyBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpXG4gICAgICAgIDogZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKVxuICAgICksXG4gICAgJ3RhcCdcbiAgKTtcbiAgcmV0dXJuIGNyZWF0ZVBzYnQoXG4gICAge1xuICAgICAgbmV0d29yayxcbiAgICB9LFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgaGFzaDogc3Rha2luZ1R4LnRyYW5zYWN0aW9uLmdldElkKCksXG4gICAgICAgIGluZGV4OiAwLFxuICAgICAgICB3aXRuZXNzVXR4byxcbiAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKSxcbiAgICAgICAgc2VsZWN0VGFwTGVhZlNjcmlwdCxcbiAgICAgICAgc2VxdWVuY2UsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAge1xuICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChjaGFuZ2VBZGRyZXNzLCBuZXR3b3JrKSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCh3aXRuZXNzVXR4b051bWJlci52YWx1ZSkgLSAxMDAwbixcbiAgICAgIH0sXG4gICAgXVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRUZXN0bmV0U3Rha2luZ1BhcmFtc1dpdGhDb3ZlbmFudChcbiAgcGFyYW1zOiB2ZW5kb3IuU3Rha2luZ1BhcmFtcyxcbiAgY292ZW5hbnRLZXlzOiBFQ1BhaXJJbnRlcmZhY2VbXVxuKTogdmVuZG9yLlN0YWtpbmdQYXJhbXMge1xuICByZXR1cm4ge1xuICAgIC4uLnBhcmFtcyxcbiAgICBjb3ZlbmFudE5vQ29vcmRQa3M6IGNvdmVuYW50S2V5cy5tYXAoKHBrKSA9PiBnZXRYT25seVB1YmtleShwaykudG9TdHJpbmcoJ2hleCcpKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd3BraERlc2NyaXB0b3Ioa2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZSk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKHsgd3BraDoga2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JykgfSksICdkZWZpbml0ZScpO1xufVxuXG5mdW5jdGlvbiBtb2NrVXR4byhkZXNjcmlwdG9yOiBEZXNjcmlwdG9yKTogdmVuZG9yLlVUWE8ge1xuICBjb25zdCBzY3JpcHRQdWJLZXkgPSBCdWZmZXIuZnJvbShkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKTtcbiAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3IuZW5jb2RlKCkpO1xuICByZXR1cm4ge1xuICAgIHJhd1R4SGV4OiB1bmRlZmluZWQsXG4gICAgdHhpZDogQnVmZmVyLmFsbG9jKDMyKS5maWxsKDB4MTEpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB2YWx1ZTogNjY2XzY2NixcbiAgICB2b3V0OiAwLFxuICAgIHJlZGVlbVNjcmlwdDogdW5kZWZpbmVkLFxuICAgIHdpdG5lc3NTY3JpcHQ6IHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgIHNjcmlwdFB1YktleTogc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTY3JpcHQoa2V5OiBzdHJpbmcsIHNjcmlwdDogdW5rbm93bikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihzY3JpcHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY3JpcHQgbXVzdCBiZSBhIGJ1ZmZlcicpO1xuICB9XG4gIGNvbnN0IG1zID0gTWluaXNjcmlwdC5mcm9tQml0Y29pblNjcmlwdChzY3JpcHQsICd0YXAnKTtcbiAgcmV0dXJuIHtcbiAgICBzY3JpcHQ6IHNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgbWluaXNjcmlwdDogbXMudG9TdHJpbmcoKSxcbiAgICBtaW5pc2NyaXB0QXN0OiBhc3QuZnJvbU1pbmlzY3JpcHQobXMpLFxuICAgIHNjcmlwdEFTTTogdXR4b2xpYi5zY3JpcHQudG9BU00oc2NyaXB0KS5zcGxpdCgvXFxzKy8pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNjcmlwdHMoc2NyaXB0czogdW5rbm93bikge1xuICBpZiAodHlwZW9mIHNjcmlwdHMgIT09ICdvYmplY3QnIHx8IHNjcmlwdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjcmlwdHMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBwYXJzZVNjcmlwdChrZXksIHZhbHVlKV0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0U2NyaXB0c0VxdWFsRml4dHVyZShcbiAgZml4dHVyZU5hbWU6IHN0cmluZyxcbiAgYnVpbGRlcjogdmVuZG9yLlN0YWtpbmdTY3JpcHREYXRhLFxuICBzY3JpcHRzOiB1bmtub3duXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXNzZXJ0RXF1YWxzRml4dHVyZShmaXh0dXJlTmFtZSwge1xuICAgIGJ1aWxkZXI6IHRvUGxhaW5PYmplY3QoYnVpbGRlciksXG4gICAgc2NyaXB0czogcGFyc2VTY3JpcHRzKHNjcmlwdHMpLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RXF1YWxTY3JpcHRzKGRlc2NyaXB0b3JCdWlsZGVyOiBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIsIGJ1aWxkZXI6IHZlbmRvci5TdGFraW5nU2NyaXB0cykge1xuICBmb3IgKGNvbnN0IFtrZXksIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoYnVpbGRlcikgYXMgW2tleW9mIHZlbmRvci5TdGFraW5nU2NyaXB0cywgQnVmZmVyXVtdKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ3RpbWVsb2NrU2NyaXB0JzpcbiAgICAgICAgYXNzZXJ0RXF1YWxzTWluaXNjcmlwdChzY3JpcHQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VuYm9uZGluZ1NjcmlwdCc6XG4gICAgICAgIGFzc2VydEVxdWFsc01pbmlzY3JpcHQoc2NyaXB0LCBkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdNaW5pc2NyaXB0Tm9kZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzbGFzaGluZ1NjcmlwdCc6XG4gICAgICAgIGFzc2VydEVxdWFsc01pbmlzY3JpcHQoc2NyaXB0LCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTbGFzaGluZ01pbmlzY3JpcHROb2RlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VuYm9uZGluZ1RpbWVsb2NrU2NyaXB0JzpcbiAgICAgICAgYXNzZXJ0RXF1YWxzTWluaXNjcmlwdChzY3JpcHQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHNjcmlwdCBrZXk6ICR7a2V5fWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRFcXVhbE91dHB1dFNjcmlwdChvdXRwdXRJbmZvOiB7IHNjcmlwdFB1YktleTogQnVmZmVyIH0sIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpIHtcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dEluZm8uc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVXaXRoS2V5cyhcbiAgdGFnOiBzdHJpbmcsXG4gIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBFQ1BhaXJJbnRlcmZhY2VbXSxcbiAgY292ZW5hbnRLZXlzOiBFQ1BhaXJJbnRlcmZhY2VbXSxcbiAgc3Rha2luZ1BhcmFtczogdmVuZG9yLlN0YWtpbmdQYXJhbXMsXG4gIHsgc2lnbkludGVybWVkaWF0ZVR4cyA9IGZhbHNlIH0gPSB7fVxuKSB7XG4gIGNvbnN0IHN0YWtlcktleSA9IGdldEVDS2V5KCdzdGFrZXInKSBhcyBFQ1BhaXJJbnRlcmZhY2UgJiB7IHByaXZhdGVLZXk6IEJ1ZmZlciB9O1xuICBjb25zdCBjb3ZlbmFudFRocmVzaG9sZCA9IHN0YWtpbmdQYXJhbXMuY292ZW5hbnRRdW9ydW07XG4gIGNvbnN0IHN0YWtpbmdUaW1lbG9jayA9IHN0YWtpbmdQYXJhbXMubWluU3Rha2luZ1RpbWVCbG9ja3M7XG4gIGNvbnN0IHVuYm9uZGluZ1RpbWVsb2NrID0gc3Rha2luZ1BhcmFtcy51bmJvbmRpbmdUaW1lO1xuICBjb25zdCB2ZW5kb3JCdWlsZGVyID0gbmV3IHZlbmRvci5TdGFraW5nU2NyaXB0RGF0YShcbiAgICBnZXRYT25seVB1YmtleShzdGFrZXJLZXkpLFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLm1hcChnZXRYT25seVB1YmtleSksXG4gICAgY292ZW5hbnRLZXlzLm1hcChnZXRYT25seVB1YmtleSksXG4gICAgY292ZW5hbnRUaHJlc2hvbGQsXG4gICAgc3Rha2luZ1RpbWVsb2NrLFxuICAgIHVuYm9uZGluZ1RpbWVsb2NrXG4gICk7XG5cbiAgY29uc3QgZGVzY3JpcHRvckJ1aWxkZXIgPSBuZXcgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyKFxuICAgIGdldFhPbmx5UHVia2V5KHN0YWtlcktleSksXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMubWFwKGdldFhPbmx5UHVia2V5KSxcbiAgICBjb3ZlbmFudEtleXMubWFwKGdldFhPbmx5UHVia2V5KSxcbiAgICBjb3ZlbmFudFRocmVzaG9sZCxcbiAgICBzdGFraW5nVGltZWxvY2ssXG4gICAgdW5ib25kaW5nVGltZWxvY2tcbiAgKTtcblxuICBkZXNjcmliZShgQmFieWxvbiBTdGFraW5nIFske3RhZ31dYCwgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdnZW5lcmF0ZXMgZXhwZWN0ZWQgc3Rha2luZyBzY3JpcHRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0U2NyaXB0c0VxdWFsRml4dHVyZShcbiAgICAgICAgYHRlc3QvZml4dHVyZXMvYmFieWxvbi9zY3JpcHRzLiR7dGFnfS5qc29uYCxcbiAgICAgICAgdmVuZG9yQnVpbGRlcixcbiAgICAgICAgdmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXRjaGVzIGlubmVyIHRhcHJvb3Qgc2NyaXB0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydEVxdWFsU2NyaXB0cyhkZXNjcmlwdG9yQnVpbGRlciwgdmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWF0Y2hlcyBvdXRwdXQgc2NyaXB0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydEVxdWFsT3V0cHV0U2NyaXB0KFxuICAgICAgICB2ZW5kb3IuZGVyaXZlU3Rha2luZ091dHB1dEluZm8odmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKSwgYml0Y29pbmpzbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgICBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpXG4gICAgICApO1xuICAgICAgYXNzZXJ0RXF1YWxPdXRwdXRTY3JpcHQoXG4gICAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBpcyBjYWxsZWQgZGVyaXZlU2xhc2hpbmdPdXRwdXQgKi9cbiAgICAgICAgdmVuZG9yLmRlcml2ZVNsYXNoaW5nT3V0cHV0KHZlbmRvckJ1aWxkZXIuYnVpbGRTY3JpcHRzKCksIGJpdGNvaW5qc2xpYi5uZXR3b3Jrcy5iaXRjb2luKSxcbiAgICAgICAgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nVGltZWxvY2tEZXNjcmlwdG9yKClcbiAgICAgICk7XG4gICAgICBhc3NlcnRFcXVhbE91dHB1dFNjcmlwdChcbiAgICAgICAgdmVuZG9yLmRlcml2ZVVuYm9uZGluZ091dHB1dEluZm8odmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKSwgYml0Y29pbmpzbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgICBkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdEZXNjcmlwdG9yKClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcCBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yKGRlc2NyaXB0b3IpO1xuXG4gICAgICBhc3NlcnQocGFyc2VkKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLnNsYXNoaW5nTWluaXNjcmlwdE5vZGUsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFNsYXNoaW5nTWluaXNjcmlwdE5vZGUoKSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC51bmJvbmRpbmdNaW5pc2NyaXB0Tm9kZSwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC50aW1lbG9ja01pbmlzY3JpcHROb2RlLCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3IoZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nRGVzY3JpcHRvcigpKSwgbnVsbCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VTdGFraW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdUaW1lbG9ja0Rlc2NyaXB0b3IoKSksIG51bGwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JvdW5kLXRyaXAgcGFyc2VVbmJvbmRpbmdEZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ0Rlc2NyaXB0b3IoKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yKTtcblxuICAgICAgYXNzZXJ0KHBhcnNlZCk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC5zbGFzaGluZ01pbmlzY3JpcHROb2RlLCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTbGFzaGluZ01pbmlzY3JpcHROb2RlKCkpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgcGFyc2VkLnVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUsXG4gICAgICAgIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKVxuICAgICAgKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLnN0YWtlcktleSwgZGVzY3JpcHRvckJ1aWxkZXIuc3Rha2VyS2V5KTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICAgIHNvcnRlZEtleXMocGFyc2VkLmZpbmFsaXR5UHJvdmlkZXJLZXlzKSxcbiAgICAgICAgc29ydGVkS2V5cyhkZXNjcmlwdG9yQnVpbGRlci5maW5hbGl0eVByb3ZpZGVyS2V5cylcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNvcnRlZEtleXMocGFyc2VkLmNvdmVuYW50S2V5cyksIHNvcnRlZEtleXMoZGVzY3JpcHRvckJ1aWxkZXIuY292ZW5hbnRLZXlzKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmNvdmVuYW50VGhyZXNob2xkLCBkZXNjcmlwdG9yQnVpbGRlci5jb3ZlbmFudFRocmVzaG9sZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLnVuYm9uZGluZ1RpbWVMb2NrLCBkZXNjcmlwdG9yQnVpbGRlci51bmJvbmRpbmdUaW1lTG9jayk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZVVuYm9uZGluZ0Rlc2NyaXB0b3IoZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKSksIG51bGwpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdUaW1lbG9ja0Rlc2NyaXB0b3IoKSksIG51bGwpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFNldHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFrZXJNYWluV2FsbGV0S2V5ID0gZ2V0RUNLZXkoJ3N0YWtlck1haW5XYWxsZXQnKTtcbiAgICAgIGNvbnN0IG1haW5XYWxsZXQgPSB3cGtoRGVzY3JpcHRvcihzdGFrZXJNYWluV2FsbGV0S2V5KTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDU1XzU1NTtcbiAgICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSBjcmVhdGVBZGRyZXNzRnJvbURlc2NyaXB0b3IobWFpbldhbGxldCwgdW5kZWZpbmVkLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgY29uc3QgZmVlUmF0ZVNhdEIgPSAyO1xuICAgICAgY29uc3QgdXR4byA9IG1vY2tVdHhvKG1haW5XYWxsZXQpO1xuXG4gICAgICBsZXQgc3Rha2luZ1R4OiB2ZW5kb3IuVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGJlZm9yZSgnc2V0dXAgc3Rha2luZ1R4JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGFraW5nVHggPSB2ZW5kb3Iuc3Rha2luZ1RyYW5zYWN0aW9uKFxuICAgICAgICAgIHZlbmRvckJ1aWxkZXIuYnVpbGRTY3JpcHRzKCksXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIGNoYW5nZUFkZHJlc3MsXG4gICAgICAgICAgW21vY2tVdHhvKG1haW5XYWxsZXQpXSxcbiAgICAgICAgICBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICBmZWVSYXRlU2F0QlxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoYHRlc3QvZml4dHVyZXMvYmFieWxvbi9zdGFraW5nVHJhbnNhY3Rpb24uJHt0YWd9Lmpzb25gLCBzdGFraW5nVHgpO1xuXG4gICAgICAgIC8vIHNpbXBseSBvbmUgc3Rha2luZyBvdXRwdXQgYW5kIG9uZSBjaGFuZ2Ugb3V0cHV0XG4gICAgICAgIC8vIG5vdGhpbmcgc3BlY2lhbFxuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHN0YWtpbmdUeC50cmFuc2FjdGlvbi5vdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NyaXB0OiBCdWZmZXIuZnJvbShkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpLnNjcmlwdFB1YmtleSgpKSxcbiAgICAgICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChjaGFuZ2VBZGRyZXNzLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgICAgICAgdmFsdWU6IHV0eG8udmFsdWUgLSBhbW91bnQgLSBzdGFraW5nVHguZmVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaW5hbGl0eVByb3ZpZGVyS2V5cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaW5hbGl0eVByb3ZpZGVyID0gZmluYWxpdHlQcm92aWRlcktleXNbMF07XG5cbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgdHJhbnNhY3Rpb25zICh2ZW5kb3JTdGFraW5nLlN0YWtpbmcpJywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgdmVuZG9yU3Rha2luZ1R4QnVpbGRlciA9IG5ldyB2ZW5kb3IuU3Rha2luZyhcbiAgICAgICAgICBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICB0b1N0YWtlckluZm8oc3Rha2VyS2V5LCBjaGFuZ2VBZGRyZXNzKSxcbiAgICAgICAgICBzdGFraW5nUGFyYW1zLFxuICAgICAgICAgIFtnZXRYT25seVB1YmtleShmaW5hbGl0eVByb3ZpZGVyKS50b1N0cmluZygnaGV4JyldLFxuICAgICAgICAgIHN0YWtpbmdQYXJhbXMubWluU3Rha2luZ1RpbWVCbG9ja3NcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0eFRyZWUgPSBnZXRTdGFraW5nVHJhbnNhY3Rpb25UcmVlVmVuZG9yKFxuICAgICAgICAgIHZlbmRvclN0YWtpbmdUeEJ1aWxkZXIsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIFt1dHhvXSxcbiAgICAgICAgICBmZWVSYXRlU2F0QixcbiAgICAgICAgICBzaWduSW50ZXJtZWRpYXRlVHhzXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlcktleSxcbiAgICAgICAgICAgICAgICBmaW5hbGl0eVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGNvdmVuYW50OiBjb3ZlbmFudEtleXMsXG4gICAgICAgICAgICAgICAgY292ZW5hbnRUaHJlc2hvbGQ6IGNvdmVuYW50VGhyZXNob2xkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHsgc3Rha2VyOiBzdGFrZXJLZXkgfSxcbiAgICAgICAgICBkZXNjcmlwdG9yQnVpbGRlclxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoYHRlc3QvZml4dHVyZXMvYmFieWxvbi90eFRyZWUuJHt0YWd9Lmpzb25gLCB0eFRyZWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjcmVhdGVzIE1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHR5cGUgRiA9IHR5cGVvZiBnZXRWZW5kb3JNc2dDcmVhdGVCdGNEZWxlZ2F0aW9uO1xuICAgICAgICBjb25zdCBmVmVuZG9yOiBGID0gZ2V0VmVuZG9yTXNnQ3JlYXRlQnRjRGVsZWdhdGlvbjtcbiAgICAgICAgY29uc3QgZkJpdEdvOiBGID0gZ2V0Qml0R29VdHhvU3Rha2luZ01zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBmIG9mIFtmVmVuZG9yLCBmQml0R29dKSB7XG4gICAgICAgICAgYXdhaXQgYXNzZXJ0RXF1YWxzRml4dHVyZShcbiAgICAgICAgICAgIGB0ZXN0L2ZpeHR1cmVzL2JhYnlsb24vbXNnQ3JlYXRlQlRDRGVsZWdhdGlvbi4ke3RhZ30uanNvbmAsXG4gICAgICAgICAgICBhd2FpdCBmKFxuICAgICAgICAgICAgICBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICAgICAgc3Rha2VyS2V5LFxuICAgICAgICAgICAgICBmaW5hbGl0eVByb3ZpZGVyLFxuICAgICAgICAgICAgICBkZXNjcmlwdG9yQnVpbGRlcixcbiAgICAgICAgICAgICAgW3sgLi4uc3Rha2luZ1BhcmFtcywgdmVyc2lvbjogMCwgYnRjQWN0aXZhdGlvbkhlaWdodDogMCB9XSxcbiAgICAgICAgICAgICAgY2hhbmdlQWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgICB1dHhvLFxuICAgICAgICAgICAgICBmZWVSYXRlU2F0QixcbiAgICAgICAgICAgICAgODAwXzAwMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZSxcbiAgICAgICAgICAgIChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFRoZSB2ZW5kb3IgbGlicmFyeSBzZXJpYWxpemVzIHRoZSBzaWduYXR1cmUgYXMgQklQMzIyLCB3aGlsZVxuICAgICAgICAgICAgICAvLyBvdXIgaW1wbGVtZW50YXRpb24gc2VyaWFsaXplcyBpdCBhcyBFQ0RTQS5cbiAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIHBvcCBmaWVsZCBmcm9tIHRoZSBNc2dDcmVhdGVCVENEZWxlZ2F0aW9uLlxuICAgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcFBvcCh2OiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdkFueSA9IHYgYXMgYW55O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2QW55Wyd1bnNpZ25lZERlbGVnYXRpb25Nc2cnXVsndmFsdWUnXVsncG9wJ107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RyaXBQb3AoYSk7XG4gICAgICAgICAgICAgIHN0cmlwUG9wKGIpO1xuICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGEsIGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiB0ZXN0Q3JlYXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIHR5cGU6ICd1bnN0YWtpbmcnIHwgJ3VuYm9uZGluZycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHNlcXVlbmNlPzogbnVtYmVyO1xuICAgICAgICAgIHNpZ25lcnM6IHV0eG9saWIuRUNQYWlySW50ZXJmYWNlW107XG4gICAgICAgICAgZmluYWxpemU6IGJvb2xlYW47XG4gICAgICAgIH1cbiAgICAgICkge1xuICAgICAgICBjb25zdCB1bnN0YWtpbmdQc2J0ID0gc3BlbmRTdGFraW5nT3V0cHV0KHN0YWtpbmdUeCwgZGVzY3JpcHRvckJ1aWxkZXIsIHR5cGUsIGNoYW5nZUFkZHJlc3MsIHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidCh1bnN0YWtpbmdQc2J0KTtcbiAgICAgICAgcGFyYW1zLnNpZ25lcnMuZm9yRWFjaCgoc2lnbmVyKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0KGdldE5ld1NpZ25hdHVyZUNvdW50KHNpZ25XaXRoS2V5KHdyYXBwZWRQc2J0LCBzaWduZXIpKSA+IDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwYXJhbXMuZmluYWxpemUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZFBzYnQuZmluYWxpemUoKTtcbiAgICAgICAgY29uc3QgdHggPSB0b1V0eG9Qc2J0KHdyYXBwZWRQc2J0LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLmV4dHJhY3RUcmFuc2FjdGlvbigpO1xuICAgICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoYHRlc3QvZml4dHVyZXMvYmFieWxvbi8ke3R5cGV9VHJhbnNhY3Rpb24uJHt0YWd9Lmpzb25gLCB7XG4gICAgICAgICAgcHNidDogdW5zdGFraW5nUHNidCxcbiAgICAgICAgICB0cmFuc2FjdGlvbjogdHgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpdCgnY3JlYXRlcyB1bnN0YWtpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRlc3RDcmVhdGVUcmFuc2FjdGlvbigndW5zdGFraW5nJywge1xuICAgICAgICAgIHNlcXVlbmNlOiBzdGFraW5nUGFyYW1zLm1pblN0YWtpbmdUaW1lQmxvY2tzLFxuICAgICAgICAgIHNpZ25lcnM6IFtzdGFrZXJLZXldLFxuICAgICAgICAgIGZpbmFsaXplOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY3JlYXRlcyB1bmJvbmRpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRlc3RDcmVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAndW5ib25kaW5nJyxcbiAgICAgICAgICBzaWduSW50ZXJtZWRpYXRlVHhzXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBbc3Rha2VyS2V5LCAuLi5jb3ZlbmFudEtleXNdLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplOiB0cnVlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBbc3Rha2VyS2V5XSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZTogZmFsc2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVXaXRoS2V5c0Zyb21TdGFraW5nUGFyYW1zKFxuICB0YWc6IHN0cmluZyxcbiAgZmluYWxpdHlQcm92aWRlcktleXM6IEVDUGFpckludGVyZmFjZVtdLFxuICBzdGFraW5nUGFyYW1zOiB2ZW5kb3IuU3Rha2luZ1BhcmFtc1xuKSB7XG4gIGRlc2NyaWJlV2l0aEtleXMoXG4gICAgdGFnLFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgIHN0YWtpbmdQYXJhbXMuY292ZW5hbnROb0Nvb3JkUGtzLm1hcCgocGspID0+IGZyb21YT25seVB1YmxpY0tleShCdWZmZXIuZnJvbShwaywgJ2hleCcpKSksXG4gICAgc3Rha2luZ1BhcmFtc1xuICApO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdpdGhNb2NrS2V5cyhcbiAgdGFnOiBzdHJpbmcsXG4gIHN0YWtpbmdQYXJhbXM6IHZlbmRvci5TdGFraW5nUGFyYW1zLFxuICBmaW5hbGl0eVByb3ZpZGVyS2V5czogRUNQYWlySW50ZXJmYWNlW10sXG4gIGNvdmVuYW50S2V5czogRUNQYWlySW50ZXJmYWNlW11cbikge1xuICBkZXNjcmliZVdpdGhLZXlzKFxuICAgIHRhZyxcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICBjb3ZlbmFudEtleXMsXG4gICAgZ2V0VGVzdG5ldFN0YWtpbmdQYXJhbXNXaXRoQ292ZW5hbnQoc3Rha2luZ1BhcmFtcywgY292ZW5hbnRLZXlzKSxcbiAgICB7XG4gICAgICBzaWduSW50ZXJtZWRpYXRlVHhzOiB0cnVlLFxuICAgIH1cbiAgKTtcbn1cblxuZGVzY3JpYmVXaXRoS2V5c0Zyb21TdGFraW5nUGFyYW1zKFxuICAndGVzdG5ldCcsXG4gIFtmcm9tWE9ubHlQdWJsaWNLZXkodGVzdG5ldEZpbmFsaXR5UHJvdmlkZXIwKV0sXG4gIGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbig1LCBnZXRTdGFraW5nUGFyYW1zKCd0ZXN0bmV0JykpXG4pO1xuZGVzY3JpYmVXaXRoTW9ja0tleXMoXG4gICd0ZXN0bmV0TW9jaycsXG4gIGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbig1LCBnZXRTdGFraW5nUGFyYW1zKCd0ZXN0bmV0JykpLFxuICBnZXRFQ0tleXMoJ2ZpbmFsaXR5UHJvdmlkZXInLCAxKSxcbiAgZ2V0RUNLZXlzKCdjb3ZlbmFudCcsIDkpXG4pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=undelegation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undelegation.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/undelegation.ts"],"names":[],"mappings":""}