@bitgo-beta/sdk-core 8.2.1-beta.2095 → 8.2.1-beta.2096
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/dist/src/bitgo/errors.d.ts +6 -0
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +11 -2
- package/dist/src/bitgo/keychain/iKeychains.d.ts +20 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +31 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +14 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +53 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +1 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +42 -70
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -21
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +2 -13
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +1 -0
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +1 -1
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +23 -9
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +199 -5
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +192 -23
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +180 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/LICENSE +0 -191
|
@@ -166,29 +166,198 @@ describe('EdDSA MPCv2 VRF root material', function () {
|
|
|
166
166
|
assert_1.default.strictEqual(addedKeychains[0].safeId, 'safe-id');
|
|
167
167
|
assert_1.default.strictEqual(addedKeychains[0].encryptedPrv, undefined);
|
|
168
168
|
});
|
|
169
|
-
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
169
|
+
describe('safe root keygen against the HSM contract', function () {
|
|
170
|
+
const KeyGenRequest = t.intersection([
|
|
171
|
+
t.type({ enterprise: t.string, type: t.string, curveType: t.string, round: t.string }),
|
|
172
|
+
t.partial({ safeId: t.string, payload: t.UnknownRecord }),
|
|
173
|
+
]);
|
|
174
|
+
const R1Payload = t.intersection([
|
|
175
|
+
t.type({
|
|
176
|
+
userGpgPublicKey: t.string,
|
|
177
|
+
backupGpgPublicKey: t.string,
|
|
178
|
+
userMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
179
|
+
backupMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
180
|
+
}),
|
|
181
|
+
t.type({
|
|
182
|
+
userVrfMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
183
|
+
backupVrfMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
184
|
+
}),
|
|
185
|
+
]);
|
|
186
|
+
const R2Payload = t.intersection([
|
|
187
|
+
t.type({ sessionId: t.string, userMsg2: public_types_1.EddsaMPCv2SignedMessage, backupMsg2: public_types_1.EddsaMPCv2SignedMessage }),
|
|
188
|
+
t.type({
|
|
189
|
+
userVrfMsg2: public_types_1.EddsaMPCv2SignedMessage,
|
|
190
|
+
backupVrfMsg2: public_types_1.EddsaMPCv2SignedMessage,
|
|
191
|
+
}),
|
|
192
|
+
]);
|
|
193
|
+
let bitgoPrivateKey;
|
|
194
|
+
let bitgoPublicKey;
|
|
195
|
+
before(async function () {
|
|
196
|
+
const bitgoGpg = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
197
|
+
bitgoPrivateKey = await pgp.readPrivateKey({ armoredKey: bitgoGpg.privateKey });
|
|
198
|
+
bitgoPublicKey = await pgp.readKey({ armoredKey: bitgoGpg.publicKey });
|
|
199
|
+
});
|
|
200
|
+
afterEach(function () {
|
|
201
|
+
sinon.restore();
|
|
202
|
+
});
|
|
203
|
+
/** BitGo's side of the ceremony: signing DKG + VRF DKG, verifying every client signature like the HSM does. */
|
|
204
|
+
async function keygenWithHsmPeer(fault) {
|
|
205
|
+
const { bitgo, baseCoin, post, encryptedInputs, addedKeychains } = createKeychainFixture();
|
|
206
|
+
const utils = new eddsaVrfMPCv2_1.EddsaVrfMPCv2Utils(bitgo, baseCoin);
|
|
207
|
+
sinon.stub(utils, 'getBitgoGpgPubkeyBasedOnFeatureFlags').resolves({
|
|
208
|
+
mpcv2PublicKey: bitgoPublicKey,
|
|
209
|
+
eddsaMpcv2PublicKey: bitgoPublicKey,
|
|
210
|
+
redpallasMpcv2PublicKey: undefined,
|
|
211
|
+
});
|
|
212
|
+
const bitgoDkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
213
|
+
const bitgoVrf = new sdk_lib_mpc_1.MpsVrf.VrfDkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
214
|
+
const requests = [];
|
|
215
|
+
let bitgoMsg2;
|
|
216
|
+
let userGpgKey;
|
|
217
|
+
let backupGpgKey;
|
|
218
|
+
let userCommitment;
|
|
219
|
+
let backupCommitment;
|
|
220
|
+
const signAsBitgo = (payload) => sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(payload, bitgoPrivateKey);
|
|
221
|
+
const encryptTo = async (recipient, plaintext) => {
|
|
222
|
+
const { signature } = await signAsBitgo(plaintext);
|
|
223
|
+
const message = await pgp.encrypt({
|
|
224
|
+
message: await pgp.createMessage({ binary: plaintext }),
|
|
225
|
+
encryptionKeys: recipient,
|
|
226
|
+
format: 'armored',
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
message,
|
|
230
|
+
signature: fault === 'bitgo-vrf-opening-signature' ? (await signAsBitgo(new Uint8Array([9]))).signature : signature,
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
post.callsFake(() => ({
|
|
234
|
+
send: (rawBody) => ({
|
|
235
|
+
result: async () => {
|
|
236
|
+
const body = (0, codecs_1.decodeWithCodec)(KeyGenRequest, rawBody, 'EdDSA keygen request');
|
|
237
|
+
assert_1.default.strictEqual(body.type, public_types_1.KeyGenTypeEnum.MPCv2);
|
|
238
|
+
assert_1.default.strictEqual(body.curveType, public_types_1.KeyCurveEnum.EdDSA);
|
|
239
|
+
// WP only reads safeId in round 1; round 2 is routed by the stored session.
|
|
240
|
+
assert_1.default.strictEqual(body.safeId, body.round === public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'] ? 'safe-id' : undefined);
|
|
241
|
+
requests.push({ round: body.round, ...body.payload });
|
|
242
|
+
if (body.round === public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1']) {
|
|
243
|
+
const payload = (0, codecs_1.decodeWithCodec)(R1Payload, body.payload, 'EdDSA keygen round 1');
|
|
244
|
+
userGpgKey = await pgp.readKey({ armoredKey: payload.userGpgPublicKey });
|
|
245
|
+
backupGpgKey = await pgp.readKey({ armoredKey: payload.backupGpgPublicKey });
|
|
246
|
+
const [userPk, backupPk] = await Promise.all([
|
|
247
|
+
sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(userGpgKey),
|
|
248
|
+
sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(backupGpgKey),
|
|
249
|
+
]);
|
|
250
|
+
const [, bitgoSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(bitgoPrivateKey);
|
|
251
|
+
const userMsg1 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userMsg1, userGpgKey);
|
|
252
|
+
const backupMsg1 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupMsg1, backupGpgKey);
|
|
253
|
+
// The VRF messages must be signed by the same party key as userMsg1/backupMsg1.
|
|
254
|
+
userCommitment = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userVrfMsg1, userGpgKey));
|
|
255
|
+
backupCommitment = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupVrfMsg1, backupGpgKey));
|
|
256
|
+
await assert_1.default.rejects(sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userVrfMsg1, backupGpgKey));
|
|
257
|
+
await bitgoDkg.initDkg(bitgoSk, [userPk, backupPk]);
|
|
258
|
+
const bitgoRawMsg1 = bitgoDkg.getFirstMessage();
|
|
259
|
+
[bitgoMsg2] = bitgoDkg.handleIncomingMessages([
|
|
260
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userMsg1) },
|
|
261
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: new Uint8Array(backupMsg1) },
|
|
262
|
+
bitgoRawMsg1,
|
|
263
|
+
]);
|
|
264
|
+
const [bitgoVrfCommitment] = (await bitgoVrf.initDkg()).broadcastMessages;
|
|
265
|
+
const signedVrfMsg1 = await signAsBitgo(bitgoVrfCommitment.payload);
|
|
266
|
+
return {
|
|
267
|
+
sessionId: 'session-id',
|
|
268
|
+
bitgoMsg1: await signAsBitgo(bitgoRawMsg1.payload),
|
|
269
|
+
bitgoVrfMsg1: fault === 'bitgo-vrf-msg1-signature'
|
|
270
|
+
? { ...signedVrfMsg1, message: Buffer.from('tampered').toString('base64') }
|
|
271
|
+
: signedVrfMsg1,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
assert_1.default.strictEqual(body.round, public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2']);
|
|
275
|
+
const payload = (0, codecs_1.decodeWithCodec)(R2Payload, body.payload, 'EdDSA keygen round 2');
|
|
276
|
+
assert_1.default.ok(userGpgKey && backupGpgKey && userCommitment && backupCommitment && bitgoMsg2);
|
|
277
|
+
assert_1.default.deepStrictEqual(Object.keys(payload).sort(), [
|
|
278
|
+
'backupMsg2',
|
|
279
|
+
'backupVrfMsg2',
|
|
280
|
+
'sessionId',
|
|
281
|
+
'userMsg2',
|
|
282
|
+
'userVrfMsg2',
|
|
283
|
+
]);
|
|
284
|
+
const userMsg2 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userMsg2, userGpgKey);
|
|
285
|
+
const backupMsg2 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupMsg2, backupGpgKey);
|
|
286
|
+
const userOpening = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userVrfMsg2, userGpgKey));
|
|
287
|
+
const backupOpening = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupVrfMsg2, backupGpgKey));
|
|
288
|
+
bitgoDkg.handleIncomingMessages([
|
|
289
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userMsg2) },
|
|
290
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: new Uint8Array(backupMsg2) },
|
|
291
|
+
bitgoMsg2,
|
|
292
|
+
]);
|
|
293
|
+
const openings = await bitgoVrf.handleIncomingMessages({
|
|
294
|
+
broadcastMessages: [
|
|
295
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: userCommitment },
|
|
296
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: backupCommitment },
|
|
297
|
+
],
|
|
298
|
+
p2pMessages: [],
|
|
299
|
+
});
|
|
300
|
+
const toUser = openings.p2pMessages.find(({ to }) => to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
301
|
+
const toBackup = openings.p2pMessages.find(({ to }) => to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
302
|
+
assert_1.default.ok(toUser && toBackup);
|
|
303
|
+
await bitgoVrf.handleIncomingMessages({
|
|
304
|
+
broadcastMessages: [],
|
|
305
|
+
p2pMessages: [
|
|
306
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, to: typesMPCv2_1.MPCv2PartiesEnum.BITGO, payload: userOpening },
|
|
307
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, to: typesMPCv2_1.MPCv2PartiesEnum.BITGO, payload: backupOpening },
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
return {
|
|
311
|
+
sessionId: payload.sessionId,
|
|
312
|
+
commonPublicKeychain: bitgoDkg.getCommonKeychain(),
|
|
313
|
+
bitgoMsg2: await signAsBitgo(bitgoMsg2.payload),
|
|
314
|
+
...(fault === 'missing-opening'
|
|
315
|
+
? {}
|
|
316
|
+
: { bitgoVrfMsgToUser: await encryptTo(userGpgKey, toUser.payload) }),
|
|
317
|
+
bitgoVrfMsgToBackup: await encryptTo(backupGpgKey, toBackup.payload),
|
|
318
|
+
};
|
|
319
|
+
},
|
|
320
|
+
}),
|
|
321
|
+
}));
|
|
322
|
+
await utils.createKeychains({
|
|
323
|
+
passphrase: 'passphrase',
|
|
324
|
+
enterprise: 'enterprise-id',
|
|
325
|
+
safeId: 'safe-id',
|
|
326
|
+
});
|
|
327
|
+
return { requests, encryptedInputs, addedKeychains };
|
|
328
|
+
}
|
|
329
|
+
it('signs VRF messages with the party keys and decrypts BitGo openings without handling the HSM VRF state', async function () {
|
|
330
|
+
const { requests, encryptedInputs, addedKeychains } = await keygenWithHsmPeer();
|
|
331
|
+
assert_1.default.deepStrictEqual(requests.map(({ round }) => round), [public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2']]);
|
|
332
|
+
// WP keeps the HSM VRF state between rounds, so neither client round carries it.
|
|
333
|
+
for (const request of requests) {
|
|
334
|
+
assert_1.default.strictEqual('bitgoEncryptedVrfDkgState' in request, false);
|
|
335
|
+
}
|
|
336
|
+
// Both client roots end up with a signing share and a VRF share, tagged with the safe.
|
|
337
|
+
assert_1.default.deepStrictEqual(addedKeychains.map(({ source }) => source).sort(), ['backup', 'bitgo', 'user']);
|
|
338
|
+
for (const keychain of addedKeychains) {
|
|
339
|
+
assert_1.default.strictEqual(keychain.safeId, 'safe-id');
|
|
340
|
+
}
|
|
341
|
+
// User and backup each encrypt a full and a reduced envelope; every one carries a VRF share, and
|
|
342
|
+
// the two parties' shares differ. Order-independent: the roots are registered concurrently.
|
|
343
|
+
const vrfShares = new Set(encryptedInputs.map((input) => {
|
|
344
|
+
const { vrf, prvKeyShare } = decodeVrfEnvelope(Buffer.from(input, 'base64'));
|
|
345
|
+
assert_1.default.ok(vrf.length > 0);
|
|
346
|
+
assert_1.default.ok(prvKeyShare.length > 0);
|
|
347
|
+
return Buffer.from(vrf).toString('hex');
|
|
348
|
+
}));
|
|
349
|
+
assert_1.default.strictEqual(encryptedInputs.length, 4);
|
|
350
|
+
assert_1.default.strictEqual(vrfShares.size, 2);
|
|
351
|
+
});
|
|
352
|
+
it('rejects a BitGo VRF round 1 message whose signature does not verify', async function () {
|
|
353
|
+
await assert_1.default.rejects(keygenWithHsmPeer('bitgo-vrf-msg1-signature'), /signature|verification|signed/i);
|
|
354
|
+
});
|
|
355
|
+
it('rejects a BitGo VRF opening whose signature does not verify', async function () {
|
|
356
|
+
await assert_1.default.rejects(keygenWithHsmPeer('bitgo-vrf-opening-signature'), /signature|verification|signed/i);
|
|
357
|
+
});
|
|
358
|
+
it('fails when the HSM omits a BitGo VRF opening in round 2', async function () {
|
|
359
|
+
await assert_1.default.rejects(keygenWithHsmPeer('missing-opening'), /VRF message to user/);
|
|
176
360
|
});
|
|
177
|
-
const forUser = (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(blob, typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
178
|
-
assert_1.default.deepStrictEqual(Buffer.from(forUser.broadcastMessages[0].payload), Buffer.from([1, 2, 3]));
|
|
179
|
-
assert_1.default.strictEqual(forUser.p2pMessages.length, 1);
|
|
180
|
-
assert_1.default.strictEqual(forUser.p2pMessages[0].to, typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
181
|
-
assert_1.default.deepStrictEqual(Buffer.from(forUser.p2pMessages[0].payload), Buffer.from([4]));
|
|
182
|
-
const forBackup = (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(blob, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
183
|
-
assert_1.default.strictEqual(forBackup.p2pMessages.length, 1);
|
|
184
|
-
assert_1.default.strictEqual(forBackup.p2pMessages[0].to, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
185
|
-
});
|
|
186
|
-
it('rejects malformed VRF DKG message blobs', function () {
|
|
187
|
-
assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)('%%%', typesMPCv2_1.MPCv2PartiesEnum.USER), /Invalid VRF DKG message blob/);
|
|
188
|
-
const notAnArray = Buffer.from(JSON.stringify({ from: 0 })).toString('base64');
|
|
189
|
-
assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(notAnArray, typesMPCv2_1.MPCv2PartiesEnum.USER), /VRF DKG message blob/);
|
|
190
|
-
const badParty = Buffer.from(JSON.stringify([{ from: 9, payload: Buffer.from([1]).toString('base64') }])).toString('base64');
|
|
191
|
-
assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(badParty, typesMPCv2_1.MPCv2PartiesEnum.USER), /VRF DKG message blob/);
|
|
192
361
|
});
|
|
193
362
|
});
|
|
194
363
|
describe('EdDSA safe-child MPS derivation', function () {
|
|
@@ -377,4 +546,4 @@ describe('EdDSA safe-child MPS derivation', function () {
|
|
|
377
546
|
});
|
|
378
547
|
}
|
|
379
548
|
});
|
|
380
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw2Q0FBK0I7QUFDL0IsNkNBQStCO0FBQy9CLHlEQUE4RjtBQUM5RixzREFNNkI7QUFDN0IsbUNBQWdDO0FBQ2hDLHlDQUEyQjtBQUUzQiwrQ0FBd0Y7QUFDeEYscUVBQTJFO0FBQzNFLDZGQUFrRztBQUNsRyw2RkFJbUU7QUFDbkUsdUZBQTBGO0FBQzFGLGlGQUFvRjtBQUVwRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2hDLFlBQVksRUFDWixDQUFDLEtBQUssRUFBdUIsRUFBRSxDQUFDLEtBQUssWUFBWSxVQUFVLEVBQzNELENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUNoRyxDQUFDLENBQUMsUUFBUSxDQUNYLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyQixXQUFXLEVBQUUsZUFBZTtJQUM1QixHQUFHLEVBQUUsZUFBZTtDQUNyQixDQUFDLENBQUM7QUFjSCxTQUFTLGlCQUFpQixDQUFDLE9BQWU7SUFDeEMsT0FBTyxJQUFBLHdCQUFlLEVBQUMsV0FBVyxFQUFFLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFF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QU0sRUFBRSxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxXQUFXLEtBQUssK0JBQStCLEVBQUUsS0FBSztZQUN2RCxNQUFNLGlCQUFpQixHQUEwQixFQUFFLENBQUM7WUFDcEQsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxFQUM5QyxLQUFLLEtBQUssU0FBUztnQkFDakIsQ0FBQyxDQUFDLGFBQWE7Z0JBQ2YsQ0FBQyxDQUFDLEtBQUssS0FBSyxnQkFBZ0I7b0JBQzVCLENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3BCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FDckMsQ0FBQztZQUNGLGdCQUFNLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgcGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgTVBTQ29tbXMsIE1QU1V0aWwsIE1QU1R5cGVzLCBNcHNEZXJpdmUsIE1wc1ZyZlV0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MkRlcml2ZVJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0LFxuICBLZXlDdXJ2ZUVudW0sXG4gIEtleUdlblR5cGVFbnVtLFxuICBNUEN2MktleUdlblN0YXRlRW51bSxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmltcG9ydCB7IEVkZHNhTVBDdjJVdGlscywgQml0R29CYXNlLCBJQmFzZUNvaW4sIEtleWNoYWluIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9jb2RlY3MnO1xuaW1wb3J0IHsgYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcbmltcG9ydCB7XG4gIEVkZHNhVnJmTVBDdjJVdGlscyxcbiAgZGVzZXJpYWxpemVWcmZNZXNzYWdlcyxcbiAgc2VyaWFsaXplVnJmTWVzc2FnZXMsXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mic7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9lY2RzYS90eXBlc01QQ3YyJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9vcGVuZ3BnVXRpbHMnO1xuXG5jb25zdCBVaW50OEFycmF5Q29kZWMgPSBuZXcgdC5UeXBlPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXksIHVua25vd24+KFxuICAnVWludDhBcnJheScsXG4gICh2YWx1ZSk6IHZhbHVlIGlzIFVpbnQ4QXJyYXkgPT4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAodmFsdWUsIGNvbnRleHQpID0+ICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyB0LnN1Y2Nlc3ModmFsdWUpIDogdC5mYWlsdXJlKHZhbHVlLCBjb250ZXh0KSksXG4gIHQuaWRlbnRpdHlcbik7XG5cbmNvbnN0IFZyZkVudmVsb3BlID0gdC50eXBlKHtcbiAgdmVyc2lvbjogdC5saXRlcmFsKDEpLFxuICBwcnZLZXlTaGFyZTogVWludDhBcnJheUNvZGVjLFxuICB2cmY6IFVpbnQ4QXJyYXlDb2RlYyxcbn0pO1xuXG50eXBlIEFkZGVkS2V5Y2hhaW5QYXJhbXMgPSB7XG4gIHNvdXJjZT86IHN0cmluZztcbiAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICByZWR1Y2VkRW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICBzYWZlSWQ/OiBzdHJpbmc7XG4gIHBhcmVudD86IHN0cmluZztcbiAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aD86IHN0cmluZztcbiAgY29tbW9uS2V5Y2hhaW4/OiBzdHJpbmc7XG4gIGlzTVBDdjI/OiBib29sZWFuO1xuICBrZXlUeXBlPzogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlVnJmRW52ZWxvcGUoZW5jb2RlZDogQnVmZmVyKTogdC5UeXBlT2Y8dHlwZW9mIFZyZkVudmVsb3BlPiB7XG4gIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoVnJmRW52ZWxvcGUsIGRlY29kZShlbmNvZGVkKSwgJ1ZSRiBrZXkgZW52ZWxvcGUnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCkge1xuICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFkZGVkS2V5Y2hhaW5zOiBBZGRlZEtleWNoYWluUGFyYW1zW10gPSBbXTtcbiAgY29uc3QgcG9zdCA9IHNpbm9uLnN0dWIoKTtcbiAgY29uc3QgYml0Z28gPSB7XG4gICAgZ2V0RW52OiAoKSA9PiAnZGV2JyxcbiAgICB1cmw6IChwYXRoOiBzdHJpbmcpID0+IHBhdGgsXG4gICAgcG9zdCxcbiAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgcmV0dXJuIGBlbmNyeXB0ZWQ6JHtwYXJhbXMuaW5wdXR9YDtcbiAgICB9LFxuICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgcmV0dXJuIHsgaWQ6IGAke3BhcmFtcy5zb3VyY2V9LWNoaWxkYCwgdHlwZTogJ3RzcycsIGVuY3J5cHRlZFBydjogcGFyYW1zLmVuY3J5cHRlZFBydiB9O1xuICAgIH0sXG4gIH07XG4gIGNvbnN0IGJhc2VDb2luID0ge1xuICAgIGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zLFxuICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICByZXR1cm4geyBiaXRnbywgYmFzZUNvaW4sIHBvc3QsIGVuY3J5cHRlZElucHV0cywgYWRkZWRLZXljaGFpbnMgfTtcbn1cblxuZGVzY3JpYmUoJ0VkRFNBIE1QQ3YyIFZSRiByb290IG1hdGVyaWFsJywgZnVuY3Rpb24gKCkge1xuICBpdCgnZW5jb2RlcyBzaWduaW5nIGFuZCBWUkYgc2hhcmVzIGluIGJvdGggZnVsbCBhbmQgcmVkdWNlZCBlbnZlbG9wZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpO1xuICAgIGNvbnN0IHZyZktleVNoYXJlID0gQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpO1xuXG4gICAgY29uc3QgeyBlbnZlbG9wZSwgcmVkdWNlZEVudmVsb3BlIH0gPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgdnJmS2V5U2hhcmVcbiAgICApO1xuICAgIGNvbnN0IGRlY29kZWRFbnZlbG9wZSA9IGRlY29kZVZyZkVudmVsb3BlKGVudmVsb3BlKTtcbiAgICBjb25zdCBkZWNvZGVkUmVkdWNlZEVudmVsb3BlID0gZGVjb2RlVnJmRW52ZWxvcGUocmVkdWNlZEVudmVsb3BlKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZEVudmVsb3BlLnBydktleVNoYXJlKSwgcHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWRFbnZlbG9wZS52cmYpLCB2cmZLZXlTaGFyZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkUmVkdWNlZEVudmVsb3BlLnBydktleVNoYXJlKSwgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkUmVkdWNlZEVudmVsb3BlLnZyZiksIHZyZktleVNoYXJlKTtcbiAgfSk7XG5cbiAgaXQoJ2tlZXBzIG9yZGluYXJ5IE1QQ3YyIHBhcnRpY2lwYW50IG1hdGVyaWFsIGFzIGJhcmUgYmFzZTY0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH0gPSBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKTtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICBjb25zdCBwcml2YXRlTWF0ZXJpYWwgPSBCdWZmZXIuZnJvbSgnc2lnbmluZy1zaGFyZScpO1xuICAgIGNvbnN0IHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSBCdWZmZXIuZnJvbSgncmVkdWNlZC1zaWduaW5nLXNoYXJlJyk7XG5cbiAgICBhd2FpdCB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgJ2NvbW1vbi1rZXljaGFpbicsXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgJ3Bhc3NwaHJhc2UnXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzLCBbXG4gICAgICBwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0JyksXG4gICAgXSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiwgYGVuY3J5cHRlZDoke3ByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0Jyl9YCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLnNhZmVJZCwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSBwdWJsaWMtb25seSBiYWNrdXAgb3V0c2lkZSBhIHNhZmUgY2hpbGQgZGVyaXZhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IGJpdGdvLCBiYXNlQ29pbiwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsICdjb21tb24ta2V5Y2hhaW4nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3Bhc3NwaHJhc2UnKSxcbiAgICAgIC9Qcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciBiYWNrdXAga2V5Y2hhaW4vXG4gICAgKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnMsIFtdKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY3J5cHRzIHRoZSBWUkYgZW52ZWxvcGUgYW5kIHRhZ3MgdGhlIGtleWNoYWluIHdpdGggc2FmZUlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgYml0Z28gPSB7XG4gICAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7IGlkOiAndXNlci1rZXknIH0gYXMgdW5rbm93biBhcyBLZXljaGFpbjtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zLFxuICAgIH0gYXMgdW5rbm93biBhcyBJQmFzZUNvaW47XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgY29uc3QgeyBlbnZlbG9wZSwgcmVkdWNlZEVudmVsb3BlIH0gPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBCdWZmZXIuZnJvbSgnc2lnbmluZy1zaGFyZScpLFxuICAgICAgQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpLFxuICAgICAgQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpXG4gICAgKTtcblxuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIGVudmVsb3BlLFxuICAgICAgcmVkdWNlZEVudmVsb3BlLFxuICAgICAgJ3Bhc3NwaHJhc2UnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgJ3NhZmUtaWQnXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzWzBdLCBlbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVZyZkVudmVsb3BlKEJ1ZmZlci5mcm9tKGVuY3J5cHRlZElucHV0c1swXSwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWQudnJmKSwgQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpKTtcbiAgfSk7XG5cbiAgaXQoJ3RhZ3MgdGhlIEJpdEdvIGtleWNoYWluIHdpdGggc2FmZUlkIGFuZCBkb2VzIG5vdCBlbmNyeXB0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgYml0Z28gPSB7XG4gICAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7IGlkOiAnYml0Z28ta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICdzYWZlLWlkJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW10pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zb3VyY2UsICdiaXRnbycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXRyaXBzIG9wYXF1ZSBWUkYgYmxvYnMgYW5kIGtlZXBzIG9ubHkgdGhlIHJlY2lwaWVudCBwMnAgbWVzc2FnZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmxvYiA9IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbMSwgMiwgM10pIH1dLFxuICAgICAgcDJwTWVzc2FnZXM6IFtcbiAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCB0bzogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbNF0pIH0sXG4gICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgdG86IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbNV0pIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9yVXNlciA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoYmxvYiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGZvclVzZXIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCksIEJ1ZmZlci5mcm9tKFsxLCAyLCAzXSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JVc2VyLnAycE1lc3NhZ2VzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZvclVzZXIucDJwTWVzc2FnZXNbMF0udG8sIE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShmb3JVc2VyLnAycE1lc3NhZ2VzWzBdLnBheWxvYWQpLCBCdWZmZXIuZnJvbShbNF0pKTtcblxuICAgIGNvbnN0IGZvckJhY2t1cCA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoYmxvYiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JCYWNrdXAucDJwTWVzc2FnZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZm9yQmFja3VwLnAycE1lc3NhZ2VzWzBdLnRvLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIG1hbGZvcm1lZCBWUkYgREtHIG1lc3NhZ2UgYmxvYnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKCclJSUnLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpLCAvSW52YWxpZCBWUkYgREtHIG1lc3NhZ2UgYmxvYi8pO1xuICAgIGNvbnN0IG5vdEFuQXJyYXkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGZyb206IDAgfSkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMobm90QW5BcnJheSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSwgL1ZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gICAgY29uc3QgYmFkUGFydHkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShbeyBmcm9tOiA5LCBwYXlsb2FkOiBCdWZmZXIuZnJvbShbMV0pLnRvU3RyaW5nKCdiYXNlNjQnKSB9XSkpLnRvU3RyaW5nKFxuICAgICAgJ2Jhc2U2NCdcbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiYWRQYXJ0eSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSwgL1ZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdFZERTQSBzYWZlLWNoaWxkIE1QUyBkZXJpdmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdXNlclNpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgdXNlclZyZlNoYXJlOiBCdWZmZXI7XG4gIGxldCBiaXRnb1NpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29WcmZTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29Qcml2YXRlS2V5OiBwZ3AuUHJpdmF0ZUtleTtcbiAgbGV0IGJpdGdvUHVibGljS2V5OiBwZ3AuS2V5O1xuXG4gIGNvbnN0IHNlc3Npb25JZCA9ICdkZXJpdmUtc2Vzc2lvbic7XG4gIGNvbnN0IGRlcml2YXRpb25JbmRleCA9IDc7XG4gIGNvbnN0IHBhdGggPSBcIm0vNydcIjtcbiAgY29uc3QgUmVxdWVzdCA9IHQuaW50ZXJzZWN0aW9uKFtcbiAgICB0LnR5cGUoeyBlbnRlcnByaXNlOiB0LnN0cmluZywgdHlwZTogdC5zdHJpbmcsIGN1cnZlVHlwZTogdC5zdHJpbmcsIHJvdW5kOiB0LnN0cmluZywgcGF5bG9hZDogdC51bmtub3duIH0pLFxuICAgIHQucGFydGlhbCh7IHNhZmVJZDogdC5zdHJpbmcgfSksXG4gIF0pO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnbmluZyA9IGF3YWl0IE1QU1V0aWwuZ2VuZXJhdGVFZERzYURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IHZyZiA9IGF3YWl0IE1wc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgdXNlclNpZ25pbmdTaGFyZSA9IHNpZ25pbmdbTVBDdjJQYXJ0aWVzRW51bS5VU0VSXS5nZXRLZXlTaGFyZSgpO1xuICAgIGJpdGdvU2lnbmluZ1NoYXJlID0gc2lnbmluZ1tNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXS5nZXRLZXlTaGFyZSgpO1xuICAgIHVzZXJWcmZTaGFyZSA9IHZyZltNUEN2MlBhcnRpZXNFbnVtLlVTRVJdLmdldEtleVNoYXJlKCk7XG4gICAgYml0Z29WcmZTaGFyZSA9IHZyZltNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXS5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJpdGdvR3BnID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgYml0Z29Qcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGcucHJpdmF0ZUtleSB9KTtcbiAgICBiaXRnb1B1YmxpY0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGcucHVibGljS2V5IH0pO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBkZXJpdmVXaXRoUGVlcihcbiAgICBmYXVsdD86ICdyMS1zaWduYXR1cmUnIHwgJ3IyLXNpZ25hdHVyZScgfCAnc2Vzc2lvbicgfCAnY29tbW9uS2V5Y2hhaW4nLFxuICAgIHJlY29yZGVkS2V5Y2hhaW5zPzogQWRkZWRLZXljaGFpblBhcmFtc1tdXG4gICkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH0gPSBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKTtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICBzaW5vbi5zdHViKHV0aWxzLCAnZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzJykucmVzb2x2ZXMoe1xuICAgICAgbXBjdjJQdWJsaWNLZXk6IGJpdGdvUHVibGljS2V5LFxuICAgICAgZWRkc2FNcGN2MlB1YmxpY0tleTogYml0Z29QdWJsaWNLZXksXG4gICAgICByZWRwYWxsYXNNcGN2MlB1YmxpY0tleTogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvUGVlciA9IG5ldyBNcHNEZXJpdmUuRGVyaXZlKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQklUR08sIGJpdGdvU2lnbmluZ1NoYXJlLCBiaXRnb1ZyZlNoYXJlLCBwYXRoKTtcbiAgICBsZXQgYml0Z29Nc2cyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIGxldCB1c2VyR3BnUHVibGljS2V5ID0gJyc7XG4gICAgbGV0IHJvdW5kcyA9IDA7XG4gICAgcG9zdC5jYWxsc0Zha2UoKF91cmw6IHN0cmluZykgPT4gKHtcbiAgICAgIHNlbmQ6IChyYXdCb2R5OiB1bmtub3duKSA9PiAoe1xuICAgICAgICByZXN1bHQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gZGVjb2RlV2l0aENvZGVjKFJlcXVlc3QsIHJhd0JvZHksICdFZERTQSBkZXJpdmUgcmVxdWVzdCcpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChfdXJsLCAnL21wYy9nZW5lcmF0ZWtleScpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmVudGVycHJpc2UsICdlbnRlcnByaXNlLWlkJyk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkudHlwZSwgS2V5R2VuVHlwZUVudW0uTVBDdjIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmN1cnZlVHlwZSwgS2V5Q3VydmVFbnVtLkVkRFNBKTtcbiAgICAgICAgICBpZiAocm91bmRzKysgPT09IDApIHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjEnXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZGVjb2RlV2l0aENvZGVjKEVkZHNhTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0LCBib2R5LnBheWxvYWQsICdFZERTQSBkZXJpdmUgcm91bmQgMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChPYmplY3Qua2V5cyhyZXF1ZXN0KS5zb3J0KCksIFtcbiAgICAgICAgICAgICAgJ2Rlcml2YXRpb25JbmRleCcsXG4gICAgICAgICAgICAgICdwYXJlbnRLZXlJZCcsXG4gICAgICAgICAgICAgICd1c2VyR3BnUHVibGljS2V5JyxcbiAgICAgICAgICAgICAgJ3VzZXJNc2cxJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcXVlc3QucGFyZW50S2V5SWQsICdiaXRnby1yb290LWlkJyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVxdWVzdC5kZXJpdmF0aW9uSW5kZXgsIGRlcml2YXRpb25JbmRleCk7XG4gICAgICAgICAgICB1c2VyR3BnUHVibGljS2V5ID0gcmVxdWVzdC51c2VyR3BnUHVibGljS2V5O1xuICAgICAgICAgICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcmVxdWVzdC51c2VyR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHJlcXVlc3QudXNlck1zZzEsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgYml0Z29GaXJzdCA9IGF3YWl0IGJpdGdvUGVlci5pbml0RGVyaXZlKCk7XG4gICAgICAgICAgICBjb25zdCBbb3V0Z29pbmddID0gYml0Z29QZWVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW1xuICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlclBheWxvYWQpIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGFzc2VydC5vayhvdXRnb2luZyk7XG4gICAgICAgICAgICBiaXRnb01zZzIgPSBvdXRnb2luZy5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmVkID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYml0Z29GaXJzdC5wYXlsb2FkKSwgYml0Z29Qcml2YXRlS2V5KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgYml0Z29Nc2cxOlxuICAgICAgICAgICAgICAgIGZhdWx0ID09PSAncjEtc2lnbmF0dXJlJyA/IHsgLi4uc2lnbmVkLCBtZXNzYWdlOiBCdWZmZXIuZnJvbSgndGFtcGVyZWQnKS50b1N0cmluZygnYmFzZTY0JykgfSA6IHNpZ25lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyb3VuZHMsIDIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjInXSk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkuc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBkZWNvZGVXaXRoQ29kZWMoRWRkc2FNUEN2MkRlcml2ZVJvdW5kMlJlcXVlc3QsIGJvZHkucGF5bG9hZCwgJ0VkRFNBIGRlcml2ZSByb3VuZCAyJyk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChPYmplY3Qua2V5cyhyZXF1ZXN0KS5zb3J0KCksIFsnc2Vzc2lvbklkJywgJ3VzZXJNc2cyJ10pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXF1ZXN0LnNlc3Npb25JZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoXG4gICAgICAgICAgICByZXF1ZXN0LnVzZXJNc2cyLFxuICAgICAgICAgICAgYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHVibGljS2V5IH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgICAgYml0Z29QZWVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3sgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheSh1c2VyUGF5bG9hZCkgfV0pLFxuICAgICAgICAgICAgW11cbiAgICAgICAgICApO1xuICAgICAgICAgIGFzc2VydC5vayhiaXRnb01zZzIpO1xuICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJpdGdvTXNnMiksIGJpdGdvUHJpdmF0ZUtleSk7XG4gICAgICAgICAgY29uc3QgY29tbW9uUHVibGljS2V5Y2hhaW4gPSBiaXRnb1BlZXIuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBmYXVsdCA9PT0gJ3Nlc3Npb24nID8gJ2RpZmZlcmVudC1zZXNzaW9uJyA6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluOlxuICAgICAgICAgICAgICBmYXVsdCA9PT0gJ2NvbW1vbktleWNoYWluJ1xuICAgICAgICAgICAgICAgID8gYCR7Y29tbW9uUHVibGljS2V5Y2hhaW4uc2xpY2UoMCwgLTEpfSR7Y29tbW9uUHVibGljS2V5Y2hhaW4uZW5kc1dpdGgoJzAnKSA/ICcxJyA6ICcwJ31gXG4gICAgICAgICAgICAgICAgOiBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICAgICAgIGJpdGdvTXNnMjpcbiAgICAgICAgICAgICAgZmF1bHQgPT09ICdyMi1zaWduYXR1cmUnID8geyAuLi5zaWduZWQsIG1lc3NhZ2U6IEJ1ZmZlci5mcm9tKCd0YW1wZXJlZCcpLnRvU3RyaW5nKCdiYXNlNjQnKSB9IDogc2lnbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgICAgcGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIHNhZmVJZDogJ3NhZmUtaWQnLFxuICAgICAgICBwYXJlbnRLZXlJZDogJ2JpdGdvLXJvb3QtaWQnLFxuICAgICAgICBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICAgIHVzZXJSb290S2V5SWQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBiYWNrdXBSb290S2V5SWQ6ICdiYWNrdXAtcm9vdC1pZCcsXG4gICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJTaWduaW5nU2hhcmUsXG4gICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHVzZXJWcmZTaGFyZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgcmVzdWx0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zLCBiaXRnb1BlZXIsIHJvdW5kcyB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRlZEtleWNoYWlucz8ucHVzaCguLi5hZGRlZEtleWNoYWlucyk7XG4gICAgfVxuICB9XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdyZWdpc3RlcnMgdGhlIGNoaWxkIHNpZ25pbmcgc2hhcmUgYW5kIHR3byBwdWJsaWMtb25seSBwbGFjZWhvbGRlcnMgYWZ0ZXIgdGhlIHNpZ25lZCBjZXJlbW9ueScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHJlc3VsdCwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucywgYml0Z29QZWVyLCByb3VuZHMgfSA9IGF3YWl0IGRlcml2ZVdpdGhQZWVyKCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJvdW5kcywgMik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucy5tYXAoKHsgc291cmNlIH0pID0+IHNvdXJjZSkuc29ydCgpLCBbJ2JhY2t1cCcsICdiaXRnbycsICd1c2VyJ10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICBbcmVzdWx0LnVzZXJLZXljaGFpbi5pZCwgcmVzdWx0LmJhY2t1cEtleWNoYWluLmlkLCByZXN1bHQuYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICBbJ3VzZXItY2hpbGQnLCAnYmFja3VwLWNoaWxkJywgJ2JpdGdvLWNoaWxkJ11cbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5Y2hhaW4gb2YgYWRkZWRLZXljaGFpbnMpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCwgcGF0aCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJpdGdvUGVlci5nZXRDb21tb25LZXljaGFpbigpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5rZXlUeXBlLCAndHNzJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uaXNNUEN2MiwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJDaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ3VzZXInKTtcbiAgICBjb25zdCBiYWNrdXBDaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ2JhY2t1cCcpO1xuICAgIGNvbnN0IGJpdGdvQ2hpbGQgPSBhZGRlZEtleWNoYWlucy5maW5kKCh7IHNvdXJjZSB9KSA9PiBzb3VyY2UgPT09ICdiaXRnbycpO1xuICAgIGFzc2VydC5vayh1c2VyQ2hpbGQpO1xuICAgIGFzc2VydC5vayhiYWNrdXBDaGlsZCk7XG4gICAgYXNzZXJ0Lm9rKGJpdGdvQ2hpbGQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQucGFyZW50LCAndXNlci1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhY2t1cENoaWxkLnBhcmVudCwgJ2JhY2t1cC1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJpdGdvQ2hpbGQucGFyZW50LCAnYml0Z28tcm9vdC1pZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMubGVuZ3RoLCAyKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodXNlckNoaWxkLmVuY3J5cHRlZFBydiwgYGVuY3J5cHRlZDoke2VuY3J5cHRlZElucHV0c1swXX1gKTtcbiAgICBjb25zdCBzaWduaW5nU2hhcmUgPSBCdWZmZXIuZnJvbShyZXN1bHQudXNlcktleWNoYWluLmVuY3J5cHRlZFBydj8uc2xpY2UoJ2VuY3J5cHRlZDonLmxlbmd0aCkgPz8gJycsICdiYXNlNjQnKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNpZ25pbmdTaGFyZSwgQnVmZmVyLmZyb20oZW5jcnlwdGVkSW5wdXRzWzBdLCAnYmFzZTY0JykpO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwoc2lnbmluZ1NoYXJlLCB1c2VyU2lnbmluZ1NoYXJlKTtcbiAgICBhc3NlcnQubm90RGVlcFN0cmljdEVxdWFsKHNpZ25pbmdTaGFyZSwgYml0Z29QZWVyLmdldEtleVNoYXJlKCkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQucmVkdWNlZEVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVzdWx0LnVzZXJLZXljaGFpbi5yZWR1Y2VkRW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhyZWR1Y2VkKTtcbiAgICBjb25zdCByZWR1Y2VkU2hhcmUgPSBNUFNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKEJ1ZmZlci5mcm9tKHJlZHVjZWQuc2xpY2UoJ2VuY3J5cHRlZDonLmxlbmd0aCksICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWR1Y2VkU2hhcmUua2V5U2hhcmUpLCBzaWduaW5nU2hhcmUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWR1Y2VkU2hhcmUucHViKS50b1N0cmluZygnaGV4JyksIGJpdGdvUGVlci5nZXRDb21tb25LZXljaGFpbigpLnNsaWNlKDAsIDY0KSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNvZGVWcmZFbnZlbG9wZShzaWduaW5nU2hhcmUpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2hpbGQuZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiaXRnb0NoaWxkLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgaW5kZXhlcyBvdXRzaWRlIHRoZSBoYXJkZW5lZCBTYWZlIHJhbmdlIGJlZm9yZSBjb250YWN0aW5nIFdQJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FWcmZNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHV0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgIHBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICBzYWZlSWQ6ICdzYWZlLWlkJyxcbiAgICAgICAgcGFyZW50S2V5SWQ6ICdiaXRnby1yb290LWlkJyxcbiAgICAgICAgZGVyaXZhdGlvbkluZGV4OiAweDgwMDAwMDAwLFxuICAgICAgICB1c2VyUm9vdEtleUlkOiAndXNlci1yb290LWlkJyxcbiAgICAgICAgYmFja3VwUm9vdEtleUlkOiAnYmFja3VwLXJvb3QtaWQnLFxuICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyU2lnbmluZ1NoYXJlLFxuICAgICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyVnJmU2hhcmUsXG4gICAgICB9KSxcbiAgICAgIC9kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoL1xuICAgICk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBvc3QuY2FsbGVkLCBmYWxzZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucywgW10pO1xuICB9KTtcblxuICBjb25zdCBmYXVsdHM6IEFycmF5PCdyMS1zaWduYXR1cmUnIHwgJ3IyLXNpZ25hdHVyZScgfCAnc2Vzc2lvbicgfCAnY29tbW9uS2V5Y2hhaW4nPiA9IFtcbiAgICAncjEtc2lnbmF0dXJlJyxcbiAgICAncjItc2lnbmF0dXJlJyxcbiAgICAnc2Vzc2lvbicsXG4gICAgJ2NvbW1vbktleWNoYWluJyxcbiAgXTtcbiAgZm9yIChjb25zdCBmYXVsdCBvZiBmYXVsdHMpIHtcbiAgICBpdChgcmVqZWN0cyAke2ZhdWx0fSBiZWZvcmUgcmVnaXN0ZXJpbmcgYW55IGNoaWxkYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjb3JkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGRlcml2ZVdpdGhQZWVyKGZhdWx0LCByZWNvcmRlZEtleWNoYWlucyksXG4gICAgICAgIGZhdWx0ID09PSAnc2Vzc2lvbidcbiAgICAgICAgICA/IC9zZXNzaW9uIGlkL2lcbiAgICAgICAgICA6IGZhdWx0ID09PSAnY29tbW9uS2V5Y2hhaW4nXG4gICAgICAgICAgPyAvY29tbW9uIGtleWNoYWluL2lcbiAgICAgICAgICA6IC9zaWduYXR1cmV8dmVyaWZpY2F0aW9ufHNpZ25lZC9pXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWNvcmRlZEtleWNoYWlucywgW10pO1xuICAgIH0pO1xuICB9XG59KTtcbiJdfQ==
|
|
549
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw2Q0FBK0I7QUFDL0IsNkNBQStCO0FBQy9CLHlEQUFtSDtBQUNuSCxzREFPNkI7QUFDN0IsbUNBQWdDO0FBQ2hDLHlDQUEyQjtBQUUzQiwrQ0FBd0Y7QUFDeEYscUVBQTJFO0FBQzNFLDZGQUFrRztBQUNsRyw2RkFBK0Y7QUFDL0YsdUZBQTBGO0FBQzFGLGlGQUFvRjtBQUVwRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2hDLFlBQVksRUFDWixDQUFDLEtBQUssRUFBdUIsRUFBRSxDQUFDLEtBQUssWUFBWSxVQUFVLEVBQzNELENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUNoRyxDQUFDLENBQUMsUUFBUSxDQUNYLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyQixXQUFXLEVBQUUsZUFBZTtJQUM1QixHQUFHLEVBQUUsZUFBZTtDQUNyQixDQUFDLENBQUM7QUFjSCxTQUFTLGlCQUFpQixDQUFDLE9BQWU7SUFDeEMsT0FBTyxJQUFBLHdCQUFlLEVBQUMsV0FBVyxFQUFFLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFF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LGFBQWE7Z0JBQ2YsQ0FBQyxDQUFDLEtBQUssS0FBSyxnQkFBZ0I7b0JBQzVCLENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3BCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FDckMsQ0FBQztZQUNGLGdCQUFNLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgcGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgRWRkc2FNUFNEa2csIE1QU0NvbW1zLCBNUFNVdGlsLCBNUFNUeXBlcywgTXBzRGVyaXZlLCBNcHNWcmYsIE1wc1ZyZlV0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MkRlcml2ZVJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0LFxuICBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgS2V5Q3VydmVFbnVtLFxuICBLZXlHZW5UeXBlRW51bSxcbiAgTVBDdjJLZXlHZW5TdGF0ZUVudW0sXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuXG5pbXBvcnQgeyBFZGRzYU1QQ3YyVXRpbHMsIEJpdEdvQmFzZSwgSUJhc2VDb2luLCBLZXljaGFpbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3Mva2V5U2hhcmVFbnZlbG9wZSc7XG5pbXBvcnQgeyBFZGRzYVZyZk1QQ3YyVXRpbHMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VkZHNhL2VkZHNhVnJmTVBDdjInO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvdHlwZXNNUEN2Mic7XG5pbXBvcnQgeyBnZW5lcmF0ZUdQR0tleVBhaXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvb3BlbmdwZ1V0aWxzJztcblxuY29uc3QgVWludDhBcnJheUNvZGVjID0gbmV3IHQuVHlwZTxVaW50OEFycmF5LCBVaW50OEFycmF5LCB1bmtub3duPihcbiAgJ1VpbnQ4QXJyYXknLFxuICAodmFsdWUpOiB2YWx1ZSBpcyBVaW50OEFycmF5ID0+IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSxcbiAgKHZhbHVlLCBjb250ZXh0KSA9PiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gdC5zdWNjZXNzKHZhbHVlKSA6IHQuZmFpbHVyZSh2YWx1ZSwgY29udGV4dCkpLFxuICB0LmlkZW50aXR5XG4pO1xuXG5jb25zdCBWcmZFbnZlbG9wZSA9IHQudHlwZSh7XG4gIHZlcnNpb246IHQubGl0ZXJhbCgxKSxcbiAgcHJ2S2V5U2hhcmU6IFVpbnQ4QXJyYXlDb2RlYyxcbiAgdnJmOiBVaW50OEFycmF5Q29kZWMsXG59KTtcblxudHlwZSBBZGRlZEtleWNoYWluUGFyYW1zID0ge1xuICBzb3VyY2U/OiBzdHJpbmc7XG4gIGVuY3J5cHRlZFBydj86IHN0cmluZztcbiAgcmVkdWNlZEVuY3J5cHRlZFBydj86IHN0cmluZztcbiAgc2FmZUlkPzogc3RyaW5nO1xuICBwYXJlbnQ/OiBzdHJpbmc7XG4gIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg/OiBzdHJpbmc7XG4gIGNvbW1vbktleWNoYWluPzogc3RyaW5nO1xuICBpc01QQ3YyPzogYm9vbGVhbjtcbiAga2V5VHlwZT86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZVZyZkVudmVsb3BlKGVuY29kZWQ6IEJ1ZmZlcik6IHQuVHlwZU9mPHR5cGVvZiBWcmZFbnZlbG9wZT4ge1xuICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFZyZkVudmVsb3BlLCBkZWNvZGUoZW5jb2RlZCksICdWUkYga2V5IGVudmVsb3BlJyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleWNoYWluRml4dHVyZSgpIHtcbiAgY29uc3QgZW5jcnlwdGVkSW5wdXRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gIGNvbnN0IHBvc3QgPSBzaW5vbi5zdHViKCk7XG4gIGNvbnN0IGJpdGdvID0ge1xuICAgIGdldEVudjogKCkgPT4gJ2RldicsXG4gICAgdXJsOiAocGF0aDogc3RyaW5nKSA9PiBwYXRoLFxuICAgIHBvc3QsXG4gICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgZW5jcnlwdGVkSW5wdXRzLnB1c2gocGFyYW1zLmlucHV0KTtcbiAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgfSxcbiAgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgIGFkZGVkS2V5Y2hhaW5zLnB1c2gocGFyYW1zKTtcbiAgICAgIHJldHVybiB7IGlkOiBgJHtwYXJhbXMuc291cmNlfS1jaGlsZGAsIHR5cGU6ICd0c3MnLCBlbmNyeXB0ZWRQcnY6IHBhcmFtcy5lbmNyeXB0ZWRQcnYgfTtcbiAgICB9LFxuICB9O1xuICBjb25zdCBiYXNlQ29pbiA9IHtcbiAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgfSBhcyB1bmtub3duIGFzIElCYXNlQ29pbjtcbiAgcmV0dXJuIHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH07XG59XG5cbmRlc2NyaWJlKCdFZERTQSBNUEN2MiBWUkYgcm9vdCBtYXRlcmlhbCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2VuY29kZXMgc2lnbmluZyBhbmQgVlJGIHNoYXJlcyBpbiBib3RoIGZ1bGwgYW5kIHJlZHVjZWQgZW52ZWxvcGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdzaWduaW5nLXNoYXJlJyk7XG4gICAgY29uc3QgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdyZWR1Y2VkLXNpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCB2cmZLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKTtcblxuICAgIGNvbnN0IHsgZW52ZWxvcGUsIHJlZHVjZWRFbnZlbG9wZSB9ID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHZyZktleVNoYXJlXG4gICAgKTtcbiAgICBjb25zdCBkZWNvZGVkRW52ZWxvcGUgPSBkZWNvZGVWcmZFbnZlbG9wZShlbnZlbG9wZSk7XG4gICAgY29uc3QgZGVjb2RlZFJlZHVjZWRFbnZlbG9wZSA9IGRlY29kZVZyZkVudmVsb3BlKHJlZHVjZWRFbnZlbG9wZSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSksIHByaXZhdGVNYXRlcmlhbCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkRW52ZWxvcGUudnJmKSwgdnJmS2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZFJlZHVjZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSksIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZFJlZHVjZWRFbnZlbG9wZS52cmYpLCB2cmZLZXlTaGFyZSk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBvcmRpbmFyeSBNUEN2MiBwYXJ0aWNpcGFudCBtYXRlcmlhbCBhcyBiYXJlIGJhc2U2NCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IGJpdGdvLCBiYXNlQ29pbiwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgY29uc3QgcHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICdjb21tb24ta2V5Y2hhaW4nLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICdwYXNzcGhyYXNlJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW1xuICAgICAgcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIF0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYsIGBlbmNyeXB0ZWQ6JHtwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpfWApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgcHVibGljLW9ubHkgYmFja3VwIG91dHNpZGUgYSBzYWZlIGNoaWxkIGRlcml2YXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBiaXRnbywgYmFzZUNvaW4sIGVuY3J5cHRlZElucHV0cywgYWRkZWRLZXljaGFpbnMgfSA9IGNyZWF0ZUtleWNoYWluRml4dHVyZSgpO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCAnY29tbW9uLWtleWNoYWluJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdwYXNzcGhyYXNlJyksXG4gICAgICAvUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgYmFja3VwIGtleWNoYWluL1xuICAgICk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMsIFtdKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zLCBbXSk7XG4gIH0pO1xuXG4gIGl0KCdlbmNyeXB0cyB0aGUgVlJGIGVudmVsb3BlIGFuZCB0YWdzIHRoZSBrZXljaGFpbiB3aXRoIHNhZmVJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgIGNvbnN0IGJpdGdvID0ge1xuICAgICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgICByZXR1cm4geyBpZDogJ3VzZXIta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuICAgIGNvbnN0IHsgZW52ZWxvcGUsIHJlZHVjZWRFbnZlbG9wZSB9ID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCdyZWR1Y2VkLXNpZ25pbmctc2hhcmUnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKVxuICAgICk7XG5cbiAgICBhd2FpdCB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgJ2NvbW1vbi1rZXljaGFpbicsXG4gICAgICBlbnZlbG9wZSxcbiAgICAgIHJlZHVjZWRFbnZlbG9wZSxcbiAgICAgICdwYXNzcGhyYXNlJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICdzYWZlLWlkJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0c1swXSwgZW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWcmZFbnZlbG9wZShCdWZmZXIuZnJvbShlbmNyeXB0ZWRJbnB1dHNbMF0sICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkLnZyZiksIEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKSk7XG4gIH0pO1xuXG4gIGl0KCd0YWdzIHRoZSBCaXRHbyBrZXljaGFpbiB3aXRoIHNhZmVJZCBhbmQgZG9lcyBub3QgZW5jcnlwdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgIGNvbnN0IGJpdGdvID0ge1xuICAgICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgICByZXR1cm4geyBpZDogJ2JpdGdvLWtleScgfSBhcyB1bmtub3duIGFzIEtleWNoYWluO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb2luID0ge1xuICAgICAga2V5Y2hhaW5zOiAoKSA9PiBrZXljaGFpbnMsXG4gICAgfSBhcyB1bmtub3duIGFzIElCYXNlQ29pbjtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcblxuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgJ2NvbW1vbi1rZXljaGFpbicsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAnc2FmZS1pZCdcbiAgICApO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMsIFtdKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc291cmNlLCAnYml0Z28nKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlIHJvb3Qga2V5Z2VuIGFnYWluc3QgdGhlIEhTTSBjb250cmFjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBLZXlHZW5SZXF1ZXN0ID0gdC5pbnRlcnNlY3Rpb24oW1xuICAgICAgdC50eXBlKHsgZW50ZXJwcmlzZTogdC5zdHJpbmcsIHR5cGU6IHQuc3RyaW5nLCBjdXJ2ZVR5cGU6IHQuc3RyaW5nLCByb3VuZDogdC5zdHJpbmcgfSksXG4gICAgICB0LnBhcnRpYWwoeyBzYWZlSWQ6IHQuc3RyaW5nLCBwYXlsb2FkOiB0LlVua25vd25SZWNvcmQgfSksXG4gICAgXSk7XG4gICAgY29uc3QgUjFQYXlsb2FkID0gdC5pbnRlcnNlY3Rpb24oW1xuICAgICAgdC50eXBlKHtcbiAgICAgICAgdXNlckdwZ1B1YmxpY0tleTogdC5zdHJpbmcsXG4gICAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogdC5zdHJpbmcsXG4gICAgICAgIHVzZXJNc2cxOiBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgICAgICAgYmFja3VwTXNnMTogRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsXG4gICAgICB9KSxcbiAgICAgIHQudHlwZSh7XG4gICAgICAgIHVzZXJWcmZNc2cxOiBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgICAgICAgYmFja3VwVnJmTXNnMTogRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBSMlBheWxvYWQgPSB0LmludGVyc2VjdGlvbihbXG4gICAgICB0LnR5cGUoeyBzZXNzaW9uSWQ6IHQuc3RyaW5nLCB1c2VyTXNnMjogRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsIGJhY2t1cE1zZzI6IEVkZHNhTVBDdjJTaWduZWRNZXNzYWdlIH0pLFxuICAgICAgdC50eXBlKHtcbiAgICAgICAgdXNlclZyZk1zZzI6IEVkZHNhTVBDdjJTaWduZWRNZXNzYWdlLFxuICAgICAgICBiYWNrdXBWcmZNc2cyOiBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgICAgIH0pLFxuICAgIF0pO1xuXG4gICAgbGV0IGJpdGdvUHJpdmF0ZUtleTogcGdwLlByaXZhdGVLZXk7XG4gICAgbGV0IGJpdGdvUHVibGljS2V5OiBwZ3AuS2V5O1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvR3BnID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgICBiaXRnb1ByaXZhdGVLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb0dwZy5wcml2YXRlS2V5IH0pO1xuICAgICAgYml0Z29QdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvR3BnLnB1YmxpY0tleSB9KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICAvKiogQml0R28ncyBzaWRlIG9mIHRoZSBjZXJlbW9ueTogc2lnbmluZyBES0cgKyBWUkYgREtHLCB2ZXJpZnlpbmcgZXZlcnkgY2xpZW50IHNpZ25hdHVyZSBsaWtlIHRoZSBIU00gZG9lcy4gKi9cbiAgICBhc3luYyBmdW5jdGlvbiBrZXlnZW5XaXRoSHNtUGVlcihcbiAgICAgIGZhdWx0PzogJ2JpdGdvLXZyZi1tc2cxLXNpZ25hdHVyZScgfCAnYml0Z28tdnJmLW9wZW5pbmctc2lnbmF0dXJlJyB8ICdtaXNzaW5nLW9wZW5pbmcnXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGJpdGdvLCBiYXNlQ29pbiwgcG9zdCwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICAgIHNpbm9uLnN0dWIodXRpbHMsICdnZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MnKS5yZXNvbHZlcyh7XG4gICAgICAgIG1wY3YyUHVibGljS2V5OiBiaXRnb1B1YmxpY0tleSxcbiAgICAgICAgZWRkc2FNcGN2MlB1YmxpY0tleTogYml0Z29QdWJsaWNLZXksXG4gICAgICAgIHJlZHBhbGxhc01wY3YyUHVibGljS2V5OiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYml0Z29Ea2cgPSBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgICAgY29uc3QgYml0Z29WcmYgPSBuZXcgTXBzVnJmLlZyZkRrZygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICBsZXQgYml0Z29Nc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHVzZXJHcGdLZXk6IHBncC5LZXkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgYmFja3VwR3BnS2V5OiBwZ3AuS2V5IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHVzZXJDb21taXRtZW50OiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGJhY2t1cENvbW1pdG1lbnQ6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNpZ25Bc0JpdGdvID0gKHBheWxvYWQ6IFVpbnQ4QXJyYXkpID0+IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKHBheWxvYWQsIGJpdGdvUHJpdmF0ZUtleSk7XG4gICAgICBjb25zdCBlbmNyeXB0VG8gPSBhc3luYyAocmVjaXBpZW50OiBwZ3AuS2V5LCBwbGFpbnRleHQ6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPEVkZHNhTVBDdjJTaWduZWRNZXNzYWdlPiA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2lnbmF0dXJlIH0gPSBhd2FpdCBzaWduQXNCaXRnbyhwbGFpbnRleHQpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcGdwLmVuY3J5cHQoe1xuICAgICAgICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBwbGFpbnRleHQgfSksXG4gICAgICAgICAgZW5jcnlwdGlvbktleXM6IHJlY2lwaWVudCxcbiAgICAgICAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBzaWduYXR1cmU6XG4gICAgICAgICAgICBmYXVsdCA9PT0gJ2JpdGdvLXZyZi1vcGVuaW5nLXNpZ25hdHVyZScgPyAoYXdhaXQgc2lnbkFzQml0Z28obmV3IFVpbnQ4QXJyYXkoWzldKSkpLnNpZ25hdHVyZSA6IHNpZ25hdHVyZSxcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIHBvc3QuY2FsbHNGYWtlKCgpID0+ICh7XG4gICAgICAgIHNlbmQ6IChyYXdCb2R5OiB1bmtub3duKSA9PiAoe1xuICAgICAgICAgIHJlc3VsdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGRlY29kZVdpdGhDb2RlYyhLZXlHZW5SZXF1ZXN0LCByYXdCb2R5LCAnRWREU0Ega2V5Z2VuIHJlcXVlc3QnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnR5cGUsIEtleUdlblR5cGVFbnVtLk1QQ3YyKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmN1cnZlVHlwZSwgS2V5Q3VydmVFbnVtLkVkRFNBKTtcbiAgICAgICAgICAgIC8vIFdQIG9ubHkgcmVhZHMgc2FmZUlkIGluIHJvdW5kIDE7IHJvdW5kIDIgaXMgcm91dGVkIGJ5IHRoZSBzdG9yZWQgc2Vzc2lvbi5cbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnNhZmVJZCwgYm9keS5yb3VuZCA9PT0gTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10gPyAnc2FmZS1pZCcgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaCh7IHJvdW5kOiBib2R5LnJvdW5kLCAuLi5ib2R5LnBheWxvYWQgfSk7XG5cbiAgICAgICAgICAgIGlmIChib2R5LnJvdW5kID09PSBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjEnXSkge1xuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlV2l0aENvZGVjKFIxUGF5bG9hZCwgYm9keS5wYXlsb2FkLCAnRWREU0Ega2V5Z2VuIHJvdW5kIDEnKTtcbiAgICAgICAgICAgICAgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcGF5bG9hZC51c2VyR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgICBiYWNrdXBHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHBheWxvYWQuYmFja3VwR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgICBjb25zdCBbdXNlclBrLCBiYWNrdXBQa10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkodXNlckdwZ0tleSksXG4gICAgICAgICAgICAgICAgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYmFja3VwR3BnS2V5KSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIGNvbnN0IFssIGJpdGdvU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGJpdGdvUHJpdmF0ZUtleSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdXNlck1zZzEgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQudXNlck1zZzEsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgICBjb25zdCBiYWNrdXBNc2cxID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShwYXlsb2FkLmJhY2t1cE1zZzEsIGJhY2t1cEdwZ0tleSk7XG4gICAgICAgICAgICAgIC8vIFRoZSBWUkYgbWVzc2FnZXMgbXVzdCBiZSBzaWduZWQgYnkgdGhlIHNhbWUgcGFydHkga2V5IGFzIHVzZXJNc2cxL2JhY2t1cE1zZzEuXG4gICAgICAgICAgICAgIHVzZXJDb21taXRtZW50ID0gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShwYXlsb2FkLnVzZXJWcmZNc2cxLCB1c2VyR3BnS2V5KSk7XG4gICAgICAgICAgICAgIGJhY2t1cENvbW1pdG1lbnQgPSBuZXcgVWludDhBcnJheShhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQuYmFja3VwVnJmTXNnMSwgYmFja3VwR3BnS2V5KSk7XG4gICAgICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UocGF5bG9hZC51c2VyVnJmTXNnMSwgYmFja3VwR3BnS2V5KSk7XG5cbiAgICAgICAgICAgICAgYXdhaXQgYml0Z29Ea2cuaW5pdERrZyhiaXRnb1NrLCBbdXNlclBrLCBiYWNrdXBQa10pO1xuICAgICAgICAgICAgICBjb25zdCBiaXRnb1Jhd01zZzEgPSBiaXRnb0RrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgW2JpdGdvTXNnMl0gPSBiaXRnb0RrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtcbiAgICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlck1zZzEpIH0sXG4gICAgICAgICAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYmFja3VwTXNnMSkgfSxcbiAgICAgICAgICAgICAgICBiaXRnb1Jhd01zZzEsXG4gICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IFtiaXRnb1ZyZkNvbW1pdG1lbnRdID0gKGF3YWl0IGJpdGdvVnJmLmluaXREa2coKSkuYnJvYWRjYXN0TWVzc2FnZXM7XG4gICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFZyZk1zZzEgPSBhd2FpdCBzaWduQXNCaXRnbyhiaXRnb1ZyZkNvbW1pdG1lbnQucGF5bG9hZCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiAnc2Vzc2lvbi1pZCcsXG4gICAgICAgICAgICAgICAgYml0Z29Nc2cxOiBhd2FpdCBzaWduQXNCaXRnbyhiaXRnb1Jhd01zZzEucGF5bG9hZCksXG4gICAgICAgICAgICAgICAgYml0Z29WcmZNc2cxOlxuICAgICAgICAgICAgICAgICAgZmF1bHQgPT09ICdiaXRnby12cmYtbXNnMS1zaWduYXR1cmUnXG4gICAgICAgICAgICAgICAgICAgID8geyAuLi5zaWduZWRWcmZNc2cxLCBtZXNzYWdlOiBCdWZmZXIuZnJvbSgndGFtcGVyZWQnKS50b1N0cmluZygnYmFzZTY0JykgfVxuICAgICAgICAgICAgICAgICAgICA6IHNpZ25lZFZyZk1zZzEsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlV2l0aENvZGVjKFIyUGF5bG9hZCwgYm9keS5wYXlsb2FkLCAnRWREU0Ega2V5Z2VuIHJvdW5kIDInKTtcbiAgICAgICAgICAgIGFzc2VydC5vayh1c2VyR3BnS2V5ICYmIGJhY2t1cEdwZ0tleSAmJiB1c2VyQ29tbWl0bWVudCAmJiBiYWNrdXBDb21taXRtZW50ICYmIGJpdGdvTXNnMik7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKE9iamVjdC5rZXlzKHBheWxvYWQpLnNvcnQoKSwgW1xuICAgICAgICAgICAgICAnYmFja3VwTXNnMicsXG4gICAgICAgICAgICAgICdiYWNrdXBWcmZNc2cyJyxcbiAgICAgICAgICAgICAgJ3Nlc3Npb25JZCcsXG4gICAgICAgICAgICAgICd1c2VyTXNnMicsXG4gICAgICAgICAgICAgICd1c2VyVnJmTXNnMicsXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgY29uc3QgdXNlck1zZzIgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQudXNlck1zZzIsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgYmFja3VwTXNnMiA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UocGF5bG9hZC5iYWNrdXBNc2cyLCBiYWNrdXBHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgdXNlck9wZW5pbmcgPSBuZXcgVWludDhBcnJheShhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQudXNlclZyZk1zZzIsIHVzZXJHcGdLZXkpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhY2t1cE9wZW5pbmcgPSBuZXcgVWludDhBcnJheShhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQuYmFja3VwVnJmTXNnMiwgYmFja3VwR3BnS2V5KSk7XG5cbiAgICAgICAgICAgIGJpdGdvRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW1xuICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlck1zZzIpIH0sXG4gICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KGJhY2t1cE1zZzIpIH0sXG4gICAgICAgICAgICAgIGJpdGdvTXNnMixcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBvcGVuaW5ncyA9IGF3YWl0IGJpdGdvVnJmLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiB1c2VyQ29tbWl0bWVudCB9LFxuICAgICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHBheWxvYWQ6IGJhY2t1cENvbW1pdG1lbnQgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB0b1VzZXIgPSBvcGVuaW5ncy5wMnBNZXNzYWdlcy5maW5kKCh7IHRvIH0pID0+IHRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgICAgICAgICAgY29uc3QgdG9CYWNrdXAgPSBvcGVuaW5ncy5wMnBNZXNzYWdlcy5maW5kKCh7IHRvIH0pID0+IHRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG4gICAgICAgICAgICBhc3NlcnQub2sodG9Vc2VyICYmIHRvQmFja3VwKTtcbiAgICAgICAgICAgIGF3YWl0IGJpdGdvVnJmLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiB1c2VyT3BlbmluZyB9LFxuICAgICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiBiYWNrdXBPcGVuaW5nIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW46IGJpdGdvRGtnLmdldENvbW1vbktleWNoYWluKCksXG4gICAgICAgICAgICAgIGJpdGdvTXNnMjogYXdhaXQgc2lnbkFzQml0Z28oYml0Z29Nc2cyLnBheWxvYWQpLFxuICAgICAgICAgICAgICAuLi4oZmF1bHQgPT09ICdtaXNzaW5nLW9wZW5pbmcnXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDogeyBiaXRnb1ZyZk1zZ1RvVXNlcjogYXdhaXQgZW5jcnlwdFRvKHVzZXJHcGdLZXksIHRvVXNlci5wYXlsb2FkKSB9KSxcbiAgICAgICAgICAgICAgYml0Z29WcmZNc2dUb0JhY2t1cDogYXdhaXQgZW5jcnlwdFRvKGJhY2t1cEdwZ0tleSwgdG9CYWNrdXAucGF5bG9hZCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSkpO1xuXG4gICAgICBhd2FpdCB1dGlscy5jcmVhdGVLZXljaGFpbnMoe1xuICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgc2FmZUlkOiAnc2FmZS1pZCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHJlcXVlc3RzLCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH07XG4gICAgfVxuXG4gICAgaXQoJ3NpZ25zIFZSRiBtZXNzYWdlcyB3aXRoIHRoZSBwYXJ0eSBrZXlzIGFuZCBkZWNyeXB0cyBCaXRHbyBvcGVuaW5ncyB3aXRob3V0IGhhbmRsaW5nIHRoZSBIU00gVlJGIHN0YXRlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyByZXF1ZXN0cywgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gYXdhaXQga2V5Z2VuV2l0aEhzbVBlZXIoKTtcblxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgcmVxdWVzdHMubWFwKCh7IHJvdW5kIH0pID0+IHJvdW5kKSxcbiAgICAgICAgW01QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXV1cbiAgICAgICk7XG4gICAgICAvLyBXUCBrZWVwcyB0aGUgSFNNIFZSRiBzdGF0ZSBiZXR3ZWVuIHJvdW5kcywgc28gbmVpdGhlciBjbGllbnQgcm91bmQgY2FycmllcyBpdC5cbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoJ2JpdGdvRW5jcnlwdGVkVnJmRGtnU3RhdGUnIGluIHJlcXVlc3QsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90aCBjbGllbnQgcm9vdHMgZW5kIHVwIHdpdGggYSBzaWduaW5nIHNoYXJlIGFuZCBhIFZSRiBzaGFyZSwgdGFnZ2VkIHdpdGggdGhlIHNhZmUuXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zLm1hcCgoeyBzb3VyY2UgfSkgPT4gc291cmNlKS5zb3J0KCksIFsnYmFja3VwJywgJ2JpdGdvJywgJ3VzZXInXSk7XG4gICAgICBmb3IgKGNvbnN0IGtleWNoYWluIG9mIGFkZGVkS2V5Y2hhaW5zKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICB9XG4gICAgICAvLyBVc2VyIGFuZCBiYWNrdXAgZWFjaCBlbmNyeXB0IGEgZnVsbCBhbmQgYSByZWR1Y2VkIGVudmVsb3BlOyBldmVyeSBvbmUgY2FycmllcyBhIFZSRiBzaGFyZSwgYW5kXG4gICAgICAvLyB0aGUgdHdvIHBhcnRpZXMnIHNoYXJlcyBkaWZmZXIuIE9yZGVyLWluZGVwZW5kZW50OiB0aGUgcm9vdHMgYXJlIHJlZ2lzdGVyZWQgY29uY3VycmVudGx5LlxuICAgICAgY29uc3QgdnJmU2hhcmVzID0gbmV3IFNldChcbiAgICAgICAgZW5jcnlwdGVkSW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHZyZiwgcHJ2S2V5U2hhcmUgfSA9IGRlY29kZVZyZkVudmVsb3BlKEJ1ZmZlci5mcm9tKGlucHV0LCAnYmFzZTY0JykpO1xuICAgICAgICAgIGFzc2VydC5vayh2cmYubGVuZ3RoID4gMCk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHBydktleVNoYXJlLmxlbmd0aCA+IDApO1xuICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2cmYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzLmxlbmd0aCwgNCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodnJmU2hhcmVzLnNpemUsIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBCaXRHbyBWUkYgcm91bmQgMSBtZXNzYWdlIHdob3NlIHNpZ25hdHVyZSBkb2VzIG5vdCB2ZXJpZnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhrZXlnZW5XaXRoSHNtUGVlcignYml0Z28tdnJmLW1zZzEtc2lnbmF0dXJlJyksIC9zaWduYXR1cmV8dmVyaWZpY2F0aW9ufHNpZ25lZC9pKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgQml0R28gVlJGIG9wZW5pbmcgd2hvc2Ugc2lnbmF0dXJlIGRvZXMgbm90IHZlcmlmeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGtleWdlbldpdGhIc21QZWVyKCdiaXRnby12cmYtb3BlbmluZy1zaWduYXR1cmUnKSwgL3NpZ25hdHVyZXx2ZXJpZmljYXRpb258c2lnbmVkL2kpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhaWxzIHdoZW4gdGhlIEhTTSBvbWl0cyBhIEJpdEdvIFZSRiBvcGVuaW5nIGluIHJvdW5kIDInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhrZXlnZW5XaXRoSHNtUGVlcignbWlzc2luZy1vcGVuaW5nJyksIC9WUkYgbWVzc2FnZSB0byB1c2VyLyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdFZERTQSBzYWZlLWNoaWxkIE1QUyBkZXJpdmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdXNlclNpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgdXNlclZyZlNoYXJlOiBCdWZmZXI7XG4gIGxldCBiaXRnb1NpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29WcmZTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29Qcml2YXRlS2V5OiBwZ3AuUHJpdmF0ZUtleTtcbiAgbGV0IGJpdGdvUHVibGljS2V5OiBwZ3AuS2V5O1xuXG4gIGNvbnN0IHNlc3Npb25JZCA9ICdkZXJpdmUtc2Vzc2lvbic7XG4gIGNvbnN0IGRlcml2YXRpb25JbmRleCA9IDc7XG4gIGNvbnN0IHBhdGggPSBcIm0vNydcIjtcbiAgY29uc3QgUmVxdWVzdCA9IHQuaW50ZXJzZWN0aW9uKFtcbiAgICB0LnR5cGUoeyBlbnRlcnByaXNlOiB0LnN0cmluZywgdHlwZTogdC5zdHJpbmcsIGN1cnZlVHlwZTogdC5zdHJpbmcsIHJvdW5kOiB0LnN0cmluZywgcGF5bG9hZDogdC51bmtub3duIH0pLFxuICAgIHQucGFydGlhbCh7IHNhZmVJZDogdC5zdHJpbmcgfSksXG4gIF0pO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnbmluZyA9IGF3YWl0IE1QU1V0aWwuZ2VuZXJhdGVFZERzYURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IHZyZiA9IGF3YWl0IE1wc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgdXNlclNpZ25pbmdTaGFyZSA9IHNpZ25pbmdbTVBDdjJQYXJ0aWVzRW51bS5VU0VSXS5nZXRLZXlTaGFyZSgpO1xuICAgIGJpdGdvU2lnbmluZ1NoYXJlID0gc2lnbmluZ1tNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXS5nZXRLZXlTaGFyZSgpO1xuICAgIHVzZXJWcmZTaGFyZSA9IHZyZltNUEN2MlBhcnRpZXNFbnVtLlVTRVJdLmdldEtleVNoYXJlKCk7XG4gICAgYml0Z29WcmZTaGFyZSA9IHZyZltNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXS5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJpdGdvR3BnID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgYml0Z29Qcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGcucHJpdmF0ZUtleSB9KTtcbiAgICBiaXRnb1B1YmxpY0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGcucHVibGljS2V5IH0pO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBkZXJpdmVXaXRoUGVlcihcbiAgICBmYXVsdD86ICdyMS1zaWduYXR1cmUnIHwgJ3IyLXNpZ25hdHVyZScgfCAnc2Vzc2lvbicgfCAnY29tbW9uS2V5Y2hhaW4nLFxuICAgIHJlY29yZGVkS2V5Y2hhaW5zPzogQWRkZWRLZXljaGFpblBhcmFtc1tdXG4gICkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH0gPSBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKTtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICBzaW5vbi5zdHViKHV0aWxzLCAnZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzJykucmVzb2x2ZXMoe1xuICAgICAgbXBjdjJQdWJsaWNLZXk6IGJpdGdvUHVibGljS2V5LFxuICAgICAgZWRkc2FNcGN2MlB1YmxpY0tleTogYml0Z29QdWJsaWNLZXksXG4gICAgICByZWRwYWxsYXNNcGN2MlB1YmxpY0tleTogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvUGVlciA9IG5ldyBNcHNEZXJpdmUuRGVyaXZlKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQklUR08sIGJpdGdvU2lnbmluZ1NoYXJlLCBiaXRnb1ZyZlNoYXJlLCBwYXRoKTtcbiAgICBsZXQgYml0Z29Nc2cyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIGxldCB1c2VyR3BnUHVibGljS2V5ID0gJyc7XG4gICAgbGV0IHJvdW5kcyA9IDA7XG4gICAgcG9zdC5jYWxsc0Zha2UoKF91cmw6IHN0cmluZykgPT4gKHtcbiAgICAgIHNlbmQ6IChyYXdCb2R5OiB1bmtub3duKSA9PiAoe1xuICAgICAgICByZXN1bHQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gZGVjb2RlV2l0aENvZGVjKFJlcXVlc3QsIHJhd0JvZHksICdFZERTQSBkZXJpdmUgcmVxdWVzdCcpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChfdXJsLCAnL21wYy9nZW5lcmF0ZWtleScpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmVudGVycHJpc2UsICdlbnRlcnByaXNlLWlkJyk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkudHlwZSwgS2V5R2VuVHlwZUVudW0uTVBDdjIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmN1cnZlVHlwZSwgS2V5Q3VydmVFbnVtLkVkRFNBKTtcbiAgICAgICAgICBpZiAocm91bmRzKysgPT09IDApIHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjEnXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZGVjb2RlV2l0aENvZGVjKEVkZHNhTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0LCBib2R5LnBheWxvYWQsICdFZERTQSBkZXJpdmUgcm91bmQgMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChPYmplY3Qua2V5cyhyZXF1ZXN0KS5zb3J0KCksIFtcbiAgICAgICAgICAgICAgJ2Rlcml2YXRpb25JbmRleCcsXG4gICAgICAgICAgICAgICdwYXJlbnRLZXlJZCcsXG4gICAgICAgICAgICAgICd1c2VyR3BnUHVibGljS2V5JyxcbiAgICAgICAgICAgICAgJ3VzZXJNc2cxJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcXVlc3QucGFyZW50S2V5SWQsICdiaXRnby1yb290LWlkJyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVxdWVzdC5kZXJpdmF0aW9uSW5kZXgsIGRlcml2YXRpb25JbmRleCk7XG4gICAgICAgICAgICB1c2VyR3BnUHVibGljS2V5ID0gcmVxdWVzdC51c2VyR3BnUHVibGljS2V5O1xuICAgICAgICAgICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcmVxdWVzdC51c2VyR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHJlcXVlc3QudXNlck1zZzEsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgYml0Z29GaXJzdCA9IGF3YWl0IGJpdGdvUGVlci5pbml0RGVyaXZlKCk7XG4gICAgICAgICAgICBjb25zdCBbb3V0Z29pbmddID0gYml0Z29QZWVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW1xuICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlclBheWxvYWQpIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGFzc2VydC5vayhvdXRnb2luZyk7XG4gICAgICAgICAgICBiaXRnb01zZzIgPSBvdXRnb2luZy5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmVkID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYml0Z29GaXJzdC5wYXlsb2FkKSwgYml0Z29Qcml2YXRlS2V5KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgYml0Z29Nc2cxOlxuICAgICAgICAgICAgICAgIGZhdWx0ID09PSAncjEtc2lnbmF0dXJlJyA/IHsgLi4uc2lnbmVkLCBtZXNzYWdlOiBCdWZmZXIuZnJvbSgndGFtcGVyZWQnKS50b1N0cmluZygnYmFzZTY0JykgfSA6IHNpZ25lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyb3VuZHMsIDIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjInXSk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkuc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBkZWNvZGVXaXRoQ29kZWMoRWRkc2FNUEN2MkRlcml2ZVJvdW5kMlJlcXVlc3QsIGJvZHkucGF5bG9hZCwgJ0VkRFNBIGRlcml2ZSByb3VuZCAyJyk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChPYmplY3Qua2V5cyhyZXF1ZXN0KS5zb3J0KCksIFsnc2Vzc2lvbklkJywgJ3VzZXJNc2cyJ10pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXF1ZXN0LnNlc3Npb25JZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoXG4gICAgICAgICAgICByZXF1ZXN0LnVzZXJNc2cyLFxuICAgICAgICAgICAgYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHVibGljS2V5IH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgICAgYml0Z29QZWVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3sgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheSh1c2VyUGF5bG9hZCkgfV0pLFxuICAgICAgICAgICAgW11cbiAgICAgICAgICApO1xuICAgICAgICAgIGFzc2VydC5vayhiaXRnb01zZzIpO1xuICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJpdGdvTXNnMiksIGJpdGdvUHJpdmF0ZUtleSk7XG4gICAgICAgICAgY29uc3QgY29tbW9uUHVibGljS2V5Y2hhaW4gPSBiaXRnb1BlZXIuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBmYXVsdCA9PT0gJ3Nlc3Npb24nID8gJ2RpZmZlcmVudC1zZXNzaW9uJyA6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluOlxuICAgICAgICAgICAgICBmYXVsdCA9PT0gJ2NvbW1vbktleWNoYWluJ1xuICAgICAgICAgICAgICAgID8gYCR7Y29tbW9uUHVibGljS2V5Y2hhaW4uc2xpY2UoMCwgLTEpfSR7Y29tbW9uUHVibGljS2V5Y2hhaW4uZW5kc1dpdGgoJzAnKSA/ICcxJyA6ICcwJ31gXG4gICAgICAgICAgICAgICAgOiBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICAgICAgIGJpdGdvTXNnMjpcbiAgICAgICAgICAgICAgZmF1bHQgPT09ICdyMi1zaWduYXR1cmUnID8geyAuLi5zaWduZWQsIG1lc3NhZ2U6IEJ1ZmZlci5mcm9tKCd0YW1wZXJlZCcpLnRvU3RyaW5nKCdiYXNlNjQnKSB9IDogc2lnbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgICAgcGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIHNhZmVJZDogJ3NhZmUtaWQnLFxuICAgICAgICBwYXJlbnRLZXlJZDogJ2JpdGdvLXJvb3QtaWQnLFxuICAgICAgICBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICAgIHVzZXJSb290S2V5SWQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBiYWNrdXBSb290S2V5SWQ6ICdiYWNrdXAtcm9vdC1pZCcsXG4gICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJTaWduaW5nU2hhcmUsXG4gICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHVzZXJWcmZTaGFyZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgcmVzdWx0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zLCBiaXRnb1BlZXIsIHJvdW5kcyB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRlZEtleWNoYWlucz8ucHVzaCguLi5hZGRlZEtleWNoYWlucyk7XG4gICAgfVxuICB9XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdyZWdpc3RlcnMgdGhlIGNoaWxkIHNpZ25pbmcgc2hhcmUgYW5kIHR3byBwdWJsaWMtb25seSBwbGFjZWhvbGRlcnMgYWZ0ZXIgdGhlIHNpZ25lZCBjZXJlbW9ueScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHJlc3VsdCwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucywgYml0Z29QZWVyLCByb3VuZHMgfSA9IGF3YWl0IGRlcml2ZVdpdGhQZWVyKCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJvdW5kcywgMik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucy5tYXAoKHsgc291cmNlIH0pID0+IHNvdXJjZSkuc29ydCgpLCBbJ2JhY2t1cCcsICdiaXRnbycsICd1c2VyJ10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICBbcmVzdWx0LnVzZXJLZXljaGFpbi5pZCwgcmVzdWx0LmJhY2t1cEtleWNoYWluLmlkLCByZXN1bHQuYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICBbJ3VzZXItY2hpbGQnLCAnYmFja3VwLWNoaWxkJywgJ2JpdGdvLWNoaWxkJ11cbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5Y2hhaW4gb2YgYWRkZWRLZXljaGFpbnMpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCwgcGF0aCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJpdGdvUGVlci5nZXRDb21tb25LZXljaGFpbigpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5rZXlUeXBlLCAndHNzJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uaXNNUEN2MiwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJDaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ3VzZXInKTtcbiAgICBjb25zdCBiYWNrdXBDaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ2JhY2t1cCcpO1xuICAgIGNvbnN0IGJpdGdvQ2hpbGQgPSBhZGRlZEtleWNoYWlucy5maW5kKCh7IHNvdXJjZSB9KSA9PiBzb3VyY2UgPT09ICdiaXRnbycpO1xuICAgIGFzc2VydC5vayh1c2VyQ2hpbGQpO1xuICAgIGFzc2VydC5vayhiYWNrdXBDaGlsZCk7XG4gICAgYXNzZXJ0Lm9rKGJpdGdvQ2hpbGQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQucGFyZW50LCAndXNlci1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhY2t1cENoaWxkLnBhcmVudCwgJ2JhY2t1cC1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJpdGdvQ2hpbGQucGFyZW50LCAnYml0Z28tcm9vdC1pZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMubGVuZ3RoLCAyKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodXNlckNoaWxkLmVuY3J5cHRlZFBydiwgYGVuY3J5cHRlZDoke2VuY3J5cHRlZElucHV0c1swXX1gKTtcbiAgICBjb25zdCBzaWduaW5nU2hhcmUgPSBCdWZmZXIuZnJvbShyZXN1bHQudXNlcktleWNoYWluLmVuY3J5cHRlZFBydj8uc2xpY2UoJ2VuY3J5cHRlZDonLmxlbmd0aCkgPz8gJycsICdiYXNlNjQnKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNpZ25pbmdTaGFyZSwgQnVmZmVyLmZyb20oZW5jcnlwdGVkSW5wdXRzWzBdLCAnYmFzZTY0JykpO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwoc2lnbmluZ1NoYXJlLCB1c2VyU2lnbmluZ1NoYXJlKTtcbiAgICBhc3NlcnQubm90RGVlcFN0cmljdEVxdWFsKHNpZ25pbmdTaGFyZSwgYml0Z29QZWVyLmdldEtleVNoYXJlKCkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQucmVkdWNlZEVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVzdWx0LnVzZXJLZXljaGFpbi5yZWR1Y2VkRW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhyZWR1Y2VkKTtcbiAgICBjb25zdCByZWR1Y2VkU2hhcmUgPSBNUFNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKEJ1ZmZlci5mcm9tKHJlZHVjZWQuc2xpY2UoJ2VuY3J5cHRlZDonLmxlbmd0aCksICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWR1Y2VkU2hhcmUua2V5U2hhcmUpLCBzaWduaW5nU2hhcmUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWR1Y2VkU2hhcmUucHViKS50b1N0cmluZygnaGV4JyksIGJpdGdvUGVlci5nZXRDb21tb25LZXljaGFpbigpLnNsaWNlKDAsIDY0KSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNvZGVWcmZFbnZlbG9wZShzaWduaW5nU2hhcmUpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2hpbGQuZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiaXRnb0NoaWxkLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgaW5kZXhlcyBvdXRzaWRlIHRoZSBoYXJkZW5lZCBTYWZlIHJhbmdlIGJlZm9yZSBjb250YWN0aW5nIFdQJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FWcmZNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHV0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgIHBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICBzYWZlSWQ6ICdzYWZlLWlkJyxcbiAgICAgICAgcGFyZW50S2V5SWQ6ICdiaXRnby1yb290LWlkJyxcbiAgICAgICAgZGVyaXZhdGlvbkluZGV4OiAweDgwMDAwMDAwLFxuICAgICAgICB1c2VyUm9vdEtleUlkOiAndXNlci1yb290LWlkJyxcbiAgICAgICAgYmFja3VwUm9vdEtleUlkOiAnYmFja3VwLXJvb3QtaWQnLFxuICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyU2lnbmluZ1NoYXJlLFxuICAgICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyVnJmU2hhcmUsXG4gICAgICB9KSxcbiAgICAgIC9kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoL1xuICAgICk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBvc3QuY2FsbGVkLCBmYWxzZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucywgW10pO1xuICB9KTtcblxuICBjb25zdCBmYXVsdHM6IEFycmF5PCdyMS1zaWduYXR1cmUnIHwgJ3IyLXNpZ25hdHVyZScgfCAnc2Vzc2lvbicgfCAnY29tbW9uS2V5Y2hhaW4nPiA9IFtcbiAgICAncjEtc2lnbmF0dXJlJyxcbiAgICAncjItc2lnbmF0dXJlJyxcbiAgICAnc2Vzc2lvbicsXG4gICAgJ2NvbW1vbktleWNoYWluJyxcbiAgXTtcbiAgZm9yIChjb25zdCBmYXVsdCBvZiBmYXVsdHMpIHtcbiAgICBpdChgcmVqZWN0cyAke2ZhdWx0fSBiZWZvcmUgcmVnaXN0ZXJpbmcgYW55IGNoaWxkYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjb3JkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGRlcml2ZVdpdGhQZWVyKGZhdWx0LCByZWNvcmRlZEtleWNoYWlucyksXG4gICAgICAgIGZhdWx0ID09PSAnc2Vzc2lvbidcbiAgICAgICAgICA/IC9zZXNzaW9uIGlkL2lcbiAgICAgICAgICA6IGZhdWx0ID09PSAnY29tbW9uS2V5Y2hhaW4nXG4gICAgICAgICAgPyAvY29tbW9uIGtleWNoYWluL2lcbiAgICAgICAgICA6IC9zaWduYXR1cmV8dmVyaWZpY2F0aW9ufHNpZ25lZC9pXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWNvcmRlZEtleWNoYWlucywgW10pO1xuICAgIH0pO1xuICB9XG59KTtcbiJdfQ==
|