@bitgo-beta/sdk-coin-iota 1.0.1-beta.26 → 1.0.1-beta.260
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/src/iota.d.ts +13 -2
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +128 -22
- package/dist/src/lib/constants.d.ts +10 -6
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +12 -8
- package/dist/src/lib/iface.d.ts +31 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/transaction.d.ts +66 -5
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +239 -6
- package/dist/src/lib/transactionBuilder.d.ts +70 -9
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +155 -14
- package/dist/src/lib/transactionBuilderFactory.d.ts +15 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +40 -5
- package/dist/src/lib/transferBuilder.d.ts +10 -2
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +45 -3
- package/dist/src/lib/transferTransaction.d.ts +28 -0
- package/dist/src/lib/transferTransaction.d.ts.map +1 -0
- package/dist/src/lib/transferTransaction.js +173 -0
- package/dist/src/lib/utils.d.ts +1 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +20 -4
- package/dist/test/resources/iota.d.ts +23 -0
- package/dist/test/resources/iota.d.ts.map +1 -0
- package/dist/test/resources/iota.js +74 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +16 -0
- package/dist/test/unit/iota.d.ts +2 -0
- package/dist/test/unit/iota.d.ts.map +1 -0
- package/dist/test/unit/iota.js +575 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +135 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +306 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +242 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +288 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +346 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +242 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
|
@@ -0,0 +1,242 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const testData = __importStar(require("../resources/iota"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const utils_1 = __importDefault(require("../../src/lib/utils"));
|
|
42
|
+
const src_1 = require("../../src");
|
|
43
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
44
|
+
describe('Iota util library', function () {
|
|
45
|
+
describe('isValidAddress', function () {
|
|
46
|
+
it('should succeed to validate addresses', function () {
|
|
47
|
+
for (const address of testData.addresses.validAddresses) {
|
|
48
|
+
should_1.default.equal(utils_1.default.isValidAddress(address), true);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it('should fail to validate invalid addresses', function () {
|
|
52
|
+
for (const address of testData.addresses.invalidAddresses) {
|
|
53
|
+
should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(address));
|
|
54
|
+
should_1.default.equal(utils_1.default.isValidAddress(address), false);
|
|
55
|
+
}
|
|
56
|
+
// @ts-expect-error Testing for missing param, should not throw an error
|
|
57
|
+
should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(undefined));
|
|
58
|
+
// @ts-expect-error Testing for missing param, should return false
|
|
59
|
+
should_1.default.equal(utils_1.default.isValidAddress(undefined), false);
|
|
60
|
+
});
|
|
61
|
+
it('should validate addresses with correct length', function () {
|
|
62
|
+
// IOTA addresses are 64 characters hex with 0x prefix
|
|
63
|
+
const validAddress = '0x' + 'a'.repeat(64);
|
|
64
|
+
should_1.default.equal(utils_1.default.isValidAddress(validAddress), true);
|
|
65
|
+
});
|
|
66
|
+
it('should reject addresses with incorrect length', function () {
|
|
67
|
+
const shortAddress = '0x' + 'a'.repeat(32);
|
|
68
|
+
const longAddress = '0x' + 'a'.repeat(128);
|
|
69
|
+
should_1.default.equal(utils_1.default.isValidAddress(shortAddress), false);
|
|
70
|
+
should_1.default.equal(utils_1.default.isValidAddress(longAddress), false);
|
|
71
|
+
});
|
|
72
|
+
it('should reject addresses without 0x prefix', function () {
|
|
73
|
+
const addressWithoutPrefix = 'a'.repeat(64);
|
|
74
|
+
should_1.default.equal(utils_1.default.isValidAddress(addressWithoutPrefix), false);
|
|
75
|
+
});
|
|
76
|
+
it('should reject addresses with non-hex characters', function () {
|
|
77
|
+
const invalidHex = '0x' + 'g'.repeat(64);
|
|
78
|
+
should_1.default.equal(utils_1.default.isValidAddress(invalidHex), false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('isValidPublicKey', function () {
|
|
82
|
+
it('should validate correct public keys', function () {
|
|
83
|
+
// without 0x prefix (64 hex chars)
|
|
84
|
+
should_1.default.equal(true, utils_1.default.isValidPublicKey('b2051899478edeb36a79d1d16dfec56dc3a6ebd29fbbbb4a4ef2dfaf46043355'));
|
|
85
|
+
should_1.default.equal(true, utils_1.default.isValidPublicKey(testData.sender.publicKey));
|
|
86
|
+
});
|
|
87
|
+
it('should reject public keys with 0x prefix', function () {
|
|
88
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey('0x413f7fa8beb54459e1e9ede3af3b12e5a4a3550390bb616da30dd72017701263'));
|
|
89
|
+
});
|
|
90
|
+
it('should reject invalid public keys', function () {
|
|
91
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey('invalid'));
|
|
92
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey(''));
|
|
93
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey('123'));
|
|
94
|
+
});
|
|
95
|
+
it('should reject public keys with incorrect length', function () {
|
|
96
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey('a'.repeat(32))); // Too short
|
|
97
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey('a'.repeat(128))); // Too long
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('isValidPrivateKey', function () {
|
|
101
|
+
it('should validate ed25519 secret keys', function () {
|
|
102
|
+
// Ed25519 secret keys (as used by tweetnacl) are 64 bytes (128 hex chars)
|
|
103
|
+
// This includes the 32-byte seed + 32-byte public key
|
|
104
|
+
const validSecretKey = '0'.repeat(128);
|
|
105
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(validSecretKey), true);
|
|
106
|
+
});
|
|
107
|
+
it('should reject invalid private keys', function () {
|
|
108
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey('invalid'), false);
|
|
109
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(''), false);
|
|
110
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey('123'), false);
|
|
111
|
+
});
|
|
112
|
+
it('should reject private keys with wrong length', function () {
|
|
113
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(32)), false); // Too short (16 bytes)
|
|
114
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(64)), false); // Seed length, not full secret key (32 bytes)
|
|
115
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(256)), false); // Too long (128 bytes)
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('isValidTransactionId', function () {
|
|
119
|
+
it('should validate correct transaction IDs', function () {
|
|
120
|
+
should_1.default.equal(true, utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7bt'));
|
|
121
|
+
});
|
|
122
|
+
it('should reject invalid transaction IDs', function () {
|
|
123
|
+
should_1.default.equal(false, utils_1.default.isValidTransactionId('0xff86b121181a43d03df52e8930785af3dda944ec87654cdba3a378ff518cd75b'));
|
|
124
|
+
should_1.default.equal(false, utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7b53t')); // Wrong length
|
|
125
|
+
});
|
|
126
|
+
it('should reject hex strings', function () {
|
|
127
|
+
should_1.default.equal(false, utils_1.default.isValidTransactionId('0xabcdef123456'));
|
|
128
|
+
});
|
|
129
|
+
it('should reject empty strings', function () {
|
|
130
|
+
should_1.default.equal(false, utils_1.default.isValidTransactionId(''));
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('isValidBlockId', function () {
|
|
134
|
+
it('should validate correct block IDs', function () {
|
|
135
|
+
should_1.default.equal(true, utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAKVrPCQKrPz'));
|
|
136
|
+
});
|
|
137
|
+
it('should reject invalid block IDs', function () {
|
|
138
|
+
should_1.default.equal(false, utils_1.default.isValidBlockId('0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98'));
|
|
139
|
+
should_1.default.equal(false, utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAK56VrPCQKrPz')); // Wrong length
|
|
140
|
+
});
|
|
141
|
+
it('should reject hex strings', function () {
|
|
142
|
+
should_1.default.equal(false, utils_1.default.isValidBlockId('0xabcdef'));
|
|
143
|
+
});
|
|
144
|
+
it('should reject empty strings', function () {
|
|
145
|
+
should_1.default.equal(false, utils_1.default.isValidBlockId(''));
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe('isValidSignature', function () {
|
|
149
|
+
it('should validate correct signatures', function () {
|
|
150
|
+
should_1.default.equal(true, utils_1.default.isValidSignature('iXrcUjgQgpYUsa7O90KZicdTmIdJSjB99+tJW6l6wPCqI/lUTou6sQ2sLoZgC0n4qQKX+vFDz+lBIXl7J/ZgCg=='));
|
|
151
|
+
});
|
|
152
|
+
it('should reject invalid signatures', function () {
|
|
153
|
+
should_1.default.equal(false, utils_1.default.isValidSignature('0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98'));
|
|
154
|
+
should_1.default.equal(false, utils_1.default.isValidSignature('goppBTDgLuBbcU5tP90n3igvZGHmcE23HCoxLfdJwOCcbyztVh9r0TPacJRXmjZ6'));
|
|
155
|
+
});
|
|
156
|
+
it('should reject signatures with incorrect length', function () {
|
|
157
|
+
should_1.default.equal(false, utils_1.default.isValidSignature('dG9vU2hvcnQ=')); // Too short base64
|
|
158
|
+
});
|
|
159
|
+
it('should reject non-base64 strings', function () {
|
|
160
|
+
should_1.default.equal(false, utils_1.default.isValidSignature('not a base64 string!!!'));
|
|
161
|
+
should_1.default.equal(false, utils_1.default.isValidSignature(''));
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('isValidHex', function () {
|
|
165
|
+
it('should validate correct hex strings', function () {
|
|
166
|
+
should_1.default.equal(true, utils_1.default.isValidHex('0xabcdef', 6));
|
|
167
|
+
should_1.default.equal(true, utils_1.default.isValidHex('0x123456', 6));
|
|
168
|
+
should_1.default.equal(true, utils_1.default.isValidHex('0XABCDEF', 6));
|
|
169
|
+
});
|
|
170
|
+
it('should reject hex strings with incorrect length', function () {
|
|
171
|
+
should_1.default.equal(false, utils_1.default.isValidHex('0xabcd', 6));
|
|
172
|
+
should_1.default.equal(false, utils_1.default.isValidHex('0xabcdefgh', 6));
|
|
173
|
+
});
|
|
174
|
+
it('should reject hex strings without prefix', function () {
|
|
175
|
+
should_1.default.equal(false, utils_1.default.isValidHex('abcdef', 6));
|
|
176
|
+
});
|
|
177
|
+
it('should reject hex strings with non-hex characters', function () {
|
|
178
|
+
should_1.default.equal(false, utils_1.default.isValidHex('0xghijkl', 6));
|
|
179
|
+
should_1.default.equal(false, utils_1.default.isValidHex('0xabcdeg', 6));
|
|
180
|
+
});
|
|
181
|
+
it('should handle uppercase and lowercase', function () {
|
|
182
|
+
should_1.default.equal(true, utils_1.default.isValidHex('0xABCDEF', 6));
|
|
183
|
+
should_1.default.equal(true, utils_1.default.isValidHex('0xabcdef', 6));
|
|
184
|
+
should_1.default.equal(true, utils_1.default.isValidHex('0xAbCdEf', 6));
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe('getAddressFromPublicKey', function () {
|
|
188
|
+
it('should generate valid address from public key', function () {
|
|
189
|
+
const address = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
|
|
190
|
+
should_1.default.exist(address);
|
|
191
|
+
should_1.default.equal(utils_1.default.isValidAddress(address), true);
|
|
192
|
+
});
|
|
193
|
+
it('should generate consistent addresses', function () {
|
|
194
|
+
const address1 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
|
|
195
|
+
const address2 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
|
|
196
|
+
should_1.default.equal(address1, address2);
|
|
197
|
+
});
|
|
198
|
+
it('should generate different addresses for different keys', function () {
|
|
199
|
+
const address1 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
|
|
200
|
+
const address2 = utils_1.default.getAddressFromPublicKey(testData.gasSponsor.publicKey);
|
|
201
|
+
should_1.default.notEqual(address1, address2);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('isValidRawTransaction', function () {
|
|
205
|
+
it('should validate proper raw transactions', async function () {
|
|
206
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
|
|
207
|
+
const txBuilder = factory.getTransferBuilder();
|
|
208
|
+
txBuilder.sender(testData.sender.address);
|
|
209
|
+
txBuilder.recipients(testData.recipients);
|
|
210
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
211
|
+
txBuilder.gasData(testData.gasData);
|
|
212
|
+
const tx = await txBuilder.build();
|
|
213
|
+
const rawTx = await tx.toBroadcastFormat();
|
|
214
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
|
|
215
|
+
});
|
|
216
|
+
it('should validate raw transactions as Uint8Array', async function () {
|
|
217
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
|
|
218
|
+
const txBuilder = factory.getTransferBuilder();
|
|
219
|
+
txBuilder.sender(testData.sender.address);
|
|
220
|
+
txBuilder.recipients(testData.recipients);
|
|
221
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
222
|
+
txBuilder.gasData(testData.gasData);
|
|
223
|
+
const tx = await txBuilder.build();
|
|
224
|
+
const rawTx = await tx.toBroadcastFormat();
|
|
225
|
+
const rawTxBytes = Buffer.from(rawTx, 'base64');
|
|
226
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTxBytes), true);
|
|
227
|
+
});
|
|
228
|
+
it('should reject invalid raw transactions', function () {
|
|
229
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction('invalidRawTx'), false);
|
|
230
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction(''), false);
|
|
231
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction('0x123456'), false);
|
|
232
|
+
});
|
|
233
|
+
it('should reject invalid base64 strings', function () {
|
|
234
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction('not-base64!!!'), false);
|
|
235
|
+
});
|
|
236
|
+
it('should reject malformed transaction data', function () {
|
|
237
|
+
const malformedBase64 = Buffer.from('malformed data').toString('base64');
|
|
238
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction(malformedBase64), false);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLGdFQUF3QztBQUN4QyxtQ0FBc0Q7QUFDdEQsaURBQTRDO0FBRTVDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDekQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0Qsd0VBQXdFO1lBQ3hFLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzRCxrRUFBa0U7WUFDbEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxL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LGVBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxFQUFFLENBQUMsK0NBQStDLEVBQUU7WUFDbEQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekUsZ0JB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QUFDLENBQUM7WUFFaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvaW90YSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmRlc2NyaWJlKCdJb3RhIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdGVzdERhdGEuYWRkcmVzc2VzLmludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBtaXNzaW5nIHBhcmFtLCBzaG91bGQgbm90IHRocm93IGFuIGVycm9yXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCkpO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBtaXNzaW5nIHBhcmFtLCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBjb3JyZWN0IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElPVEEgYWRkcmVzc2VzIGFyZSA2NCBjaGFyYWN0ZXJzIGhleCB3aXRoIDB4IHByZWZpeFxuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzID0gJzB4JyArICdhJy5yZXBlYXQoNjQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHZhbGlkQWRkcmVzcyksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzc2VzIHdpdGggaW5jb3JyZWN0IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNob3J0QWRkcmVzcyA9ICcweCcgKyAnYScucmVwZWF0KDMyKTtcbiAgICAgIGNvbnN0IGxvbmdBZGRyZXNzID0gJzB4JyArICdhJy5yZXBlYXQoMTI4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhzaG9ydEFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MobG9uZ0FkZHJlc3MpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhZGRyZXNzZXMgd2l0aG91dCAweCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzV2l0aG91dFByZWZpeCA9ICdhJy5yZXBlYXQoNjQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3NXaXRob3V0UHJlZml4KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzc2VzIHdpdGggbm9uLWhleCBjaGFyYWN0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEhleCA9ICcweCcgKyAnZycucmVwZWF0KDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhpbnZhbGlkSGV4KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB3aXRob3V0IDB4IHByZWZpeCAoNjQgaGV4IGNoYXJzKVxuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJ2IyMDUxODk5NDc4ZWRlYjM2YTc5ZDFkMTZkZmVjNTZkYzNhNmViZDI5ZmJiYmI0YTRlZjJkZmFmNDYwNDMzNTUnKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSh0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBwdWJsaWMga2V5cyB3aXRoIDB4IHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnMHg0MTNmN2ZhOGJlYjU0NDU5ZTFlOWVkZTNhZjNiMTJlNWE0YTM1NTAzOTBiYjYxNmRhMzBkZDcyMDE3NzAxMjYzJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBwdWJsaWMga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnaW52YWxpZCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnJykpO1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCcxMjMnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBwdWJsaWMga2V5cyB3aXRoIGluY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJ2EnLnJlcGVhdCgzMikpKTsgLy8gVG9vIHNob3J0XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJ2EnLnJlcGVhdCgxMjgpKSk7IC8vIFRvbyBsb25nXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkUHJpdmF0ZUtleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGVkMjU1MTkgc2VjcmV0IGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBFZDI1NTE5IHNlY3JldCBrZXlzIChhcyB1c2VkIGJ5IHR3ZWV0bmFjbCkgYXJlIDY0IGJ5dGVzICgxMjggaGV4IGNoYXJzKVxuICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aGUgMzItYnl0ZSBzZWVkICsgMzItYnl0ZSBwdWJsaWMga2V5XG4gICAgICBjb25zdCB2YWxpZFNlY3JldEtleSA9ICcwJy5yZXBlYXQoMTI4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSh2YWxpZFNlY3JldEtleSksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBwcml2YXRlIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoJ2ludmFsaWQnKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCcnKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCcxMjMnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJpdmF0ZSBrZXlzIHdpdGggd3JvbmcgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCdhJy5yZXBlYXQoMzIpKSwgZmFsc2UpOyAvLyBUb28gc2hvcnQgKDE2IGJ5dGVzKVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCdhJy5yZXBlYXQoNjQpKSwgZmFsc2UpOyAvLyBTZWVkIGxlbmd0aCwgbm90IGZ1bGwgc2VjcmV0IGtleSAoMzIgYnl0ZXMpXG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoJ2EnLnJlcGVhdCgyNTYpKSwgZmFsc2UpOyAvLyBUb28gbG9uZyAoMTI4IGJ5dGVzKVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFRyYW5zYWN0aW9uSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHRyYW5zYWN0aW9uIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbCh0cnVlLCB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnQmZ0RWszQmVLVVdUajl1elZHbnRkNEthMTZRWkc4aFVucjZLc0FiN3E3YnQnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIHRyYW5zYWN0aW9uIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKCcweGZmODZiMTIxMTgxYTQzZDAzZGY1MmU4OTMwNzg1YWYzZGRhOTQ0ZWM4NzY1NGNkYmEzYTM3OGZmNTE4Y2Q3NWInKVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSWQoJ0JmdEVrM0JlS1VXVGo5dXpWR250ZDRLYTE2UVpHOGhVbnI2S3NBYjdxN2I1M3QnKSk7IC8vIFdyb25nIGxlbmd0aFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKCcweGFiY2RlZjEyMzQ1NicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKCcnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkQmxvY2tJZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgYmxvY2sgSURzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRCbG9ja0lkKCdHWlhadnZMUzNabnVFNEU5Q3hRSkoyaWo1eGVOc3ZVWGRBS1ZyUENRS3JQeicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYmxvY2sgSURzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkQmxvY2tJZCgnMHg5YWM2YTBjMzEzYzRhMDU2M2ExNjlkYWQyOWYxZDAxODY0NzY4M2JlNTRhMzE0ZWQyMjlhMjY5MzI5M2RmYzk4JykpO1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkQmxvY2tJZCgnR1pYWnZ2TFMzWm51RTRFOUN4UUpKMmlqNXhlTnN2VVhkQUs1NlZyUENRS3JQeicpKTsgLy8gV3JvbmcgbGVuZ3RoXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBoZXggc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEJsb2NrSWQoJzB4YWJjZGVmJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgZW1wdHkgc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEJsb2NrSWQoJycpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRTaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIHRydWUsXG4gICAgICAgIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoXG4gICAgICAgICAgJ2lYcmNVamdRZ3BZVXNhN085MEtaaWNkVG1JZEpTakI5OSt0Slc2bDZ3UENxSS9sVVRvdTZzUTJzTG9aZ0MwbjRxUUtYK3ZGRHorbEJJWGw3Si9aZ0NnPT0nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJzB4OWFjNmEwYzMxM2M0YTA1NjNhMTY5ZGFkMjlmMWQwMTg2NDc2ODNiZTU0YTMxNGVkMjI5YTI2OTMyOTNkZmM5OCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnZ29wcEJURGdMdUJiY1U1dFA5MG4zaWd2WkdIbWNFMjNIQ294TGZkSndPQ2NieXp0Vmg5cjBUUGFjSlJYbWpaNicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHNpZ25hdHVyZXMgd2l0aCBpbmNvcnJlY3QgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkU2lnbmF0dXJlKCdkRzl2VTJodmNuUT0nKSk7IC8vIFRvbyBzaG9ydCBiYXNlNjRcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1iYXNlNjQgc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnbm90IGEgYmFzZTY0IHN0cmluZyEhIScpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgaGV4IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZEhleCgnMHhhYmNkZWYnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZEhleCgnMHgxMjM0NTYnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZEhleCgnMFhBQkNERUYnLCA2KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBoZXggc3RyaW5ncyB3aXRoIGluY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZCcsIDYpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEhleCgnMHhhYmNkZWZnaCcsIDYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGhleCBzdHJpbmdzIHdpdGhvdXQgcHJlZml4JywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkSGV4KCdhYmNkZWYnLCA2KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBoZXggc3RyaW5ncyB3aXRoIG5vbi1oZXggY2hhcmFjdGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEhleCgnMHhnaGlqa2wnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVnJywgNikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZEhleCgnMHhBQkNERUYnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZEhleCgnMHhhYmNkZWYnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZEhleCgnMHhBYkNkRWYnLCA2KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzRnJvbVB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGFkZHJlc3MgZnJvbSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmV4aXN0KGFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29uc2lzdGVudCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzMSA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgY29uc3QgYWRkcmVzczIgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzMSwgYWRkcmVzczIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBkaWZmZXJlbnQgYWRkcmVzc2VzIGZvciBkaWZmZXJlbnQga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MxID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgICBjb25zdCBhZGRyZXNzMiA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLmdhc1Nwb25zb3IucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5ub3RFcXVhbChhZGRyZXNzMSwgYWRkcmVzczIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFJhd1RyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHJvcGVyIHJhdyB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aW90YScpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHJhdyB0cmFuc2FjdGlvbnMgYXMgVWludDhBcnJheScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rpb3RhJykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCByYXdUeEJ5dGVzID0gQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeEJ5dGVzKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKCdpbnZhbGlkUmF3VHgnKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbignJyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24oJzB4MTIzNDU2JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYmFzZTY0IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKCdub3QtYmFzZTY0ISEhJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG1hbGZvcm1lZCB0cmFuc2FjdGlvbiBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWFsZm9ybWVkQmFzZTY0ID0gQnVmZmVyLmZyb20oJ21hbGZvcm1lZCBkYXRhJykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihtYWxmb3JtZWRCYXNlNjQpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|