@bitgo/sdk-coin-iota 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) 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 +219 -99
  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 +143 -3
  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 +124 -15
  14. package/dist/src/lib/transaction.d.ts.map +1 -1
  15. package/dist/src/lib/transaction.js +215 -66
  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 +108 -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 +108 -8
  29. package/dist/src/lib/utils.d.ts.map +1 -1
  30. package/dist/src/lib/utils.js +140 -21
  31. package/dist/test/resources/iota.d.ts +12 -0
  32. package/dist/test/resources/iota.d.ts.map +1 -1
  33. package/dist/test/resources/iota.js +21 -2
  34. package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
  35. package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
  36. package/dist/test/unit/helpers/testHelpers.js +176 -0
  37. package/dist/test/unit/iota.js +81 -158
  38. package/dist/test/unit/keyPair.js +34 -61
  39. package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
  40. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -107
  41. package/dist/test/unit/transactionBuilder/transferBuilder.js +361 -234
  42. package/dist/test/unit/transferTransaction.js +147 -275
  43. package/dist/test/unit/utils.js +177 -167
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +6 -6
@@ -40,6 +40,7 @@ const should_1 = __importDefault(require("should"));
40
40
  const statics_1 = require("@bitgo/statics");
41
41
  const src_1 = require("../../../src");
42
42
  const testData = __importStar(require("../../resources/iota"));
43
+ const testHelpers_1 = require("../helpers/testHelpers");
43
44
  describe('Iota Transaction Builder Factory', () => {
44
45
  const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
45
46
  describe('getTransferBuilder', () => {
@@ -49,11 +50,7 @@ describe('Iota Transaction Builder Factory', () => {
49
50
  (0, should_1.default)(builder instanceof src_1.TransferBuilder).be.true();
50
51
  });
51
52
  it('should create a transfer builder with existing transaction', async function () {
52
- const txBuilder = factory.getTransferBuilder();
53
- txBuilder.sender(testData.sender.address);
54
- txBuilder.recipients(testData.recipients);
55
- txBuilder.paymentObjects(testData.paymentObjects);
56
- txBuilder.gasData(testData.gasData);
53
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
57
54
  const tx = (await txBuilder.build());
58
55
  const newBuilder = factory.getTransferBuilder(tx);
59
56
  should_1.default.exist(newBuilder);
@@ -64,44 +61,33 @@ describe('Iota Transaction Builder Factory', () => {
64
61
  });
65
62
  });
66
63
  describe('from', () => {
67
- it('should create builder from raw transaction data', async function () {
68
- const txBuilder = factory.getTransferBuilder();
69
- txBuilder.sender(testData.sender.address);
70
- txBuilder.recipients(testData.recipients);
71
- txBuilder.paymentObjects(testData.paymentObjects);
72
- txBuilder.gasData(testData.gasData);
73
- const tx = (await txBuilder.build());
74
- const rawTx = await tx.toBroadcastFormat();
75
- const rebuiltBuilder = factory.from(rawTx);
76
- should_1.default.exist(rebuiltBuilder);
77
- (0, should_1.default)(rebuiltBuilder instanceof src_1.TransferBuilder).be.true();
78
- const rebuiltTx = (await rebuiltBuilder.build());
79
- rebuiltTx.sender.should.equal(testData.sender.address);
80
- rebuiltTx.recipients.length.should.equal(testData.recipients.length);
81
- rebuiltTx.recipients[0].address.should.equal(testData.recipients[0].address);
82
- rebuiltTx.recipients[0].amount.should.equal(testData.recipients[0].amount);
83
- should_1.default.exist(rebuiltTx.paymentObjects);
84
- rebuiltTx.paymentObjects?.length.should.equal(testData.paymentObjects.length);
85
- });
86
- it('should handle Uint8Array format', async function () {
87
- const txBuilder = factory.getTransferBuilder();
88
- txBuilder.sender(testData.sender.address);
89
- txBuilder.recipients(testData.recipients);
90
- txBuilder.paymentObjects(testData.paymentObjects);
91
- txBuilder.gasData(testData.gasData);
92
- const tx = (await txBuilder.build());
93
- const rawTx = await tx.toBroadcastFormat();
94
- const rawTxBytes = Buffer.from(rawTx, 'base64');
95
- const rebuiltBuilder = factory.from(rawTxBytes);
96
- should_1.default.exist(rebuiltBuilder);
97
- (0, should_1.default)(rebuiltBuilder instanceof src_1.TransferBuilder).be.true();
98
- const rebuiltTx = (await rebuiltBuilder.build());
99
- rebuiltTx.sender.should.equal(testData.sender.address);
100
- rebuiltTx.recipients.length.should.equal(testData.recipients.length);
101
- rebuiltTx.recipients[0].address.should.equal(testData.recipients[0].address);
102
- rebuiltTx.recipients[0].amount.should.equal(testData.recipients[0].amount);
103
- should_1.default.exist(rebuiltTx.paymentObjects);
104
- rebuiltTx.paymentObjects?.length.should.equal(testData.paymentObjects.length);
64
+ const formats = [
65
+ {
66
+ name: 'hex string',
67
+ convert: (rawTx) => Buffer.from(rawTx, 'base64').toString('hex'),
68
+ },
69
+ {
70
+ name: 'Uint8Array',
71
+ convert: (rawTx) => Buffer.from(rawTx, 'base64'),
72
+ },
73
+ ];
74
+ formats.forEach(({ name, convert }) => {
75
+ it(`should create builder from raw transaction in ${name} format`, async function () {
76
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
77
+ const tx = (await txBuilder.build());
78
+ const rawTx = await tx.toBroadcastFormat();
79
+ const convertedTx = convert(rawTx);
80
+ const rebuiltBuilder = factory.from(convertedTx);
81
+ should_1.default.exist(rebuiltBuilder);
82
+ (0, should_1.default)(rebuiltBuilder instanceof src_1.TransferBuilder).be.true();
83
+ const rebuiltTx = (await rebuiltBuilder.build());
84
+ rebuiltTx.sender.should.equal(testData.sender.address);
85
+ rebuiltTx.recipients.length.should.equal(testData.recipients.length);
86
+ rebuiltTx.recipients[0].address.should.equal(testData.recipients[0].address);
87
+ rebuiltTx.recipients[0].amount.should.equal(testData.recipients[0].amount);
88
+ should_1.default.exist(rebuiltTx.paymentObjects);
89
+ rebuiltTx.paymentObjects?.length.should.equal(testData.paymentObjects.length);
90
+ });
105
91
  });
106
92
  });
107
93
  describe('Error Handling', () => {
@@ -122,15 +108,10 @@ describe('Iota Transaction Builder Factory', () => {
122
108
  });
123
109
  });
124
110
  describe('Transaction Rebuilding and Modification', () => {
125
- it('should allow creating transactions with modifications', async function () {
126
- const txBuilder = factory.getTransferBuilder();
127
- txBuilder.sender(testData.sender.address);
128
- txBuilder.recipients(testData.recipients);
129
- txBuilder.paymentObjects(testData.paymentObjects);
130
- txBuilder.gasData(testData.gasData);
111
+ it('should allow creating transactions with modified gas budget', async function () {
112
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
131
113
  const tx = (await txBuilder.build());
132
114
  should_1.default.equal(tx.gasBudget, testData.GAS_BUDGET);
133
- // Create a new builder with modified gas budget
134
115
  const modifiedBuilder = factory.getTransferBuilder();
135
116
  modifiedBuilder.sender(testData.sender.address);
136
117
  modifiedBuilder.recipients(testData.recipients);
@@ -143,53 +124,25 @@ describe('Iota Transaction Builder Factory', () => {
143
124
  const modifiedTx = (await modifiedBuilder.build());
144
125
  should_1.default.equal(modifiedTx.gasBudget, testData.GAS_BUDGET * 2);
145
126
  });
146
- it('should allow adding gas sponsor to transaction', async function () {
147
- const txBuilder = factory.getTransferBuilder();
148
- txBuilder.sender(testData.sender.address);
149
- txBuilder.recipients(testData.recipients);
150
- txBuilder.paymentObjects(testData.paymentObjects);
151
- txBuilder.gasData(testData.gasData);
127
+ it('should build transaction with gas sponsor', async function () {
128
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
152
129
  txBuilder.gasSponsor(testData.gasSponsor.address);
153
130
  const tx = (await txBuilder.build());
131
+ should_1.default.equal(tx.sender, testData.sender.address);
154
132
  should_1.default.equal(tx.gasSponsor, testData.gasSponsor.address);
133
+ should_1.default.notEqual(tx.sender, tx.gasSponsor);
155
134
  });
156
135
  it('should maintain transaction ID for identical transactions', async function () {
157
- const txBuilder1 = factory.getTransferBuilder();
158
- txBuilder1.sender(testData.sender.address);
159
- txBuilder1.recipients(testData.recipients);
160
- txBuilder1.paymentObjects(testData.paymentObjects);
161
- txBuilder1.gasData(testData.gasData);
136
+ const txBuilder1 = (0, testHelpers_1.createTransferBuilderWithGas)();
162
137
  const tx1 = (await txBuilder1.build());
163
- const id1 = tx1.id;
164
- const txBuilder2 = factory.getTransferBuilder();
165
- txBuilder2.sender(testData.sender.address);
166
- txBuilder2.recipients(testData.recipients);
167
- txBuilder2.paymentObjects(testData.paymentObjects);
168
- txBuilder2.gasData(testData.gasData);
138
+ const txBuilder2 = (0, testHelpers_1.createTransferBuilderWithGas)();
169
139
  const tx2 = (await txBuilder2.build());
170
- const id2 = tx2.id;
171
- should_1.default.equal(id1, id2);
172
- });
173
- it('should correctly build transaction with gas sponsor', async function () {
174
- const txBuilder = factory.getTransferBuilder();
175
- txBuilder.sender(testData.sender.address);
176
- txBuilder.recipients(testData.recipients);
177
- txBuilder.paymentObjects(testData.paymentObjects);
178
- txBuilder.gasData(testData.gasData);
179
- txBuilder.gasSponsor(testData.gasSponsor.address);
180
- const tx = (await txBuilder.build());
181
- should_1.default.equal(tx.sender, testData.sender.address);
182
- should_1.default.equal(tx.gasSponsor, testData.gasSponsor.address);
183
- should_1.default.notEqual(tx.sender, tx.gasSponsor);
140
+ should_1.default.equal(tx1.id, tx2.id);
184
141
  });
185
142
  });
186
143
  describe('Builder Initialization', () => {
187
144
  it('should initialize builder with transaction correctly', async function () {
188
- const originalBuilder = factory.getTransferBuilder();
189
- originalBuilder.sender(testData.sender.address);
190
- originalBuilder.recipients(testData.recipients);
191
- originalBuilder.paymentObjects(testData.paymentObjects);
192
- originalBuilder.gasData(testData.gasData);
145
+ const originalBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
193
146
  const originalTx = (await originalBuilder.build());
194
147
  const newBuilder = factory.getTransferBuilder(originalTx);
195
148
  const newTx = (await newBuilder.build());
@@ -198,19 +151,10 @@ describe('Iota Transaction Builder Factory', () => {
198
151
  should_1.default.equal(newTx.gasBudget, originalTx.gasBudget);
199
152
  should_1.default.equal(newTx.gasPrice, originalTx.gasPrice);
200
153
  });
201
- it('should allow creating builder without initial transaction', function () {
202
- const builder = factory.getTransferBuilder();
203
- should_1.default.exist(builder);
204
- (0, should_1.default)(builder instanceof src_1.TransferBuilder).be.true();
205
- });
206
154
  });
207
155
  describe('Round Trip Conversion', () => {
208
156
  it('should handle JSON round trip', async function () {
209
- const originalBuilder = factory.getTransferBuilder();
210
- originalBuilder.sender(testData.sender.address);
211
- originalBuilder.recipients(testData.recipients);
212
- originalBuilder.paymentObjects(testData.paymentObjects);
213
- originalBuilder.gasData(testData.gasData);
157
+ const originalBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
214
158
  const originalTx = (await originalBuilder.build());
215
159
  const json = originalTx.toJson();
216
160
  const newTx = new src_1.TransferTransaction(statics_1.coins.get('tiota'));
@@ -221,22 +165,14 @@ describe('Iota Transaction Builder Factory', () => {
221
165
  should_1.default.deepEqual(rebuiltTx.recipients, originalTx.recipients);
222
166
  });
223
167
  it('should serialize to consistent format', async function () {
224
- const builder1 = factory.getTransferBuilder();
225
- builder1.sender(testData.sender.address);
226
- builder1.recipients(testData.recipients);
227
- builder1.paymentObjects(testData.paymentObjects);
228
- builder1.gasData(testData.gasData);
168
+ const builder1 = (0, testHelpers_1.createTransferBuilderWithGas)();
229
169
  const tx1 = (await builder1.build());
230
170
  const serialized1 = await tx1.toBroadcastFormat();
231
- const builder2 = factory.getTransferBuilder();
232
- builder2.sender(testData.sender.address);
233
- builder2.recipients(testData.recipients);
234
- builder2.paymentObjects(testData.paymentObjects);
235
- builder2.gasData(testData.gasData);
171
+ const builder2 = (0, testHelpers_1.createTransferBuilderWithGas)();
236
172
  const tx2 = (await builder2.build());
237
173
  const serialized2 = await tx2.toBroadcastFormat();
238
174
  should_1.default.equal(serialized1, serialized2);
239
175
  });
240
176
  });
241
177
  });
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw0Q0FBdUM7QUFDdkMsc0NBQStGO0FBQy9GLCtEQUFpRDtBQUVqRCxRQUFRLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO0lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWxFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLElBQUEsZ0JBQU0sRUFBQyxPQUFPLFlBQVkscUJBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLO1lBQ3BFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRCxTQUFTLENBQUMsT0FBTyxDQUFDLFFB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O1lBQ2pELFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUVsRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbkMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUM1RCxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRWxELGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zZmVyQnVpbGRlciwgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW90YSc7XG5cbmRlc2NyaWJlKCdJb3RhIFRyYW5zYWN0aW9uIEJ1aWxkZXIgRmFjdG9yeScsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGlvdGEnKSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zZmVyQnVpbGRlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIHRyYW5zZmVyIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZC5leGlzdChidWlsZGVyKTtcbiAgICAgIHNob3VsZChidWlsZGVyIGluc3RhbmNlb2YgVHJhbnNmZXJCdWlsZGVyKS5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIHRyYW5zZmVyIGJ1aWxkZXIgd2l0aCBleGlzdGluZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKHR4KTtcbiAgICAgIHNob3VsZC5leGlzdChuZXdCdWlsZGVyKTtcbiAgICAgIHNob3VsZChuZXdCdWlsZGVyIGluc3RhbmNlb2YgVHJhbnNmZXJCdWlsZGVyKS5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCBuZXdCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4LnJlY2lwaWVudHMsIHR4LnJlY2lwaWVudHMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBidWlsZGVyIGZyb20gcmF3IHRyYW5zYWN0aW9uIGRhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0QnVpbGRlcik7XG4gICAgICBzaG91bGQocmVidWlsdEJ1aWxkZXIgaW5zdGFuY2VvZiBUcmFuc2ZlckJ1aWxkZXIpLmJlLnRydWUoKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgcmVidWlsdFR4LnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgcmVidWlsdFR4LnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICByZWJ1aWx0VHgucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgcmVidWlsdFR4LnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXhpc3QocmVidWlsdFR4LnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHJlYnVpbHRUeC5wYXltZW50T2JqZWN0cz8ubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cy5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgVWludDhBcnJheSBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCByYXdUeEJ5dGVzID0gQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKTtcblxuICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHhCeXRlcyk7XG4gICAgICBzaG91bGQuZXhpc3QocmVidWlsdEJ1aWxkZXIpO1xuICAgICAgc2hvdWxkKHJlYnVpbHRCdWlsZGVyIGluc3RhbmNlb2YgVHJhbnNmZXJCdWlsZGVyKS5iZS50cnVlKCk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHJlYnVpbHRUeC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHJlYnVpbHRUeC5yZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50cy5sZW5ndGgpO1xuICAgICAgcmVidWlsdFR4LnJlY2lwaWVudHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgIHJlYnVpbHRUeC5yZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQpO1xuICAgICAgc2hvdWxkLmV4aXN0KHJlYnVpbHRUeC5wYXltZW50T2JqZWN0cyk7XG4gICAgICByZWJ1aWx0VHgucGF5bWVudE9iamVjdHM/Lmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucGF5bWVudE9iamVjdHMubGVuZ3RoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Vycm9yIEhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkKCgpID0+IGZhY3RvcnkuZnJvbSgnaW52YWxpZC1yYXctdHJhbnNhY3Rpb24nKSkudGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgZW1wdHkgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkKCgpID0+IGZhY3RvcnkuZnJvbSgnJykpLnRocm93RXJyb3IoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGlzIHdvdWxkIHJlcXVpcmUgY3JlYXRpbmcgYSB0cmFuc2FjdGlvbiB3aXRoIHVuc3VwcG9ydGVkIGNvbW1hbmRzXG4gICAgICAvLyBGb3Igbm93LCB3ZSB0ZXN0IHRoYXQgaW52YWxpZCBkYXRhIHRocm93cyBhbiBlcnJvclxuICAgICAgY29uc3QgaW52YWxpZERhdGEgPSBCdWZmZXIuZnJvbSgnbm90LWEtdmFsaWQtdHJhbnNhY3Rpb24nKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKGludmFsaWREYXRhKSkudGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlciBpcyBjYWxsZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKSkudGhyb3dFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFJlYnVpbGRpbmcgYW5kIE1vZGlmaWNhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IGNyZWF0aW5nIHRyYW5zYWN0aW9ucyB3aXRoIG1vZGlmaWNhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJ1aWxkZXIgd2l0aCBtb2RpZmllZCBnYXMgYnVkZ2V0XG4gICAgICBjb25zdCBtb2RpZmllZEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgbW9kaWZpZWRCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBtb2RpZmllZEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIG1vZGlmaWVkQnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICBtb2RpZmllZEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgIGdhc0J1ZGdldDogdGVzdERhdGEuR0FTX0JVREdFVCAqIDIsXG4gICAgICAgIGdhc1ByaWNlOiB0ZXN0RGF0YS5HQVNfUFJJQ0UsXG4gICAgICAgIGdhc1BheW1lbnRPYmplY3RzOiB0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0cyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2RpZmllZFR4ID0gKGF3YWl0IG1vZGlmaWVkQnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKG1vZGlmaWVkVHguZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUICogMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGFkZGluZyBnYXMgc3BvbnNvciB0byB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzU3BvbnNvciwgdGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gdHJhbnNhY3Rpb24gSUQgZm9yIGlkZW50aWNhbCB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIxID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcjEuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcjEucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlcjEucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyMS5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eDEgPSAoYXdhaXQgdHhCdWlsZGVyMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgaWQxID0gdHgxLmlkO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcjIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcjIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlcjIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyMi5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eDIgPSAoYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgaWQyID0gdHgyLmlkO1xuXG4gICAgICBzaG91bGQuZXF1YWwoaWQxLCBpZDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBnYXMgc3BvbnNvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLm5vdEVxdWFsKHR4LnNlbmRlciwgdHguZ2FzU3BvbnNvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZGVyIEluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSBidWlsZGVyIHdpdGggdHJhbnNhY3Rpb24gY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBvcmlnaW5hbEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSAoYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcihvcmlnaW5hbFR4KTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gKGF3YWl0IG5ld0J1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKG5ld1R4LnNlbmRlciwgb3JpZ2luYWxUeC5zZW5kZXIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChuZXdUeC5yZWNpcGllbnRzLCBvcmlnaW5hbFR4LnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld1R4Lmdhc0J1ZGdldCwgb3JpZ2luYWxUeC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld1R4Lmdhc1ByaWNlLCBvcmlnaW5hbFR4Lmdhc1ByaWNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgY3JlYXRpbmcgYnVpbGRlciB3aXRob3V0IGluaXRpYWwgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZC5leGlzdChidWlsZGVyKTtcbiAgICAgIHNob3VsZChidWlsZGVyIGluc3RhbmNlb2YgVHJhbnNmZXJCdWlsZGVyKS5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSb3VuZCBUcmlwIENvbnZlcnNpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgSlNPTiByb3VuZCB0cmlwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBvcmlnaW5hbEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSAoYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBqc29uID0gb3JpZ2luYWxUeC50b0pzb24oKTtcblxuICAgICAgY29uc3QgbmV3VHggPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3Rpb3RhJykpO1xuICAgICAgbmV3VHgucGFyc2VGcm9tSlNPTihqc29uKTtcbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcihuZXdUeCk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgbmV3QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgb3JpZ2luYWxUeC5zZW5kZXIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZWJ1aWx0VHgucmVjaXBpZW50cywgb3JpZ2luYWxUeC5yZWNpcGllbnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIHRvIGNvbnNpc3RlbnQgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlcjEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlcjEuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIxLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBidWlsZGVyMS5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICBidWlsZGVyMS5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eDEgPSAoYXdhaXQgYnVpbGRlcjEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQxID0gYXdhaXQgdHgxLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyMi5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgYnVpbGRlcjIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlcjIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkMiA9IGF3YWl0IHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoc2VyaWFsaXplZDEsIHNlcmlhbGl6ZWQyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw0Q0FBdUM7QUFDdkMsc0NBQStGO0FBQy9GLCtEQUFpRDtBQUNqRCx3REFBc0U7QUFFdEUsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtJQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVsRSxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFBLGdCQUFNLEVBQUMsT0FBTyxZQUFZLHFCQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSztZQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFBLDBDQUE0QixHQUFFLENBQUM7WUFDakQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUU1RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekIsSUFBQSxnQkFBTSxFQUFD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Qy9DLE1BQU0sUUFBUSxHQUFHLElBQUEsMENBQTRCLEdBQUUsQ0FBQztZQUNoRCxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQzVELE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFbEQsTUFBTSxRQUFRLEdBQUcsSUFBQSwwQ0FBNEIsR0FBRSxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUVsRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2ZlckJ1aWxkZXIsIFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2lvdGEnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcyB9IGZyb20gJy4uL2hlbHBlcnMvdGVzdEhlbHBlcnMnO1xuXG5kZXNjcmliZSgnSW90YSBUcmFuc2FjdGlvbiBCdWlsZGVyIEZhY3RvcnknLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rpb3RhJykpO1xuXG4gIGRlc2NyaWJlKCdnZXRUcmFuc2ZlckJ1aWxkZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSB0cmFuc2ZlciBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQuZXhpc3QoYnVpbGRlcik7XG4gICAgICBzaG91bGQoYnVpbGRlciBpbnN0YW5jZW9mIFRyYW5zZmVyQnVpbGRlcikuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSB0cmFuc2ZlciBidWlsZGVyIHdpdGggZXhpc3RpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKHR4KTtcbiAgICAgIHNob3VsZC5leGlzdChuZXdCdWlsZGVyKTtcbiAgICAgIHNob3VsZChuZXdCdWlsZGVyIGluc3RhbmNlb2YgVHJhbnNmZXJCdWlsZGVyKS5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCBuZXdCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4LnJlY2lwaWVudHMsIHR4LnJlY2lwaWVudHMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbScsICgpID0+IHtcbiAgICBjb25zdCBmb3JtYXRzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnaGV4IHN0cmluZycsXG4gICAgICAgIGNvbnZlcnQ6IChyYXdUeDogc3RyaW5nKSA9PiBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdVaW50OEFycmF5JyxcbiAgICAgICAgY29udmVydDogKHJhd1R4OiBzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0JyksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBmb3JtYXRzLmZvckVhY2goKHsgbmFtZSwgY29udmVydCB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIGNyZWF0ZSBidWlsZGVyIGZyb20gcmF3IHRyYW5zYWN0aW9uIGluICR7bmFtZX0gZm9ybWF0YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFR4ID0gY29udmVydChyYXdUeCk7XG5cbiAgICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oY29udmVydGVkVHgpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVidWlsdEJ1aWxkZXIpO1xuICAgICAgICBzaG91bGQocmVidWlsdEJ1aWxkZXIgaW5zdGFuY2VvZiBUcmFuc2ZlckJ1aWxkZXIpLmJlLnRydWUoKTtcblxuICAgICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgcmVidWlsdFR4LnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICByZWJ1aWx0VHgucmVjaXBpZW50cy5sZW5ndGguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJlY2lwaWVudHMubGVuZ3RoKTtcbiAgICAgICAgcmVidWlsdFR4LnJlY2lwaWVudHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgICAgcmVidWlsdFR4LnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHgucGF5bWVudE9iamVjdHMpO1xuICAgICAgICByZWJ1aWx0VHgucGF5bWVudE9iamVjdHM/Lmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucGF5bWVudE9iamVjdHMubGVuZ3RoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXJyb3IgSGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKCdpbnZhbGlkLXJhdy10cmFuc2FjdGlvbicpKS50aHJvd0Vycm9yKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBlbXB0eSByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKCcnKSkudGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgd291bGQgcmVxdWlyZSBjcmVhdGluZyBhIHRyYW5zYWN0aW9uIHdpdGggdW5zdXBwb3J0ZWQgY29tbWFuZHNcbiAgICAgIC8vIEZvciBub3csIHdlIHRlc3QgdGhhdCBpbnZhbGlkIGRhdGEgdGhyb3dzIGFuIGVycm9yXG4gICAgICBjb25zdCBpbnZhbGlkRGF0YSA9IEJ1ZmZlci5mcm9tKCdub3QtYS12YWxpZC10cmFuc2FjdGlvbicpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHNob3VsZCgoKSA9PiBmYWN0b3J5LmZyb20oaW52YWxpZERhdGEpKS50aHJvd0Vycm9yKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyIGlzIGNhbGxlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZCgoKSA9PiBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpKS50aHJvd0Vycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gUmVidWlsZGluZyBhbmQgTW9kaWZpY2F0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWxsb3cgY3JlYXRpbmcgdHJhbnNhY3Rpb25zIHdpdGggbW9kaWZpZWQgZ2FzIGJ1ZGdldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc0J1ZGdldCwgdGVzdERhdGEuR0FTX0JVREdFVCk7XG5cbiAgICAgIGNvbnN0IG1vZGlmaWVkQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBtb2RpZmllZEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIG1vZGlmaWVkQnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgbW9kaWZpZWRCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIG1vZGlmaWVkQnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgZ2FzQnVkZ2V0OiB0ZXN0RGF0YS5HQVNfQlVER0VUICogMixcbiAgICAgICAgZ2FzUHJpY2U6IHRlc3REYXRhLkdBU19QUklDRSxcbiAgICAgICAgZ2FzUGF5bWVudE9iamVjdHM6IHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vZGlmaWVkVHggPSAoYXdhaXQgbW9kaWZpZWRCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwobW9kaWZpZWRUeC5nYXNCdWRnZXQsIHRlc3REYXRhLkdBU19CVURHRVQgKiAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBnYXMgc3BvbnNvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1Nwb25zb3IsIHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG4gICAgICBzaG91bGQubm90RXF1YWwodHguc2VuZGVyLCB0eC5nYXNTcG9uc29yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gdHJhbnNhY3Rpb24gSUQgZm9yIGlkZW50aWNhbCB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIxID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgY29uc3QgdHgxID0gKGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eDEuaWQsIHR4Mi5pZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZGVyIEluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSBidWlsZGVyIHdpdGggdHJhbnNhY3Rpb24gY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxUeCA9IChhd2FpdCBvcmlnaW5hbEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKG9yaWdpbmFsVHgpO1xuICAgICAgY29uc3QgbmV3VHggPSAoYXdhaXQgbmV3QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwobmV3VHguc2VuZGVyLCBvcmlnaW5hbFR4LnNlbmRlcik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKG5ld1R4LnJlY2lwaWVudHMsIG9yaWdpbmFsVHgucmVjaXBpZW50cyk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHguZ2FzQnVkZ2V0LCBvcmlnaW5hbFR4Lmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHguZ2FzUHJpY2UsIG9yaWdpbmFsVHguZ2FzUHJpY2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUm91bmQgVHJpcCBDb252ZXJzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIEpTT04gcm91bmQgdHJpcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSAoYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBqc29uID0gb3JpZ2luYWxUeC50b0pzb24oKTtcblxuICAgICAgY29uc3QgbmV3VHggPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3Rpb3RhJykpO1xuICAgICAgbmV3VHgucGFyc2VGcm9tSlNPTihqc29uKTtcbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcihuZXdUeCk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgbmV3QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgb3JpZ2luYWxUeC5zZW5kZXIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZWJ1aWx0VHgucmVjaXBpZW50cywgb3JpZ2luYWxUeC5yZWNpcGllbnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIHRvIGNvbnNpc3RlbnQgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlcjEgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICBjb25zdCB0eDEgPSAoYXdhaXQgYnVpbGRlcjEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQxID0gYXdhaXQgdHgxLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkMiA9IGF3YWl0IHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoc2VyaWFsaXplZDEsIHNlcmlhbGl6ZWQyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==