@bitgo-beta/sdk-coin-iota 1.0.1-beta.323 → 1.0.1-beta.325

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.
Files changed (42) hide show
  1. package/dist/src/iota.d.ts +123 -27
  2. package/dist/src/iota.d.ts.map +1 -1
  3. package/dist/src/iota.js +217 -103
  4. package/dist/src/lib/constants.d.ts +50 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +68 -4
  7. package/dist/src/lib/iface.d.ts +141 -1
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/keyPair.d.ts +100 -6
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +103 -10
  13. package/dist/src/lib/transaction.d.ts +117 -14
  14. package/dist/src/lib/transaction.d.ts.map +1 -1
  15. package/dist/src/lib/transaction.js +190 -70
  16. package/dist/src/lib/transactionBuilder.d.ts +73 -34
  17. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/transactionBuilder.js +90 -45
  19. package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
  20. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  21. package/dist/src/lib/transactionBuilderFactory.js +103 -16
  22. package/dist/src/lib/transferBuilder.d.ts +43 -0
  23. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/transferBuilder.js +50 -5
  25. package/dist/src/lib/transferTransaction.d.ts +97 -1
  26. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  27. package/dist/src/lib/transferTransaction.js +223 -52
  28. package/dist/src/lib/utils.d.ts +107 -8
  29. package/dist/src/lib/utils.d.ts.map +1 -1
  30. package/dist/src/lib/utils.js +134 -23
  31. package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
  32. package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
  33. package/dist/test/unit/helpers/testHelpers.js +176 -0
  34. package/dist/test/unit/iota.js +47 -152
  35. package/dist/test/unit/keyPair.js +34 -61
  36. package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
  37. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -108
  38. package/dist/test/unit/transactionBuilder/transferBuilder.js +334 -319
  39. package/dist/test/unit/transferTransaction.js +106 -353
  40. package/dist/test/unit/utils.js +171 -197
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +7 -7
@@ -1,146 +1,68 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  const should_1 = __importDefault(require("should"));
40
- const statics_1 = require("@bitgo-beta/statics");
41
- const src_1 = require("../../../src");
42
- const testData = __importStar(require("../../resources/iota"));
43
7
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
- const utils_1 = __importDefault(require("../../../src/lib/utils"));
45
8
  const constants_1 = require("../../../src/lib/constants");
9
+ const testHelpers_1 = require("../helpers/testHelpers");
46
10
  describe('Iota Transfer Builder', () => {
47
- const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
48
- describe('Succeed', () => {
49
- it('should build a transfer tx with simulate mode', async function () {
50
- const txBuilder = factory.getTransferBuilder();
51
- txBuilder.sender(testData.sender.address);
52
- txBuilder.recipients(testData.recipients);
53
- txBuilder.paymentObjects(testData.paymentObjects);
11
+ const factory = (0, testHelpers_1.getFactory)();
12
+ describe('Basic Transaction Building', () => {
13
+ it('should build a transfer transaction in simulate mode', async function () {
14
+ const txBuilder = (0, testHelpers_1.createBasicTransferBuilder)();
54
15
  const tx = (await txBuilder.build());
55
16
  should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
56
- should_1.default.equal(tx.sender, testData.sender.address);
57
17
  should_1.default.equal(tx.isSimulateTx, true);
58
- should_1.default.deepEqual(tx.recipients, testData.recipients);
59
- should_1.default.deepEqual(tx.paymentObjects, testData.paymentObjects);
60
- const rawTx = await tx.toBroadcastFormat();
61
- should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
62
- });
63
- it('should build a transfer tx with gas data', async function () {
64
- const txBuilder = factory.getTransferBuilder();
65
- txBuilder.sender(testData.sender.address);
66
- txBuilder.recipients(testData.recipients);
67
- txBuilder.paymentObjects(testData.paymentObjects);
68
- txBuilder.gasData(testData.gasData);
18
+ (0, testHelpers_1.assertBasicTransactionProperties)(tx);
19
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
20
+ });
21
+ it('should build a transfer transaction with gas data', async function () {
22
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
69
23
  const tx = (await txBuilder.build());
70
24
  should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
71
- should_1.default.equal(tx.sender, testData.sender.address);
72
25
  should_1.default.equal(tx.isSimulateTx, false);
73
- should_1.default.equal(tx.gasBudget, testData.GAS_BUDGET);
74
- should_1.default.equal(tx.gasPrice, testData.GAS_PRICE);
75
- should_1.default.deepEqual(tx.gasPaymentObjects, testData.gasPaymentObjects);
76
- tx.inputs.length.should.equal(1);
77
- tx.inputs[0].should.deepEqual({
78
- address: testData.sender.address,
79
- value: (testData.AMOUNT + testData.AMOUNT * 2).toString(),
80
- coin: 'tiota',
81
- });
82
- tx.outputs.length.should.equal(2);
83
- tx.outputs[0].should.deepEqual({
84
- address: testData.recipients[0].address,
85
- value: testData.recipients[0].amount,
86
- coin: 'tiota',
87
- });
88
- tx.outputs[1].should.deepEqual({
89
- address: testData.recipients[1].address,
90
- value: testData.recipients[1].amount,
91
- coin: 'tiota',
92
- });
93
- const rawTx = await tx.toBroadcastFormat();
94
- should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
95
- });
96
- it('should build a transfer tx with gas sponsor', async function () {
97
- const txBuilder = factory.getTransferBuilder();
98
- txBuilder.sender(testData.sender.address);
99
- txBuilder.recipients(testData.recipients);
100
- txBuilder.paymentObjects(testData.paymentObjects);
101
- txBuilder.gasData(testData.gasData);
102
- txBuilder.gasSponsor(testData.gasSponsor.address);
26
+ (0, testHelpers_1.assertBasicTransactionProperties)(tx);
27
+ (0, testHelpers_1.assertGasData)(tx);
28
+ (0, testHelpers_1.assertInputsAndOutputs)(tx, testHelpers_1.testData.recipients);
29
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
30
+ });
31
+ it('should build a transfer transaction with gas sponsor', async function () {
32
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithSponsor)();
103
33
  const tx = (await txBuilder.build());
104
34
  should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
105
- should_1.default.equal(tx.sender, testData.sender.address);
106
- should_1.default.equal(tx.gasSponsor, testData.gasSponsor.address);
35
+ should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
36
+ should_1.default.equal(tx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
107
37
  should_1.default.equal(tx.isSimulateTx, false);
108
- const rawTx = await tx.toBroadcastFormat();
109
- should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
110
- });
111
- it('should build a transfer tx with multiple recipients', async function () {
112
- const amount = 1000;
113
- const numberOfRecipients = 10;
114
- const txBuilder = factory.getTransferBuilder();
115
- txBuilder.sender(testData.sender.address);
116
- const recipients = new Array(numberOfRecipients).fill({
117
- address: testData.addresses.validAddresses[0],
118
- amount: amount.toString(),
119
- });
120
- txBuilder.recipients(recipients);
121
- txBuilder.paymentObjects(testData.paymentObjects);
122
- txBuilder.gasData(testData.gasData);
38
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
39
+ });
40
+ it('should build transaction using gas objects when no payment objects', async function () {
41
+ const txBuilder = (0, testHelpers_1.createBuilderWithGasObjectsOnly)();
123
42
  const tx = (await txBuilder.build());
124
43
  should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
125
- tx.inputs.length.should.equal(1);
126
- tx.inputs[0].should.deepEqual({
127
- address: testData.sender.address,
128
- value: (amount * numberOfRecipients).toString(),
129
- coin: 'tiota',
130
- });
131
- tx.outputs.length.should.equal(numberOfRecipients);
132
- tx.outputs.forEach((output) => output.should.deepEqual({
133
- address: testData.addresses.validAddresses[0],
134
- value: amount.toString(),
135
- coin: 'tiota',
136
- }));
137
- });
138
- it('should parse from JSON and rebuild transaction', async function () {
139
- const txBuilder = factory.getTransferBuilder();
140
- txBuilder.sender(testData.sender.address);
141
- txBuilder.recipients(testData.recipients);
142
- txBuilder.paymentObjects(testData.paymentObjects);
143
- txBuilder.gasData(testData.gasData);
44
+ should_1.default.equal(tx.isSimulateTx, false);
45
+ should_1.default.equal(tx.paymentObjects, undefined);
46
+ should_1.default.exist(tx.gasPaymentObjects);
47
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
48
+ });
49
+ it('should support method chaining', async function () {
50
+ const tx = (await factory
51
+ .getTransferBuilder()
52
+ .sender(testHelpers_1.testData.sender.address)
53
+ .recipients(testHelpers_1.testData.recipients)
54
+ .paymentObjects(testHelpers_1.testData.paymentObjects)
55
+ .gasData(testHelpers_1.testData.gasData)
56
+ .gasSponsor(testHelpers_1.testData.gasSponsor.address)
57
+ .build());
58
+ should_1.default.exist(tx);
59
+ should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
60
+ should_1.default.equal(tx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
61
+ });
62
+ });
63
+ describe('Serialization and Deserialization', () => {
64
+ it('should serialize to JSON and rebuild transaction', async function () {
65
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
144
66
  const tx = (await txBuilder.build());
145
67
  const txJson = tx.toJson();
146
68
  const rebuiltTxBuilder = factory.getTransferBuilder();
@@ -152,249 +74,342 @@ describe('Iota Transfer Builder', () => {
152
74
  should_1.default.equal(rebuiltTx.gasPrice, tx.gasPrice);
153
75
  });
154
76
  it('should serialize to broadcast format consistently', async function () {
155
- const txBuilder1 = factory.getTransferBuilder();
156
- txBuilder1.sender(testData.sender.address);
157
- txBuilder1.recipients(testData.recipients);
158
- txBuilder1.paymentObjects(testData.paymentObjects);
159
- txBuilder1.gasData(testData.gasData);
160
- const tx1 = (await txBuilder1.build());
77
+ const tx1 = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
161
78
  const rawTx1 = await tx1.toBroadcastFormat();
162
- const txBuilder2 = factory.getTransferBuilder();
163
- txBuilder2.sender(testData.sender.address);
164
- txBuilder2.recipients(testData.recipients);
165
- txBuilder2.paymentObjects(testData.paymentObjects);
166
- txBuilder2.gasData(testData.gasData);
167
- const tx2 = (await txBuilder2.build());
79
+ const tx2 = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
168
80
  const rawTx2 = await tx2.toBroadcastFormat();
169
81
  should_1.default.equal(rawTx1, rawTx2);
170
- should_1.default.equal(tx1.type, sdk_core_1.TransactionType.Send);
171
- });
172
- it('should build tx with signable payload', async function () {
173
- const txBuilder = factory.getTransferBuilder();
174
- txBuilder.sender(testData.sender.address);
175
- txBuilder.recipients(testData.recipients);
176
- txBuilder.paymentObjects(testData.paymentObjects);
177
- txBuilder.gasData(testData.gasData);
178
- const tx = (await txBuilder.build());
179
- should_1.default.equal(tx.isSimulateTx, false);
180
- const signablePayload = tx.signablePayload;
181
- should_1.default.exist(signablePayload);
182
- should_1.default.equal(Buffer.isBuffer(signablePayload), true);
183
- should_1.default.equal(signablePayload.length, 32); // Blake2b hash is 32 bytes
184
82
  });
185
83
  it('should validate toJSON output', async function () {
186
- const txBuilder = factory.getTransferBuilder();
187
- txBuilder.sender(testData.sender.address);
188
- txBuilder.recipients(testData.recipients);
189
- txBuilder.paymentObjects(testData.paymentObjects);
190
- txBuilder.gasData(testData.gasData);
191
- const tx = (await txBuilder.build());
84
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
192
85
  const txJson = tx.toJson();
193
- should_1.default.equal(txJson.sender, testData.sender.address);
194
- should_1.default.deepEqual(txJson.recipients, testData.recipients);
195
- should_1.default.deepEqual(txJson.paymentObjects, testData.paymentObjects);
196
- should_1.default.equal(txJson.gasBudget, testData.GAS_BUDGET);
197
- should_1.default.equal(txJson.gasPrice, testData.GAS_PRICE);
198
- should_1.default.deepEqual(txJson.gasPaymentObjects, testData.gasPaymentObjects);
86
+ should_1.default.equal(txJson.sender, testHelpers_1.testData.sender.address);
87
+ should_1.default.deepEqual(txJson.recipients, testHelpers_1.testData.recipients);
88
+ should_1.default.deepEqual(txJson.paymentObjects, testHelpers_1.testData.paymentObjects);
89
+ should_1.default.equal(txJson.gasBudget, testHelpers_1.testData.GAS_BUDGET);
90
+ should_1.default.equal(txJson.gasPrice, testHelpers_1.testData.GAS_PRICE);
91
+ should_1.default.deepEqual(txJson.gasPaymentObjects, testHelpers_1.testData.gasPaymentObjects);
199
92
  should_1.default.equal(txJson.type, sdk_core_1.TransactionType.Send);
200
93
  });
201
94
  });
202
- describe('Fail', () => {
203
- it('should fail for invalid sender', function () {
204
- const builder = factory.getTransferBuilder();
205
- (0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
206
- });
207
- it('should fail for invalid recipient address', function () {
208
- const builder = factory.getTransferBuilder();
209
- builder.sender(testData.sender.address);
210
- (0, should_1.default)(() => builder.recipients([{ address: 'invalidAddress', amount: '1000' }])).throwError('Invalid address invalidAddress');
211
- });
212
- it('should fail for invalid recipient amount', function () {
213
- const builder = factory.getTransferBuilder();
214
- builder.sender(testData.sender.address);
215
- (0, should_1.default)(() => builder.recipients([{ address: testData.addresses.validAddresses[0], amount: '-1000' }])).throwError('Value cannot be less than zero');
216
- });
217
- it('should fail for empty recipients during build', async function () {
218
- const builder = factory.getTransferBuilder();
219
- builder.sender(testData.sender.address);
220
- builder.recipients([]);
221
- builder.paymentObjects(testData.paymentObjects);
222
- builder.gasData(testData.gasData);
223
- await builder.build().should.be.rejected();
95
+ describe('Round-trip Parsing', () => {
96
+ it('should correctly parse and rebuild transaction using gas objects', async function () {
97
+ const tx = (await (0, testHelpers_1.createBuilderWithGasObjectsOnly)().build());
98
+ const rawTx = await tx.toBroadcastFormat();
99
+ const txHex = Buffer.from(rawTx, 'base64').toString('hex');
100
+ const rebuiltBuilder = factory.from(txHex);
101
+ const rebuiltTx = (await rebuiltBuilder.build());
102
+ should_1.default.equal(rebuiltTx.sender, tx.sender);
103
+ should_1.default.deepEqual(rebuiltTx.recipients, tx.recipients);
104
+ should_1.default.equal(rebuiltTx.gasBudget, tx.gasBudget);
105
+ should_1.default.equal(rebuiltTx.gasPrice, tx.gasPrice);
106
+ should_1.default.equal(rebuiltTx.paymentObjects, undefined);
107
+ should_1.default.exist(rebuiltTx.gasPaymentObjects);
224
108
  });
225
- it('should fail for empty payment objects', function () {
226
- const builder = factory.getTransferBuilder();
227
- builder.sender(testData.sender.address);
228
- builder.recipients(testData.recipients);
229
- (0, should_1.default)(() => builder.paymentObjects([])).throwError('No Objects provided for payment');
230
- });
231
- it('should fail when gas payment objects exceed maximum', async function () {
232
- const builder = factory.getTransferBuilder();
233
- builder.sender(testData.sender.address);
234
- builder.recipients(testData.recipients);
235
- builder.paymentObjects(testData.paymentObjects);
236
- const tooManyGasObjects = testData.generateObjects(constants_1.MAX_GAS_PAYMENT_OBJECTS + 1);
237
- builder.gasData({
238
- gasBudget: testData.GAS_BUDGET,
239
- gasPrice: testData.GAS_PRICE,
240
- gasPaymentObjects: tooManyGasObjects,
109
+ it('should correctly parse transaction with payment objects', async function () {
110
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
111
+ const rawTx = await tx.toBroadcastFormat();
112
+ const txHex = Buffer.from(rawTx, 'base64').toString('hex');
113
+ const rebuiltBuilder = factory.from(txHex);
114
+ const rebuiltTx = (await rebuiltBuilder.build());
115
+ should_1.default.exist(rebuiltTx.paymentObjects);
116
+ should_1.default.equal(rebuiltTx.paymentObjects?.length, testHelpers_1.testData.paymentObjects.length);
117
+ });
118
+ it('should handle round-trip with gas sponsor and payment objects', async function () {
119
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithSponsor)().build());
120
+ const rawTx = await tx.toBroadcastFormat();
121
+ const txHex = Buffer.from(rawTx, 'base64').toString('hex');
122
+ const rebuiltBuilder = factory.from(txHex);
123
+ const rebuiltTx = (await rebuiltBuilder.build());
124
+ should_1.default.equal(rebuiltTx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
125
+ should_1.default.exist(rebuiltTx.paymentObjects);
126
+ });
127
+ });
128
+ describe('Recipient Handling', () => {
129
+ const testCases = [
130
+ { count: 1, description: 'single recipient' },
131
+ { count: 10, description: 'multiple recipients' },
132
+ { count: constants_1.MAX_RECIPIENTS, description: 'maximum recipients' },
133
+ ];
134
+ testCases.forEach(({ count, description }) => {
135
+ it(`should build transaction with ${description}`, async function () {
136
+ const recipients = (0, testHelpers_1.createRecipients)(count, '1000');
137
+ const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
138
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
139
+ tx.outputs.length.should.equal(count);
140
+ tx.outputs.forEach((output) => {
141
+ output.value.should.equal('1000');
142
+ output.coin?.should.equal('tiota');
143
+ });
241
144
  });
242
- await builder.build().should.be.rejected();
243
145
  });
244
- it('should fail to build without sender', async function () {
245
- const builder = factory.getTransferBuilder();
246
- builder.recipients(testData.recipients);
247
- builder.paymentObjects(testData.paymentObjects);
248
- builder.gasData(testData.gasData);
146
+ it('should fail with more than MAX_RECIPIENTS', async function () {
147
+ const recipients = (0, testHelpers_1.createRecipients)(constants_1.MAX_RECIPIENTS + 1);
148
+ const builder = (0, testHelpers_1.createBuilderWithRecipients)(recipients);
249
149
  await builder.build().should.be.rejected();
250
150
  });
251
- it('should fail to build without recipients', async function () {
252
- const builder = factory.getTransferBuilder();
253
- builder.sender(testData.sender.address);
254
- builder.paymentObjects(testData.paymentObjects);
255
- builder.gasData(testData.gasData);
256
- await builder.build().should.be.rejected();
151
+ it('should handle duplicate recipient addresses', async function () {
152
+ const duplicateRecipients = [
153
+ { address: testHelpers_1.testData.addresses.validAddresses[0], amount: '1000' },
154
+ { address: testHelpers_1.testData.addresses.validAddresses[0], amount: '2000' },
155
+ ];
156
+ const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(duplicateRecipients).build());
157
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
158
+ tx.outputs.length.should.equal(2);
257
159
  });
258
- it('should fail to build without payment objects', async function () {
259
- const builder = factory.getTransferBuilder();
260
- builder.sender(testData.sender.address);
261
- builder.recipients(testData.recipients);
262
- builder.gasData(testData.gasData);
263
- await builder.build().should.be.rejected();
160
+ });
161
+ describe('Gas Object Handling', () => {
162
+ it('should build with single gas object', async function () {
163
+ const tx = (await (0, testHelpers_1.createBuilderWithGasObjects)([testHelpers_1.testData.gasPaymentObjects[0]]).build());
164
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
165
+ should_1.default.exist(tx.gasPaymentObjects);
166
+ tx.gasPaymentObjects?.length.should.equal(1);
167
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
168
+ });
169
+ it('should build with exactly MAX_GAS_PAYMENT_OBJECTS gas objects', async function () {
170
+ // Create exactly MAX_GAS_PAYMENT_OBJECTS (256) with valid digests
171
+ const exactlyMaxGasObjects = [];
172
+ for (let i = 0; i < constants_1.MAX_GAS_PAYMENT_OBJECTS; i++) {
173
+ exactlyMaxGasObjects.push({
174
+ ...testHelpers_1.testData.gasPaymentObjects[i % testHelpers_1.testData.gasPaymentObjects.length],
175
+ objectId: `0x${i.toString(16).padStart(64, '0')}`,
176
+ });
177
+ }
178
+ const tx = (await (0, testHelpers_1.createBuilderWithGasObjects)(exactlyMaxGasObjects).build());
179
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
180
+ should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
181
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
182
+ });
183
+ it('should build with more than MAX_GAS_PAYMENT_OBJECTS requiring merge', async function () {
184
+ // Create more than MAX_GAS_PAYMENT_OBJECTS (256) to test merge logic
185
+ const manyGasObjects = [];
186
+ for (let i = 0; i < constants_1.MAX_GAS_PAYMENT_OBJECTS + 10; i++) {
187
+ manyGasObjects.push({
188
+ ...testHelpers_1.testData.gasPaymentObjects[i % testHelpers_1.testData.gasPaymentObjects.length],
189
+ objectId: `0x${i.toString(16).padStart(64, '0')}`,
190
+ });
191
+ }
192
+ const tx = (await (0, testHelpers_1.createBuilderWithGasObjects)(manyGasObjects).build());
193
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
194
+ should_1.default.equal(tx.isSimulateTx, false);
195
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
264
196
  });
265
- it('should fail to get signable payload for simulate tx', async function () {
266
- const builder = factory.getTransferBuilder();
267
- builder.sender(testData.sender.address);
268
- builder.recipients(testData.recipients);
269
- builder.paymentObjects(testData.paymentObjects);
197
+ });
198
+ describe('Payment Object Handling', () => {
199
+ it('should build with single payment object', async function () {
200
+ const builder = factory
201
+ .getTransferBuilder()
202
+ .sender(testHelpers_1.testData.sender.address)
203
+ .recipients(testHelpers_1.testData.recipients)
204
+ .paymentObjects([testHelpers_1.testData.paymentObjects[0]])
205
+ .gasData(testHelpers_1.testData.gasData);
270
206
  const tx = (await builder.build());
271
- should_1.default.equal(tx.isSimulateTx, true);
272
- (0, should_1.default)(() => tx.signablePayload).throwError('Cannot sign a simulate tx');
207
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
208
+ tx.paymentObjects?.length.should.equal(1);
209
+ await (0, testHelpers_1.assertValidRawTransaction)(tx);
273
210
  });
274
- it('should fail when payment and gas payment objects overlap', async function () {
275
- const builder = factory.getTransferBuilder();
276
- builder.sender(testData.sender.address);
277
- builder.recipients(testData.recipients);
278
- // Use same objects for payment and gas
279
- builder.paymentObjects(testData.gasPaymentObjects);
280
- builder.gasData(testData.gasData);
281
- await builder.build().should.be.rejected();
211
+ it('should keep payment and gas objects separate', async function () {
212
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
213
+ should_1.default.exist(tx.paymentObjects);
214
+ should_1.default.exist(tx.gasPaymentObjects);
215
+ tx.paymentObjects?.length.should.equal(testHelpers_1.testData.paymentObjects.length);
216
+ tx.gasPaymentObjects?.length.should.equal(testHelpers_1.testData.gasPaymentObjects.length);
282
217
  });
283
- it('should fail to parse invalid raw transaction', function () {
284
- (0, should_1.default)(() => factory.from('invalidRawTransaction')).throwError();
218
+ it('should handle payment objects with different versions', async function () {
219
+ const mixedVersionObjects = [
220
+ {
221
+ objectId: '0x1111111111111111111111111111111111111111111111111111111111111111',
222
+ version: '1',
223
+ digest: 'DGVhYjk6YHwdPdZBgBN8czavy8LvbrshkbxF963EW7mB',
224
+ },
225
+ {
226
+ objectId: '0x2222222222222222222222222222222222222222222222222222222222222222',
227
+ version: '999999',
228
+ digest: 'DoJwXuz9oU5Y5v5vBRiTgisVTQuZQLmHZWeqJzzD5QUE',
229
+ },
230
+ ];
231
+ const builder = factory
232
+ .getTransferBuilder()
233
+ .sender(testHelpers_1.testData.sender.address)
234
+ .recipients(testHelpers_1.testData.recipients)
235
+ .paymentObjects(mixedVersionObjects)
236
+ .gasData(testHelpers_1.testData.gasData);
237
+ const tx = (await builder.build());
238
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
239
+ tx.paymentObjects?.length.should.equal(2);
240
+ });
241
+ });
242
+ describe('Validation Errors', () => {
243
+ describe('Address Validation', () => {
244
+ it('should fail for invalid sender', function () {
245
+ const builder = factory.getTransferBuilder();
246
+ (0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
247
+ });
248
+ it('should fail for invalid recipient address', function () {
249
+ const builder = (0, testHelpers_1.createBasicTransferBuilder)();
250
+ (0, should_1.default)(() => builder.recipients([{ address: 'invalidAddress', amount: '1000' }])).throwError('Invalid address invalidAddress');
251
+ });
252
+ });
253
+ describe('Amount Validation', () => {
254
+ it('should fail for negative amount', function () {
255
+ const builder = (0, testHelpers_1.createBasicTransferBuilder)();
256
+ (0, should_1.default)(() => builder.recipients([{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '-1000' }])).throwError('Value cannot be less than zero');
257
+ });
258
+ it('should fail for invalid format', function () {
259
+ const builder = (0, testHelpers_1.createBasicTransferBuilder)();
260
+ (0, should_1.default)(() => builder.recipients([{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: 'invalid' }])).throw();
261
+ });
262
+ it('should accept zero amount', async function () {
263
+ const recipients = [{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '0' }];
264
+ const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
265
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
266
+ tx.outputs[0].value.should.equal('0');
267
+ });
268
+ it('should accept very large amount', async function () {
269
+ const largeAmount = '999999999999999999';
270
+ const recipients = [{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: largeAmount }];
271
+ const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
272
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
273
+ tx.outputs[0].value.should.equal(largeAmount);
274
+ });
275
+ });
276
+ describe('Required Field Validation', () => {
277
+ it('should fail when missing sender', async function () {
278
+ const builder = factory
279
+ .getTransferBuilder()
280
+ .recipients(testHelpers_1.testData.recipients)
281
+ .paymentObjects(testHelpers_1.testData.paymentObjects)
282
+ .gasData(testHelpers_1.testData.gasData);
283
+ await builder.build().should.be.rejected();
284
+ });
285
+ it('should fail when missing recipients', async function () {
286
+ const builder = factory
287
+ .getTransferBuilder()
288
+ .sender(testHelpers_1.testData.sender.address)
289
+ .paymentObjects(testHelpers_1.testData.paymentObjects)
290
+ .gasData(testHelpers_1.testData.gasData);
291
+ await builder.build().should.be.rejected();
292
+ });
293
+ it('should fail for empty recipients', async function () {
294
+ const builder = factory
295
+ .getTransferBuilder()
296
+ .sender(testHelpers_1.testData.sender.address)
297
+ .recipients([])
298
+ .paymentObjects(testHelpers_1.testData.paymentObjects)
299
+ .gasData(testHelpers_1.testData.gasData);
300
+ await builder.build().should.be.rejected();
301
+ });
302
+ it('should fail for empty payment objects', function () {
303
+ const builder = (0, testHelpers_1.createBasicTransferBuilder)();
304
+ (0, should_1.default)(() => builder.paymentObjects([])).throwError('No Objects provided for payment');
305
+ });
306
+ it('should fail without payment objects when using gas sponsor', async function () {
307
+ const builder = factory
308
+ .getTransferBuilder()
309
+ .sender(testHelpers_1.testData.sender.address)
310
+ .recipients(testHelpers_1.testData.recipients)
311
+ .gasData(testHelpers_1.testData.gasData)
312
+ .gasSponsor(testHelpers_1.testData.gasSponsor.address);
313
+ await builder.build().should.be.rejected();
314
+ });
315
+ });
316
+ describe('Gas Data Validation', () => {
317
+ it('should fail for empty gas payment objects', function () {
318
+ const builder = (0, testHelpers_1.createBasicTransferBuilder)();
319
+ (0, should_1.default)(() => builder.gasData({
320
+ gasBudget: testHelpers_1.testData.GAS_BUDGET,
321
+ gasPrice: testHelpers_1.testData.GAS_PRICE,
322
+ gasPaymentObjects: [],
323
+ })).throwError(/Gas input objects list is empty/);
324
+ });
325
+ });
326
+ describe('Object Duplication Validation', () => {
327
+ it('should fail when payment and gas payment objects overlap', async function () {
328
+ const builder = factory
329
+ .getTransferBuilder()
330
+ .sender(testHelpers_1.testData.sender.address)
331
+ .recipients(testHelpers_1.testData.recipients)
332
+ .paymentObjects(testHelpers_1.testData.gasPaymentObjects)
333
+ .gasData(testHelpers_1.testData.gasData);
334
+ await builder.build().should.be.rejected();
335
+ });
336
+ });
337
+ describe('Transaction Parsing Validation', () => {
338
+ it('should fail to parse invalid raw transaction', function () {
339
+ (0, should_1.default)(() => factory.from('invalidRawTransaction')).throwError();
340
+ });
285
341
  });
286
342
  });
287
343
  describe('Transaction Signing', () => {
288
344
  it('should build transaction with sender signature', async function () {
289
- const txBuilder = factory.getTransferBuilder();
290
- txBuilder.sender(testData.sender.address);
291
- txBuilder.recipients(testData.recipients);
292
- txBuilder.paymentObjects(testData.paymentObjects);
293
- txBuilder.gasData(testData.gasData);
294
- const tx = (await txBuilder.build());
295
- // Add signature
296
- tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
297
- // Rebuild to trigger serialization
345
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
346
+ tx.addSignature(testHelpers_1.testData.testSignature.publicKey, testHelpers_1.testData.testSignature.signature);
298
347
  await tx.build();
299
348
  should_1.default.exist(tx.serializedSignature);
300
349
  should_1.default.equal(tx.serializedSignature.length > 0, true);
301
350
  });
302
351
  it('should build transaction with gas sponsor signature', async function () {
303
- const txBuilder = factory.getTransferBuilder();
304
- txBuilder.sender(testData.sender.address);
305
- txBuilder.recipients(testData.recipients);
306
- txBuilder.paymentObjects(testData.paymentObjects);
307
- txBuilder.gasData(testData.gasData);
308
- txBuilder.gasSponsor(testData.gasSponsor.address);
309
- const tx = (await txBuilder.build());
310
- // Add gas sponsor signature
311
- tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
312
- // Rebuild to trigger serialization
352
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithSponsor)().build());
353
+ tx.addGasSponsorSignature(testHelpers_1.testData.testGasSponsorSignature.publicKey, testHelpers_1.testData.testGasSponsorSignature.signature);
313
354
  await tx.build();
314
355
  should_1.default.exist(tx.serializedGasSponsorSignature);
315
356
  should_1.default.equal(tx.serializedGasSponsorSignature.length > 0, true);
316
357
  });
317
358
  it('should build transaction with both sender and gas sponsor signatures', async function () {
318
- const txBuilder = factory.getTransferBuilder();
319
- txBuilder.sender(testData.sender.address);
320
- txBuilder.recipients(testData.recipients);
321
- txBuilder.paymentObjects(testData.paymentObjects);
322
- txBuilder.gasData(testData.gasData);
323
- txBuilder.gasSponsor(testData.gasSponsor.address);
324
- const tx = (await txBuilder.build());
325
- // Add both signatures
326
- tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
327
- tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
328
- // Rebuild to trigger serialization
359
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithSponsor)().build());
360
+ tx.addSignature(testHelpers_1.testData.testSignature.publicKey, testHelpers_1.testData.testSignature.signature);
361
+ tx.addGasSponsorSignature(testHelpers_1.testData.testGasSponsorSignature.publicKey, testHelpers_1.testData.testGasSponsorSignature.signature);
329
362
  await tx.build();
330
363
  should_1.default.exist(tx.serializedSignature);
331
364
  should_1.default.exist(tx.serializedGasSponsorSignature);
332
365
  tx.signature.length.should.equal(2);
366
+ tx.signature[0].should.equal(tx.serializedSignature);
367
+ tx.signature[1].should.equal(tx.serializedGasSponsorSignature);
333
368
  });
334
369
  it('should add signature through builder and serialize correctly', async function () {
335
- const txBuilder = factory.getTransferBuilder();
336
- txBuilder.sender(testData.sender.address);
337
- txBuilder.recipients(testData.recipients);
338
- txBuilder.paymentObjects(testData.paymentObjects);
339
- txBuilder.gasData(testData.gasData);
340
- // Add signature through builder
341
- txBuilder.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
370
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
371
+ txBuilder.addSignature(testHelpers_1.testData.testSignature.publicKey, testHelpers_1.testData.testSignature.signature);
342
372
  const tx = (await txBuilder.build());
343
373
  should_1.default.exist(tx.serializedSignature);
344
374
  should_1.default.equal(typeof tx.serializedSignature, 'string');
345
- // Verify signature array is populated
346
375
  tx.signature.length.should.equal(1);
347
376
  });
348
- it('should add gas sponsor signature through builder and serialize correctly', async function () {
349
- const txBuilder = factory.getTransferBuilder();
350
- txBuilder.sender(testData.sender.address);
351
- txBuilder.recipients(testData.recipients);
352
- txBuilder.paymentObjects(testData.paymentObjects);
353
- txBuilder.gasData(testData.gasData);
354
- txBuilder.gasSponsor(testData.gasSponsor.address);
355
- // Add gas sponsor signature through builder
356
- txBuilder.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
357
- const tx = (await txBuilder.build());
358
- should_1.default.exist(tx.serializedGasSponsorSignature);
359
- should_1.default.equal(typeof tx.serializedGasSponsorSignature, 'string');
360
- // Verify signature array is populated
361
- tx.signature.length.should.equal(1);
362
- });
363
- it('should serialize signatures in correct order', async function () {
364
- const txBuilder = factory.getTransferBuilder();
365
- txBuilder.sender(testData.sender.address);
366
- txBuilder.recipients(testData.recipients);
367
- txBuilder.paymentObjects(testData.paymentObjects);
368
- txBuilder.gasData(testData.gasData);
369
- txBuilder.gasSponsor(testData.gasSponsor.address);
370
- // Add signatures through builder
371
- txBuilder.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
372
- txBuilder.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
373
- const tx = (await txBuilder.build());
374
- // Verify signatures are in correct order: sender first, gas sponsor second
375
- tx.signature.length.should.equal(2);
376
- tx.signature[0].should.equal(tx.serializedSignature);
377
- tx.signature[1].should.equal(tx.serializedGasSponsorSignature);
378
- });
379
377
  it('should fail to add invalid sender signature via builder', function () {
380
- const txBuilder = factory.getTransferBuilder();
381
- txBuilder.sender(testData.sender.address);
382
- txBuilder.recipients(testData.recipients);
383
- txBuilder.paymentObjects(testData.paymentObjects);
384
- txBuilder.gasData(testData.gasData);
385
- // Builder should validate and throw when adding invalid signature
386
- (0, should_1.default)(() => txBuilder.addSignature({ pub: 'tooshort' }, testData.testSignature.signature)).throwError('Invalid transaction signature');
378
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
379
+ (0, should_1.default)(() => txBuilder.addSignature({ pub: 'tooshort' }, testHelpers_1.testData.testSignature.signature)).throwError('Invalid transaction signature');
387
380
  });
388
381
  it('should fail to add invalid gas sponsor signature via builder', function () {
389
- const txBuilder = factory.getTransferBuilder();
390
- txBuilder.sender(testData.sender.address);
391
- txBuilder.recipients(testData.recipients);
392
- txBuilder.paymentObjects(testData.paymentObjects);
393
- txBuilder.gasData(testData.gasData);
394
- txBuilder.gasSponsor(testData.gasSponsor.address);
395
- // Builder should validate and throw when adding invalid signature
396
- (0, should_1.default)(() => txBuilder.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, Buffer.from('invalid'))).throwError('Invalid transaction signature');
382
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithSponsor)();
383
+ (0, should_1.default)(() => txBuilder.addGasSponsorSignature(testHelpers_1.testData.testGasSponsorSignature.publicKey, Buffer.from('invalid'))).throwError('Invalid transaction signature');
384
+ });
385
+ });
386
+ describe('Signable Payload', () => {
387
+ it('should generate signable payload for non-simulate transaction', async function () {
388
+ const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
389
+ should_1.default.equal(tx.isSimulateTx, false);
390
+ const signablePayload = tx.signablePayload;
391
+ should_1.default.exist(signablePayload);
392
+ should_1.default.equal(Buffer.isBuffer(signablePayload), true);
393
+ should_1.default.equal(signablePayload.length, 32); // Blake2b hash is 32 bytes
394
+ });
395
+ it('should fail to get signable payload for simulate transaction', async function () {
396
+ const tx = (await (0, testHelpers_1.createBasicTransferBuilder)().build());
397
+ should_1.default.equal(tx.isSimulateTx, true);
398
+ (0, should_1.default)(() => tx.signablePayload).throwError('Cannot sign a simulate tx');
399
+ });
400
+ });
401
+ describe('Input and Output Calculation', () => {
402
+ it('should calculate total input amount correctly for multiple recipients', async function () {
403
+ const recipients = [
404
+ { address: testHelpers_1.testData.addresses.validAddresses[0], amount: '1000' },
405
+ { address: testHelpers_1.testData.addresses.validAddresses[1], amount: '2000' },
406
+ { address: testHelpers_1.testData.addresses.validAddresses[2], amount: '3000' },
407
+ ];
408
+ const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
409
+ const expectedTotal = '6000';
410
+ tx.inputs[0].value.should.equal(expectedTotal);
411
+ tx.outputs.length.should.equal(3);
397
412
  });
398
413
  });
399
414
  });
400
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLHNDQUE4RTtBQUM5RSwrREFBaUQ7QUFDakQsbURBQXVEO0FBQ3ZELG1FQUEyQztBQUMzQywwREFBcUU7QUFFckUsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVsRSxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSztZQUN2RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFbEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pE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QUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWxELGtFQUFrRTtZQUNsRSxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUNyRyxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9pb3RhJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuXG5kZXNjcmliZSgnSW90YSBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aW90YScpKTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHggd2l0aCBzaW11bGF0ZSBtb2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgucmVjaXBpZW50cywgdGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnBheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciB0eCB3aXRoIGdhcyBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNCdWRnZXQsIHRlc3REYXRhLkdBU19CVURHRVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1ByaWNlLCB0ZXN0RGF0YS5HQVNfUFJJQ0UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5nYXNQYXltZW50T2JqZWN0cywgdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAodGVzdERhdGEuQU1PVU5UICsgdGVzdERhdGEuQU1PVU5UICogMikudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3Rpb3RhJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rpb3RhJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0aW90YScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHR4IHdpdGggZ2FzIHNwb25zb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgZmFsc2UpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHggd2l0aCBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gMTAwMDtcbiAgICAgIGNvbnN0IG51bWJlck9mUmVjaXBpZW50cyA9IDEwO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBuZXcgQXJyYXkobnVtYmVyT2ZSZWNpcGllbnRzKS5maWxsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAoYW1vdW50ICogbnVtYmVyT2ZSZWNpcGllbnRzKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndGlvdGEnLFxuICAgICAgfSk7XG5cbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbChudW1iZXJPZlJlY2lwaWVudHMpO1xuICAgICAgdHgub3V0cHV0cy5mb3JFYWNoKChvdXRwdXQpID0+XG4gICAgICAgIG91dHB1dC5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgICAgdmFsdWU6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW46ICd0aW90YScsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBmcm9tIEpTT04gYW5kIHJlYnVpbGQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgY29uc3QgcmVidWlsdFR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAocmVidWlsdFR4QnVpbGRlci50cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uKS5wYXJzZUZyb21KU09OKHR4SnNvbik7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdFR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4LnJlY2lwaWVudHMsIHR4LnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5nYXNCdWRnZXQsIHR4Lmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4Lmdhc1ByaWNlLCB0eC5nYXNQcmljZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0byBicm9hZGNhc3QgZm9ybWF0IGNvbnNpc3RlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyMS5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyMS5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyMS5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIxLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4MSA9IChhd2FpdCB0eEJ1aWxkZXIxLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeDEgPSBhd2FpdCB0eDEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlcjIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHgyID0gKGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHJhd1R4MiA9IGF3YWl0IHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgxLCByYXdUeDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4MS50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHR4IHdpdGggc2lnbmFibGUgcGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcblxuICAgICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gdHguc2lnbmFibGVQYXlsb2FkO1xuICAgICAgc2hvdWxkLmV4aXN0KHNpZ25hYmxlUGF5bG9hZCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmlzQnVmZmVyKHNpZ25hYmxlUGF5bG9hZCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25hYmxlUGF5bG9hZC5sZW5ndGgsIDMyKTsgLy8gQmxha2UyYiBoYXNoIGlzIDMyIGJ5dGVzXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRvSlNPTiBvdXRwdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnJlY2lwaWVudHMsIHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bWVudE9iamVjdHMsIHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZ2FzUHJpY2UsIHRlc3REYXRhLkdBU19QUklDRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nYXNQYXltZW50T2JqZWN0cywgdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBzZW5kZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbeyBhZGRyZXNzOiAnaW52YWxpZEFkZHJlc3MnLCBhbW91bnQ6ICcxMDAwJyB9XSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIGFkZHJlc3MgaW52YWxpZEFkZHJlc3MnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHJlY2lwaWVudCBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3sgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICctMTAwMCcgfV0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgZW1wdHkgcmVjaXBpZW50cyBkdXJpbmcgYnVpbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyhbXSk7XG4gICAgICBidWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBlbXB0eSBwYXltZW50IG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnBheW1lbnRPYmplY3RzKFtdKSkudGhyb3dFcnJvcignTm8gT2JqZWN0cyBwcm92aWRlZCBmb3IgcGF5bWVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gZ2FzIHBheW1lbnQgb2JqZWN0cyBleGNlZWQgbWF4aW11bScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgYnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgYnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHRvb01hbnlHYXNPYmplY3RzID0gdGVzdERhdGEuZ2VuZXJhdGVPYmplY3RzKE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTICsgMSk7XG4gICAgICBidWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBnYXNCdWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIGdhc1ByaWNlOiB0ZXN0RGF0YS5HQVNfUFJJQ0UsXG4gICAgICAgIGdhc1BheW1lbnRPYmplY3RzOiB0b29NYW55R2FzT2JqZWN0cyxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgd2l0aG91dCBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgd2l0aG91dCByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIHdpdGhvdXQgcGF5bWVudCBvYmplY3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBidWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBnZXQgc2lnbmFibGUgcGF5bG9hZCBmb3Igc2ltdWxhdGUgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcblxuICAgICAgc2hvdWxkKCgpID0+IHR4LnNpZ25hYmxlUGF5bG9hZCkudGhyb3dFcnJvcignQ2Fubm90IHNpZ24gYSBzaW11bGF0ZSB0eCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gcGF5bWVudCBhbmQgZ2FzIHBheW1lbnQgb2JqZWN0cyBvdmVybGFwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAvLyBVc2Ugc2FtZSBvYmplY3RzIGZvciBwYXltZW50IGFuZCBnYXNcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcGFyc2UgaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKCdpbnZhbGlkUmF3VHJhbnNhY3Rpb24nKSkudGhyb3dFcnJvcigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2lnbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggc2VuZGVyIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gQWRkIHNpZ25hdHVyZVxuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSEubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggZ2FzIHNwb25zb3Igc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gQWRkIGdhcyBzcG9uc29yIHNpZ25hdHVyZVxuICAgICAgdHguYWRkR2FzU3BvbnNvclNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlIS5sZW5ndGggPiAwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBib3RoIHNlbmRlciBhbmQgZ2FzIHNwb25zb3Igc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIEFkZCBib3RoIHNpZ25hdHVyZXNcbiAgICAgIHR4LmFkZFNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnB1YmxpY0tleSwgdGVzdERhdGEudGVzdFNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgICAgdHguYWRkR2FzU3BvbnNvclNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBzaWduYXR1cmUgdGhyb3VnaCBidWlsZGVyIGFuZCBzZXJpYWxpemUgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIC8vIEFkZCBzaWduYXR1cmUgdGhyb3VnaCBidWlsZGVyXG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHlwZW9mIHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUsICdzdHJpbmcnKTtcbiAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUgYXJyYXkgaXMgcG9wdWxhdGVkXG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIGdhcyBzcG9uc29yIHNpZ25hdHVyZSB0aHJvdWdoIGJ1aWxkZXIgYW5kIHNlcmlhbGl6ZSBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIC8vIEFkZCBnYXMgc3BvbnNvciBzaWduYXR1cmUgdGhyb3VnaCBidWlsZGVyXG4gICAgICB0eEJ1aWxkZXIuYWRkR2FzU3BvbnNvclNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUucHVibGljS2V5LFxuICAgICAgICB0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5zaWduYXR1cmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiB0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSwgJ3N0cmluZycpO1xuICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBhcnJheSBpcyBwb3B1bGF0ZWRcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXJpYWxpemUgc2lnbmF0dXJlcyBpbiBjb3JyZWN0IG9yZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuXG4gICAgICAvLyBBZGQgc2lnbmF0dXJlcyB0aHJvdWdoIGJ1aWxkZXJcbiAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUodGVzdERhdGEudGVzdFNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKTtcbiAgICAgIHR4QnVpbGRlci5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksXG4gICAgICAgIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmVzIGFyZSBpbiBjb3JyZWN0IG9yZGVyOiBzZW5kZXIgZmlyc3QsIGdhcyBzcG9uc29yIHNlY29uZFxuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUpO1xuICAgICAgdHguc2lnbmF0dXJlWzFdLnNob3VsZC5lcXVhbCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYWRkIGludmFsaWQgc2VuZGVyIHNpZ25hdHVyZSB2aWEgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAvLyBCdWlsZGVyIHNob3VsZCB2YWxpZGF0ZSBhbmQgdGhyb3cgd2hlbiBhZGRpbmcgaW52YWxpZCBzaWduYXR1cmVcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiAndG9vc2hvcnQnIH0sIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24gc2lnbmF0dXJlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBhZGQgaW52YWxpZCBnYXMgc3BvbnNvciBzaWduYXR1cmUgdmlhIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIC8vIEJ1aWxkZXIgc2hvdWxkIHZhbGlkYXRlIGFuZCB0aHJvdyB3aGVuIGFkZGluZyBpbnZhbGlkIHNpZ25hdHVyZVxuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnB1YmxpY0tleSwgQnVmZmVyLmZyb20oJ2ludmFsaWQnKSlcbiAgICAgICkudGhyb3dFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbiBzaWduYXR1cmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbURBQXVEO0FBQ3ZELDBEQUFxRjtBQUVyRix3REFjZ0M7QUFHaEMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUU3QixRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1FBQzFDLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO1lBQzlELE1BQU0sU0FBUyxHQUFHLElBQUEsd0NBQTBCLEdBQUUsQ0FBQztZQUMvQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRTVELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUEsOENBQWdDLEVBQUMsRUFBRSxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFBLHVDQUF5QixFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUs7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBQSwwQ0FBNEIsR0FBRSxDQUFDO1lBQ2pELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFFNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsSUFBQSw4Q0FBZ0MsRUFBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFBLDJCQUFhLEVBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsSUFBQSxvQ0FBc0IsRUFBQyxFQUFFLEVBQUUsc0JBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxNQUFNLElBQUEsdUNBQXlCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSztZQUM5RCxNQUFNLFNBQVMsR0FBRyxJQUFBLDhDQUFnQyxHQUFFLENBQUM7WUFDckQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUU1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLHNCQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFBLHVDQUF5QixFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEtBQUs7WUFDNUUsTUFBTSxTQUFTLEdBQUcsSUFBQSw2Q0FBK0IsR0FBRSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFFNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUEsdUNBQXlCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSztZQUN4QyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTztpQkFDdEIsa0JBQWtCLEVBQUU7aUJBQ3BCLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQy9CLFVBQVUsQ0FBQyxzQkFBUSxDQUFDLFVBQVUsQ0FBQztpQkFDL0IsY0FBYyxDQUFDLHNCQUFRLENBQUMsY0FBYyxDQUFDO2lCQUN2QyxPQUFPLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUM7aUJBQ3pCLFVBQVUsQ0FBQyxzQkFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7aUJBQ3ZDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRW5DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxzQkFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSztZQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFBLDBDQUE0QixHQUFFLENBQUM7WUFDakQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUM1RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFM0IsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxnQkFBZ0IsQ0FBQyxXQUFtQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RSxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFFMUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSztZQUMzRCxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBQSwwQ0FBNEIsR0FBRSxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQ2xGLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFN0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUEsMENBQTRCLEdBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUNsRixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTdDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLDBDQUE0QixHQUFFLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDakYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRTNCLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxzQkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsc0JBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLHNCQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxzQkFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxzQkFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDdkUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxLQUFLO1lBQzFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLDZDQUErQixHQUFFLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDcEYsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0QsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRXhFLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RELGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSztZQUNqRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSwwQ0FBNEIsR0FBRSxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQ2pGLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTNELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUV4RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0RBQStELEVBQUUsS0FBSztZQUN2RSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSw4Q0FBZ0MsR0FBRSxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQ3JGLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTNELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUV4RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLHNCQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hFLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxNQUFNLFNBQVMsR0FBRztZQUNoQixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFO1lBQzdDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUU7WUFDakQsRUFBRSxLQUFLLEVBQUUsMEJBQWMsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUU7U0FDN0QsQ0FBQztRQUVGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO1lBQzNDLEVBQUUsQ0FBQyxpQ0FBaUMsV0FBVyxFQUFFLEVBQUUsS0FBSztnQkFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLHlDQUEyQixFQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO2dCQUUxRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSztZQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFBLDhCQUFnQixFQUFDLDBCQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBQSx5Q0FBMkIsRUFBQyxVQUFVLENBQUMsQ0FBQztZQUN4RCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUs7WUFDckQsTUFBTSxtQkFBbUIsR0FBRztnQkFDMUIsRUFBRSxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7Z0JBQ2pFLEVBQUUsT0FBTyxFQUFFLHNCQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO2FBQ2xFLENBQUM7WUFDRixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSx5Q0FBMkIsRUFBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRW5HLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLO1lBQzdDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLHlDQUEyQixFQUFDLENBQUMsc0JBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFFL0csZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLElBQUEsdUNBQXlCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0RBQStELEVBQUUsS0FBSztZQUN2RSxrRUFBa0U7WUFDbEUsTUFBTSxvQkFBb0IsR0FBNkIsRUFBRSxDQUFDO1lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQ0FBdUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLEdBQUcsc0JBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsc0JBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7b0JBQ3BFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtpQkFDbEQsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLHlDQUEyQixFQUFDLG9CQUFvQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFFcEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakQsTUFBTSxJQUFBLHVDQUF5QixFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUs7WUFDN0UscUVBQXFFO1lBQ3JFLE1BQU0sY0FBYyxHQUE2QixFQUFFLENBQUM7WUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG1DQUF1QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0RCxjQUFjLENBQUMsSUFBSSxDQUFDO29CQUNsQixHQUFHLHNCQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLHNCQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO29CQUNwRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7aUJBQ2xELENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSx5Q0FBMkIsRUFBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUU5RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQyxNQUFNLElBQUEsdUNBQXlCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDdkMsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUs7WUFDakQsTUFBTSxPQUFPLEdBQUcsT0FBTztpQkFDcEIsa0JBQWtCLEVBQUU7aUJBQ3BCLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQy9CLFVBQVUsQ0FBQyxzQkFBUSxDQUFDLFVBQVUsQ0FBQztpQkFDL0IsY0FBYyxDQUFDLENBQUMsc0JBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUMsT0FBTyxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUMxRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxNQUFNLElBQUEsdUNBQXlCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUUsS0FBSztZQUN0RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSwwQ0FBNEIsR0FBRSxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRWpGLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuQyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEtBQUs7WUFDL0QsTUFBTSxtQkFBbUIsR0FBNkI7Z0JBQ3BEO29CQUNFLFFBQVEsRUFBRSxvRUFBb0U7b0JBQzlFLE9BQU8sRUFBRSxHQUFHO29CQUNaLE1BQU0sRUFBRSw4Q0FBOEM7aUJBQ3ZEO2dCQUNEO29CQUNFLFFBQVEsRUFBRSxvRUFBb0U7b0JBQzlFLE9BQU8sRUFBRSxRQUFRO29CQUNqQixNQUFNLEVBQUUsOENBQThDO2lCQUN2RDthQUNGLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRyxPQUFPO2lCQUNwQixrQkFBa0IsRUFBRTtpQkFDcEIsTUFBTSxDQUFDLHNCQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztpQkFDL0IsVUFBVSxDQUFDLHNCQUFRLENBQUMsVUFBVSxDQUFDO2lCQUMvQixjQUFjLENBQUMsbUJBQW1CLENBQUM7aUJBQ25DLE9BQU8sQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDMUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDakMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtZQUNsQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQ25DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM3QyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzFGLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO2dCQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFBLHdDQUEwQixHQUFFLENBQUM7Z0JBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDMUYsZ0NBQWdDLENBQ2pDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtZQUNqQyxFQUFFLENBQUMsaUNBQWlDLEVBQUU7Z0JBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUEsd0NBQTBCLEdBQUUsQ0FBQztnQkFDN0MsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUNWLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxzQkFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDekYsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRTtnQkFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBQSx3Q0FBMEIsR0FBRSxDQUFDO2dCQUM3QyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLHNCQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUMzRixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSztnQkFDbkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxzQkFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLHlDQUEyQixFQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO2dCQUUxRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSztnQkFDekMsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUM7Z0JBQ3pDLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSx5Q0FBMkIsRUFBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztnQkFFMUYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1lBQ3pDLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLO2dCQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPO3FCQUNwQixrQkFBa0IsRUFBRTtxQkFDcEIsVUFBVSxDQUFDLHNCQUFRLENBQUMsVUFBVSxDQUFDO3FCQUMvQixjQUFjLENBQUMsc0JBQVEsQ0FBQyxjQUFjLENBQUM7cUJBQ3ZDLE9BQU8sQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUU3QixNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUs7Z0JBQzdDLE1BQU0sT0FBTyxHQUFHLE9BQU87cUJBQ3BCLGtCQUFrQixFQUFFO3FCQUNwQixNQUFNLENBQUMsc0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO3FCQUMvQixjQUFjLENBQUMsc0JBQVEsQ0FBQyxjQUFjLENBQUM7cUJBQ3ZDLE9BQU8sQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUU3QixNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUs7Z0JBQzFDLE1BQU0sT0FBTyxHQUFHLE9BQU87cUJBQ3BCLGtCQUFrQixFQUFFO3FCQUNwQixNQUFNLENBQUMsc0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO3FCQUMvQixVQUFVLENBQUMsRUFBRSxDQUFDO3FCQUNkLGNBQWMsQ0FBQyxzQkFBUSxDQUFDLGNBQWMsQ0FBQztxQkFDdkMsT0FBTyxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTdCLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7Z0JBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUEsd0NBQTBCLEdBQUUsQ0FBQztnQkFDN0MsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUN6RixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLO2dCQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPO3FCQUNwQixrQkFBa0IsRUFBRTtxQkFDcEIsTUFBTSxDQUFDLHNCQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztxQkFDL0IsVUFBVSxDQUFDLHNCQUFRLENBQUMsVUFBVSxDQUFDO3FCQUMvQixPQUFPLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUM7cUJBQ3pCLFVBQVUsQ0FBQyxzQkFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFM0MsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtZQUNuQyxFQUFFLENBQUMsMkNBQTJDLEVBQUU7Z0JBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUEsd0NBQTBCLEdBQUUsQ0FBQztnQkFDN0MsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUNWLE9BQU8sQ0FBQyxPQUFPLENBQUM7b0JBQ2QsU0FBUyxFQUFFLHNCQUFRLENBQUMsVUFBVTtvQkFDOUIsUUFBUSxFQUFFLHNCQUFRLENBQUMsU0FBUztvQkFDNUIsaUJBQWlCLEVBQUUsRUFBRTtpQkFDdEIsQ0FBQyxDQUNILENBQUMsVUFBVSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7WUFDN0MsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEtBQUs7Z0JBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU87cUJBQ3BCLGtCQUFrQixFQUFFO3FCQUNwQixNQUFNLENBQUMsc0JBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO3FCQUMvQixVQUFVLENBQUMsc0JBQVEsQ0FBQyxVQUFVLENBQUM7cUJBQy9CLGNBQWMsQ0FBQyxzQkFBUSxDQUFDLGlCQUFpQixDQUFDO3FCQUMxQyxPQUFPLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFN0IsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxFQUFFLENBQUMsOENBQThDLEVBQUU7Z0JBQ2pELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLO1lBQ3hELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLDBDQUE0QixHQUFFLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDakYsRUFBRSxDQUFDLFlBQVksQ0FBQyxzQkFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFcEYsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLG1CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztZQUM3RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBQSw4Q0FBZ0MsR0FBRSxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQ3JGLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxzQkFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWxILE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQy9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyw2QkFBOEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFLEtBQUs7WUFDOUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUEsOENBQWdDLEdBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUVyRixFQUFFLENBQUMsWUFBWSxDQUFDLHNCQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxzQkFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRixFQUFFLENBQUMsc0JBQXNCLENBQUMsc0JBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsc0JBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVsSCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUMvQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyRCxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOERBQThELEVBQUUsS0FBSztZQUN0RSxNQUFNLFNBQVMsR0FBRyxJQUFBLDBDQUE0QixHQUFFLENBQUM7WUFDakQsU0FBUyxDQUFDLFlBQVksQ0FBQyxzQkFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFM0YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RCxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFO1lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUEsMENBQTRCLEdBQUUsQ0FBQztZQUNqRCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxzQkFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDcEcsK0JBQStCLENBQ2hDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4REFBOEQsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRyxJQUFBLDhDQUFnQyxHQUFFLENBQUM7WUFDckQsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUNWLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3JHLENBQUMsVUFBVSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUs7WUFDdkUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUEsMENBQTRCLEdBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUVqRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDM0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDOUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEtBQUs7WUFDdEUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUEsd0NBQTBCLEdBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUUvRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDNUMsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEtBQUs7WUFDL0UsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEVBQUUsT0FBTyxFQUFFLHNCQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO2dCQUNqRSxFQUFFLE9BQU8sRUFBRSxzQkFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtnQkFDakUsRUFBRSxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7YUFDbEUsQ0FBQztZQUNGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFBLHlDQUEyQixFQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRTFGLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUM3QixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgTUFYX0dBU19QQVlNRU5UX09CSkVDVFMsIE1BWF9SRUNJUElFTlRTIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIsXG4gIGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMsXG4gIGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhTcG9uc29yLFxuICBjcmVhdGVCdWlsZGVyV2l0aFJlY2lwaWVudHMsXG4gIGNyZWF0ZUJ1aWxkZXJXaXRoR2FzT2JqZWN0c09ubHksXG4gIGNyZWF0ZUJ1aWxkZXJXaXRoR2FzT2JqZWN0cyxcbiAgYXNzZXJ0QmFzaWNUcmFuc2FjdGlvblByb3BlcnRpZXMsXG4gIGFzc2VydEdhc0RhdGEsXG4gIGFzc2VydElucHV0c0FuZE91dHB1dHMsXG4gIGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24sXG4gIGNyZWF0ZVJlY2lwaWVudHMsXG4gIGdldEZhY3RvcnksXG4gIHRlc3REYXRhLFxufSBmcm9tICcuLi9oZWxwZXJzL3Rlc3RIZWxwZXJzJztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnSW90YSBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpO1xuXG4gIGRlc2NyaWJlKCdCYXNpYyBUcmFuc2FjdGlvbiBCdWlsZGluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gaW4gc2ltdWxhdGUgbW9kZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZUJhc2ljVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIHRydWUpO1xuICAgICAgYXNzZXJ0QmFzaWNUcmFuc2FjdGlvblByb3BlcnRpZXModHgpO1xuICAgICAgYXdhaXQgYXNzZXJ0VmFsaWRSYXdUcmFuc2FjdGlvbih0eCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBnYXMgZGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgZmFsc2UpO1xuICAgICAgYXNzZXJ0QmFzaWNUcmFuc2FjdGlvblByb3BlcnRpZXModHgpO1xuICAgICAgYXNzZXJ0R2FzRGF0YSh0eCk7XG4gICAgICBhc3NlcnRJbnB1dHNBbmRPdXRwdXRzKHR4LCB0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggZ2FzIHNwb25zb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoU3BvbnNvcigpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzU3BvbnNvciwgdGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB1c2luZyBnYXMgb2JqZWN0cyB3aGVuIG5vIHBheW1lbnQgb2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXJXaXRoR2FzT2JqZWN0c09ubHkoKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnBheW1lbnRPYmplY3RzLCB1bmRlZmluZWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4Lmdhc1BheW1lbnRPYmplY3RzKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IG1ldGhvZCBjaGFpbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpXG4gICAgICAgIC5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cylcbiAgICAgICAgLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSlcbiAgICAgICAgLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKVxuICAgICAgICAuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmV4aXN0KHR4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2VyaWFsaXphdGlvbiBhbmQgRGVzZXJpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIHRvIEpTT04gYW5kIHJlYnVpbGQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBjb25zdCByZWJ1aWx0VHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIChyZWJ1aWx0VHhCdWlsZGVyLnRyYW5zYWN0aW9uIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb24pLnBhcnNlRnJvbUpTT04odHhKc29uKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCByZWJ1aWx0VHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguc2VuZGVyLCB0eC5zZW5kZXIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZWJ1aWx0VHgucmVjaXBpZW50cywgdHgucmVjaXBpZW50cyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4Lmdhc0J1ZGdldCwgdHguZ2FzQnVkZ2V0KTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguZ2FzUHJpY2UsIHR4Lmdhc1ByaWNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIHRvIGJyb2FkY2FzdCBmb3JtYXQgY29uc2lzdGVudGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHgxID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgcmF3VHgxID0gYXdhaXQgdHgxLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHJhd1R4MiA9IGF3YWl0IHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgxLCByYXdUeDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0b0pTT04gb3V0cHV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnJlY2lwaWVudHMsIHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bWVudE9iamVjdHMsIHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZ2FzUHJpY2UsIHRlc3REYXRhLkdBU19QUklDRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nYXNQYXltZW50T2JqZWN0cywgdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSb3VuZC10cmlwIFBhcnNpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgcGFyc2UgYW5kIHJlYnVpbGQgdHJhbnNhY3Rpb24gdXNpbmcgZ2FzIG9iamVjdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aEdhc09iamVjdHNPbmx5KCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHR4SGV4ID0gQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4LnJlY2lwaWVudHMsIHR4LnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5nYXNCdWRnZXQsIHR4Lmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4Lmdhc1ByaWNlLCB0eC5nYXNQcmljZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnBheW1lbnRPYmplY3RzLCB1bmRlZmluZWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KHJlYnVpbHRUeC5nYXNQYXltZW50T2JqZWN0cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSB0cmFuc2FjdGlvbiB3aXRoIHBheW1lbnQgb2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhIZXggPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gKGF3YWl0IHJlYnVpbHRCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHgucGF5bWVudE9iamVjdHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5wYXltZW50T2JqZWN0cz8ubGVuZ3RoLCB0ZXN0RGF0YS5wYXltZW50T2JqZWN0cy5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcm91bmQtdHJpcCB3aXRoIGdhcyBzcG9uc29yIGFuZCBwYXltZW50IG9iamVjdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoU3BvbnNvcigpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEhleCA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBjb25zdCByZWJ1aWx0QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmV4aXN0KHJlYnVpbHRUeC5wYXltZW50T2JqZWN0cyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNpcGllbnQgSGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENhc2VzID0gW1xuICAgICAgeyBjb3VudDogMSwgZGVzY3JpcHRpb246ICdzaW5nbGUgcmVjaXBpZW50JyB9LFxuICAgICAgeyBjb3VudDogMTAsIGRlc2NyaXB0aW9uOiAnbXVsdGlwbGUgcmVjaXBpZW50cycgfSxcbiAgICAgIHsgY291bnQ6IE1BWF9SRUNJUElFTlRTLCBkZXNjcmlwdGlvbjogJ21heGltdW0gcmVjaXBpZW50cycgfSxcbiAgICBdO1xuXG4gICAgdGVzdENhc2VzLmZvckVhY2goKHsgY291bnQsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCAke2Rlc2NyaXB0aW9ufWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVjaXBpZW50cyA9IGNyZWF0ZVJlY2lwaWVudHMoY291bnQsICcxMDAwJyk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhyZWNpcGllbnRzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbChjb3VudCk7XG4gICAgICAgIHR4Lm91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICAgICAgb3V0cHV0LnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgICAgIG91dHB1dC5jb2luPy5zaG91bGQuZXF1YWwoJ3Rpb3RhJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtb3JlIHRoYW4gTUFYX1JFQ0lQSUVOVFMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gY3JlYXRlUmVjaXBpZW50cyhNQVhfUkVDSVBJRU5UUyArIDEpO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhyZWNpcGllbnRzKTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSByZWNpcGllbnQgYWRkcmVzc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZHVwbGljYXRlUmVjaXBpZW50cyA9IFtcbiAgICAgICAgeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJzEwMDAnIH0sXG4gICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICcyMDAwJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhkdXBsaWNhdGVSZWNpcGllbnRzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2FzIE9iamVjdCBIYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggc2luZ2xlIGdhcyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aEdhc09iamVjdHMoW3Rlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzWzBdXSkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5nYXNQYXltZW50T2JqZWN0cyk7XG4gICAgICB0eC5nYXNQYXltZW50T2JqZWN0cz8ubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB3aXRoIGV4YWN0bHkgTUFYX0dBU19QQVlNRU5UX09CSkVDVFMgZ2FzIG9iamVjdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDcmVhdGUgZXhhY3RseSBNQVhfR0FTX1BBWU1FTlRfT0JKRUNUUyAoMjU2KSB3aXRoIHZhbGlkIGRpZ2VzdHNcbiAgICAgIGNvbnN0IGV4YWN0bHlNYXhHYXNPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTUFYX0dBU19QQVlNRU5UX09CSkVDVFM7IGkrKykge1xuICAgICAgICBleGFjdGx5TWF4R2FzT2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICAuLi50ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0c1tpICUgdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoXSxcbiAgICAgICAgICBvYmplY3RJZDogYDB4JHtpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg2NCwgJzAnKX1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlQnVpbGRlcldpdGhHYXNPYmplY3RzKGV4YWN0bHlNYXhHYXNPYmplY3RzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgYXdhaXQgYXNzZXJ0VmFsaWRSYXdUcmFuc2FjdGlvbih0eCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggbW9yZSB0aGFuIE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTIHJlcXVpcmluZyBtZXJnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIENyZWF0ZSBtb3JlIHRoYW4gTUFYX0dBU19QQVlNRU5UX09CSkVDVFMgKDI1NikgdG8gdGVzdCBtZXJnZSBsb2dpY1xuICAgICAgY29uc3QgbWFueUdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfR0FTX1BBWU1FTlRfT0JKRUNUUyArIDEwOyBpKyspIHtcbiAgICAgICAgbWFueUdhc09iamVjdHMucHVzaCh7XG4gICAgICAgICAgLi4udGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHNbaSAlIHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aF0sXG4gICAgICAgICAgb2JqZWN0SWQ6IGAweCR7aS50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyl9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoR2FzT2JqZWN0cyhtYW55R2FzT2JqZWN0cykuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGF5bWVudCBPYmplY3QgSGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCB3aXRoIHNpbmdsZSBwYXltZW50IG9iamVjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKVxuICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAucGF5bWVudE9iamVjdHMoW3Rlc3REYXRhLnBheW1lbnRPYmplY3RzWzBdXSlcbiAgICAgICAgLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5wYXltZW50T2JqZWN0cz8ubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBrZWVwIHBheW1lbnQgYW5kIGdhcyBvYmplY3RzIHNlcGFyYXRlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5leGlzdCh0eC5wYXltZW50T2JqZWN0cyk7XG4gICAgICBzaG91bGQuZXhpc3QodHguZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgdHgucGF5bWVudE9iamVjdHM/Lmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucGF5bWVudE9iamVjdHMubGVuZ3RoKTtcbiAgICAgIHR4Lmdhc1BheW1lbnRPYmplY3RzPy5sZW5ndGguc2hvdWxkLmVxdWFsKHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBwYXltZW50IG9iamVjdHMgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtaXhlZFZlcnNpb25PYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScsXG4gICAgICAgICAgdmVyc2lvbjogJzEnLFxuICAgICAgICAgIGRpZ2VzdDogJ0RHVmhZams2WUh3ZFBkWkJnQk44Y3phdnk4THZicnNoa2J4Rjk2M0VXN21CJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdElkOiAnMHgyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnOTk5OTk5JyxcbiAgICAgICAgICBkaWdlc3Q6ICdEb0p3WHV6OW9VNVk1djV2QlJpVGdpc1ZUUXVaUUxtSFpXZXFKenpENVFVRScsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cylcbiAgICAgICAgLnBheW1lbnRPYmplY3RzKG1peGVkVmVyc2lvbk9iamVjdHMpXG4gICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHgucGF5bWVudE9iamVjdHM/Lmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uIEVycm9ycycsICgpID0+IHtcbiAgICBkZXNjcmliZSgnQWRkcmVzcyBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCYXNpY1RyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5yZWNpcGllbnRzKFt7IGFkZHJlc3M6ICdpbnZhbGlkQWRkcmVzcycsIGFtb3VudDogJzEwMDAnIH1dKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBhZGRyZXNzIGludmFsaWRBZGRyZXNzJ1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnQW1vdW50IFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIG5lZ2F0aXZlIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJhc2ljVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyhbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJy0xMDAwJyB9XSlcbiAgICAgICAgKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgYW1vdW50OiAnaW52YWxpZCcgfV0pXG4gICAgICAgICkudGhyb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFjY2VwdCB6ZXJvIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgYW1vdW50OiAnMCcgfV07XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhyZWNpcGllbnRzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmVyeSBsYXJnZSBhbW91bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGxhcmdlQW1vdW50ID0gJzk5OTk5OTk5OTk5OTk5OTk5OSc7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogbGFyZ2VBbW91bnQgfV07XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhyZWNpcGllbnRzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKGxhcmdlQW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1JlcXVpcmVkIEZpZWxkIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBtaXNzaW5nIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAgIC5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cylcbiAgICAgICAgICAuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gbWlzc2luZyByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgICAgLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKVxuICAgICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGVtcHR5IHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgICAucmVjaXBpZW50cyhbXSlcbiAgICAgICAgICAucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpXG4gICAgICAgICAgLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgZW1wdHkgcGF5bWVudCBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucGF5bWVudE9iamVjdHMoW10pKS50aHJvd0Vycm9yKCdObyBPYmplY3RzIHByb3ZpZGVkIGZvciBwYXltZW50Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGhvdXQgcGF5bWVudCBvYmplY3RzIHdoZW4gdXNpbmcgZ2FzIHNwb25zb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpXG4gICAgICAgICAgLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdHYXMgRGF0YSBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBlbXB0eSBnYXMgcGF5bWVudCBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICAgIGdhc0J1ZGdldDogdGVzdERhdGEuR0FTX0JVREdFVCxcbiAgICAgICAgICAgIGdhc1ByaWNlOiB0ZXN0RGF0YS5HQVNfUFJJQ0UsXG4gICAgICAgICAgICBnYXNQYXltZW50T2JqZWN0czogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKS50aHJvd0Vycm9yKC9HYXMgaW5wdXQgb2JqZWN0cyBsaXN0IGlzIGVtcHR5Lyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdPYmplY3QgRHVwbGljYXRpb24gVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHBheW1lbnQgYW5kIGdhcyBwYXltZW50IG9iamVjdHMgb3ZlcmxhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgICAuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKVxuICAgICAgICAgIC5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpXG4gICAgICAgICAgLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzKVxuICAgICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFBhcnNpbmcgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBwYXJzZSBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2hvdWxkKCgpID0+IGZhY3RvcnkuZnJvbSgnaW52YWxpZFJhd1RyYW5zYWN0aW9uJykpLnRocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2lnbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggc2VuZGVyIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSEubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggZ2FzIHNwb25zb3Igc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aFNwb25zb3IoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgdHguYWRkR2FzU3BvbnNvclNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlIS5sZW5ndGggPiAwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBib3RoIHNlbmRlciBhbmQgZ2FzIHNwb25zb3Igc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhTcG9uc29yKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG4gICAgICB0eC5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnB1YmxpY0tleSwgdGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUuc2lnbmF0dXJlKTtcblxuICAgICAgYXdhaXQgdHguYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkU2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICB0eC5zaWduYXR1cmVbMV0uc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIHNpZ25hdHVyZSB0aHJvdWdoIGJ1aWxkZXIgYW5kIHNlcmlhbGl6ZSBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiB0eC5zZXJpYWxpemVkU2lnbmF0dXJlLCAnc3RyaW5nJyk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBhZGQgaW52YWxpZCBzZW5kZXIgc2lnbmF0dXJlIHZpYSBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6ICd0b29zaG9ydCcgfSwgdGVzdERhdGEudGVzdFNpZ25hdHVyZS5zaWduYXR1cmUpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiBzaWduYXR1cmUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGFkZCBpbnZhbGlkIGdhcyBzcG9uc29yIHNpZ25hdHVyZSB2aWEgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhTcG9uc29yKCk7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmFkZEdhc1Nwb25zb3JTaWduYXR1cmUodGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUucHVibGljS2V5LCBCdWZmZXIuZnJvbSgnaW52YWxpZCcpKVxuICAgICAgKS50aHJvd0Vycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uIHNpZ25hdHVyZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbmFibGUgUGF5bG9hZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHNpZ25hYmxlIHBheWxvYWQgZm9yIG5vbi1zaW11bGF0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCBmYWxzZSk7XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBzaG91bGQuZXhpc3Qoc2lnbmFibGVQYXlsb2FkKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuaXNCdWZmZXIoc2lnbmFibGVQYXlsb2FkKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVQYXlsb2FkLmxlbmd0aCwgMzIpOyAvLyBCbGFrZTJiIGhhc2ggaXMgMzIgYnl0ZXNcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBnZXQgc2lnbmFibGUgcGF5bG9hZCBmb3Igc2ltdWxhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCYXNpY1RyYW5zZmVyQnVpbGRlcigpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIHRydWUpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4LnNpZ25hYmxlUGF5bG9hZCkudGhyb3dFcnJvcignQ2Fubm90IHNpZ24gYSBzaW11bGF0ZSB0eCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSW5wdXQgYW5kIE91dHB1dCBDYWxjdWxhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0b3RhbCBpbnB1dCBhbW91bnQgY29ycmVjdGx5IGZvciBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAgeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJzEwMDAnIH0sXG4gICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdLCBhbW91bnQ6ICcyMDAwJyB9LFxuICAgICAgICB7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1syXSwgYW1vdW50OiAnMzAwMCcgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aFJlY2lwaWVudHMocmVjaXBpZW50cykuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRUb3RhbCA9ICc2MDAwJztcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoZXhwZWN0ZWRUb3RhbCk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=