@bitgo/abstract-lightning 7.6.1 → 7.6.3
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/src/lightning/parseWithdrawPsbt.d.ts.map +1 -1
- package/dist/src/lightning/parseWithdrawPsbt.js +5 -3
- package/dist/test/unit/lightning/createPsbt.d.ts +27 -0
- package/dist/test/unit/lightning/createPsbt.d.ts.map +1 -0
- package/dist/test/unit/lightning/createPsbt.js +162 -0
- package/dist/test/unit/lightning/parseWithdrawPsbt.js +387 -71
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -39,87 +39,403 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
const src_1 = require("../../../src");
|
|
40
40
|
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
41
41
|
const assert_1 = __importDefault(require("assert"));
|
|
42
|
+
const createPsbt_1 = require("./createPsbt");
|
|
42
43
|
describe('parseWithdrawPsbt', () => {
|
|
43
|
-
const unsignedPsbtHex = '70736274ff01007d02000000015e50b8d96cebdc3273d9a100eb68392d980d5b934b8170c80a23488b595268ca0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15affa80a000000000016001480a06f2e6b77e817fd5de6e41ea512c563c26cb800000000000100ea02000000000101a158d806735bb7c54e4c701d4f5821cd5342d48d5e1fcbed1169e6e45aa444be0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15a6a310c000000000016001478a5d98c7160484b9b00f1782803c58edfc49b9a024730440220407d9162f52371df246dcfa2943d40fbdcb0d4b6768f7682c65193378b2845a60220101c7bc460c93d2976961ac23400f0f10c145efb989a3addb7f03ebaaa2200950121037e17444c85c8b7da07f12fd53cb2ca142c2b4932d0f898649c4b5be0021da0980000000001030401000000220602e57146e5b4762a7ff374adf4072047b67ef115ad46a34189bdeb6a4f88db9b0818000000005400008000000080000000800100000006000000000022020379abbe44004ff7e527bdee3dd8d95e5cd250053f35ee92258b97aa83dfa93c621800000000540000800000008000000080010000005000000000';
|
|
44
44
|
const network = utxolib.networks.testnet;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
];
|
|
51
|
-
const accounts = [
|
|
52
|
-
{
|
|
53
|
-
xpub: 'tpubDCmiWMkTJrZ24t1Z6ECR3HyynCyZ9zGsWqhcLh6H4yFK2CDozSszD1pP2Li4Nx1YYtRcvmNbdb3nD1SzFejYtPFfTocTv2EaAgJCg4zpJpA',
|
|
54
|
-
purpose: 49,
|
|
55
|
-
coin_type: 0,
|
|
56
|
-
account: 0,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
xpub: 'tpubDCFN7bsxR9UTKggdH2pmv5HeHGQNiDrJwa1EZFtP9sH5PF28i37FHpoYSYARQkKZ6Mi98pkp7oypDcxFmE4dQGq8jV8Gv3L6gmWBeRwPxkP',
|
|
60
|
-
purpose: 84,
|
|
61
|
-
coin_type: 0,
|
|
62
|
-
account: 0,
|
|
63
|
-
},
|
|
64
|
-
];
|
|
65
|
-
it('should parse a valid withdraw PSBT', () => {
|
|
66
|
-
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, accounts);
|
|
67
|
-
});
|
|
68
|
-
it('should throw for invalid PSBT', () => {
|
|
69
|
-
assert_1.default.throws(() => {
|
|
70
|
-
(0, src_1.validatePsbtForWithdraw)('asdasd', network, recipients, accounts);
|
|
71
|
-
}, /ERR_BUFFER_OUT_OF_BOUNDS/);
|
|
72
|
-
});
|
|
73
|
-
it('should throw for invalid recipient address', () => {
|
|
74
|
-
const differentRecipients = [
|
|
45
|
+
describe('regression tests with hardcoded PSBT', () => {
|
|
46
|
+
// Keeping one regression test with real PSBT data to ensure backward compatibility
|
|
47
|
+
const unsignedPsbtHex = '70736274ff01007d02000000015e50b8d96cebdc3273d9a100eb68392d980d5b934b8170c80a23488b595268ca0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15affa80a000000000016001480a06f2e6b77e817fd5de6e41ea512c563c26cb800000000000100ea02000000000101a158d806735bb7c54e4c701d4f5821cd5342d48d5e1fcbed1169e6e45aa444be0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15a6a310c000000000016001478a5d98c7160484b9b00f1782803c58edfc49b9a024730440220407d9162f52371df246dcfa2943d40fbdcb0d4b6768f7682c65193378b2845a60220101c7bc460c93d2976961ac23400f0f10c145efb989a3addb7f03ebaaa2200950121037e17444c85c8b7da07f12fd53cb2ca142c2b4932d0f898649c4b5be0021da0980000000001030401000000220602e57146e5b4762a7ff374adf4072047b67ef115ad46a34189bdeb6a4f88db9b0818000000005400008000000080000000800100000006000000000022020379abbe44004ff7e527bdee3dd8d95e5cd250053f35ee92258b97aa83dfa93c621800000000540000800000008000000080010000005000000000';
|
|
48
|
+
const recipients = [
|
|
75
49
|
{
|
|
76
|
-
|
|
77
|
-
address: '
|
|
50
|
+
amountSat: 100000n,
|
|
51
|
+
address: 'tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k',
|
|
78
52
|
},
|
|
79
53
|
];
|
|
80
|
-
|
|
81
|
-
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, differentRecipients, accounts);
|
|
82
|
-
}, /PSBT output tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k with value 100000 does not match any recipient/);
|
|
83
|
-
});
|
|
84
|
-
it('should throw for invalid recipient value', () => {
|
|
85
|
-
const differentRecipients = [
|
|
54
|
+
const accounts = [
|
|
86
55
|
{
|
|
87
|
-
...recipients[0],
|
|
88
|
-
amountSat: 99999n,
|
|
89
|
-
},
|
|
90
|
-
];
|
|
91
|
-
assert_1.default.throws(() => {
|
|
92
|
-
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, differentRecipients, accounts);
|
|
93
|
-
}, /PSBT output tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k with value 100000 does not match any recipient/);
|
|
94
|
-
});
|
|
95
|
-
it('should throw for account not found', () => {
|
|
96
|
-
const incompatibleAccounts = [];
|
|
97
|
-
assert_1.default.throws(() => {
|
|
98
|
-
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, incompatibleAccounts);
|
|
99
|
-
}, /Account not found for purpose/);
|
|
100
|
-
});
|
|
101
|
-
it('should throw for invalid pubkey', () => {
|
|
102
|
-
const incompatibleAccounts = [
|
|
103
|
-
{
|
|
104
|
-
...accounts[1],
|
|
105
56
|
xpub: 'tpubDCmiWMkTJrZ24t1Z6ECR3HyynCyZ9zGsWqhcLh6H4yFK2CDozSszD1pP2Li4Nx1YYtRcvmNbdb3nD1SzFejYtPFfTocTv2EaAgJCg4zpJpA',
|
|
57
|
+
purpose: 49,
|
|
58
|
+
coin_type: 0,
|
|
59
|
+
account: 0,
|
|
106
60
|
},
|
|
107
|
-
];
|
|
108
|
-
assert_1.default.throws(() => {
|
|
109
|
-
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, incompatibleAccounts);
|
|
110
|
-
}, /Derived pubkey does not match for address/);
|
|
111
|
-
});
|
|
112
|
-
it('should throw for invalid purpose', () => {
|
|
113
|
-
const incompatibleAccounts = [
|
|
114
61
|
{
|
|
115
|
-
|
|
116
|
-
purpose:
|
|
62
|
+
xpub: 'tpubDCFN7bsxR9UTKggdH2pmv5HeHGQNiDrJwa1EZFtP9sH5PF28i37FHpoYSYARQkKZ6Mi98pkp7oypDcxFmE4dQGq8jV8Gv3L6gmWBeRwPxkP',
|
|
63
|
+
purpose: 84,
|
|
64
|
+
coin_type: 0,
|
|
65
|
+
account: 0,
|
|
117
66
|
},
|
|
118
67
|
];
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
68
|
+
it('should parse a valid withdraw PSBT', () => {
|
|
69
|
+
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, accounts);
|
|
70
|
+
});
|
|
71
|
+
it('should throw for invalid PSBT hex', () => {
|
|
72
|
+
assert_1.default.throws(() => {
|
|
73
|
+
(0, src_1.validatePsbtForWithdraw)('asdasd', network, recipients, accounts);
|
|
74
|
+
}, /ERR_BUFFER_OUT_OF_BOUNDS/);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('test cases with creating psbt on the go', () => {
|
|
78
|
+
it('should validate PSBT with P2WPKH (purpose 84) change address', () => {
|
|
79
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
80
|
+
network,
|
|
81
|
+
inputValue: 500000,
|
|
82
|
+
outputValue: 100000,
|
|
83
|
+
changeValue: 390000,
|
|
84
|
+
changePurpose: 84,
|
|
85
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
86
|
+
});
|
|
87
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
88
|
+
const recipients = [
|
|
89
|
+
{
|
|
90
|
+
amountSat: BigInt(100000),
|
|
91
|
+
address: recipientAddress,
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
const accounts = [
|
|
95
|
+
{
|
|
96
|
+
xpub: masterKey.neutered().toBase58(),
|
|
97
|
+
purpose: 84,
|
|
98
|
+
coin_type: 0,
|
|
99
|
+
account: 0,
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
103
|
+
});
|
|
104
|
+
it('should validate PSBT with P2SH-P2WPKH (purpose 49) change address', () => {
|
|
105
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
106
|
+
network,
|
|
107
|
+
inputValue: 500000,
|
|
108
|
+
outputValue: 100000,
|
|
109
|
+
changeValue: 390000,
|
|
110
|
+
changePurpose: 49,
|
|
111
|
+
changeDerivationPath: "m/49'/0'/0'/1/6",
|
|
112
|
+
});
|
|
113
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
114
|
+
const recipients = [
|
|
115
|
+
{
|
|
116
|
+
amountSat: BigInt(100000),
|
|
117
|
+
address: recipientAddress,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
const accounts = [
|
|
121
|
+
{
|
|
122
|
+
xpub: masterKey.neutered().toBase58(),
|
|
123
|
+
purpose: 49,
|
|
124
|
+
coin_type: 0,
|
|
125
|
+
account: 0,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
129
|
+
});
|
|
130
|
+
it('should validate PSBT with P2TR (purpose 86) change address', () => {
|
|
131
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
132
|
+
network,
|
|
133
|
+
inputValue: 500000,
|
|
134
|
+
outputValue: 100000,
|
|
135
|
+
changeValue: 390000,
|
|
136
|
+
changePurpose: 86,
|
|
137
|
+
changeDerivationPath: "m/86'/0'/0'/1/6",
|
|
138
|
+
});
|
|
139
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
140
|
+
const recipients = [
|
|
141
|
+
{
|
|
142
|
+
amountSat: BigInt(100000),
|
|
143
|
+
address: recipientAddress,
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
const accounts = [
|
|
147
|
+
{
|
|
148
|
+
xpub: masterKey.neutered().toBase58(),
|
|
149
|
+
purpose: 86,
|
|
150
|
+
coin_type: 0,
|
|
151
|
+
account: 0,
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
155
|
+
});
|
|
156
|
+
it('should throw for missing bip32Derivation path on change output', () => {
|
|
157
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
158
|
+
network,
|
|
159
|
+
inputValue: 500000,
|
|
160
|
+
outputValue: 100000,
|
|
161
|
+
changeValue: 390000,
|
|
162
|
+
changePurpose: 84,
|
|
163
|
+
});
|
|
164
|
+
// Remove the bip32Derivation from the change output
|
|
165
|
+
// This will cause the output to be treated as a regular recipient output, not a change output
|
|
166
|
+
delete psbt.data.outputs[1].bip32Derivation;
|
|
167
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
168
|
+
const recipients = [
|
|
169
|
+
{
|
|
170
|
+
amountSat: BigInt(100000),
|
|
171
|
+
address: recipientAddress,
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
const accounts = [
|
|
175
|
+
{
|
|
176
|
+
xpub: masterKey.neutered().toBase58(),
|
|
177
|
+
purpose: 84,
|
|
178
|
+
coin_type: 0,
|
|
179
|
+
account: 0,
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
// The output without bip32Derivation is treated as a recipient output,
|
|
183
|
+
// and since it's not in the recipients list, it should fail with "does not match any recipient"
|
|
184
|
+
assert_1.default.throws(() => {
|
|
185
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
186
|
+
}, /does not match any recipient/);
|
|
187
|
+
});
|
|
188
|
+
it('should throw for invalid change address (derived address mismatch)', () => {
|
|
189
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
190
|
+
network,
|
|
191
|
+
inputValue: 500000,
|
|
192
|
+
outputValue: 100000,
|
|
193
|
+
changeValue: 390000,
|
|
194
|
+
changePurpose: 84,
|
|
195
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
196
|
+
});
|
|
197
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
198
|
+
const recipients = [
|
|
199
|
+
{
|
|
200
|
+
amountSat: BigInt(100000),
|
|
201
|
+
address: recipientAddress,
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
// Use a different xpub that won't match the change address
|
|
205
|
+
const differentMasterKey = utxolib.bip32.fromSeed(Buffer.alloc(32, 2), network);
|
|
206
|
+
const accounts = [
|
|
207
|
+
{
|
|
208
|
+
xpub: differentMasterKey.neutered().toBase58(),
|
|
209
|
+
purpose: 84,
|
|
210
|
+
coin_type: 0,
|
|
211
|
+
account: 0,
|
|
212
|
+
},
|
|
213
|
+
];
|
|
214
|
+
assert_1.default.throws(() => {
|
|
215
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
216
|
+
}, /Derived pubkey does not match for address/);
|
|
217
|
+
});
|
|
218
|
+
it('should validate PSBT with upub prefix (P2SH-P2WPKH testnet)', () => {
|
|
219
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
220
|
+
network,
|
|
221
|
+
inputValue: 500000,
|
|
222
|
+
outputValue: 100000,
|
|
223
|
+
changeValue: 390000,
|
|
224
|
+
changePurpose: 49,
|
|
225
|
+
changeDerivationPath: "m/49'/0'/0'/1/6",
|
|
226
|
+
});
|
|
227
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
228
|
+
const recipients = [
|
|
229
|
+
{
|
|
230
|
+
amountSat: BigInt(100000),
|
|
231
|
+
address: recipientAddress,
|
|
232
|
+
},
|
|
233
|
+
];
|
|
234
|
+
// Use upub prefix (testnet P2SH-P2WPKH) instead of standard tpub
|
|
235
|
+
// This tests that revertXpubPrefix correctly converts upub -> tpub
|
|
236
|
+
const accounts = [
|
|
237
|
+
{
|
|
238
|
+
xpub: 'upub5Eep7H5q39PzQZLVEYLBytDyBNeV74E8mQsyeL6UozFq9Y3MsZ52G7YGuqrJPgoyAqF7TBeJdnkrHrVrB5pkWkPJ9cJGAePMU6F1Gyw6aFH',
|
|
239
|
+
purpose: 49,
|
|
240
|
+
coin_type: 0,
|
|
241
|
+
account: 0,
|
|
242
|
+
},
|
|
243
|
+
];
|
|
244
|
+
// This should work because revertXpubPrefix will convert upub back to tpub
|
|
245
|
+
// However, the master key we used is different, so it should fail with pubkey mismatch
|
|
246
|
+
assert_1.default.throws(() => {
|
|
247
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
248
|
+
}, /Derived pubkey does not match for address/);
|
|
249
|
+
});
|
|
250
|
+
it('should validate PSBT with vpub prefix (P2WPKH testnet)', () => {
|
|
251
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
252
|
+
network,
|
|
253
|
+
inputValue: 500000,
|
|
254
|
+
outputValue: 100000,
|
|
255
|
+
changeValue: 390000,
|
|
256
|
+
changePurpose: 84,
|
|
257
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
258
|
+
});
|
|
259
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
260
|
+
const recipients = [
|
|
261
|
+
{
|
|
262
|
+
amountSat: BigInt(100000),
|
|
263
|
+
address: recipientAddress,
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
// Use vpub prefix (testnet P2WPKH) instead of standard tpub
|
|
267
|
+
// This tests that revertXpubPrefix correctly converts vpub -> tpub
|
|
268
|
+
const accounts = [
|
|
269
|
+
{
|
|
270
|
+
xpub: 'vpub5ZU1PHGpQoDSHckYico4nsvwsD3mTh6UjqL5zyGWXZXzBjTYMNKot7t9eRPQY71hJcnNN9r1ss25g3xA9rmoJ5nWPg8jEWavrttnsVa1qw1',
|
|
271
|
+
purpose: 84,
|
|
272
|
+
coin_type: 0,
|
|
273
|
+
account: 0,
|
|
274
|
+
},
|
|
275
|
+
];
|
|
276
|
+
// This should work because revertXpubPrefix will convert vpub back to tpub
|
|
277
|
+
// However, the master key we used is different, so it should fail with pubkey mismatch
|
|
278
|
+
assert_1.default.throws(() => {
|
|
279
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
280
|
+
}, /Derived pubkey does not match for address/);
|
|
281
|
+
});
|
|
282
|
+
it('should validate PSBT with matching upub prefix and correct key', () => {
|
|
283
|
+
// Import the signer root key from the fixture which corresponds to the upub/vpub accounts
|
|
284
|
+
const signerRootKey = 'tprv8ZgxMBicQKsPe6jS4vDm2n7s42Q6MpvghUQqMmSKG7bTZvGKtjrcU3PGzMNG37yzxywrcdvgkwrr8eYXJmbwdvUNVT4Ucv7ris4jvA7BUmg';
|
|
285
|
+
const masterHDNode = utxolib.bip32.fromBase58(signerRootKey, network);
|
|
286
|
+
// Derive the account key for purpose 49
|
|
287
|
+
const accountKey = masterHDNode.derivePath("m/49'/0'/0'");
|
|
288
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
289
|
+
network,
|
|
290
|
+
inputValue: 500000,
|
|
291
|
+
outputValue: 100000,
|
|
292
|
+
changeValue: 390000,
|
|
293
|
+
changePurpose: 49,
|
|
294
|
+
changeDerivationPath: "m/49'/0'/0'/1/6",
|
|
295
|
+
masterKey: accountKey,
|
|
296
|
+
});
|
|
297
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
298
|
+
const recipients = [
|
|
299
|
+
{
|
|
300
|
+
amountSat: BigInt(100000),
|
|
301
|
+
address: recipientAddress,
|
|
302
|
+
},
|
|
303
|
+
];
|
|
304
|
+
// Use the upub from the fixture - this should work because the keys match
|
|
305
|
+
const accounts = [
|
|
306
|
+
{
|
|
307
|
+
xpub: 'upub5Eep7H5q39PzQZLVEYLBytDyBNeV74E8mQsyeL6UozFq9Y3MsZ52G7YGuqrJPgoyAqF7TBeJdnkrHrVrB5pkWkPJ9cJGAePMU6F1Gyw6aFH',
|
|
308
|
+
purpose: 49,
|
|
309
|
+
coin_type: 0,
|
|
310
|
+
account: 0,
|
|
311
|
+
},
|
|
312
|
+
];
|
|
313
|
+
// This should pass - revertXpubPrefix converts upub -> tpub, and the key matches
|
|
314
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
315
|
+
});
|
|
316
|
+
it('should validate PSBT with matching vpub prefix and correct key', () => {
|
|
317
|
+
// Import the signer root key from the fixture which corresponds to the upub/vpub accounts
|
|
318
|
+
const signerRootKey = 'tprv8ZgxMBicQKsPe6jS4vDm2n7s42Q6MpvghUQqMmSKG7bTZvGKtjrcU3PGzMNG37yzxywrcdvgkwrr8eYXJmbwdvUNVT4Ucv7ris4jvA7BUmg';
|
|
319
|
+
const masterHDNode = utxolib.bip32.fromBase58(signerRootKey, network);
|
|
320
|
+
// Derive the account key for purpose 84
|
|
321
|
+
const accountKey = masterHDNode.derivePath("m/84'/0'/0'");
|
|
322
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
323
|
+
network,
|
|
324
|
+
inputValue: 500000,
|
|
325
|
+
outputValue: 100000,
|
|
326
|
+
changeValue: 390000,
|
|
327
|
+
changePurpose: 84,
|
|
328
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
329
|
+
masterKey: accountKey,
|
|
330
|
+
});
|
|
331
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
332
|
+
const recipients = [
|
|
333
|
+
{
|
|
334
|
+
amountSat: BigInt(100000),
|
|
335
|
+
address: recipientAddress,
|
|
336
|
+
},
|
|
337
|
+
];
|
|
338
|
+
// Use the vpub from the fixture - this should work because the keys match
|
|
339
|
+
const accounts = [
|
|
340
|
+
{
|
|
341
|
+
xpub: 'vpub5ZU1PHGpQoDSHckYico4nsvwsD3mTh6UjqL5zyGWXZXzBjTYMNKot7t9eRPQY71hJcnNN9r1ss25g3xA9rmoJ5nWPg8jEWavrttnsVa1qw1',
|
|
342
|
+
purpose: 84,
|
|
343
|
+
coin_type: 0,
|
|
344
|
+
account: 0,
|
|
345
|
+
},
|
|
346
|
+
];
|
|
347
|
+
// This should pass - revertXpubPrefix converts vpub -> tpub, and the key matches
|
|
348
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
349
|
+
});
|
|
350
|
+
it('should validate PSBT with multiple recipients', () => {
|
|
351
|
+
// Create a PSBT manually with 2 recipient outputs and 1 change output
|
|
352
|
+
const masterKey = utxolib.bip32.fromSeed(Buffer.alloc(32, 1), network);
|
|
353
|
+
const inputKeyPair = utxolib.ECPair.makeRandom({ network });
|
|
354
|
+
const p2wpkhInput = utxolib.payments.p2wpkh({
|
|
355
|
+
pubkey: Buffer.from(inputKeyPair.publicKey),
|
|
356
|
+
network,
|
|
357
|
+
});
|
|
358
|
+
const psbt = new utxolib.Psbt({ network });
|
|
359
|
+
// Add input
|
|
360
|
+
psbt.addInput({
|
|
361
|
+
hash: 'ca6852598b48230ac870814b935b0d982d3968eb00a1d97332dceb6cd9b8505e',
|
|
362
|
+
index: 1,
|
|
363
|
+
witnessUtxo: {
|
|
364
|
+
script: p2wpkhInput.output,
|
|
365
|
+
value: BigInt(500000),
|
|
366
|
+
},
|
|
367
|
+
bip32Derivation: [
|
|
368
|
+
{
|
|
369
|
+
masterFingerprint: Buffer.alloc(4, 0),
|
|
370
|
+
path: "m/84'/0'/0'/0/0",
|
|
371
|
+
pubkey: Buffer.from(inputKeyPair.publicKey),
|
|
372
|
+
},
|
|
373
|
+
],
|
|
374
|
+
});
|
|
375
|
+
// Create first recipient
|
|
376
|
+
const recipient1KeyPair = utxolib.ECPair.makeRandom({ network });
|
|
377
|
+
const recipient1Payment = utxolib.payments.p2wpkh({
|
|
378
|
+
pubkey: Buffer.from(recipient1KeyPair.publicKey),
|
|
379
|
+
network,
|
|
380
|
+
});
|
|
381
|
+
const recipient1Address = recipient1Payment.address;
|
|
382
|
+
// Create second recipient
|
|
383
|
+
const recipient2KeyPair = utxolib.ECPair.makeRandom({ network });
|
|
384
|
+
const recipient2Payment = utxolib.payments.p2wpkh({
|
|
385
|
+
pubkey: Buffer.from(recipient2KeyPair.publicKey),
|
|
386
|
+
network,
|
|
387
|
+
});
|
|
388
|
+
const recipient2Address = recipient2Payment.address;
|
|
389
|
+
// Derive change address from master key
|
|
390
|
+
const changeNode = masterKey.derive(1).derive(6); // m/1/6
|
|
391
|
+
const changePayment = utxolib.payments.p2wpkh({
|
|
392
|
+
pubkey: changeNode.publicKey,
|
|
393
|
+
network,
|
|
394
|
+
});
|
|
395
|
+
const changeAddress = changePayment.address;
|
|
396
|
+
// Add outputs: recipient1, recipient2, change
|
|
397
|
+
psbt.addOutput({
|
|
398
|
+
address: recipient1Address,
|
|
399
|
+
value: BigInt(100000),
|
|
400
|
+
});
|
|
401
|
+
psbt.addOutput({
|
|
402
|
+
address: recipient2Address,
|
|
403
|
+
value: BigInt(50000),
|
|
404
|
+
});
|
|
405
|
+
psbt.addOutput({
|
|
406
|
+
address: changeAddress,
|
|
407
|
+
value: BigInt(340000), // 500000 - 100000 - 50000 - 10000 (fee)
|
|
408
|
+
});
|
|
409
|
+
// Add bip32Derivation to the change output (index 2)
|
|
410
|
+
psbt.updateOutput(2, {
|
|
411
|
+
bip32Derivation: [
|
|
412
|
+
{
|
|
413
|
+
masterFingerprint: Buffer.alloc(4, 0),
|
|
414
|
+
path: "m/84'/0'/0'/1/6",
|
|
415
|
+
pubkey: changeNode.publicKey,
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
});
|
|
419
|
+
const recipients = [
|
|
420
|
+
{
|
|
421
|
+
amountSat: BigInt(100000),
|
|
422
|
+
address: recipient1Address,
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
amountSat: BigInt(50000),
|
|
426
|
+
address: recipient2Address,
|
|
427
|
+
},
|
|
428
|
+
];
|
|
429
|
+
const accounts = [
|
|
430
|
+
{
|
|
431
|
+
xpub: masterKey.neutered().toBase58(),
|
|
432
|
+
purpose: 84,
|
|
433
|
+
coin_type: 0,
|
|
434
|
+
account: 0,
|
|
435
|
+
},
|
|
436
|
+
];
|
|
437
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
438
|
+
});
|
|
123
439
|
});
|
|
124
440
|
});
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXRoZHJhd1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGlnaHRuaW5nL3BhcnNlV2l0aGRyYXdQc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQXVEO0FBQ3ZELHlEQUEyQztBQUMzQyxvREFBNEI7QUFFNUIsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxNQUFNLGVBQWUsR0FDbkIsNCtCQUE0K0IsQ0FBQztJQUMvK0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDekMsTUFBTSxVQUFVLEdBQUc7UUFDakI7WUFDRSxTQUFTLEVBQUUsT0FBTztZQUNsQixPQUFPLEVBQUUsZ0VBQWdFO1NBQzFFO0tBQ0YsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHO1FBQ2Y7WUFDRSxJQUFJLEVBQUUsaUhBQWlIO1lBQ3ZILE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsaUhBQWlIO1lBQ3ZILE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNYO0tBQ0YsQ0FBQztJQUNGLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7UUFDNUMsSUFBQSw2QkFBdUIsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUEsNkJBQXVCLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1FBQ3BELE1BQU0sbUJBQW1CLEdBQUc7WUFDMUI7Z0JBQ0UsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLEVBQUUseURBQXlEO2FBQ25FO1NBQ0YsQ0FBQztRQUNGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkYsQ0FBQyxFQUFFLDJIQUEySCxDQUFDLENBQUM7SUFDbEksQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sbUJBQW1CLEdBQUc7WUFDMUI7Z0JBQ0UsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixTQUFTLEVBQUUsTUFBTTthQUNsQjtTQUNGLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBQSw2QkFBdUIsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25GLENBQUMsRUFBRSwySEFBMkgsQ0FBQyxDQUFDO0lBQ2xJLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM1QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBQSw2QkFBdUIsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLG9CQUFvQixHQUFHO1lBQzNCO2dCQUNFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxJQUFJLEVBQUUsaUhBQWlIO2FBQ3hIO1NBQ0YsQ0FBQztRQUNGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDdEYsQ0FBQyxFQUFFLDJDQUEyQyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1FBQzFDLE1BQU0sb0JBQW9CLEdBQUc7WUFDM0I7Z0JBQ0UsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNkLE9BQU8sRUFBRSxJQUFJO2FBQ2Q7U0FDRixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyw0K0JBQTQrQixDQUFDO1FBQ3RnQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBQSw2QkFBdUIsRUFBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDdkYsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUHNidEZvcldpdGhkcmF3IH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZGVzY3JpYmUoJ3BhcnNlV2l0aGRyYXdQc2J0JywgKCkgPT4ge1xuICBjb25zdCB1bnNpZ25lZFBzYnRIZXggPVxuICAgICc3MDczNjI3NGZmMDEwMDdkMDIwMDAwMDAwMTVlNTBiOGQ5NmNlYmRjMzI3M2Q5YTEwMGViNjgzOTJkOTgwZDViOTM0YjgxNzBjODBhMjM0ODhiNTk1MjY4Y2EwMTAwMDAwMDAwZmZmZmZmZmYwMmEwODYwMTAwMDAwMDAwMDAyMjUxMjAzNzliYzg4Y2MxNWQzNjA1ZWQ5ZGUxYjYxZmY4ZDY1MDIxYjY1MGRiMTE1MWU3NTFhMzA4ODVjY2ZjYzdkMTVhZmZhODBhMDAwMDAwMDAwMDE2MDAxNDgwYTA2ZjJlNmI3N2U4MTdmZDVkZTZlNDFlYTUxMmM1NjNjMjZjYjgwMDAwMDAwMDAwMDEwMGVhMDIwMDAwMDAwMDAxMDFhMTU4ZDgwNjczNWJiN2M1NGU0YzcwMWQ0ZjU4MjFjZDUzNDJkNDhkNWUxZmNiZWQxMTY5ZTZlNDVhYTQ0NGJlMDEwMDAwMDAwMGZmZmZmZmZmMDJhMDg2MDEwMDAwMDAwMDAwMjI1MTIwMzc5YmM4OGNjMTVkMzYwNWVkOWRlMWI2MWZmOGQ2NTAyMWI2NTBkYjExNTFlNzUxYTMwODg1Y2NmY2M3ZDE1YTZhMzEwYzAwMDAwMDAwMDAxNjAwMTQ3OGE1ZDk4YzcxNjA0ODRiOWIwMGYxNzgyODAzYzU4ZWRmYzQ5YjlhMDI0NzMwNDQwMjIwNDA3ZDkxNjJmNTIzNzFkZjI0NmRjZmEyOTQzZDQwZmJkY2IwZDRiNjc2OGY3NjgyYzY1MTkzMzc4YjI4NDVhNjAyMjAxMDFjN2JjNDYwYzkzZDI5NzY5NjFhYzIzNDAwZjBmMTBjMTQ1ZWZiOTg5YTNhZGRiN2YwM2ViYWFhMjIwMDk1MDEyMTAzN2UxNzQ0NGM4NWM4YjdkYTA3ZjEyZmQ1M2NiMmNhMTQyYzJiNDkzMmQwZjg5ODY0OWM0YjViZTAwMjFkYTA5ODAwMDAwMDAwMDEwMzA0MDEwMDAwMDAyMjA2MDJlNTcxNDZlNWI0NzYyYTdmZjM3NGFkZjQwNzIwNDdiNjdlZjExNWFkNDZhMzQxODliZGViNmE0Zjg4ZGI5YjA4MTgwMDAwMDAwMDU0MDAwMDgwMDAwMDAwODAwMDAwMDA4MDAxMDAwMDAwMDYwMDAwMDAwMDAwMjIwMjAzNzlhYmJlNDQwMDRmZjdlNTI3YmRlZTNkZDhkOTVlNWNkMjUwMDUzZjM1ZWU5MjI1OGI5N2FhODNkZmE5M2M2MjE4MDAwMDAwMDA1NDAwMDA4MDAwMDAwMDgwMDAwMDAwODAwMTAwMDAwMDUwMDAwMDAwMDAnO1xuICBjb25zdCBuZXR3b3JrID0gdXR4b2xpYi5uZXR3b3Jrcy50ZXN0bmV0O1xuICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgIHtcbiAgICAgIGFtb3VudFNhdDogMTAwMDAwbixcbiAgICAgIGFkZHJlc3M6ICd0YjFweDdkdTNyeHB0NW1xdG12YXV4bXBsN3hrMnFzbXY1eG16OWc3dzVkcnB6enVlbHg4NjlkcXdhcGU3aycsXG4gICAgfSxcbiAgXTtcbiAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAge1xuICAgICAgeHB1YjogJ3RwdWJEQ21pV01rVEpyWjI0dDFaNkVDUjNIeXluQ3laOXpHc1dxaGNMaDZINHlGSzJDRG96U3N6RDFwUDJMaTROeDFZWXRSY3ZtTmJkYjNuRDFTekZlall0UEZmVG9jVHYyRWFBZ0pDZzR6cEpwQScsXG4gICAgICBwdXJwb3NlOiA0OSxcbiAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgIGFjY291bnQ6IDAsXG4gICAgfSxcbiAgICB7XG4gICAgICB4cHViOiAndHB1YkRDRk43YnN4UjlVVEtnZ2RIMnBtdjVIZUhHUU5pRHJKd2ExRVpGdFA5c0g1UEYyOGkzN0ZIcG9ZU1lBUlFrS1o2TWk5OHBrcDdveXBEY3hGbUU0ZFFHcThqVjhHdjNMNmdtV0JlUndQeGtQJyxcbiAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgYWNjb3VudDogMCxcbiAgICB9LFxuICBdO1xuICBpdCgnc2hvdWxkIHBhcnNlIGEgdmFsaWQgd2l0aGRyYXcgUFNCVCcsICgpID0+IHtcbiAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgUFNCVCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KCdhc2Rhc2QnLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSwgL0VSUl9CVUZGRVJfT1VUX09GX0JPVU5EUy8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcycsICgpID0+IHtcbiAgICBjb25zdCBkaWZmZXJlbnRSZWNpcGllbnRzID0gW1xuICAgICAge1xuICAgICAgICAuLi5yZWNpcGllbnRzWzBdLFxuICAgICAgICBhZGRyZXNzOiAndGIxcXh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5eicsXG4gICAgICB9LFxuICAgIF07XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIGRpZmZlcmVudFJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9LCAvUFNCVCBvdXRwdXQgdGIxcHg3ZHUzcnhwdDVtcXRtdmF1eG1wbDd4azJxc212NXhtejlnN3c1ZHJwenp1ZWx4ODY5ZHF3YXBlN2sgd2l0aCB2YWx1ZSAxMDAwMDAgZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudC8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCByZWNpcGllbnQgdmFsdWUnLCAoKSA9PiB7XG4gICAgY29uc3QgZGlmZmVyZW50UmVjaXBpZW50cyA9IFtcbiAgICAgIHtcbiAgICAgICAgLi4ucmVjaXBpZW50c1swXSxcbiAgICAgICAgYW1vdW50U2F0OiA5OTk5OW4sXG4gICAgICB9LFxuICAgIF07XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIGRpZmZlcmVudFJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9LCAvUFNCVCBvdXRwdXQgdGIxcHg3ZHUzcnhwdDVtcXRtdmF1eG1wbDd4azJxc212NXhtejlnN3c1ZHJwenp1ZWx4ODY5ZHF3YXBlN2sgd2l0aCB2YWx1ZSAxMDAwMDAgZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudC8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgYWNjb3VudCBub3QgZm91bmQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5jb21wYXRpYmxlQWNjb3VudHMgPSBbXTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHVuc2lnbmVkUHNidEhleCwgbmV0d29yaywgcmVjaXBpZW50cywgaW5jb21wYXRpYmxlQWNjb3VudHMpO1xuICAgIH0sIC9BY2NvdW50IG5vdCBmb3VuZCBmb3IgcHVycG9zZS8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBwdWJrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgaW5jb21wYXRpYmxlQWNjb3VudHMgPSBbXG4gICAgICB7XG4gICAgICAgIC4uLmFjY291bnRzWzFdLFxuICAgICAgICB4cHViOiAndHB1YkRDbWlXTWtUSnJaMjR0MVo2RUNSM0h5eW5DeVo5ekdzV3FoY0xoNkg0eUZLMkNEb3pTc3pEMXBQMkxpNE54MVlZdFJjdm1OYmRiM25EMVN6RmVqWXRQRmZUb2NUdjJFYUFnSkNnNHpwSnBBJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHVuc2lnbmVkUHNidEhleCwgbmV0d29yaywgcmVjaXBpZW50cywgaW5jb21wYXRpYmxlQWNjb3VudHMpO1xuICAgIH0sIC9EZXJpdmVkIHB1YmtleSBkb2VzIG5vdCBtYXRjaCBmb3IgYWRkcmVzcy8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBwdXJwb3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IGluY29tcGF0aWJsZUFjY291bnRzID0gW1xuICAgICAge1xuICAgICAgICAuLi5hY2NvdW50c1sxXSxcbiAgICAgICAgcHVycG9zZTogMTAxNyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBpbmNvbXBhdGlibGVQc2J0ID0gYDcwNzM2Mjc0ZmYwMTAwN2QwMjAwMDAwMDAxNWU1MGI4ZDk2Y2ViZGMzMjczZDlhMTAwZWI2ODM5MmQ5ODBkNWI5MzRiODE3MGM4MGEyMzQ4OGI1OTUyNjhjYTAxMDAwMDAwMDBmZmZmZmZmZjAyYTA4NjAxMDAwMDAwMDAwMDIyNTEyMDM3OWJjODhjYzE1ZDM2MDVlZDlkZTFiNjFmZjhkNjUwMjFiNjUwZGIxMTUxZTc1MWEzMDg4NWNjZmNjN2QxNWFmZmE4MGEwMDAwMDAwMDAwMTYwMDE0ODBhMDZmMmU2Yjc3ZTgxN2ZkNWRlNmU0MWVhNTEyYzU2M2MyNmNiODAwMDAwMDAwMDAwMTAwZWEwMjAwMDAwMDAwMDEwMWExNThkODA2NzM1YmI3YzU0ZTRjNzAxZDRmNTgyMWNkNTM0MmQ0OGQ1ZTFmY2JlZDExNjllNmU0NWFhNDQ0YmUwMTAwMDAwMDAwZmZmZmZmZmYwMmEwODYwMTAwMDAwMDAwMDAyMjUxMjAzNzliYzg4Y2MxNWQzNjA1ZWQ5ZGUxYjYxZmY4ZDY1MDIxYjY1MGRiMTE1MWU3NTFhMzA4ODVjY2ZjYzdkMTVhNmEzMTBjMDAwMDAwMDAwMDE2MDAxNDc4YTVkOThjNzE2MDQ4NGI5YjAwZjE3ODI4MDNjNThlZGZjNDliOWEwMjQ3MzA0NDAyMjA0MDdkOTE2MmY1MjM3MWRmMjQ2ZGNmYTI5NDNkNDBmYmRjYjBkNGI2NzY4Zjc2ODJjNjUxOTMzNzhiMjg0NWE2MDIyMDEwMWM3YmM0NjBjOTNkMjk3Njk2MWFjMjM0MDBmMGYxMGMxNDVlZmI5ODlhM2FkZGI3ZjAzZWJhYWEyMjAwOTUwMTIxMDM3ZTE3NDQ0Yzg1YzhiN2RhMDdmMTJmZDUzY2IyY2ExNDJjMmI0OTMyZDBmODk4NjQ5YzRiNWJlMDAyMWRhMDk4MDAwMDAwMDAwMTAzMDQwMTAwMDAwMDIyMDYwMmU1NzE0NmU1YjQ3NjJhN2ZmMzc0YWRmNDA3MjA0N2I2N2VmMTE1YWQ0NmEzNDE4OWJkZWI2YTRmODhkYjliMDgxODAwMDAwMDAwNTQwMDAwODAwMDAwMDA4MDAwMDAwMDgwMDEwMDAwMDAwNjAwMDAwMDAwMDAyMjAyMDM3OWFiYmU0NDAwNGZmN2U1MjdiZGVlM2RkOGQ5NWU1Y2QyNTAwNTNmMzVlZTkyMjU4Yjk3YWE4M2RmYTkzYzYyMTgwMDAwMDAwMGY5MDMwMDgwMDAwMDAwODAwMDAwMDA4MDAxMDAwMDAwNTAwMDAwMDAwMGA7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhpbmNvbXBhdGlibGVQc2J0LCBuZXR3b3JrLCByZWNpcGllbnRzLCBpbmNvbXBhdGlibGVBY2NvdW50cyk7XG4gICAgfSwgL1Vuc3VwcG9ydGVkIHB1cnBvc2UvKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
441
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXRoZHJhd1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGlnaHRuaW5nL3BhcnNlV2l0aGRyYXdQc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQXVEO0FBQ3ZELHlEQUEyQztBQUMzQyxvREFBNEI7QUFDNUIsNkNBQThDO0FBRTlDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7SUFDakMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFFekMsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxtRkFBbUY7UUFDbkYsTUFBTSxlQUFlLEdBQ25CLDQrQkFBNCtCLENBQUM7UUFDLytCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCO2dCQUNFLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixPQUFPLEVBQUUsZ0VBQWdFO2FBQzFFO1NBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtnQkFDdkgsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNEO2dCQUNFLElBQUksRUFBRSxpSEFBaUg7Z0JBQ3ZILE9BQU8sRUFBRSxFQUFFO2dCQUNYLFNBQVMsRUFBRSxDQUFDO2dCQUNaLE9BQU8sRUFBRSxDQUFDO2FBQ1g7U0FDRixDQUFDO1FBRUYsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtZQUMzQyxnQkFB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O2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUHNidEZvcldpdGhkcmF3IH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZVRlc3RQc2J0IH0gZnJvbSAnLi9jcmVhdGVQc2J0JztcblxuZGVzY3JpYmUoJ3BhcnNlV2l0aGRyYXdQc2J0JywgKCkgPT4ge1xuICBjb25zdCBuZXR3b3JrID0gdXR4b2xpYi5uZXR3b3Jrcy50ZXN0bmV0O1xuXG4gIGRlc2NyaWJlKCdyZWdyZXNzaW9uIHRlc3RzIHdpdGggaGFyZGNvZGVkIFBTQlQnLCAoKSA9PiB7XG4gICAgLy8gS2VlcGluZyBvbmUgcmVncmVzc2lvbiB0ZXN0IHdpdGggcmVhbCBQU0JUIGRhdGEgdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCB1bnNpZ25lZFBzYnRIZXggPVxuICAgICAgJzcwNzM2Mjc0ZmYwMTAwN2QwMjAwMDAwMDAxNWU1MGI4ZDk2Y2ViZGMzMjczZDlhMTAwZWI2ODM5MmQ5ODBkNWI5MzRiODE3MGM4MGEyMzQ4OGI1OTUyNjhjYTAxMDAwMDAwMDBmZmZmZmZmZjAyYTA4NjAxMDAwMDAwMDAwMDIyNTEyMDM3OWJjODhjYzE1ZDM2MDVlZDlkZTFiNjFmZjhkNjUwMjFiNjUwZGIxMTUxZTc1MWEzMDg4NWNjZmNjN2QxNWFmZmE4MGEwMDAwMDAwMDAwMTYwMDE0ODBhMDZmMmU2Yjc3ZTgxN2ZkNWRlNmU0MWVhNTEyYzU2M2MyNmNiODAwMDAwMDAwMDAwMTAwZWEwMjAwMDAwMDAwMDEwMWExNThkODA2NzM1YmI3YzU0ZTRjNzAxZDRmNTgyMWNkNTM0MmQ0OGQ1ZTFmY2JlZDExNjllNmU0NWFhNDQ0YmUwMTAwMDAwMDAwZmZmZmZmZmYwMmEwODYwMTAwMDAwMDAwMDAyMjUxMjAzNzliYzg4Y2MxNWQzNjA1ZWQ5ZGUxYjYxZmY4ZDY1MDIxYjY1MGRiMTE1MWU3NTFhMzA4ODVjY2ZjYzdkMTVhNmEzMTBjMDAwMDAwMDAwMDE2MDAxNDc4YTVkOThjNzE2MDQ4NGI5YjAwZjE3ODI4MDNjNThlZGZjNDliOWEwMjQ3MzA0NDAyMjA0MDdkOTE2MmY1MjM3MWRmMjQ2ZGNmYTI5NDNkNDBmYmRjYjBkNGI2NzY4Zjc2ODJjNjUxOTMzNzhiMjg0NWE2MDIyMDEwMWM3YmM0NjBjOTNkMjk3Njk2MWFjMjM0MDBmMGYxMGMxNDVlZmI5ODlhM2FkZGI3ZjAzZWJhYWEyMjAwOTUwMTIxMDM3ZTE3NDQ0Yzg1YzhiN2RhMDdmMTJmZDUzY2IyY2ExNDJjMmI0OTMyZDBmODk4NjQ5YzRiNWJlMDAyMWRhMDk4MDAwMDAwMDAwMTAzMDQwMTAwMDAwMDIyMDYwMmU1NzE0NmU1YjQ3NjJhN2ZmMzc0YWRmNDA3MjA0N2I2N2VmMTE1YWQ0NmEzNDE4OWJkZWI2YTRmODhkYjliMDgxODAwMDAwMDAwNTQwMDAwODAwMDAwMDA4MDAwMDAwMDgwMDEwMDAwMDAwNjAwMDAwMDAwMDAyMjAyMDM3OWFiYmU0NDAwNGZmN2U1MjdiZGVlM2RkOGQ5NWU1Y2QyNTAwNTNmMzVlZTkyMjU4Yjk3YWE4M2RmYTkzYzYyMTgwMDAwMDAwMDU0MDAwMDgwMDAwMDAwODAwMDAwMDA4MDAxMDAwMDAwNTAwMDAwMDAwMCc7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYW1vdW50U2F0OiAxMDAwMDBuLFxuICAgICAgICBhZGRyZXNzOiAndGIxcHg3ZHUzcnhwdDVtcXRtdmF1eG1wbDd4azJxc212NXhtejlnN3c1ZHJwenp1ZWx4ODY5ZHF3YXBlN2snLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAge1xuICAgICAgICB4cHViOiAndHB1YkRDbWlXTWtUSnJaMjR0MVo2RUNSM0h5eW5DeVo5ekdzV3FoY0xoNkg0eUZLMkNEb3pTc3pEMXBQMkxpNE54MVlZdFJjdm1OYmRiM25EMVN6RmVqWXRQRmZUb2NUdjJFYUFnSkNnNHpwSnBBJyxcbiAgICAgICAgcHVycG9zZTogNDksXG4gICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgYWNjb3VudDogMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHhwdWI6ICd0cHViRENGTjdic3hSOVVUS2dnZEgycG12NUhlSEdRTmlEckp3YTFFWkZ0UDlzSDVQRjI4aTM3Rkhwb1lTWUFSUWtLWjZNaTk4cGtwN295cERjeEZtRTRkUUdxOGpWOEd2M0w2Z21XQmVSd1B4a1AnLFxuICAgICAgICBwdXJwb3NlOiA4NCxcbiAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHZhbGlkIHdpdGhkcmF3IFBTQlQnLCAoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgUFNCVCBoZXgnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcoJ2FzZGFzZCcsIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICAgIH0sIC9FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Rlc3QgY2FzZXMgd2l0aCBjcmVhdGluZyBwc2J0IG9uIHRoZSBnbycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBQMldQS0ggKHB1cnBvc2UgODQpIGNoYW5nZSBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwc2J0LCBtYXN0ZXJLZXkgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NCxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIFAyU0gtUDJXUEtIIChwdXJwb3NlIDQ5KSBjaGFuZ2UgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCwgbWFzdGVyS2V5IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogNDksXG4gICAgICAgIGNoYW5nZURlcml2YXRpb25QYXRoOiBcIm0vNDknLzAnLzAnLzEvNlwiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBtYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDQ5LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBQMlRSIChwdXJwb3NlIDg2KSBjaGFuZ2UgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCwgbWFzdGVyS2V5IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogODYsXG4gICAgICAgIGNoYW5nZURlcml2YXRpb25QYXRoOiBcIm0vODYnLzAnLzAnLzEvNlwiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBtYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDg2LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBtaXNzaW5nIGJpcDMyRGVyaXZhdGlvbiBwYXRoIG9uIGNoYW5nZSBvdXRwdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQsIG1hc3RlcktleSB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgYmlwMzJEZXJpdmF0aW9uIGZyb20gdGhlIGNoYW5nZSBvdXRwdXRcbiAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSB0aGUgb3V0cHV0IHRvIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIHJlY2lwaWVudCBvdXRwdXQsIG5vdCBhIGNoYW5nZSBvdXRwdXRcbiAgICAgIGRlbGV0ZSBwc2J0LmRhdGEub3V0cHV0c1sxXS5iaXAzMkRlcml2YXRpb247XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBtYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVGhlIG91dHB1dCB3aXRob3V0IGJpcDMyRGVyaXZhdGlvbiBpcyB0cmVhdGVkIGFzIGEgcmVjaXBpZW50IG91dHB1dCxcbiAgICAgIC8vIGFuZCBzaW5jZSBpdCdzIG5vdCBpbiB0aGUgcmVjaXBpZW50cyBsaXN0LCBpdCBzaG91bGQgZmFpbCB3aXRoIFwiZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudFwiXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgICB9LCAvZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBjaGFuZ2UgYWRkcmVzcyAoZGVyaXZlZCBhZGRyZXNzIG1pc21hdGNoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzg0Jy8wJy8wJy8xLzZcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSBhIGRpZmZlcmVudCB4cHViIHRoYXQgd29uJ3QgbWF0Y2ggdGhlIGNoYW5nZSBhZGRyZXNzXG4gICAgICBjb25zdCBkaWZmZXJlbnRNYXN0ZXJLZXkgPSB1dHhvbGliLmJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygzMiwgMiksIG5ldHdvcmspO1xuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBkaWZmZXJlbnRNYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgICAgfSwgL0Rlcml2ZWQgcHVia2V5IGRvZXMgbm90IG1hdGNoIGZvciBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCB1cHViIHByZWZpeCAoUDJTSC1QMldQS0ggdGVzdG5ldCknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA0OSxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS80OScvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBVc2UgdXB1YiBwcmVmaXggKHRlc3RuZXQgUDJTSC1QMldQS0gpIGluc3RlYWQgb2Ygc3RhbmRhcmQgdHB1YlxuICAgICAgLy8gVGhpcyB0ZXN0cyB0aGF0IHJldmVydFhwdWJQcmVmaXggY29ycmVjdGx5IGNvbnZlcnRzIHVwdWIgLT4gdHB1YlxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiAndXB1YjVFZXA3SDVxMzlQelFaTFZFWUxCeXREeUJOZVY3NEU4bVFzeWVMNlVvekZxOVkzTXNaNTJHN1lHdXFySlBnb3lBcUY3VEJlSmRua3JIclZyQjVwa1drUEo5Y0pHQWVQTVU2RjFHeXc2YUZIJyxcbiAgICAgICAgICBwdXJwb3NlOiA0OSxcbiAgICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIHdvcmsgYmVjYXVzZSByZXZlcnRYcHViUHJlZml4IHdpbGwgY29udmVydCB1cHViIGJhY2sgdG8gdHB1YlxuICAgICAgLy8gSG93ZXZlciwgdGhlIG1hc3RlciBrZXkgd2UgdXNlZCBpcyBkaWZmZXJlbnQsIHNvIGl0IHNob3VsZCBmYWlsIHdpdGggcHVia2V5IG1pc21hdGNoXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgICB9LCAvRGVyaXZlZCBwdWJrZXkgZG9lcyBub3QgbWF0Y2ggZm9yIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIHZwdWIgcHJlZml4IChQMldQS0ggdGVzdG5ldCknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NCxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBVc2UgdnB1YiBwcmVmaXggKHRlc3RuZXQgUDJXUEtIKSBpbnN0ZWFkIG9mIHN0YW5kYXJkIHRwdWJcbiAgICAgIC8vIFRoaXMgdGVzdHMgdGhhdCByZXZlcnRYcHViUHJlZml4IGNvcnJlY3RseSBjb252ZXJ0cyB2cHViIC0+IHRwdWJcbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogJ3ZwdWI1WlUxUEhHcFFvRFNIY2tZaWNvNG5zdndzRDNtVGg2VWpxTDV6eUdXWFpYekJqVFlNTktvdDd0OWVSUFFZNzFoSmNuTk45cjFzczI1ZzN4QTlybW9KNW5XUGc4akVXYXZydHRuc1ZhMXF3MScsXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCB3b3JrIGJlY2F1c2UgcmV2ZXJ0WHB1YlByZWZpeCB3aWxsIGNvbnZlcnQgdnB1YiBiYWNrIHRvIHRwdWJcbiAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtYXN0ZXIga2V5IHdlIHVzZWQgaXMgZGlmZmVyZW50LCBzbyBpdCBzaG91bGQgZmFpbCB3aXRoIHB1YmtleSBtaXNtYXRjaFxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgICAgfSwgL0Rlcml2ZWQgcHVia2V5IGRvZXMgbm90IG1hdGNoIGZvciBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBtYXRjaGluZyB1cHViIHByZWZpeCBhbmQgY29ycmVjdCBrZXknLCAoKSA9PiB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHNpZ25lciByb290IGtleSBmcm9tIHRoZSBmaXh0dXJlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSB1cHViL3ZwdWIgYWNjb3VudHNcbiAgICAgIGNvbnN0IHNpZ25lclJvb3RLZXkgPVxuICAgICAgICAndHBydjhaZ3hNQmljUUtzUGU2alM0dkRtMm43czQyUTZNcHZnaFVRcU1tU0tHN2JUWnZHS3RqcmNVM1BHek1ORzM3eXp4eXdyY2R2Z2t3cnI4ZVlYSm1id2R2VU5WVDRVY3Y3cmlzNGp2QTdCVW1nJztcbiAgICAgIGNvbnN0IG1hc3RlckhETm9kZSA9IHV0eG9saWIuYmlwMzIuZnJvbUJhc2U1OChzaWduZXJSb290S2V5LCBuZXR3b3JrKTtcblxuICAgICAgLy8gRGVyaXZlIHRoZSBhY2NvdW50IGtleSBmb3IgcHVycG9zZSA0OVxuICAgICAgY29uc3QgYWNjb3VudEtleSA9IG1hc3RlckhETm9kZS5kZXJpdmVQYXRoKFwibS80OScvMCcvMCdcIik7XG5cbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDQ5LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzQ5Jy8wJy8wJy8xLzZcIixcbiAgICAgICAgbWFzdGVyS2V5OiBhY2NvdW50S2V5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVXNlIHRoZSB1cHViIGZyb20gdGhlIGZpeHR1cmUgLSB0aGlzIHNob3VsZCB3b3JrIGJlY2F1c2UgdGhlIGtleXMgbWF0Y2hcbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogJ3VwdWI1RWVwN0g1cTM5UHpRWkxWRVlMQnl0RHlCTmVWNzRFOG1Rc3llTDZVb3pGcTlZM01zWjUyRzdZR3VxckpQZ295QXFGN1RCZUpkbmtySHJWckI1cGtXa1BKOWNKR0FlUE1VNkYxR3l3NmFGSCcsXG4gICAgICAgICAgcHVycG9zZTogNDksXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCBwYXNzIC0gcmV2ZXJ0WHB1YlByZWZpeCBjb252ZXJ0cyB1cHViIC0+IHRwdWIsIGFuZCB0aGUga2V5IG1hdGNoZXNcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBQU0JUIHdpdGggbWF0Y2hpbmcgdnB1YiBwcmVmaXggYW5kIGNvcnJlY3Qga2V5JywgKCkgPT4ge1xuICAgICAgLy8gSW1wb3J0IHRoZSBzaWduZXIgcm9vdCBrZXkgZnJvbSB0aGUgZml4dHVyZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgdXB1Yi92cHViIGFjY291bnRzXG4gICAgICBjb25zdCBzaWduZXJSb290S2V5ID1cbiAgICAgICAgJ3RwcnY4Wmd4TUJpY1FLc1BlNmpTNHZEbTJuN3M0MlE2TXB2Z2hVUXFNbVNLRzdiVFp2R0t0anJjVTNQR3pNTkczN3l6eHl3cmNkdmdrd3JyOGVZWEptYndkdlVOVlQ0VWN2N3JpczRqdkE3QlVtZyc7XG4gICAgICBjb25zdCBtYXN0ZXJIRE5vZGUgPSB1dHhvbGliLmJpcDMyLmZyb21CYXNlNTgoc2lnbmVyUm9vdEtleSwgbmV0d29yayk7XG5cbiAgICAgIC8vIERlcml2ZSB0aGUgYWNjb3VudCBrZXkgZm9yIHB1cnBvc2UgODRcbiAgICAgIGNvbnN0IGFjY291bnRLZXkgPSBtYXN0ZXJIRE5vZGUuZGVyaXZlUGF0aChcIm0vODQnLzAnLzAnXCIpO1xuXG4gICAgICBjb25zdCB7IHBzYnQgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NCxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICAgIG1hc3RlcktleTogYWNjb3VudEtleSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSB0aGUgdnB1YiBmcm9tIHRoZSBmaXh0dXJlIC0gdGhpcyBzaG91bGQgd29yayBiZWNhdXNlIHRoZSBrZXlzIG1hdGNoXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6ICd2cHViNVpVMVBIR3BRb0RTSGNrWWljbzRuc3Z3c0QzbVRoNlVqcUw1enlHV1haWHpCalRZTU5Lb3Q3dDllUlBRWTcxaEpjbk5OOXIxc3MyNWczeEE5cm1vSjVuV1BnOGpFV2F2cnR0bnNWYTFxdzEnLFxuICAgICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgcGFzcyAtIHJldmVydFhwdWJQcmVmaXggY29udmVydHMgdnB1YiAtPiB0cHViLCBhbmQgdGhlIGtleSBtYXRjaGVzXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIG11bHRpcGxlIHJlY2lwaWVudHMnLCAoKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBQU0JUIG1hbnVhbGx5IHdpdGggMiByZWNpcGllbnQgb3V0cHV0cyBhbmQgMSBjaGFuZ2Ugb3V0cHV0XG4gICAgICBjb25zdCBtYXN0ZXJLZXkgPSB1dHhvbGliLmJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygzMiwgMSksIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCBpbnB1dEtleVBhaXIgPSB1dHhvbGliLkVDUGFpci5tYWtlUmFuZG9tKHsgbmV0d29yayB9KTtcbiAgICAgIGNvbnN0IHAyd3BraElucHV0ID0gdXR4b2xpYi5wYXltZW50cy5wMndwa2goe1xuICAgICAgICBwdWJrZXk6IEJ1ZmZlci5mcm9tKGlucHV0S2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHBzYnQgPSBuZXcgdXR4b2xpYi5Qc2J0KHsgbmV0d29yayB9KTtcblxuICAgICAgLy8gQWRkIGlucHV0XG4gICAgICBwc2J0LmFkZElucHV0KHtcbiAgICAgICAgaGFzaDogJ2NhNjg1MjU5OGI0ODIzMGFjODcwODE0YjkzNWIwZDk4MmQzOTY4ZWIwMGExZDk3MzMyZGNlYjZjZDliODUwNWUnLFxuICAgICAgICBpbmRleDogMSxcbiAgICAgICAgd2l0bmVzc1V0eG86IHtcbiAgICAgICAgICBzY3JpcHQ6IHAyd3BraElucHV0Lm91dHB1dCEsXG4gICAgICAgICAgdmFsdWU6IEJpZ0ludCg1MDAwMDApLFxuICAgICAgICB9LFxuICAgICAgICBiaXAzMkRlcml2YXRpb246IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogQnVmZmVyLmFsbG9jKDQsIDApLFxuICAgICAgICAgICAgcGF0aDogXCJtLzg0Jy8wJy8wJy8wLzBcIixcbiAgICAgICAgICAgIHB1YmtleTogQnVmZmVyLmZyb20oaW5wdXRLZXlQYWlyLnB1YmxpY0tleSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgZmlyc3QgcmVjaXBpZW50XG4gICAgICBjb25zdCByZWNpcGllbnQxS2V5UGFpciA9IHV0eG9saWIuRUNQYWlyLm1ha2VSYW5kb20oeyBuZXR3b3JrIH0pO1xuICAgICAgY29uc3QgcmVjaXBpZW50MVBheW1lbnQgPSB1dHhvbGliLnBheW1lbnRzLnAyd3BraCh7XG4gICAgICAgIHB1YmtleTogQnVmZmVyLmZyb20ocmVjaXBpZW50MUtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgbmV0d29yayxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVjaXBpZW50MUFkZHJlc3MgPSByZWNpcGllbnQxUGF5bWVudC5hZGRyZXNzITtcblxuICAgICAgLy8gQ3JlYXRlIHNlY29uZCByZWNpcGllbnRcbiAgICAgIGNvbnN0IHJlY2lwaWVudDJLZXlQYWlyID0gdXR4b2xpYi5FQ1BhaXIubWFrZVJhbmRvbSh7IG5ldHdvcmsgfSk7XG4gICAgICBjb25zdCByZWNpcGllbnQyUGF5bWVudCA9IHV0eG9saWIucGF5bWVudHMucDJ3cGtoKHtcbiAgICAgICAgcHVia2V5OiBCdWZmZXIuZnJvbShyZWNpcGllbnQyS2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZWNpcGllbnQyQWRkcmVzcyA9IHJlY2lwaWVudDJQYXltZW50LmFkZHJlc3MhO1xuXG4gICAgICAvLyBEZXJpdmUgY2hhbmdlIGFkZHJlc3MgZnJvbSBtYXN0ZXIga2V5XG4gICAgICBjb25zdCBjaGFuZ2VOb2RlID0gbWFzdGVyS2V5LmRlcml2ZSgxKS5kZXJpdmUoNik7IC8vIG0vMS82XG4gICAgICBjb25zdCBjaGFuZ2VQYXltZW50ID0gdXR4b2xpYi5wYXltZW50cy5wMndwa2goe1xuICAgICAgICBwdWJrZXk6IGNoYW5nZU5vZGUucHVibGljS2V5LFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0gY2hhbmdlUGF5bWVudC5hZGRyZXNzITtcblxuICAgICAgLy8gQWRkIG91dHB1dHM6IHJlY2lwaWVudDEsIHJlY2lwaWVudDIsIGNoYW5nZVxuICAgICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQxQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgfSk7XG5cbiAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgYWRkcmVzczogcmVjaXBpZW50MkFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiBCaWdJbnQoNTAwMDApLFxuICAgICAgfSk7XG5cbiAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgYWRkcmVzczogY2hhbmdlQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgzNDAwMDApLCAvLyA1MDAwMDAgLSAxMDAwMDAgLSA1MDAwMCAtIDEwMDAwIChmZWUpXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGJpcDMyRGVyaXZhdGlvbiB0byB0aGUgY2hhbmdlIG91dHB1dCAoaW5kZXggMilcbiAgICAgIHBzYnQudXBkYXRlT3V0cHV0KDIsIHtcbiAgICAgICAgYmlwMzJEZXJpdmF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IEJ1ZmZlci5hbGxvYyg0LCAwKSxcbiAgICAgICAgICAgIHBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICAgICAgICBwdWJrZXk6IGNoYW5nZU5vZGUucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50MUFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCg1MDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50MkFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|