@bitgo-beta/utxo-staking 1.1.1-beta.825 → 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.
- package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
- package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
- package/dist/cjs/scripts/babylon-sync.js +126 -0
- package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/cjs/src/babylon/delegationMessage.js +285 -0
- package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/descriptor.js +97 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/index.js +1 -1
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/network.js +1 -1
- package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
- package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingManager.js +120 -0
- package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingParams.js +132 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
- package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/descriptor.js +38 -0
- package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/coreDao/index.js +1 -1
- package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/opReturn.js +183 -0
- package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/transaction.js +34 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/bug71.js +108 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/transactions.js +338 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/utils.js +54 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures.utils.js +91 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/babylon/delegationMessage.d.ts +38 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.js +91 -0
- package/dist/esm/babylon/index.d.ts +6 -0
- package/dist/esm/babylon/index.js +11 -0
- package/dist/esm/babylon/network.d.ts +7 -0
- package/dist/esm/babylon/network.js +29 -0
- package/dist/esm/babylon/params.mainnet.json +152 -0
- package/dist/esm/babylon/params.testnet.json +212 -0
- package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.js +86 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
- package/dist/esm/babylon/undelegation/index.d.ts +3 -0
- package/dist/esm/babylon/undelegation/index.js +3 -0
- package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/esm/coreDao/descriptor.js +35 -0
- package/dist/esm/coreDao/index.d.ts +4 -0
- package/dist/esm/coreDao/index.js +4 -0
- package/dist/esm/coreDao/opReturn.d.ts +41 -0
- package/dist/esm/coreDao/opReturn.js +175 -0
- package/dist/esm/coreDao/transaction.d.ts +28 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/package.json +26 -10
- package/dist/src/babylon/delegationMessage.js +0 -285
- package/dist/src/babylon/descriptor.js +0 -97
- package/dist/src/babylon/parseDescriptor.js +0 -159
- package/dist/src/babylon/stakingManager.js +0 -120
- package/dist/src/babylon/stakingParams.js +0 -132
- package/dist/src/babylon/undelegation/unbonding.js +0 -111
- package/dist/src/coreDao/descriptor.js +0 -38
- package/dist/src/coreDao/opReturn.js +0 -183
- package/dist/src/coreDao/transaction.js +0 -34
- /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
- /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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"undelegation.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/undelegation.ts"],"names":[],"mappings":""}
|