@bitgo-beta/bitgo 14.2.1-beta.2207 → 14.2.1-beta.2209
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/browser/{a02589640e9e719bb4ff.module.wasm → 3b44c44f53e243925ddb.module.wasm} +0 -0
- package/dist/browser/BitGoJS.min.js +2 -2
- package/dist/package.json +94 -94
- package/dist/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createKeychains.js +75 -39
- package/dist/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createSafeChildKeychains.js +75 -25
- package/dist/test/v2/unit/internal/tssUtils/eddsa.js +39 -1
- package/dist/test/v2/unit/wallet.js +42 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +94 -94
- package/npm-shrinkwrap.json +0 -22262
|
@@ -10,10 +10,12 @@ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
|
10
10
|
const src_1 = require("../../../../../../src");
|
|
11
11
|
const SAFE_ID = '6fa8537e3ef5a878fd3ae899f3ab7e5a';
|
|
12
12
|
const USER_ROOT_KEY_ID = 'root-user-key-id';
|
|
13
|
-
const
|
|
13
|
+
const ACCOUNT = 0;
|
|
14
14
|
const BITGO_ROOT_KEY_ID = 'root-bitgo-key-id';
|
|
15
15
|
const BACKUP_ROOT_KEY_ID = 'root-backup-key-id';
|
|
16
|
-
|
|
16
|
+
// hteth: coinType 60, ecdsaMpc slot 3.
|
|
17
|
+
const childPath = (account) => (0, sdk_core_1.buildSafeBip44Path)(60, 'ecdsaMpc', account);
|
|
18
|
+
const derivePathBytes = (account) => sdk_lib_mpc_1.DklsVrfUtils.buildSafeMpcDerivePath({ coinType: 60, safeSlotOrdinal: 3, accountIndex: account });
|
|
17
19
|
describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async function () {
|
|
18
20
|
const coinName = 'hteth';
|
|
19
21
|
const enterpriseId = '6449153a6f6bc20006d66771cdbe15d3';
|
|
@@ -64,7 +66,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
64
66
|
it('should derive the user child and register the backup without encryptedPrv', async function () {
|
|
65
67
|
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
66
68
|
const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
67
|
-
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(),
|
|
69
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), derivePathBytes(ACCOUNT));
|
|
68
70
|
const round1Nock = await nockDeriveRound1(bitgoPair);
|
|
69
71
|
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
70
72
|
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
@@ -74,7 +76,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
74
76
|
enterprise: enterpriseId,
|
|
75
77
|
safeId: SAFE_ID,
|
|
76
78
|
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
77
|
-
|
|
79
|
+
path: childPath(ACCOUNT),
|
|
78
80
|
userRootKeyId: USER_ROOT_KEY_ID,
|
|
79
81
|
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
80
82
|
userRootKeyShare: userRoot.getKeyShare(),
|
|
@@ -99,12 +101,11 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
99
101
|
assert.equal(userChildShare.party_id, 0);
|
|
100
102
|
assert.ok(userChildShare.s_i);
|
|
101
103
|
});
|
|
102
|
-
it('should derive at a non-zero
|
|
104
|
+
it('should derive at a non-zero account and agree with the server', async function () {
|
|
103
105
|
const idx = 7;
|
|
104
|
-
const path = new Uint8Array([0x80 | (idx >>> 24), 0, 0, idx]);
|
|
105
106
|
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
106
107
|
const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
107
|
-
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(),
|
|
108
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), derivePathBytes(idx));
|
|
108
109
|
const round1Nock = await nockDeriveRound1(bitgoPair, 1, idx);
|
|
109
110
|
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
110
111
|
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
@@ -114,7 +115,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
114
115
|
enterprise: enterpriseId,
|
|
115
116
|
safeId: SAFE_ID,
|
|
116
117
|
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
117
|
-
|
|
118
|
+
path: childPath(idx),
|
|
118
119
|
userRootKeyId: USER_ROOT_KEY_ID,
|
|
119
120
|
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
120
121
|
userRootKeyShare: userRoot.getKeyShare(),
|
|
@@ -127,10 +128,57 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
127
128
|
assert.equal(userKeychain.commonKeychain, backupKeychain.commonKeychain);
|
|
128
129
|
assert.equal(bitgoKeychain.commonKeychain, userKeychain.commonKeychain);
|
|
129
130
|
});
|
|
130
|
-
it('
|
|
131
|
+
it('lands on the same child key that offline recovery derives at the same path', async function () {
|
|
132
|
+
const [userRoot, backupRoot, bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
133
|
+
const [vrfUser, vrfBackup, vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
134
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), derivePathBytes(5));
|
|
135
|
+
await nockDeriveRound1(bitgoPair, 1, 5);
|
|
136
|
+
await nockDeriveRound2(bitgoPair);
|
|
137
|
+
await nockDeriveRound3(bitgoPair);
|
|
138
|
+
await nockAddChildKey(coinName, 3, 5);
|
|
139
|
+
const { userKeychain } = await tssUtils.createSafeChildKeychains({
|
|
140
|
+
passphrase: 'test',
|
|
141
|
+
enterprise: enterpriseId,
|
|
142
|
+
safeId: SAFE_ID,
|
|
143
|
+
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
144
|
+
path: childPath(5),
|
|
145
|
+
userRootKeyId: USER_ROOT_KEY_ID,
|
|
146
|
+
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
147
|
+
userRootKeyShare: userRoot.getKeyShare(),
|
|
148
|
+
userRootVrfKeyShare: vrfUser.getKeyShare(),
|
|
149
|
+
});
|
|
150
|
+
const recovered = await sdk_lib_mpc_1.DklsVrfUtils.deriveSafeEcdsaMpcChild({
|
|
151
|
+
userRoot: { signing: userRoot.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
|
|
152
|
+
backupRoot: { signing: backupRoot.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
|
|
153
|
+
account: 5,
|
|
154
|
+
coinType: 60,
|
|
155
|
+
safeSlotOrdinal: 3,
|
|
156
|
+
});
|
|
157
|
+
assert.equal(userKeychain.commonKeychain, recovered.commonKeychain);
|
|
158
|
+
});
|
|
159
|
+
for (const badPath of ["m/0'", 'm/44/60/3/0', "m/44'/60'/9'/0'"]) {
|
|
160
|
+
it(`rejects the non-BIP44 path ${JSON.stringify(badPath)} before any request`, async function () {
|
|
161
|
+
const [userRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
162
|
+
const [vrfUser] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
163
|
+
const scope = nock(bgUrl).post('/api/v2/mpc/generatekey').reply(500);
|
|
164
|
+
await assert.rejects(() => tssUtils.createSafeChildKeychains({
|
|
165
|
+
passphrase: 'test',
|
|
166
|
+
enterprise: enterpriseId,
|
|
167
|
+
safeId: SAFE_ID,
|
|
168
|
+
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
169
|
+
path: badPath,
|
|
170
|
+
userRootKeyId: USER_ROOT_KEY_ID,
|
|
171
|
+
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
172
|
+
userRootKeyShare: userRoot.getKeyShare(),
|
|
173
|
+
userRootVrfKeyShare: vrfUser.getKeyShare(),
|
|
174
|
+
}), /Invalid safe BIP44 path/);
|
|
175
|
+
assert.ok(!scope.isDone(), 'no derive round may be sent for a non-BIP44 path');
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
it('registers the BitGo child placeholder with the BIP44 path and no private material', async function () {
|
|
131
179
|
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
132
180
|
const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
133
|
-
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(),
|
|
181
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), derivePathBytes(ACCOUNT));
|
|
134
182
|
await nockDeriveRound1(bitgoPair);
|
|
135
183
|
await nockDeriveRound2(bitgoPair);
|
|
136
184
|
await nockDeriveRound3(bitgoPair);
|
|
@@ -147,7 +195,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
147
195
|
enterprise: enterpriseId,
|
|
148
196
|
safeId: SAFE_ID,
|
|
149
197
|
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
150
|
-
|
|
198
|
+
path: childPath(ACCOUNT),
|
|
151
199
|
userRootKeyId: USER_ROOT_KEY_ID,
|
|
152
200
|
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
153
201
|
userRootKeyShare: userRoot.getKeyShare(),
|
|
@@ -160,12 +208,12 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
160
208
|
// Same common keychain across all three child registrations.
|
|
161
209
|
assert.equal(bitgoBody.commonKeychain, userBody.commonKeychain);
|
|
162
210
|
assert.equal(bitgoBody.commonKeychain, bitgoKeychain.commonKeychain);
|
|
163
|
-
// All child paths are hardened.
|
|
164
|
-
assert.equal(userBody.derivedFromParentWithPath, "m/0'");
|
|
211
|
+
// All child paths are the hardened BIP44 path.
|
|
212
|
+
assert.equal(userBody.derivedFromParentWithPath, "m/44'/60'/3'/0'");
|
|
165
213
|
assert.equal(userBody.parent, USER_ROOT_KEY_ID);
|
|
166
214
|
const backupBody = addKeyBodies.find((body) => body.source === 'backup');
|
|
167
215
|
assert.ok(backupBody, 'expected a backup child registration');
|
|
168
|
-
assert.equal(backupBody.derivedFromParentWithPath, "m/0'");
|
|
216
|
+
assert.equal(backupBody.derivedFromParentWithPath, "m/44'/60'/3'/0'");
|
|
169
217
|
assert.equal(backupBody.parent, BACKUP_ROOT_KEY_ID);
|
|
170
218
|
// Exact wire body: public-only placeholder with no private material.
|
|
171
219
|
assert.deepEqual(bitgoBody, {
|
|
@@ -175,13 +223,13 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
175
223
|
commonKeychain: userBody.commonKeychain,
|
|
176
224
|
safeId: SAFE_ID,
|
|
177
225
|
parent: BITGO_ROOT_KEY_ID,
|
|
178
|
-
derivedFromParentWithPath: "m/0'",
|
|
226
|
+
derivedFromParentWithPath: "m/44'/60'/3'/0'",
|
|
179
227
|
});
|
|
180
228
|
});
|
|
181
229
|
it('should reject root key material that is not a valid VRF envelope', async function () {
|
|
182
230
|
const [, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
183
231
|
const [, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
184
|
-
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(),
|
|
232
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), derivePathBytes(ACCOUNT));
|
|
185
233
|
const round1Nock = await nockDeriveRound1(bitgoPair);
|
|
186
234
|
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
187
235
|
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
@@ -190,7 +238,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
190
238
|
enterprise: enterpriseId,
|
|
191
239
|
safeId: SAFE_ID,
|
|
192
240
|
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
193
|
-
|
|
241
|
+
path: childPath(ACCOUNT),
|
|
194
242
|
userRootKeyId: USER_ROOT_KEY_ID,
|
|
195
243
|
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
196
244
|
userRootKeyShare: Buffer.from('garbage'),
|
|
@@ -203,7 +251,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
203
251
|
it('should reject a root blob with a VRF partyId mismatch', async function () {
|
|
204
252
|
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
205
253
|
const [, vrfBackup, vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
206
|
-
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(),
|
|
254
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), derivePathBytes(ACCOUNT));
|
|
207
255
|
const round1Nock = await nockDeriveRound1(bitgoPair);
|
|
208
256
|
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
209
257
|
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
@@ -212,7 +260,7 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
212
260
|
enterprise: enterpriseId,
|
|
213
261
|
safeId: SAFE_ID,
|
|
214
262
|
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
215
|
-
|
|
263
|
+
path: childPath(ACCOUNT),
|
|
216
264
|
userRootKeyId: USER_ROOT_KEY_ID,
|
|
217
265
|
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
218
266
|
userRootKeyShare: userRoot.getKeyShare(),
|
|
@@ -232,12 +280,14 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
232
280
|
nock(bgUrl).get(`/api/v2/${coin}/tss/pubkey`).query({ enterpriseId }).reply(200, bitgoGPGPublicKeyResponse);
|
|
233
281
|
return bitgoGPGPublicKeyResponse;
|
|
234
282
|
}
|
|
235
|
-
async function nockDeriveRound1(bitgoPair, times = 1,
|
|
283
|
+
async function nockDeriveRound1(bitgoPair, times = 1, account = ACCOUNT) {
|
|
236
284
|
return nock(bgUrl)
|
|
237
285
|
.post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R1' &&
|
|
238
286
|
body.safeId === SAFE_ID &&
|
|
239
287
|
body.payload?.parentKeyId === BITGO_ROOT_KEY_ID &&
|
|
240
|
-
body.
|
|
288
|
+
body.coin === coinName &&
|
|
289
|
+
body.payload?.path === childPath(account) &&
|
|
290
|
+
body.payload?.derivationIndex === undefined &&
|
|
241
291
|
body.payload?.userGpgPublicKey &&
|
|
242
292
|
body.payload?.userMsg1 &&
|
|
243
293
|
body.payload?.backupGpgPublicKey === undefined &&
|
|
@@ -307,15 +357,15 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
307
357
|
});
|
|
308
358
|
}
|
|
309
359
|
/**
|
|
310
|
-
* Nocks the
|
|
360
|
+
* Nocks the BIP44 child key registrations.
|
|
311
361
|
*/
|
|
312
|
-
async function nockAddChildKey(coin, times = 3,
|
|
362
|
+
async function nockAddChildKey(coin, times = 3, account = ACCOUNT) {
|
|
313
363
|
return nock('https://bitgo.fakeurl')
|
|
314
364
|
.post(`/api/v2/${coin}/key`, (body) => body.keyType === 'tss' &&
|
|
315
365
|
body.isMPCv2 === true &&
|
|
316
366
|
body.safeId === SAFE_ID &&
|
|
317
367
|
!!body.parent &&
|
|
318
|
-
body.derivedFromParentWithPath ===
|
|
368
|
+
body.derivedFromParentWithPath === childPath(account))
|
|
319
369
|
.times(times)
|
|
320
370
|
.reply(200, (uri, requestBody) => ({
|
|
321
371
|
id: requestBody.source,
|
|
@@ -326,4 +376,4 @@ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async funct
|
|
|
326
376
|
}));
|
|
327
377
|
}
|
|
328
378
|
});
|
|
329
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2VjZHNhVnJmTVBDdjIvY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDZCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLG1EQUE2RDtBQUM3RCxtREFBc0Y7QUFDdEYseURBQWlHO0FBR2pHLCtDQUFpRTtBQUVqRSxNQUFNLE9BQU8sR0FBRyxrQ0FBa0MsQ0FBQztBQUNuRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFekQsUUFBUSxDQUFDLDBEQUEwRCxFQUFFLEtBQUs7SUFDeEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxDQUFDO0lBQ3hELElBQUksS0FBYSxDQUFDO0lBQ2xCLElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLFFBQXVDLENBQUM7SUFDNUMsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxXQUVILENBQUM7SUFDRixJQUFJLFNBQTJFLENBQUM7SUFDaEYsSUFBSSxjQUFtRCxDQUFDO0lBQ3hELElBQUksYUFBa0QsQ0FBQztJQUN2RCxJQUFJLGVBQW1FLENBQUM7SUFFeEUsTUFBTSxDQUFDLEtBQUs7UUFDVixPQUFPLENBQUMsTUFBTSxDQUFD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QUMsWUFBWTtTQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnY2Jvci14JztcblxuaW1wb3J0IHsgVGVzdGFibGVCRywgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBjb21tb24sIEVDRFNBVXRpbHMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IERrbHNDb21tcywgRGtsc0RydiwgRGtsc1R5cGVzLCBEa2xzVXRpbHMsIERrbHNWcmZVdGlscyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IE1QQ3YyRGVyaXZlUm91bmQxUmVxdWVzdCwgTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0LCBNUEN2MkRlcml2ZVJvdW5kM1JlcXVlc3QgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHsgQml0R28sIEJpdGdvR1BHUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjJztcblxuY29uc3QgU0FGRV9JRCA9ICc2ZmE4NTM3ZTNlZjVhODc4ZmQzYWU4OTlmM2FiN2U1YSc7XG5jb25zdCBVU0VSX1JPT1RfS0VZX0lEID0gJ3Jvb3QtdXNlci1rZXktaWQnO1xuY29uc3QgREVSSVZBVElPTl9JTkRFWCA9IDA7XG5jb25zdCBCSVRHT19ST09UX0tFWV9JRCA9ICdyb290LWJpdGdvLWtleS1pZCc7XG5jb25zdCBCQUNLVVBfUk9PVF9LRVlfSUQgPSAncm9vdC1iYWNrdXAta2V5LWlkJztcbmNvbnN0IFBBVEhfTTAgPSBuZXcgVWludDhBcnJheShbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0pO1xuXG5kZXNjcmliZSgnVFNTIEVDRFNBIHNhZmUgY2hpbGQga2V5Y2hhaW5zICh1c2VyL0JpdEdvIGhhcmQgZGVyaXZlKTonLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5OYW1lID0gJ2h0ZXRoJztcbiAgY29uc3QgZW50ZXJwcmlzZUlkID0gJzY0NDkxNTNhNmY2YmMyMDAwNmQ2Njc3MWNkYmUxNWQzJztcbiAgbGV0IGJnVXJsOiBzdHJpbmc7XG4gIGxldCBiaXRnbzogVGVzdGFibGVCRyAmIEJpdEdvO1xuICBsZXQgdHNzVXRpbHM6IEVDRFNBVXRpbHMuRWNkc2FWcmZNUEN2MlV0aWxzO1xuICBsZXQgd2FsbGV0OiBXYWxsZXQ7XG4gIGxldCBiaXRHb0dwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+ICYge1xuICAgIHJldm9jYXRpb25DZXJ0aWZpY2F0ZTogc3RyaW5nO1xuICB9O1xuICBsZXQgY29uc3RhbnRzOiB7IG1wYzogeyBiaXRnb1B1YmxpY0tleTogc3RyaW5nOyBiaXRnb01QQ3YyUHVibGljS2V5OiBzdHJpbmcgfSB9O1xuICBsZXQgYml0Z29HcGdQcnZLZXk6IHsgcGFydHlJZDogbnVtYmVyOyBncGdLZXk6IHN0cmluZyB9O1xuICBsZXQgdXNlckdwZ1B1YktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG4gIGxldCBzdGFnZWRCaXRnb01zZzI6IHsgbWVzc2FnZTogc3RyaW5nOyBzaWduYXR1cmU6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgb3BlbnBncC5jb25maWcucmVqZWN0Q3VydmVzID0gbmV3IFNldCgpO1xuICAgIGJpdEdvR3BnS2V5ID0gYXdhaXQgb3BlbnBncC5nZW5lcmF0ZUtleSh7XG4gICAgICB1c2VySURzOiBbeyBuYW1lOiAnYml0Z28nLCBlbWFpbDogJ2JpdGdvQHRlc3QuY29tJyB9XSxcbiAgICAgIGN1cnZlOiAnc2VjcDI1NmsxJyxcbiAgICB9KTtcbiAgICBjb25zdGFudHMgPSB7XG4gICAgICBtcGM6IHtcbiAgICAgICAgYml0Z29QdWJsaWNLZXk6IGJpdEdvR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgICAgYml0Z29NUEN2MlB1YmxpY0tleTogYml0R29HcGdLZXkucHVibGljS2V5LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGJpdGdvR3BnUHJ2S2V5ID0geyBwYXJ0eUlkOiAyLCBncGdLZXk6IGJpdEdvR3BnS2V5LnByaXZhdGVLZXkgfTtcblxuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0udXJpO1xuXG4gICAgY29uc3QgYmFzZUNvaW4gPSBiaXRnby5jb2luKGNvaW5OYW1lKTtcbiAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlQ29pbiwge1xuICAgICAgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICBjb2luOiBjb2luTmFtZSxcbiAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgIH0pO1xuICAgIHRzc1V0aWxzID0gbmV3IEVDRFNBVXRpbHMuRWNkc2FWcmZNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0KTtcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIHN0YWdlZEJpdGdvTXNnMiA9IHVuZGVmaW5lZDtcbiAgICBhd2FpdCBub2NrR2V0Qml0Z29QdWJsaWNLZXlCYXNlZE9uRmVhdHVyZUZsYWdzKGNvaW5OYW1lLCBlbnRlcnByaXNlSWQsIGJpdEdvR3BnS2V5KTtcbiAgICBub2NrKGJnVXJsKS5nZXQoJy9hcGkvdjEvY2xpZW50L2NvbnN0YW50cycpLnRpbWVzKDMyKS5yZXBseSgyMDAsIHsgdHRsOiAzNjAwLCBjb25zdGFudHMgfSk7XG4gIH0pO1xuXG4gIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVyaXZlIHRoZSB1c2VyIGNoaWxkIGFuZCByZWdpc3RlciB0aGUgYmFja3VwIHdpdGhvdXQgZW5jcnlwdGVkUHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFt1c2VyUm9vdCwgLCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgW3ZyZlVzZXIsICwgdnJmQml0Z29dID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgYml0Z29QYWlyID0gbmV3IERrbHNEcnYuRGVyaXZlKDMsIDIsIDIsIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLCB2cmZCaXRnby5nZXRLZXlTaGFyZSgpLCBQQVRIX00wKTtcblxuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQyTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXIpO1xuICAgIGNvbnN0IGFkZEtleU5vY2sgPSBhd2FpdCBub2NrQWRkQ2hpbGRLZXkoY29pbk5hbWUpO1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBhd2FpdCB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgZGVyaXZhdGlvbkluZGV4OiBERVJJVkFUSU9OX0lOREVYLFxuICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgdXNlclJvb3RLZXlTaGFyZTogdXNlclJvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSxcbiAgICB9KTtcblxuICAgIGFzc2VydC5vayhyb3VuZDFOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQyTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKHJvdW5kM05vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhhZGRLZXlOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCBiYWNrdXBLZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvS2V5Y2hhaW4uc291cmNlLCAnYml0Z28nKTtcbiAgICBhc3NlcnQuZXF1YWwoYml0Z29LZXljaGFpbi5lbmNyeXB0ZWRQcnYsIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbiwgRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKGJpdGdvUGFpci5nZXRLZXlTaGFyZSgpKSk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICBhc3NlcnQub2soZW5jcnlwdGVkVXNlclBydik7XG4gICAgYXNzZXJ0LmVxdWFsKGJhY2t1cEtleWNoYWluLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBkZWNyeXB0ZWRVc2VyUHJ2ID0gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRVc2VyUHJ2LCBwYXNzd29yZDogJ3Rlc3QnIH0pO1xuICAgIGNvbnN0IHVzZXJDaGlsZFNoYXJlID0gZGVjb2RlKEJ1ZmZlci5mcm9tKGRlY3J5cHRlZFVzZXJQcnYsICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJDaGlsZFNoYXJlLnZlcnNpb24sIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJDaGlsZFNoYXJlLnZyZiwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUucGFydHlfaWQsIDApO1xuICAgIGFzc2VydC5vayh1c2VyQ2hpbGRTaGFyZS5zX2kpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlcml2ZSBhdCBhIG5vbi16ZXJvIGhhcmRlbmVkIGluZGV4IGFuZCBhZ3JlZSB3aXRoIHRoZSBzZXJ2ZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaWR4ID0gNztcbiAgICBjb25zdCBwYXRoID0gbmV3IFVpbnQ4QXJyYXkoWzB4ODAgfCAoaWR4ID4+PiAyNCksIDAsIDAsIGlkeF0pO1xuICAgIGNvbnN0IFt1c2VyUm9vdCwgLCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgW3ZyZlVzZXIsICwgdnJmQml0Z29dID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgYml0Z29QYWlyID0gbmV3IERrbHNEcnYuRGVyaXZlKDMsIDIsIDIsIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLCB2cmZCaXRnby5nZXRLZXlTaGFyZSgpLCBwYXRoKTtcblxuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpciwgMSwgaWR4KTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG4gICAgY29uc3QgYWRkS2V5Tm9jayA9IGF3YWl0IG5vY2tBZGRDaGlsZEtleShjb2luTmFtZSwgMywgaWR4KTtcblxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0gYXdhaXQgdHNzVXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIHNhZmVJZDogU0FGRV9JRCxcbiAgICAgIHBhcmVudEtleUlkOiBCSVRHT19ST09UX0tFWV9JRCxcbiAgICAgIGRlcml2YXRpb25JbmRleDogaWR4LFxuICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgdXNlclJvb3RLZXlTaGFyZTogdXNlclJvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSxcbiAgICB9KTtcblxuICAgIGFzc2VydC5vayhyb3VuZDFOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQyTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKHJvdW5kM05vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhhZGRLZXlOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCBiYWNrdXBLZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gIH0pO1xuXG4gIGl0KCdyZWdpc3RlcnMgdGhlIEJpdEdvIGNoaWxkIHBsYWNlaG9sZGVyIHdpdGggdGhlIGhhcmRlbmVkIHBhdGggYW5kIG5vIHByaXZhdGUgbWF0ZXJpYWwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIFBBVEhfTTApO1xuXG4gICAgYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXIpO1xuICAgIGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG5cbiAgICBjb25zdCBhZGRLZXlCb2RpZXM6IEFkZEtleWNoYWluT3B0aW9uc1tdID0gW107XG4gICAgbm9jaygnaHR0cHM6Ly9iaXRnby5mYWtldXJsJylcbiAgICAgIC5wb3N0KGAvYXBpL3YyLyR7Y29pbk5hbWV9L2tleWApXG4gICAgICAudGltZXMoMylcbiAgICAgIC5yZXBseSgyMDAsICh1cmksIHJlcXVlc3RCb2R5OiBBZGRLZXljaGFpbk9wdGlvbnMpID0+IHtcbiAgICAgICAgYWRkS2V5Qm9kaWVzLnB1c2gocmVxdWVzdEJvZHkpO1xuICAgICAgICByZXR1cm4geyBpZDogcmVxdWVzdEJvZHkuc291cmNlLCBzb3VyY2U6IHJlcXVlc3RCb2R5LnNvdXJjZSwgY29tbW9uS2V5Y2hhaW46IHJlcXVlc3RCb2R5LmNvbW1vbktleWNoYWluIH07XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHsgYml0Z29LZXljaGFpbiB9ID0gYXdhaXQgdHNzVXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIHNhZmVJZDogU0FGRV9JRCxcbiAgICAgIHBhcmVudEtleUlkOiBCSVRHT19ST09UX0tFWV9JRCxcbiAgICAgIGRlcml2YXRpb25JbmRleDogREVSSVZBVElPTl9JTkRFWCxcbiAgICAgIHVzZXJSb290S2V5SWQ6IFVTRVJfUk9PVF9LRVlfSUQsXG4gICAgICBiYWNrdXBSb290S2V5SWQ6IEJBQ0tVUF9ST09UX0tFWV9JRCxcbiAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJSb290LmdldEtleVNoYXJlKCksXG4gICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB2cmZVc2VyLmdldEtleVNoYXJlKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyQm9keSA9IGFkZEtleUJvZGllcy5maW5kKChib2R5KSA9PiBib2R5LnNvdXJjZSA9PT0gJ3VzZXInKTtcbiAgICBhc3NlcnQub2sodXNlckJvZHksICdleHBlY3RlZCBhIHVzZXIgY2hpbGQgcmVnaXN0cmF0aW9uJyk7XG4gICAgY29uc3QgYml0Z29Cb2R5ID0gYWRkS2V5Qm9kaWVzLmZpbmQoKGJvZHkpID0+IGJvZHkuc291cmNlID09PSAnYml0Z28nKTtcbiAgICBhc3NlcnQub2soYml0Z29Cb2R5LCAnZXhwZWN0ZWQgYSBiaXRnbyBjaGlsZCByZWdpc3RyYXRpb24nKTtcbiAgICAvLyBTYW1lIGNvbW1vbiBrZXljaGFpbiBhY3Jvc3MgYWxsIHRocmVlIGNoaWxkIHJlZ2lzdHJhdGlvbnMuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQm9keS5jb21tb25LZXljaGFpbiwgdXNlckJvZHkuY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5lcXVhbChiaXRnb0JvZHkuY29tbW9uS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIC8vIEFsbCBjaGlsZCBwYXRocyBhcmUgaGFyZGVuZWQuXG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJCb2R5LmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGgsIFwibS8wJ1wiKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckJvZHkucGFyZW50LCBVU0VSX1JPT1RfS0VZX0lEKTtcbiAgICBjb25zdCBiYWNrdXBCb2R5ID0gYWRkS2V5Qm9kaWVzLmZpbmQoKGJvZHkpID0+IGJvZHkuc291cmNlID09PSAnYmFja3VwJyk7XG4gICAgYXNzZXJ0Lm9rKGJhY2t1cEJvZHksICdleHBlY3RlZCBhIGJhY2t1cCBjaGlsZCByZWdpc3RyYXRpb24nKTtcbiAgICBhc3NlcnQuZXF1YWwoYmFja3VwQm9keS5kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoLCBcIm0vMCdcIik7XG4gICAgYXNzZXJ0LmVxdWFsKGJhY2t1cEJvZHkucGFyZW50LCBCQUNLVVBfUk9PVF9LRVlfSUQpO1xuICAgIC8vIEV4YWN0IHdpcmUgYm9keTogcHVibGljLW9ubHkgcGxhY2Vob2xkZXIgd2l0aCBubyBwcml2YXRlIG1hdGVyaWFsLlxuICAgIGFzc2VydC5kZWVwRXF1YWwoYml0Z29Cb2R5LCB7XG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckJvZHkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICBwYXJlbnQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogXCJtLzAnXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IHJvb3Qga2V5IG1hdGVyaWFsIHRoYXQgaXMgbm90IGEgdmFsaWQgVlJGIGVudmVsb3BlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFssICwgYml0Z29Sb290XSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IFssICwgdnJmQml0Z29dID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgYml0Z29QYWlyID0gbmV3IERrbHNEcnYuRGVyaXZlKDMsIDIsIDIsIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLCB2cmZCaXRnby5nZXRLZXlTaGFyZSgpLCBQQVRIX00wKTtcbiAgICBjb25zdCByb3VuZDFOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kMk5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQyKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQzTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDMoYml0Z29QYWlyKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgKCkgPT5cbiAgICAgICAgdHNzVXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgICAgICBwYXNzcGhyYXNlOiAndGVzdCcsXG4gICAgICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgICAgIHNhZmVJZDogU0FGRV9JRCxcbiAgICAgICAgICBwYXJlbnRLZXlJZDogQklUR09fUk9PVF9LRVlfSUQsXG4gICAgICAgICAgZGVyaXZhdGlvbkluZGV4OiBERVJJVkFUSU9OX0lOREVYLFxuICAgICAgICAgIHVzZXJSb290S2V5SWQ6IFVTRVJfUk9PVF9LRVlfSUQsXG4gICAgICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICAgICAgdXNlclJvb3RLZXlTaGFyZTogQnVmZmVyLmZyb20oJ2dhcmJhZ2UnKSxcbiAgICAgICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB2cmZCaXRnby5nZXRLZXlTaGFyZSgpLFxuICAgICAgICB9KSxcbiAgICAgIC9DQk9SIGRlY29kZXxkb2VzIG5vdCBtYXRjaCByb290IGtleSBzaGFyZSBwYXJ0eUlkfFZSRiBrZXlzaGFyZS9pXG4gICAgKTtcbiAgICBhc3NlcnQub2soIXJvdW5kMU5vY2suaXNEb25lKCksICdyb3VuZCAxIG11c3Qgbm90IGJlIHNlbnQgZm9yIGludmFsaWQgcm9vdCBtYXRlcmlhbCcpO1xuICAgIGFzc2VydC5vayghcm91bmQyTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDIgbXVzdCBub3QgYmUgc2VudCBmb3IgaW52YWxpZCByb290IG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDNOb2NrLmlzRG9uZSgpLCAncm91bmQgMyBtdXN0IG5vdCBiZSBzZW50IGZvciBpbnZhbGlkIHJvb3QgbWF0ZXJpYWwnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3QgYSByb290IGJsb2Igd2l0aCBhIFZSRiBwYXJ0eUlkIG1pc21hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFt1c2VyUm9vdCwgLCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgWywgdnJmQmFja3VwLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIFBBVEhfTTApO1xuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQyTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXIpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PlxuICAgICAgICB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgICAgIHBhcmVudEtleUlkOiBCSVRHT19ST09UX0tFWV9JRCxcbiAgICAgICAgICBkZXJpdmF0aW9uSW5kZXg6IERFUklWQVRJT05fSU5ERVgsXG4gICAgICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgICAgICBiYWNrdXBSb290S2V5SWQ6IEJBQ0tVUF9ST09UX0tFWV9JRCxcbiAgICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZkJhY2t1cC5nZXRLZXlTaGFyZSgpLFxuICAgICAgICB9KSxcbiAgICAgIC9kb2VzIG5vdCBtYXRjaCBWUkYga2V5IHNoYXJlIHBhcnR5SWQvXG4gICAgKTtcbiAgICBhc3NlcnQub2soIXJvdW5kMU5vY2suaXNEb25lKCksICdyb3VuZCAxIG11c3Qgbm90IGJlIHNlbnQgZm9yIG1pc21hdGNoZWQgVlJGIG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDJOb2NrLmlzRG9uZSgpLCAncm91bmQgMiBtdXN0IG5vdCBiZSBzZW50IGZvciBtaXNtYXRjaGVkIFZSRiBtYXRlcmlhbCcpO1xuICAgIGFzc2VydC5vayghcm91bmQzTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDMgbXVzdCBub3QgYmUgc2VudCBmb3IgbWlzbWF0Y2hlZCBWUkYgbWF0ZXJpYWwnKTtcbiAgfSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0dldEJpdGdvUHVibGljS2V5QmFzZWRPbkZlYXR1cmVGbGFncyhcbiAgICBjb2luOiBzdHJpbmcsXG4gICAgZW50ZXJwcmlzZUlkOiBzdHJpbmcsXG4gICAgYml0Z29HcGdLZXlQYWlyOiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz5cbiAgKTogUHJvbWlzZTxCaXRnb0dQR1B1YmxpY0tleT4ge1xuICAgIGNvbnN0IGJpdGdvR1BHUHVibGljS2V5UmVzcG9uc2U6IEJpdGdvR1BHUHVibGljS2V5ID0ge1xuICAgICAgbmFtZTogJ2lycmVsZXZhbnQnLFxuICAgICAgcHVibGljS2V5OiBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgbXBjdjJQdWJsaWNLZXk6IGJpdGdvR3BnS2V5UGFpci5wdWJsaWNLZXksXG4gICAgICBlbnRlcnByaXNlSWQsXG4gICAgfTtcbiAgICBub2NrKGJnVXJsKS5nZXQoYC9hcGkvdjIvJHtjb2lufS90c3MvcHVia2V5YCkucXVlcnkoeyBlbnRlcnByaXNlSWQgfSkucmVwbHkoMjAwLCBiaXRnb0dQR1B1YmxpY0tleVJlc3BvbnNlKTtcbiAgICByZXR1cm4gYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyOiBEa2xzRHJ2LkRlcml2ZSwgdGltZXMgPSAxLCBpbmRleCA9IERFUklWQVRJT05fSU5ERVgpIHtcbiAgICByZXR1cm4gbm9jayhiZ1VybClcbiAgICAgIC5wb3N0KFxuICAgICAgICAnL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXknLFxuICAgICAgICAoYm9keSkgPT5cbiAgICAgICAgICBib2R5LnJvdW5kID09PSAnTVBDdjJEZXJpdmUtUjEnICYmXG4gICAgICAgICAgYm9keS5zYWZlSWQgPT09IFNBRkVfSUQgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LnBhcmVudEtleUlkID09PSBCSVRHT19ST09UX0tFWV9JRCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uZGVyaXZhdGlvbkluZGV4ID09PSBpbmRleCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8udXNlckdwZ1B1YmxpY0tleSAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8udXNlck1zZzEgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cEdwZ1B1YmxpY0tleSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy5iYWNrdXBNc2cxID09PSB1bmRlZmluZWRcbiAgICAgIClcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseSgyMDAsIGFzeW5jICh1cmksIHJlcXVlc3RCb2R5OiB7IHBheWxvYWQ6IE1QQ3YyRGVyaXZlUm91bmQxUmVxdWVzdCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdXNlckdwZ1B1YmxpY0tleSwgdXNlck1zZzEgfSA9IHJlcXVlc3RCb2R5LnBheWxvYWQ7XG4gICAgICAgIHVzZXJHcGdQdWJLZXkgPSB7IHBhcnR5SWQ6IDAsIGdwZ0tleTogdXNlckdwZ1B1YmxpY0tleSB9O1xuICAgICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IGZyb206IDAsIHBheWxvYWQ6IHsgbWVzc2FnZTogdXNlck1zZzEubWVzc2FnZSwgc2lnbmF0dXJlOiB1c2VyTXNnMS5zaWduYXR1cmUgfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFt1c2VyR3BnUHViS2V5XSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJpdGdvTXNnMVVuc2lnbmVkID0gYXdhaXQgYml0Z29QYWlyLmluaXREZXJpdmUoKTtcbiAgICAgICAgY29uc3QgYml0Z29Nc2cyID0gYml0Z29QYWlyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzEubWVzc2FnZSwgJ2Jhc2U2NCcpLCBmcm9tOiAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2lnbmVkU3RhZ2VkTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cyLmJyb2FkY2FzdE1lc3NhZ2VzWzBdKV0sXG4gICAgICAgICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICk7XG4gICAgICAgIHN0YWdlZEJpdGdvTXNnMiA9IHNpZ25lZFN0YWdlZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnBheWxvYWQ7XG5cbiAgICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cxVW5zaWduZWQpXSxcbiAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtdLFxuICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYml0Z29Nc2cxID0gc2lnbmVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF07XG4gICAgICAgIGFzc2VydC5vayhiaXRnb01zZzEsICdiaXRnb01zZzEgbm90IGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2Vzc2lvbklkOiAndGVzdGlkJyBhcyBOb25FbXB0eVN0cmluZyxcbiAgICAgICAgICBiaXRnb01zZzE6IHsgZnJvbTogMiwgLi4uYml0Z29Nc2cxLnBheWxvYWQgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXI6IERrbHNEcnYuRGVyaXZlLCB0aW1lcyA9IDEpIHtcbiAgICByZXR1cm4gbm9jayhiZ1VybClcbiAgICAgIC5wb3N0KFxuICAgICAgICAnL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXknLFxuICAgICAgICAoYm9keSkgPT5cbiAgICAgICAgICBib2R5LnJvdW5kID09PSAnTVBDdjJEZXJpdmUtUjInICYmXG4gICAgICAgICAgYm9keS5zYWZlSWQgPT09IFNBRkVfSUQgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LnNlc3Npb25JZCA9PT0gJ3Rlc3RpZCcgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LnVzZXJNc2cyICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy5iYWNrdXBNc2cyID09PSB1bmRlZmluZWRcbiAgICAgIClcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseSgyMDAsIGFzeW5jICh1cmksIHJlcXVlc3RCb2R5OiB7IHBheWxvYWQ6IE1QQ3YyRGVyaXZlUm91bmQyUmVxdWVzdCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCB1c2VyTXNnMiB9ID0gcmVxdWVzdEJvZHkucGF5bG9hZDtcbiAgICAgICAgYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBmcm9tOiAwLCBwYXlsb2FkOiB7IG1lc3NhZ2U6IHVzZXJNc2cyLm1lc3NhZ2UsIHNpZ25hdHVyZTogdXNlck1zZzIuc2lnbmF0dXJlIH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbdXNlckdwZ1B1YktleV0sXG4gICAgICAgICAgW11cbiAgICAgICAgKTtcbiAgICAgICAgYml0Z29QYWlyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzIubWVzc2FnZSwgJ2Jhc2U2NCcpLCBmcm9tOiAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0Lm9rKHN0YWdlZEJpdGdvTXNnMiwgJ3N0YWdlZCBCaXRHbyBtc2cyIG1pc3NpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkLCBiaXRnb01zZzI6IHsgZnJvbTogMiwgLi4uc3RhZ2VkQml0Z29Nc2cyIH0gfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXI6IERrbHNEcnYuRGVyaXZlLCB0aW1lcyA9IDEpIHtcbiAgICByZXR1cm4gbm9jayhiZ1VybClcbiAgICAgIC5wb3N0KFxuICAgICAgICAnL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXknLFxuICAgICAgICAoYm9keSkgPT4gYm9keS5yb3VuZCA9PT0gJ01QQ3YyRGVyaXZlLVIzJyAmJiBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJiBib2R5LnBheWxvYWQ/LnNlc3Npb25JZCA9PT0gJ3Rlc3RpZCdcbiAgICAgIClcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseSgyMDAsIGFzeW5jICh1cmksIHJlcXVlc3RCb2R5OiB7IHBheWxvYWQ6IE1QQ3YyRGVyaXZlUm91bmQzUmVxdWVzdCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2Vzc2lvbklkIH0gPSByZXF1ZXN0Qm9keS5wYXlsb2FkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKGJpdGdvUGFpci5nZXRLZXlTaGFyZSgpKSBhcyBOb25FbXB0eVN0cmluZyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vY2tzIHRoZSBoYXJkZW5lZCBjaGlsZCBrZXkgcmVnaXN0cmF0aW9ucy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tBZGRDaGlsZEtleShjb2luOiBzdHJpbmcsIHRpbWVzID0gMywgaW5kZXggPSBERVJJVkFUSU9OX0lOREVYKSB7XG4gICAgcmV0dXJuIG5vY2soJ2h0dHBzOi8vYml0Z28uZmFrZXVybCcpXG4gICAgICAucG9zdChcbiAgICAgICAgYC9hcGkvdjIvJHtjb2lufS9rZXlgLFxuICAgICAgICAoYm9keTogQWRkS2V5Y2hhaW5PcHRpb25zICYgeyBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoPzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgYm9keS5rZXlUeXBlID09PSAndHNzJyAmJlxuICAgICAgICAgIGJvZHkuaXNNUEN2MiA9PT0gdHJ1ZSAmJlxuICAgICAgICAgIGJvZHkuc2FmZUlkID09PSBTQUZFX0lEICYmXG4gICAgICAgICAgISFib2R5LnBhcmVudCAmJlxuICAgICAgICAgIGJvZHkuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCA9PT0gYG0vJHtpbmRleH0nYFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgKHVyaSwgcmVxdWVzdEJvZHk6IEFkZEtleWNoYWluT3B0aW9ucykgPT4gKHtcbiAgICAgICAgaWQ6IHJlcXVlc3RCb2R5LnNvdXJjZSxcbiAgICAgICAgc291cmNlOiByZXF1ZXN0Qm9keS5zb3VyY2UsXG4gICAgICAgIHR5cGU6IHJlcXVlc3RCb2R5LmtleVR5cGUsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiByZXF1ZXN0Qm9keS5jb21tb25LZXljaGFpbixcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiByZXF1ZXN0Qm9keS5lbmNyeXB0ZWRQcnYsXG4gICAgICB9KSk7XG4gIH1cbn0pO1xuIl19
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2VjZHNhVnJmTVBDdjIvY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDZCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLG1EQUE2RDtBQUM3RCxtREFPOEI7QUFDOUIseURBQWlHO0FBR2pHLCtDQUFpRTtBQUVqRSxNQUFNLE9BQU8sR0FBRyxrQ0FBa0MsQ0FBQztBQUNuRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDO0FBQzlDLE1BQU0sa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7QUFDaEQsdUNBQXVDO0FBQ3ZDLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FBQyxJQUFBLDZCQUFrQixFQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUMxQywwQkFBWSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBRW5HLFFBQVEsQ0FBQywwREFBMEQsRUFBRSxLQUFLO0lBQ3hFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUN6QixNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztJQUN4RCxJQUFJLEtBQWEsQ0FBQztJQUNsQixJQUFJLEtBQXlCLENBQUM7SUFDOUIsSUFBSSxRQUF1QyxDQUFDO0lBQzVDLElBQUks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S0FBSyxVQUFVLGVBQWUsQ0FBQyxJQUFZLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsT0FBTztRQUN2RSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzthQUNqQyxJQUFJLENBQ0gsV0FBVyxJQUFJLE1BQU0sRUFDckIsQ0FBQyxJQUFpRSxFQUFFLEVBQUUsQ0FDcEUsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSTtZQUNyQixJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU87WUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ2IsSUFBSSxDQUFDLHlCQUF5QixLQUFLLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FDeEQ7YUFDQSxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ1osS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxXQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELEVBQUUsRUFBRSxXQUFXLENBQUMsTUFBTTtZQUN0QixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDMUIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxPQUFPO1lBQ3pCLGNBQWMsRUFBRSxXQUFXLENBQUMsY0FBYztZQUMxQyxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7U0FDdkMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3IteCc7XG5cbmltcG9ydCB7IFRlc3RhYmxlQkcsIFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7XG4gIEFkZEtleWNoYWluT3B0aW9ucyxcbiAgYnVpbGRTYWZlQmlwNDRQYXRoLFxuICBjb21tb24sXG4gIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCxcbiAgRUNEU0FVdGlscyxcbiAgV2FsbGV0LFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBEa2xzQ29tbXMsIERrbHNEcnYsIERrbHNUeXBlcywgRGtsc1V0aWxzLCBEa2xzVnJmVXRpbHMgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBNUEN2MkRlcml2ZVJvdW5kMVJlcXVlc3QsIE1QQ3YyRGVyaXZlUm91bmQyUmVxdWVzdCwgTVBDdjJEZXJpdmVSb3VuZDNSZXF1ZXN0IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB7IEJpdEdvLCBCaXRnb0dQR1B1YmxpY0tleSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5cbmNvbnN0IFNBRkVfSUQgPSAnNmZhODUzN2UzZWY1YTg3OGZkM2FlODk5ZjNhYjdlNWEnO1xuY29uc3QgVVNFUl9ST09UX0tFWV9JRCA9ICdyb290LXVzZXIta2V5LWlkJztcbmNvbnN0IEFDQ09VTlQgPSAwO1xuY29uc3QgQklUR09fUk9PVF9LRVlfSUQgPSAncm9vdC1iaXRnby1rZXktaWQnO1xuY29uc3QgQkFDS1VQX1JPT1RfS0VZX0lEID0gJ3Jvb3QtYmFja3VwLWtleS1pZCc7XG4vLyBodGV0aDogY29pblR5cGUgNjAsIGVjZHNhTXBjIHNsb3QgMy5cbmNvbnN0IGNoaWxkUGF0aCA9IChhY2NvdW50OiBudW1iZXIpID0+IGJ1aWxkU2FmZUJpcDQ0UGF0aCg2MCwgJ2VjZHNhTXBjJywgYWNjb3VudCk7XG5jb25zdCBkZXJpdmVQYXRoQnl0ZXMgPSAoYWNjb3VudDogbnVtYmVyKSA9PlxuICBEa2xzVnJmVXRpbHMuYnVpbGRTYWZlTXBjRGVyaXZlUGF0aCh7IGNvaW5UeXBlOiA2MCwgc2FmZVNsb3RPcmRpbmFsOiAzLCBhY2NvdW50SW5kZXg6IGFjY291bnQgfSk7XG5cbmRlc2NyaWJlKCdUU1MgRUNEU0Egc2FmZSBjaGlsZCBrZXljaGFpbnMgKHVzZXIvQml0R28gaGFyZCBkZXJpdmUpOicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnaHRldGgnO1xuICBjb25zdCBlbnRlcnByaXNlSWQgPSAnNjQ0OTE1M2E2ZjZiYzIwMDA2ZDY2NzcxY2RiZTE1ZDMnO1xuICBsZXQgYmdVcmw6IHN0cmluZztcbiAgbGV0IGJpdGdvOiBUZXN0YWJsZUJHICYgQml0R287XG4gIGxldCB0c3NVdGlsczogRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHM7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IGJpdEdvR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gJiB7XG4gICAgcmV2b2NhdGlvbkNlcnRpZmljYXRlOiBzdHJpbmc7XG4gIH07XG4gIGxldCBjb25zdGFudHM6IHsgbXBjOiB7IGJpdGdvUHVibGljS2V5OiBzdHJpbmc7IGJpdGdvTVBDdjJQdWJsaWNLZXk6IHN0cmluZyB9IH07XG4gIGxldCBiaXRnb0dwZ1BydktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG4gIGxldCB1c2VyR3BnUHViS2V5OiB7IHBhcnR5SWQ6IG51bWJlcjsgZ3BnS2V5OiBzdHJpbmcgfTtcbiAgbGV0IHN0YWdlZEJpdGdvTXNnMjogeyBtZXNzYWdlOiBzdHJpbmc7IHNpZ25hdHVyZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBvcGVucGdwLmNvbmZpZy5yZWplY3RDdXJ2ZXMgPSBuZXcgU2V0KCk7XG4gICAgYml0R29HcGdLZXkgPSBhd2FpdCBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgIHVzZXJJRHM6IFt7IG5hbWU6ICdiaXRnbycsIGVtYWlsOiAnYml0Z29AdGVzdC5jb20nIH1dLFxuICAgICAgY3VydmU6ICdzZWNwMjU2azEnLFxuICAgIH0pO1xuICAgIGNvbnN0YW50cyA9IHtcbiAgICAgIG1wYzoge1xuICAgICAgICBiaXRnb1B1YmxpY0tleTogYml0R29HcGdLZXkucHVibGljS2V5LFxuICAgICAgICBiaXRnb01QQ3YyUHVibGljS2V5OiBiaXRHb0dwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgIH07XG4gICAgYml0Z29HcGdQcnZLZXkgPSB7IHBhcnR5SWQ6IDIsIGdwZ0tleTogYml0R29HcGdLZXkucHJpdmF0ZUtleSB9O1xuXG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS51cmk7XG5cbiAgICBjb25zdCBiYXNlQ29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWUpO1xuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2VDb2luLCB7XG4gICAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIGNvaW46IGNvaW5OYW1lLFxuICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgfSk7XG4gICAgdHNzVXRpbHMgPSBuZXcgRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgc3RhZ2VkQml0Z29Nc2cyID0gdW5kZWZpbmVkO1xuICAgIGF3YWl0IG5vY2tHZXRCaXRnb1B1YmxpY0tleUJhc2VkT25GZWF0dXJlRmxhZ3MoY29pbk5hbWUsIGVudGVycHJpc2VJZCwgYml0R29HcGdLZXkpO1xuICAgIG5vY2soYmdVcmwpLmdldCgnL2FwaS92MS9jbGllbnQvY29uc3RhbnRzJykudGltZXMoMzIpLnJlcGx5KDIwMCwgeyB0dGw6IDM2MDAsIGNvbnN0YW50cyB9KTtcbiAgfSk7XG5cbiAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZXJpdmUgdGhlIHVzZXIgY2hpbGQgYW5kIHJlZ2lzdGVyIHRoZSBiYWNrdXAgd2l0aG91dCBlbmNyeXB0ZWRQcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoXG4gICAgICAzLFxuICAgICAgMixcbiAgICAgIDIsXG4gICAgICBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHZyZkJpdGdvLmdldEtleVNoYXJlKCksXG4gICAgICBkZXJpdmVQYXRoQnl0ZXMoQUNDT1VOVClcbiAgICApO1xuXG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG4gICAgY29uc3QgYWRkS2V5Tm9jayA9IGF3YWl0IG5vY2tBZGRDaGlsZEtleShjb2luTmFtZSk7XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiAndGVzdCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICBwYXJlbnRLZXlJZDogQklUR09fUk9PVF9LRVlfSUQsXG4gICAgICBwYXRoOiBjaGlsZFBhdGgoQUNDT1VOVCksXG4gICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmVXNlci5nZXRLZXlTaGFyZSgpLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0Lm9rKHJvdW5kMU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDJOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQzTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKGFkZEtleU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQuZXF1YWwoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiwgdXNlcktleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQuZXF1YWwoYml0Z29LZXljaGFpbi5zb3VyY2UsICdiaXRnbycpO1xuICAgIGFzc2VydC5lcXVhbChiaXRnb0tleWNoYWluLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYml0Z29QYWlyLmdldEtleVNoYXJlKCkpKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJQcnYgPSB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhlbmNyeXB0ZWRVc2VyUHJ2KTtcbiAgICBhc3NlcnQuZXF1YWwoYmFja3VwS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlY3J5cHRlZFVzZXJQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFVzZXJQcnYsIHBhc3N3b3JkOiAndGVzdCcgfSk7XG4gICAgY29uc3QgdXNlckNoaWxkU2hhcmUgPSBkZWNvZGUoQnVmZmVyLmZyb20oZGVjcnlwdGVkVXNlclBydiwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUudmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUudnJmLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyQ2hpbGRTaGFyZS5wYXJ0eV9pZCwgMCk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJDaGlsZFNoYXJlLnNfaSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVyaXZlIGF0IGEgbm9uLXplcm8gYWNjb3VudCBhbmQgYWdyZWUgd2l0aCB0aGUgc2VydmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlkeCA9IDc7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoXG4gICAgICAzLFxuICAgICAgMixcbiAgICAgIDIsXG4gICAgICBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHZyZkJpdGdvLmdldEtleVNoYXJlKCksXG4gICAgICBkZXJpdmVQYXRoQnl0ZXMoaWR4KVxuICAgICk7XG5cbiAgICBjb25zdCByb3VuZDFOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXIsIDEsIGlkeCk7XG4gICAgY29uc3Qgcm91bmQyTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXIpO1xuICAgIGNvbnN0IGFkZEtleU5vY2sgPSBhd2FpdCBub2NrQWRkQ2hpbGRLZXkoY29pbk5hbWUsIDMsIGlkeCk7XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiAndGVzdCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICBwYXJlbnRLZXlJZDogQklUR09fUk9PVF9LRVlfSUQsXG4gICAgICBwYXRoOiBjaGlsZFBhdGgoaWR4KSxcbiAgICAgIHVzZXJSb290S2V5SWQ6IFVTRVJfUk9PVF9LRVlfSUQsXG4gICAgICBiYWNrdXBSb290S2V5SWQ6IEJBQ0tVUF9ST09UX0tFWV9JRCxcbiAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJSb290LmdldEtleVNoYXJlKCksXG4gICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB2cmZVc2VyLmdldEtleVNoYXJlKCksXG4gICAgfSk7XG5cbiAgICBhc3NlcnQub2socm91bmQxTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKHJvdW5kMk5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDNOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2soYWRkS2V5Tm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5lcXVhbChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLCB1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICB9KTtcblxuICBpdCgnbGFuZHMgb24gdGhlIHNhbWUgY2hpbGQga2V5IHRoYXQgb2ZmbGluZSByZWNvdmVyeSBkZXJpdmVzIGF0IHRoZSBzYW1lIHBhdGgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCBiYWNrdXBSb290LCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgW3ZyZlVzZXIsIHZyZkJhY2t1cCwgdnJmQml0Z29dID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgYml0Z29QYWlyID0gbmV3IERrbHNEcnYuRGVyaXZlKDMsIDIsIDIsIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLCB2cmZCaXRnby5nZXRLZXlTaGFyZSgpLCBkZXJpdmVQYXRoQnl0ZXMoNSkpO1xuXG4gICAgYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXIsIDEsIDUpO1xuICAgIGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG4gICAgYXdhaXQgbm9ja0FkZENoaWxkS2V5KGNvaW5OYW1lLCAzLCA1KTtcblxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluIH0gPSBhd2FpdCB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgcGF0aDogY2hpbGRQYXRoKDUpLFxuICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgdXNlclJvb3RLZXlTaGFyZTogdXNlclJvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlY292ZXJlZCA9IGF3YWl0IERrbHNWcmZVdGlscy5kZXJpdmVTYWZlRWNkc2FNcGNDaGlsZCh7XG4gICAgICB1c2VyUm9vdDogeyBzaWduaW5nOiB1c2VyUm9vdC5nZXRSZWR1Y2VkS2V5U2hhcmUoKSwgdnJmOiB2cmZVc2VyLmdldEtleVNoYXJlKCkgfSxcbiAgICAgIGJhY2t1cFJvb3Q6IHsgc2lnbmluZzogYmFja3VwUm9vdC5nZXRSZWR1Y2VkS2V5U2hhcmUoKSwgdnJmOiB2cmZCYWNrdXAuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgYWNjb3VudDogNSxcbiAgICAgIGNvaW5UeXBlOiA2MCxcbiAgICAgIHNhZmVTbG90T3JkaW5hbDogMyxcbiAgICB9KTtcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCByZWNvdmVyZWQuY29tbW9uS2V5Y2hhaW4pO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGJhZFBhdGggb2YgW1wibS8wJ1wiLCAnbS80NC82MC8zLzAnLCBcIm0vNDQnLzYwJy85Jy8wJ1wiXSkge1xuICAgIGl0KGByZWplY3RzIHRoZSBub24tQklQNDQgcGF0aCAke0pTT04uc3RyaW5naWZ5KGJhZFBhdGgpfSBiZWZvcmUgYW55IHJlcXVlc3RgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBbdXNlclJvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgICBjb25zdCBbdnJmVXNlcl0gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jayhiZ1VybCkucG9zdCgnL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXknKS5yZXBseSg1MDApO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgICAgICAgcGF0aDogYmFkUGF0aCBhcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgICAgICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmVXNlci5nZXRLZXlTaGFyZSgpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAvSW52YWxpZCBzYWZlIEJJUDQ0IHBhdGgvXG4gICAgICApO1xuICAgICAgYXNzZXJ0Lm9rKCFzY29wZS5pc0RvbmUoKSwgJ25vIGRlcml2ZSByb3VuZCBtYXkgYmUgc2VudCBmb3IgYSBub24tQklQNDQgcGF0aCcpO1xuICAgIH0pO1xuICB9XG5cbiAgaXQoJ3JlZ2lzdGVycyB0aGUgQml0R28gY2hpbGQgcGxhY2Vob2xkZXIgd2l0aCB0aGUgQklQNDQgcGF0aCBhbmQgbm8gcHJpdmF0ZSBtYXRlcmlhbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBbdXNlclJvb3QsICwgYml0Z29Sb290XSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IFt2cmZVc2VyLCAsIHZyZkJpdGdvXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IGJpdGdvUGFpciA9IG5ldyBEa2xzRHJ2LkRlcml2ZShcbiAgICAgIDMsXG4gICAgICAyLFxuICAgICAgMixcbiAgICAgIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdnJmQml0Z28uZ2V0S2V5U2hhcmUoKSxcbiAgICAgIGRlcml2ZVBhdGhCeXRlcyhBQ0NPVU5UKVxuICAgICk7XG5cbiAgICBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpcik7XG4gICAgYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGF3YWl0IG5vY2tEZXJpdmVSb3VuZDMoYml0Z29QYWlyKTtcblxuICAgIGNvbnN0IGFkZEtleUJvZGllczogQWRkS2V5Y2hhaW5PcHRpb25zW10gPSBbXTtcbiAgICBub2NrKCdodHRwczovL2JpdGdvLmZha2V1cmwnKVxuICAgICAgLnBvc3QoYC9hcGkvdjIvJHtjb2luTmFtZX0va2V5YClcbiAgICAgIC50aW1lcygzKVxuICAgICAgLnJlcGx5KDIwMCwgKHVyaSwgcmVxdWVzdEJvZHk6IEFkZEtleWNoYWluT3B0aW9ucykgPT4ge1xuICAgICAgICBhZGRLZXlCb2RpZXMucHVzaChyZXF1ZXN0Qm9keSk7XG4gICAgICAgIHJldHVybiB7IGlkOiByZXF1ZXN0Qm9keS5zb3VyY2UsIHNvdXJjZTogcmVxdWVzdEJvZHkuc291cmNlLCBjb21tb25LZXljaGFpbjogcmVxdWVzdEJvZHkuY29tbW9uS2V5Y2hhaW4gfTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgeyBiaXRnb0tleWNoYWluIH0gPSBhd2FpdCB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgcGF0aDogY2hpbGRQYXRoKEFDQ09VTlQpLFxuICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgdXNlclJvb3RLZXlTaGFyZTogdXNlclJvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJCb2R5ID0gYWRkS2V5Qm9kaWVzLmZpbmQoKGJvZHkpID0+IGJvZHkuc291cmNlID09PSAndXNlcicpO1xuICAgIGFzc2VydC5vayh1c2VyQm9keSwgJ2V4cGVjdGVkIGEgdXNlciBjaGlsZCByZWdpc3RyYXRpb24nKTtcbiAgICBjb25zdCBiaXRnb0JvZHkgPSBhZGRLZXlCb2RpZXMuZmluZCgoYm9keSkgPT4gYm9keS5zb3VyY2UgPT09ICdiaXRnbycpO1xuICAgIGFzc2VydC5vayhiaXRnb0JvZHksICdleHBlY3RlZCBhIGJpdGdvIGNoaWxkIHJlZ2lzdHJhdGlvbicpO1xuICAgIC8vIFNhbWUgY29tbW9uIGtleWNoYWluIGFjcm9zcyBhbGwgdGhyZWUgY2hpbGQgcmVnaXN0cmF0aW9ucy5cbiAgICBhc3NlcnQuZXF1YWwoYml0Z29Cb2R5LmNvbW1vbktleWNoYWluLCB1c2VyQm9keS5jb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQm9keS5jb21tb25LZXljaGFpbiwgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgLy8gQWxsIGNoaWxkIHBhdGhzIGFyZSB0aGUgaGFyZGVuZWQgQklQNDQgcGF0aC5cbiAgICBhc3NlcnQuZXF1YWwodXNlckJvZHkuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCwgXCJtLzQ0Jy82MCcvMycvMCdcIik7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJCb2R5LnBhcmVudCwgVVNFUl9ST09UX0tFWV9JRCk7XG4gICAgY29uc3QgYmFja3VwQm9keSA9IGFkZEtleUJvZGllcy5maW5kKChib2R5KSA9PiBib2R5LnNvdXJjZSA9PT0gJ2JhY2t1cCcpO1xuICAgIGFzc2VydC5vayhiYWNrdXBCb2R5LCAnZXhwZWN0ZWQgYSBiYWNrdXAgY2hpbGQgcmVnaXN0cmF0aW9uJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJhY2t1cEJvZHkuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCwgXCJtLzQ0Jy82MCcvMycvMCdcIik7XG4gICAgYXNzZXJ0LmVxdWFsKGJhY2t1cEJvZHkucGFyZW50LCBCQUNLVVBfUk9PVF9LRVlfSUQpO1xuICAgIC8vIEV4YWN0IHdpcmUgYm9keTogcHVibGljLW9ubHkgcGxhY2Vob2xkZXIgd2l0aCBubyBwcml2YXRlIG1hdGVyaWFsLlxuICAgIGFzc2VydC5kZWVwRXF1YWwoYml0Z29Cb2R5LCB7XG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckJvZHkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICBwYXJlbnQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogXCJtLzQ0Jy82MCcvMycvMCdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3Qgcm9vdCBrZXkgbWF0ZXJpYWwgdGhhdCBpcyBub3QgYSB2YWxpZCBWUkYgZW52ZWxvcGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgWywgLCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgWywgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoXG4gICAgICAzLFxuICAgICAgMixcbiAgICAgIDIsXG4gICAgICBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSxcbiAgICAgIHZyZkJpdGdvLmdldEtleVNoYXJlKCksXG4gICAgICBkZXJpdmVQYXRoQnl0ZXMoQUNDT1VOVClcbiAgICApO1xuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQyTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXIpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PlxuICAgICAgICB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgICAgIHBhcmVudEtleUlkOiBCSVRHT19ST09UX0tFWV9JRCxcbiAgICAgICAgICBwYXRoOiBjaGlsZFBhdGgoQUNDT1VOVCksXG4gICAgICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgICAgICBiYWNrdXBSb290S2V5SWQ6IEJBQ0tVUF9ST09UX0tFWV9JRCxcbiAgICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiBCdWZmZXIuZnJvbSgnZ2FyYmFnZScpLFxuICAgICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZkJpdGdvLmdldEtleVNoYXJlKCksXG4gICAgICAgIH0pLFxuICAgICAgL0NCT1IgZGVjb2RlfGRvZXMgbm90IG1hdGNoIHJvb3Qga2V5IHNoYXJlIHBhcnR5SWR8VlJGIGtleXNoYXJlL2lcbiAgICApO1xuICAgIGFzc2VydC5vayghcm91bmQxTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDEgbXVzdCBub3QgYmUgc2VudCBmb3IgaW52YWxpZCByb290IG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDJOb2NrLmlzRG9uZSgpLCAncm91bmQgMiBtdXN0IG5vdCBiZSBzZW50IGZvciBpbnZhbGlkIHJvb3QgbWF0ZXJpYWwnKTtcbiAgICBhc3NlcnQub2soIXJvdW5kM05vY2suaXNEb25lKCksICdyb3VuZCAzIG11c3Qgbm90IGJlIHNlbnQgZm9yIGludmFsaWQgcm9vdCBtYXRlcmlhbCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCBhIHJvb3QgYmxvYiB3aXRoIGEgVlJGIHBhcnR5SWQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbLCB2cmZCYWNrdXAsIHZyZkJpdGdvXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IGJpdGdvUGFpciA9IG5ldyBEa2xzRHJ2LkRlcml2ZShcbiAgICAgIDMsXG4gICAgICAyLFxuICAgICAgMixcbiAgICAgIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdnJmQml0Z28uZ2V0S2V5U2hhcmUoKSxcbiAgICAgIGRlcml2ZVBhdGhCeXRlcyhBQ0NPVU5UKVxuICAgICk7XG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICgpID0+XG4gICAgICAgIHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgICAgIHBhdGg6IGNoaWxkUGF0aChBQ0NPVU5UKSxcbiAgICAgICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJSb290LmdldEtleVNoYXJlKCksXG4gICAgICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmQmFja3VwLmdldEtleVNoYXJlKCksXG4gICAgICAgIH0pLFxuICAgICAgL2RvZXMgbm90IG1hdGNoIFZSRiBrZXkgc2hhcmUgcGFydHlJZC9cbiAgICApO1xuICAgIGFzc2VydC5vayghcm91bmQxTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDEgbXVzdCBub3QgYmUgc2VudCBmb3IgbWlzbWF0Y2hlZCBWUkYgbWF0ZXJpYWwnKTtcbiAgICBhc3NlcnQub2soIXJvdW5kMk5vY2suaXNEb25lKCksICdyb3VuZCAyIG11c3Qgbm90IGJlIHNlbnQgZm9yIG1pc21hdGNoZWQgVlJGIG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDNOb2NrLmlzRG9uZSgpLCAncm91bmQgMyBtdXN0IG5vdCBiZSBzZW50IGZvciBtaXNtYXRjaGVkIFZSRiBtYXRlcmlhbCcpO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBub2NrR2V0Qml0Z29QdWJsaWNLZXlCYXNlZE9uRmVhdHVyZUZsYWdzKFxuICAgIGNvaW46IHN0cmluZyxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICBiaXRnb0dwZ0tleVBhaXI6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPlxuICApOiBQcm9taXNlPEJpdGdvR1BHUHVibGljS2V5PiB7XG4gICAgY29uc3QgYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZTogQml0Z29HUEdQdWJsaWNLZXkgPSB7XG4gICAgICBuYW1lOiAnaXJyZWxldmFudCcsXG4gICAgICBwdWJsaWNLZXk6IGJpdGdvR3BnS2V5UGFpci5wdWJsaWNLZXksXG4gICAgICBtcGN2MlB1YmxpY0tleTogYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2VJZCxcbiAgICB9O1xuICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke2NvaW59L3Rzcy9wdWJrZXlgKS5xdWVyeSh7IGVudGVycHJpc2VJZCB9KS5yZXBseSgyMDAsIGJpdGdvR1BHUHVibGljS2V5UmVzcG9uc2UpO1xuICAgIHJldHVybiBiaXRnb0dQR1B1YmxpY0tleVJlc3BvbnNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXI6IERrbHNEcnYuRGVyaXZlLCB0aW1lcyA9IDEsIGFjY291bnQgPSBBQ0NPVU5UKSB7XG4gICAgcmV0dXJuIG5vY2soYmdVcmwpXG4gICAgICAucG9zdChcbiAgICAgICAgJy9hcGkvdjIvbXBjL2dlbmVyYXRla2V5JyxcbiAgICAgICAgKGJvZHkpID0+XG4gICAgICAgICAgYm9keS5yb3VuZCA9PT0gJ01QQ3YyRGVyaXZlLVIxJyAmJlxuICAgICAgICAgIGJvZHkuc2FmZUlkID09PSBTQUZFX0lEICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy5wYXJlbnRLZXlJZCA9PT0gQklUR09fUk9PVF9LRVlfSUQgJiZcbiAgICAgICAgICBib2R5LmNvaW4gPT09IGNvaW5OYW1lICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy5wYXRoID09PSBjaGlsZFBhdGgoYWNjb3VudCkgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmRlcml2YXRpb25JbmRleCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy51c2VyR3BnUHVibGljS2V5ICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy51c2VyTXNnMSAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uYmFja3VwR3BnUHVibGljS2V5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cE1zZzEgPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VyR3BnUHVibGljS2V5LCB1c2VyTXNnMSB9ID0gcmVxdWVzdEJvZHkucGF5bG9hZDtcbiAgICAgICAgdXNlckdwZ1B1YktleSA9IHsgcGFydHlJZDogMCwgZ3BnS2V5OiB1c2VyR3BnUHVibGljS2V5IH07XG4gICAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgZnJvbTogMCwgcGF5bG9hZDogeyBtZXNzYWdlOiB1c2VyTXNnMS5tZXNzYWdlLCBzaWduYXR1cmU6IHVzZXJNc2cxLnNpZ25hdHVyZSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW3VzZXJHcGdQdWJLZXldLFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYml0Z29Nc2cxVW5zaWduZWQgPSBhd2FpdCBiaXRnb1BhaXIuaW5pdERlcml2ZSgpO1xuICAgICAgICBjb25zdCBiaXRnb01zZzIgPSBiaXRnb1BhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMS5tZXNzYWdlLCAnYmFzZTY0JyksIGZyb206IDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaWduZWRTdGFnZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0pXSxcbiAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtdLFxuICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgKTtcbiAgICAgICAgc3RhZ2VkQml0Z29Nc2cyID0gc2lnbmVkU3RhZ2VkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZDtcblxuICAgICAgICBjb25zdCBzaWduZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzFVbnNpZ25lZCldLFxuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW10sXG4gICAgICAgICAgW2JpdGdvR3BnUHJ2S2V5XVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBiaXRnb01zZzEgPSBzaWduZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc1swXTtcbiAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvTXNnMSwgJ2JpdGdvTXNnMSBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6ICd0ZXN0aWQnIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICAgIGJpdGdvTXNnMTogeyBmcm9tOiAyLCAuLi5iaXRnb01zZzEucGF5bG9hZCB9LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrRGVyaXZlUm91bmQyKGJpdGdvUGFpcjogRGtsc0Rydi5EZXJpdmUsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PlxuICAgICAgICAgIGJvZHkucm91bmQgPT09ICdNUEN2MkRlcml2ZS1SMicgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uc2Vzc2lvbklkID09PSAndGVzdGlkJyAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8udXNlck1zZzIgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cE1zZzIgPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHVzZXJNc2cyIH0gPSByZXF1ZXN0Qm9keS5wYXlsb2FkO1xuICAgICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IGZyb206IDAsIHBheWxvYWQ6IHsgbWVzc2FnZTogdXNlck1zZzIubWVzc2FnZSwgc2lnbmF0dXJlOiB1c2VyTXNnMi5zaWduYXR1cmUgfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFt1c2VyR3BnUHViS2V5XSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICBiaXRnb1BhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMi5tZXNzYWdlLCAnYmFzZTY0JyksIGZyb206IDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQub2soc3RhZ2VkQml0Z29Nc2cyLCAnc3RhZ2VkIEJpdEdvIG1zZzIgbWlzc2luZycpO1xuICAgICAgICByZXR1cm4geyBzZXNzaW9uSWQsIGJpdGdvTXNnMjogeyBmcm9tOiAyLCAuLi5zdGFnZWRCaXRnb01zZzIgfSB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcjogRGtsc0Rydi5EZXJpdmUsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PiBib2R5LnJvdW5kID09PSAnTVBDdjJEZXJpdmUtUjMnICYmIGJvZHkuc2FmZUlkID09PSBTQUZFX0lEICYmIGJvZHkucGF5bG9hZD8uc2Vzc2lvbklkID09PSAndGVzdGlkJ1xuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDNSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IHJlcXVlc3RCb2R5LnBheWxvYWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOiBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYml0Z29QYWlyLmdldEtleVNoYXJlKCkpIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm9ja3MgdGhlIEJJUDQ0IGNoaWxkIGtleSByZWdpc3RyYXRpb25zLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0FkZENoaWxkS2V5KGNvaW46IHN0cmluZywgdGltZXMgPSAzLCBhY2NvdW50ID0gQUNDT1VOVCkge1xuICAgIHJldHVybiBub2NrKCdodHRwczovL2JpdGdvLmZha2V1cmwnKVxuICAgICAgLnBvc3QoXG4gICAgICAgIGAvYXBpL3YyLyR7Y29pbn0va2V5YCxcbiAgICAgICAgKGJvZHk6IEFkZEtleWNoYWluT3B0aW9ucyAmIHsgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aD86IHN0cmluZyB9KSA9PlxuICAgICAgICAgIGJvZHkua2V5VHlwZSA9PT0gJ3RzcycgJiZcbiAgICAgICAgICBib2R5LmlzTVBDdjIgPT09IHRydWUgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgICEhYm9keS5wYXJlbnQgJiZcbiAgICAgICAgICBib2R5LmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggPT09IGNoaWxkUGF0aChhY2NvdW50KVxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgKHVyaSwgcmVxdWVzdEJvZHk6IEFkZEtleWNoYWluT3B0aW9ucykgPT4gKHtcbiAgICAgICAgaWQ6IHJlcXVlc3RCb2R5LnNvdXJjZSxcbiAgICAgICAgc291cmNlOiByZXF1ZXN0Qm9keS5zb3VyY2UsXG4gICAgICAgIHR5cGU6IHJlcXVlc3RCb2R5LmtleVR5cGUsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiByZXF1ZXN0Qm9keS5jb21tb25LZXljaGFpbixcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiByZXF1ZXN0Qm9keS5lbmNyeXB0ZWRQcnYsXG4gICAgICB9KSk7XG4gIH1cbn0pO1xuIl19
|