@bitgo/utxo-staking 1.25.0 → 1.26.0
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,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
8
|
+
const testutil_1 = require("@bitgo/utxo-core/testutil");
|
|
9
|
+
const coreDao_1 = require("../../../src/coreDao");
|
|
10
|
+
describe('OP_RETURN', function () {
|
|
11
|
+
const validVersion = 2;
|
|
12
|
+
const validChainId = coreDao_1.CORE_DAO_MAINNET_CHAIN_ID;
|
|
13
|
+
// random 20 byte buffers
|
|
14
|
+
const validDelegator = Buffer.alloc(20, utxo_lib_1.testutil.getKey('wasm-possum').publicKey);
|
|
15
|
+
const validValidator = Buffer.alloc(20, utxo_lib_1.testutil.getKey('possum-wasm').publicKey);
|
|
16
|
+
const validFee = 1;
|
|
17
|
+
const validRedeemScript = Buffer.from('522103a8295453660d5e212d55556666666666666666666666666666666666', 'hex');
|
|
18
|
+
const validTimelock = 800800;
|
|
19
|
+
let defaultScript;
|
|
20
|
+
before(async function () {
|
|
21
|
+
// https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output-1
|
|
22
|
+
const script = await (0, testutil_1.getFixture)('test/fixtures/coreDao/opReturn/documentation.txt', undefined);
|
|
23
|
+
(0, assert_1.default)(typeof script === 'string');
|
|
24
|
+
defaultScript = script;
|
|
25
|
+
});
|
|
26
|
+
describe('createCoreDaoOpReturnOutputScript', function () {
|
|
27
|
+
it('should throw if invalid parameters are passed', function () {
|
|
28
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
29
|
+
version: 292,
|
|
30
|
+
chainId: validChainId,
|
|
31
|
+
delegator: validDelegator,
|
|
32
|
+
validator: validValidator,
|
|
33
|
+
fee: validFee,
|
|
34
|
+
timelock: validTimelock,
|
|
35
|
+
}));
|
|
36
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
37
|
+
version: validVersion,
|
|
38
|
+
chainId: Buffer.alloc(32, 0),
|
|
39
|
+
delegator: validDelegator,
|
|
40
|
+
validator: validValidator,
|
|
41
|
+
fee: validFee,
|
|
42
|
+
timelock: validTimelock,
|
|
43
|
+
}));
|
|
44
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
45
|
+
version: validVersion,
|
|
46
|
+
chainId: validChainId,
|
|
47
|
+
delegator: Buffer.alloc(19, 0),
|
|
48
|
+
validator: validValidator,
|
|
49
|
+
fee: validFee,
|
|
50
|
+
timelock: validTimelock,
|
|
51
|
+
}));
|
|
52
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
53
|
+
version: validVersion,
|
|
54
|
+
chainId: validChainId,
|
|
55
|
+
delegator: validDelegator,
|
|
56
|
+
validator: Buffer.alloc(19, 0),
|
|
57
|
+
fee: validFee,
|
|
58
|
+
timelock: validTimelock,
|
|
59
|
+
}));
|
|
60
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
61
|
+
version: validVersion,
|
|
62
|
+
chainId: validChainId,
|
|
63
|
+
delegator: validDelegator,
|
|
64
|
+
validator: validValidator,
|
|
65
|
+
fee: 256,
|
|
66
|
+
timelock: validTimelock,
|
|
67
|
+
}));
|
|
68
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
69
|
+
version: validVersion,
|
|
70
|
+
chainId: validChainId,
|
|
71
|
+
delegator: validDelegator,
|
|
72
|
+
validator: validValidator,
|
|
73
|
+
fee: validFee,
|
|
74
|
+
timelock: -1,
|
|
75
|
+
}));
|
|
76
|
+
});
|
|
77
|
+
it('should throw if the length of the script is too long', function () {
|
|
78
|
+
assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
79
|
+
version: validVersion,
|
|
80
|
+
chainId: validChainId,
|
|
81
|
+
delegator: validDelegator,
|
|
82
|
+
validator: validValidator,
|
|
83
|
+
fee: validFee,
|
|
84
|
+
redeemScript: Buffer.alloc(100),
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
it('should return a buffer with the correct length', function () {
|
|
88
|
+
const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
89
|
+
version: validVersion,
|
|
90
|
+
chainId: validChainId,
|
|
91
|
+
delegator: validDelegator,
|
|
92
|
+
validator: validValidator,
|
|
93
|
+
fee: validFee,
|
|
94
|
+
timelock: validTimelock,
|
|
95
|
+
});
|
|
96
|
+
// Make sure that the first byte is the OP_RETURN opcode
|
|
97
|
+
assert_1.default.strictEqual(script[0], 0x6a);
|
|
98
|
+
// Make sure that the length of the script matches what is in the buffer
|
|
99
|
+
assert_1.default.strictEqual(
|
|
100
|
+
// We do not count the OP_RETURN opcode or the bytes for the length
|
|
101
|
+
script.length - 2, script[1]);
|
|
102
|
+
});
|
|
103
|
+
it('should have the correct placement of the values provided with a redeem script', function () {
|
|
104
|
+
// This should produce an Op_RETURN that needs the extra push bytes for the length
|
|
105
|
+
const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
106
|
+
version: validVersion,
|
|
107
|
+
chainId: validChainId,
|
|
108
|
+
delegator: validDelegator,
|
|
109
|
+
validator: validValidator,
|
|
110
|
+
fee: validFee,
|
|
111
|
+
redeemScript: validRedeemScript,
|
|
112
|
+
});
|
|
113
|
+
// Make sure that the first byte is the OP_RETURN opcode
|
|
114
|
+
assert_1.default.strictEqual(script[0], 0x6a);
|
|
115
|
+
// Make sure that the length of the script matches what is in the buffer
|
|
116
|
+
assert_1.default.strictEqual(script[1], 0x4c);
|
|
117
|
+
assert_1.default.strictEqual(
|
|
118
|
+
// We do not count the OP_RETURN opcode or the length + pushbytes
|
|
119
|
+
script.length - 3, script[2]);
|
|
120
|
+
// Satoshi plus identifier
|
|
121
|
+
assert_1.default.deepStrictEqual(script.subarray(3, 7).toString('hex'), coreDao_1.CORE_DAO_SATOSHI_PLUS_IDENTIFIER.toString('hex'));
|
|
122
|
+
// Make sure that the version is correct
|
|
123
|
+
assert_1.default.strictEqual(script[7], validVersion);
|
|
124
|
+
// Make sure that the chainId is correct
|
|
125
|
+
assert_1.default.deepStrictEqual(script.subarray(8, 10).toString('hex'), validChainId.toString('hex'));
|
|
126
|
+
// Make sure that the delegator is correct
|
|
127
|
+
assert_1.default.deepStrictEqual(script.subarray(10, 30).toString('hex'), validDelegator.toString('hex'));
|
|
128
|
+
// Make sure that the validator is correct
|
|
129
|
+
assert_1.default.deepStrictEqual(script.subarray(30, 50).toString('hex'), validValidator.toString('hex'));
|
|
130
|
+
// Make sure that the fee is correct
|
|
131
|
+
assert_1.default.strictEqual(script[50], validFee);
|
|
132
|
+
// Make sure that the redeemScript is correct
|
|
133
|
+
assert_1.default.deepStrictEqual(script.subarray(51, 51 + validRedeemScript.length).toString('hex'), validRedeemScript.toString('hex'));
|
|
134
|
+
});
|
|
135
|
+
it('should have the correct placement of the values provided with a blockheight timelock', function () {
|
|
136
|
+
// This should produce an Op_RETURN that needs the extra push bytes for the length
|
|
137
|
+
const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
138
|
+
version: validVersion,
|
|
139
|
+
chainId: validChainId,
|
|
140
|
+
delegator: validDelegator,
|
|
141
|
+
validator: validValidator,
|
|
142
|
+
fee: validFee,
|
|
143
|
+
timelock: validTimelock,
|
|
144
|
+
});
|
|
145
|
+
// Make sure that the first byte is the OP_RETURN opcode
|
|
146
|
+
assert_1.default.strictEqual(script[0], 0x6a);
|
|
147
|
+
// Make sure that the length of the script matches what is in the buffer
|
|
148
|
+
assert_1.default.strictEqual(
|
|
149
|
+
// We do not count the OP_RETURN opcode or the length
|
|
150
|
+
script.length - 2, script[1]);
|
|
151
|
+
// Satoshi plus identifier
|
|
152
|
+
assert_1.default.deepStrictEqual(script.subarray(2, 6).toString('hex'), coreDao_1.CORE_DAO_SATOSHI_PLUS_IDENTIFIER.toString('hex'));
|
|
153
|
+
// Make sure that the version is correct
|
|
154
|
+
assert_1.default.strictEqual(script[6], validVersion);
|
|
155
|
+
// Make sure that the chainId is correct
|
|
156
|
+
assert_1.default.deepStrictEqual(script.subarray(7, 9).toString('hex'), validChainId.toString('hex'));
|
|
157
|
+
// Make sure that the delegator is correct
|
|
158
|
+
assert_1.default.deepStrictEqual(script.subarray(9, 29).toString('hex'), validDelegator.toString('hex'));
|
|
159
|
+
// Make sure that the validator is correct
|
|
160
|
+
assert_1.default.deepStrictEqual(script.subarray(29, 49).toString('hex'), validValidator.toString('hex'));
|
|
161
|
+
// Make sure that the fee is correct
|
|
162
|
+
assert_1.default.strictEqual(script[49], validFee);
|
|
163
|
+
// Make sure that the redeemScript is correct
|
|
164
|
+
assert_1.default.deepStrictEqual(script.subarray(50, 54).toString('hex'), (0, coreDao_1.encodeTimelock)(validTimelock).toString('hex'));
|
|
165
|
+
assert_1.default.deepStrictEqual((0, coreDao_1.decodeTimelock)(script.subarray(50, 54)), validTimelock);
|
|
166
|
+
});
|
|
167
|
+
it('should have the correct placement of the values provided with a time timelock', function () {
|
|
168
|
+
// This should produce an Op_RETURN that needs the extra push bytes for the length
|
|
169
|
+
const timelock = new Date('2022-01-01T00:00:00Z').getTime() / 1000;
|
|
170
|
+
const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
171
|
+
version: validVersion,
|
|
172
|
+
chainId: validChainId,
|
|
173
|
+
delegator: validDelegator,
|
|
174
|
+
validator: validValidator,
|
|
175
|
+
fee: validFee,
|
|
176
|
+
timelock,
|
|
177
|
+
});
|
|
178
|
+
// Make sure that the first byte is the OP_RETURN opcode
|
|
179
|
+
assert_1.default.strictEqual(script[0], 0x6a);
|
|
180
|
+
// Make sure that the length of the script matches what is in the buffer
|
|
181
|
+
assert_1.default.strictEqual(
|
|
182
|
+
// We do not count the OP_RETURN opcode or the length
|
|
183
|
+
script.length - 2, script[1]);
|
|
184
|
+
// Satoshi plus identifier
|
|
185
|
+
assert_1.default.deepStrictEqual(script.subarray(2, 6).toString('hex'), coreDao_1.CORE_DAO_SATOSHI_PLUS_IDENTIFIER.toString('hex'));
|
|
186
|
+
// Make sure that the version is correct
|
|
187
|
+
assert_1.default.strictEqual(script[6], validVersion);
|
|
188
|
+
// Make sure that the chainId is correct
|
|
189
|
+
assert_1.default.deepStrictEqual(script.subarray(7, 9).toString('hex'), validChainId.toString('hex'));
|
|
190
|
+
// Make sure that the delegator is correct
|
|
191
|
+
assert_1.default.deepStrictEqual(script.subarray(9, 29).toString('hex'), validDelegator.toString('hex'));
|
|
192
|
+
// Make sure that the validator is correct
|
|
193
|
+
assert_1.default.deepStrictEqual(script.subarray(29, 49).toString('hex'), validValidator.toString('hex'));
|
|
194
|
+
// Make sure that the fee is correct
|
|
195
|
+
assert_1.default.strictEqual(script[49], validFee);
|
|
196
|
+
// Make sure that the redeemScript is correct
|
|
197
|
+
assert_1.default.deepStrictEqual(script.subarray(50, 54).toString('hex'), (0, coreDao_1.encodeTimelock)(timelock).toString('hex'));
|
|
198
|
+
assert_1.default.deepStrictEqual((0, coreDao_1.decodeTimelock)(script.subarray(50, 54)), timelock);
|
|
199
|
+
});
|
|
200
|
+
it('should recreate the example OP_RETURN correctly', function () {
|
|
201
|
+
assert_1.default.deepStrictEqual((0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
202
|
+
version: 1,
|
|
203
|
+
chainId: Buffer.from('045b', 'hex'),
|
|
204
|
+
delegator: Buffer.from('de60b7d0e6b758ca5dd8c61d377a2c5f1af51ec1', 'hex'),
|
|
205
|
+
validator: Buffer.from('a9e209f5ea0036c8c2f41078a3cebee57d8a47d5', 'hex'),
|
|
206
|
+
fee: 1,
|
|
207
|
+
redeemScript: Buffer.from('041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac', 'hex'),
|
|
208
|
+
}).toString('hex'), defaultScript);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe('parseCoreDaoOpReturnOutputScript', function () {
|
|
212
|
+
it('should parse a valid script with a timelock', function () {
|
|
213
|
+
const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
214
|
+
version: validVersion,
|
|
215
|
+
chainId: validChainId,
|
|
216
|
+
delegator: validDelegator,
|
|
217
|
+
validator: validValidator,
|
|
218
|
+
fee: validFee,
|
|
219
|
+
timelock: validTimelock,
|
|
220
|
+
});
|
|
221
|
+
const parsed = (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(script);
|
|
222
|
+
assert_1.default.strictEqual(parsed.version, validVersion);
|
|
223
|
+
assert_1.default.deepStrictEqual(parsed.chainId, validChainId);
|
|
224
|
+
assert_1.default.deepStrictEqual(parsed.delegator, validDelegator);
|
|
225
|
+
assert_1.default.deepStrictEqual(parsed.validator, validValidator);
|
|
226
|
+
assert_1.default.strictEqual(parsed.fee, validFee);
|
|
227
|
+
(0, assert_1.default)('timelock' in parsed);
|
|
228
|
+
assert_1.default.deepStrictEqual(parsed.timelock, validTimelock);
|
|
229
|
+
});
|
|
230
|
+
it('should parse a valid script with a redeem script', function () {
|
|
231
|
+
const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
|
|
232
|
+
version: validVersion,
|
|
233
|
+
chainId: validChainId,
|
|
234
|
+
delegator: validDelegator,
|
|
235
|
+
validator: validValidator,
|
|
236
|
+
fee: validFee,
|
|
237
|
+
redeemScript: validRedeemScript,
|
|
238
|
+
});
|
|
239
|
+
const parsed = (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(script);
|
|
240
|
+
assert_1.default.strictEqual(parsed.version, validVersion);
|
|
241
|
+
assert_1.default.deepStrictEqual(parsed.chainId, validChainId);
|
|
242
|
+
assert_1.default.deepStrictEqual(parsed.delegator, validDelegator);
|
|
243
|
+
assert_1.default.deepStrictEqual(parsed.validator, validValidator);
|
|
244
|
+
assert_1.default.strictEqual(parsed.fee, validFee);
|
|
245
|
+
(0, assert_1.default)('redeemScript' in parsed);
|
|
246
|
+
assert_1.default.deepStrictEqual(parsed.redeemScript, validRedeemScript);
|
|
247
|
+
});
|
|
248
|
+
it('should parse valid opreturn script from testnet', async function () {
|
|
249
|
+
// Source: https://mempool.space/testnet/tx/66ed4cea26a410248a6d87f14b2bca514f33920c54d4af63ed46a903793115d5
|
|
250
|
+
const baseFixturePath = 'test/fixtures/coreDao/opReturn/66ed4cea26a410248a6d87f14b2bca514f33920c54d4af63ed46a903793115d5';
|
|
251
|
+
const opReturnHex = await (0, testutil_1.getFixture)(baseFixturePath + '.txt', undefined);
|
|
252
|
+
(0, assert_1.default)(typeof opReturnHex === 'string');
|
|
253
|
+
const parsed = (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(opReturnHex, 'hex'));
|
|
254
|
+
const parsedFixture = await (0, testutil_1.getFixture)(baseFixturePath + '.json', JSON.parse((0, coreDao_1.toString)(parsed)));
|
|
255
|
+
assert_1.default.deepStrictEqual((0, coreDao_1.toString)(parsed), JSON.stringify(parsedFixture));
|
|
256
|
+
});
|
|
257
|
+
it('should fail if there is an invalid op-return', function () {
|
|
258
|
+
const script = defaultScript.replace('6a4c50', '6b4c50');
|
|
259
|
+
assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
|
|
260
|
+
});
|
|
261
|
+
it('should fail if the length is incorrect', function () {
|
|
262
|
+
const script = defaultScript.replace('4c50', '4c51');
|
|
263
|
+
assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
|
|
264
|
+
});
|
|
265
|
+
it('should fail if the satoshi+ identifier is incorrect', function () {
|
|
266
|
+
const script = defaultScript.replace('5341542b', '5341532b');
|
|
267
|
+
assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
|
|
268
|
+
});
|
|
269
|
+
it('should fail if the chainId is incorrect', function () {
|
|
270
|
+
const script = defaultScript.replace('045b', '0454');
|
|
271
|
+
assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4Q0FBMkM7QUFDM0Msd0RBQXVEO0FBRXZELGtEQVE4QjtBQUU5QixRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN2QixNQUFNLFlBQVksR0FBRyxtQ0FBeUIsQ0FBQztJQUMvQyx5QkFBeUI7SUFDekIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsbUJBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEYsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsbUJBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDN0IsSUFBSSxhQUFxQixDQUFDO0lBRTFCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YscUZBQXFGO1FBQ3JGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxxQkFBVSxFQUFDLGtEQUFrRCxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9GLElBQUEsZ0JBQU0sRUFBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNuQyxhQUFhLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQzVDLEVBQUUsQ0FBQywrQ0FBK0Ms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LENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUU7WUFDM0MsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0QsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyB0ZXN0dXRpbCB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBnZXRGaXh0dXJlIH0gZnJvbSAnQGJpdGdvL3V0eG8tY29yZS90ZXN0dXRpbCc7XG5cbmltcG9ydCB7XG4gIENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQsXG4gIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLFxuICBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQsXG4gIGRlY29kZVRpbWVsb2NrLFxuICBlbmNvZGVUaW1lbG9jayxcbiAgcGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQsXG4gIHRvU3RyaW5nLFxufSBmcm9tICcuLi8uLi8uLi9zcmMvY29yZURhbyc7XG5cbmRlc2NyaWJlKCdPUF9SRVRVUk4nLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHZhbGlkVmVyc2lvbiA9IDI7XG4gIGNvbnN0IHZhbGlkQ2hhaW5JZCA9IENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQ7XG4gIC8vIHJhbmRvbSAyMCBieXRlIGJ1ZmZlcnNcbiAgY29uc3QgdmFsaWREZWxlZ2F0b3IgPSBCdWZmZXIuYWxsb2MoMjAsIHRlc3R1dGlsLmdldEtleSgnd2FzbS1wb3NzdW0nKS5wdWJsaWNLZXkpO1xuICBjb25zdCB2YWxpZFZhbGlkYXRvciA9IEJ1ZmZlci5hbGxvYygyMCwgdGVzdHV0aWwuZ2V0S2V5KCdwb3NzdW0td2FzbScpLnB1YmxpY0tleSk7XG4gIGNvbnN0IHZhbGlkRmVlID0gMTtcbiAgY29uc3QgdmFsaWRSZWRlZW1TY3JpcHQgPSBCdWZmZXIuZnJvbSgnNTIyMTAzYTgyOTU0NTM2NjBkNWUyMTJkNTU1NTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYnLCAnaGV4Jyk7XG4gIGNvbnN0IHZhbGlkVGltZWxvY2sgPSA4MDA4MDA7XG4gIGxldCBkZWZhdWx0U2NyaXB0OiBzdHJpbmc7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBodHRwczovL2RvY3MuY29yZWRhby5vcmcvZG9jcy9MZWFybi9wcm9kdWN0cy9idGMtc3Rha2luZy9kZXNpZ24jb3BfcmV0dXJuLW91dHB1dC0xXG4gICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgZ2V0Rml4dHVyZSgndGVzdC9maXh0dXJlcy9jb3JlRGFvL29wUmV0dXJuL2RvY3VtZW50YXRpb24udHh0JywgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQodHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycpO1xuICAgIGRlZmF1bHRTY3JpcHQgPSBzY3JpcHQ7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBpbnZhbGlkIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiAyOTIsXG4gICAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICAgIHRpbWVsb2NrOiB2YWxpZFRpbWVsb2NrLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgICAgY2hhaW5JZDogQnVmZmVyLmFsbG9jKDMyLCAwKSxcbiAgICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgICB0aW1lbG9jazogdmFsaWRUaW1lbG9jayxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgICBkZWxlZ2F0b3I6IEJ1ZmZlci5hbGxvYygxOSwgMCksXG4gICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICAgIHRpbWVsb2NrOiB2YWxpZFRpbWVsb2NrLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsaWRhdG9yOiBCdWZmZXIuYWxsb2MoMTksIDApLFxuICAgICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgICAgdGltZWxvY2s6IHZhbGlkVGltZWxvY2ssXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PlxuICAgICAgICBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICAgICAgICAgIHZlcnNpb246IHZhbGlkVmVyc2lvbixcbiAgICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgICAgZGVsZWdhdG9yOiB2YWxpZERlbGVnYXRvcixcbiAgICAgICAgICB2YWxpZGF0b3I6IHZhbGlkVmFsaWRhdG9yLFxuICAgICAgICAgIGZlZTogMjU2LFxuICAgICAgICAgIHRpbWVsb2NrOiB2YWxpZFRpbWVsb2NrLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICAgIHRpbWVsb2NrOiAtMSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHRoZSBsZW5ndGggb2YgdGhlIHNjcmlwdCBpcyB0b28gbG9uZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICAgIHJlZGVlbVNjcmlwdDogQnVmZmVyLmFsbG9jKDEwMCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBidWZmZXIgd2l0aCB0aGUgY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgZGVsZWdhdG9yOiB2YWxpZERlbGVnYXRvcixcbiAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgdGltZWxvY2s6IHZhbGlkVGltZWxvY2ssXG4gICAgICB9KTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBieXRlIGlzIHRoZSBPUF9SRVRVUk4gb3Bjb2RlXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzBdLCAweDZhKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIHNjcmlwdCBtYXRjaGVzIHdoYXQgaXMgaW4gdGhlIGJ1ZmZlclxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAvLyBXZSBkbyBub3QgY291bnQgdGhlIE9QX1JFVFVSTiBvcGNvZGUgb3IgdGhlIGJ5dGVzIGZvciB0aGUgbGVuZ3RoXG4gICAgICAgIHNjcmlwdC5sZW5ndGggLSAyLFxuICAgICAgICBzY3JpcHRbMV1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGxhY2VtZW50IG9mIHRoZSB2YWx1ZXMgcHJvdmlkZWQgd2l0aCBhIHJlZGVlbSBzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGlzIHNob3VsZCBwcm9kdWNlIGFuIE9wX1JFVFVSTiB0aGF0IG5lZWRzIHRoZSBleHRyYSBwdXNoIGJ5dGVzIGZvciB0aGUgbGVuZ3RoXG4gICAgICBjb25zdCBzY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgZGVsZWdhdG9yOiB2YWxpZERlbGVnYXRvcixcbiAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgcmVkZWVtU2NyaXB0OiB2YWxpZFJlZGVlbVNjcmlwdCxcbiAgICAgIH0pO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIE9QX1JFVFVSTiBvcGNvZGVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMF0sIDB4NmEpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgc2NyaXB0IG1hdGNoZXMgd2hhdCBpcyBpbiB0aGUgYnVmZmVyXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzFdLCAweDRjKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgLy8gV2UgZG8gbm90IGNvdW50IHRoZSBPUF9SRVRVUk4gb3Bjb2RlIG9yIHRoZSBsZW5ndGggKyBwdXNoYnl0ZXNcbiAgICAgICAgc2NyaXB0Lmxlbmd0aCAtIDMsXG4gICAgICAgIHNjcmlwdFsyXVxuICAgICAgKTtcbiAgICAgIC8vIFNhdG9zaGkgcGx1cyBpZGVudGlmaWVyXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSgzLCA3KS50b1N0cmluZygnaGV4JyksIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdmVyc2lvbiBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzddLCB2YWxpZFZlcnNpb24pO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGNoYWluSWQgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoOCwgMTApLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWRDaGFpbklkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdG9yIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDEwLCAzMCkudG9TdHJpbmcoJ2hleCcpLCB2YWxpZERlbGVnYXRvci50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHZhbGlkYXRvciBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSgzMCwgNTApLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWRWYWxpZGF0b3IudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBmZWUgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFs1MF0sIHZhbGlkRmVlKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWRlZW1TY3JpcHQgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgc2NyaXB0LnN1YmFycmF5KDUxLCA1MSArIHZhbGlkUmVkZWVtU2NyaXB0Lmxlbmd0aCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB2YWxpZFJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGxhY2VtZW50IG9mIHRoZSB2YWx1ZXMgcHJvdmlkZWQgd2l0aCBhIGJsb2NraGVpZ2h0IHRpbWVsb2NrJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgcHJvZHVjZSBhbiBPcF9SRVRVUk4gdGhhdCBuZWVkcyB0aGUgZXh0cmEgcHVzaCBieXRlcyBmb3IgdGhlIGxlbmd0aFxuICAgICAgY29uc3Qgc2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgIHRpbWVsb2NrOiB2YWxpZFRpbWVsb2NrLFxuICAgICAgfSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgT1BfUkVUVVJOIG9wY29kZVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFswXSwgMHg2YSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBzY3JpcHQgbWF0Y2hlcyB3aGF0IGlzIGluIHRoZSBidWZmZXJcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgLy8gV2UgZG8gbm90IGNvdW50IHRoZSBPUF9SRVRVUk4gb3Bjb2RlIG9yIHRoZSBsZW5ndGhcbiAgICAgICAgc2NyaXB0Lmxlbmd0aCAtIDIsXG4gICAgICAgIHNjcmlwdFsxXVxuICAgICAgKTtcbiAgICAgIC8vIFNhdG9zaGkgcGx1cyBpZGVudGlmaWVyXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSgyLCA2KS50b1N0cmluZygnaGV4JyksIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdmVyc2lvbiBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzZdLCB2YWxpZFZlcnNpb24pO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGNoYWluSWQgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoNywgOSkudG9TdHJpbmcoJ2hleCcpLCB2YWxpZENoYWluSWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZWxlZ2F0b3IgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoOSwgMjkpLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWREZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3IgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoMjksIDQ5KS50b1N0cmluZygnaGV4JyksIHZhbGlkVmFsaWRhdG9yLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmVlIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbNDldLCB2YWxpZEZlZSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVkZWVtU2NyaXB0IGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDUwLCA1NCkudG9TdHJpbmcoJ2hleCcpLCBlbmNvZGVUaW1lbG9jayh2YWxpZFRpbWVsb2NrKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChkZWNvZGVUaW1lbG9jayhzY3JpcHQuc3ViYXJyYXkoNTAsIDU0KSksIHZhbGlkVGltZWxvY2spO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBsYWNlbWVudCBvZiB0aGUgdmFsdWVzIHByb3ZpZGVkIHdpdGggYSB0aW1lIHRpbWVsb2NrJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgcHJvZHVjZSBhbiBPcF9SRVRVUk4gdGhhdCBuZWVkcyB0aGUgZXh0cmEgcHVzaCBieXRlcyBmb3IgdGhlIGxlbmd0aFxuICAgICAgY29uc3QgdGltZWxvY2sgPSBuZXcgRGF0ZSgnMjAyMi0wMS0wMVQwMDowMDowMFonKS5nZXRUaW1lKCkgLyAxMDAwO1xuICAgICAgY29uc3Qgc2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgIHRpbWVsb2NrLFxuICAgICAgfSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgT1BfUkVUVVJOIG9wY29kZVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFswXSwgMHg2YSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBzY3JpcHQgbWF0Y2hlcyB3aGF0IGlzIGluIHRoZSBidWZmZXJcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgLy8gV2UgZG8gbm90IGNvdW50IHRoZSBPUF9SRVRVUk4gb3Bjb2RlIG9yIHRoZSBsZW5ndGhcbiAgICAgICAgc2NyaXB0Lmxlbmd0aCAtIDIsXG4gICAgICAgIHNjcmlwdFsxXVxuICAgICAgKTtcbiAgICAgIC8vIFNhdG9zaGkgcGx1cyBpZGVudGlmaWVyXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSgyLCA2KS50b1N0cmluZygnaGV4JyksIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdmVyc2lvbiBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzZdLCB2YWxpZFZlcnNpb24pO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGNoYWluSWQgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoNywgOSkudG9TdHJpbmcoJ2hleCcpLCB2YWxpZENoYWluSWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZWxlZ2F0b3IgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoOSwgMjkpLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWREZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3IgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoMjksIDQ5KS50b1N0cmluZygnaGV4JyksIHZhbGlkVmFsaWRhdG9yLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmVlIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbNDldLCB2YWxpZEZlZSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVkZWVtU2NyaXB0IGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDUwLCA1NCkudG9TdHJpbmcoJ2hleCcpLCBlbmNvZGVUaW1lbG9jayh0aW1lbG9jaykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZGVjb2RlVGltZWxvY2soc2NyaXB0LnN1YmFycmF5KDUwLCA1NCkpLCB0aW1lbG9jayk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY3JlYXRlIHRoZSBleGFtcGxlIE9QX1JFVFVSTiBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgY2hhaW5JZDogQnVmZmVyLmZyb20oJzA0NWInLCAnaGV4JyksXG4gICAgICAgICAgZGVsZWdhdG9yOiBCdWZmZXIuZnJvbSgnZGU2MGI3ZDBlNmI3NThjYTVkZDhjNjFkMzc3YTJjNWYxYWY1MWVjMScsICdoZXgnKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IEJ1ZmZlci5mcm9tKCdhOWUyMDlmNWVhMDAzNmM4YzJmNDEwNzhhM2NlYmVlNTdkOGE0N2Q1JywgJ2hleCcpLFxuICAgICAgICAgIGZlZTogMSxcbiAgICAgICAgICByZWRlZW1TY3JpcHQ6IEJ1ZmZlci5mcm9tKCcwNDFmNWUwZTY2YjE3NTc2YTkxNGM0YjhhZTkyN2ZmMmI5Y2UyMThlMjBiZjA2ZDQyNWQ2YjY4NDI0ZmQ4OGFjJywgJ2hleCcpLFxuICAgICAgICB9KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGRlZmF1bHRTY3JpcHRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgdmFsaWQgc2NyaXB0IHdpdGggYSB0aW1lbG9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgIHZlcnNpb246IHZhbGlkVmVyc2lvbixcbiAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICB2YWxpZGF0b3I6IHZhbGlkVmFsaWRhdG9yLFxuICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICB0aW1lbG9jazogdmFsaWRUaW1lbG9jayxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoc2NyaXB0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQudmVyc2lvbiwgdmFsaWRWZXJzaW9uKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLmNoYWluSWQsIHZhbGlkQ2hhaW5JZCk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC5kZWxlZ2F0b3IsIHZhbGlkRGVsZWdhdG9yKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLnZhbGlkYXRvciwgdmFsaWRWYWxpZGF0b3IpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5mZWUsIHZhbGlkRmVlKTtcbiAgICAgIGFzc2VydCgndGltZWxvY2snIGluIHBhcnNlZCk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC50aW1lbG9jaywgdmFsaWRUaW1lbG9jayk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgdmFsaWQgc2NyaXB0IHdpdGggYSByZWRlZW0gc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgIHJlZGVlbVNjcmlwdDogdmFsaWRSZWRlZW1TY3JpcHQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHNjcmlwdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLnZlcnNpb24sIHZhbGlkVmVyc2lvbik7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC5jaGFpbklkLCB2YWxpZENoYWluSWQpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwYXJzZWQuZGVsZWdhdG9yLCB2YWxpZERlbGVnYXRvcik7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC52YWxpZGF0b3IsIHZhbGlkVmFsaWRhdG9yKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQuZmVlLCB2YWxpZEZlZSk7XG4gICAgICBhc3NlcnQoJ3JlZGVlbVNjcmlwdCcgaW4gcGFyc2VkKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLnJlZGVlbVNjcmlwdCwgdmFsaWRSZWRlZW1TY3JpcHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB2YWxpZCBvcHJldHVybiBzY3JpcHQgZnJvbSB0ZXN0bmV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gU291cmNlOiBodHRwczovL21lbXBvb2wuc3BhY2UvdGVzdG5ldC90eC82NmVkNGNlYTI2YTQxMDI0OGE2ZDg3ZjE0YjJiY2E1MTRmMzM5MjBjNTRkNGFmNjNlZDQ2YTkwMzc5MzExNWQ1XG4gICAgICBjb25zdCBiYXNlRml4dHVyZVBhdGggPVxuICAgICAgICAndGVzdC9maXh0dXJlcy9jb3JlRGFvL29wUmV0dXJuLzY2ZWQ0Y2VhMjZhNDEwMjQ4YTZkODdmMTRiMmJjYTUxNGYzMzkyMGM1NGQ0YWY2M2VkNDZhOTAzNzkzMTE1ZDUnO1xuICAgICAgY29uc3Qgb3BSZXR1cm5IZXggPSBhd2FpdCBnZXRGaXh0dXJlKGJhc2VGaXh0dXJlUGF0aCArICcudHh0JywgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydCh0eXBlb2Ygb3BSZXR1cm5IZXggPT09ICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KEJ1ZmZlci5mcm9tKG9wUmV0dXJuSGV4LCAnaGV4JykpO1xuICAgICAgY29uc3QgcGFyc2VkRml4dHVyZSA9IGF3YWl0IGdldEZpeHR1cmUoYmFzZUZpeHR1cmVQYXRoICsgJy5qc29uJywgSlNPTi5wYXJzZSh0b1N0cmluZyhwYXJzZWQpKSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRvU3RyaW5nKHBhcnNlZCksIEpTT04uc3RyaW5naWZ5KHBhcnNlZEZpeHR1cmUpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGVyZSBpcyBhbiBpbnZhbGlkIG9wLXJldHVybicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRlZmF1bHRTY3JpcHQucmVwbGFjZSgnNmE0YzUwJywgJzZiNGM1MCcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChCdWZmZXIuZnJvbShzY3JpcHQsICdoZXgnKSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBsZW5ndGggaXMgaW5jb3JyZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZGVmYXVsdFNjcmlwdC5yZXBsYWNlKCc0YzUwJywgJzRjNTEnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoQnVmZmVyLmZyb20oc2NyaXB0LCAnaGV4JykpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgc2F0b3NoaSsgaWRlbnRpZmllciBpcyBpbmNvcnJlY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBkZWZhdWx0U2NyaXB0LnJlcGxhY2UoJzUzNDE1NDJiJywgJzUzNDE1MzJiJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KEJ1ZmZlci5mcm9tKHNjcmlwdCwgJ2hleCcpKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIGNoYWluSWQgaXMgaW5jb3JyZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZGVmYXVsdFNjcmlwdC5yZXBsYWNlKCcwNDViJywgJzA0NTQnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoQnVmZmVyLmZyb20oc2NyaXB0LCAnaGV4JykpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Descriptor } from '@bitgo/wasm-utxo';
|
|
2
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
3
|
+
export declare function updateInputWithDescriptor(psbt: utxolib.Psbt, inputIndex: number, descriptor: Descriptor): void;
|
|
4
|
+
export declare function finalizePsbt(psbt: utxolib.Psbt): utxolib.bitgo.UtxoPsbt;
|
|
5
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../test/unit/coreDao/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAM9G;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMvE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.updateInputWithDescriptor = updateInputWithDescriptor;
|
|
37
|
+
exports.finalizePsbt = finalizePsbt;
|
|
38
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
39
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
40
|
+
function updateInputWithDescriptor(psbt, inputIndex, descriptor) {
|
|
41
|
+
const wrappedPsbt = wasm_utxo_1.Psbt.deserialize(psbt.toBuffer());
|
|
42
|
+
wrappedPsbt.updateInputWithDescriptor(inputIndex, descriptor);
|
|
43
|
+
psbt.data.inputs[inputIndex] = utxolib.bitgo.UtxoPsbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()), {
|
|
44
|
+
network: utxolib.networks.bitcoin,
|
|
45
|
+
}).data.inputs[inputIndex];
|
|
46
|
+
}
|
|
47
|
+
function finalizePsbt(psbt) {
|
|
48
|
+
const wrappedPsbt = wasm_utxo_1.Psbt.deserialize(psbt.toBuffer());
|
|
49
|
+
wrappedPsbt.finalize();
|
|
50
|
+
return utxolib.bitgo.UtxoPsbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()), {
|
|
51
|
+
network: utxolib.networks.bitcoin,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvY29yZURhby91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLDhEQU1DO0FBRUQsb0NBTUM7QUFqQkQsZ0RBQW9EO0FBQ3BELHlEQUEyQztBQUUzQyxTQUFnQix5QkFBeUIsQ0FBQyxJQUFrQixFQUFFLFVBQWtCLEVBQUUsVUFBc0I7SUFDdEcsTUFBTSxXQUFXLEdBQUcsZ0JBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEQsV0FBVyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRTtRQUNyRyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0tBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsSUFBa0I7SUFDN0MsTUFBTSxXQUFXLEdBQUcsZ0JBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEQsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7UUFDN0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztLQUNsQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpcHRvciwgUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihwc2J0OiB1dHhvbGliLlBzYnQsIGlucHV0SW5kZXg6IG51bWJlciwgZGVzY3JpcHRvcjogRGVzY3JpcHRvcik6IHZvaWQge1xuICBjb25zdCB3cmFwcGVkUHNidCA9IFBzYnQuZGVzZXJpYWxpemUocHNidC50b0J1ZmZlcigpKTtcbiAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihpbnB1dEluZGV4LCBkZXNjcmlwdG9yKTtcbiAgcHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSA9IHV0eG9saWIuYml0Z28uVXR4b1BzYnQuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbSh3cmFwcGVkUHNidC5zZXJpYWxpemUoKSksIHtcbiAgICBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gIH0pLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVQc2J0KHBzYnQ6IHV0eG9saWIuUHNidCk6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB3cmFwcGVkUHNidCA9IFBzYnQuZGVzZXJpYWxpemUocHNidC50b0J1ZmZlcigpKTtcbiAgd3JhcHBlZFBzYnQuZmluYWxpemUoKTtcbiAgcmV0dXJuIHV0eG9saWIuYml0Z28uVXR4b1BzYnQuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbSh3cmFwcGVkUHNidC5zZXJpYWxpemUoKSksIHtcbiAgICBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { ast } from '@bitgo/wasm-utxo';
|
|
3
|
+
export declare function normalize(v: unknown): unknown;
|
|
4
|
+
type EqualsAssertion = typeof assert.deepStrictEqual;
|
|
5
|
+
export declare function assertEqualsFixture(fixtureName: string, value: unknown, n?: typeof normalize, eq?: EqualsAssertion): Promise<void>;
|
|
6
|
+
export declare function assertTransactionEqualsFixture(fixtureName: string, tx: unknown): Promise<void>;
|
|
7
|
+
export declare function assertEqualsMiniscript(script: Buffer, miniscript: ast.MiniscriptNode): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=fixtures.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.utils.d.ts","sourceRoot":"","sources":["../../../../test/unit/fixtures.utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,GAAG,EAA0B,MAAM,kBAAkB,CAAC;AAM/D,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA6B7C;AAED,KAAK,eAAe,GAAG,OAAO,MAAM,CAAC,eAAe,CAAC;AAErD,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EACd,CAAC,mBAAY,EACb,EAAE,GAAE,eAAwC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,8BAA8B,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,cAAc,GAAG,IAAI,CAO3F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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.normalize = normalize;
|
|
40
|
+
exports.assertEqualsFixture = assertEqualsFixture;
|
|
41
|
+
exports.assertTransactionEqualsFixture = assertTransactionEqualsFixture;
|
|
42
|
+
exports.assertEqualsMiniscript = assertEqualsMiniscript;
|
|
43
|
+
const assert_1 = __importDefault(require("assert"));
|
|
44
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
45
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
46
|
+
const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
|
|
47
|
+
const testutil_1 = require("@bitgo/utxo-core/testutil");
|
|
48
|
+
const descriptor_1 = require("@bitgo/utxo-core/testutil/descriptor");
|
|
49
|
+
function normalize(v) {
|
|
50
|
+
if (typeof v === 'bigint') {
|
|
51
|
+
return v.toString();
|
|
52
|
+
}
|
|
53
|
+
if (v instanceof wasm_utxo_1.Descriptor) {
|
|
54
|
+
return v.toString();
|
|
55
|
+
}
|
|
56
|
+
if (v instanceof Uint8Array) {
|
|
57
|
+
v = Buffer.from(v);
|
|
58
|
+
}
|
|
59
|
+
if (v instanceof Buffer) {
|
|
60
|
+
return v.toString('hex');
|
|
61
|
+
}
|
|
62
|
+
if (v instanceof bitcoinjslib.Psbt) {
|
|
63
|
+
v = utxolib.Psbt.fromBuffer(v.toBuffer());
|
|
64
|
+
}
|
|
65
|
+
if (v instanceof utxolib.Psbt) {
|
|
66
|
+
return (0, descriptor_1.toPlainObjectFromPsbt)(v);
|
|
67
|
+
}
|
|
68
|
+
if (v instanceof utxolib.Transaction) {
|
|
69
|
+
return (0, descriptor_1.toPlainObjectFromTx)(v);
|
|
70
|
+
}
|
|
71
|
+
if (Array.isArray(v)) {
|
|
72
|
+
return v.map(normalize);
|
|
73
|
+
}
|
|
74
|
+
if (typeof v === 'object' && v !== null) {
|
|
75
|
+
return Object.fromEntries(Object.entries(v).flatMap(([k, v]) => (v === undefined ? [] : [[k, normalize(v)]])));
|
|
76
|
+
}
|
|
77
|
+
return v;
|
|
78
|
+
}
|
|
79
|
+
async function assertEqualsFixture(fixtureName, value, n = normalize, eq = assert_1.default.deepStrictEqual) {
|
|
80
|
+
value = n(value);
|
|
81
|
+
eq(await (0, testutil_1.getFixture)(fixtureName, value), value);
|
|
82
|
+
}
|
|
83
|
+
async function assertTransactionEqualsFixture(fixtureName, tx) {
|
|
84
|
+
await assertEqualsFixture(fixtureName, normalize(tx));
|
|
85
|
+
}
|
|
86
|
+
function assertEqualsMiniscript(script, miniscript) {
|
|
87
|
+
const ms = wasm_utxo_1.Miniscript.fromBitcoinScript(script, 'tap');
|
|
88
|
+
assert_1.default.deepStrictEqual(wasm_utxo_1.ast.fromMiniscript(ms), miniscript);
|
|
89
|
+
assert_1.default.deepStrictEqual(script.toString('hex'), Buffer.from(wasm_utxo_1.Miniscript.fromString(wasm_utxo_1.ast.formatNode(miniscript), 'tap').encode()).toString('hex'));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvZml4dHVyZXMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSw4QkE2QkM7QUFJRCxrREFRQztBQUVELHdFQUVDO0FBRUQsd0RBT0M7QUE5REQsb0RBQTRCO0FBRTVCLGdEQUErRDtBQUMvRCx5REFBMkM7QUFDM0MsNERBQThDO0FBQzlDLHdEQUF1RDtBQUN2RCxxRUFBa0c7QUFFbEcsU0FBZ0IsU0FBUyxDQUFDLENBQVU7SUFDbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxDQUFDLFlBQVksc0JBQVUsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxVQUFVLEVBQUUsQ0FBQztRQUM1QixDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxDQUFDLFlBQVksTUFBTSxFQUFFLENBQUM7UUFDeEIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFBLGtDQUFxQixFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsT0FBTyxJQUFBLGdDQUFtQixFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSU0sS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxXQUFtQixFQUNuQixLQUFjLEVBQ2QsQ0FBQyxHQUFHLFNBQVMsRUFDYixLQUFzQixnQkFBTSxDQUFDLGVBQWU7SUFFNUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixFQUFFLENBQUMsTUFBTSxJQUFBLHFCQUFVLEVBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFTSxLQUFLLFVBQVUsOEJBQThCLENBQUMsV0FBbUIsRUFBRSxFQUFXO0lBQ25GLE1BQU0sbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxNQUFjLEVBQUUsVUFBOEI7SUFDbkYsTUFBTSxFQUFFLEdBQUcsc0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsZUFBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRCxnQkFBTSxDQUFDLGVBQWUsQ0FDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMvRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgYXN0LCBEZXNjcmlwdG9yLCBNaW5pc2NyaXB0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBiaXRjb2luanNsaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBnZXRGaXh0dXJlIH0gZnJvbSAnQGJpdGdvL3V0eG8tY29yZS90ZXN0dXRpbCc7XG5pbXBvcnQgeyB0b1BsYWluT2JqZWN0RnJvbVR4LCB0b1BsYWluT2JqZWN0RnJvbVBzYnQgfSBmcm9tICdAYml0Z28vdXR4by1jb3JlL3Rlc3R1dGlsL2Rlc2NyaXB0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHY6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiB2LnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgfVxuICBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICB2ID0gQnVmZmVyLmZyb20odik7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gdi50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBiaXRjb2luanNsaWIuUHNidCkge1xuICAgIHYgPSB1dHhvbGliLlBzYnQuZnJvbUJ1ZmZlcih2LnRvQnVmZmVyKCkpO1xuICB9XG4gIGlmICh2IGluc3RhbmNlb2YgdXR4b2xpYi5Qc2J0KSB7XG4gICAgcmV0dXJuIHRvUGxhaW5PYmplY3RGcm9tUHNidCh2KTtcbiAgfVxuICBpZiAodiBpbnN0YW5jZW9mIHV0eG9saWIuVHJhbnNhY3Rpb24pIHtcbiAgICByZXR1cm4gdG9QbGFpbk9iamVjdEZyb21UeCh2KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgIHJldHVybiB2Lm1hcChub3JtYWxpemUpO1xuICB9XG4gIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModikuZmxhdE1hcCgoW2ssIHZdKSA9PiAodiA9PT0gdW5kZWZpbmVkID8gW10gOiBbW2ssIG5vcm1hbGl6ZSh2KV1dKSkpO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG50eXBlIEVxdWFsc0Fzc2VydGlvbiA9IHR5cGVvZiBhc3NlcnQuZGVlcFN0cmljdEVxdWFsO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0RXF1YWxzRml4dHVyZShcbiAgZml4dHVyZU5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIG4gPSBub3JtYWxpemUsXG4gIGVxOiBFcXVhbHNBc3NlcnRpb24gPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdmFsdWUgPSBuKHZhbHVlKTtcbiAgZXEoYXdhaXQgZ2V0Rml4dHVyZShmaXh0dXJlTmFtZSwgdmFsdWUpLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoZml4dHVyZU5hbWU6IHN0cmluZywgdHg6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXNzZXJ0RXF1YWxzRml4dHVyZShmaXh0dXJlTmFtZSwgbm9ybWFsaXplKHR4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFcXVhbHNNaW5pc2NyaXB0KHNjcmlwdDogQnVmZmVyLCBtaW5pc2NyaXB0OiBhc3QuTWluaXNjcmlwdE5vZGUpOiB2b2lkIHtcbiAgY29uc3QgbXMgPSBNaW5pc2NyaXB0LmZyb21CaXRjb2luU2NyaXB0KHNjcmlwdCwgJ3RhcCcpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFzdC5mcm9tTWluaXNjcmlwdChtcyksIG1pbmlzY3JpcHQpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgIHNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgQnVmZmVyLmZyb20oTWluaXNjcmlwdC5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKG1pbmlzY3JpcHQpLCAndGFwJykuZW5jb2RlKCkpLnRvU3RyaW5nKCdoZXgnKVxuICApO1xufVxuIl19
|