@bitgo/sdk-core 38.12.1 → 38.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/enum.d.ts +2 -1
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +3 -1
- package/dist/src/api/types.d.ts +6 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +8 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +2 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +3 -3
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +12 -6
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/defi/defiVault.d.ts +35 -1
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/defiVault.js +67 -1
- package/dist/src/bitgo/defi/iDefiVault.d.ts +15 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/iDefiVault.js +1 -1
- package/dist/src/bitgo/internal/keycard.d.ts +2 -1
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +6 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -2
- 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 +29 -5
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +27 -6
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +68 -20
- package/dist/src/bitgo/safe/safe.js +2 -2
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safes.js +10 -1
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +4 -1
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +50 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +112 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +15 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +39 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +344 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +2 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +17 -2
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +8 -5
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +33 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +260 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +2 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +15 -2
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +13 -2
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +13 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts +30 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +2 -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/safeKeychain.d.ts +25 -2
- package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/safeKeychain.js +72 -18
- package/dist/src/bitgo/wallet/wallet.d.ts +18 -5
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +109 -19
- package/dist/src/bitgo/wallet/wallets.d.ts +6 -0
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +37 -22
- package/dist/test/unit/bitgo/defi/defiVault.js +163 -1
- package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
- package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
- package/dist/test/unit/bitgo/keychain/keychains.js +155 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +21 -6
- package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +114 -62
- package/dist/test/unit/bitgo/safe/safe.js +4 -4
- package/dist/test/unit/bitgo/safe/safes.js +28 -2
- package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/common.js +77 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +181 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +70 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +173 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +33 -1
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +10 -10
- package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.js +303 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +51 -40
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
|
@@ -155,6 +155,18 @@ class Wallets {
|
|
|
155
155
|
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
156
156
|
};
|
|
157
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Encrypt the wallet passphrase for recovery and Box D.
|
|
160
|
+
*
|
|
161
|
+
* Box D uses a fixed version independent of the caller's keychain encryption version.
|
|
162
|
+
*/
|
|
163
|
+
async encryptPassphraseForRecovery(passphrase, passcodeEncryptionCode) {
|
|
164
|
+
return await this.bitgo.encrypt({
|
|
165
|
+
input: passphrase,
|
|
166
|
+
password: passcodeEncryptionCode,
|
|
167
|
+
encryptionVersion: api_1.HIGH_ENTROPY_ENCRYPTION_VERSION,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
158
170
|
async generateLightningWallet(params) {
|
|
159
171
|
const reqId = new utils_1.RequestTracer();
|
|
160
172
|
this.bitgo.setRequestTracer(reqId);
|
|
@@ -294,11 +306,7 @@ class Wallets {
|
|
|
294
306
|
throw new Error(`error(s) parsing generate lightning wallet request params: ${errors}`);
|
|
295
307
|
});
|
|
296
308
|
const walletData = await this.generateLightningWallet(options);
|
|
297
|
-
walletData.encryptedWalletPassphrase = await this.
|
|
298
|
-
input: options.passphrase,
|
|
299
|
-
password: options.passcodeEncryptionCode,
|
|
300
|
-
encryptionVersion: options.encryptionVersion,
|
|
301
|
-
});
|
|
309
|
+
walletData.encryptedWalletPassphrase = await this.encryptPassphraseForRecovery(options.passphrase, options.passcodeEncryptionCode);
|
|
302
310
|
return walletData;
|
|
303
311
|
}
|
|
304
312
|
// Go Account wallet generation
|
|
@@ -308,11 +316,7 @@ class Wallets {
|
|
|
308
316
|
});
|
|
309
317
|
const walletData = await this.generateGoAccountWallet(options);
|
|
310
318
|
if (options.passphrase !== undefined && options.passcodeEncryptionCode !== undefined) {
|
|
311
|
-
walletData.encryptedWalletPassphrase = await this.
|
|
312
|
-
input: options.passphrase,
|
|
313
|
-
password: options.passcodeEncryptionCode,
|
|
314
|
-
encryptionVersion: options.encryptionVersion,
|
|
315
|
-
});
|
|
319
|
+
walletData.encryptedWalletPassphrase = await this.encryptPassphraseForRecovery(options.passphrase, options.passcodeEncryptionCode);
|
|
316
320
|
}
|
|
317
321
|
return walletData;
|
|
318
322
|
}
|
|
@@ -359,6 +363,24 @@ class Wallets {
|
|
|
359
363
|
!(params.walletVersion === 3 || params.walletVersion === 5 || params.walletVersion === 6)) {
|
|
360
364
|
throw new Error('EVM TSS wallets are only supported for wallet version 3, 5 and 6');
|
|
361
365
|
}
|
|
366
|
+
// Transparent zcash wallets are multisig and isTSS is not set inherently.
|
|
367
|
+
// Shielded zcash wallets are MPC
|
|
368
|
+
if (params.isShielded) {
|
|
369
|
+
(0, assert_1.default)(enterprise, 'enterprise is required for shielded wallet');
|
|
370
|
+
if (type !== 'custodial') {
|
|
371
|
+
throw new Error('shielded wallets can only be created as custodial wallets');
|
|
372
|
+
}
|
|
373
|
+
if (params.multisigType !== 'tss') {
|
|
374
|
+
throw new Error('shielded wallets must set/use multisigType tss');
|
|
375
|
+
}
|
|
376
|
+
return this.generateCustodialMpcWallet({
|
|
377
|
+
multisigType: 'tss',
|
|
378
|
+
isShielded: true,
|
|
379
|
+
label,
|
|
380
|
+
enterprise,
|
|
381
|
+
walletVersion: params.walletVersion,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
362
384
|
if (isTss) {
|
|
363
385
|
if (!this.baseCoin.supportsTss()) {
|
|
364
386
|
throw new Error(`coin ${this.baseCoin.getFamily()} does not support TSS at this time`);
|
|
@@ -402,11 +424,7 @@ class Wallets {
|
|
|
402
424
|
encryptionVersion: params.encryptionVersion,
|
|
403
425
|
});
|
|
404
426
|
if (params.passcodeEncryptionCode) {
|
|
405
|
-
walletData.encryptedWalletPassphrase = await this.
|
|
406
|
-
input: passphrase,
|
|
407
|
-
password: params.passcodeEncryptionCode,
|
|
408
|
-
encryptionVersion: params.encryptionVersion,
|
|
409
|
-
});
|
|
427
|
+
walletData.encryptedWalletPassphrase = await this.encryptPassphraseForRecovery(passphrase, params.passcodeEncryptionCode);
|
|
410
428
|
}
|
|
411
429
|
return walletData;
|
|
412
430
|
}
|
|
@@ -631,11 +649,7 @@ class Wallets {
|
|
|
631
649
|
userKeychain.derivationPath = derivationPath;
|
|
632
650
|
}
|
|
633
651
|
if (canEncrypt && params.passcodeEncryptionCode) {
|
|
634
|
-
result.encryptedWalletPassphrase = await this.
|
|
635
|
-
input: passphrase,
|
|
636
|
-
password: params.passcodeEncryptionCode,
|
|
637
|
-
encryptionVersion: params.encryptionVersion,
|
|
638
|
-
});
|
|
652
|
+
result.encryptedWalletPassphrase = await this.encryptPassphraseForRecovery(passphrase, params.passcodeEncryptionCode);
|
|
639
653
|
}
|
|
640
654
|
return result;
|
|
641
655
|
}
|
|
@@ -1737,7 +1751,7 @@ class Wallets {
|
|
|
1737
1751
|
* @param params
|
|
1738
1752
|
* @private
|
|
1739
1753
|
*/
|
|
1740
|
-
async generateCustodialMpcWallet({ label, multisigType, enterprise, walletVersion, }) {
|
|
1754
|
+
async generateCustodialMpcWallet({ label, multisigType, isShielded, enterprise, walletVersion, }) {
|
|
1741
1755
|
const reqId = new utils_1.RequestTracer();
|
|
1742
1756
|
this.bitgo.setRequestTracer(reqId);
|
|
1743
1757
|
if (multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
|
|
@@ -1754,6 +1768,7 @@ class Wallets {
|
|
|
1754
1768
|
enterprise,
|
|
1755
1769
|
walletVersion,
|
|
1756
1770
|
type: 'custodial',
|
|
1771
|
+
...(isShielded && { coinSpecific: { isShielded: true } }),
|
|
1757
1772
|
};
|
|
1758
1773
|
// Create Wallet
|
|
1759
1774
|
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(finalWalletParams).result();
|
|
@@ -1778,4 +1793,4 @@ class Wallets {
|
|
|
1778
1793
|
}
|
|
1779
1794
|
}
|
|
1780
1795
|
exports.Wallets = Wallets;
|
|
1781
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxREEsc0RBSUM7QUF6REQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLDhDQUF3QztBQUN4QywwQ0FBNEI7QUFDNUIsNENBQTZDO0FBRTdDLG1DQUFzRjtBQUN0RixxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLHNDQUEwRDtBQUMxRCwwQ0FBdUU7QUFDdkUsb0NBQTZGO0FBQzdGLHlDQTJCb0I7QUFFcEIscUNBQWtDO0FBRWxDLDhDQUF5RjtBQUV6Rjs7R0FFRztBQUNILFNBQWdCLHFCQUFxQixDQUNuQyxNQUE0RjtJQUU1RixPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUsscUJBQXFCLENBQUM7QUFDdkQsQ0FBQztBQUVELDhGQUE4RjtBQUM5Riw2RkFBNkY7QUFDN0YscUZBQXFGO0FBQ3JGLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBRWpDLE1BQWEsT0FBTztJQUlsQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBMkIsRUFBRTtRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXNELEVBQUU7UUFDakUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFD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UyxDQUFDLENBQUM7UUFDaEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUF3QjtZQUNsQyxNQUFNO1lBQ04sWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7WUFDdEUsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDMUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7WUFDeEUsWUFBWSxFQUFFLHFCQUFxQjtTQUNwQyxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLDhCQUE4QixDQUFDLGFBQXNCLEVBQUUsbUJBQTRCO1FBQ3pGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxtQkFBbUIsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQTNoRUQsMEJBMmhFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBDb2luRmVhdHVyZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuaW1wb3J0IHsgRW5jcnlwdGlvblZlcnNpb24sIElFbmNyeXB0aW9uU2Vzc2lvbiwgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luLCBLZXljaGFpbnNUcmlwbGV0LCBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHsgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5SW5kaWNlcyB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IGRlY29kZU9yRWxzZSwgRUNEU0FVdGlscywgRUREU0FVdGlscywgcHJvbWlzZVByb3BzLCBSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2hhcmVPcHRpb25zLFxuICBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0LFxuICBBZGRXYWxsZXRPcHRpb25zLFxuICBCdWxrQWNjZXB0U2hhcmVPcHRpb25zLFxuICBCdWxrQWNjZXB0U2hhcmVSZXNwb25zZSxcbiAgQnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9ucyxcbiAgQnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9uc1JlcXVlc3QsXG4gIEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlLFxuICBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjLFxuICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLFxuICBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlU01DTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lck9wdGlvbnMsXG4gIEdldFdhbGxldEJ5QWRkcmVzc09wdGlvbnMsXG4gIEdldFdhbGxldE9wdGlvbnMsXG4gIEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4sXG4gIElXYWxsZXRzLFxuICBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zLFxuICBMaXN0V2FsbGV0T3B0aW9ucyxcbiAgVXBkYXRlU2hhcmVPcHRpb25zLFxuICBXYWxsZXRTaGFyZXMsXG4gIFdhbGxldFdpdGhLZXljaGFpbnMsXG59IGZyb20gJy4vaVdhbGxldHMnO1xuaW1wb3J0IHsgRGVjcnlwdGVkS2V5Y2hhaW5EYXRhLCBTaGFyZVdhbGxldE9wdGlvbnMsIFdhbGxldFNoYXJlIH0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4vd2FsbGV0JztcbmltcG9ydCB7IFRzc1NldHRpbmdzIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVFdm1LZXlSaW5nV2FsbGV0LCB2YWxpZGF0ZUV2bUtleVJpbmdXYWxsZXRQYXJhbXMgfSBmcm9tICcuLi9ldm0vZXZtVXRpbHMnO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgd2FsbGV0IGlzIGEgV2FsbGV0V2l0aEtleWNoYWluc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRXaXRoS2V5Y2hhaW5zKFxuICB3YWxsZXQ6IFdhbGxldFdpdGhLZXljaGFpbnMgfCBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpblxuKTogd2FsbGV0IGlzIFdhbGxldFdpdGhLZXljaGFpbnMge1xuICByZXR1cm4gd2FsbGV0LnJlc3BvbnNlVHlwZSA9PT0gJ1dhbGxldFdpdGhLZXljaGFpbnMnO1xufVxuXG4vLyBCb3VuZCBjb25jdXJyZW50IEFyZ29uMmlkIFdBU00gaW5zdGFuY2VzIGFjcm9zcyBidWxrIHNoYXJlIGZsb3dzLiBFYWNoIGRlY3J5cHQvZW5jcnlwdCBjYWxsXG4vLyByZXNlcnZlcyB+MiBHaUIgb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlOyBydW5uaW5nIGFsbCBzaGFyZXMgY29uY3VycmVudGx5IE9PTXMgdGhlIGJyb3dzZXJcbi8vIGF0IHNjYWxlIChlLmcuIDk2IHdhbGxldHMpLiAxNiBrZWVwcyBlbm91Z2ggcGFyYWxsZWxpc20gd2l0aG91dCBleGhhdXN0aW5nIG1lbW9yeS5cbmNvbnN0IEJVTEtfU0hBUkVfQkFUQ0hfU0laRSA9IDE2O1xuXG5leHBvcnQgY2xhc3MgV2FsbGV0cyBpbXBsZW1lbnRzIElXYWxsZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbikge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IElEIChwcm94eSBmb3IgZ2V0V2FsbGV0KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHJldHVybiB0aGlzLmdldFdhbGxldChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYSB1c2VyJ3Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RXYWxsZXRPcHRpb25zICYgeyBlbnRlcnByaXNlPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8eyB3YWxsZXRzOiBXYWxsZXRbXSB9PiB7XG4gICAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBza2lwIGFuZCBwcmV2SWQnKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IChhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldCcpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKSBhcyBhbnk7XG4gICAgYm9keS53YWxsZXRzID0gYm9keS53YWxsZXRzLm1hcCgodykgPT4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3KSk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogYWRkXG4gICAqIEFkZCBhIG5ldyB3YWxsZXQgKGFkdmFuY2VkIG1vZGUpLlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gbWFudWFsbHkgc3VibWl0IHRoZSBrZXlzLCB0eXBlLCBtIGFuZCBuIG9mIHRoZSB3YWxsZXRcbiAgICogUGFyYW1ldGVycyBpbmNsdWRlOlxuICAgKiAgICBcImxhYmVsXCI6IGxhYmVsIG9mIHRoZSB3YWxsZXQgdG8gYmUgc2hvd24gaW4gVUlcbiAgICogICAgXCJtXCI6IG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9jayB3YWxsZXQgKDIpXG4gICAqICAgIFwiblwiOiBudW1iZXIgb2Yga2V5cyBhdmFpbGFibGUgb24gdGhlIHdhbGxldCAoMylcbiAgICogICAgXCJrZXlzXCI6IGFycmF5IG9mIGtleWNoYWluIGlkc1xuICAgKi9cbiAgYXN5bmMgYWRkKHBhcmFtczogQWRkV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZScsICd0eXBlJ10pO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRXZtS2V5UmluZ1dhbGxldFBhcmFtcyhwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuXG4gICAgaWYgKCFwYXJhbXMuZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkICYmIHBhcmFtcy50eXBlICE9PSAnY3VzdG9kaWFsJykge1xuICAgICAgLy8gbm8gbmVlZCB0byBwYXNzIGtleXMgZm9yIChzaW5nbGUpIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMua2V5cykgPT09IGZhbHNlIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5tKSB8fCAhXy5pc051bWJlcihwYXJhbXMubikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBtdWx0aXNpZ1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRNb2ZOU2V0dXAocGFyYW1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG11bHRpLXNpZyB0eXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGdhc1ByaWNlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy53YWxsZXRWZXJzaW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3Igd2FsbGV0VmVyc2lvbiAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScgJiYgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDMpIHtcbiAgICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAgIC5xdWVyeSh7IGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlIH0pXG4gICAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/Lm11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICAgIGlmIChtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgcGFyYW1zLndhbGxldFZlcnNpb24gPSA1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy50YWdzICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLnRhZ3MpID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciB0YWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNsaWVudEZsYWdzICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLmNsaWVudEZsYWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgY2xpZW50RmxhZ3MgLSBhcnJheSBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDb2xkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaXNDb2xkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpc0NvbGQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pc0N1c3RvZGlhbCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ3VzdG9kaWFsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpc0N1c3RvZGlhbCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MgJiYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSB8fCAhdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMuYWRkcmVzcykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFkZHJlc3MgLSB2YWxpZCBhZGRyZXNzIHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldChwYXJhbXM6IEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8TGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgeyBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSwgc3ViVHlwZSwgbGlnaHRuaW5nUHJvdmlkZXIsIGVuY3J5cHRpb25WZXJzaW9uIH0gPVxuICAgICAgcGFyYW1zO1xuXG4gICAgLy8gVE9ETyBCVEMtMTg5OTogb25seSB1c2VyQXV0aCBrZXkgaXMgcmVxdWlyZWQgZm9yIGN1c3RvZGlhbCBsaWdodG5pbmcgd2FsbGV0LiBhbGwgMyBrZXlzIGFyZSByZXF1aXJlZCBmb3Igc2VsZiBjdXN0b2RpYWwgbGlnaHRuaW5nLlxuICAgIC8vIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBwbGF0Zm9ybSBmb3IgY3VzdG9kaWFsIGZsb3csIGxldCB1cyBhbGwgMyBrZXlzIGJvdGggd2FsbGV0IHR5cGVzLlxuICAgIGNvbnN0IGtleWNoYWluUHJvbWlzZXMgPSAoW3VuZGVmaW5lZCwgJ3VzZXJBdXRoJywgJ25vZGVBdXRoJ10gYXMgY29uc3QpLm1hcCgocHVycG9zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGNvbnN0IGtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgICAgICBwdWI6IGtleWNoYWluLnB1YixcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICAgIGlucHV0OiBrZXljaGFpbi5wcnYsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHB1cnBvc2UgPT09IHVuZGVmaW5lZCA/IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29pblNwZWNpZmljOiBwdXJwb3NlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiB7IHB1cnBvc2UgfSB9LFxuICAgICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChrZXljaGFpblBhcmFtcyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIHVzZXJBdXRoS2V5Y2hhaW4sIG5vZGVBdXRoS2V5Y2hhaW4gfSA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICB1c2VyS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMF0oKSxcbiAgICAgIHVzZXJBdXRoS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMV0oKSxcbiAgICAgIG5vZGVBdXRoS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMl0oKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMSxcbiAgICAgIG46IDEsXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIHN1YlR5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZF0sXG4gICAgICBjb2luU3BlY2lmaWM6IHsgW3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKV06IHsga2V5czogW3VzZXJBdXRoS2V5Y2hhaW4uaWQsIG5vZGVBdXRoS2V5Y2hhaW4uaWRdIH0gfSxcbiAgICAgIGxpZ2h0bmluZ1Byb3ZpZGVyLFxuICAgIH07XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIHVzZXJBdXRoS2V5Y2hhaW4sXG4gICAgICBub2RlQXV0aEtleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIEdvIEFjY291bnQgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zXG4gICAqIEByZXR1cm5zIFByb21pc2U8R29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbj5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVHb0FjY291bnRXYWxsZXQoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCB7IGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBwYXNzY29kZUVuY3J5cHRpb25Db2RlLCBlbmNyeXB0aW9uVmVyc2lvbiwgdXNlcktleVNpZ25pbmdSZXF1aXJlZCB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3Qga2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHB1Yjoga2V5Y2hhaW4ucHViLFxuICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgIH07XG5cbiAgICBpZiAocGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkICYmIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5Y2hhaW5QYXJhbXMuZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgIGlucHV0OiBrZXljaGFpbi5wcnYsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgICBrZXljaGFpblBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgPSBwYXNzY29kZUVuY3J5cHRpb25Db2RlO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGtleWNoYWluUGFyYW1zKTtcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMSxcbiAgICAgIG46IDEsXG4gICAgICB0eXBlOiAndHJhZGluZycsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZF0sXG4gICAgICAuLi4odXNlcktleVNpZ25pbmdSZXF1aXJlZCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgY29pblNwZWNpZmljOiB7IHVzZXJLZXlTaWduaW5nUmVxdWlyZWQgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4gPSB7XG4gICAgICB3YWxsZXQsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluJyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdhcm5pbmcgaWYgdGhlIHVzZXIga2V5Y2hhaW4gaGFzIGFuIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIHVzZXIga2V5Y2hhaW4gLS0gaXQgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSBlbHNlISc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyB3YWxsZXRcbiAgICogMS4gQ3JlYXRlcyB0aGUgdXNlciBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDIuIElmIG5vIHB1YiB3YXMgcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIGJhY2t1cCBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDMuIFVwbG9hZHMgdGhlIGVuY3J5cHRlZCB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zIHRvIEJpdEdvXG4gICAqIDQuIENyZWF0ZXMgdGhlIEJpdEdvIGtleSBvbiB0aGUgc2VydmljZVxuICAgKiA1LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5cyBhYm92ZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMubGFiZWwgTGFiZWwgZm9yIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzcGhyYXNlIFBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBlbmNyeXB0IHRoZSB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcktleSBVc2VyIHhwdWJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBYcHViIEJhY2t1cCB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyXG4gICAqIEBwYXJhbSBwYXJhbXMuZW50ZXJwcmlzZSB0aGUgZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgb3B0aW9uYWwgdGhpcyBpcyBhIHJlY292ZXJ5IGNvZGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSBvcmlnaW5hbCBwYXNzcGhyYXNlIGluIGEgcmVjb3ZlcnkgY2FzZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB1c2VyIG11c3QgZ2VuZXJhdGUgYW5kIGtlZXAgdGhlIGVuY3J5cHRlZCBvcmlnaW5hbCBwYXNzcGhyYXNlIHNhZmUgd2hpbGUgdGhpcyBjb2RlIGlzIHN0b3JlZCBvbiBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCBvcHRpb25hbCBzZWVkIGZvciBTTUMgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zLmdhc1ByaWNlXG4gICAqIEBwYXJhbSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0VmVyc2lvblxuICAgKiBAcGFyYW0gcGFyYW1zLm11bHRpc2lnVHlwZSBvcHRpb25hbCBtdWx0aXNpZyB0eXBlLCAnb25jaGFpbicgb3IgJ3Rzcycgb3IgJ2Jsc2RrZyc7IGlmIGFic2VudCwgd2Ugd2lsbCBkZWZlciB0byB0aGUgY29pbidzIGRlZmF1bHQgdHlwZVxuICAgKiBAcGFyYW0gcGFyYW1zLmlzRGlzdHJpYnV0ZWRDdXN0b2R5IG9wdGlvbmFsIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgYml0Z28ga2V5LiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIGNyZWF0ZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXQuIElmIHByb3ZpZGVkLCB5b3UgbXVzdCBoYXZlIHRoZSBlbnRlcnByaXNlIGxpY2Vuc2UgYW5kIHBhc3MgaW5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgcGFyYW1zLmVudGVycHJpc2VgIGludG8gYGdlbmVyYXRlV2FsbGV0YCBhcyB3ZWxsLlxuICAgKiBAcGFyYW0gcGFyYW1zLnR5cGUgb3B0aW9uYWwgd2FsbGV0IHR5cGUsICdob3QnIG9yICdjb2xkJyBvciAnY3VzdG9kaWFsJzsgaWYgYWJzZW50LCB3ZSB3aWxsIGRlZmVyIHRvICdob3QnXG4gICAqIEBwYXJhbSBwYXJhbXMuYml0Z29LZXlJZCBvcHRpb25hbCBiaXRnbyBrZXkgaWQgZm9yIFNNQyBUU1Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbW1vbktleWNoYWluIG9wdGlvbmFsIGNvbW1vbiBrZXljaGFpbiBmb3IgU01DIFRTUyB3YWxsZXRzXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXYWxsZXQoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnMgfCBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbj4ge1xuICAgIC8vIEFzc2lnbiB0aGUgZGVmYXVsdCBtdWx0aVNpZyB0eXBlIHZhbHVlIGJhc2VkIG9uIHRoZSBjb2luXG4gICAgaWYgKCFwYXJhbXMubXVsdGlzaWdUeXBlKSB7XG4gICAgICBwYXJhbXMubXVsdGlzaWdUeXBlID0gdGhpcy5iYXNlQ29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdsbmJ0YycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBkZWNvZGVPckVsc2UoXG4gICAgICAgIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLm5hbWUsXG4gICAgICAgIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIChlcnJvcnMpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgZ2VuZXJhdGUgbGlnaHRuaW5nIHdhbGxldCByZXF1ZXN0IHBhcmFtczogJHtlcnJvcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0KG9wdGlvbnMpO1xuICAgICAgd2FsbGV0RGF0YS5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IG9wdGlvbnMucGFzc3BocmFzZSxcbiAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IG9wdGlvbnMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIC8vIEdvIEFjY291bnQgd2FsbGV0IGdlbmVyYXRpb25cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ29mYycgJiYgcGFyYW1zLnR5cGUgPT09ICd0cmFkaW5nJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGRlY29kZU9yRWxzZShcbiAgICAgICAgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zQ29kZWMubmFtZSxcbiAgICAgICAgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zQ29kZWMsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgKGVycm9ycykgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyBnZW5lcmF0ZSBnbyBhY2NvdW50IHJlcXVlc3QgcGFyYW1zOiAke2Vycm9yc31gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVHb0FjY291bnRXYWxsZXQob3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5wYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wYXNzY29kZUVuY3J5cHRpb25Db2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2FsbGV0RGF0YS5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogb3B0aW9ucy5wYXNzcGhyYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IG9wdGlvbnMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdhbGxldERhdGE7XG4gICAgfVxuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydsYWJlbCddLCBbJ3Bhc3NwaHJhc2UnLCAndXNlcktleScsICdiYWNrdXBYcHViJ10pO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgbGFiZWwnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNyZWF0ZUtleWNoYWluQ2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHBhcmFtcyBhcyBHZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lck9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdHlwZSA9ICdob3QnLCBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgaXNEaXN0cmlidXRlZEN1c3RvZHksIGV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGlzVHNzID0gcGFyYW1zLm11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1RzcygpO1xuICAgIGNvbnN0IGNhbkVuY3J5cHQgPSAhIXBhc3NwaHJhc2UgJiYgdHlwZW9mIHBhc3NwaHJhc2UgPT09ICdzdHJpbmcnO1xuXG4gICAgaWYgKHZhbGlkYXRlRXZtS2V5UmluZ1dhbGxldFBhcmFtcyhwYXJhbXMsIHRoaXMuYmFzZUNvaW4pKSB7XG4gICAgICByZXR1cm4gYXdhaXQgY3JlYXRlRXZtS2V5UmluZ1dhbGxldCh7XG4gICAgICAgIGxhYmVsLFxuICAgICAgICBldm1LZXlSaW5nUmVmZXJlbmNlV2FsbGV0SWQ6IGV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZCEsXG4gICAgICAgIGJpdGdvOiB0aGlzLmJpdGdvLFxuICAgICAgICBiYXNlQ29pbjogdGhpcy5iYXNlQ29pbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW10sXG4gICAgICB0eXBlOiAhIXBhcmFtcy51c2VyS2V5ICYmIHBhcmFtcy5tdWx0aXNpZ1R5cGUgIT09ICdvbmNoYWluJyA/ICdjb2xkJyA6IHR5cGUsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50ZXJwcmlzZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhlbnRlcnByaXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50ZXJwcmlzZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmVudGVycHJpc2UgPSBlbnRlcnByaXNlO1xuICAgIH1cblxuICAgIC8vIEVWTSBUU1Mgd2FsbGV0cyBtdXN0IHVzZSB3YWxsZXQgdmVyc2lvbiAzLCA1IGFuZCA2XG4gICAgaWYgKFxuICAgICAgaXNUc3MgJiZcbiAgICAgIHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJlxuICAgICAgIWV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZCAmJlxuICAgICAgIShwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gMyB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNSB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNilcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRVZNIFRTUyB3YWxsZXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3Igd2FsbGV0IHZlcnNpb24gMywgNSBhbmQgNicpO1xuICAgIH1cblxuICAgIGlmIChpc1Rzcykge1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2luICR7dGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKX0gZG9lcyBub3Qgc3VwcG9ydCBUU1MgYXQgdGhpcyB0aW1lYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIChwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNSB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNikgJiZcbiAgICAgICAgIXRoaXMuYmFzZUNvaW4uZ2V0Q29uZmlnKCkuZmVhdHVyZXMuaW5jbHVkZXMoQ29pbkZlYXR1cmUuTVBDVjIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2luICR7dGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKX0gZG9lcyBub3Qgc3VwcG9ydCBUU1MgTVBDdjIgYXQgdGhpcyB0aW1lYCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXQnKTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdjb2xkJykge1xuICAgICAgICAvLyB2YWxpZGF0ZVxuICAgICAgICBhc3NlcnQocGFyYW1zLmJpdGdvS2V5SWQsICdiaXRnb0tleUlkIGlzIHJlcXVpcmVkIGZvciBTTUMgVFNTIHdhbGxldCcpO1xuICAgICAgICBhc3NlcnQocGFyYW1zLmNvbW1vbktleWNoYWluLCAnY29tbW9uS2V5Y2hhaW4gaXMgcmVxdWlyZWQgZm9yIFNNQyBUU1Mgd2FsbGV0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU01DTXBjV2FsbGV0KHtcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgICAgd2FsbGV0VmVyc2lvbjogcGFyYW1zLndhbGxldFZlcnNpb24sXG4gICAgICAgICAgYml0Z29LZXlJZDogcGFyYW1zLmJpdGdvS2V5SWQsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46IHBhcmFtcy5jb21tb25LZXljaGFpbixcbiAgICAgICAgICBjb2xkRGVyaXZhdGlvblNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDdXN0b2RpYWxNcGNXYWxsZXQoe1xuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChwYXNzcGhyYXNlLCAnY2Fubm90IGdlbmVyYXRlIFRTUyBrZXlzIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoe1xuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgcGFzc3BocmFzZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogcGFyYW1zLndhbGxldFZlcnNpb24sXG4gICAgICAgIHdlYmF1dGhuSW5mbzogcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuICAgICAgaWYgKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSB7XG4gICAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdhbGxldERhdGE7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpc3RyaWJ1dGVkIGN1c3RvZHlcbiAgICBpZiAoaXNEaXN0cmlidXRlZEN1c3RvZHkpIHtcbiAgICAgIGlmICghZW50ZXJwcmlzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBlbnRlcnByaXNlIHdoZW4gY3JlYXRpbmcgZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdHlwZSB8fCB0eXBlICE9PSAnY29sZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldHMgbXVzdCBiZSB0eXBlOiBjb2xkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQmFja3VwWHB1YiA9ICEhcGFyYW1zLmJhY2t1cFhwdWI7XG4gICAgY29uc3QgaGFzQmFja3VwWHB1YlByb3ZpZGVyID0gISFwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyO1xuICAgIGlmIChoYXNCYWNrdXBYcHViICYmIGhhc0JhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGJhY2t1cFhwdWIgb3IgYmFja3VwWHB1YlByb3ZpZGVyIGZsYWcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmIHBhcmFtcy5laXAxNTU5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgdXNlIGJvdGggZWlwMTU1OSBhbmQgZ2FzUHJpY2UgdmFsdWVzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICBjb25zdCBnYXNQcmljZUJOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZ2FzUHJpY2UpO1xuICAgICAgaWYgKGdhc1ByaWNlQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2FzIHByaWNlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlQk4udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmVpcDE1NTkpICYmICFfLmlzRW1wdHkocGFyYW1zLmVpcDE1NTkpKSB7XG4gICAgICBjb25zdCBtYXhGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhQcmlvcml0eUZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaW9yaXR5IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZWlwMTU1OSA9IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiBtYXhGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogbWF4UHJpb3JpdHlGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVLUlNFbWFpbCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlS1JTRW1haWwgPSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldFZlcnNpb24gcHJvdmlkZWQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy53YWxsZXRWZXJzaW9uID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGVhY2gga3JzU3BlY2lmaWMgcGFyYW0gaXMgZWl0aGVyIGEgc3RyaW5nLCBib29sZWFuLCBvciBudW1iZXJcbiAgICBjb25zdCB7IGtyc1NwZWNpZmljIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGtyc1NwZWNpZmljKSkge1xuICAgICAgT2JqZWN0LmtleXMoa3JzU3BlY2lmaWMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBrcnNTcGVjaWZpY1trZXldO1xuICAgICAgICBpZiAoIV8uaXNCb29sZWFuKHZhbCkgJiYgIV8uaXNTdHJpbmcodmFsKSAmJiAhXy5pc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrcnNTcGVjaWZpYyBvYmplY3QgY29udGFpbnMgaWxsZWdhbCB2YWx1ZXMuIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MsIGJvb2xlYW5zLCBvciBudW1iZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgaWYgKHBhcmFtcy50eXBlID09PSAnY3VzdG9kaWFsJyAmJiAocGFyYW1zLm11bHRpc2lnVHlwZSA/PyAnb25jaGFpbicpID09PSAnb25jaGFpbicpIHtcbiAgICAgIC8vIGZvciBjdXN0b2RpYWwgbXVsdGlzaWcsIHdoZW4gdGhlIHdhbGxldCBpcyBjcmVhdGVkIG9uIHRoZSBwbGF0Zm9yIHNpZGUsIHRoZSBrZXlzIGFyZSBub3QgbmVlZGVkXG4gICAgICB3YWxsZXRQYXJhbXMubiA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5tID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLmtleXMgPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7IC8vIHJldHVybnMgdGhlIGlkc1xuXG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLlVTRVJdLCByZXFJZCB9KTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogbmV3V2FsbGV0LmtleXNbS2V5SW5kaWNlcy5CQUNLVVBdLCByZXFJZCB9KTtcbiAgICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLkJJVEdPXSwgcmVxSWQgfSk7XG5cbiAgICAgIGNvbnN0IFt1c2VyS2V5LCBiaXRnb0tleSwgYmFja3VwS2V5XSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJpdGdvS2V5LFxuICAgICAgICBiaXRnb0tleWNoYWluOiBiYWNrdXBLZXksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGxldCB1c2VyS2V5Y2hhaW5QYXJhbXM7XG4gICAgICAgIGxldCB1c2VyS2V5Y2hhaW47XG4gICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdXNlciBrZXlcbiAgICAgICAgaWYgKHBhcmFtcy51c2VyS2V5KSB7XG4gICAgICAgICAgdXNlcktleWNoYWluID0geyBwdWI6IHBhcmFtcy51c2VyS2V5IH07XG4gICAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0gdXNlcktleWNoYWluO1xuICAgICAgICAgIGlmIChwYXJhbXMuY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICAgICAgICAvLyB0aGUgZGVyaXZhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYSBrZXkgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAgICAgICAga2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgICAgICAgc2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGggPSBkZXJpdmF0aW9uLmRlcml2YXRpb25QYXRoO1xuICAgICAgICAgICAgdXNlcktleWNoYWluLnB1YiA9IGRlcml2YXRpb24ua2V5O1xuICAgICAgICAgICAgdXNlcktleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGdlbmVyYXRlIHVzZXIga2V5cGFpciB3aXRob3V0IHBhc3NwaHJhc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSB1c2VyIGtleS5cbiAgICAgICAgICB1c2VyS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgICAgIHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgICBpbnB1dDogdXNlcktleWNoYWluLnBydixcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0ge1xuICAgICAgICAgICAgcHViOiB1c2VyS2V5Y2hhaW4ucHViLFxuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gSWYgV2ViQXV0aG4gaW5mbyBpcyBwcm92aWRlZCwgc3RvcmUgYW4gYWRkaXRpb25hbCBjb3B5IG9mIHRoZSBwcml2YXRlIGtleSBlbmNyeXB0ZWRcbiAgICAgICAgICAvLyB3aXRoIHRoZSBQUkYtZGVyaXZlZCBwYXNzcGhyYXNlIHNvIHRoZSBhdXRoZW50aWNhdG9yIGNhbiBsYXRlciBkZWNyeXB0IGl0LlxuICAgICAgICAgIC8vIFNlbmQgaXQgYXMgYHdlYmF1dGhuSW5mb2AgKHNpbmdsZSBvYmplY3QsIHdpdGggZW50ZXJwcmlzZUlkKSBzbyB0aGUgYXRvbWljXG4gICAgICAgICAgLy8gUE9TVCAva2V5IHBlcnNpc3RzIHRoZSBwYXNza2V5IOKAlCB0aGUgYmFja2VuZCBpZ25vcmVzIHRoZSBkZXByZWNhdGVkIGB3ZWJhdXRobkRldmljZXNgLlxuICAgICAgICAgIGlmIChwYXJhbXMud2ViYXV0aG5JbmZvICYmIHVzZXJLZXljaGFpbi5wcnYpIHtcbiAgICAgICAgICAgIHVzZXJLZXljaGFpblBhcmFtcy53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgICAgICAgIG90cERldmljZUlkOiBwYXJhbXMud2ViYXV0aG5JbmZvLm90cERldmljZUlkLFxuICAgICAgICAgICAgICBwcmZTYWx0OiBwYXJhbXMud2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgICAgICAgIGVudGVycHJpc2VJZDogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndlYmF1dGhuSW5mby5wYXNzcGhyYXNlLFxuICAgICAgICAgICAgICAgIGlucHV0OiB1c2VyS2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgICAgICAgYWRhdGE6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgICAgIGNvbnN0IG5ld1VzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHVzZXJLZXljaGFpblBhcmFtcyk7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZCh7fSwgbmV3VXNlcktleWNoYWluLCB1c2VyS2V5Y2hhaW4pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIpIHtcbiAgICAgICAgICAvLyBJZiByZXF1ZXN0ZWQsIHVzZSBhIEtSUyBvciBiYWNrdXAga2V5IHByb3ZpZGVyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyIHx8ICdkZWZhdWx0Uk1HQmFja3VwUHJvdmlkZXInLFxuICAgICAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICAgICAga3JzU3BlY2lmaWM6IHBhcmFtcy5rcnNTcGVjaWZpYyxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlciBwcm92aWRlZCBiYWNrdXAgeHB1YlxuICAgICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWIpIHtcbiAgICAgICAgICAvLyB1c2VyIHByb3ZpZGVkIGJhY2t1cCBldGhlcmV1bSBhZGRyZXNzXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgICAgICAgIHB1YjogcGFyYW1zLmJhY2t1cFhwdWIsXG4gICAgICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjYW5FbmNyeXB0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBnZW5lcmF0ZSBiYWNrdXAga2V5cGFpciB3aXRob3V0IHBhc3NwaHJhc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm8gcHJvdmlkZWQgYmFja3VwIHhwdWIgb3IgYWRkcmVzcywgc28gZGVmYXVsdCB0byBjcmVhdGluZyBvbmUgaGVyZVxuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9OiBLZXljaGFpbnNUcmlwbGV0ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiYWNrdXBLZXljaGFpblByb21pc2UoKSxcbiAgICAgICAgYml0Z29LZXljaGFpbjogdGhpcy5iYXNlQ29pblxuICAgICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAgIC5jcmVhdGVCaXRHbyh7IGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLCByZXFJZCwgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICB3YWxsZXRQYXJhbXMua2V5cyA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgICAgY29uc3QgeyBwcnYgfSA9IHVzZXJLZXljaGFpbjtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHBydikpIHtcbiAgICAgICAgYXNzZXJ0KGJhY2t1cEtleWNoYWluLnB1Yik7XG4gICAgICAgIGFzc2VydChiaXRnb0tleWNoYWluLnB1Yik7XG4gICAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0ge1xuICAgICAgICAgIGJhY2t1cDogKGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgYmFja3VwS2V5Y2hhaW4ucHViKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGJpdGdvOiAoYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBiaXRnb0tleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG5cbiAgICAgIGlmIChfLmluY2x1ZGVzKFsneHJwJywgJ3hsbScsICdjc3ByJ10sIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5yb290UHJpdmF0ZUtleSkpIHtcbiAgICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0gcGFyYW1zLnJvb3RQcml2YXRlS2V5O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbjogYml0Z29LZXljaGFpbixcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFja3VwS2V5Y2hhaW4ucHJ2KSkge1xuICAgICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVyaXZhdGlvblBhdGgpKSB7XG4gICAgICAgIHVzZXJLZXljaGFpbi5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FuRW5jcnlwdCAmJiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgICAgICByZXN1bHQuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbiBvbmNoYWluIG11bHRpc2lnIHdhbGxldCB1c2luZyBhbiBleHRlcm5hbCBzaWduZXIgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXkgY3JlYXRpb24uXG4gICAqIDEuIENhbGxzIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlzXG4gICAqIDIuIFVwbG9hZHMga2V5Y2hhaW5zIHZpYSBrZXljaGFpbnMoKS5hZGQoKVxuICAgKiAzLiBDcmVhdGVzIHRoZSBCaXRHbyBrZXkgb24gdGhlIHNlcnZpY2VcbiAgICogNC4gQ3JlYXRlcyB0aGUgd2FsbGV0IG9uIEJpdEdvIHdpdGggdGhlIDMgcHVibGljIGtleXNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lck9wdGlvbnNcbiAgKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgaGFzT25jaGFpbkNhbGxiYWNrID0gXy5pc0Z1bmN0aW9uKHBhcmFtcy5jcmVhdGVLZXljaGFpbkNhbGxiYWNrKTtcbiAgICBjb25zdCBoYXNNcGNDYWxsYmFja3MgPSAhIShwYXJhbXMuZWNkc2FNUEN2MkNhbGxiYWNrcyB8fCBwYXJhbXMuZWRkc2FDYWxsYmFja3MpO1xuXG4gICAgaWYgKGhhc09uY2hhaW5DYWxsYmFjayAmJiBoYXNNcGNDYWxsYmFja3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIE1QQyBUU1Mga2V5IGdlbmVyYXRpb24gY2FsbGJhY2tzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbXVsdGlzaWdUeXBlID1cbiAgICAgIHBhcmFtcy5tdWx0aXNpZ1R5cGUgPz8gKGhhc09uY2hhaW5DYWxsYmFjayA/ICdvbmNoYWluJyA6IHRoaXMuYmFzZUNvaW4uZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpKTtcblxuICAgIGlmIChtdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lcihwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChtdWx0aXNpZ1R5cGUgIT09ICdvbmNoYWluJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc0Z1bmN0aW9uKHBhcmFtcy5jcmVhdGVLZXljaGFpbkNhbGxiYWNrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGZ1bmN0aW9uIHBhcmFtZXRlciBjcmVhdGVLZXljaGFpbkNhbGxiYWNrJyk7XG4gICAgfVxuXG4gICAgLy8gdGhlc2UgYmVsb25nIHRvIHRoZSBwYXNzcGhyYXNlLWJhc2VkIHBhdGggYW5kIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrXG4gICAgY29uc3QgcGFzc3BocmFzZVBhdGhQYXJhbXMgPSBbJ3Bhc3NwaHJhc2UnLCAndXNlcktleScsICdiYWNrdXBYcHViJywgJ2JhY2t1cFhwdWJQcm92aWRlciddIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhc3NwaHJhc2VQYXRoUGFyYW1zKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zW2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB3aXRoICR7a2V5fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgbGFiZWwsIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssIHR5cGUgPSAnaG90JywgZW50ZXJwcmlzZSwgaXNEaXN0cmlidXRlZEN1c3RvZHkgfSA9IHBhcmFtcztcblxuICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgY3VzdG9kaWFsIG9uY2hhaW4gd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2ViYXV0aG5JbmZvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWJhdXRobkluZm8gaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3RyaWJ1dGVkQ3VzdG9keSkge1xuICAgICAgaWYgKCFlbnRlcnByaXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgIT09ICdjb2xkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmIHBhcmFtcy5laXAxNTU5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgdXNlIGJvdGggZWlwMTU1OSBhbmQgZ2FzUHJpY2UgdmFsdWVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFtdLFxuICAgICAgdHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVudGVycHJpc2UpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZW50ZXJwcmlzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudGVycHJpc2UgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gZW50ZXJwcmlzZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIGNvbnN0IGdhc1ByaWNlQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5nYXNQcmljZSk7XG4gICAgICBpZiAoZ2FzUHJpY2VCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnYXMgcHJpY2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2VCTi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZWlwMTU1OSkgJiYgIV8uaXNFbXB0eShwYXJhbXMuZWlwMTU1OSkpIHtcbiAgICAgIGNvbnN0IG1heEZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heEZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4UHJpb3JpdHlGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heFByaW9yaXR5RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpb3JpdHkgZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5laXAxNTU5ID0ge1xuICAgICAgICBtYXhGZWVQZXJHYXM6IG1heEZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBtYXhQcmlvcml0eUZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldFZlcnNpb24gcHJvdmlkZWQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy53YWxsZXRWZXJzaW9uID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luLmdldENoYWluKCk7XG5cbiAgICBjb25zdCBjcmVhdGVBbmRVcGxvYWRLZXljaGFpbiA9IGFzeW5jIChzb3VyY2U6ICd1c2VyJyB8ICdiYWNrdXAnKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW5Gcm9tQ2FsbGJhY2sgPSBhd2FpdCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrKHsgc291cmNlLCBjb2luIH0pO1xuICAgICAgICBpZiAoa2V5Y2hhaW5Gcm9tQ2FsbGJhY2suc291cmNlICE9PSBzb3VyY2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgc291cmNlICR7a2V5Y2hhaW5Gcm9tQ2FsbGJhY2suc291cmNlfSwgZXhwZWN0ZWQgJHtzb3VyY2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleWNoYWluRnJvbUNhbGxiYWNrLnR5cGUgIT09ICdpbmRlcGVuZGVudCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHR5cGUgJHtrZXljaGFpbkZyb21DYWxsYmFjay50eXBlfSwgZXhwZWN0ZWQgJ2luZGVwZW5kZW50JyBmb3Igb25jaGFpbiBtdWx0aXNpZ2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkUHViKGtleWNoYWluRnJvbUNhbGxiYWNrLnB1YikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCBwdWIgZm9yICR7c291cmNlfSBrZXkgb24gJHtjb2lufWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICAgICAgcHViOiBrZXljaGFpbkZyb21DYWxsYmFjay5wdWIsXG4gICAgICAgICAga2V5VHlwZToga2V5Y2hhaW5Gcm9tQ2FsbGJhY2sudHlwZSxcbiAgICAgICAgICBzb3VyY2U6IGtleWNoYWluRnJvbUNhbGxiYWNrLnNvdXJjZSxcbiAgICAgICAgICByZXFJZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgJHtzb3VyY2V9IGtleWNoYWluOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9OiBLZXljaGFpbnNUcmlwbGV0ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgIHVzZXJLZXljaGFpbjogY3JlYXRlQW5kVXBsb2FkS2V5Y2hhaW4oJ3VzZXInKSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBjcmVhdGVBbmRVcGxvYWRLZXljaGFpbignYmFja3VwJyksXG4gICAgICBiaXRnb0tleWNoYWluOiB0aGlzLmJhc2VDb2luXG4gICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlLCByZXFJZCwgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSB9KSxcbiAgICB9KTtcblxuICAgIHdhbGxldFBhcmFtcy5rZXlzID0gW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdO1xuXG4gICAgaWYgKHBhcmFtcy5rZXlTaWduYXR1cmVzKSB7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHBhcmFtcy5rZXlTaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuXG4gICAgaWYgKF8uaW5jbHVkZXMoWyd4cnAnLCAneGxtJywgJ2NzcHInXSwgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnJvb3RQcml2YXRlS2V5KSkge1xuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0gcGFyYW1zLnJvb3RQcml2YXRlS2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdXNlcidzIHdhbGxldCBzaGFyZXMgdjJcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0U2hhcmVzPn1cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXNWMigpOiBQcm9taXNlPFdhbGxldFNoYXJlcz4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcycsIDIpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgd2FsbGV0IHNoYXJlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGVuY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluLiByZXF1aXJlcyB1bmxvY2sgaWYga2V5Y2hhaW4gaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGdldCBpbmZvcm1hdGlvbiBvblxuICAgKi9cbiAgYXN5bmMgZ2V0U2hhcmUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhdGUgLSB0aGUgbmV3IHN0YXRlIG9mIHRoZSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2hhcmUocGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQnVsayBhY2NlcHQgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zIEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmVSZXF1ZXN0KHBhcmFtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1bGtBY2NlcHRTaGFyZVJlcXVlc3RXaXRoUmV0cnkocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVsa0FjY2VwdFNoYXJlUmVxdWVzdFdpdGhSZXRyeShwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSk6IFByb21pc2U8QnVsa0FjY2VwdFNoYXJlUmVzcG9uc2U+IHtcbiAgICAvLyBTZXJ2ZXIgaGFzIGEgbGltaXQgb2YgYXBwcm94aW1hdGVseSAxTUIgZm9yIHBheWxvYWQgc2l6ZVxuICAgIGxldCBNQVhfUEFZTE9BRF9TSVpFID0gOTUwMDAwOyAvLyB+OTUwS0IgdG8gbGVhdmUgc29tZSBidWZmZXJcblxuICAgIC8vIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHBheWxvYWRcbiAgICBjb25zdCBjYWxjdWxhdGVQYXlsb2FkU2l6ZSA9IChpdGVtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogbnVtYmVyID0+IHtcbiAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeSh7IGtleXNGb3JXYWxsZXRTaGFyZXM6IGl0ZW1zIH0pLCAndXRmOCcpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZ1BhcmFtcyA9IFsuLi5wYXJhbXNdO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZ1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBCdWlsZCBvcHRpbWFsIGJhdGNoIGJ5IGFkZGluZyBpdGVtcyB1bnRpbCB3ZSByZWFjaCBzaXplIGxpbWl0XG4gICAgICBjb25zdCBiYXRjaDogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdID0gW107XG4gICAgICAvLyBTdGFydCB3aXRoIGVtcHR5IGJhdGNoXG5cbiAgICAgIC8vIEFkZCBpdGVtcyBvbmUgYnkgb25lIHdoaWxlIG1vbml0b3JpbmcgcGF5bG9hZCBzaXplXG4gICAgICB3aGlsZSAocmVtYWluaW5nUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVGVzdCBhZGRpbmcgdGhlIG5leHQgaXRlbVxuICAgICAgICBjb25zdCB0ZXN0QmF0Y2ggPSBbLi4uYmF0Y2gsIHJlbWFpbmluZ1BhcmFtc1swXV07XG4gICAgICAgIGNvbnN0IHRlc3RTaXplID0gY2FsY3VsYXRlUGF5bG9hZFNpemUodGVzdEJhdGNoKTtcblxuICAgICAgICAvLyBJZiBhZGRpbmcgdGhpcyBpdGVtIHdvdWxkIGV4Y2VlZCB0aGUgc2l6ZSBsaW1pdCwgc3RvcCBhZGRpbmdcbiAgICAgICAgaWYgKHRlc3RTaXplID4gTUFYX1BBWUxPQURfU0laRSAmJiBiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgaXRlbSB0byB0aGUgYmF0Y2hcbiAgICAgICAgYmF0Y2gucHVzaChyZW1haW5pbmdQYXJhbXMuc2hpZnQoKSEpO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBldmVuIGEgc2luZ2xlIGl0ZW0gaXMgdG9vIGxhcmdlXG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwICYmIHJlbWFpbmluZ1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNlbmQganVzdCB0aGUgZmlyc3QgaXRlbSBldmVuIGlmIGl0J3Mgb3ZlcnNpemVkXG4gICAgICAgIGJhdGNoLnB1c2gocmVtYWluaW5nUGFyYW1zLnNoaWZ0KCkhKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZE9iaiA9IHsga2V5c0ZvcldhbGxldFNoYXJlczogYmF0Y2ggfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZXMvYWNjZXB0JywgMikpLnNlbmQocGF5bG9hZE9iaikucmVzdWx0KCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5hY2NlcHRlZFdhbGxldFNoYXJlcyAmJiBBcnJheS5pc0FycmF5KHJlc3VsdC5hY2NlcHRlZFdhbGxldFNoYXJlcykpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goLi4ucmVzdWx0LmFjY2VwdGVkV2FsbGV0U2hhcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MTMgJiYgYmF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGdldCA0MTMgd2l0aCBtdWx0aXBsZSBpdGVtcywgcHV0IHRoZW0gYmFjayBhbmQgdHJ5IHdpdGggaGFsZiB0aGUgYmF0Y2ggc2l6ZVxuICAgICAgICAgIHJlbWFpbmluZ1BhcmFtcy51bnNoaWZ0KC4uLmJhdGNoKTtcbiAgICAgICAgICBNQVhfUEFZTE9BRF9TSVpFID0gTWF0aC5mbG9vcihNQVhfUEFZTE9BRF9TSVpFIC8gMik7IC8vIFJlZHVjZSBzaXplIGxpbWl0IGZvciBuZXh0IGF0dGVtcHRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXB0ZWRXYWxsZXRTaGFyZXM6IHJlc3VsdHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlcXVlc3QoXG4gICAgcGFyYW1zOiBCdWxrVXBkYXRlV2FsbGV0U2hhcmVPcHRpb25zUmVxdWVzdFtdXG4gICk6IFByb21pc2U8QnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcy91cGRhdGUnLCAyKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgc2hhcmVzOiBwYXJhbXMsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBhIHdhbGxldCBzaGFyZSBpbnZpdGF0aW9uIGVtYWlsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB3aG9zZSBpbnZpdGlhdGlvbiBzaG91bGQgYmUgcmVzZW50XG4gICAqL1xuICBhc3luYyByZXNlbmRTaGFyZUludml0ZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1cmxQYXJ0cyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkICsgJy9yZXNlbmRlbWFpbCc7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyB1cmxQYXJ0cykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4gICAqL1xuICBhc3luYyBjYW5jZWxTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmRlbCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtc2hhcmUgd2FsbGV0IHdpdGggZXhpc3Rpbmcgc3BlbmRlcnMgb2YgdGhlIHdhbGxldFxuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICogQHBhcmFtIHVzZXJQYXNzd29yZFxuICAgKi9cbiAgYXN5bmMgcmVzaGFyZVdhbGxldFdpdGhTcGVuZGVycyhcbiAgICB3YWxsZXRJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gICAgaWYgKCF3YWxsZXQ/Ll93YWxsZXQ/LmVudGVycHJpc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW50ZXJwcmlzZSBub3QgZm91bmQgZm9yIHRoZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRlcnByaXNlVXNlcnNSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7d2FsbGV0Py5fd2FsbGV0Py5lbnRlcnByaXNlfS91c2VyYCkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgLy8gY3JlYXRlIGEgbWFwIG9mIHVzZXJzIGZvciBlYXN5IGxvb2t1cCAtIHdlIG5lZWQgdGhlIHVzZXIgZW1haWwgaWQgdG8gc2hhcmUgdGhlIHdhbGxldFxuICAgIGNvbnN0IHVzZXJzTWFwID0gbmV3IE1hcChcbiAgICAgIFsuLi5lbnRlcnByaXNlVXNlcnNSZXNwb25zZT8uYWRtaW5Vc2VycywgLi4uZW50ZXJwcmlzZVVzZXJzUmVzcG9uc2U/Lm5vbkFkbWluVXNlcnNdLm1hcCgob2JqKSA9PiBbb2JqLmlkLCBvYmpdKVxuICAgICk7XG5cbiAgICBpZiAoIXdhbGxldC5fd2FsbGV0LnVzZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlbmRlcnMgPSB3YWxsZXQuX3dhbGxldC51c2Vycy5maWx0ZXIoXG4gICAgICAodXNlcikgPT4gdXNlci5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSAmJiAhdXNlci5wZXJtaXNzaW9ucy5pbmNsdWRlcygnYWRtaW4nKSAmJiB1c2Vyc01hcC5oYXModXNlci51c2VyKVxuICAgICk7XG5cbiAgICBpZiAoc3BlbmRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGVjcnlwdCB0aGUgd2FsbGV0IGtleWNoYWluIG9uY2UgYW5kIHRocmVhZCB0aGUgcGxhaW50ZXh0IGludG8gZWFjaCBzaGFyZVdhbGxldCBjYWxsLlxuICAgIC8vIFdpdGhvdXQgdGhpcywgc2hhcmVXYWxsZXQgd291bGQgaW50ZXJuYWxseSByZS1kZWNyeXB0IHRoZSBzYW1lIGVuY3J5cHRlZFBydiB1bmRlciB0aGUgc2FtZVxuICAgIC8vIHdhbGxldFBhc3NwaHJhc2UgTiB0aW1lcyAob25lIEFyZ29uMmlkIHBlciByZWNpcGllbnQpLiBQZXItcmVjaXBpZW50IGVuY3J5cHQgc3RpbGwgdXNlcyBhXG4gICAgLy8gdW5pcXVlIEVDREgtZGVyaXZlZCBzZWNyZXQgc28gbm8gc2Vzc2lvbiBhbW9ydGl6YXRpb24gaXMgcG9zc2libGUgb24gdGhhdCBzaWRlLlxuICAgIGxldCBkZWNyeXB0ZWRLZXljaGFpbjogRGVjcnlwdGVkS2V5Y2hhaW5EYXRhIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHdhbGxldC5nZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcodXNlclBhc3N3b3JkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyBDb2xkIHdhbGxldDogbm8gZW5jcnlwdGVkIGtleWNoYWluIHRvIGRlY3J5cHQuIEZhbGwgdGhyb3VnaCBhbmQgbGV0IHNoYXJlV2FsbGV0IGhhbmRsZVxuICAgICAgLy8gaXQgcGVyLXJlY2lwaWVudCAod2hpY2ggd2lsbCBhbHNvIHRocm93IE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yIGJ1dCBhdCBhIHBvaW50XG4gICAgICAvLyB3aGVyZSB0aGUgY2FsbGVyIGV4cGVjdHMgaXQpLlxuICAgIH1cblxuICAgIC8vIFNlcXVlbnRpYWwgbG9vcCB0byBib3VuZCBjb25jdXJyZW50IEFyZ29uMmlkIFdBU00gaW5zdGFuY2VzIG9uIHRoZSBwZXItcmVjaXBpZW50IEVDREhcbiAgICAvLyBlbmNyeXB0IHNpZGUgKGVhY2ggcmVjaXBpZW50J3Mgc2VjcmV0IGlzIHVuaXF1ZSBzbyBQcm9taXNlLmFsbCBjb3VsZCBPT00gYXQgc2NhbGUpLlxuICAgIGZvciAoY29uc3QgdXNlciBvZiBzcGVuZGVycykge1xuICAgICAgY29uc3QgdXNlck9iamVjdCA9IHVzZXJzTWFwLmdldCh1c2VyLnVzZXIpO1xuICAgICAgYXNzZXJ0KHVzZXJPYmplY3QsIGBVc2VyICR7dXNlci51c2VyfSBub3QgZm91bmQgaW4gZW50ZXJwcmlzZSB1c2VycyBtYXBgKTtcbiAgICAgIGNvbnN0IHNoYXJlT3B0aW9uczogU2hhcmVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgICBwZXJtaXNzaW9uczogdXNlci5wZXJtaXNzaW9ucy5qb2luKCcsJyksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHVzZXJQYXNzd29yZCxcbiAgICAgICAgZW1haWw6IHVzZXJPYmplY3QuZW1haWwuZW1haWwsXG4gICAgICAgIHJlc2hhcmU6IHRydWUsXG4gICAgICAgIHNraXBLZXljaGFpbjogZmFsc2UsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbixcbiAgICAgIH07XG4gICAgICBhd2FpdCB3YWxsZXQuc2hhcmVXYWxsZXQoc2hhcmVPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIHdhbGxldCBzaGFyZSwgYWRkaW5nIHRoZSB3YWxsZXQgdG8gdGhlIHVzZXIncyBsaXN0XG4gICAqIE5lZWRzIGEgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGFjY2VwdFxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJQYXNzd29yZCAtIChyZXF1aXJlZCBpZiBtb3JlIGEga2V5Y2hhaW4gd2FzIHNoYXJlZCkgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIGFuZCBhIHdhbGxldCB3aXRoIG1vcmUgdGhhbiB2aWV3IHBlcm1pc3Npb25zIHdhcyBzaGFyZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZCBpcyB1c2VkLlxuICAgKiBAcGFyYW0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2IC0gc2V0IG9ubHkgaWYgdGhlIHBydiB3YXMgcmVjZWl2ZWQgb3V0LW9mLWJhbmQuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgWydvdmVycmlkZUVuY3J5cHRlZFBydicsICd1c2VyUGFzc3dvcmQnLCAnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcblxuICAgIGxldCBlbmNyeXB0ZWRQcnYgPSBwYXJhbXMub3ZlcnJpZGVFbmNyeXB0ZWRQcnY7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmUgPSBhd2FpdCB0aGlzLmdldFNoYXJlKHsgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQgfSk7XG5cbiAgICAvLyBNdWx0aS11c2VyLWtleSBjYXNlOiByZXF1aXJlcyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIHB1YmxpYyBrZXkgaW4gYWRkaXRpb24gdG8gdGhlIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgIGlmICh3YWxsZXRTaGFyZS51c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGdlbmVyYXRlIHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FsbGV0S2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5wcnYsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgIHB1Yjogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgfTtcblxuICAgICAgLy8gTm90ZTogVW5saWtlIGtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCwgd2UgZG8gTk9UIHJlc2hhcmUgdGhlIHdhbGxldCB3aXRoIHNwZW5kZXJzXG4gICAgICAvLyBUaGlzIGlzIGEga2V5IGRpZmZlcmVuY2UgLSBtdWx0aS1rZXktdXNlci1rZXkgd2FsbGV0cyBkb24ndCByZXF1aXJlIHJlc2hhcmVcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHVwZGF0ZVBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gS2V5Y2hhaW4gb3ZlcnJpZGUgY2FzZTogcmVxdWlyZXMgdXNlciBrZXljaGFpbiBjcmVhdGlvbiBhbmQgc2lnbmluZ1xuICAgIGlmIChcbiAgICAgIHdhbGxldFNoYXJlLmtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5kZXhPZignYWRtaW4nKSAhPT0gLTEgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xXG4gICAgKSB7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVVc2VyS2V5Y2hhaW4ocGFyYW1zLnVzZXJQYXNzd29yZCwgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uKTtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRQcnYgd2FzIG5vdCBmb3VuZCBvbiB3YWxsZXQga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgdHJhZGluZ0FjY291bnRJZDogd2FsbGV0U2hhcmUud2FsbGV0LFxuICAgICAgICBwdWJrZXk6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgY29uc3QgcGF5bG9hZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gICAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnY6IHByaXZhdGVLZXkgfSwgcGF5bG9hZFN0cmluZyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgICAga2V5SWQ6IHdhbGxldEtleWNoYWluLmlkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWRTdHJpbmcsXG4gICAgICB9KTtcbiAgICAgIC8vIElmIHRoZSB3YWxsZXQgc2hhcmUgd2FzIGFjY2VwdGVkIHN1Y2Nlc3NmdWxseSAoY2hhbmdlZD10cnVlKSwgcmVzaGFyZSB0aGUgd2FsbGV0IHdpdGggdGhlIHNwZW5kZXJzXG4gICAgICBpZiAocmVzcG9uc2UuY2hhbmdlZCAmJiByZXNwb25zZS5zdGF0ZSA9PT0gJ2FjY2VwdGVkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzaGFyZVdhbGxldFdpdGhTcGVuZGVycyh3YWxsZXRTaGFyZS53YWxsZXQsIHBhcmFtcy51c2VyUGFzc3dvcmQsIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBUT0RPOiBQWC0zODI2XG4gICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHJpZ2h0IGF3YXkgaWYgdGhlcmUgaXMgbm8ga2V5Y2hhaW4gdG8gZGVjcnlwdCwgb3IgaWYgZXhwbGljaXQgZW5jcnlwdGVkUHJ2IHdhcyBwcm92aWRlZFxuICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4gfHwgIXdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fCBlbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTW9yZSB0aGFuIHZpZXdpbmcgd2FzIHJlcXVlc3RlZCwgc28gd2UgbmVlZCB0byBwcm9jZXNzIHRoZSB3YWxsZXQga2V5cyB1c2luZyB0aGUgc2hhcmVkIGVjZGggc2NoZW1lXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCkpIGFzIGFueTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkWHBydiB3YXMgbm90IGZvdW5kIG9uIHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSB0aGUgc2hhcmluZyBrZXljaGFpbiwgd2UgY2FuIHdvcmsgb3V0IHRoZSBzZWNyZXQgdXNlZCBmb3Igc2hhcmluZyB0aGUgd2FsbGV0IHdpdGggdXNcbiAgICBzaGFyaW5nS2V5Y2hhaW4ucHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChcbiAgICAgIC8vIERlcml2ZSBrZXkgYnkgcGF0aCAod2hpY2ggaXMgdXNlZCBiZXR3ZWVuIHRoZXNlIDIgdXNlcnMgb25seSlcbiAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBZZXMhIFdlIGdvdCB0aGUgc2VjcmV0IHN1Y2Nlc3NmdWxseSBoZXJlLCBub3cgZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCBwcnZcbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgfSk7XG5cbiAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgY29uc3QgbmV3V2FsbGV0UGFzc3BocmFzZSA9IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQ7XG4gICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydixcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgfSk7XG4gICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgIH07XG5cbiAgICBpZiAoZW5jcnlwdGVkUHJ2KSB7XG4gICAgICB1cGRhdGVQYXJhbXMuZW5jcnlwdGVkUHJ2ID0gZW5jcnlwdGVkUHJ2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgQWNjZXB0IHdhbGxldCBzaGFyZXMsIGFkZGluZyB0aGUgd2FsbGV0cyB0byB0aGUgdXNlcidzIGxpc3RcbiAgICogTmVlZHMgYSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIGtleVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gYXJyYXkgb2YgdGhlIHdhbGxldCBzaGFyZXMgdG8gYWNjZXB0XG4gICAqIEBwYXJhbSBwYXJhbXMudXNlclBhc3N3b3JkIC0gdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICpcbiAgICpAcmV0dXJucyB7UHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmUocGFyYW1zOiBCdWxrQWNjZXB0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJMb2dpblBhc3N3b3JkJ10sIFsnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoJ25ld1dhbGxldFBhc3NwaHJhc2UnIGluIHBhcmFtcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgdmFsaWQgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB1c2VyIGxvZ2luIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRTaGFyZUlkcy5sZW5ndGggPiAwLCAnUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIHdhbGxldCBzaGFyZSB0byBhY2NlcHQnKTtcblxuICAgIGNvbnN0IGFsbFdhbGxldFNoYXJlcyA9IGF3YWl0IHRoaXMubGlzdFNoYXJlc1YyKCk7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVNYXAgPSBhbGxXYWxsZXRTaGFyZXMuaW5jb21pbmcucmVkdWNlKFxuICAgICAgKG1hcDogeyBba2V5OiBzdHJpbmddOiBXYWxsZXRTaGFyZSB9LCBzaGFyZSkgPT4gKHsgLi4ubWFwLCBbc2hhcmUuaWRdOiBzaGFyZSB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIGNvbnN0IHdhbGxldFNoYXJlcyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkc1xuICAgICAgLm1hcCgod2FsbGV0U2hhcmVJZCkgPT4gd2FsbGV0U2hhcmVNYXBbd2FsbGV0U2hhcmVJZF0pXG4gICAgICAuZmlsdGVyKCh3YWxsZXRTaGFyZSkgPT4gd2FsbGV0U2hhcmUgJiYgKHdhbGxldFNoYXJlLmtleWNoYWluIHx8IHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpKTtcblxuICAgIGlmICghd2FsbGV0U2hhcmVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB2YWxpZCB3YWxsZXQgc2hhcmVzIGZvdW5kIHRvIGFjY2VwdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQ7XG4gICAgY29uc3Qgd2ViYXV0aG5JbmZvID0gcGFyYW1zLndlYmF1dGhuSW5mbztcblxuICAgIC8vIE9uZSBzZXNzaW9uIG92ZXIgbmV3V2FsbGV0UGFzc3BocmFzZSAoYW5kIG9uZSBtb3JlIGZvciB3ZWJhdXRobkluZm8ucGFzc3BocmFzZSB3aGVuXG4gICAgLy8gcHJlc2VudCkuIHYyOiBvbmUgQXJnb24yaWQgZGVyaXZhdGlvbiB0b3RhbCwgcGVyLWVudmVsb3BlIEFFUyBrZXlzIHZpYSBIS0RGIHdpdGggZnJlc2hcbiAgICAvLyBzYWx0cyAoY3Jvc3MtZW52ZWxvcGUgaW5kZXBlbmRlbmNlIHByZXNlcnZlZCkuIHYxOiBzaGltIHJ1bnMgU0pDTCBwZXIgY2FsbCBzbyBjYWxsZXJzXG4gICAgLy8gcGlubmluZyBlbmNyeXB0aW9uVmVyc2lvbj0xIHN0aWxsIGdldCB2MSBlbnZlbG9wZXMgd2l0aG91dCBhbnkgYnJhbmNoaW5nIGhlcmUuXG4gICAgY29uc3Qgd2FsbGV0U2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24obmV3V2FsbGV0UGFzc3BocmFzZSwgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uKTtcbiAgICBsZXQgd2ViYXV0aG5TZXNzaW9uOiBJRW5jcnlwdGlvblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHdlYmF1dGhuU2Vzc2lvbiA9IHdlYmF1dGhuSW5mb1xuICAgICAgICA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgdGhlIHdlYmF1dGhuIHNlc3Npb24gZmFpbHMgdG8gaW5pdGlhbGl6ZSAoZS5nLiBXQVNNIE9PTSksIGRlc3Ryb3kgdGhlIHdhbGxldCBzZXNzaW9uXG4gICAgICAvLyB0byBhdm9pZCBsZWFraW5nIGl0cyBIS0RGIHJvb3QuIFByZXNlcnZlcyB0aGUgaW52YXJpYW50IHRoYXQgbm8gc2Vzc2lvbiBvdXRsaXZlcyBhXG4gICAgICAvLyBmYWlsdXJlIGluIHRoaXMgbWV0aG9kLlxuICAgICAgd2FsbGV0U2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NTaGFyZSA9IGFzeW5jICh3YWxsZXRTaGFyZTogV2FsbGV0U2hhcmUpOiBQcm9taXNlPEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXT4gPT4ge1xuICAgICAgLy8gSGFuZGxlIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQgY2FzZSAtIHRoZXNlIHNoYXJlcyBkb24ndCBoYXZlIGtleWNoYWluc1xuICAgICAgaWYgKHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgaWYgKCFwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgd2FsbGV0U2Vzc2lvbi5lbmNyeXB0KHdhbGxldEtleWNoYWluLnBydik7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZDogd2FsbGV0U2hhcmUuaWQsXG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGVuY3J5cHRlZFBydixcbiAgICAgICAgICAgIHB1Yjogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YW5kYXJkIGNhc2U6IHNoYXJlcyB3aXRoIGtleWNoYWluc1xuICAgICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgICBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JylcbiAgICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSBhd2FpdCB3YWxsZXRTZXNzaW9uLmVuY3J5cHQoZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2KTtcbiAgICAgIGNvbnN0IGVudHJ5OiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0ID0ge1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiB3YWxsZXRTaGFyZS5pZCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBuZXdFbmNyeXB0ZWRQcnYsXG4gICAgICB9O1xuICAgICAgaWYgKHdlYmF1dGhuSW5mbykge1xuICAgICAgICBhc3NlcnQod2ViYXV0aG5TZXNzaW9uLCAnd2ViYXV0aG5TZXNzaW9uIG11c3QgZXhpc3Qgd2hlbiB3ZWJhdXRobkluZm8gaXMgcHJvdmlkZWQnKTtcbiAgICAgICAgZW50cnkud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB3ZWJhdXRoblNlc3Npb24uZW5jcnlwdChkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsIHdhbGxldFNoYXJlLmVudGVycHJpc2UpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXlzRm9yV2FsbGV0U2hhcmVzOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgXy5jaHVuayh3YWxsZXRTaGFyZXMsIEJVTEtfU0hBUkVfQkFUQ0hfU0laRSkpIHtcbiAgICAgICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYmF0Y2gubWFwKCh3YWxsZXRTaGFyZSkgPT4gcHJvY2Vzc1NoYXJlKHdhbGxldFNoYXJlKSkpO1xuICAgICAgICBrZXlzRm9yV2FsbGV0U2hhcmVzLnB1c2goLi4uYmF0Y2hSZXN1bHRzLmZsYXQoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1bGtBY2NlcHRTaGFyZVJlcXVlc3Qoa2V5c0ZvcldhbGxldFNoYXJlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHdhbGxldFNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgd2ViYXV0aG5TZXNzaW9uPy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgbXVsdGlwbGUgd2FsbGV0IHNoYXJlcyBpbiBidWxrXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB1c2VycyB0byBhY2NlcHQgb3IgcmVqZWN0IG11bHRpcGxlIHdhbGxldCBzaGFyZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBJdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiB3YWxsZXQgc2hhcmVzIGluY2x1ZGluZyB0aG9zZSByZXF1aXJpbmcgc3BlY2lhbCBrZXljaGFpbiBvdmVycmlkZXNcbiAgICogYW5kIHRob3NlIHdpdGggZW5jcnlwdGVkIHByaXZhdGUga2V5cyB0aGF0IG5lZWQgdG8gYmUgZGVjcnlwdGVkIGFuZCByZS1lbmNyeXB0ZWQuXG4gICAqIEFmdGVyIHByb2Nlc3NpbmcsIGl0IGFsc28gcmVzaGFyZXMgYWNjZXB0ZWQgd2FsbGV0cyB3aXRoIHNwZW5kZXJzIGZvciBzcGVjaWFsIG92ZXJyaWRlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9ucyBmb3IgYnVsayB1cGRhdGluZyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2hhcmVzIC0gQXJyYXkgb2Ygd2FsbGV0IHNoYXJlcyB0byB1cGRhdGUgd2l0aCB0aGVpciBzdGF0dXMgKGFjY2VwdC9yZWplY3QpXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmQgZm9yIGRlY3J5cHRpb24gb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHJlLWVuY3J5cHRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgcmVzcG9uc2VzIGZvciBlYWNoIHdhbGxldCBzaGFyZSB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGJ1bGtVcGRhdGVXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlPiB7XG4gICAgaWYgKCFwYXJhbXMuc2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnNoYXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBhcnJheTogc2hhcmVzIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy5zaGFyZXMpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggc2hhcmUgaW4gdGhlIGFycmF5XG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBwYXJhbXMuc2hhcmVzKSB7XG4gICAgICBpZiAoIXNoYXJlLndhbGxldFNoYXJlSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFNoYXJlSWQgaW4gc2hhcmUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaGFyZS5zdGF0dXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHN0YXR1cyBpbiBzaGFyZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hhcmUuc3RhdHVzICE9PSAnYWNjZXB0JyAmJiBzaGFyZS5zdGF0dXMgIT09ICdyZWplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0dXMgaW4gc2hhcmU6ICcgKyBzaGFyZS5zdGF0dXMgKyAnLiBNdXN0IGJlIGVpdGhlciBcImFjY2VwdFwiIG9yIFwicmVqZWN0XCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzaGFyZS53YWxsZXRTaGFyZUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyB3YWxsZXRTaGFyZUlkIHRvIGJlIGEgc3RyaW5nIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBzdHJpbmc6IHVzZXJMb2dpblBhc3N3b3JkIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgcGFyYW1ldGVyIHN0cmluZzogbmV3V2FsbGV0UGFzc3BocmFzZSBidXQgZm91bmQgJyArIHR5cGVvZiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSk7XG4gICAgfVxuICAgIGFzc2VydChwYXJhbXMuc2hhcmVzLmxlbmd0aCA+IDAsICdubyBzaGFyZXMgYXJlIHBhc3NlZCcpO1xuXG4gICAgY29uc3QgeyBzaGFyZXM6IGlucHV0U2hhcmVzLCB1c2VyTG9naW5QYXNzd29yZCwgbmV3V2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb24gfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGFsbFdhbGxldFNoYXJlcyA9IGF3YWl0IHRoaXMubGlzdFNoYXJlc1YyKCk7XG5cbiAgICAvLyBPbmx5IGluY2x1ZGUgc2hhcmVzIHRoYXQgYXJlIGluIHRoZSBpbnB1dCBhcnJheSBmb3IgZWZmaWNpZW5jeVxuICAgIGNvbnN0IHNoYXJlSWRzID0gbmV3IFNldChpbnB1dFNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZS53YWxsZXRTaGFyZUlkKSk7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBhbGxXYWxsZXRTaGFyZXMuaW5jb21pbmdcbiAgICAgIC5maWx0ZXIoKHNoYXJlKSA9PiBzaGFyZUlkcy5oYXMoc2hhcmUuaWQpKVxuICAgICAgLmZvckVhY2goKHNoYXJlKSA9PiB3YWxsZXRTaGFyZU1hcC5zZXQoc2hhcmUuaWQsIHNoYXJlKSk7XG5cbiAgICBhbGxXYWxsZXRTaGFyZXMub3V0Z29pbmdcbiAgICAgIC5maWx0ZXIoKHNoYXJlKSA9PiBzaGFyZUlkcy5oYXMoc2hhcmUuaWQpKVxuICAgICAgLmZvckVhY2goKHNoYXJlKSA9PiB3YWxsZXRTaGFyZU1hcC5zZXQoc2hhcmUuaWQsIHNoYXJlKSk7XG5cbiAgICBjb25zdCByZXNvbHZlZFNoYXJlcyA9IGlucHV0U2hhcmVzLm1hcCgoc2hhcmUpID0+IHtcbiAgICAgIGNvbnN0IHdhbGxldFNoYXJlID0gd2FsbGV0U2hhcmVNYXAuZ2V0KHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgaWYgKCF3YWxsZXRTaGFyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2FsbGV0IHNoYXJlIHByb3ZpZGVkOiAke3NoYXJlLndhbGxldFNoYXJlSWR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zaGFyZSwgd2FsbGV0U2hhcmUgfTtcbiAgICB9KTtcblxuICAgIC8vIElkZW50aWZ5IHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgdGhhdCBuZWVkIHJlc2hhcmluZyBhZnRlciBhY2NlcHRhbmNlXG4gICAgY29uc3Qgc3BlY2lhbE92ZXJyaWRlQ2FzZXMgPSBuZXcgTWFwKCk7XG4gICAgcmVzb2x2ZWRTaGFyZXMuZm9yRWFjaCgoc2hhcmUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgc2hhcmUuc3RhdHVzID09PSAnYWNjZXB0JyAmJlxuICAgICAgICBzaGFyZS53YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJylcbiAgICAgICkge1xuICAgICAgICBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5zZXQoc2hhcmUud2FsbGV0U2hhcmVJZCwgc2hhcmUud2FsbGV0U2hhcmUud2FsbGV0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERlY3J5cHQgc2hhcmluZyBrZXljaGFpbiBpZiBuZWVkZWQgKG9ubHkgb25jZSlcbiAgICBsZXQgc2hhcmluZ0tleWNoYWluUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGRlY3J5cHQgaWYgdGhlcmUgYXJlIHNoYXJlcyB0byBhY2NlcHQgdGhhdCBtaWdodCBuZWVkIGl0XG4gICAgY29uc3QgaGFzU2hhcmVzUmVxdWlyaW5nRGVjcnlwdGlvbiA9XG4gICAgICBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5zaXplID4gMCB8fFxuICAgICAgcmVzb2x2ZWRTaGFyZXMuc29tZSgoc2hhcmUpID0+IHNoYXJlLnN0YXR1cyA9PT0gJ2FjY2VwdCcgJiYgc2hhcmUud2FsbGV0U2hhcmUua2V5Y2hhaW4/LmVuY3J5cHRlZFBydik7XG5cbiAgICBpZiAodXNlckxvZ2luUGFzc3dvcmQgJiYgaGFzU2hhcmVzUmVxdWlyaW5nRGVjcnlwdGlvbikge1xuICAgICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gYXdhaXQgdGhpcy5iaXRnby5nZXRFQ0RIS2V5Y2hhaW4oKTtcbiAgICAgIGlmICghc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgc2hhcmluZ0tleWNoYWluUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPbmUgc2Vzc2lvbiBvdmVyIHRoZSBvdXRlciByZS1lbmNyeXB0IHBhc3N3b3JkLiBDb3ZlcnMgYWxsIHRocmVlIGFjY2VwdCBwYXRocyBpblxuICAgIC8vIHByb2Nlc3NBY2NlcHRTaGFyZSDigJQgc3BlY2lhbE92ZXJyaWRlQ2FzZSAodGhyZWFkZWQgdGhyb3VnaCBjcmVhdGVVc2VyS2V5Y2hhaW4pLFxuICAgIC8vIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQsIGFuZCBzdGFuZGFyZCBFQ0RIIHJlLWVuY3J5cHQg4oCUIHNpbmNlIHRoZXkgYWxsIHVzZSB0aGVcbiAgICAvLyBzYW1lIGBuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkYC4gU2tpcCBzZXNzaW9uIGNyZWF0aW9uIHdoZW4gdGhlcmUnc1xuICAgIC8vIG5vdGhpbmcgdG8gZW5jcnlwdCAocmVqZWN0LW9ubHkgYnVsa3MpLlxuICAgIGNvbnN0IHNlc3Npb25QYXNzd29yZCA9IG5ld1dhbGxldFBhc3NwaHJhc2UgfHwgdXNlckxvZ2luUGFzc3dvcmQ7XG4gICAgY29uc3QgaGFzU2hhcmVzVG9FbmNyeXB0ID0gcmVzb2x2ZWRTaGFyZXMuc29tZSgoc2hhcmUpID0+IHNoYXJlLnN0YXR1cyA9PT0gJ2FjY2VwdCcpO1xuICAgIGNvbnN0IHNlc3Npb24gPVxuICAgICAgc2Vzc2lvblBhc3N3b3JkICYmIGhhc1NoYXJlc1RvRW5jcnlwdFxuICAgICAgICA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24oc2Vzc2lvblBhc3N3b3JkLCBlbmNyeXB0aW9uVmVyc2lvbilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlO1xuICAgIGxldCBmYWlsZWRVcGRhdGVzOiBBcnJheTx7IHdhbGxldFNoYXJlSWQ6IHN0cmluZzsgcmVhc29uOiBzdHJpbmcgfT4gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGxlZFVwZGF0ZXM6IFByb21pc2VTZXR0bGVkUmVzdWx0PEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0W10+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgXy5jaHVuayhyZXNvbHZlZFNoYXJlcywgQlVMS19TSEFSRV9CQVRDSF9TSVpFKSkge1xuICAgICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgYmF0Y2gubWFwKGFzeW5jIChzaGFyZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB3YWxsZXRTaGFyZUlkLCBzdGF0dXMsIHdhbGxldFNoYXJlIH0gPSBzaGFyZTtcblxuICAgICAgICAgICAgLy8gSGFuZGxlIGFjY2VwdCBjYXNlXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnYWNjZXB0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQWNjZXB0U2hhcmUoXG4gICAgICAgICAgICAgICAgd2FsbGV0U2hhcmVJZCxcbiAgICAgICAgICAgICAgICB3YWxsZXRTaGFyZSxcbiAgICAgICAgICAgICAgICB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgICAgICAgICAgICBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgICAgIHNoYXJpbmdLZXljaGFpblBydixcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgICAgICBzZXNzaW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSByZWplY3QgY2FzZVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncmVqZWN0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgc2V0dGxlZFVwZGF0ZXMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IHN1Y2Nlc3NmdWwgdXBkYXRlc1xuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFVwZGF0ZXMgPSBzZXR0bGVkVXBkYXRlcy5mbGF0TWFwKChyZXN1bHQpID0+IChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyA/IHJlc3VsdC52YWx1ZSA6IFtdKSk7XG5cbiAgICAgIC8vIEV4dHJhY3QgZmFpbGVkIHVwZGF0ZXMgLSBvbmx5IGZyb20gcmVqZWN0ZWQgcHJvbWlzZXNcbiAgICAgIGZhaWxlZFVwZGF0ZXMgPSBzZXR0bGVkVXBkYXRlcy5yZWR1Y2U8QXJyYXk8eyB3YWxsZXRTaGFyZUlkOiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nIH0+PigoYWNjLCByZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgcmVqZWN0ZWRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZDogcmVzb2x2ZWRTaGFyZXNbaW5kZXhdLndhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICByZWFzb246IHJlamVjdGVkUmVzdWx0LnJlYXNvbj8ubWVzc2FnZSB8fCBTdHJpbmcocmVqZWN0ZWRSZXN1bHQucmVhc29uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgW10pO1xuXG4gICAgICAvLyBTZW5kIHN1Y2Nlc3NmdWwgdXBkYXRlcyB0byB0aGUgc2VydmVyXG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVxdWVzdChzdWNjZXNzZnVsVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNlc3Npb24/LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGFjY2VwdGVkIHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgLSByZXNoYXJlIHdpdGggc3BlbmRlcnNcbiAgICBpZiAocmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMgJiYgcmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMubGVuZ3RoID4gMCAmJiB1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgLy8gRm9yIGVhY2ggYWNjZXB0ZWQgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYSBzcGVjaWFsIG92ZXJyaWRlIGNhc2UsIHJlc2hhcmUgd2l0aCBzcGVuZGVyc1xuICAgICAgZm9yIChjb25zdCB3YWxsZXRTaGFyZUlkIG9mIHJlc3BvbnNlLmFjY2VwdGVkV2FsbGV0U2hhcmVzKSB7XG4gICAgICAgIGlmIChzcGVjaWFsT3ZlcnJpZGVDYXNlcy5oYXMod2FsbGV0U2hhcmVJZCkpIHtcbiAgICAgICAgICBjb25zdCB3YWxsZXRJZCA9IHNwZWNpYWxPdmVycmlkZUNhc2VzLmdldCh3YWxsZXRTaGFyZUlkKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldElkLCB1c2VyTG9naW5QYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIExvZyBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBzaGFyZXNcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlc2hhcmluZyB3YWxsZXQgJHt3YWxsZXRJZH0gd2l0aCBzcGVuZGVyczogJHtlPy5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBmYWlsZWQgdXBkYXRlcyB0byB0aGUgcmVzcG9uc2VcbiAgICBpZiAoZmFpbGVkVXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXNwb25zZS53YWxsZXRTaGFyZVVwZGF0ZUVycm9ycy5wdXNoKC4uLmZhaWxlZFVwZGF0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYmVpbmcgYWNjZXB0ZWRcbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgZGlmZmVyZW50IGNhc2VzIGZvciBhY2NlcHRpbmcgYSB3YWxsZXQgc2hhcmU6XG4gICAqIDEuIFNwZWNpYWwgb3ZlcnJpZGUgY2FzZSByZXF1aXJpbmcgdXNlciBrZXljaGFpbiBhbmQgc2lnbmluZ1xuICAgKiAyLiBTaW1wbGUgY2FzZSB3aXRoIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICogMy4gU3RhbmRhcmQgY2FzZSByZXF1aXJpbmcgZGVjcnlwdGlvbiBhbmQgcmUtZW5jcnlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0U2hhcmVJZCAtIElEIG9mIHRoZSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHdhbGxldFNoYXJlIC0gV2FsbGV0IHNoYXJlIG9iamVjdFxuICAgKiBAcGFyYW0gdXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHNoYXJpbmdLZXljaGFpblBydiAtIERlY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluIHByaXZhdGUga2V5XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHdhbGxldCBzaGFyZSB1cGRhdGUgcmVxdWVzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0FjY2VwdFNoYXJlKFxuICAgIHdhbGxldFNoYXJlSWQ6IHN0cmluZyxcbiAgICB3YWxsZXRTaGFyZTogV2FsbGV0U2hhcmUsXG4gICAgdXNlckxvZ2luUGFzc3dvcmQ/OiBzdHJpbmcsXG4gICAgbmV3V2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBzaGFyaW5nS2V5Y2hhaW5QcnY/OiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBzZXNzaW9uPzogSUVuY3J5cHRpb25TZXNzaW9uXG4gICk6IFByb21pc2U8QnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9uc1JlcXVlc3RbXT4ge1xuICAgIC8vIFNwZWNpYWwgb3ZlcnJpZGUgY2FzZTogcmVxdWlyZXMgdXNlciBrZXljaGFpbiBhbmQgc2lnbmluZ1xuICAgIGlmIChcbiAgICAgIHdhbGxldFNoYXJlLmtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpXG4gICAgKSB7XG4gICAgICBpZiAoIXVzZXJMb2dpblBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhyZWFkIHRoZSBvdXRlciBzZXNzaW9uIGludG8gY3JlYXRlVXNlcktleWNoYWluIHNvIGl0cyBpbnRlcm5hbCBlbmNyeXB0IHVzZXMgSEtERlxuICAgICAgLy8gaW5zdGVhZCBvZiBydW5uaW5nIGFub3RoZXIgQXJnb24yaWQgdW5kZXIgdGhlIHNhbWUgcGFzc3dvcmQuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVVc2VyS2V5Y2hhaW4obmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24sIHNlc3Npb24pO1xuICAgICAgaWYgKCF3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRQcnYgd2FzIG5vdCBmb3VuZCBvbiB3YWxsZXQga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHJhZGluZ0FjY291bnRJZDogd2FsbGV0U2hhcmUud2FsbGV0LFxuICAgICAgICBwdWJrZXk6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgcGF5bG9hZCk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAga2V5SWQ6IHdhbGxldEtleWNoYWluLmlkLFxuICAgICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBNdWx0aS11c2VyLWtleSBjYXNlOiByZXF1aXJlcyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIHB1YmxpYyBrZXlcbiAgICBpZiAod2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkO1xuICAgICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBzZXNzaW9uXG4gICAgICAgID8gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHdhbGxldEtleWNoYWluLnBydilcbiAgICAgICAgOiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZCwgaW5wdXQ6IHdhbGxldEtleWNoYWluLnBydiwgZW5jcnlwdGlvblZlcnNpb24gfSk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgcHViOiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmICghdXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICB9XG4gICAgaWYgKCFzaGFyaW5nS2V5Y2hhaW5QcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHJldHJpZXZlIGFuZCBkZWNyeXB0IHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXJpdmVkS2V5ID0gYmlwMzIuZnJvbUJhc2U1OChzaGFyaW5nS2V5Y2hhaW5QcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKTtcblxuICAgIGNvbnN0IHNoYXJlZFNlY3JldCA9IGdldFNoYXJlZFNlY3JldChkZXJpdmVkS2V5LCBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JykpLnRvU3RyaW5nKFxuICAgICAgJ2hleCdcbiAgICApO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzaGFyZWRTZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gUmUtZW5jcnlwdCBmb3IgdGhlIGFjY2VwdGVyLiBUaGUgcGVyLXJlY2lwaWVudCBFQ0RIIGRlY3J5cHQgYWJvdmUgc3RpbGwgcnVucyBpdHMgb3duXG4gICAgLy8gQXJnb24yIHdoZW4gdGhlIHNlbmRlcidzIGtleWNoYWluIGlzIHYyICh1bmlxdWUgcGFzc3dvcmQgcGVyIHNoYXJlLCBubyBzZXNzaW9uIHBvc3NpYmxlKS5cbiAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBzZXNzaW9uXG4gICAgICA/IGF3YWl0IHNlc3Npb24uZW5jcnlwdChkZWNyeXB0ZWRQcnYpXG4gICAgICA6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UgfHwgdXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICAgICAgaW5wdXQ6IGRlY3J5cHRlZFBydixcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0dXM6ICdhY2NlcHQnIGFzIGNvbnN0LFxuICAgICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuaWQgd2FsbGV0IGlkXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBHZXRXYWxsZXRPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pbmNsdWRlQmFsYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZSA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBpdHMgYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyB3YWxsZXQgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEJ5QWRkcmVzcyhwYXJhbXM6IEdldFdhbGxldEJ5QWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGRyZXNzLycgKyBwYXJhbXMuYWRkcmVzcykpLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIHdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBnaXZlbiBzdXBwb3J0ZWQgY29pbiwgZ2V0IHRvdGFsIGJhbGFuY2VzIGZvciBhbGwgd2FsbGV0cyBvZiB0aGF0XG4gICAqIGNvaW4gdHlwZSBvbiB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRvdGFsQmFsYW5jZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2JhbGFuY2VzJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFRTUyB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyIGNhbGxiYWNrcyBmb3Iga2V5IGdlbmVyYXRpb24uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogR2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXJPcHRpb25zXG4gICk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHsgbGFiZWwsIGVudGVycHJpc2UsIHR5cGUgPSAnaG90JyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgVFNTIGF0IHRoaXMgdGltZWApO1xuICAgIH1cblxuICAgIGlmICghZW50ZXJwcmlzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIGZvciBUU1Mgd2FsbGV0IGdlbmVyYXRpb24gd2l0aCBleHRlcm5hbCBzaWduZXInKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmJhc2VDb2luLmlzRVZNKCkgJiZcbiAgICAgIHBhcmFtcy53YWxsZXRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICEocGFyYW1zLndhbGxldFZlcnNpb24gPT09IDUgfHwgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDYpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VWTSBUU1Mgd2FsbGV0cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHdhbGxldCB2ZXJzaW9uIDUgYW5kIDYnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9kaWFsIFRTUyB3YWxsZXRzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgVFNTIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2ViYXV0aG5JbmZvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWJhdXRobkluZm8gaXMgbm90IHN1cHBvcnRlZCBmb3IgVFNTIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NwaHJhc2VQYXRoUGFyYW1zID0gWydwYXNzcGhyYXNlJywgJ3VzZXJLZXknLCAnYmFja3VwWHB1YicsICdiYWNrdXBYcHViUHJvdmlkZXInXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXNzcGhyYXNlUGF0aFBhcmFtcykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtc1trZXldKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBjYW5ub3QgYmUgdXNlZCB3aXRoIFRTUyBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtcGNBbGdvcml0aG0gPSB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpO1xuICAgIGxldCB3YWxsZXRWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQgPSBwYXJhbXMud2FsbGV0VmVyc2lvbjtcbiAgICBsZXQga2V5Y2hhaW5zOiBLZXljaGFpbnNUcmlwbGV0O1xuXG4gICAgaWYgKG1wY0FsZ29yaXRobSA9PT0gJ2VjZHNhJykge1xuICAgICAgaWYgKCFwYXJhbXMuZWNkc2FNUEN2MkNhbGxiYWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VjZHNhTVBDdjJDYWxsYmFja3MgaXMgcmVxdWlyZWQgZm9yIEVDRFNBIFRTUyB3YWxsZXQgZ2VuZXJhdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25lcicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZSB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuXG4gICAgICBpZiAod2FsbGV0VmVyc2lvbiA9PT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VDRFNBIE1QQ3YxICh3YWxsZXQgdmVyc2lvbiAzKSBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAod2FsbGV0VmVyc2lvbiA9PT0gNSB8fCB3YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAga2V5Y2hhaW5zID0gYXdhaXQgbmV3IEVDRFNBVXRpbHMuRWNkc2FNUEN2MlV0aWxzKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIGNhbGxiYWNrczogcGFyYW1zLmVjZHNhTVBDdjJDYWxsYmFja3MsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwYXJhbXMuZWRkc2FDYWxsYmFja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlZGRzYUNhbGxiYWNrcyBpcyByZXF1aXJlZCBmb3IgRWREU0EgVFNTIHdhbGxldCBnZW5lcmF0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmVyJyk7XG4gICAgICB9XG4gICAgICBrZXljaGFpbnMgPSBhd2FpdCBuZXcgRUREU0FVdGlscy5kZWZhdWx0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIGNhbGxiYWNrczogcGFyYW1zLmVkZHNhQ2FsbGJhY2tzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBrZXljaGFpbnM7XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIHR5cGUsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgVFNTIG9yIEJMUy1ES0cgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTXBjV2FsbGV0KHtcbiAgICBwYXNzcGhyYXNlLFxuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIHdlYmF1dGhuSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgfTogR2VuZXJhdGVNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZSB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZU1wYyh7XG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0ga2V5Y2hhaW5zO1xuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgIH07XG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpKSB7XG4gICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU2VsZi1NYW5hZ2VkIENvbGQgVFNTIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNNQ01wY1dhbGxldCh7XG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgICBiaXRnb0tleUlkLFxuICAgIGNvbW1vbktleWNoYWluLFxuICAgIGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgfTogR2VuZXJhdGVTTUNNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucXVlcnkoeyBlbnRlcnByaXNlIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/LmNvbGRNdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBNUEMgS2V5Y2hhaW5zXG4gICAgY29uc3QgYml0Z29LZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGJpdGdvS2V5SWQgfSk7XG5cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4gfHwgIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0R28ga2V5Y2hhaW4gbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgaWYgKGJpdGdvS2V5Y2hhaW4uc291cmNlICE9PSAnYml0Z28nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBiaXRnb0tleUlkIGlzIG5vdCBhIEJpdEdvIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgaWYgKGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4gIT09IGNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBDb21tb24ga2V5Y2hhaW4gbWlzbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgQml0Z28ga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBjb21tb25LZXljaGFpbixcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgIGlzTVBDdjI6IG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcblxuICAgIGNvbnN0IGJhY2t1cEtleUNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogY29tbW9uS2V5Y2hhaW4sXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBjb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICBpc01QQ3YyOiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChiYWNrdXBLZXlDaGFpblBhcmFtcyk7XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3Qga2V5Y2hhaW5zID0geyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH07XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIHR5cGU6ICdjb2xkJyxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDdXN0b2RpYWwgVFNTIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUN1c3RvZGlhbE1wY1dhbGxldCh7XG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgfTogR2VuZXJhdGVCYXNlTXBjV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZSB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5jdXN0b2RpYWxNdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICAgIHR5cGU6ICdjdXN0b2RpYWwnLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gd2FsbGV0LmtleUlkcygpO1xuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzBdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ3VzZXInIH0sXG4gICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzFdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JhY2t1cCcgfSxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6IGtleWNoYWluc1syXSwgdHlwZTogbXVsdGlzaWdUeXBlLCBzb3VyY2U6ICdiaXRnbycgfSxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbj86IG51bWJlciwgbXVsdGlzaWdUeXBlVmVyc2lvbj86IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICBpZiAoIXdhbGxldFZlcnNpb24gfHwgKHdhbGxldFZlcnNpb24gIT09IDUgJiYgd2FsbGV0VmVyc2lvbiAhPT0gNikpIHtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YWxsZXRWZXJzaW9uO1xuICB9XG59XG4iXX0=
|
|
1796
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxREEsc0RBSUM7QUF6REQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLDhDQUF3QztBQUN4QywwQ0FBNEI7QUFDNUIsNENBQTZDO0FBRTdDLG1DQUF1SDtBQUN2SCxxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLHNDQUEwRDtBQUMxRCwwQ0FBdUU7QUFDdkUsb0NBQTZGO0FBQzdGLHlDQTJCb0I7QUFFcEIscUNBQWtDO0FBRWxDLDhDQUF5RjtBQUV6Rjs7R0FFRztBQUNILFNBQWdCLHFCQUFxQixDQUNuQyxNQUE0RjtJQUU1RixPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUsscUJBQXFCLENBQUM7QUFDdkQsQ0FBQztBQUVELDhGQUE4RjtBQUM5Riw2RkFBNkY7QUFDN0YscUZBQXFGO0FBQ3JGLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBRWpDLE1BQWEsT0FBTztJQUlsQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBMkIsRUFBRTtRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXNELEVBQUU7UUFDakUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFD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QUFFLG1CQUE0QjtRQUN6RixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksbUJBQW1CLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUF6akVELDBCQXlqRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ29pbkZlYXR1cmUgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5cbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBISUdIX0VOVFJPUFlfRU5DUllQVElPTl9WRVJTSU9OLCBJRW5jcnlwdGlvblNlc3Npb24sIHNhbml0aXplTGVnYWN5UGF0aCB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7IE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgS2V5Y2hhaW4sIEtleUluZGljZXMgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBkZWNvZGVPckVsc2UsIEVDRFNBVXRpbHMsIEVERFNBVXRpbHMsIHByb21pc2VQcm9wcywgUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFjY2VwdFNoYXJlT3B0aW9ucyxcbiAgQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdCxcbiAgQWRkV2FsbGV0T3B0aW9ucyxcbiAgQnVsa0FjY2VwdFNoYXJlT3B0aW9ucyxcbiAgQnVsa0FjY2VwdFNoYXJlUmVzcG9uc2UsXG4gIEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnMsXG4gIEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0LFxuICBCdWxrVXBkYXRlV2FsbGV0U2hhcmVSZXNwb25zZSxcbiAgR2VuZXJhdGVCYXNlTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYyxcbiAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYyxcbiAgR2VuZXJhdGVNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZVNNQ01wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXJPcHRpb25zLFxuICBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zLFxuICBHZXRXYWxsZXRPcHRpb25zLFxuICBHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluLFxuICBJV2FsbGV0cyxcbiAgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyxcbiAgTGlzdFdhbGxldE9wdGlvbnMsXG4gIFVwZGF0ZVNoYXJlT3B0aW9ucyxcbiAgV2FsbGV0U2hhcmVzLFxuICBXYWxsZXRXaXRoS2V5Y2hhaW5zLFxufSBmcm9tICcuL2lXYWxsZXRzJztcbmltcG9ydCB7IERlY3J5cHRlZEtleWNoYWluRGF0YSwgU2hhcmVXYWxsZXRPcHRpb25zLCBXYWxsZXRTaGFyZSB9IGZyb20gJy4vaVdhbGxldCc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuL3dhbGxldCc7XG5pbXBvcnQgeyBUc3NTZXR0aW5ncyB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRXZtS2V5UmluZ1dhbGxldCwgdmFsaWRhdGVFdm1LZXlSaW5nV2FsbGV0UGFyYW1zIH0gZnJvbSAnLi4vZXZtL2V2bVV0aWxzJztcblxuLyoqXG4gKiBDaGVjayBpZiBhIHdhbGxldCBpcyBhIFdhbGxldFdpdGhLZXljaGFpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2FsbGV0V2l0aEtleWNoYWlucyhcbiAgd2FsbGV0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyB8IEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW5cbik6IHdhbGxldCBpcyBXYWxsZXRXaXRoS2V5Y2hhaW5zIHtcbiAgcmV0dXJuIHdhbGxldC5yZXNwb25zZVR5cGUgPT09ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJztcbn1cblxuLy8gQm91bmQgY29uY3VycmVudCBBcmdvbjJpZCBXQVNNIGluc3RhbmNlcyBhY3Jvc3MgYnVsayBzaGFyZSBmbG93cy4gRWFjaCBkZWNyeXB0L2VuY3J5cHQgY2FsbFxuLy8gcmVzZXJ2ZXMgfjIgR2lCIG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZTsgcnVubmluZyBhbGwgc2hhcmVzIGNvbmN1cnJlbnRseSBPT01zIHRoZSBicm93c2VyXG4vLyBhdCBzY2FsZSAoZS5nLiA5NiB3YWxsZXRzKS4gMTYga2VlcHMgZW5vdWdoIHBhcmFsbGVsaXNtIHdpdGhvdXQgZXhoYXVzdGluZyBtZW1vcnkuXG5jb25zdCBCVUxLX1NIQVJFX0JBVENIX1NJWkUgPSAxNjtcblxuZXhwb3J0IGNsYXNzIFdhbGxldHMgaW1wbGVtZW50cyBJV2FsbGV0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBJRCAocHJveHkgZm9yIGdldFdhbGxldClcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2V0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRXYWxsZXQocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGEgdXNlcidzIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGxpc3QocGFyYW1zOiBMaXN0V2FsbGV0T3B0aW9ucyAmIHsgZW50ZXJwcmlzZT86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPHsgd2FsbGV0czogV2FsbGV0W10gfT4ge1xuICAgIGlmIChwYXJhbXMuc2tpcCAmJiBwYXJhbXMucHJldklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggc2tpcCBhbmQgcHJldklkJyk7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSkgYXMgYW55O1xuICAgIGJvZHkud2FsbGV0cyA9IGJvZHkud2FsbGV0cy5tYXAoKHcpID0+IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgdykpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZFxuICAgKiBBZGQgYSBuZXcgd2FsbGV0IChhZHZhbmNlZCBtb2RlKS5cbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIG1hbnVhbGx5IHN1Ym1pdCB0aGUga2V5cywgdHlwZSwgbSBhbmQgbiBvZiB0aGUgd2FsbGV0XG4gICAqIFBhcmFtZXRlcnMgaW5jbHVkZTpcbiAgICogICAgXCJsYWJlbFwiOiBsYWJlbCBvZiB0aGUgd2FsbGV0IHRvIGJlIHNob3duIGluIFVJXG4gICAqICAgIFwibVwiOiBudW1iZXIgb2Yga2V5cyByZXF1aXJlZCB0byB1bmxvY2sgd2FsbGV0ICgyKVxuICAgKiAgICBcIm5cIjogbnVtYmVyIG9mIGtleXMgYXZhaWxhYmxlIG9uIHRoZSB3YWxsZXQgKDMpXG4gICAqICAgIFwia2V5c1wiOiBhcnJheSBvZiBrZXljaGFpbiBpZHNcbiAgICovXG4gIGFzeW5jIGFkZChwYXJhbXM6IEFkZFdhbGxldE9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2xhYmVsJywgJ2VudGVycHJpc2UnLCAndHlwZSddKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgbGFiZWwnKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUV2bUtleVJpbmdXYWxsZXRQYXJhbXMocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcblxuICAgIGlmICghcGFyYW1zLmV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZCAmJiBwYXJhbXMudHlwZSAhPT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gcGFzcyBrZXlzIGZvciAoc2luZ2xlKSBjdXN0b2RpYWwgd2FsbGV0c1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLmtleXMpID09PSBmYWxzZSB8fCAhXy5pc051bWJlcihwYXJhbXMubSkgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgdHlwZXMgb2YgbXVsdGlzaWdcbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkTW9mTlNldHVwKHBhcmFtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmdhc1ByaWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBnYXNQcmljZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMud2FsbGV0VmVyc2lvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIHdhbGxldFZlcnNpb24gLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnICYmIHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSAzKSB7XG4gICAgICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgICAucXVlcnkoeyBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSB9KVxuICAgICAgICAgIC5yZXN1bHQoKTtcbiAgICAgICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgICBpZiAobXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgIHBhcmFtcy53YWxsZXRWZXJzaW9uID0gNTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMudGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgdGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jbGllbnRGbGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5jbGllbnRGbGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGNsaWVudEZsYWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ29sZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ29sZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDb2xkIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDdXN0b2RpYWwgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0N1c3RvZGlhbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDdXN0b2RpYWwgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzICYmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykgfHwgIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLmFkZHJlc3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhZGRyZXNzIC0gdmFsaWQgYWRkcmVzcyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNyeXB0IHRoZSB3YWxsZXQgcGFzc3BocmFzZSBmb3IgcmVjb3ZlcnkgYW5kIEJveCBELlxuICAgKlxuICAgKiBCb3ggRCB1c2VzIGEgZml4ZWQgdmVyc2lvbiBpbmRlcGVuZGVudCBvZiB0aGUgY2FsbGVyJ3Mga2V5Y2hhaW4gZW5jcnlwdGlvbiB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbmNyeXB0UGFzc3BocmFzZUZvclJlY292ZXJ5KHBhc3NwaHJhc2U6IHN0cmluZywgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXNzcGhyYXNlLFxuICAgICAgcGFzc3dvcmQ6IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVMaWdodG5pbmdXYWxsZXQocGFyYW1zOiBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHsgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsIHN1YlR5cGUsIGxpZ2h0bmluZ1Byb3ZpZGVyLCBlbmNyeXB0aW9uVmVyc2lvbiB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIC8vIFRPRE8gQlRDLTE4OTk6IG9ubHkgdXNlckF1dGgga2V5IGlzIHJlcXVpcmVkIGZvciBjdXN0b2RpYWwgbGlnaHRuaW5nIHdhbGxldC4gYWxsIDMga2V5cyBhcmUgcmVxdWlyZWQgZm9yIHNlbGYgY3VzdG9kaWFsIGxpZ2h0bmluZy5cbiAgICAvLyB0byBhdm9pZCBjaGFuZ2luZyB0aGUgcGxhdGZvcm0gZm9yIGN1c3RvZGlhbCBmbG93LCBsZXQgdXMgYWxsIDMga2V5cyBib3RoIHdhbGxldCB0eXBlcy5cbiAgICBjb25zdCBrZXljaGFpblByb21pc2VzID0gKFt1bmRlZmluZWQsICd1c2VyQXV0aCcsICdub2RlQXV0aCddIGFzIGNvbnN0KS5tYXAoKHB1cnBvc2UpID0+IHtcbiAgICAgIHJldHVybiBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBjb25zdCBrZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IGtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICAgICAgcHViOiBrZXljaGFpbi5wdWIsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgICBpbnB1dDoga2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwdXJwb3NlID09PSB1bmRlZmluZWQgPyBwYXNzY29kZUVuY3J5cHRpb25Db2RlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzogcHVycG9zZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyBbdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpXTogeyBwdXJwb3NlIH0gfSxcbiAgICAgICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoa2V5Y2hhaW5QYXJhbXMpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCB1c2VyQXV0aEtleWNoYWluLCBub2RlQXV0aEtleWNoYWluIH0gPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpblByb21pc2VzWzBdKCksXG4gICAgICB1c2VyQXV0aEtleWNoYWluOiBrZXljaGFpblByb21pc2VzWzFdKCksXG4gICAgICBub2RlQXV0aEtleWNoYWluOiBrZXljaGFpblByb21pc2VzWzJdKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDEsXG4gICAgICBuOiAxLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBzdWJUeXBlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWRdLFxuICAgICAgY29pblNwZWNpZmljOiB7IFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiB7IGtleXM6IFt1c2VyQXV0aEtleWNoYWluLmlkLCBub2RlQXV0aEtleWNoYWluLmlkXSB9IH0sXG4gICAgICBsaWdodG5pbmdQcm92aWRlcixcbiAgICB9O1xuXG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICB1c2VyQXV0aEtleWNoYWluLFxuICAgICAgbm9kZUF1dGhLZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ0xpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBHbyBBY2NvdW50IHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4+XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlR29BY2NvdW50V2FsbGV0KFxuICAgIHBhcmFtczogR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zXG4gICk6IFByb21pc2U8R29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbj4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgeyBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSwgZW5jcnlwdGlvblZlcnNpb24sIHVzZXJLZXlTaWduaW5nUmVxdWlyZWQgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBwdWI6IGtleWNoYWluLnB1YixcbiAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICB9O1xuXG4gICAgaWYgKHBhc3NwaHJhc2UgIT09IHVuZGVmaW5lZCAmJiBwYXNzY29kZUVuY3J5cHRpb25Db2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleWNoYWluUGFyYW1zLmVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICBpbnB1dDoga2V5Y2hhaW4ucHJ2LFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuICAgICAga2V5Y2hhaW5QYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlID0gcGFzc2NvZGVFbmNyeXB0aW9uQ29kZTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChrZXljaGFpblBhcmFtcyk7XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDEsXG4gICAgICBuOiAxLFxuICAgICAgdHlwZTogJ3RyYWRpbmcnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWRdLFxuICAgICAgLi4uKHVzZXJLZXlTaWduaW5nUmVxdWlyZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogeyB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluID0ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbicsXG4gICAgfTtcblxuICAgIC8vIEFkZCB3YXJuaW5nIGlmIHRoZSB1c2VyIGtleWNoYWluIGhhcyBhbiBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodXNlcktleWNoYWluLmVuY3J5cHRlZFBydikpIHtcbiAgICAgIHJlc3VsdC53YXJuaW5nID0gJ0JlIHN1cmUgdG8gYmFja3VwIHRoZSB1c2VyIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcgd2FsbGV0XG4gICAqIDEuIENyZWF0ZXMgdGhlIHVzZXIga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiAyLiBJZiBubyBwdWIgd2FzIHByb3ZpZGVkLCBjcmVhdGVzIHRoZSBiYWNrdXAga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiAzLiBVcGxvYWRzIHRoZSBlbmNyeXB0ZWQgdXNlciBhbmQgYmFja3VwIGtleWNoYWlucyB0byBCaXRHb1xuICAgKiA0LiBDcmVhdGVzIHRoZSBCaXRHbyBrZXkgb24gdGhlIHNlcnZpY2VcbiAgICogNS4gQ3JlYXRlcyB0aGUgd2FsbGV0IG9uIEJpdEdvIHdpdGggdGhlIDMgcHVibGljIGtleXMgYWJvdmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxhYmVsIExhYmVsIGZvciB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc3BocmFzZSBQYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgdXNlciBhbmQgYmFja3VwIGtleWNoYWluc1xuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJLZXkgVXNlciB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YiBCYWNrdXAgeHB1YlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlclxuICAgKiBAcGFyYW0gcGFyYW1zLmVudGVycHJpc2UgdGhlIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlIG9wdGlvbmFsIHRoaXMgaXMgYSByZWNvdmVyeSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgb3JpZ2luYWwgcGFzc3BocmFzZSBpbiBhIHJlY292ZXJ5IGNhc2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciBtdXN0IGdlbmVyYXRlIGFuZCBrZWVwIHRoZSBlbmNyeXB0ZWQgb3JpZ2luYWwgcGFzc3BocmFzZSBzYWZlIHdoaWxlIHRoaXMgY29kZSBpcyBzdG9yZWQgb24gQml0R29cbiAgICogQHBhcmFtIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgb3B0aW9uYWwgc2VlZCBmb3IgU01DIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtcy5nYXNQcmljZVxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVLUlNFbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFZlcnNpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tdWx0aXNpZ1R5cGUgb3B0aW9uYWwgbXVsdGlzaWcgdHlwZSwgJ29uY2hhaW4nIG9yICd0c3MnIG9yICdibHNka2cnOyBpZiBhYnNlbnQsIHdlIHdpbGwgZGVmZXIgdG8gdGhlIGNvaW4ncyBkZWZhdWx0IHR5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIGJpdGdvIGtleS4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBjcmVhdGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0LiBJZiBwcm92aWRlZCwgeW91IG11c3QgaGF2ZSB0aGUgZW50ZXJwcmlzZSBsaWNlbnNlIGFuZCBwYXNzIGluXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBhcmFtcy5lbnRlcnByaXNlYCBpbnRvIGBnZW5lcmF0ZVdhbGxldGAgYXMgd2VsbC5cbiAgICogQHBhcmFtIHBhcmFtcy50eXBlIG9wdGlvbmFsIHdhbGxldCB0eXBlLCAnaG90JyBvciAnY29sZCcgb3IgJ2N1c3RvZGlhbCc7IGlmIGFic2VudCwgd2Ugd2lsbCBkZWZlciB0byAnaG90J1xuICAgKiBAcGFyYW0gcGFyYW1zLmJpdGdvS2V5SWQgb3B0aW9uYWwgYml0Z28ga2V5IGlkIGZvciBTTUMgVFNTIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtcy5jb21tb25LZXljaGFpbiBvcHRpb25hbCBjb21tb24ga2V5Y2hhaW4gZm9yIFNNQyBUU1Mgd2FsbGV0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FsbGV0KFxuICAgIHBhcmFtczogR2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyB8IEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4+IHtcbiAgICAvLyBBc3NpZ24gdGhlIGRlZmF1bHQgbXVsdGlTaWcgdHlwZSB2YWx1ZSBiYXNlZCBvbiB0aGUgY29pblxuICAgIGlmICghcGFyYW1zLm11bHRpc2lnVHlwZSkge1xuICAgICAgcGFyYW1zLm11bHRpc2lnVHlwZSA9IHRoaXMuYmFzZUNvaW4uZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnbG5idGMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZGVjb2RlT3JFbHNlKFxuICAgICAgICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYy5uYW1lLFxuICAgICAgICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICAoZXJyb3JzKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIGdlbmVyYXRlIGxpZ2h0bmluZyB3YWxsZXQgcmVxdWVzdCBwYXJhbXM6ICR7ZXJyb3JzfWApO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldChvcHRpb25zKTtcbiAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuZW5jcnlwdFBhc3NwaHJhc2VGb3JSZWNvdmVyeShcbiAgICAgICAgb3B0aW9ucy5wYXNzcGhyYXNlLFxuICAgICAgICBvcHRpb25zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICAvLyBHbyBBY2NvdW50IHdhbGxldCBnZW5lcmF0aW9uXG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdvZmMnICYmIHBhcmFtcy50eXBlID09PSAndHJhZGluZycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBkZWNvZGVPckVsc2UoXG4gICAgICAgIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjLm5hbWUsXG4gICAgICAgIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIChlcnJvcnMpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgZ2VuZXJhdGUgZ28gYWNjb3VudCByZXF1ZXN0IHBhcmFtczogJHtlcnJvcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSBhd2FpdCB0aGlzLmdlbmVyYXRlR29BY2NvdW50V2FsbGV0KG9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMucGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuZW5jcnlwdFBhc3NwaHJhc2VGb3JSZWNvdmVyeShcbiAgICAgICAgICBvcHRpb25zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgb3B0aW9ucy5wYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10sIFsncGFzc3BocmFzZScsICd1c2VyS2V5JywgJ2JhY2t1cFhwdWInXSk7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3JlYXRlS2V5Y2hhaW5DYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIocGFyYW1zIGFzIEdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlID0gJ2hvdCcsIGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSwgZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgaXNUc3MgPSBwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCk7XG4gICAgY29uc3QgY2FuRW5jcnlwdCA9ICEhcGFzc3BocmFzZSAmJiB0eXBlb2YgcGFzc3BocmFzZSA9PT0gJ3N0cmluZyc7XG5cbiAgICBpZiAodmFsaWRhdGVFdm1LZXlSaW5nV2FsbGV0UGFyYW1zKHBhcmFtcywgdGhpcy5iYXNlQ29pbikpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjcmVhdGVFdm1LZXlSaW5nV2FsbGV0KHtcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZDogZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkISxcbiAgICAgICAgYml0Z286IHRoaXMuYml0Z28sXG4gICAgICAgIGJhc2VDb2luOiB0aGlzLmJhc2VDb2luLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHR5cGU6ICEhcGFyYW1zLnVzZXJLZXkgJiYgcGFyYW1zLm11bHRpc2lnVHlwZSAhPT0gJ29uY2hhaW4nID8gJ2NvbGQnIDogdHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRlcnByaXNlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGVudGVycHJpc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRlcnByaXNlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IGVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgLy8gRVZNIFRTUyB3YWxsZXRzIG11c3QgdXNlIHdhbGxldCB2ZXJzaW9uIDMsIDUgYW5kIDZcbiAgICBpZiAoXG4gICAgICBpc1RzcyAmJlxuICAgICAgdGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmXG4gICAgICAhZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkICYmXG4gICAgICAhKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSAzIHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFVk0gVFNTIHdhbGxldHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB3YWxsZXQgdmVyc2lvbiAzLCA1IGFuZCA2Jyk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNwYXJlbnQgemNhc2ggd2FsbGV0cyBhcmUgbXVsdGlzaWcgYW5kIGlzVFNTIGlzIG5vdCBzZXQgaW5oZXJlbnRseS5cbiAgICAvLyBTaGllbGRlZCB6Y2FzaCB3YWxsZXRzIGFyZSBNUENcbiAgICBpZiAocGFyYW1zLmlzU2hpZWxkZWQpIHtcbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3Igc2hpZWxkZWQgd2FsbGV0Jyk7XG4gICAgICBpZiAodHlwZSAhPT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGllbGRlZCB3YWxsZXRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgYXMgY3VzdG9kaWFsIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoaWVsZGVkIHdhbGxldHMgbXVzdCBzZXQvdXNlIG11bHRpc2lnVHlwZSB0c3MnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ3VzdG9kaWFsTXBjV2FsbGV0KHtcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgaXNTaGllbGRlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzVHNzKSB7XG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldCcpO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvbGQnKSB7XG4gICAgICAgIC8vIHZhbGlkYXRlXG4gICAgICAgIGFzc2VydChwYXJhbXMuYml0Z29LZXlJZCwgJ2JpdGdvS2V5SWQgaXMgcmVxdWlyZWQgZm9yIFNNQyBUU1Mgd2FsbGV0Jyk7XG4gICAgICAgIGFzc2VydChwYXJhbXMuY29tbW9uS2V5Y2hhaW4sICdjb21tb25LZXljaGFpbiBpcyByZXF1aXJlZCBmb3IgU01DIFRTUyB3YWxsZXQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgICBiaXRnb0tleUlkOiBwYXJhbXMuYml0Z29LZXlJZCxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogcGFyYW1zLmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIGNvbGREZXJpdmF0aW9uU2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUN1c3RvZGlhbE1wY1dhbGxldCh7XG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsICdjYW5ub3QgZ2VuZXJhdGUgVFNTIGtleXMgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU1wY1dhbGxldCh7XG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgd2ViYXV0aG5JbmZvOiBwYXJhbXMud2ViYXV0aG5JbmZvLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgICBpZiAocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpIHtcbiAgICAgICAgd2FsbGV0RGF0YS5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gYXdhaXQgdGhpcy5lbmNyeXB0UGFzc3BocmFzZUZvclJlY292ZXJ5KFxuICAgICAgICAgIHBhc3NwaHJhc2UsXG4gICAgICAgICAgcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaXN0cmlidXRlZCBjdXN0b2R5XG4gICAgaWYgKGlzRGlzdHJpYnV0ZWRDdXN0b2R5KSB7XG4gICAgICBpZiAoIWVudGVycHJpc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZW50ZXJwcmlzZSB3aGVuIGNyZWF0aW5nIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZSAhPT0gJ2NvbGQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXRzIG11c3QgYmUgdHlwZTogY29sZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0JhY2t1cFhwdWIgPSAhIXBhcmFtcy5iYWNrdXBYcHViO1xuICAgIGNvbnN0IGhhc0JhY2t1cFhwdWJQcm92aWRlciA9ICEhcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcjtcbiAgICBpZiAoaGFzQmFja3VwWHB1YiAmJiBoYXNCYWNrdXBYcHViUHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb3ZpZGUgbW9yZSB0aGFuIG9uZSBiYWNrdXBYcHViIG9yIGJhY2t1cFhwdWJQcm92aWRlciBmbGFnJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiBwYXJhbXMuZWlwMTU1OSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IHVzZSBib3RoIGVpcDE1NTkgYW5kIGdhc1ByaWNlIHZhbHVlcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgPSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmdhc1ByaWNlKSkge1xuICAgICAgY29uc3QgZ2FzUHJpY2VCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmdhc1ByaWNlKTtcbiAgICAgIGlmIChnYXNQcmljZUJOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGdhcyBwcmljZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZUJOLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5laXAxNTU5KSAmJiAhXy5pc0VtcHR5KHBhcmFtcy5laXAxNTU5KSkge1xuICAgICAgY29uc3QgbWF4RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heEZlZVBlckdhcyk7XG4gICAgICBpZiAobWF4RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXhQcmlvcml0eUZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhQcmlvcml0eUZlZVBlckdhcyk7XG4gICAgICBpZiAobWF4UHJpb3JpdHlGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmlvcml0eSBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmVpcDE1NTkgPSB7XG4gICAgICAgIG1heEZlZVBlckdhczogbWF4RmVlUGVyR2FzQk4udG9TdHJpbmcoKSxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IG1heFByaW9yaXR5RmVlUGVyR2FzQk4udG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlS1JTRW1haWwpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlS1JTRW1haWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkaXNhYmxlS1JTRW1haWwgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZUtSU0VtYWlsID0gcGFyYW1zLmRpc2FibGVLUlNFbWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXRWZXJzaW9uIHByb3ZpZGVkLCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMud2FsbGV0VmVyc2lvbiA9IHBhcmFtcy53YWxsZXRWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBlYWNoIGtyc1NwZWNpZmljIHBhcmFtIGlzIGVpdGhlciBhIHN0cmluZywgYm9vbGVhbiwgb3IgbnVtYmVyXG4gICAgY29uc3QgeyBrcnNTcGVjaWZpYyB9ID0gcGFyYW1zO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChrcnNTcGVjaWZpYykpIHtcbiAgICAgIE9iamVjdC5rZXlzKGtyc1NwZWNpZmljKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0ga3JzU3BlY2lmaWNba2V5XTtcbiAgICAgICAgaWYgKCFfLmlzQm9vbGVhbih2YWwpICYmICFfLmlzU3RyaW5nKHZhbCkgJiYgIV8uaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigna3JzU3BlY2lmaWMgb2JqZWN0IGNvbnRhaW5zIGlsbGVnYWwgdmFsdWVzLiB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzLCBib29sZWFucywgb3IgbnVtYmVycycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgZGVyaXZhdGlvblBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPz8gJ29uY2hhaW4nKSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICAvLyBmb3IgY3VzdG9kaWFsIG11bHRpc2lnLCB3aGVuIHRoZSB3YWxsZXQgaXMgY3JlYXRlZCBvbiB0aGUgcGxhdGZvciBzaWRlLCB0aGUga2V5cyBhcmUgbm90IG5lZWRlZFxuICAgICAgd2FsbGV0UGFyYW1zLm4gPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMubSA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlzID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLmtleVNpZ25hdHVyZXMgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpOyAvLyByZXR1cm5zIHRoZSBpZHNcblxuICAgICAgY29uc3QgdXNlcktleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogbmV3V2FsbGV0LmtleXNbS2V5SW5kaWNlcy5VU0VSXSwgcmVxSWQgfSk7XG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuQkFDS1VQXSwgcmVxSWQgfSk7XG4gICAgICBjb25zdCBiaXRnb0tleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogbmV3V2FsbGV0LmtleXNbS2V5SW5kaWNlcy5CSVRHT10sIHJlcUlkIH0pO1xuXG4gICAgICBjb25zdCBbdXNlcktleSwgYml0Z29LZXksIGJhY2t1cEtleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluLCBiaXRnb0tleWNoYWluLCBiYWNrdXBLZXljaGFpbl0pO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiaXRnb0tleSxcbiAgICAgICAgYml0Z29LZXljaGFpbjogYmFja3VwS2V5LFxuICAgICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBsZXQgdXNlcktleWNoYWluUGFyYW1zO1xuICAgICAgICBsZXQgdXNlcktleWNoYWluO1xuICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIHVzZXIga2V5XG4gICAgICAgIGlmIChwYXJhbXMudXNlcktleSkge1xuICAgICAgICAgIHVzZXJLZXljaGFpbiA9IHsgcHViOiBwYXJhbXMudXNlcktleSB9O1xuICAgICAgICAgIHVzZXJLZXljaGFpblBhcmFtcyA9IHVzZXJLZXljaGFpbjtcbiAgICAgICAgICBpZiAocGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgICAgICAgLy8gdGhlIGRlcml2YXRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIGEga2V5IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICBjb25zdCBkZXJpdmF0aW9uID0gdGhpcy5iYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZCh7XG4gICAgICAgICAgICAgIGtleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgICAgICAgIHNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvbi5kZXJpdmF0aW9uUGF0aDtcbiAgICAgICAgICAgIHVzZXJLZXljaGFpbi5wdWIgPSBkZXJpdmF0aW9uLmtleTtcbiAgICAgICAgICAgIHVzZXJLZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkID0gcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjYW5FbmNyeXB0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBnZW5lcmF0ZSB1c2VyIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgdXNlciBrZXkuXG4gICAgICAgICAgdXNlcktleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXljaGFpbi5wcnYsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVzZXJLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgICAgICAgIHB1YjogdXNlcktleWNoYWluLnB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogdXNlcktleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIElmIFdlYkF1dGhuIGluZm8gaXMgcHJvdmlkZWQsIHN0b3JlIGFuIGFkZGl0aW9uYWwgY29weSBvZiB0aGUgcHJpdmF0ZSBrZXkgZW5jcnlwdGVkXG4gICAgICAgICAgLy8gd2l0aCB0aGUgUFJGLWRlcml2ZWQgcGFzc3BocmFzZSBzbyB0aGUgYXV0aGVudGljYXRvciBjYW4gbGF0ZXIgZGVjcnlwdCBpdC5cbiAgICAgICAgICAvLyBTZW5kIGl0IGFzIGB3ZWJhdXRobkluZm9gIChzaW5nbGUgb2JqZWN0LCB3aXRoIGVudGVycHJpc2VJZCkgc28gdGhlIGF0b21pY1xuICAgICAgICAgIC8vIFBPU1QgL2tleSBwZXJzaXN0cyB0aGUgcGFzc2tleSDigJQgdGhlIGJhY2tlbmQgaWdub3JlcyB0aGUgZGVwcmVjYXRlZCBgd2ViYXV0aG5EZXZpY2VzYC5cbiAgICAgICAgICBpZiAocGFyYW1zLndlYmF1dGhuSW5mbyAmJiB1c2VyS2V5Y2hhaW4ucHJ2KSB7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICAgICAgICBvdHBEZXZpY2VJZDogcGFyYW1zLndlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgICAgICAgcHJmU2FsdDogcGFyYW1zLndlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICAgICAgICBlbnRlcnByaXNlSWQ6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgICBpbnB1dDogdXNlcktleWNoYWluLnBydixcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFkYXRhOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVzZXJLZXljaGFpblBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgICAgICBjb25zdCBuZXdVc2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoe30sIG5ld1VzZXJLZXljaGFpbiwgdXNlcktleWNoYWluKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGlmIChwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgICAgICAgLy8gSWYgcmVxdWVzdGVkLCB1c2UgYSBLUlMgb3IgYmFja3VwIGtleSBwcm92aWRlclxuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgICBwcm92aWRlcjogcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlciB8fCAnZGVmYXVsdFJNR0JhY2t1cFByb3ZpZGVyJyxcbiAgICAgICAgICAgIGRpc2FibGVLUlNFbWFpbDogcGFyYW1zLmRpc2FibGVLUlNFbWFpbCxcbiAgICAgICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmJhc2VDb2luLmdldENoYWluKCksXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgYmFja3VwIHhwdWJcbiAgICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViKSB7XG4gICAgICAgICAgLy8gdXNlciBwcm92aWRlZCBiYWNrdXAgZXRoZXJldW0gYWRkcmVzc1xuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICAgICAgICBwdWI6IHBhcmFtcy5iYWNrdXBYcHViLFxuICAgICAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2FuRW5jcnlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgYmFja3VwIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vIHByb3ZpZGVkIGJhY2t1cCB4cHViIG9yIGFkZHJlc3MsIHNvIGRlZmF1bHQgdG8gY3JlYXRpbmcgb25lIGhlcmVcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoe1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTogS2V5Y2hhaW5zVHJpcGxldCA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluUHJvbWlzZSgpLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgICAuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSwgcmVxSWQsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5OiBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgfSksXG4gICAgICB9KTtcblxuICAgICAgd2FsbGV0UGFyYW1zLmtleXMgPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG5cbiAgICAgIGNvbnN0IHsgcHJ2IH0gPSB1c2VyS2V5Y2hhaW47XG4gICAgICBpZiAoXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICAgIGFzc2VydChiYWNrdXBLZXljaGFpbi5wdWIpO1xuICAgICAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5wdWIpO1xuICAgICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHtcbiAgICAgICAgICBiYWNrdXA6IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJhY2t1cEtleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBiaXRnbzogKGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgYml0Z29LZXljaGFpbi5wdWIpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuXG4gICAgICBpZiAoXy5pbmNsdWRlcyhbJ3hycCcsICd4bG0nLCAnY3NwciddLCB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMucm9vdFByaXZhdGVLZXkpKSB7XG4gICAgICAgIHdhbGxldFBhcmFtcy5yb290UHJpdmF0ZUtleSA9IHBhcmFtcy5yb290UHJpdmF0ZUtleTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgICAgfTtcblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhY2t1cEtleWNoYWluLnBydikpIHtcbiAgICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlcml2YXRpb25QYXRoKSkge1xuICAgICAgICB1c2VyS2V5Y2hhaW4uZGVyaXZhdGlvblBhdGggPSBkZXJpdmF0aW9uUGF0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbkVuY3J5cHQgJiYgcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpIHtcbiAgICAgICAgcmVzdWx0LmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSBhd2FpdCB0aGlzLmVuY3J5cHRQYXNzcGhyYXNlRm9yUmVjb3ZlcnkoXG4gICAgICAgICAgcGFzc3BocmFzZSxcbiAgICAgICAgICBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbiBvbmNoYWluIG11bHRpc2lnIHdhbGxldCB1c2luZyBhbiBleHRlcm5hbCBzaWduZXIgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXkgY3JlYXRpb24uXG4gICAqIDEuIENhbGxzIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlzXG4gICAqIDIuIFVwbG9hZHMga2V5Y2hhaW5zIHZpYSBrZXljaGFpbnMoKS5hZGQoKVxuICAgKiAzLiBDcmVhdGVzIHRoZSBCaXRHbyBrZXkgb24gdGhlIHNlcnZpY2VcbiAgICogNC4gQ3JlYXRlcyB0aGUgd2FsbGV0IG9uIEJpdEdvIHdpdGggdGhlIDMgcHVibGljIGtleXNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lck9wdGlvbnNcbiAgKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgaGFzT25jaGFpbkNhbGxiYWNrID0gXy5pc0Z1bmN0aW9uKHBhcmFtcy5jcmVhdGVLZXljaGFpbkNhbGxiYWNrKTtcbiAgICBjb25zdCBoYXNNcGNDYWxsYmFja3MgPSAhIShwYXJhbXMuZWNkc2FNUEN2MkNhbGxiYWNrcyB8fCBwYXJhbXMuZWRkc2FDYWxsYmFja3MpO1xuXG4gICAgaWYgKGhhc09uY2hhaW5DYWxsYmFjayAmJiBoYXNNcGNDYWxsYmFja3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIE1QQyBUU1Mga2V5IGdlbmVyYXRpb24gY2FsbGJhY2tzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbXVsdGlzaWdUeXBlID1cbiAgICAgIHBhcmFtcy5tdWx0aXNpZ1R5cGUgPz8gKGhhc09uY2hhaW5DYWxsYmFjayA/ICdvbmNoYWluJyA6IHRoaXMuYmFzZUNvaW4uZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpKTtcblxuICAgIGlmIChtdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lcihwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChtdWx0aXNpZ1R5cGUgIT09ICdvbmNoYWluJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc0Z1bmN0aW9uKHBhcmFtcy5jcmVhdGVLZXljaGFpbkNhbGxiYWNrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGZ1bmN0aW9uIHBhcmFtZXRlciBjcmVhdGVLZXljaGFpbkNhbGxiYWNrJyk7XG4gICAgfVxuXG4gICAgLy8gdGhlc2UgYmVsb25nIHRvIHRoZSBwYXNzcGhyYXNlLWJhc2VkIHBhdGggYW5kIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrXG4gICAgY29uc3QgcGFzc3BocmFzZVBhdGhQYXJhbXMgPSBbJ3Bhc3NwaHJhc2UnLCAndXNlcktleScsICdiYWNrdXBYcHViJywgJ2JhY2t1cFhwdWJQcm92aWRlciddIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhc3NwaHJhc2VQYXRoUGFyYW1zKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zW2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB3aXRoICR7a2V5fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgbGFiZWwsIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssIHR5cGUgPSAnaG90JywgZW50ZXJwcmlzZSwgaXNEaXN0cmlidXRlZEN1c3RvZHkgfSA9IHBhcmFtcztcblxuICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgY3VzdG9kaWFsIG9uY2hhaW4gd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2ViYXV0aG5JbmZvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWJhdXRobkluZm8gaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3RyaWJ1dGVkQ3VzdG9keSkge1xuICAgICAgaWYgKCFlbnRlcnByaXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgIT09ICdjb2xkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmIHBhcmFtcy5laXAxNTU5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgdXNlIGJvdGggZWlwMTU1OSBhbmQgZ2FzUHJpY2UgdmFsdWVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFtdLFxuICAgICAgdHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVudGVycHJpc2UpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZW50ZXJwcmlzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudGVycHJpc2UgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gZW50ZXJwcmlzZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIGNvbnN0IGdhc1ByaWNlQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5nYXNQcmljZSk7XG4gICAgICBpZiAoZ2FzUHJpY2VCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnYXMgcHJpY2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2VCTi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZWlwMTU1OSkgJiYgIV8uaXNFbXB0eShwYXJhbXMuZWlwMTU1OSkpIHtcbiAgICAgIGNvbnN0IG1heEZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heEZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4UHJpb3JpdHlGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heFByaW9yaXR5RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpb3JpdHkgZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5laXAxNTU5ID0ge1xuICAgICAgICBtYXhGZWVQZXJHYXM6IG1heEZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBtYXhQcmlvcml0eUZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldFZlcnNpb24gcHJvdmlkZWQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy53YWxsZXRWZXJzaW9uID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luLmdldENoYWluKCk7XG5cbiAgICBjb25zdCBjcmVhdGVBbmRVcGxvYWRLZXljaGFpbiA9IGFzeW5jIChzb3VyY2U6ICd1c2VyJyB8ICdiYWNrdXAnKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW5Gcm9tQ2FsbGJhY2sgPSBhd2FpdCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrKHsgc291cmNlLCBjb2luIH0pO1xuICAgICAgICBpZiAoa2V5Y2hhaW5Gcm9tQ2FsbGJhY2suc291cmNlICE9PSBzb3VyY2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgc291cmNlICR7a2V5Y2hhaW5Gcm9tQ2FsbGJhY2suc291cmNlfSwgZXhwZWN0ZWQgJHtzb3VyY2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleWNoYWluRnJvbUNhbGxiYWNrLnR5cGUgIT09ICdpbmRlcGVuZGVudCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHR5cGUgJHtrZXljaGFpbkZyb21DYWxsYmFjay50eXBlfSwgZXhwZWN0ZWQgJ2luZGVwZW5kZW50JyBmb3Igb25jaGFpbiBtdWx0aXNpZ2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkUHViKGtleWNoYWluRnJvbUNhbGxiYWNrLnB1YikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCBwdWIgZm9yICR7c291cmNlfSBrZXkgb24gJHtjb2lufWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICAgICAgcHViOiBrZXljaGFpbkZyb21DYWxsYmFjay5wdWIsXG4gICAgICAgICAga2V5VHlwZToga2V5Y2hhaW5Gcm9tQ2FsbGJhY2sudHlwZSxcbiAgICAgICAgICBzb3VyY2U6IGtleWNoYWluRnJvbUNhbGxiYWNrLnNvdXJjZSxcbiAgICAgICAgICByZXFJZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgJHtzb3VyY2V9IGtleWNoYWluOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9OiBLZXljaGFpbnNUcmlwbGV0ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgIHVzZXJLZXljaGFpbjogY3JlYXRlQW5kVXBsb2FkS2V5Y2hhaW4oJ3VzZXInKSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBjcmVhdGVBbmRVcGxvYWRLZXljaGFpbignYmFja3VwJyksXG4gICAgICBiaXRnb0tleWNoYWluOiB0aGlzLmJhc2VDb2luXG4gICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlLCByZXFJZCwgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSB9KSxcbiAgICB9KTtcblxuICAgIHdhbGxldFBhcmFtcy5rZXlzID0gW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdO1xuXG4gICAgaWYgKHBhcmFtcy5rZXlTaWduYXR1cmVzKSB7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHBhcmFtcy5rZXlTaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuXG4gICAgaWYgKF8uaW5jbHVkZXMoWyd4cnAnLCAneGxtJywgJ2NzcHInXSwgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnJvb3RQcml2YXRlS2V5KSkge1xuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0gcGFyYW1zLnJvb3RQcml2YXRlS2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdXNlcidzIHdhbGxldCBzaGFyZXMgdjJcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0U2hhcmVzPn1cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXNWMigpOiBQcm9taXNlPFdhbGxldFNoYXJlcz4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcycsIDIpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgd2FsbGV0IHNoYXJlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGVuY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluLiByZXF1aXJlcyB1bmxvY2sgaWYga2V5Y2hhaW4gaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGdldCBpbmZvcm1hdGlvbiBvblxuICAgKi9cbiAgYXN5bmMgZ2V0U2hhcmUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhdGUgLSB0aGUgbmV3IHN0YXRlIG9mIHRoZSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2hhcmUocGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQnVsayBhY2NlcHQgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zIEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmVSZXF1ZXN0KHBhcmFtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1bGtBY2NlcHRTaGFyZVJlcXVlc3RXaXRoUmV0cnkocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVsa0FjY2VwdFNoYXJlUmVxdWVzdFdpdGhSZXRyeShwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSk6IFByb21pc2U8QnVsa0FjY2VwdFNoYXJlUmVzcG9uc2U+IHtcbiAgICAvLyBTZXJ2ZXIgaGFzIGEgbGltaXQgb2YgYXBwcm94aW1hdGVseSAxTUIgZm9yIHBheWxvYWQgc2l6ZVxuICAgIGxldCBNQVhfUEFZTE9BRF9TSVpFID0gOTUwMDAwOyAvLyB+OTUwS0IgdG8gbGVhdmUgc29tZSBidWZmZXJcblxuICAgIC8vIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHBheWxvYWRcbiAgICBjb25zdCBjYWxjdWxhdGVQYXlsb2FkU2l6ZSA9IChpdGVtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogbnVtYmVyID0+IHtcbiAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeSh7IGtleXNGb3JXYWxsZXRTaGFyZXM6IGl0ZW1zIH0pLCAndXRmOCcpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZ1BhcmFtcyA9IFsuLi5wYXJhbXNdO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZ1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBCdWlsZCBvcHRpbWFsIGJhdGNoIGJ5IGFkZGluZyBpdGVtcyB1bnRpbCB3ZSByZWFjaCBzaXplIGxpbWl0XG4gICAgICBjb25zdCBiYXRjaDogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdID0gW107XG4gICAgICAvLyBTdGFydCB3aXRoIGVtcHR5IGJhdGNoXG5cbiAgICAgIC8vIEFkZCBpdGVtcyBvbmUgYnkgb25lIHdoaWxlIG1vbml0b3JpbmcgcGF5bG9hZCBzaXplXG4gICAgICB3aGlsZSAocmVtYWluaW5nUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVGVzdCBhZGRpbmcgdGhlIG5leHQgaXRlbVxuICAgICAgICBjb25zdCB0ZXN0QmF0Y2ggPSBbLi4uYmF0Y2gsIHJlbWFpbmluZ1BhcmFtc1swXV07XG4gICAgICAgIGNvbnN0IHRlc3RTaXplID0gY2FsY3VsYXRlUGF5bG9hZFNpemUodGVzdEJhdGNoKTtcblxuICAgICAgICAvLyBJZiBhZGRpbmcgdGhpcyBpdGVtIHdvdWxkIGV4Y2VlZCB0aGUgc2l6ZSBsaW1pdCwgc3RvcCBhZGRpbmdcbiAgICAgICAgaWYgKHRlc3RTaXplID4gTUFYX1BBWUxPQURfU0laRSAmJiBiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgaXRlbSB0byB0aGUgYmF0Y2hcbiAgICAgICAgYmF0Y2gucHVzaChyZW1haW5pbmdQYXJhbXMuc2hpZnQoKSEpO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBldmVuIGEgc2luZ2xlIGl0ZW0gaXMgdG9vIGxhcmdlXG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwICYmIHJlbWFpbmluZ1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNlbmQganVzdCB0aGUgZmlyc3QgaXRlbSBldmVuIGlmIGl0J3Mgb3ZlcnNpemVkXG4gICAgICAgIGJhdGNoLnB1c2gocmVtYWluaW5nUGFyYW1zLnNoaWZ0KCkhKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZE9iaiA9IHsga2V5c0ZvcldhbGxldFNoYXJlczogYmF0Y2ggfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZXMvYWNjZXB0JywgMikpLnNlbmQocGF5bG9hZE9iaikucmVzdWx0KCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5hY2NlcHRlZFdhbGxldFNoYXJlcyAmJiBBcnJheS5pc0FycmF5KHJlc3VsdC5hY2NlcHRlZFdhbGxldFNoYXJlcykpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goLi4ucmVzdWx0LmFjY2VwdGVkV2FsbGV0U2hhcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MTMgJiYgYmF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGdldCA0MTMgd2l0aCBtdWx0aXBsZSBpdGVtcywgcHV0IHRoZW0gYmFjayBhbmQgdHJ5IHdpdGggaGFsZiB0aGUgYmF0Y2ggc2l6ZVxuICAgICAgICAgIHJlbWFpbmluZ1BhcmFtcy51bnNoaWZ0KC4uLmJhdGNoKTtcbiAgICAgICAgICBNQVhfUEFZTE9BRF9TSVpFID0gTWF0aC5mbG9vcihNQVhfUEFZTE9BRF9TSVpFIC8gMik7IC8vIFJlZHVjZSBzaXplIGxpbWl0IGZvciBuZXh0IGF0dGVtcHRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXB0ZWRXYWxsZXRTaGFyZXM6IHJlc3VsdHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlcXVlc3QoXG4gICAgcGFyYW1zOiBCdWxrVXBkYXRlV2FsbGV0U2hhcmVPcHRpb25zUmVxdWVzdFtdXG4gICk6IFByb21pc2U8QnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcy91cGRhdGUnLCAyKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgc2hhcmVzOiBwYXJhbXMsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBhIHdhbGxldCBzaGFyZSBpbnZpdGF0aW9uIGVtYWlsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB3aG9zZSBpbnZpdGlhdGlvbiBzaG91bGQgYmUgcmVzZW50XG4gICAqL1xuICBhc3luYyByZXNlbmRTaGFyZUludml0ZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1cmxQYXJ0cyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkICsgJy9yZXNlbmRlbWFpbCc7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyB1cmxQYXJ0cykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4gICAqL1xuICBhc3luYyBjYW5jZWxTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmRlbCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtc2hhcmUgd2FsbGV0IHdpdGggZXhpc3Rpbmcgc3BlbmRlcnMgb2YgdGhlIHdhbGxldFxuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICogQHBhcmFtIHVzZXJQYXNzd29yZFxuICAgKi9cbiAgYXN5bmMgcmVzaGFyZVdhbGxldFdpdGhTcGVuZGVycyhcbiAgICB3YWxsZXRJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gICAgaWYgKCF3YWxsZXQ/Ll93YWxsZXQ/LmVudGVycHJpc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW50ZXJwcmlzZSBub3QgZm91bmQgZm9yIHRoZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRlcnByaXNlVXNlcnNSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7d2FsbGV0Py5fd2FsbGV0Py5lbnRlcnByaXNlfS91c2VyYCkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgLy8gY3JlYXRlIGEgbWFwIG9mIHVzZXJzIGZvciBlYXN5IGxvb2t1cCAtIHdlIG5lZWQgdGhlIHVzZXIgZW1haWwgaWQgdG8gc2hhcmUgdGhlIHdhbGxldFxuICAgIGNvbnN0IHVzZXJzTWFwID0gbmV3IE1hcChcbiAgICAgIFsuLi5lbnRlcnByaXNlVXNlcnNSZXNwb25zZT8uYWRtaW5Vc2VycywgLi4uZW50ZXJwcmlzZVVzZXJzUmVzcG9uc2U/Lm5vbkFkbWluVXNlcnNdLm1hcCgob2JqKSA9PiBbb2JqLmlkLCBvYmpdKVxuICAgICk7XG5cbiAgICBpZiAoIXdhbGxldC5fd2FsbGV0LnVzZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlbmRlcnMgPSB3YWxsZXQuX3dhbGxldC51c2Vycy5maWx0ZXIoXG4gICAgICAodXNlcikgPT4gdXNlci5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSAmJiAhdXNlci5wZXJtaXNzaW9ucy5pbmNsdWRlcygnYWRtaW4nKSAmJiB1c2Vyc01hcC5oYXModXNlci51c2VyKVxuICAgICk7XG5cbiAgICBpZiAoc3BlbmRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGVjcnlwdCB0aGUgd2FsbGV0IGtleWNoYWluIG9uY2UgYW5kIHRocmVhZCB0aGUgcGxhaW50ZXh0IGludG8gZWFjaCBzaGFyZVdhbGxldCBjYWxsLlxuICAgIC8vIFdpdGhvdXQgdGhpcywgc2hhcmVXYWxsZXQgd291bGQgaW50ZXJuYWxseSByZS1kZWNyeXB0IHRoZSBzYW1lIGVuY3J5cHRlZFBydiB1bmRlciB0aGUgc2FtZVxuICAgIC8vIHdhbGxldFBhc3NwaHJhc2UgTiB0aW1lcyAob25lIEFyZ29uMmlkIHBlciByZWNpcGllbnQpLiBQZXItcmVjaXBpZW50IGVuY3J5cHQgc3RpbGwgdXNlcyBhXG4gICAgLy8gdW5pcXVlIEVDREgtZGVyaXZlZCBzZWNyZXQgc28gbm8gc2Vzc2lvbiBhbW9ydGl6YXRpb24gaXMgcG9zc2libGUgb24gdGhhdCBzaWRlLlxuICAgIGxldCBkZWNyeXB0ZWRLZXljaGFpbjogRGVjcnlwdGVkS2V5Y2hhaW5EYXRhIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHdhbGxldC5nZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcodXNlclBhc3N3b3JkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyBDb2xkIHdhbGxldDogbm8gZW5jcnlwdGVkIGtleWNoYWluIHRvIGRlY3J5cHQuIEZhbGwgdGhyb3VnaCBhbmQgbGV0IHNoYXJlV2FsbGV0IGhhbmRsZVxuICAgICAgLy8gaXQgcGVyLXJlY2lwaWVudCAod2hpY2ggd2lsbCBhbHNvIHRocm93IE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yIGJ1dCBhdCBhIHBvaW50XG4gICAgICAvLyB3aGVyZSB0aGUgY2FsbGVyIGV4cGVjdHMgaXQpLlxuICAgIH1cblxuICAgIC8vIFNlcXVlbnRpYWwgbG9vcCB0byBib3VuZCBjb25jdXJyZW50IEFyZ29uMmlkIFdBU00gaW5zdGFuY2VzIG9uIHRoZSBwZXItcmVjaXBpZW50IEVDREhcbiAgICAvLyBlbmNyeXB0IHNpZGUgKGVhY2ggcmVjaXBpZW50J3Mgc2VjcmV0IGlzIHVuaXF1ZSBzbyBQcm9taXNlLmFsbCBjb3VsZCBPT00gYXQgc2NhbGUpLlxuICAgIGZvciAoY29uc3QgdXNlciBvZiBzcGVuZGVycykge1xuICAgICAgY29uc3QgdXNlck9iamVjdCA9IHVzZXJzTWFwLmdldCh1c2VyLnVzZXIpO1xuICAgICAgYXNzZXJ0KHVzZXJPYmplY3QsIGBVc2VyICR7dXNlci51c2VyfSBub3QgZm91bmQgaW4gZW50ZXJwcmlzZSB1c2VycyBtYXBgKTtcbiAgICAgIGNvbnN0IHNoYXJlT3B0aW9uczogU2hhcmVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgICBwZXJtaXNzaW9uczogdXNlci5wZXJtaXNzaW9ucy5qb2luKCcsJyksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHVzZXJQYXNzd29yZCxcbiAgICAgICAgZW1haWw6IHVzZXJPYmplY3QuZW1haWwuZW1haWwsXG4gICAgICAgIHJlc2hhcmU6IHRydWUsXG4gICAgICAgIHNraXBLZXljaGFpbjogZmFsc2UsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbixcbiAgICAgIH07XG4gICAgICBhd2FpdCB3YWxsZXQuc2hhcmVXYWxsZXQoc2hhcmVPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIHdhbGxldCBzaGFyZSwgYWRkaW5nIHRoZSB3YWxsZXQgdG8gdGhlIHVzZXIncyBsaXN0XG4gICAqIE5lZWRzIGEgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGFjY2VwdFxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJQYXNzd29yZCAtIChyZXF1aXJlZCBpZiBtb3JlIGEga2V5Y2hhaW4gd2FzIHNoYXJlZCkgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIGFuZCBhIHdhbGxldCB3aXRoIG1vcmUgdGhhbiB2aWV3IHBlcm1pc3Npb25zIHdhcyBzaGFyZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZCBpcyB1c2VkLlxuICAgKiBAcGFyYW0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2IC0gc2V0IG9ubHkgaWYgdGhlIHBydiB3YXMgcmVjZWl2ZWQgb3V0LW9mLWJhbmQuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgWydvdmVycmlkZUVuY3J5cHRlZFBydicsICd1c2VyUGFzc3dvcmQnLCAnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcblxuICAgIGxldCBlbmNyeXB0ZWRQcnYgPSBwYXJhbXMub3ZlcnJpZGVFbmNyeXB0ZWRQcnY7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmUgPSBhd2FpdCB0aGlzLmdldFNoYXJlKHsgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQgfSk7XG5cbiAgICAvLyBNdWx0aS11c2VyLWtleSBjYXNlOiByZXF1aXJlcyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIHB1YmxpYyBrZXkgaW4gYWRkaXRpb24gdG8gdGhlIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgIGlmICh3YWxsZXRTaGFyZS51c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGdlbmVyYXRlIHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FsbGV0S2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5wcnYsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgIHB1Yjogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgfTtcblxuICAgICAgLy8gTm90ZTogVW5saWtlIGtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCwgd2UgZG8gTk9UIHJlc2hhcmUgdGhlIHdhbGxldCB3aXRoIHNwZW5kZXJzXG4gICAgICAvLyBUaGlzIGlzIGEga2V5IGRpZmZlcmVuY2UgLSBtdWx0aS1rZXktdXNlci1rZXkgd2FsbGV0cyBkb24ndCByZXF1aXJlIHJlc2hhcmVcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHVwZGF0ZVBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gS2V5Y2hhaW4gb3ZlcnJpZGUgY2FzZTogcmVxdWlyZXMgdXNlciBrZXljaGFpbiBjcmVhdGlvbiBhbmQgc2lnbmluZ1xuICAgIGlmIChcbiAgICAgIHdhbGxldFNoYXJlLmtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5kZXhPZignYWRtaW4nKSAhPT0gLTEgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xXG4gICAgKSB7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVVc2VyS2V5Y2hhaW4ocGFyYW1zLnVzZXJQYXNzd29yZCwgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uKTtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRQcnYgd2FzIG5vdCBmb3VuZCBvbiB3YWxsZXQga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgdHJhZGluZ0FjY291bnRJZDogd2FsbGV0U2hhcmUud2FsbGV0LFxuICAgICAgICBwdWJrZXk6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgY29uc3QgcGF5bG9hZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gICAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnY6IHByaXZhdGVLZXkgfSwgcGF5bG9hZFN0cmluZyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgICAga2V5SWQ6IHdhbGxldEtleWNoYWluLmlkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWRTdHJpbmcsXG4gICAgICB9KTtcbiAgICAgIC8vIElmIHRoZSB3YWxsZXQgc2hhcmUgd2FzIGFjY2VwdGVkIHN1Y2Nlc3NmdWxseSAoY2hhbmdlZD10cnVlKSwgcmVzaGFyZSB0aGUgd2FsbGV0IHdpdGggdGhlIHNwZW5kZXJzXG4gICAgICBpZiAocmVzcG9uc2UuY2hhbmdlZCAmJiByZXNwb25zZS5zdGF0ZSA9PT0gJ2FjY2VwdGVkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzaGFyZVdhbGxldFdpdGhTcGVuZGVycyh3YWxsZXRTaGFyZS53YWxsZXQsIHBhcmFtcy51c2VyUGFzc3dvcmQsIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBUT0RPOiBQWC0zODI2XG4gICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHJpZ2h0IGF3YXkgaWYgdGhlcmUgaXMgbm8ga2V5Y2hhaW4gdG8gZGVjcnlwdCwgb3IgaWYgZXhwbGljaXQgZW5jcnlwdGVkUHJ2IHdhcyBwcm92aWRlZFxuICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4gfHwgIXdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fCBlbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTW9yZSB0aGFuIHZpZXdpbmcgd2FzIHJlcXVlc3RlZCwgc28gd2UgbmVlZCB0byBwcm9jZXNzIHRoZSB3YWxsZXQga2V5cyB1c2luZyB0aGUgc2hhcmVkIGVjZGggc2NoZW1lXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCkpIGFzIGFueTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkWHBydiB3YXMgbm90IGZvdW5kIG9uIHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSB0aGUgc2hhcmluZyBrZXljaGFpbiwgd2UgY2FuIHdvcmsgb3V0IHRoZSBzZWNyZXQgdXNlZCBmb3Igc2hhcmluZyB0aGUgd2FsbGV0IHdpdGggdXNcbiAgICBzaGFyaW5nS2V5Y2hhaW4ucHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChcbiAgICAgIC8vIERlcml2ZSBrZXkgYnkgcGF0aCAod2hpY2ggaXMgdXNlZCBiZXR3ZWVuIHRoZXNlIDIgdXNlcnMgb25seSlcbiAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBZZXMhIFdlIGdvdCB0aGUgc2VjcmV0IHN1Y2Nlc3NmdWxseSBoZXJlLCBub3cgZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCBwcnZcbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgfSk7XG5cbiAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgY29uc3QgbmV3V2FsbGV0UGFzc3BocmFzZSA9IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQ7XG4gICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydixcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgfSk7XG4gICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgIH07XG5cbiAgICBpZiAoZW5jcnlwdGVkUHJ2KSB7XG4gICAgICB1cGRhdGVQYXJhbXMuZW5jcnlwdGVkUHJ2ID0gZW5jcnlwdGVkUHJ2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgQWNjZXB0IHdhbGxldCBzaGFyZXMsIGFkZGluZyB0aGUgd2FsbGV0cyB0byB0aGUgdXNlcidzIGxpc3RcbiAgICogTmVlZHMgYSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIGtleVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gYXJyYXkgb2YgdGhlIHdhbGxldCBzaGFyZXMgdG8gYWNjZXB0XG4gICAqIEBwYXJhbSBwYXJhbXMudXNlclBhc3N3b3JkIC0gdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICpcbiAgICpAcmV0dXJucyB7UHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmUocGFyYW1zOiBCdWxrQWNjZXB0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJMb2dpblBhc3N3b3JkJ10sIFsnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoJ25ld1dhbGxldFBhc3NwaHJhc2UnIGluIHBhcmFtcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgdmFsaWQgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB1c2VyIGxvZ2luIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRTaGFyZUlkcy5sZW5ndGggPiAwLCAnUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIHdhbGxldCBzaGFyZSB0byBhY2NlcHQnKTtcblxuICAgIGNvbnN0IGFsbFdhbGxldFNoYXJlcyA9IGF3YWl0IHRoaXMubGlzdFNoYXJlc1YyKCk7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVNYXAgPSBhbGxXYWxsZXRTaGFyZXMuaW5jb21pbmcucmVkdWNlKFxuICAgICAgKG1hcDogeyBba2V5OiBzdHJpbmddOiBXYWxsZXRTaGFyZSB9LCBzaGFyZSkgPT4gKHsgLi4ubWFwLCBbc2hhcmUuaWRdOiBzaGFyZSB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIGNvbnN0IHdhbGxldFNoYXJlcyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkc1xuICAgICAgLm1hcCgod2FsbGV0U2hhcmVJZCkgPT4gd2FsbGV0U2hhcmVNYXBbd2FsbGV0U2hhcmVJZF0pXG4gICAgICAuZmlsdGVyKCh3YWxsZXRTaGFyZSkgPT4gd2FsbGV0U2hhcmUgJiYgKHdhbGxldFNoYXJlLmtleWNoYWluIHx8IHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpKTtcblxuICAgIGlmICghd2FsbGV0U2hhcmVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB2YWxpZCB3YWxsZXQgc2hhcmVzIGZvdW5kIHRvIGFjY2VwdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQ7XG4gICAgY29uc3Qgd2ViYXV0aG5JbmZvID0gcGFyYW1zLndlYmF1dGhuSW5mbztcblxuICAgIC8vIE9uZSBzZXNzaW9uIG92ZXIgbmV3V2FsbGV0UGFzc3BocmFzZSAoYW5kIG9uZSBtb3JlIGZvciB3ZWJhdXRobkluZm8ucGFzc3BocmFzZSB3aGVuXG4gICAgLy8gcHJlc2VudCkuIHYyOiBvbmUgQXJnb24yaWQgZGVyaXZhdGlvbiB0b3RhbCwgcGVyLWVudmVsb3BlIEFFUyBrZXlzIHZpYSBIS0RGIHdpdGggZnJlc2hcbiAgICAvLyBzYWx0cyAoY3Jvc3MtZW52ZWxvcGUgaW5kZXBlbmRlbmNlIHByZXNlcnZlZCkuIHYxOiBzaGltIHJ1bnMgU0pDTCBwZXIgY2FsbCBzbyBjYWxsZXJzXG4gICAgLy8gcGlubmluZyBlbmNyeXB0aW9uVmVyc2lvbj0xIHN0aWxsIGdldCB2MSBlbnZlbG9wZXMgd2l0aG91dCBhbnkgYnJhbmNoaW5nIGhlcmUuXG4gICAgY29uc3Qgd2FsbGV0U2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24obmV3V2FsbGV0UGFzc3BocmFzZSwgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uKTtcbiAgICBsZXQgd2ViYXV0aG5TZXNzaW9uOiBJRW5jcnlwdGlvblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHdlYmF1dGhuU2Vzc2lvbiA9IHdlYmF1dGhuSW5mb1xuICAgICAgICA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgdGhlIHdlYmF1dGhuIHNlc3Npb24gZmFpbHMgdG8gaW5pdGlhbGl6ZSAoZS5nLiBXQVNNIE9PTSksIGRlc3Ryb3kgdGhlIHdhbGxldCBzZXNzaW9uXG4gICAgICAvLyB0byBhdm9pZCBsZWFraW5nIGl0cyBIS0RGIHJvb3QuIFByZXNlcnZlcyB0aGUgaW52YXJpYW50IHRoYXQgbm8gc2Vzc2lvbiBvdXRsaXZlcyBhXG4gICAgICAvLyBmYWlsdXJlIGluIHRoaXMgbWV0aG9kLlxuICAgICAgd2FsbGV0U2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NTaGFyZSA9IGFzeW5jICh3YWxsZXRTaGFyZTogV2FsbGV0U2hhcmUpOiBQcm9taXNlPEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXT4gPT4ge1xuICAgICAgLy8gSGFuZGxlIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQgY2FzZSAtIHRoZXNlIHNoYXJlcyBkb24ndCBoYXZlIGtleWNoYWluc1xuICAgICAgaWYgKHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgaWYgKCFwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgd2FsbGV0U2Vzc2lvbi5lbmNyeXB0KHdhbGxldEtleWNoYWluLnBydik7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZDogd2FsbGV0U2hhcmUuaWQsXG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGVuY3J5cHRlZFBydixcbiAgICAgICAgICAgIHB1Yjogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YW5kYXJkIGNhc2U6IHNoYXJlcyB3aXRoIGtleWNoYWluc1xuICAgICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgICBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JylcbiAgICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSBhd2FpdCB3YWxsZXRTZXNzaW9uLmVuY3J5cHQoZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2KTtcbiAgICAgIGNvbnN0IGVudHJ5OiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0ID0ge1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiB3YWxsZXRTaGFyZS5pZCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBuZXdFbmNyeXB0ZWRQcnYsXG4gICAgICB9O1xuICAgICAgaWYgKHdlYmF1dGhuSW5mbykge1xuICAgICAgICBhc3NlcnQod2ViYXV0aG5TZXNzaW9uLCAnd2ViYXV0aG5TZXNzaW9uIG11c3QgZXhpc3Qgd2hlbiB3ZWJhdXRobkluZm8gaXMgcHJvdmlkZWQnKTtcbiAgICAgICAgZW50cnkud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB3ZWJhdXRoblNlc3Npb24uZW5jcnlwdChkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsIHdhbGxldFNoYXJlLmVudGVycHJpc2UpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXlzRm9yV2FsbGV0U2hhcmVzOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgXy5jaHVuayh3YWxsZXRTaGFyZXMsIEJVTEtfU0hBUkVfQkFUQ0hfU0laRSkpIHtcbiAgICAgICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYmF0Y2gubWFwKCh3YWxsZXRTaGFyZSkgPT4gcHJvY2Vzc1NoYXJlKHdhbGxldFNoYXJlKSkpO1xuICAgICAgICBrZXlzRm9yV2FsbGV0U2hhcmVzLnB1c2goLi4uYmF0Y2hSZXN1bHRzLmZsYXQoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1bGtBY2NlcHRTaGFyZVJlcXVlc3Qoa2V5c0ZvcldhbGxldFNoYXJlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHdhbGxldFNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgd2ViYXV0aG5TZXNzaW9uPy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgbXVsdGlwbGUgd2FsbGV0IHNoYXJlcyBpbiBidWxrXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB1c2VycyB0byBhY2NlcHQgb3IgcmVqZWN0IG11bHRpcGxlIHdhbGxldCBzaGFyZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBJdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiB3YWxsZXQgc2hhcmVzIGluY2x1ZGluZyB0aG9zZSByZXF1aXJpbmcgc3BlY2lhbCBrZXljaGFpbiBvdmVycmlkZXNcbiAgICogYW5kIHRob3NlIHdpdGggZW5jcnlwdGVkIHByaXZhdGUga2V5cyB0aGF0IG5lZWQgdG8gYmUgZGVjcnlwdGVkIGFuZCByZS1lbmNyeXB0ZWQuXG4gICAqIEFmdGVyIHByb2Nlc3NpbmcsIGl0IGFsc28gcmVzaGFyZXMgYWNjZXB0ZWQgd2FsbGV0cyB3aXRoIHNwZW5kZXJzIGZvciBzcGVjaWFsIG92ZXJyaWRlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9ucyBmb3IgYnVsayB1cGRhdGluZyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2hhcmVzIC0gQXJyYXkgb2Ygd2FsbGV0IHNoYXJlcyB0byB1cGRhdGUgd2l0aCB0aGVpciBzdGF0dXMgKGFjY2VwdC9yZWplY3QpXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmQgZm9yIGRlY3J5cHRpb24gb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHJlLWVuY3J5cHRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgcmVzcG9uc2VzIGZvciBlYWNoIHdhbGxldCBzaGFyZSB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGJ1bGtVcGRhdGVXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlPiB7XG4gICAgaWYgKCFwYXJhbXMuc2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnNoYXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBhcnJheTogc2hhcmVzIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy5zaGFyZXMpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggc2hhcmUgaW4gdGhlIGFycmF5XG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBwYXJhbXMuc2hhcmVzKSB7XG4gICAgICBpZiAoIXNoYXJlLndhbGxldFNoYXJlSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFNoYXJlSWQgaW4gc2hhcmUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaGFyZS5zdGF0dXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHN0YXR1cyBpbiBzaGFyZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hhcmUuc3RhdHVzICE9PSAnYWNjZXB0JyAmJiBzaGFyZS5zdGF0dXMgIT09ICdyZWplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0dXMgaW4gc2hhcmU6ICcgKyBzaGFyZS5zdGF0dXMgKyAnLiBNdXN0IGJlIGVpdGhlciBcImFjY2VwdFwiIG9yIFwicmVqZWN0XCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzaGFyZS53YWxsZXRTaGFyZUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyB3YWxsZXRTaGFyZUlkIHRvIGJlIGEgc3RyaW5nIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBzdHJpbmc6IHVzZXJMb2dpblBhc3N3b3JkIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgcGFyYW1ldGVyIHN0cmluZzogbmV3V2FsbGV0UGFzc3BocmFzZSBidXQgZm91bmQgJyArIHR5cGVvZiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSk7XG4gICAgfVxuICAgIGFzc2VydChwYXJhbXMuc2hhcmVzLmxlbmd0aCA+IDAsICdubyBzaGFyZXMgYXJlIHBhc3NlZCcpO1xuXG4gICAgY29uc3QgeyBzaGFyZXM6IGlucHV0U2hhcmVzLCB1c2VyTG9naW5QYXNzd29yZCwgbmV3V2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb24gfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGFsbFdhbGxldFNoYXJlcyA9IGF3YWl0IHRoaXMubGlzdFNoYXJlc1YyKCk7XG5cbiAgICAvLyBPbmx5IGluY2x1ZGUgc2hhcmVzIHRoYXQgYXJlIGluIHRoZSBpbnB1dCBhcnJheSBmb3IgZWZmaWNpZW5jeVxuICAgIGNvbnN0IHNoYXJlSWRzID0gbmV3IFNldChpbnB1dFNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZS53YWxsZXRTaGFyZUlkKSk7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBhbGxXYWxsZXRTaGFyZXMuaW5jb21pbmdcbiAgICAgIC5maWx0ZXIoKHNoYXJlKSA9PiBzaGFyZUlkcy5oYXMoc2hhcmUuaWQpKVxuICAgICAgLmZvckVhY2goKHNoYXJlKSA9PiB3YWxsZXRTaGFyZU1hcC5zZXQoc2hhcmUuaWQsIHNoYXJlKSk7XG5cbiAgICBhbGxXYWxsZXRTaGFyZXMub3V0Z29pbmdcbiAgICAgIC5maWx0ZXIoKHNoYXJlKSA9PiBzaGFyZUlkcy5oYXMoc2hhcmUuaWQpKVxuICAgICAgLmZvckVhY2goKHNoYXJlKSA9PiB3YWxsZXRTaGFyZU1hcC5zZXQoc2hhcmUuaWQsIHNoYXJlKSk7XG5cbiAgICBjb25zdCByZXNvbHZlZFNoYXJlcyA9IGlucHV0U2hhcmVzLm1hcCgoc2hhcmUpID0+IHtcbiAgICAgIGNvbnN0IHdhbGxldFNoYXJlID0gd2FsbGV0U2hhcmVNYXAuZ2V0KHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgaWYgKCF3YWxsZXRTaGFyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2FsbGV0IHNoYXJlIHByb3ZpZGVkOiAke3NoYXJlLndhbGxldFNoYXJlSWR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zaGFyZSwgd2FsbGV0U2hhcmUgfTtcbiAgICB9KTtcblxuICAgIC8vIElkZW50aWZ5IHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgdGhhdCBuZWVkIHJlc2hhcmluZyBhZnRlciBhY2NlcHRhbmNlXG4gICAgY29uc3Qgc3BlY2lhbE92ZXJyaWRlQ2FzZXMgPSBuZXcgTWFwKCk7XG4gICAgcmVzb2x2ZWRTaGFyZXMuZm9yRWFjaCgoc2hhcmUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgc2hhcmUuc3RhdHVzID09PSAnYWNjZXB0JyAmJlxuICAgICAgICBzaGFyZS53YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJylcbiAgICAgICkge1xuICAgICAgICBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5zZXQoc2hhcmUud2FsbGV0U2hhcmVJZCwgc2hhcmUud2FsbGV0U2hhcmUud2FsbGV0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERlY3J5cHQgc2hhcmluZyBrZXljaGFpbiBpZiBuZWVkZWQgKG9ubHkgb25jZSlcbiAgICBsZXQgc2hhcmluZ0tleWNoYWluUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGRlY3J5cHQgaWYgdGhlcmUgYXJlIHNoYXJlcyB0byBhY2NlcHQgdGhhdCBtaWdodCBuZWVkIGl0XG4gICAgY29uc3QgaGFzU2hhcmVzUmVxdWlyaW5nRGVjcnlwdGlvbiA9XG4gICAgICBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5zaXplID4gMCB8fFxuICAgICAgcmVzb2x2ZWRTaGFyZXMuc29tZSgoc2hhcmUpID0+IHNoYXJlLnN0YXR1cyA9PT0gJ2FjY2VwdCcgJiYgc2hhcmUud2FsbGV0U2hhcmUua2V5Y2hhaW4/LmVuY3J5cHRlZFBydik7XG5cbiAgICBpZiAodXNlckxvZ2luUGFzc3dvcmQgJiYgaGFzU2hhcmVzUmVxdWlyaW5nRGVjcnlwdGlvbikge1xuICAgICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gYXdhaXQgdGhpcy5iaXRnby5nZXRFQ0RIS2V5Y2hhaW4oKTtcbiAgICAgIGlmICghc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgc2hhcmluZ0tleWNoYWluUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPbmUgc2Vzc2lvbiBvdmVyIHRoZSBvdXRlciByZS1lbmNyeXB0IHBhc3N3b3JkLiBDb3ZlcnMgYWxsIHRocmVlIGFjY2VwdCBwYXRocyBpblxuICAgIC8vIHByb2Nlc3NBY2NlcHRTaGFyZSDigJQgc3BlY2lhbE92ZXJyaWRlQ2FzZSAodGhyZWFkZWQgdGhyb3VnaCBjcmVhdGVVc2VyS2V5Y2hhaW4pLFxuICAgIC8vIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQsIGFuZCBzdGFuZGFyZCBFQ0RIIHJlLWVuY3J5cHQg4oCUIHNpbmNlIHRoZXkgYWxsIHVzZSB0aGVcbiAgICAvLyBzYW1lIGBuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkYC4gU2tpcCBzZXNzaW9uIGNyZWF0aW9uIHdoZW4gdGhlcmUnc1xuICAgIC8vIG5vdGhpbmcgdG8gZW5jcnlwdCAocmVqZWN0LW9ubHkgYnVsa3MpLlxuICAgIGNvbnN0IHNlc3Npb25QYXNzd29yZCA9IG5ld1dhbGxldFBhc3NwaHJhc2UgfHwgdXNlckxvZ2luUGFzc3dvcmQ7XG4gICAgY29uc3QgaGFzU2hhcmVzVG9FbmNyeXB0ID0gcmVzb2x2ZWRTaGFyZXMuc29tZSgoc2hhcmUpID0+IHNoYXJlLnN0YXR1cyA9PT0gJ2FjY2VwdCcpO1xuICAgIGNvbnN0IHNlc3Npb24gPVxuICAgICAgc2Vzc2lvblBhc3N3b3JkICYmIGhhc1NoYXJlc1RvRW5jcnlwdFxuICAgICAgICA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24oc2Vzc2lvblBhc3N3b3JkLCBlbmNyeXB0aW9uVmVyc2lvbilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlO1xuICAgIGxldCBmYWlsZWRVcGRhdGVzOiBBcnJheTx7IHdhbGxldFNoYXJlSWQ6IHN0cmluZzsgcmVhc29uOiBzdHJpbmcgfT4gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGxlZFVwZGF0ZXM6IFByb21pc2VTZXR0bGVkUmVzdWx0PEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0W10+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgXy5jaHVuayhyZXNvbHZlZFNoYXJlcywgQlVMS19TSEFSRV9CQVRDSF9TSVpFKSkge1xuICAgICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgYmF0Y2gubWFwKGFzeW5jIChzaGFyZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB3YWxsZXRTaGFyZUlkLCBzdGF0dXMsIHdhbGxldFNoYXJlIH0gPSBzaGFyZTtcblxuICAgICAgICAgICAgLy8gSGFuZGxlIGFjY2VwdCBjYXNlXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnYWNjZXB0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQWNjZXB0U2hhcmUoXG4gICAgICAgICAgICAgICAgd2FsbGV0U2hhcmVJZCxcbiAgICAgICAgICAgICAgICB3YWxsZXRTaGFyZSxcbiAgICAgICAgICAgICAgICB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgICAgICAgICAgICBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgICAgIHNoYXJpbmdLZXljaGFpblBydixcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgICAgICBzZXNzaW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSByZWplY3QgY2FzZVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncmVqZWN0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgc2V0dGxlZFVwZGF0ZXMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IHN1Y2Nlc3NmdWwgdXBkYXRlc1xuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFVwZGF0ZXMgPSBzZXR0bGVkVXBkYXRlcy5mbGF0TWFwKChyZXN1bHQpID0+IChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyA/IHJlc3VsdC52YWx1ZSA6IFtdKSk7XG5cbiAgICAgIC8vIEV4dHJhY3QgZmFpbGVkIHVwZGF0ZXMgLSBvbmx5IGZyb20gcmVqZWN0ZWQgcHJvbWlzZXNcbiAgICAgIGZhaWxlZFVwZGF0ZXMgPSBzZXR0bGVkVXBkYXRlcy5yZWR1Y2U8QXJyYXk8eyB3YWxsZXRTaGFyZUlkOiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nIH0+PigoYWNjLCByZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgcmVqZWN0ZWRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZDogcmVzb2x2ZWRTaGFyZXNbaW5kZXhdLndhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICByZWFzb246IHJlamVjdGVkUmVzdWx0LnJlYXNvbj8ubWVzc2FnZSB8fCBTdHJpbmcocmVqZWN0ZWRSZXN1bHQucmVhc29uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgW10pO1xuXG4gICAgICAvLyBTZW5kIHN1Y2Nlc3NmdWwgdXBkYXRlcyB0byB0aGUgc2VydmVyXG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVxdWVzdChzdWNjZXNzZnVsVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNlc3Npb24/LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGFjY2VwdGVkIHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgLSByZXNoYXJlIHdpdGggc3BlbmRlcnNcbiAgICBpZiAocmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMgJiYgcmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMubGVuZ3RoID4gMCAmJiB1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgLy8gRm9yIGVhY2ggYWNjZXB0ZWQgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYSBzcGVjaWFsIG92ZXJyaWRlIGNhc2UsIHJlc2hhcmUgd2l0aCBzcGVuZGVyc1xuICAgICAgZm9yIChjb25zdCB3YWxsZXRTaGFyZUlkIG9mIHJlc3BvbnNlLmFjY2VwdGVkV2FsbGV0U2hhcmVzKSB7XG4gICAgICAgIGlmIChzcGVjaWFsT3ZlcnJpZGVDYXNlcy5oYXMod2FsbGV0U2hhcmVJZCkpIHtcbiAgICAgICAgICBjb25zdCB3YWxsZXRJZCA9IHNwZWNpYWxPdmVycmlkZUNhc2VzLmdldCh3YWxsZXRTaGFyZUlkKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldElkLCB1c2VyTG9naW5QYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIExvZyBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBzaGFyZXNcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlc2hhcmluZyB3YWxsZXQgJHt3YWxsZXRJZH0gd2l0aCBzcGVuZGVyczogJHtlPy5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBmYWlsZWQgdXBkYXRlcyB0byB0aGUgcmVzcG9uc2VcbiAgICBpZiAoZmFpbGVkVXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXNwb25zZS53YWxsZXRTaGFyZVVwZGF0ZUVycm9ycy5wdXNoKC4uLmZhaWxlZFVwZGF0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYmVpbmcgYWNjZXB0ZWRcbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgZGlmZmVyZW50IGNhc2VzIGZvciBhY2NlcHRpbmcgYSB3YWxsZXQgc2hhcmU6XG4gICAqIDEuIFNwZWNpYWwgb3ZlcnJpZGUgY2FzZSByZXF1aXJpbmcgdXNlciBrZXljaGFpbiBhbmQgc2lnbmluZ1xuICAgKiAyLiBTaW1wbGUgY2FzZSB3aXRoIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICogMy4gU3RhbmRhcmQgY2FzZSByZXF1aXJpbmcgZGVjcnlwdGlvbiBhbmQgcmUtZW5jcnlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0U2hhcmVJZCAtIElEIG9mIHRoZSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHdhbGxldFNoYXJlIC0gV2FsbGV0IHNoYXJlIG9iamVjdFxuICAgKiBAcGFyYW0gdXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHNoYXJpbmdLZXljaGFpblBydiAtIERlY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluIHByaXZhdGUga2V5XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHdhbGxldCBzaGFyZSB1cGRhdGUgcmVxdWVzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0FjY2VwdFNoYXJlKFxuICAgIHdhbGxldFNoYXJlSWQ6IHN0cmluZyxcbiAgICB3YWxsZXRTaGFyZTogV2FsbGV0U2hhcmUsXG4gICAgdXNlckxvZ2luUGFzc3dvcmQ/OiBzdHJpbmcsXG4gICAgbmV3V2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBzaGFyaW5nS2V5Y2hhaW5QcnY/OiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBzZXNzaW9uPzogSUVuY3J5cHRpb25TZXNzaW9uXG4gICk6IFByb21pc2U8QnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9uc1JlcXVlc3RbXT4ge1xuICAgIC8vIFNwZWNpYWwgb3ZlcnJpZGUgY2FzZTogcmVxdWlyZXMgdXNlciBrZXljaGFpbiBhbmQgc2lnbmluZ1xuICAgIGlmIChcbiAgICAgIHdhbGxldFNoYXJlLmtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpXG4gICAgKSB7XG4gICAgICBpZiAoIXVzZXJMb2dpblBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhyZWFkIHRoZSBvdXRlciBzZXNzaW9uIGludG8gY3JlYXRlVXNlcktleWNoYWluIHNvIGl0cyBpbnRlcm5hbCBlbmNyeXB0IHVzZXMgSEtERlxuICAgICAgLy8gaW5zdGVhZCBvZiBydW5uaW5nIGFub3RoZXIgQXJnb24yaWQgdW5kZXIgdGhlIHNhbWUgcGFzc3dvcmQuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVVc2VyS2V5Y2hhaW4obmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24sIHNlc3Npb24pO1xuICAgICAgaWYgKCF3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRQcnYgd2FzIG5vdCBmb3VuZCBvbiB3YWxsZXQga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHJhZGluZ0FjY291bnRJZDogd2FsbGV0U2hhcmUud2FsbGV0LFxuICAgICAgICBwdWJrZXk6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgcGF5bG9hZCk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAga2V5SWQ6IHdhbGxldEtleWNoYWluLmlkLFxuICAgICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBNdWx0aS11c2VyLWtleSBjYXNlOiByZXF1aXJlcyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIHB1YmxpYyBrZXlcbiAgICBpZiAod2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkO1xuICAgICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBzZXNzaW9uXG4gICAgICAgID8gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHdhbGxldEtleWNoYWluLnBydilcbiAgICAgICAgOiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZCwgaW5wdXQ6IHdhbGxldEtleWNoYWluLnBydiwgZW5jcnlwdGlvblZlcnNpb24gfSk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgcHViOiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmICghdXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICB9XG4gICAgaWYgKCFzaGFyaW5nS2V5Y2hhaW5QcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHJldHJpZXZlIGFuZCBkZWNyeXB0IHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXJpdmVkS2V5ID0gYmlwMzIuZnJvbUJhc2U1OChzaGFyaW5nS2V5Y2hhaW5QcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKTtcblxuICAgIGNvbnN0IHNoYXJlZFNlY3JldCA9IGdldFNoYXJlZFNlY3JldChkZXJpdmVkS2V5LCBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JykpLnRvU3RyaW5nKFxuICAgICAgJ2hleCdcbiAgICApO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzaGFyZWRTZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gUmUtZW5jcnlwdCBmb3IgdGhlIGFjY2VwdGVyLiBUaGUgcGVyLXJlY2lwaWVudCBFQ0RIIGRlY3J5cHQgYWJvdmUgc3RpbGwgcnVucyBpdHMgb3duXG4gICAgLy8gQXJnb24yIHdoZW4gdGhlIHNlbmRlcidzIGtleWNoYWluIGlzIHYyICh1bmlxdWUgcGFzc3dvcmQgcGVyIHNoYXJlLCBubyBzZXNzaW9uIHBvc3NpYmxlKS5cbiAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBzZXNzaW9uXG4gICAgICA/IGF3YWl0IHNlc3Npb24uZW5jcnlwdChkZWNyeXB0ZWRQcnYpXG4gICAgICA6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UgfHwgdXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICAgICAgaW5wdXQ6IGRlY3J5cHRlZFBydixcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0dXM6ICdhY2NlcHQnIGFzIGNvbnN0LFxuICAgICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuaWQgd2FsbGV0IGlkXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBHZXRXYWxsZXRPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pbmNsdWRlQmFsYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZSA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBpdHMgYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyB3YWxsZXQgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEJ5QWRkcmVzcyhwYXJhbXM6IEdldFdhbGxldEJ5QWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGRyZXNzLycgKyBwYXJhbXMuYWRkcmVzcykpLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIHdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBnaXZlbiBzdXBwb3J0ZWQgY29pbiwgZ2V0IHRvdGFsIGJhbGFuY2VzIGZvciBhbGwgd2FsbGV0cyBvZiB0aGF0XG4gICAqIGNvaW4gdHlwZSBvbiB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRvdGFsQmFsYW5jZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2JhbGFuY2VzJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFRTUyB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyIGNhbGxiYWNrcyBmb3Iga2V5IGdlbmVyYXRpb24uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogR2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXJPcHRpb25zXG4gICk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHsgbGFiZWwsIGVudGVycHJpc2UsIHR5cGUgPSAnaG90JyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgVFNTIGF0IHRoaXMgdGltZWApO1xuICAgIH1cblxuICAgIGlmICghZW50ZXJwcmlzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIGZvciBUU1Mgd2FsbGV0IGdlbmVyYXRpb24gd2l0aCBleHRlcm5hbCBzaWduZXInKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmJhc2VDb2luLmlzRVZNKCkgJiZcbiAgICAgIHBhcmFtcy53YWxsZXRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICEocGFyYW1zLndhbGxldFZlcnNpb24gPT09IDUgfHwgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDYpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VWTSBUU1Mgd2FsbGV0cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHdhbGxldCB2ZXJzaW9uIDUgYW5kIDYnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9kaWFsIFRTUyB3YWxsZXRzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgVFNTIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2ViYXV0aG5JbmZvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWJhdXRobkluZm8gaXMgbm90IHN1cHBvcnRlZCBmb3IgVFNTIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NwaHJhc2VQYXRoUGFyYW1zID0gWydwYXNzcGhyYXNlJywgJ3VzZXJLZXknLCAnYmFja3VwWHB1YicsICdiYWNrdXBYcHViUHJvdmlkZXInXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXNzcGhyYXNlUGF0aFBhcmFtcykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtc1trZXldKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBjYW5ub3QgYmUgdXNlZCB3aXRoIFRTUyBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtcGNBbGdvcml0aG0gPSB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpO1xuICAgIGxldCB3YWxsZXRWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQgPSBwYXJhbXMud2FsbGV0VmVyc2lvbjtcbiAgICBsZXQga2V5Y2hhaW5zOiBLZXljaGFpbnNUcmlwbGV0O1xuXG4gICAgaWYgKG1wY0FsZ29yaXRobSA9PT0gJ2VjZHNhJykge1xuICAgICAgaWYgKCFwYXJhbXMuZWNkc2FNUEN2MkNhbGxiYWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VjZHNhTVBDdjJDYWxsYmFja3MgaXMgcmVxdWlyZWQgZm9yIEVDRFNBIFRTUyB3YWxsZXQgZ2VuZXJhdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25lcicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZSB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuXG4gICAgICBpZiAod2FsbGV0VmVyc2lvbiA9PT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VDRFNBIE1QQ3YxICh3YWxsZXQgdmVyc2lvbiAzKSBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAod2FsbGV0VmVyc2lvbiA9PT0gNSB8fCB3YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAga2V5Y2hhaW5zID0gYXdhaXQgbmV3IEVDRFNBVXRpbHMuRWNkc2FNUEN2MlV0aWxzKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIGNhbGxiYWNrczogcGFyYW1zLmVjZHNhTVBDdjJDYWxsYmFja3MsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwYXJhbXMuZWRkc2FDYWxsYmFja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlZGRzYUNhbGxiYWNrcyBpcyByZXF1aXJlZCBmb3IgRWREU0EgVFNTIHdhbGxldCBnZW5lcmF0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmVyJyk7XG4gICAgICB9XG4gICAgICBrZXljaGFpbnMgPSBhd2FpdCBuZXcgRUREU0FVdGlscy5kZWZhdWx0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIGNhbGxiYWNrczogcGFyYW1zLmVkZHNhQ2FsbGJhY2tzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBrZXljaGFpbnM7XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIHR5cGUsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgVFNTIG9yIEJMUy1ES0cgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTXBjV2FsbGV0KHtcbiAgICBwYXNzcGhyYXNlLFxuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIHdlYmF1dGhuSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgfTogR2VuZXJhdGVNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZSB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZU1wYyh7XG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0ga2V5Y2hhaW5zO1xuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgIH07XG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpKSB7XG4gICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU2VsZi1NYW5hZ2VkIENvbGQgVFNTIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNNQ01wY1dhbGxldCh7XG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgICBiaXRnb0tleUlkLFxuICAgIGNvbW1vbktleWNoYWluLFxuICAgIGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgfTogR2VuZXJhdGVTTUNNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucXVlcnkoeyBlbnRlcnByaXNlIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/LmNvbGRNdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBNUEMgS2V5Y2hhaW5zXG4gICAgY29uc3QgYml0Z29LZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGJpdGdvS2V5SWQgfSk7XG5cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4gfHwgIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0R28ga2V5Y2hhaW4gbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgaWYgKGJpdGdvS2V5Y2hhaW4uc291cmNlICE9PSAnYml0Z28nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBiaXRnb0tleUlkIGlzIG5vdCBhIEJpdEdvIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgaWYgKGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4gIT09IGNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBDb21tb24ga2V5Y2hhaW4gbWlzbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgQml0Z28ga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBjb21tb25LZXljaGFpbixcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgIGlzTVBDdjI6IG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcblxuICAgIGNvbnN0IGJhY2t1cEtleUNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogY29tbW9uS2V5Y2hhaW4sXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBjb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICBpc01QQ3YyOiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChiYWNrdXBLZXlDaGFpblBhcmFtcyk7XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3Qga2V5Y2hhaW5zID0geyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH07XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIHR5cGU6ICdjb2xkJyxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDdXN0b2RpYWwgVFNTIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUN1c3RvZGlhbE1wY1dhbGxldCh7XG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGlzU2hpZWxkZWQsXG4gICAgZW50ZXJwcmlzZSxcbiAgICB3YWxsZXRWZXJzaW9uLFxuICB9OiBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucXVlcnkoeyBlbnRlcnByaXNlIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/LmN1c3RvZGlhbE11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgICAgdHlwZTogJ2N1c3RvZGlhbCcsXG4gICAgICAuLi4oaXNTaGllbGRlZCAmJiB7IGNvaW5TcGVjaWZpYzogeyBpc1NoaWVsZGVkOiB0cnVlIH0gfSksXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSB3YWxsZXQua2V5SWRzKCk7XG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluOiB7IGlkOiBrZXljaGFpbnNbMF0sIHR5cGU6IG11bHRpc2lnVHlwZSwgc291cmNlOiAndXNlcicgfSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiBrZXljaGFpbnNbMV0sIHR5cGU6IG11bHRpc2lnVHlwZSwgc291cmNlOiAnYmFja3VwJyB9LFxuICAgICAgYml0Z29LZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzJdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JpdGdvJyB9LFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uPzogbnVtYmVyLCBtdWx0aXNpZ1R5cGVWZXJzaW9uPzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmIG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicpIHtcbiAgICAgIGlmICghd2FsbGV0VmVyc2lvbiB8fCAod2FsbGV0VmVyc2lvbiAhPT0gNSAmJiB3YWxsZXRWZXJzaW9uICE9PSA2KSkge1xuICAgICAgICByZXR1cm4gNTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdhbGxldFZlcnNpb247XG4gIH1cbn1cbiJdfQ==
|