@bitgo/sdk-coin-avaxp 4.0.0 → 5.0.1
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/CHANGELOG.md +33 -0
- package/LICENSE +191 -0
- package/dist/src/avaxp.d.ts.map +1 -1
- package/dist/src/avaxp.js +1 -3
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +2 -2
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +1 -1
- package/dist/src/lib/atomicTransactionBuilder.d.ts +2 -2
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +3 -3
- package/dist/src/lib/delegatorTxBuilder.d.ts +5 -5
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/delegatorTxBuilder.js +4 -4
- package/dist/src/lib/deprecatedTransaction.d.ts +100 -0
- package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransaction.js +345 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts +115 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +7 -7
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +3 -3
- package/dist/src/lib/exportTxBuilder.d.ts +3 -3
- package/dist/src/lib/exportTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportTxBuilder.js +2 -2
- package/dist/src/lib/iface.d.ts +11 -8
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/importInCTxBuilder.d.ts +3 -3
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/importInCTxBuilder.js +2 -2
- package/dist/src/lib/importTxBuilder.d.ts +3 -3
- package/dist/src/lib/importTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/importTxBuilder.js +2 -2
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +6 -2
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +71 -31
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +286 -48
- package/dist/src/lib/transaction.d.ts +21 -42
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +66 -151
- package/dist/src/lib/transactionBuilder.d.ts +32 -76
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +65 -137
- package/dist/src/lib/transactionBuilderFactory.d.ts +9 -8
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +69 -19
- package/dist/src/lib/utils.d.ts +20 -5
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +44 -6
- package/dist/src/lib/utxoEngine.d.ts +10 -1
- package/dist/src/lib/utxoEngine.d.ts.map +1 -1
- package/dist/src/lib/utxoEngine.js +27 -3
- package/dist/src/lib/validatorTxBuilder.d.ts +3 -3
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/validatorTxBuilder.js +1 -1
- package/dist/test/resources/avaxp.d.ts +77 -0
- package/dist/test/resources/avaxp.d.ts.map +1 -1
- package/dist/test/resources/avaxp.js +124 -2
- package/dist/test/unit/avaxp.js +45 -1
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +292 -0
- package/dist/test/unit/lib/validateTxBuilder.js +5 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
30
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
31
|
+
const sdk_test_1 = require("@bitgo/sdk-test");
|
|
32
|
+
const statics_1 = require("@bitgo/statics");
|
|
33
|
+
const assert_1 = __importDefault(require("assert"));
|
|
34
|
+
const src_1 = require("../../../src");
|
|
35
|
+
const AvaxpLib = __importStar(require("../../../src/lib"));
|
|
36
|
+
const lib_1 = require("../../../src/lib");
|
|
37
|
+
const permissionlessValidatorTxBuilder_1 = require("../../../src/lib/permissionlessValidatorTxBuilder");
|
|
38
|
+
const testData = __importStar(require("../../resources/avaxp"));
|
|
39
|
+
// import { pvm } from '@bitgo/avalanchejs';
|
|
40
|
+
describe('AvaxP permissionlessValidatorTxBuilder', () => {
|
|
41
|
+
let basecoin;
|
|
42
|
+
let bitgo;
|
|
43
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'));
|
|
44
|
+
before(() => {
|
|
45
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
|
|
46
|
+
env: 'mock',
|
|
47
|
+
});
|
|
48
|
+
bitgo.initializeTestVars();
|
|
49
|
+
bitgo.safeRegister('avaxp', src_1.AvaxP.createInstance);
|
|
50
|
+
bitgo.safeRegister('tavaxp', src_1.TavaxP.createInstance);
|
|
51
|
+
basecoin = bitgo.coin('tavaxp');
|
|
52
|
+
});
|
|
53
|
+
it('should create transaction builder from hex', () => {
|
|
54
|
+
const txBuilder = factory.from(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.halfSignedTx);
|
|
55
|
+
txBuilder.should.be.an.instanceOf(permissionlessValidatorTxBuilder_1.PermissionlessValidatorTxBuilder);
|
|
56
|
+
});
|
|
57
|
+
describe('Transaction readable', () => {
|
|
58
|
+
let tx;
|
|
59
|
+
before(async () => {
|
|
60
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADD_VALIDATOR_ID_SAMPLE.fullsigntxHex);
|
|
61
|
+
tx = await txBuilder.build();
|
|
62
|
+
});
|
|
63
|
+
it('Should json stringifiy addPermissionlessValidator transaction', async () => {
|
|
64
|
+
const txJson = tx.toJson();
|
|
65
|
+
(0, assert_1.default)(typeof JSON.stringify(tx.toJson()), 'string');
|
|
66
|
+
txJson.id.should.equal(testData.ADD_VALIDATOR_ID_SAMPLE.txid);
|
|
67
|
+
});
|
|
68
|
+
it('Should get a txid', async () => {
|
|
69
|
+
tx.id.should.equal(testData.ADD_VALIDATOR_ID_SAMPLE.txid);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('should explains transaction', () => {
|
|
73
|
+
it('should explains a Signed AddPermissionlessValidatorTx', async () => {
|
|
74
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(
|
|
75
|
+
// https://testnet.snowtrace.io/pvm/tx/2tt3KE6gAG7qpMLL6xoynSyk7ht4egQ74wcF7AuGm25vQ3QNWB?chainId=43113
|
|
76
|
+
'0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000000baeb90000000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee000000024f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000023a4c180000000030000000200000000000000014f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000023a4c180000000030000000200000000000000010000000094a8b8179f0b6e7e7ce55b4d6ec5ad56dae1de9f0000000062bb03e60000000062e32556000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001c8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e1586a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca0000000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee0000000b00000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee0000000b00000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee00030d40000000020000000900000002b631e9553a8721978bffed3e778de7eb904e167599c1d26d5a8d3c46158df661164c6ca6029f24988020ccfcd673e5c19817ff74d012651f245d009a749591160170eae73d7e19b045671d41050b11791643567d1bc9cc51fa226d2be95a65689f19cda06a242a9749f6a150fcc2a5b50af12a1bc3564d1b76ac1e3826b5e21361010000000900000002b631e9553a8721978bffed3e778de7eb904e167599c1d26d5a8d3c46158df661164c6ca6029f24988020ccfcd673e5c19817ff74d012651f245d009a749591160170eae73d7e19b045671d41050b11791643567d1bc9cc51fa226d2be95a65689f19cda06a242a9749f6a150fcc2a5b50af12a1bc3564d1b76ac1e3826b5e2136101');
|
|
77
|
+
const tx = await txBuilder.build();
|
|
78
|
+
const txExplain = tx.explainTransaction();
|
|
79
|
+
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
|
|
80
|
+
txExplain.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
81
|
+
txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
|
|
82
|
+
});
|
|
83
|
+
it('should explains a Signed AddPermissionlessValidatorTx from raw', async () => {
|
|
84
|
+
const oldHex = '0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000001cbabc80000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000264d9b5eab8c4a1a25bfa9e3e1a60d78f1ae88e7352e22ef90107648b738a30e3000000003d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000003b6d03400000000200000001000000026ccb2a4fea281a8737d33b2535ee3f70518b354c91f0adcfaa70e459c4b1881c000000003d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000001ce8834000000002000000010000000200000000129a271ff407b1101f35aec82a2f715c5239bd3900000000660f17de0000000066106bb6000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001cad9e9476b701edec88e53b1c314456053b3cf846a1192117872e41455f440c074d6ee89530d45e88f79ac0eda06f2887a94d6182edbd953516b262f17565a65d98f5741549cd70d2423abff750bb4b8d982d482376b189142ff8aa4705615fee14be6174610860e9c003aa4aeaa613b1732abf3cd0c9c42fa5856345644068c0d1f9fa1d9af32e20b14fca02983260bc000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000b000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000b000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad637200004e200000000200000009000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007565285409e200fdc67c7b63759b5ad29bf01fc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007565285409e200fdc67c7b63759b5ad29bf01fc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047becda9';
|
|
85
|
+
const sortedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(oldHex);
|
|
86
|
+
const sortedTx = await sortedBuilder.build();
|
|
87
|
+
const txExplain = sortedTx.explainTransaction();
|
|
88
|
+
// this tx is sorted and can be broadcasted
|
|
89
|
+
const newHex = sortedTx.toBroadcastFormat();
|
|
90
|
+
(0, assert_1.default)(newHex === oldHex);
|
|
91
|
+
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
|
|
92
|
+
txExplain.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
93
|
+
txExplain.outputs[0].address.should.equal('NodeID-2hMqBQdjZMWdHvYu7ZPLA2CmrAdbTvpGf');
|
|
94
|
+
});
|
|
95
|
+
it('should explain AddPermissionlessValidatorTx with 1 input', async () => {
|
|
96
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from('0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d425721000000014f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000003d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000007735940000000002000000000000000100000000e25c9a09eb9c68d4807a39f97893facd9a6a7da100000000660d750900000000660ec689000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001c8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e1586a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d4257210000000b000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d4257210000000b000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d42572100030d40000000010000000900000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db94335f2f668b9707c78903c3b5ac54c6f4054700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c5543b0');
|
|
97
|
+
const tx = await txBuilder.build();
|
|
98
|
+
const txExplain = tx.explainTransaction();
|
|
99
|
+
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
|
|
100
|
+
txExplain.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
101
|
+
txExplain.outputs[0].address.should.equal('NodeID-MdteS9U987PY7iwA5Pcz3sKVprJAbAvE7');
|
|
102
|
+
});
|
|
103
|
+
it('should explains a Half Signed AddPermissionlessValidatorTx', async () => {
|
|
104
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
|
|
105
|
+
const tx = await txBuilder.build();
|
|
106
|
+
const txExplain = tx.explainTransaction();
|
|
107
|
+
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
|
|
108
|
+
txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
|
|
109
|
+
txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
|
|
110
|
+
});
|
|
111
|
+
it('should explains a unsigned AddPermissionlessValidatorTx', async () => {
|
|
112
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
|
|
113
|
+
const tx = await txBuilder.build();
|
|
114
|
+
const txExplain = tx.explainTransaction();
|
|
115
|
+
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
|
|
116
|
+
txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
|
|
117
|
+
txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('Sign Transaction', () => {
|
|
121
|
+
it('build and sign an AddPermissionlessValidator transaction and broadcast', async () => {
|
|
122
|
+
/*
|
|
123
|
+
|
|
124
|
+
const keyMapping: Record<string, any> = {
|
|
125
|
+
f45d1c9bf57d3c02299a727d6e5d8d4e76498846b1a289b4e31a2ecccbc212fb: {
|
|
126
|
+
source: 'user',
|
|
127
|
+
encoded: 'BhjEzaXMSFj4aQBhw27Dsn73b8rR9gCTX',
|
|
128
|
+
pub: '02abb451c0cc240e9a4fb97a130846d90a87247264e57014e41dc226ebf4965724',
|
|
129
|
+
prv: 'f45d1c9bf57d3c02299a727d6e5d8d4e76498846b1a289b4e31a2ecccbc212fb',
|
|
130
|
+
address: 'P-fuji1w4jjs4qfugq0m3nu0d3htx6662dlq87zq5nz33',
|
|
131
|
+
},
|
|
132
|
+
'2e0ffe6efbfcc27e9aaf4bce6af78d4c66e89b0955b85f02d7e15910e16ed4cd': {
|
|
133
|
+
source: 'backup',
|
|
134
|
+
encoded: 'BFzPJNifqdf6Z8H2P76gTEbd8RmCjMSzL',
|
|
135
|
+
pub: '025523fa48a5b0c8ed4a8344aab8396061fb42cb4f168ba5d3ae19f034c4ea2d4d',
|
|
136
|
+
prv: '2e0ffe6efbfcc27e9aaf4bce6af78d4c66e89b0955b85f02d7e15910e16ed4cd',
|
|
137
|
+
address: 'P-fuji1wzr0hsm8zlr6gpaakxvt67f999nj044ete07uw',
|
|
138
|
+
},
|
|
139
|
+
'5a360c848021024528dfc02e79ba441f1727c765b4d0dcec288ffbd2772cd432': {
|
|
140
|
+
source: 'bitgo',
|
|
141
|
+
encoded: 'HT6zoSecYyqJX63Hqaj1usvyqJbrnc8ia',
|
|
142
|
+
pub: '03d71cda3b1c32eed044866ec96c2ac54af43e7edb8f1535df51f341e49674ffaa',
|
|
143
|
+
prv: '5a360c848021024528dfc02e79ba441f1727c765b4d0dcec288ffbd2772cd432',
|
|
144
|
+
address: 'P-fuji1k3ca2njcunzl4hhxy24avca7htf66cmjjukl0n',
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
*/
|
|
148
|
+
const unixNow = BigInt(Math.round(new Date().getTime() / 1000));
|
|
149
|
+
const startTime = unixNow + BigInt(60);
|
|
150
|
+
const endTime = startTime + BigInt(60 * 60 * 24 + 600); // 24 hours + 10 minutes
|
|
151
|
+
// const AVAX_PUBLIC_URL = 'https://api.avax-test.network';
|
|
152
|
+
// const pvmapi = new pvm.PVMApi(AVAX_PUBLIC_URL);
|
|
153
|
+
// const { utxos } = await pvmapi.getUTXOs({
|
|
154
|
+
// addresses: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses,
|
|
155
|
+
// });
|
|
156
|
+
// console.log(utxos);
|
|
157
|
+
const recoveryMode = false;
|
|
158
|
+
const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
|
|
159
|
+
.getPermissionlessValidatorTxBuilder()
|
|
160
|
+
.threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.threshold)
|
|
161
|
+
.locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.locktime)
|
|
162
|
+
.recoverMode(recoveryMode)
|
|
163
|
+
.fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses)
|
|
164
|
+
.startTime(startTime.toString())
|
|
165
|
+
.endTime(endTime.toString())
|
|
166
|
+
.stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount)
|
|
167
|
+
.delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.delegationFeeRate)
|
|
168
|
+
.nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.nodeId)
|
|
169
|
+
.blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsPublicKey)
|
|
170
|
+
.blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsSignature)
|
|
171
|
+
.utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.utxos);
|
|
172
|
+
const tx = await txBuilder.build();
|
|
173
|
+
const txExplain = tx.explainTransaction();
|
|
174
|
+
const txJson = tx.toJson();
|
|
175
|
+
(0, assert_1.default)(txExplain.outputAmount === testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount);
|
|
176
|
+
(0, assert_1.default)(txJson.outputs[0].value === testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount);
|
|
177
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
178
|
+
console.log(tx.toBroadcastFormat());
|
|
179
|
+
const txBuilder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
|
|
180
|
+
.from(tx.toBroadcastFormat())
|
|
181
|
+
.recoverMode(false);
|
|
182
|
+
const tx2 = await txBuilder2.build();
|
|
183
|
+
tx2.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
184
|
+
// Test sign with user key
|
|
185
|
+
txBuilder2.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.userPrivateKey });
|
|
186
|
+
const halfSigned = await txBuilder2.build();
|
|
187
|
+
const halfSignedTxHex = halfSigned.toBroadcastFormat();
|
|
188
|
+
(0, assert_1.default)(txBuilder['_stakeAmount'] === txBuilder2['_stakeAmount']);
|
|
189
|
+
console.log(halfSignedTxHex);
|
|
190
|
+
// const txBuilder2 = factory.from(halfSignedTxHex);
|
|
191
|
+
// txBuilder2.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.backupPrivateKey });
|
|
192
|
+
// const fullSignedTx = await txBuilder2.build();
|
|
193
|
+
// console.log(fullSignedTx.toJson());
|
|
194
|
+
// const res = await pvmapi.issueTx({ tx: fullSignedTx.toBroadcastFormat() });
|
|
195
|
+
// const txSigned =
|
|
196
|
+
// '0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000070000000005c81a40000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad6372000000024411af9d9877c52c1be3f77825a74ca11869128478c4145910e92695a24c7d80000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000003b9aca0000000002000000010000000271d8644c9199e30b9fef53af56aef243e5431c6b1b09d5f11a6622c86db3f39d000000003d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000005c81a4000000002000000010000000200000000129a271ff407b1101f35aec82a2f715c5239bd3900000000660f4ab50000000066109e8d000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001cad9e9476b701edec88e53b1c314456053b3cf846a1192117872e41455f440c074d6ee89530d45e88f79ac0eda06f2887a94d6182edbd953516b262f17565a65d98f5741549cd70d2423abff750bb4b8d982d482376b189142ff8aa4705615fee14be6174610860e9c003aa4aeaa613b1732abf3cd0c9c42fa5856345644068c0d1f9fa1d9af32e20b14fca02983260bc000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000b000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000b000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad637200030d4000000002000000090000000228a59420971953aa61b4b4c90b934ef76e6e9c8ad256e9417e9a6b5017d836813b2b5cad2a890c66c8295f104d74192c4964cf289e2a45adb57a7b05b5e9529e004ec2dae5c48ba6fa4d1e0b1c6b9d9bbe79c481ff16848c1fa3fa3a6ed47431a12af4b2d9779bb192bb3f254408731798b50c8f03f25b7e7d7313738892e71d6601000000090000000228a59420971953aa61b4b4c90b934ef76e6e9c8ad256e9417e9a6b5017d836813b2b5cad2a890c66c8295f104d74192c4964cf289e2a45adb57a7b05b5e9529e004ec2dae5c48ba6fa4d1e0b1c6b9d9bbe79c481ff16848c1fa3fa3a6ed47431a12af4b2d9779bb192bb3f254408731798b50c8f03f25b7e7d7313738892e71d660151aa291f';
|
|
197
|
+
// const txBuilder = new TransactionBuilderFactory(coins.get('tavaxp')).from(tx);
|
|
198
|
+
// const decode = await txBuilder.build();
|
|
199
|
+
// console.log(decode.toJson());
|
|
200
|
+
// const res = await pvmapi.issueTx({ tx: txSigned });
|
|
201
|
+
// console.log(res);
|
|
202
|
+
});
|
|
203
|
+
it('build and sign an AddPermissionlessValidator transaction', async () => {
|
|
204
|
+
const recoveryMode = false;
|
|
205
|
+
const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
|
|
206
|
+
.getPermissionlessValidatorTxBuilder()
|
|
207
|
+
.threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.threshold)
|
|
208
|
+
.locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.locktime)
|
|
209
|
+
.recoverMode(recoveryMode)
|
|
210
|
+
.fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.bitgoAddresses)
|
|
211
|
+
.startTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.startTime)
|
|
212
|
+
.endTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.endTime)
|
|
213
|
+
.stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.stakeAmount)
|
|
214
|
+
.delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.delegationFeeRate)
|
|
215
|
+
.nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.nodeId)
|
|
216
|
+
.blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsPublicKey)
|
|
217
|
+
.blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsSignature)
|
|
218
|
+
.utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.utxos);
|
|
219
|
+
const tx = await txBuilder.build();
|
|
220
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
221
|
+
// Test sign with user key
|
|
222
|
+
txBuilder.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.userPrivateKey });
|
|
223
|
+
txBuilder.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.backupPrivateKey });
|
|
224
|
+
const fullSignedTx = await txBuilder.build();
|
|
225
|
+
console.log(fullSignedTx.toJson());
|
|
226
|
+
});
|
|
227
|
+
it('build and sign a transaction in recovery mode', async () => {
|
|
228
|
+
var _a;
|
|
229
|
+
const recoveryMode = true;
|
|
230
|
+
const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
|
|
231
|
+
.getPermissionlessValidatorTxBuilder()
|
|
232
|
+
.threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.threshold)
|
|
233
|
+
.locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.locktime)
|
|
234
|
+
.recoverMode(recoveryMode)
|
|
235
|
+
.fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.bitgoAddresses)
|
|
236
|
+
.startTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.startTime)
|
|
237
|
+
.endTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.endTime)
|
|
238
|
+
.stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.stakeAmount)
|
|
239
|
+
.delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.delegationFeeRate)
|
|
240
|
+
.nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.nodeId)
|
|
241
|
+
.blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsPublicKey)
|
|
242
|
+
.blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsSignature)
|
|
243
|
+
.utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.utxos);
|
|
244
|
+
const tx = await txBuilder.build();
|
|
245
|
+
let txHex = tx.toBroadcastFormat();
|
|
246
|
+
txHex.should.equal(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.unsignedRawtxRecovery);
|
|
247
|
+
const privateKey = recoveryMode
|
|
248
|
+
? testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.backupPrivateKey
|
|
249
|
+
: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.userPrivateKey;
|
|
250
|
+
const params = {
|
|
251
|
+
txPrebuild: {
|
|
252
|
+
txHex: tx.toBroadcastFormat(),
|
|
253
|
+
},
|
|
254
|
+
prv: privateKey,
|
|
255
|
+
};
|
|
256
|
+
const halfSignedTransaction = await basecoin.signTransaction(params);
|
|
257
|
+
txHex = (_a = halfSignedTransaction === null || halfSignedTransaction === void 0 ? void 0 : halfSignedTransaction.halfSigned) === null || _a === void 0 ? void 0 : _a.txHex;
|
|
258
|
+
txHex.should.equal(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.halfSignedRawTxRecovery);
|
|
259
|
+
});
|
|
260
|
+
it('build and sign an AddPermissionlessValidator transaction and broadcast in recovery mode', async () => {
|
|
261
|
+
const unixNow = BigInt(Math.round(new Date().getTime() / 1000));
|
|
262
|
+
const startTime = unixNow + BigInt(60);
|
|
263
|
+
const endTime = startTime + BigInt(60 * 60 * 24 + 600);
|
|
264
|
+
const recoveryMode = true;
|
|
265
|
+
const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
|
|
266
|
+
.getPermissionlessValidatorTxBuilder()
|
|
267
|
+
.threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.threshold)
|
|
268
|
+
.locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.locktime)
|
|
269
|
+
.recoverMode(recoveryMode)
|
|
270
|
+
.fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses)
|
|
271
|
+
.startTime(startTime.toString())
|
|
272
|
+
.endTime(endTime.toString())
|
|
273
|
+
.stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount)
|
|
274
|
+
.delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.delegationFeeRate)
|
|
275
|
+
.nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.nodeId)
|
|
276
|
+
.blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsPublicKey)
|
|
277
|
+
.blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsSignature)
|
|
278
|
+
.utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.utxos);
|
|
279
|
+
const tx = await txBuilder.build();
|
|
280
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
281
|
+
// Test sign with user key
|
|
282
|
+
txBuilder.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.backupPrivateKey });
|
|
283
|
+
const halfSigned = await txBuilder.build();
|
|
284
|
+
const halfSignedTxHex = halfSigned.toBroadcastFormat();
|
|
285
|
+
const txBuilder2 = factory.from(halfSignedTxHex);
|
|
286
|
+
txBuilder2.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.userPrivateKey });
|
|
287
|
+
const fullSignedTx = await txBuilder2.build();
|
|
288
|
+
console.log(fullSignedTx.toJson());
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3Blcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBMEM7QUFDMUMsOENBQWlHO0FBQ2pHLDhDQUEwRDtBQUMxRCw0Q0FBdUM7QUFDdkMsb0RBQTRCO0FBQzVCLHNDQUE2QztBQUM3QywyREFBNkM7QUFDN0MsMENBQTZEO0FBQzdELHdHQUFxRztBQUNyRyxnRUFBa0Q7QUFDbEQsNENBQTRDO0FBRTVDLFFBQVEsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7SUFDdEQsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLEtBQW1CLENBQUM7SUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFbkUsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFO1lBQ25DLEdBQUcsRUFBRSxNQUFNO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxD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RCxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUN0RyxNQUFNLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUV2RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLGtEQUFrRCxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDckcsTUFBTSxZQUFZLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiwgSGFsZlNpZ25lZEFjY291bnRUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQXZheFAsIFRhdmF4UCB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyBBdmF4cExpYiBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9wZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcic7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXZheHAnO1xuLy8gaW1wb3J0IHsgcHZtIH0gZnJvbSAnQGJpdGdvL2F2YWxhbmNoZWpzJztcblxuZGVzY3JpYmUoJ0F2YXhQIHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyJywgKCkgPT4ge1xuICBsZXQgYmFzZWNvaW47XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSk7XG5cbiAgYmVmb3JlKCgpID0+IHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwge1xuICAgICAgZW52OiAnbW9jaycsXG4gICAgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdhdmF4cCcsIEF2YXhQLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RhdmF4cCcsIFRhdmF4UC5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYmFzZWNvaW4gPSBiaXRnby5jb2luKCd0YXZheHAnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjcmVhdGUgdHJhbnNhY3Rpb24gYnVpbGRlciBmcm9tIGhleCcsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuaGFsZlNpZ25lZFR4KTtcbiAgICB0eEJ1aWxkZXIuc2hvdWxkLmJlLmFuLmluc3RhbmNlT2YoUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gcmVhZGFibGUnLCAoKSA9PiB7XG4gICAgbGV0IHR4OiBCYXNlVHJhbnNhY3Rpb247XG4gICAgYmVmb3JlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERF9WQUxJREFUT1JfSURfU0FNUExFLmZ1bGxzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBqc29uIHN0cmluZ2lmaXkgYWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGFzc2VydCh0eXBlb2YgSlNPTi5zdHJpbmdpZnkodHgudG9Kc29uKCkpLCAnc3RyaW5nJyk7XG4gICAgICB0eEpzb24uaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERF9WQUxJREFUT1JfSURfU0FNUExFLnR4aWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSB0eGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERF9WQUxJREFUT1JfSURfU0FNUExFLnR4aWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGV4cGxhaW5zIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbnMgYSBTaWduZWQgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIC8vIGh0dHBzOi8vdGVzdG5ldC5zbm93dHJhY2UuaW8vcHZtL3R4LzJ0dDNLRTZnQUc3cXBNTEw2eG95blN5azdodDRlZ1E3NHdjRjdBdUdtMjV2UTNRTldCP2NoYWluSWQ9NDMxMTNcbiAgICAgICAgJzB4MDAwMDAwMDAwMDE5MDAwMDAwMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDBiYWViOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDNhYzAzYzBjYTcxYTFkZGU4NDcwMmQyNzJmYmRkMDg2MDAxODY3MDEyNDJlMTlhZDlhNjE3ZmI5NWRjZjg4NDNhZGU2NmUwNmU1NzhmNTQ5YThiZTU0ZjAxNmFiNzQ4MTI3YWIxYTE4NDYyNmNiYTQ0Yzc0OGExZWUwMDAwMDAwMjRmMTk0ZDhlMDY2YjExZGZlOTJmNTkzY2ZhNWMyZmExYWU0NTA5MjdlY2Q1YjA5Mzk1MmU2MTgzNGY0ZDhhYTQwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNTAwMDAwMDAwMjNhNGMxODAwMDAwMDAwMzAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMTRmMTk0ZDhlMDY2YjExZGZlOTJmNTkzY2ZhNWMyZmExYWU0NTA5MjdlY2Q1YjA5Mzk1MmU2MTgzNGY0ZDhhYTQwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNTAwMDAwMDAwMjNhNGMxODAwMDAwMDAwMzAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwOTRhOGI4MTc5ZjBiNmU3ZTdjZTU1YjRkNmVjNWFkNTZkYWUxZGU5ZjAwMDAwMDAwNjJiYjAzZTYwMDAwMDAwMDYyZTMyNTU2MDAwMDAwMDAzYjlhY2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxYzhmOTU0MjNmNzE0MmQwMGE0OGUxMDE0YTNkZThkMjg5MDdkNDIwZGMzM2IzMDUyYTZkZWUwM2EzZjI5NDFhMzkzYzIzNTFlMzU0NzA0Y2E2NmEzZmMyOTg3MDI4MmUxNTg2YTNhYjRjNDVjZmUzMWNhZTM0YzFkMDZmMjEyNDM0YWM3MWIxYmU2Y2ZlMDQ2YzgwYzE2MmUwNTc2MTRhOTRhNWJjOWYxZGVkMWE3MDI5ZGViMGJhNGNhN2M5YjcxNDExZTI5MzQzODY5MWJlNzljMmRiZjE5ZDFjYTdjM2VhZGI5Yzc1NjI0NmZjNWRlNWI3Yjg5NTExYzdkNzMwMmFlMDUxZDllMDNkNzk5MTEzODI5OWI1ZWQ2YTU3MGE5ODAwMDAwMDAxM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA3MDAwMDAwMDAzYjlhY2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzYWMwM2MwY2E3MWExZGRlODQ3MDJkMjcyZmJkZDA4NjAwMTg2NzAxMjQyZTE5YWQ5YTYxN2ZiOTVkY2Y4ODQzYWRlNjZlMDZlNTc4ZjU0OWE4YmU1NGYwMTZhYjc0ODEyN2FiMWExODQ2MjZjYmE0NGM3NDhhMWVlMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwM2FjMDNjMGNhNzFhMWRkZTg0NzAyZDI3MmZiZGQwODYwMDE4NjcwMTI0MmUxOWFkOWE2MTdmYjk1ZGNmODg0M2FkZTY2ZTA2ZTU3OGY1NDlhOGJlNTRmMDE2YWI3NDgxMjdhYjFhMTg0NjI2Y2JhNDRjNzQ4YTFlZTAwMDAwMDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDNhYzAzYzBjYTcxYTFkZGU4NDcwMmQyNzJmYmRkMDg2MDAxODY3MDEyNDJlMTlhZDlhNjE3ZmI5NWRjZjg4NDNhZGU2NmUwNmU1NzhmNTQ5YThiZTU0ZjAxNmFiNzQ4MTI3YWIxYTE4NDYyNmNiYTQ0Yzc0OGExZWUwMDAzMGQ0MDAwMDAwMDAyMDAwMDAwMDkwMDAwMDAwMmI2MzFlOTU1M2E4NzIxOTc4YmZmZWQzZTc3OGRlN2ViOTA0ZTE2NzU5OWMxZDI2ZDVhOGQzYzQ2MTU4ZGY2NjExNjRjNmNhNjAyOWYyNDk4ODAyMGNjZmNkNjczZTVjMTk4MTdmZjc0ZDAxMjY1MWYyNDVkMDA5YTc0OTU5MTE2MDE3MGVhZTczZDdlMTliMDQ1NjcxZDQxMDUwYjExNzkxNjQzNTY3ZDFiYzljYzUxZmEyMjZkMmJlOTVhNjU2ODlmMTljZGEwNmEyNDJhOTc0OWY2YTE1MGZjYzJhNWI1MGFmMTJhMWJjMzU2NGQxYjc2YWMxZTM4MjZiNWUyMTM2MTAxMDAwMDAwMDkwMDAwMDAwMmI2MzFlOTU1M2E4NzIxOTc4YmZmZWQzZTc3OGRlN2ViOTA0ZTE2NzU5OWMxZDI2ZDVhOGQzYzQ2MTU4ZGY2NjExNjRjNmNhNjAyOWYyNDk4ODAyMGNjZmNkNjczZTVjMTk4MTdmZjc0ZDAxMjY1MWYyNDVkMDA5YTc0OTU5MTE2MDE3MGVhZTczZDdlMTliMDQ1NjcxZDQxMDUwYjExNzkxNjQzNTY3ZDFiYzljYzUxZmEyMjZkMmJlOTVhNjU2ODlmMTljZGEwNmEyNDJhOTc0OWY2YTE1MGZjYzJhNWI1MGFmMTJhMWJjMzU2NGQxYjc2YWMxZTM4MjZiNWUyMTM2MTAxJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbnMgYSBTaWduZWQgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCBmcm9tIHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9sZEhleCA9XG4gICAgICAgICcweDAwMDAwMDAwMDAxOTAwMDAwMDA1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA3MDAwMDAwMDAxY2JhYmM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzNzA4NmZiYzM2NzE3YzdhNDA3YmRiMTk4YmQ3OTI1Mjk2NzI3ZDZiOTc1NjUyODU0MDllMjAwZmRjNjdjN2I2Mzc1OWI1YWQyOWJmMDFmYzJiNDcxZDU0ZTU4ZTRjNWZhZGVlNjIyYWJkNjYzYmViYWQzYWQ2MzcyMDAwMDAwMDI2NGQ5YjVlYWI4YzRhMWEyNWJmYTllM2UxYTYwZDc4ZjFhZTg4ZTczNTJlMjJlZjkwMTA3NjQ4YjczOGEzMGUzMDAwMDAwMDAzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDUwMDAwMDAwMDNiNmQwMzQwMDAwMDAwMDIwMDAwMDAwMTAwMDAwMDAyNmNjYjJhNGZlYTI4MWE4NzM3ZDMzYjI1MzVlZTNmNzA1MThiMzU0YzkxZjBhZGNmYWE3MGU0NTljNGIxODgxYzAwMDAwMDAwM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA1MDAwMDAwMDAxY2U4ODM0MDAwMDAwMDAyMDAwMDAwMDEwMDAwMDAwMjAwMDAwMDAwMTI5YTI3MWZmNDA3YjExMDFmMzVhZWM4MmEyZjcxNWM1MjM5YmQzOTAwMDAwMDAwNjYwZjE3ZGUwMDAwMDAwMDY2MTA2YmI2MDAwMDAwMDAzYjlhY2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxY2FkOWU5NDc2YjcwMWVkZWM4OGU1M2IxYzMxNDQ1NjA1M2IzY2Y4NDZhMTE5MjExNzg3MmU0MTQ1NWY0NDBjMDc0ZDZlZTg5NTMwZDQ1ZTg4Zjc5YWMwZWRhMDZmMjg4N2E5NGQ2MTgyZWRiZDk1MzUxNmIyNjJmMTc1NjVhNjVkOThmNTc0MTU0OWNkNzBkMjQyM2FiZmY3NTBiYjRiOGQ5ODJkNDgyMzc2YjE4OTE0MmZmOGFhNDcwNTYxNWZlZTE0YmU2MTc0NjEwODYwZTljMDAzYWE0YWVhYTYxM2IxNzMyYWJmM2NkMGM5YzQyZmE1ODU2MzQ1NjQ0MDY4YzBkMWY5ZmExZDlhZjMyZTIwYjE0ZmNhMDI5ODMyNjBiYzAwMDAwMDAxM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA3MDAwMDAwMDAzYjlhY2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzNzA4NmZiYzM2NzE3YzdhNDA3YmRiMTk4YmQ3OTI1Mjk2NzI3ZDZiOTc1NjUyODU0MDllMjAwZmRjNjdjN2I2Mzc1OWI1YWQyOWJmMDFmYzJiNDcxZDU0ZTU4ZTRjNWZhZGVlNjIyYWJkNjYzYmViYWQzYWQ2MzcyMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzcwODZmYmMzNjcxN2M3YTQwN2JkYjE5OGJkNzkyNTI5NjcyN2Q2Yjk3NTY1Mjg1NDA5ZTIwMGZkYzY3YzdiNjM3NTliNWFkMjliZjAxZmMyYjQ3MWQ1NGU1OGU0YzVmYWRlZTYyMmFiZDY2M2JlYmFkM2FkNjM3MjAwMDAwMDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM3MDg2ZmJjMzY3MTdjN2E0MDdiZGIxOThiZDc5MjUyOTY3MjdkNmI5NzU2NTI4NTQwOWUyMDBmZGM2N2M3YjYzNzU5YjVhZDI5YmYwMWZjMmI0NzFkNTRlNThlNGM1ZmFkZWU2MjJhYmQ2NjNiZWJhZDNhZDYzNzIwMDAwNGUyMDAwMDAwMDAyMDAwMDAwMDkwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc1NjUyODU0MDllMjAwZmRjNjdjN2I2Mzc1OWI1YWQyOWJmMDFmYzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc1NjUyODU0MDllMjAwZmRjNjdjN2I2Mzc1OWI1YWQyOWJmMDFmYzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDdiZWNkYTknO1xuICAgICAgY29uc3Qgc29ydGVkQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20ob2xkSGV4KTtcbiAgICAgIGNvbnN0IHNvcnRlZFR4ID0gYXdhaXQgc29ydGVkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gc29ydGVkVHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICAvLyB0aGlzIHR4IGlzIHNvcnRlZCBhbmQgY2FuIGJlIGJyb2FkY2FzdGVkXG4gICAgICBjb25zdCBuZXdIZXggPSBzb3J0ZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgYXNzZXJ0KG5ld0hleCA9PT0gb2xkSGV4KTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ05vZGVJRC0yaE1xQlFkalpNV2RIdll1N1pQTEEyQ21yQWRiVHZwR2YnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBBZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4IHdpdGggMSBpbnB1dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgICcweDAwMDAwMDAwMDAxOTAwMDAwMDA1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA3MDAwMDAwMDAzYjlhY2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzMmEwMDgzOTU1MGY3NWVlODg3OWNhY2Q5N2ZmMzUwYTUxZDQ3YWUxNGRiOTQzMzVmMmY2NjhiOTcwN2M3ODkwM2MzYjVhYzU0YzZmNDA1NDc4M2M0YTZlY2Q1YjE4ZmEwNzY5MmQzNWVlNGMzZjhiNzRkNDI1NzIxMDAwMDAwMDE0ZjE5NGQ4ZTA2NmIxMWRmZTkyZjU5M2NmYTVjMmZhMWFlNDUwOTI3ZWNkNWIwOTM5NTJlNjE4MzRmNGQ4YWE0MDAwMDAwMDAzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDUwMDAwMDAwMDc3MzU5NDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDBlMjVjOWEwOWViOWM2OGQ0ODA3YTM5Zjk3ODkzZmFjZDlhNmE3ZGExMDAwMDAwMDA2NjBkNzUwOTAwMDAwMDAwNjYwZWM2ODkwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFjOGY5NTQyM2Y3MTQyZDAwYTQ4ZTEwMTRhM2RlOGQyODkwN2Q0MjBkYzMzYjMwNTJhNmRlZTAzYTNmMjk0MWEzOTNjMjM1MWUzNTQ3MDRjYTY2YTNmYzI5ODcwMjgyZTE1ODZhM2FiNGM0NWNmZTMxY2FlMzRjMWQwNmYyMTI0MzRhYzcxYjFiZTZjZmUwNDZjODBjMTYyZTA1NzYxNGE5NGE1YmM5ZjFkZWQxYTcwMjlkZWIwYmE0Y2E3YzliNzE0MTFlMjkzNDM4NjkxYmU3OWMyZGJmMTlkMWNhN2MzZWFkYjljNzU2MjQ2ZmM1ZGU1YjdiODk1MTFjN2Q3MzAyYWUwNTFkOWUwM2Q3OTkxMTM4Mjk5YjVlZDZhNTcwYTk4MDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDMyYTAwODM5NTUwZjc1ZWU4ODc5Y2FjZDk3ZmYzNTBhNTFkNDdhZTE0ZGI5NDMzNWYyZjY2OGI5NzA3Yzc4OTAzYzNiNWFjNTRjNmY0MDU0NzgzYzRhNmVjZDViMThmYTA3NjkyZDM1ZWU0YzNmOGI3NGQ0MjU3MjEwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzMmEwMDgzOTU1MGY3NWVlODg3OWNhY2Q5N2ZmMzUwYTUxZDQ3YWUxNGRiOTQzMzVmMmY2NjhiOTcwN2M3ODkwM2MzYjVhYzU0YzZmNDA1NDc4M2M0YTZlY2Q1YjE4ZmEwNzY5MmQzNWVlNGMzZjhiNzRkNDI1NzIxMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzJhMDA4Mzk1NTBmNzVlZTg4NzljYWNkOTdmZjM1MGE1MWQ0N2FlMTRkYjk0MzM1ZjJmNjY4Yjk3MDdjNzg5MDNjM2I1YWM1NGM2ZjQwNTQ3ODNjNGE2ZWNkNWIxOGZhMDc2OTJkMzVlZTRjM2Y4Yjc0ZDQyNTcyMTAwMDMwZDQwMDAwMDAwMDEwMDAwMDAwOTAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZGI5NDMzNWYyZjY2OGI5NzA3Yzc4OTAzYzNiNWFjNTRjNmY0MDU0NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzYzU1NDNiMCdcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdOb2RlSUQtTWR0ZVM5VTk4N1BZN2l3QTVQY3ozc0tWcHJKQWJBdkU3Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW5zIGEgSGFsZiBTaWduZWQgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcik7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWlucyBhIHVuc2lnbmVkIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubWluVmFsaWRhdG9yU3Rha2UpO1xuICAgICAgdHhFeHBsYWluLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ24gVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGFuZCBzaWduIGFuIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yIHRyYW5zYWN0aW9uIGFuZCBicm9hZGNhc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvKlxuXG4gICAgY29uc3Qga2V5TWFwcGluZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGY0NWQxYzliZjU3ZDNjMDIyOTlhNzI3ZDZlNWQ4ZDRlNzY0OTg4NDZiMWEyODliNGUzMWEyZWNjY2JjMjEyZmI6IHtcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGVuY29kZWQ6ICdCaGpFemFYTVNGajRhUUJodzI3RHNuNzNiOHJSOWdDVFgnLFxuICAgICAgICBwdWI6ICcwMmFiYjQ1MWMwY2MyNDBlOWE0ZmI5N2ExMzA4NDZkOTBhODcyNDcyNjRlNTcwMTRlNDFkYzIyNmViZjQ5NjU3MjQnLFxuICAgICAgICBwcnY6ICdmNDVkMWM5YmY1N2QzYzAyMjk5YTcyN2Q2ZTVkOGQ0ZTc2NDk4ODQ2YjFhMjg5YjRlMzFhMmVjY2NiYzIxMmZiJyxcbiAgICAgICAgYWRkcmVzczogJ1AtZnVqaTF3NGpqczRxZnVncTBtM251MGQzaHR4NjY2MmRscTg3enE1bnozMycsXG4gICAgICB9LFxuICAgICAgJzJlMGZmZTZlZmJmY2MyN2U5YWFmNGJjZTZhZjc4ZDRjNjZlODliMDk1NWI4NWYwMmQ3ZTE1OTEwZTE2ZWQ0Y2QnOiB7XG4gICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgIGVuY29kZWQ6ICdCRnpQSk5pZnFkZjZaOEgyUDc2Z1RFYmQ4Um1Dak1TekwnLFxuICAgICAgICBwdWI6ICcwMjU1MjNmYTQ4YTViMGM4ZWQ0YTgzNDRhYWI4Mzk2MDYxZmI0MmNiNGYxNjhiYTVkM2FlMTlmMDM0YzRlYTJkNGQnLFxuICAgICAgICBwcnY6ICcyZTBmZmU2ZWZiZmNjMjdlOWFhZjRiY2U2YWY3OGQ0YzY2ZTg5YjA5NTViODVmMDJkN2UxNTkxMGUxNmVkNGNkJyxcbiAgICAgICAgYWRkcmVzczogJ1AtZnVqaTF3enIwaHNtOHpscjZncGFha3h2dDY3Zjk5OW5qMDQ0ZXRlMDd1dycsXG4gICAgICB9LFxuICAgICAgJzVhMzYwYzg0ODAyMTAyNDUyOGRmYzAyZTc5YmE0NDFmMTcyN2M3NjViNGQwZGNlYzI4OGZmYmQyNzcyY2Q0MzInOiB7XG4gICAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgICAgZW5jb2RlZDogJ0hUNnpvU2VjWXlxSlg2M0hxYWoxdXN2eXFKYnJuYzhpYScsXG4gICAgICAgIHB1YjogJzAzZDcxY2RhM2IxYzMyZWVkMDQ0ODY2ZWM5NmMyYWM1NGFmNDNlN2VkYjhmMTUzNWRmNTFmMzQxZTQ5Njc0ZmZhYScsXG4gICAgICAgIHBydjogJzVhMzYwYzg0ODAyMTAyNDUyOGRmYzAyZTc5YmE0NDFmMTcyN2M3NjViNGQwZGNlYzI4OGZmYmQyNzcyY2Q0MzInLFxuICAgICAgICBhZGRyZXNzOiAnUC1mdWppMWszY2EybmpjdW56bDRoaHh5MjRhdmNhN2h0ZjY2Y21qanVrbDBuJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAgICAqL1xuICAgICAgY29uc3QgdW5peE5vdyA9IEJpZ0ludChNYXRoLnJvdW5kKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gdW5peE5vdyArIEJpZ0ludCg2MCk7XG4gICAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgQmlnSW50KDYwICogNjAgKiAyNCArIDYwMCk7IC8vIDI0IGhvdXJzICsgMTAgbWludXRlc1xuXG4gICAgICAvLyBjb25zdCBBVkFYX1BVQkxJQ19VUkwgPSAnaHR0cHM6Ly9hcGkuYXZheC10ZXN0Lm5ldHdvcmsnO1xuICAgICAgLy8gY29uc3QgcHZtYXBpID0gbmV3IHB2bS5QVk1BcGkoQVZBWF9QVUJMSUNfVVJMKTtcbiAgICAgIC8vIGNvbnN0IHsgdXR4b3MgfSA9IGF3YWl0IHB2bWFwaS5nZXRVVFhPcyh7XG4gICAgICAvLyAgIGFkZHJlc3NlczogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYml0Z29BZGRyZXNzZXMsXG4gICAgICAvLyB9KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHV0eG9zKTtcblxuICAgICAgY29uc3QgcmVjb3ZlcnlNb2RlID0gZmFsc2U7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQXZheHBMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0UGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmxvY2t0aW1lKVxuICAgICAgICAucmVjb3Zlck1vZGUocmVjb3ZlcnlNb2RlKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5iaXRnb0FkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZShzdGFydFRpbWUudG9TdHJpbmcoKSlcbiAgICAgICAgLmVuZFRpbWUoZW5kVGltZS50b1N0cmluZygpKVxuICAgICAgICAuc3Rha2VBbW91bnQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuc3Rha2VBbW91bnQpXG4gICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5kZWxlZ2F0aW9uRmVlUmF0ZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5ub2RlSWQpXG4gICAgICAgIC5ibHNQdWJsaWNLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYmxzUHVibGljS2V5KVxuICAgICAgICAuYmxzU2lnbmF0dXJlKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmJsc1NpZ25hdHVyZSlcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnV0eG9zKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgYXNzZXJ0KHR4RXhwbGFpbi5vdXRwdXRBbW91bnQgPT09IHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnN0YWtlQW1vdW50KTtcbiAgICAgIGFzc2VydCh0eEpzb24ub3V0cHV0c1swXS52YWx1ZSA9PT0gdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuc3Rha2VBbW91bnQpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yKTtcbiAgICAgIGNvbnNvbGUubG9nKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSlcbiAgICAgICAgLnJlY292ZXJNb2RlKGZhbHNlKTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIHR4Mi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IpO1xuICAgICAgLy8gVGVzdCBzaWduIHdpdGggdXNlciBrZXlcbiAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudXNlclByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4SGV4ID0gaGFsZlNpZ25lZC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgYXNzZXJ0KHR4QnVpbGRlclsnX3N0YWtlQW1vdW50J10gPT09IHR4QnVpbGRlcjJbJ19zdGFrZUFtb3VudCddKTtcbiAgICAgIGNvbnNvbGUubG9nKGhhbGZTaWduZWRUeEhleCk7XG5cbiAgICAgIC8vIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oaGFsZlNpZ25lZFR4SGV4KTtcbiAgICAgIC8vIHR4QnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYmFja3VwUHJpdmF0ZUtleSB9KTtcbiAgICAgIC8vIGNvbnN0IGZ1bGxTaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGZ1bGxTaWduZWRUeC50b0pzb24oKSk7XG5cbiAgICAgIC8vIGNvbnN0IHJlcyA9IGF3YWl0IHB2bWFwaS5pc3N1ZVR4KHsgdHg6IGZ1bGxTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpIH0pO1xuICAgICAgLy8gY29uc3QgdHhTaWduZWQgPVxuICAgICAgLy8gICAnMHgwMDAwMDAwMDAwMTkwMDAwMDAwNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNzAwMDAwMDAwMDVjODFhNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzcwODZmYmMzNjcxN2M3YTQwN2JkYjE5OGJkNzkyNTI5NjcyN2Q2Yjk3NTY1Mjg1NDA5ZTIwMGZkYzY3YzdiNjM3NTliNWFkMjliZjAxZmMyYjQ3MWQ1NGU1OGU0YzVmYWRlZTYyMmFiZDY2M2JlYmFkM2FkNjM3MjAwMDAwMDAyNDQxMWFmOWQ5ODc3YzUyYzFiZTNmNzc4MjVhNzRjYTExODY5MTI4NDc4YzQxNDU5MTBlOTI2OTVhMjRjN2Q4MDAwMDAwMDAxM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA1MDAwMDAwMDAzYjlhY2EwMDAwMDAwMDAyMDAwMDAwMDEwMDAwMDAwMjcxZDg2NDRjOTE5OWUzMGI5ZmVmNTNhZjU2YWVmMjQzZTU0MzFjNmIxYjA5ZDVmMTFhNjYyMmM4NmRiM2YzOWQwMDAwMDAwMDNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNTAwMDAwMDAwMDVjODFhNDAwMDAwMDAwMjAwMDAwMDAxMDAwMDAwMDIwMDAwMDAwMDEyOWEyNzFmZjQwN2IxMTAxZjM1YWVjODJhMmY3MTVjNTIzOWJkMzkwMDAwMDAwMDY2MGY0YWI1MDAwMDAwMDA2NjEwOWU4ZDAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWNhZDllOTQ3NmI3MDFlZGVjODhlNTNiMWMzMTQ0NTYwNTNiM2NmODQ2YTExOTIxMTc4NzJlNDE0NTVmNDQwYzA3NGQ2ZWU4OTUzMGQ0NWU4OGY3OWFjMGVkYTA2ZjI4ODdhOTRkNjE4MmVkYmQ5NTM1MTZiMjYyZjE3NTY1YTY1ZDk4ZjU3NDE1NDljZDcwZDI0MjNhYmZmNzUwYmI0YjhkOTgyZDQ4MjM3NmIxODkxNDJmZjhhYTQ3MDU2MTVmZWUxNGJlNjE3NDYxMDg2MGU5YzAwM2FhNGFlYWE2MTNiMTczMmFiZjNjZDBjOWM0MmZhNTg1NjM0NTY0NDA2OGMwZDFmOWZhMWQ5YWYzMmUyMGIxNGZjYTAyOTgzMjYwYmMwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNzAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzcwODZmYmMzNjcxN2M3YTQwN2JkYjE5OGJkNzkyNTI5NjcyN2Q2Yjk3NTY1Mjg1NDA5ZTIwMGZkYzY3YzdiNjM3NTliNWFkMjliZjAxZmMyYjQ3MWQ1NGU1OGU0YzVmYWRlZTYyMmFiZDY2M2JlYmFkM2FkNjM3MjAwMDAwMDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM3MDg2ZmJjMzY3MTdjN2E0MDdiZGIxOThiZDc5MjUyOTY3MjdkNmI5NzU2NTI4NTQwOWUyMDBmZGM2N2M3YjYzNzU5YjVhZDI5YmYwMWZjMmI0NzFkNTRlNThlNGM1ZmFkZWU2MjJhYmQ2NjNiZWJhZDNhZDYzNzIwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzNzA4NmZiYzM2NzE3YzdhNDA3YmRiMTk4YmQ3OTI1Mjk2NzI3ZDZiOTc1NjUyODU0MDllMjAwZmRjNjdjN2I2Mzc1OWI1YWQyOWJmMDFmYzJiNDcxZDU0ZTU4ZTRjNWZhZGVlNjIyYWJkNjYzYmViYWQzYWQ2MzcyMDAwMzBkNDAwMDAwMDAwMjAwMDAwMDA5MDAwMDAwMDIyOGE1OTQyMDk3MTk1M2FhNjFiNGI0YzkwYjkzNGVmNzZlNmU5YzhhZDI1NmU5NDE3ZTlhNmI1MDE3ZDgzNjgxM2IyYjVjYWQyYTg5MGM2NmM4Mjk1ZjEwNGQ3NDE5MmM0OTY0Y2YyODllMmE0NWFkYjU3YTdiMDViNWU5NTI5ZTAwNGVjMmRhZTVjNDhiYTZmYTRkMWUwYjFjNmI5ZDliYmU3OWM0ODFmZjE2ODQ4YzFmYTNmYTNhNmVkNDc0MzFhMTJhZjRiMmQ5Nzc5YmIxOTJiYjNmMjU0NDA4NzMxNzk4YjUwYzhmMDNmMjViN2U3ZDczMTM3Mzg4OTJlNzFkNjYwMTAwMDAwMDA5MDAwMDAwMDIyOGE1OTQyMDk3MTk1M2FhNjFiNGI0YzkwYjkzNGVmNzZlNmU5YzhhZDI1NmU5NDE3ZTlhNmI1MDE3ZDgzNjgxM2IyYjVjYWQyYTg5MGM2NmM4Mjk1ZjEwNGQ3NDE5MmM0OTY0Y2YyODllMmE0NWFkYjU3YTdiMDViNWU5NTI5ZTAwNGVjMmRhZTVjNDhiYTZmYTRkMWUwYjFjNmI5ZDliYmU3OWM0ODFmZjE2ODQ4YzFmYTNmYTNhNmVkNDc0MzFhMTJhZjRiMmQ5Nzc5YmIxOTJiYjNmMjU0NDA4NzMxNzk4YjUwYzhmMDNmMjViN2U3ZDczMTM3Mzg4OTJlNzFkNjYwMTUxYWEyOTFmJztcbiAgICAgIC8vIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20odHgpO1xuICAgICAgLy8gY29uc3QgZGVjb2RlID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhkZWNvZGUudG9Kc29uKCkpO1xuXG4gICAgICAvLyBjb25zdCByZXMgPSBhd2FpdCBwdm1hcGkuaXNzdWVUeCh7IHR4OiB0eFNpZ25lZCB9KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYW5kIHNpZ24gYW4gQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWNvdmVyeU1vZGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBdmF4cExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmxvY2t0aW1lKVxuICAgICAgICAucmVjb3Zlck1vZGUocmVjb3ZlcnlNb2RlKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJpdGdvQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUuc3RhcnRUaW1lKVxuICAgICAgICAuZW5kVGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnN0YWtlQW1vdW50KVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5kZWxlZ2F0aW9uRmVlUmF0ZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLm5vZGVJZClcbiAgICAgICAgLmJsc1B1YmxpY0tleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJsc1B1YmxpY0tleSlcbiAgICAgICAgLmJsc1NpZ25hdHVyZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJsc1NpZ25hdHVyZSlcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUudXR4b3MpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcik7XG5cbiAgICAgIC8vIFRlc3Qgc2lnbiB3aXRoIHVzZXIga2V5XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS51c2VyUHJpdmF0ZUtleSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJhY2t1cFByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnNvbGUubG9nKGZ1bGxTaWduZWRUeC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYW5kIHNpZ24gYSB0cmFuc2FjdGlvbiBpbiByZWNvdmVyeSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3ZlcnlNb2RlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBdmF4cExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmxvY2t0aW1lKVxuICAgICAgICAucmVjb3Zlck1vZGUocmVjb3ZlcnlNb2RlKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJpdGdvQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUuc3RhcnRUaW1lKVxuICAgICAgICAuZW5kVGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnN0YWtlQW1vdW50KVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5kZWxlZ2F0aW9uRmVlUmF0ZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLm5vZGVJZClcbiAgICAgICAgLmJsc1B1YmxpY0tleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJsc1B1YmxpY0tleSlcbiAgICAgICAgLmJsc1NpZ25hdHVyZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJsc1NpZ25hdHVyZSlcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUudXR4b3MpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgbGV0IHR4SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHR4SGV4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnVuc2lnbmVkUmF3dHhSZWNvdmVyeSk7XG5cbiAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSByZWNvdmVyeU1vZGVcbiAgICAgICAgPyB0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmJhY2t1cFByaXZhdGVLZXlcbiAgICAgICAgOiB0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnVzZXJQcml2YXRlS2V5O1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiBwcml2YXRlS2V5LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uc2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICB0eEhleCA9IChoYWxmU2lnbmVkVHJhbnNhY3Rpb24gYXMgSGFsZlNpZ25lZEFjY291bnRUcmFuc2FjdGlvbik/LmhhbGZTaWduZWQ/LnR4SGV4O1xuICAgICAgdHhIZXguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUuaGFsZlNpZ25lZFJhd1R4UmVjb3ZlcnkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuZCBzaWduIGFuIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yIHRyYW5zYWN0aW9uIGFuZCBicm9hZGNhc3QgaW4gcmVjb3ZlcnkgbW9kZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVuaXhOb3cgPSBCaWdJbnQoTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHVuaXhOb3cgKyBCaWdJbnQoNjApO1xuICAgICAgY29uc3QgZW5kVGltZSA9IHN0YXJ0VGltZSArIEJpZ0ludCg2MCAqIDYwICogMjQgKyA2MDApO1xuXG4gICAgICBjb25zdCByZWNvdmVyeU1vZGUgPSB0cnVlO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEF2YXhwTGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5sb2NrdGltZSlcbiAgICAgICAgLnJlY292ZXJNb2RlKHJlY292ZXJ5TW9kZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYml0Z29BZGRyZXNzZXMpXG4gICAgICAgIC5zdGFydFRpbWUoc3RhcnRUaW1lLnRvU3RyaW5nKCkpXG4gICAgICAgIC5lbmRUaW1lKGVuZFRpbWUudG9TdHJpbmcoKSlcbiAgICAgICAgLnN0YWtlQW1vdW50KHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnN0YWtlQW1vdW50KVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuZGVsZWdhdGlvbkZlZVJhdGUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUubm9kZUlkKVxuICAgICAgICAuYmxzUHVibGljS2V5KHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmJsc1B1YmxpY0tleSlcbiAgICAgICAgLmJsc1NpZ25hdHVyZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5ibHNTaWduYXR1cmUpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS51dHhvcyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yKTtcblxuICAgICAgLy8gVGVzdCBzaWduIHdpdGggdXNlciBrZXlcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5iYWNrdXBQcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4SGV4ID0gaGFsZlNpZ25lZC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5mcm9tKGhhbGZTaWduZWRUeEhleCk7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnVzZXJQcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc29sZS5sb2coZnVsbFNpZ25lZFR4LnRvSnNvbigpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|