@bitgo/sdk-coin-sui 6.1.0 → 6.2.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.
@@ -82,6 +82,7 @@ describe('Walrus Staking Builder', () => {
82
82
  const ptb = tx.suiTransaction.tx;
83
83
  ptb.inputs.length.should.equal(5); // WAL object, Staking shared object, Amount, Validator
84
84
  ptb.transactions[0].kind.should.equal('SplitCoins'); // Only providing one WAL token
85
+ should_1.default.not.exist(tx.suiTransaction.fundsInAddressBalance);
85
86
  });
86
87
  it('should build a staking tx for multiple gas objects and WAL tokens', async function () {
87
88
  const numberOfInputObjects = 100;
@@ -129,6 +130,122 @@ describe('Walrus Staking Builder', () => {
129
130
  rebuiltTx.toJson().gasData.payment.length.should.equal(numberOfGasPaymentObjects);
130
131
  rebuiltTx.toJson().inputObjects.length.should.equal(numberOfInputObjects);
131
132
  });
133
+ it('should build a staking tx with mixed WAL coin objects and address balance', async function () {
134
+ const addrBal = testData.STAKING_AMOUNT.toString();
135
+ const txBuilder = factory.getWalrusStakingBuilder();
136
+ txBuilder.type(iface_1.SuiTransactionType.WalrusStakeWithPool);
137
+ txBuilder.sender(testData.sender.address);
138
+ txBuilder.stake([testData.requestWalrusStakeWithPool]);
139
+ txBuilder.gasData(testData.gasData);
140
+ txBuilder.inputObjects([testData.walToken]);
141
+ txBuilder.fundsInAddressBalance(addrBal);
142
+ const tx = await txBuilder.build();
143
+ (0, assert_1.default)(tx instanceof transaction_1.Transaction);
144
+ tx.type.should.equal(sdk_core_1.TransactionType.StakingAdd);
145
+ should_1.default.exist(tx.suiTransaction.fundsInAddressBalance);
146
+ tx.suiTransaction.fundsInAddressBalance.should.equal(addrBal);
147
+ const ptb = tx.suiTransaction.tx;
148
+ // redeem_funds MoveCall, mergeCoins(walCoin, redeemedCoin), splitCoins, stake_with_pool MoveCall,
149
+ // transferObjects(stakedWals), transferObjects(residualWal)
150
+ const kinds = ptb.transactions.map((t) => t.kind);
151
+ kinds.should.containEql('MoveCall'); // redeem_funds
152
+ kinds.should.containEql('MergeCoins'); // merge redeemed into existing coin
153
+ kinds.should.containEql('SplitCoins');
154
+ kinds.filter((k) => k === 'TransferObjects').length.should.equal(2); // staked WALs + residual WAL
155
+ const rawTx = tx.toBroadcastFormat();
156
+ utils_1.default.isValidRawTransaction(rawTx).should.be.true();
157
+ // Round-trip: rebuild from raw transaction
158
+ const rebuilder = factory.from(rawTx);
159
+ rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
160
+ const rebuiltTx = await rebuilder.build();
161
+ rebuiltTx.toBroadcastFormat().should.equal(rawTx);
162
+ should_1.default.exist(rebuiltTx.toJson().fundsInAddressBalance);
163
+ rebuiltTx.toJson().fundsInAddressBalance.should.equal(addrBal);
164
+ rebuiltTx.toJson().inputObjects.length.should.equal(1);
165
+ });
166
+ it('should build a staking tx with address balance only (exact amount)', async function () {
167
+ const addrBal = testData.STAKING_AMOUNT.toString();
168
+ const txBuilder = factory.getWalrusStakingBuilder();
169
+ txBuilder.type(iface_1.SuiTransactionType.WalrusStakeWithPool);
170
+ txBuilder.sender(testData.sender.address);
171
+ txBuilder.stake([testData.requestWalrusStakeWithPool]);
172
+ txBuilder.gasData(testData.gasData);
173
+ txBuilder.fundsInAddressBalance(addrBal);
174
+ const tx = await txBuilder.build();
175
+ (0, assert_1.default)(tx instanceof transaction_1.Transaction);
176
+ tx.type.should.equal(sdk_core_1.TransactionType.StakingAdd);
177
+ should_1.default.exist(tx.suiTransaction.fundsInAddressBalance);
178
+ tx.suiTransaction.fundsInAddressBalance.should.equal(addrBal);
179
+ const ptb = tx.suiTransaction.tx;
180
+ // No coin object inputs — first tx is MoveCall (redeem_funds)
181
+ ptb.transactions[0].kind.should.equal('MoveCall');
182
+ // Verify redeem_funds uses WAL type, not SUI
183
+ const redeemCall = ptb.transactions[0];
184
+ redeemCall.typeArguments[0].should.containEql('::wal::WAL');
185
+ // BalanceWithdrawal input must carry the WAL coin type, not SUI
186
+ const withdrawalInput = ptb.inputs.find((i) => {
187
+ const v = i?.BalanceWithdrawal ?? i?.value?.BalanceWithdrawal;
188
+ return v !== undefined;
189
+ });
190
+ should_1.default.exist(withdrawalInput);
191
+ const bw = withdrawalInput.BalanceWithdrawal ?? withdrawalInput.value?.BalanceWithdrawal;
192
+ // typeArg is { Balance: <TypeTag> } where TypeTag encodes the coin type
193
+ JSON.stringify(bw.typeArg).should.containEql('wal');
194
+ // Two TransferObjects: staked WALs + residual WAL
195
+ const transferTxs = ptb.transactions.filter((t) => t.kind === 'TransferObjects');
196
+ transferTxs.length.should.equal(2);
197
+ should_1.default.not.exist(tx.toJson().inputObjects);
198
+ const rawTx = tx.toBroadcastFormat();
199
+ utils_1.default.isValidRawTransaction(rawTx).should.be.true();
200
+ // Round-trip: rebuild from raw transaction
201
+ const rebuilder = factory.from(rawTx);
202
+ rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
203
+ const rebuiltTx = await rebuilder.build();
204
+ rebuiltTx.toBroadcastFormat().should.equal(rawTx);
205
+ should_1.default.exist(rebuiltTx.toJson().fundsInAddressBalance);
206
+ rebuiltTx.toJson().fundsInAddressBalance.should.equal(addrBal);
207
+ });
208
+ it('should build a staking tx with address balance only (partial / residual transfer)', async function () {
209
+ // Request is for STAKING_AMOUNT but we fund double that from addr-bal — residual goes back to sender
210
+ const addrBal = (testData.STAKING_AMOUNT * 2).toString();
211
+ const txBuilder = factory.getWalrusStakingBuilder();
212
+ txBuilder.type(iface_1.SuiTransactionType.WalrusStakeWithPool);
213
+ txBuilder.sender(testData.sender.address);
214
+ txBuilder.stake([testData.requestWalrusStakeWithPool]);
215
+ txBuilder.gasData(testData.gasData);
216
+ txBuilder.fundsInAddressBalance(addrBal);
217
+ const tx = await txBuilder.build();
218
+ (0, assert_1.default)(tx instanceof transaction_1.Transaction);
219
+ should_1.default.exist(tx.suiTransaction.fundsInAddressBalance);
220
+ tx.suiTransaction.fundsInAddressBalance.should.equal(addrBal);
221
+ const ptb = tx.suiTransaction.tx;
222
+ // residual WAL coin must be transferred back to sender
223
+ const transferTxs = ptb.transactions.filter((t) => t.kind === 'TransferObjects');
224
+ transferTxs.length.should.equal(2);
225
+ const rawTx = tx.toBroadcastFormat();
226
+ utils_1.default.isValidRawTransaction(rawTx).should.be.true();
227
+ const rebuilder = factory.from(rawTx);
228
+ rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
229
+ const rebuiltTx = await rebuilder.build();
230
+ rebuiltTx.toBroadcastFormat().should.equal(rawTx);
231
+ should_1.default.exist(rebuiltTx.toJson().fundsInAddressBalance);
232
+ rebuiltTx.toJson().fundsInAddressBalance.should.equal(addrBal);
233
+ });
234
+ it('should have default fundsInAddressBalance of 0 when setter not called', async function () {
235
+ const txBuilder = factory.getWalrusStakingBuilder();
236
+ txBuilder.type(iface_1.SuiTransactionType.WalrusStakeWithPool);
237
+ txBuilder.sender(testData.sender.address);
238
+ txBuilder.stake([testData.requestWalrusStakeWithPool]);
239
+ txBuilder.gasData(testData.gasData);
240
+ txBuilder.inputObjects([testData.walToken]);
241
+ const tx = await txBuilder.build();
242
+ (0, assert_1.default)(tx instanceof transaction_1.Transaction);
243
+ should_1.default.not.exist(tx.suiTransaction.fundsInAddressBalance);
244
+ // PTB should not contain a redeem_funds call
245
+ const ptb = tx.suiTransaction.tx;
246
+ const moveCalls = ptb.transactions.filter((t) => t.kind === 'MoveCall');
247
+ moveCalls.every((mc) => !mc.target?.includes('redeem_funds')).should.be.true();
248
+ });
132
249
  });
133
250
  describe('Fail', () => {
134
251
  it('should fail for invalid sender', async function () {
@@ -157,6 +274,16 @@ describe('Walrus Staking Builder', () => {
157
274
  };
158
275
  (0, should_1.default)(() => builder.gasData(invalidGasPayment)).throwError('Invalid payment, invalid or missing version');
159
276
  });
277
+ it('should fail when neither inputObjects nor fundsInAddressBalance is provided', async function () {
278
+ const txBuilder = factory.getWalrusStakingBuilder();
279
+ txBuilder.type(iface_1.SuiTransactionType.WalrusStakeWithPool);
280
+ txBuilder.sender(testData.sender.address);
281
+ txBuilder.stake([testData.requestWalrusStakeWithPool]);
282
+ txBuilder.gasData(testData.gasData);
283
+ await txBuilder
284
+ .build()
285
+ .should.be.rejectedWith('either inputObjects or fundsInAddressBalance is required before building');
286
+ });
160
287
  });
161
288
  });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FscnVzU3Rha2luZ0J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dhbHJ1c1N0YWtpbmdCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDREQUF5RDtBQUN6RCw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBQzVCLDhDQUFrRDtBQUNsRCxtRUFBMkM7QUFDM0MsOERBQTZFO0FBQzdFLGtEQUE0RDtBQUU1RCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUs7WUFDbkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDcEQsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUN2RCxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFbkMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsWUFBWSx5QkFBYyxDQUFDLENB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T0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDN0csQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiBhcyBTdWlUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3VpVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmRlc2NyaWJlKCdXYWxydXMgU3Rha2luZyBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3RzdWk6d2FsJyk7XG5cbiAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHN0YWtpbmcgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzU3Rha2VXaXRoUG9vbCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2xdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyhbdGVzdERhdGEud2FsVG9rZW5dKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydCh0eCBpbnN0YW5jZW9mIFN1aVRyYW5zYWN0aW9uKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLlNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpOndhbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWk6d2FsJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICB1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG5cbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEub3duZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmdhc0RhdGEub3duZXIpO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wcmljZS5zaG91bGQuZXF1YWwodGVzdERhdGEuZ2FzRGF0YS5wcmljZSk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLmJ1ZGdldC5zaG91bGQuZXF1YWwodGVzdERhdGEuZ2FzRGF0YS5idWRnZXQpO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wYXltZW50Lmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEuZ2FzRGF0YS5wYXltZW50Lmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IHB0YiA9IHR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgcHRiLmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDUpOyAvLyBXQUwgb2JqZWN0LCBTdGFraW5nIHNoYXJlZCBvYmplY3QsIEFtb3VudCwgVmFsaWRhdG9yXG4gICAgICBwdGIudHJhbnNhY3Rpb25zWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJyk7IC8vIE9ubHkgcHJvdmlkaW5nIG9uZSBXQUwgdG9rZW5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzdGFraW5nIHR4IGZvciBtdWx0aXBsZSBnYXMgb2JqZWN0cyBhbmQgV0FMIHRva2VucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG51bWJlck9mSW5wdXRPYmplY3RzID0gMTAwO1xuICAgICAgY29uc3QgbnVtYmVyT2ZHYXNQYXltZW50T2JqZWN0cyA9IDEwO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzU3Rha2VXaXRoUG9vbCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2xdKTtcblxuICAgICAgY29uc3QgZ2FzRGF0YSA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YSxcbiAgICAgICAgcGF5bWVudDogdGVzdERhdGEuZ2VuZXJhdGVPYmplY3RzKG51bWJlck9mR2FzUGF5bWVudE9iamVjdHMpLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKGdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyh0ZXN0RGF0YS5nZW5lcmF0ZU9iamVjdHMobnVtYmVyT2ZJbnB1dE9iamVjdHMpKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydCh0eCBpbnN0YW5jZW9mIFN1aVRyYW5zYWN0aW9uKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLlNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpOndhbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWk6d2FsJyxcbiAgICAgIH0pO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwoZ2FzRGF0YS5vd25lcik7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnByaWNlLnNob3VsZC5lcXVhbChnYXNEYXRhLnByaWNlKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEuYnVkZ2V0LnNob3VsZC5lcXVhbChnYXNEYXRhLmJ1ZGdldCk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgxMCk7XG5cbiAgICAgIGNvbnN0IHB0YiA9IHR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgcHRiLmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKG51bWJlck9mSW5wdXRPYmplY3RzICsgNCk7XG4gICAgICBwdGIudHJhbnNhY3Rpb25zWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJyk7IC8vIE1lcmdlIGFsbCBpbnB1dCBvYmplY3RzIHByb3ZpZGVkXG4gICAgICBwdGIudHJhbnNhY3Rpb25zWzBdLnNvdXJjZXMubGVuZ3RoLnNob3VsZC5lcXVhbChudW1iZXJPZklucHV0T2JqZWN0cyAtIDEpO1xuICAgICAgcHRiLnRyYW5zYWN0aW9uc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpOyAvLyBTcGxpdCB0aGUgZGVzaXJlZCBhbW91bnQgb2ZmIG9mIHRoZSBpbnB1dCBvYmplY3RcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgICAgcmVidWlsdFR4LnRvSnNvbigpLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKG51bWJlck9mR2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgcmVidWlsdFR4LnRvSnNvbigpLmlucHV0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKG51bWJlck9mSW5wdXRPYmplY3RzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kZXIoJ3JhbmRvbVN0cmluZycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgc2VuZGVyLCBnb3Q6IHJhbmRvbVN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhc0RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRXYWxydXNTdGFraW5nQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5pbnZhbGlkR2FzT3duZXIpKS50aHJvd0Vycm9yKFxuICAgICAgICBgSW52YWxpZCBnYXMgYWRkcmVzcyAke3Rlc3REYXRhLmludmFsaWRHYXNPd25lci5vd25lcn1gXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhc0J1ZGdldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNCdWRnZXQpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGdhcyBidWRnZXQgLTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNQYXltZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRHYXNQYXltZW50ID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQsXG4gICAgICAgIHBheW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3RJZDogJycsXG4gICAgICAgICAgICB2ZXJzaW9uOiAtMSxcbiAgICAgICAgICAgIGRpZ2VzdDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKGludmFsaWRHYXNQYXltZW50KSkudGhyb3dFcnJvcignSW52YWxpZCBwYXltZW50LCBpbnZhbGlkIG9yIG1pc3NpbmcgdmVyc2lvbicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FscnVzU3Rha2luZ0J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dhbHJ1c1N0YWtpbmdCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDREQUF5RDtBQUN6RCw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBQzVCLDhDQUFrRDtBQUNsRCxtRUFBMkM7QUFDM0MsOERBQTZFO0FBQzdFLGtEQUE0RDtBQUU1RCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUs7WUFDbkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDcEQsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUN2RCxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFbkMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsWUFBWSx5QkFBYyxDQUFDLENB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aUJBQ1AsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsMEVBQTBFLENBQUMsQ0FBQztRQUN4RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFN1aVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBTdWlUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcblxuZGVzY3JpYmUoJ1dhbHJ1cyBTdGFraW5nIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aTp3YWwnKTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3Rha2luZyB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNTdGFrZVdpdGhQb29sKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbF0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuaW5wdXRPYmplY3RzKFt0ZXN0RGF0YS53YWxUb2tlbl0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgYXNzZXJ0KHR4IGluc3RhbmNlb2YgU3VpVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuU1RBS0lOR19BTU9VTlQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWk6d2FsJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2wudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aTp3YWwnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcblxuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuZ2FzRGF0YS5vd25lcik7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnByaWNlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5nYXNEYXRhLnByaWNlKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEuYnVkZ2V0LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5nYXNEYXRhLmJ1ZGdldCk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5nYXNEYXRhLnBheW1lbnQubGVuZ3RoKTtcblxuICAgICAgY29uc3QgcHRiID0gdHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICBwdGIuaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNSk7IC8vIFdBTCBvYmplY3QsIFN0YWtpbmcgc2hhcmVkIG9iamVjdCwgQW1vdW50LCBWYWxpZGF0b3JcbiAgICAgIHB0Yi50cmFuc2FjdGlvbnNbMF0ua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnKTsgLy8gT25seSBwcm92aWRpbmcgb25lIFdBTCB0b2tlblxuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHN0YWtpbmcgdHggZm9yIG11bHRpcGxlIGdhcyBvYmplY3RzIGFuZCBXQUwgdG9rZW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtYmVyT2ZJbnB1dE9iamVjdHMgPSAxMDA7XG4gICAgICBjb25zdCBudW1iZXJPZkdhc1BheW1lbnRPYmplY3RzID0gMTA7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNTdGFrZVdpdGhQb29sKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbF0pO1xuXG4gICAgICBjb25zdCBnYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBwYXltZW50OiB0ZXN0RGF0YS5nZW5lcmF0ZU9iamVjdHMobnVtYmVyT2ZHYXNQYXltZW50T2JqZWN0cyksXG4gICAgICB9O1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuaW5wdXRPYmplY3RzKHRlc3REYXRhLmdlbmVyYXRlT2JqZWN0cyhudW1iZXJPZklucHV0T2JqZWN0cykpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgYXNzZXJ0KHR4IGluc3RhbmNlb2YgU3VpVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuU1RBS0lOR19BTU9VTlQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWk6d2FsJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2wudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aTp3YWwnLFxuICAgICAgfSk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbChnYXNEYXRhLm93bmVyKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucHJpY2Uuc2hvdWxkLmVxdWFsKGdhc0RhdGEucHJpY2UpO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5idWRnZXQuc2hvdWxkLmVxdWFsKGdhc0RhdGEuYnVkZ2V0KTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDEwKTtcblxuICAgICAgY29uc3QgcHRiID0gdHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICBwdGIuaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwobnVtYmVyT2ZJbnB1dE9iamVjdHMgKyA0KTtcbiAgICAgIHB0Yi50cmFuc2FjdGlvbnNbMF0ua2luZC5zaG91bGQuZXF1YWwoJ01lcmdlQ29pbnMnKTsgLy8gTWVyZ2UgYWxsIGlucHV0IG9iamVjdHMgcHJvdmlkZWRcbiAgICAgIHB0Yi50cmFuc2FjdGlvbnNbMF0uc291cmNlcy5sZW5ndGguc2hvdWxkLmVxdWFsKG51bWJlck9mSW5wdXRPYmplY3RzIC0gMSk7XG4gICAgICBwdGIudHJhbnNhY3Rpb25zWzFdLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJyk7IC8vIFNwbGl0IHRoZSBkZXNpcmVkIGFtb3VudCBvZmYgb2YgdGhlIGlucHV0IG9iamVjdFxuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICB1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgICByZWJ1aWx0VHgudG9Kc29uKCkuZ2FzRGF0YS5wYXltZW50Lmxlbmd0aC5zaG91bGQuZXF1YWwobnVtYmVyT2ZHYXNQYXltZW50T2JqZWN0cyk7XG4gICAgICByZWJ1aWx0VHgudG9Kc29uKCkuaW5wdXRPYmplY3RzIS5sZW5ndGguc2hvdWxkLmVxdWFsKG51bWJlck9mSW5wdXRPYmplY3RzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzdGFraW5nIHR4IHdpdGggbWl4ZWQgV0FMIGNvaW4gb2JqZWN0cyBhbmQgYWRkcmVzcyBiYWxhbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkckJhbCA9IHRlc3REYXRhLlNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNTdGFrZVdpdGhQb29sKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbF0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuaW5wdXRPYmplY3RzKFt0ZXN0RGF0YS53YWxUb2tlbl0pO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShhZGRyQmFsKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydCh0eCBpbnN0YW5jZW9mIFN1aVRyYW5zYWN0aW9uKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UpO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZnVuZHNJbkFkZHJlc3NCYWxhbmNlIS5zaG91bGQuZXF1YWwoYWRkckJhbCk7XG5cbiAgICAgIGNvbnN0IHB0YiA9IHR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgLy8gcmVkZWVtX2Z1bmRzIE1vdmVDYWxsLCBtZXJnZUNvaW5zKHdhbENvaW4sIHJlZGVlbWVkQ29pbiksIHNwbGl0Q29pbnMsIHN0YWtlX3dpdGhfcG9vbCBNb3ZlQ2FsbCxcbiAgICAgIC8vIHRyYW5zZmVyT2JqZWN0cyhzdGFrZWRXYWxzKSwgdHJhbnNmZXJPYmplY3RzKHJlc2lkdWFsV2FsKVxuICAgICAgY29uc3Qga2luZHMgPSBwdGIudHJhbnNhY3Rpb25zLm1hcCgodDogYW55KSA9PiB0LmtpbmQpO1xuICAgICAga2luZHMuc2hvdWxkLmNvbnRhaW5FcWwoJ01vdmVDYWxsJyk7IC8vIHJlZGVlbV9mdW5kc1xuICAgICAga2luZHMuc2hvdWxkLmNvbnRhaW5FcWwoJ01lcmdlQ29pbnMnKTsgLy8gbWVyZ2UgcmVkZWVtZWQgaW50byBleGlzdGluZyBjb2luXG4gICAgICBraW5kcy5zaG91bGQuY29udGFpbkVxbCgnU3BsaXRDb2lucycpO1xuICAgICAga2luZHMuZmlsdGVyKChrOiBzdHJpbmcpID0+IGsgPT09ICdUcmFuc2Zlck9iamVjdHMnKS5sZW5ndGguc2hvdWxkLmVxdWFsKDIpOyAvLyBzdGFrZWQgV0FMcyArIHJlc2lkdWFsIFdBTFxuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICB1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IHJlYnVpbGQgZnJvbSByYXcgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHgudG9Kc29uKCkuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKTtcbiAgICAgIHJlYnVpbHRUeC50b0pzb24oKS5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChhZGRyQmFsKTtcbiAgICAgIHJlYnVpbHRUeC50b0pzb24oKS5pbnB1dE9iamVjdHMhLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3Rha2luZyB0eCB3aXRoIGFkZHJlc3MgYmFsYW5jZSBvbmx5IChleGFjdCBhbW91bnQpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkckJhbCA9IHRlc3REYXRhLlNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNTdGFrZVdpdGhQb29sKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbF0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKGFkZHJCYWwpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgYXNzZXJ0KHR4IGluc3RhbmNlb2YgU3VpVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4LnN1aVRyYW5zYWN0aW9uLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChhZGRyQmFsKTtcblxuICAgICAgY29uc3QgcHRiID0gdHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICAvLyBObyBjb2luIG9iamVjdCBpbnB1dHMg4oCUIGZpcnN0IHR4IGlzIE1vdmVDYWxsIChyZWRlZW1fZnVuZHMpXG4gICAgICBwdGIudHJhbnNhY3Rpb25zWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuXG4gICAgICAvLyBWZXJpZnkgcmVkZWVtX2Z1bmRzIHVzZXMgV0FMIHR5cGUsIG5vdCBTVUlcbiAgICAgIGNvbnN0IHJlZGVlbUNhbGwgPSBwdGIudHJhbnNhY3Rpb25zWzBdIGFzIGFueTtcbiAgICAgIHJlZGVlbUNhbGwudHlwZUFyZ3VtZW50c1swXS5zaG91bGQuY29udGFpbkVxbCgnOjp3YWw6OldBTCcpO1xuXG4gICAgICAvLyBCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCBtdXN0IGNhcnJ5IHRoZSBXQUwgY29pbiB0eXBlLCBub3QgU1VJXG4gICAgICBjb25zdCB3aXRoZHJhd2FsSW5wdXQgPSBwdGIuaW5wdXRzLmZpbmQoKGk6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB2ID0gaT8uQmFsYW5jZVdpdGhkcmF3YWwgPz8gaT8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsO1xuICAgICAgICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkO1xuICAgICAgfSkgYXMgYW55O1xuICAgICAgc2hvdWxkLmV4aXN0KHdpdGhkcmF3YWxJbnB1dCk7XG4gICAgICBjb25zdCBidyA9IHdpdGhkcmF3YWxJbnB1dC5CYWxhbmNlV2l0aGRyYXdhbCA/PyB3aXRoZHJhd2FsSW5wdXQudmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsO1xuICAgICAgLy8gdHlwZUFyZyBpcyB7IEJhbGFuY2U6IDxUeXBlVGFnPiB9IHdoZXJlIFR5cGVUYWcgZW5jb2RlcyB0aGUgY29pbiB0eXBlXG4gICAgICBKU09OLnN0cmluZ2lmeShidy50eXBlQXJnKS5zaG91bGQuY29udGFpbkVxbCgnd2FsJyk7XG5cbiAgICAgIC8vIFR3byBUcmFuc2Zlck9iamVjdHM6IHN0YWtlZCBXQUxzICsgcmVzaWR1YWwgV0FMXG4gICAgICBjb25zdCB0cmFuc2ZlclR4cyA9IHB0Yi50cmFuc2FjdGlvbnMuZmlsdGVyKCh0OiBhbnkpID0+IHQua2luZCA9PT0gJ1RyYW5zZmVyT2JqZWN0cycpO1xuICAgICAgdHJhbnNmZXJUeHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC50b0pzb24oKS5pbnB1dE9iamVjdHMpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICB1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IHJlYnVpbGQgZnJvbSByYXcgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHgudG9Kc29uKCkuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKTtcbiAgICAgIHJlYnVpbHRUeC50b0pzb24oKS5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChhZGRyQmFsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzdGFraW5nIHR4IHdpdGggYWRkcmVzcyBiYWxhbmNlIG9ubHkgKHBhcnRpYWwgLyByZXNpZHVhbCB0cmFuc2ZlciknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBSZXF1ZXN0IGlzIGZvciBTVEFLSU5HX0FNT1VOVCBidXQgd2UgZnVuZCBkb3VibGUgdGhhdCBmcm9tIGFkZHItYmFsIOKAlCByZXNpZHVhbCBnb2VzIGJhY2sgdG8gc2VuZGVyXG4gICAgICBjb25zdCBhZGRyQmFsID0gKHRlc3REYXRhLlNUQUtJTkdfQU1PVU5UICogMikudG9TdHJpbmcoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxydXNTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2wpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sXSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoYWRkckJhbCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQodHggaW5zdGFuY2VvZiBTdWlUcmFuc2FjdGlvbik7XG4gICAgICBzaG91bGQuZXhpc3QodHguc3VpVHJhbnNhY3Rpb24uZnVuZHNJbkFkZHJlc3NCYWxhbmNlKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSEuc2hvdWxkLmVxdWFsKGFkZHJCYWwpO1xuXG4gICAgICBjb25zdCBwdGIgPSB0eC5zdWlUcmFuc2FjdGlvbi50eDtcbiAgICAgIC8vIHJlc2lkdWFsIFdBTCBjb2luIG11c3QgYmUgdHJhbnNmZXJyZWQgYmFjayB0byBzZW5kZXJcbiAgICAgIGNvbnN0IHRyYW5zZmVyVHhzID0gcHRiLnRyYW5zYWN0aW9ucy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5raW5kID09PSAnVHJhbnNmZXJPYmplY3RzJyk7XG4gICAgICB0cmFuc2ZlclR4cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICB1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHgudG9Kc29uKCkuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKTtcbiAgICAgIHJlYnVpbHRUeC50b0pzb24oKS5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChhZGRyQmFsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBkZWZhdWx0IGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSBvZiAwIHdoZW4gc2V0dGVyIG5vdCBjYWxsZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzU3Rha2VXaXRoUG9vbCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2xdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyhbdGVzdERhdGEud2FsVG9rZW5dKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydCh0eCBpbnN0YW5jZW9mIFN1aVRyYW5zYWN0aW9uKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguc3VpVHJhbnNhY3Rpb24uZnVuZHNJbkFkZHJlc3NCYWxhbmNlKTtcblxuICAgICAgLy8gUFRCIHNob3VsZCBub3QgY29udGFpbiBhIHJlZGVlbV9mdW5kcyBjYWxsXG4gICAgICBjb25zdCBwdGIgPSB0eC5zdWlUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IG1vdmVDYWxscyA9IHB0Yi50cmFuc2FjdGlvbnMuZmlsdGVyKCh0OiBhbnkpID0+IHQua2luZCA9PT0gJ01vdmVDYWxsJyk7XG4gICAgICBtb3ZlQ2FsbHMuZXZlcnkoKG1jOiBhbnkpID0+ICFtYy50YXJnZXQ/LmluY2x1ZGVzKCdyZWRlZW1fZnVuZHMnKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kZXIoJ3JhbmRvbVN0cmluZycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgc2VuZGVyLCBnb3Q6IHJhbmRvbVN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhc0RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRXYWxydXNTdGFraW5nQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5pbnZhbGlkR2FzT3duZXIpKS50aHJvd0Vycm9yKFxuICAgICAgICBgSW52YWxpZCBnYXMgYWRkcmVzcyAke3Rlc3REYXRhLmludmFsaWRHYXNPd25lci5vd25lcn1gXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhc0J1ZGdldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbHJ1c1N0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNCdWRnZXQpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGdhcyBidWRnZXQgLTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNQYXltZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRHYXNQYXltZW50ID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQsXG4gICAgICAgIHBheW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3RJZDogJycsXG4gICAgICAgICAgICB2ZXJzaW9uOiAtMSxcbiAgICAgICAgICAgIGRpZ2VzdDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKGludmFsaWRHYXNQYXltZW50KSkudGhyb3dFcnJvcignSW52YWxpZCBwYXltZW50LCBpbnZhbGlkIG9yIG1pc3NpbmcgdmVyc2lvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gbmVpdGhlciBpbnB1dE9iamVjdHMgbm9yIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FscnVzU3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNTdGFrZVdpdGhQb29sKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbF0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2VpdGhlciBpbnB1dE9iamVjdHMgb3IgZnVuZHNJbkFkZHJlc3NCYWxhbmNlIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19