@bitgo/sdk-core 36.43.0 → 36.44.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/bitgo/baseCoin/iBaseCoin.d.ts +5 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +8 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +2 -4
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +1 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.js +6 -9
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +3 -3
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +27 -7
- 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/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +3 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +3 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +0 -20
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +0 -46
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +0 -2
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +0 -1
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +0 -137
|
@@ -56,7 +56,6 @@ const ecdsaMPCv2_1 = require("../../../tss/ecdsa/ecdsaMPCv2");
|
|
|
56
56
|
const opengpgUtils_1 = require("../../opengpgUtils");
|
|
57
57
|
const baseTypes_1 = require("../baseTypes");
|
|
58
58
|
const base_1 = require("./base");
|
|
59
|
-
const recipientUtils_1 = require("../recipientUtils");
|
|
60
59
|
const ecdsaMPCv2KeyGenSender_1 = require("./ecdsaMPCv2KeyGenSender");
|
|
61
60
|
const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
|
|
62
61
|
class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
|
|
@@ -488,7 +487,6 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
|
|
|
488
487
|
if (requestType === baseTypes_1.RequestType.tx) {
|
|
489
488
|
(0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
490
489
|
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
491
|
-
const effectiveTxParams = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, params.txParams);
|
|
492
490
|
// For ICP transactions, the HSM signs the serializedTxHex, while the user signs the signableHex separately.
|
|
493
491
|
// Verification cannot be performed directly on the signableHex alone. However, we can parse the serializedTxHex
|
|
494
492
|
// to regenerate the signableHex and compare it against the provided value for verification.
|
|
@@ -496,7 +494,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
|
|
|
496
494
|
if (this.baseCoin.getConfig().family === 'icp') {
|
|
497
495
|
await this.baseCoin.verifyTransaction({
|
|
498
496
|
txPrebuild: { txHex: unsignedTx.serializedTxHex, txInfo: unsignedTx.signableHex },
|
|
499
|
-
txParams:
|
|
497
|
+
txParams: params.txParams || { recipients: [] },
|
|
500
498
|
wallet: this.wallet,
|
|
501
499
|
walletType: this.wallet.multisigType(),
|
|
502
500
|
});
|
|
@@ -504,7 +502,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
|
|
|
504
502
|
else {
|
|
505
503
|
await this.baseCoin.verifyTransaction({
|
|
506
504
|
txPrebuild: { txHex: unsignedTx.signableHex },
|
|
507
|
-
txParams:
|
|
505
|
+
txParams: params.txParams || { recipients: [] },
|
|
508
506
|
wallet: this.wallet,
|
|
509
507
|
walletType: this.wallet.multisigType(),
|
|
510
508
|
});
|
|
@@ -970,4 +968,4 @@ function getKeyCombinedFromTssKeyShares(encryptedGG18UserKey, encryptedGG18Backu
|
|
|
970
968
|
return [userKeyCombined, backupKeyCombined];
|
|
971
969
|
}
|
|
972
970
|
// #endregion
|
|
973
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpeENBLHNEQVlDO0FBU0QsOERBYUM7QUFhRCw4Q0E4QkM7QUE5MUNELG9EQUF5RztBQUN6RyxrREFBb0M7QUFDcEMsb0RBQTRCO0FBQzVCLG1DQUFnQztBQUVoQyw2Q0FBNkM7QUFDN0Msb0RBQXNDO0FBQ3RDLDZDQUErQjtBQUUvQixzREFVNkI7QUFFN0IseURBQWdEO0FBR2hELHNDQUE4RDtBQUM5RCxnREFBMEU7QUFDMUUsNkNBQWdEO0FBQ2hELDhEQU11QztBQUV2QyxxREFBd0Q7QUFDeEQsNENBV3NCO0FBQ3RCLGlDQUF3QztBQUN4QyxzREFBNkQ7QUFDN0QscUVBQTZGO0FBQzdGLDREQUE4RjtBQUU5RixNQUFhLGVBQWdCLFNBQVEscUJBQWM7SUFLakQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFLckI7UUFDQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTNELGtFQUFrRTtRQUNsRSxvRUFBb0U7UUFDcEUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEcsTUFBTSxRQUFR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R0FBRyxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO0lBRXhCLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFO1FBQ2pFLG1CQUFtQixDQUFDLFdBQVc7UUFDL0IsbUJBQW1CLENBQUMsWUFBWTtLQUNqQyxDQUFDLENBQUM7SUFDSCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFO1FBQ3JFLHFCQUFxQixDQUFDLFVBQVU7UUFDaEMscUJBQXFCLENBQUMsV0FBVztLQUNsQyxDQUFDLENBQUM7SUFDSCxJQUNFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQ3ZFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJpZ0ludFRvQnVmZmVyQkUsIERrbHNDb21tcywgRGtsc0RrZywgRGtsc0RzZywgRGtsc1R5cGVzLCBEa2xzVXRpbHMgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28vc2pjbCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCBjcmVhdGVLZWNjYWtIYXNoIGZyb20gJ2tlY2Nhayc7XG5pbXBvcnQgKiBhcyBwZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHtcbiAgTVBDdjJCcm9hZGNhc3RNZXNzYWdlLFxuICBNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlLFxuICBNUEN2MktleUdlblN0YXRlRW51bSxcbiAgTVBDdjJQMlBNZXNzYWdlLFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuaW1wb3J0IHsgRWNkc2EgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYic7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4vaUtleWNoYWlucyc7XG5pbXBvcnQgeyBFQ0RTQU1ldGhvZFR5cGVzLCBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHsgc2VuZFNpZ25hdHVyZVNoYXJlVjIsIHNlbmRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MvY29tbW9uJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuL3R5cGVzTVBDdjInO1xuaW1wb3J0IHtcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvLFxuICB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lLFxuICB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kVHdvLFxufSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvZWNkc2FNUEN2Mic7XG5pbXBvcnQgeyBLZXlDb21iaW5lZCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdQR0tleVBhaXIgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHtcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgUmVxdWVzdFR5cGUsXG4gIFNpZ25hdHVyZVNoYXJlUmVjb3JkLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBCYXNlRWNkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSBmcm9tICcuLi9yZWNpcGllbnRVdGlscyc7XG5pbXBvcnQgeyBFY2RzYU1QQ3YyS2V5R2VuU2VuZEZuLCBLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlIH0gZnJvbSAnLi9lY2RzYU1QQ3YyS2V5R2VuU2VuZGVyJztcbmltcG9ydCB7IGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcsIGlzQml0Z29NcGNQdWJLZXkgfSBmcm9tICcuLi8uLi8uLi90c3MvYml0Z29QdWJLZXlzJztcblxuZXhwb3J0IGNsYXNzIEVjZHNhTVBDdjJVdGlscyBleHRlbmRzIEJhc2VFY2RzYVV0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZID0gJ0RLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURSA9ICdES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBES0xTMjNfU0lHTklOR19ST1VORDJfU1RBVEUgPSAnREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFJztcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAgIHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgeyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9ID0gdGhpcy5nZXRVc2VyQW5kQmFja3VwU2Vzc2lvbigyLCAzLCBwYXJhbXMucmV0cm9maXQpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBtcGN2MktleSA9IG1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQobXBjdjJLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBtcGN2MktleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIC8vIEVuc3VyZSB0aGUgcHVibGljIGtleSBpcyBvbmUgb2YgdGhlIGV4cGVjdGVkIEJpdEdvIHB1YmxpYyBrZXlzIHdoZW4gaW4gdGVzdCBvciBwcm9kLlxuICAgICAgYXNzZXJ0KGlzQml0Z29NcGNQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXksICdtcGN2MicpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGdwZ0tleTogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGdwZ0tleTogYmFja3VwR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGNvbnN0IHVzZXJSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCB1c2VyU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgYmFja3VwU2Vzc2lvbi5pbml0RGtnKCk7XG5cbiAgICBjb25zdCByb3VuZDFTZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxQnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxLCBiaXRnb1RvQmFja3VwTXNnMiwgYml0Z29Ub1VzZXJNc2cyIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBwYXJhbXMucmV0cm9maXQ/LndhbGxldElkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4ucm91bmQxTWVzc2FnZXMsXG4gICAgICAgICAgICB3YWxsZXRJZDogcGFyYW1zLnJldHJvZml0LndhbGxldElkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiByb3VuZDFNZXNzYWdlc1xuICAgICk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnMSldIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJQMlBNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnKSwgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdGdvTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CaXRnb01zZzIsICdVc2VyIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKHVzZXJUb0JpdGdvTXNnMik7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIERrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpXSxcbiAgICB9KTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoYmFja3VwUm91bmQyUDJQTWVzc2FnZXMpLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyLCAnQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiwgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBiaXRnb0NvbW1pdG1lbnQyLFxuICAgICAgYml0Z29Ub1VzZXJNc2czLFxuICAgICAgYml0Z29Ub0JhY2t1cE1zZzMsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHNlc3Npb25JZCwgcm91bmQyTWVzc2FnZXMpO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgM1xuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIDIgU2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kMk1zZ3MucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQyTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW2JhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMiwgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2cyID0gYmFja3VwUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzIsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kM01lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW2JpdGdvVG9Vc2VyUm91bmQyTXNnLCBiYWNrdXBUb1VzZXJNc2cyXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CYWNrdXBNc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CYWNrdXBNc2czLCAnVXNlciB0byBCYWNrdXAgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCB1c2VyVG9CaXRnb01zZzMgPSB1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Nc2czLCAnVXNlciB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZSh1c2VyVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQzTWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvQmFja3VwUm91bmQyTXNnLCB1c2VyVG9CYWNrdXBNc2cyXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck1zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwVG9Vc2VyTXNnMywgJ0JhY2t1cCB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwVG9CaXRnb01zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvQml0Z29Nc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UoYmFja3VwVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2csICdCaXRHbyB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub1VzZXJSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kNE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW2JhY2t1cFRvVXNlck1zZzMsIGJpdGdvVG9Vc2VyUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cgPSB1c2VyUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGFzc2VydCh1c2VyUm91bmQ0QnJvYWRjYXN0TXNnLCAnVXNlciBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UodXNlclJvdW5kNEJyb2FkY2FzdE1zZyk7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDRNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW3VzZXJUb0JhY2t1cE1zZzMsIGJpdGdvVG9CYWNrdXBSb3VuZDNNc2ddLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZyA9IGJhY2t1cFJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZywgJ0JhY2t1cCBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3Qgcm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAge1xuICAgICAgICBwMnBNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMsIHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnM10sXG4gICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJSb3VuZDRCcm9hZGNhc3RNc2csIHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgICAgfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMyxcbiAgICAgIGJpdGdvTXNnNCxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKHBhcmFtcy5lbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kM01lc3NhZ2VzKTtcblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDMsICdSb3VuZCAxIGFuZCAzIFNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhcbiAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2c0KV0gfSxcbiAgICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApLmJyb2FkY2FzdE1lc3NhZ2VzO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDRCcm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuXG4gICAgYXNzZXJ0KGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgdXNlclJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSB1c2VyU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyUHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBQcml2YXRlTWF0ZXJpYWwpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIHVzZXJDb21tb25LZXljaGFpbiwgJ1VzZXIgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIGJhY2t1cENvbW1vbktleWNoYWluLCAnQmFja3VwIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCYWNrdXBLZXljaGFpbihcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbihiaXRnb0NvbW1vbktleWNoYWluKTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHVzZXJLZXljaGFpblByb21pc2UsXG4gICAgICBiYWNrdXBLZXljaGFpblByb21pc2UsXG4gICAgICBiaXRnb0tleWNoYWluUHJvbWlzZSxcbiAgICBdKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvLyAjcmVnaW9uIGtleWNoYWluIHV0aWxzXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgcGFydGljaXBhbnRJbmRleDogTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBsZXQgc291cmNlOiBzdHJpbmc7XG4gICAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWR1Y2VkRW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChwYXJ0aWNpcGFudEluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIHNvdXJjZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/ICd1c2VyJyA6ICdiYWNrdXAnO1xuICAgICAgICBhc3NlcnQocHJpdmF0ZU1hdGVyaWFsLCBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLCBgUmVkdWNlZCBwcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgZW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVuY3J5cHRzIHRoZSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlICh3aGljaCBjb250YWlucyB0aGUgcGFydHkncyBwcml2YXRlXG4gICAgICAgIC8vIHNjYWxhciBzX2kpIHdpdGggdGhlIHdhbGxldCBwYXNzcGhyYXNlLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyByZWR1Y2VkRW5jcnlwdGVkUHJ2XG4gICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2YgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICAgICAgLy8gYmV5b25kIHRoZSBzZXJ2ZXItc3RvcmVkIGVuY3J5cHRlZFBydi5cbiAgICAgICAgcmVkdWNlZEVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgLy8gQnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKSBjYW4gbm90IGJlIHVzZWQgaGVyZSBhcyBpdCBkb2VzIG5vdCB3b3JrIG9uIHRoZSBicm93c2VyLlxuICAgICAgICAgIC8vIFRoZSBicm93c2VyIGRlYWxzIHdpdGggYSBCdWZmZXIgYXMgVWludDhBcnJheSwgdGhlcmVmb3JlIGluIHRoZSBicm93c2VyIC50b1N0cmluZygnYmFzZTY0JykganVzdCBjcmVhdGVzIGEgY29tbWEgc2VwZXJhdGVkIHN0cmluZyBvZiB0aGUgYXJyYXkgdmFsdWVzLlxuICAgICAgICAgIGlucHV0OiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPOlxuICAgICAgICBzb3VyY2UgPSAnYml0Z28nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudCBpbmRleCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudEtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2UsXG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBpc01QQ3YyOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVzZXIgb3IgQmFja3VwIE1QQ3YxIFNpZ25pbmdNYXRlcmlhbCB0byBSZXRyb2ZpdERhdGEgbmVlZGVkIGJ5IE1QQ3YyIERLRy5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZEtleXNoYXJlIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgb3IgYmFja3VwIGFzIGEganNvbi5zdHJpbmdpZnkgc3RyaW5nIGFuZCBiaXRnbydzIEJpZyBTaS5cbiAgICogQHBhcmFtIHBhcnR5SWQgLSBUaGUgcGFydHkgSUQgb2YgdGhlIE1QQ3YxIGtleXNoYXJlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0cm9maXQgZGF0YSBuZWVkZWQgdG8gc3RhcnQgYW4gTVBDdjIgREtHIHNlc3Npb24uXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgZ2V0S2V5RGF0YUZvclJldHJvZml0KFxuICAgIGRlY3J5cHRlZEtleXNoYXJlOiBzdHJpbmcsXG4gICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgfCBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgKTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB7XG4gICAgY29uc3QgbXBjID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgeGlMaXN0ID0gW1xuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgxKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMiksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDMpLCAzMikpLFxuICAgIF07XG4gICAgcmV0dXJuIEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IGRlY3J5cHRlZEtleXNoYXJlLFxuICAgICAgbXBjdjFQYXJ0eUluZGV4OiBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAxIDogMixcbiAgICAgIHhpTGlzdCxcbiAgICAgIG1wYyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB1c2VyIGFuZCBiYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIFJldHJvZml0RGF0YSBuZWVkZWQgYnkgTVBDdjIgREtHLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgYW5kIGJhY2t1cCBhcyBhIGpzb24uc3RyaW5naWZ5IHN0cmluZyBhbmQgYml0Z28ncyBCaWcgU2kuXG4gICAqIEByZXR1cm5zIHt7IG1wY3YyVXNlcktleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhOyBtcGN2MkJha2N1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhIH19IC0gdGhlIHJldHJvZml0IGRhdGEgbmVlZGVkIHRvIHN0YXJ0IGFuIE1QQ3YyIERLRyBzZXNzaW9uLlxuICAgKi9cbiAgZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHBhcmFtczogeyBtcGN2MVVzZXJLZXlTaGFyZTogc3RyaW5nOyBtcGN2MUJhY2t1cEtleVNoYXJlOiBzdHJpbmcgfSk6IHtcbiAgICBtcGN2MlVzZXJLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTtcbiAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhO1xuICB9IHtcbiAgICBjb25zdCBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCB4aUxpc3QgPSBbXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDEpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgyKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMyksIDMyKSksXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXBjdjJVc2VyS2V5U2hhcmU6IEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICAgIG1wY3YxUGFydHlLZXlTaGFyZTogcGFyYW1zLm1wY3YxVXNlcktleVNoYXJlLFxuICAgICAgICBtcGN2MVBhcnR5SW5kZXg6IDEsXG4gICAgICAgIHhpTGlzdCxcbiAgICAgICAgbXBjLFxuICAgICAgfSksXG4gICAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBFY2RzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHBhcmFtcy5tcGN2MUJhY2t1cEtleVNoYXJlLFxuICAgICAgICBtcGN2MVBhcnR5SW5kZXg6IDIsXG4gICAgICAgIHhpTGlzdCxcbiAgICAgICAgbXBjLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV0cm9maXQgZGF0YSBmcm9tIE1QQ3YxIGtleSBzaGFyZS5cbiAgICogQHBhcmFtIG1wY3YxUGFydHlLZXlTaGFyZVxuICAgKiBAcGFyYW0gbXBjdjFQYXJ0eUluZGV4XG4gICAqIEBwYXJhbSB4aUxpc3RcbiAgICogQHBhcmFtIG1wY1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KHtcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmUsXG4gICAgbXBjdjFQYXJ0eUluZGV4LFxuICAgIHhpTGlzdCxcbiAgICBtcGMsXG4gIH06IHtcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHN0cmluZztcbiAgICBtcGN2MVBhcnR5SW5kZXg6IG51bWJlcjtcbiAgICB4aUxpc3Q6IG51bWJlcltdW107XG4gICAgbXBjOiBFY2RzYTtcbiAgfSk6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEge1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKG1wY3YxUGFydHlLZXlTaGFyZSk7XG4gICAgbGV0IGtleUNvbWJpbmVkOiBLZXlDb21iaW5lZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKG1wY3YxUGFydHlJbmRleCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsICdCaXRHbyBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgICAgICBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsICdCaXRHbyBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW3NpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLCAnQmFja3VwIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgICAgICAgXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB4U2hhcmU6IGtleUNvbWJpbmVkLnhTaGFyZSxcbiAgICAgIHhpTGlzdDogeGlMaXN0LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZFVzZXJLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEJhY2t1cEtleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQW5kQmFja3VwU2Vzc2lvbihtOiBudW1iZXIsIG46IG51bWJlciwgcmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQpIHtcbiAgICBpZiAocmV0cm9maXQpIHtcbiAgICAgIGNvbnN0IHJldHJvZml0RGF0YSA9IHRoaXMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHtcbiAgICAgICAgbXBjdjFVc2VyS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIG1wY3YxQmFja3VwS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1c2VyU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhLm1wY3YyVXNlcktleVNoYXJlKTtcbiAgICAgIGNvbnN0IGJhY2t1cFNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhLm1wY3YyQmFja3VwS2V5U2hhcmUpO1xuXG4gICAgICByZXR1cm4geyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgY29uc3QgYmFja3VwU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG5cbiAgICByZXR1cm4geyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBjb21tb25LZXljaGFpbik7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICB1c2VyR3BnUHVibGljS2V5OiBzdHJpbmcsXG4gICAgYmFja3VwR3BnUHVibGljS2V5OiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlcyAmIHsgd2FsbGV0SWQ/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgICAgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSxcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICBwYXlsb2FkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgc2Vzc2lvbklkLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgc2Vzc2lvbklkLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4sXG4gICAgdXNlckdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IERrbHNUeXBlcy5BdXRoRW5jTWVzc2FnZXMgJiB7IHdhbGxldElkPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJHcGdQdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhiYWNrdXBHcGdQdWJsaWNLZXkpLCAnQmFja3VwIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3QgdXNlck1zZzEgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzEsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMSA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzEsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjEnXSwge1xuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJNc2cxOiB7IGZyb206IDAsIC4uLnVzZXJNc2cxIH0sXG4gICAgICBiYWNrdXBNc2cxOiB7IGZyb206IDEsIC4uLmJhY2t1cE1zZzEgfSxcbiAgICAgIHdhbGxldElkOiBwYXlsb2FkLndhbGxldElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWNkc2FNUEN2MktleUdlblNlbmRGbjxNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPixcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhzZXNzaW9uSWQpLCAnU2Vzc2lvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cyID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQodXNlck1zZzIuY29tbWl0bWVudCwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJNc2cyLmNvbW1pdG1lbnQpLCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzIuY29tbWl0bWVudCwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwTXNnMi5jb21taXRtZW50KSwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG5cbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogdXNlck1zZzIucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IHVzZXJNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICB1c2VyQ29tbWl0bWVudDI6IHVzZXJNc2cyLmNvbW1pdG1lbnQsXG4gICAgICBiYWNrdXBNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgICB0bzogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICAgc2lnbmF0dXJlOiBiYWNrdXBNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiYWNrdXBNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICBiYWNrdXBDb21taXRtZW50MjogYmFja3VwTXNnMi5jb21taXRtZW50LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDNCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWNkc2FNUEN2MktleUdlblNlbmRGbjxNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlPixcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhzZXNzaW9uSWQpLCAnU2Vzc2lvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2czID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiYWNrdXBNc2czID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzMsICdCYWNrdXAgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCB1c2VyTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnNCwgJ1VzZXIgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiYWNrdXBNc2c0ID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQoYmFja3VwTXNnNCwgJ0JhY2t1cCBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuXG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMyddLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMzogeyBmcm9tOiAwLCB0bzogMiwgLi4udXNlck1zZzMgfSxcbiAgICAgIGJhY2t1cE1zZzM6IHsgZnJvbTogMSwgdG86IDIsIC4uLmJhY2t1cE1zZzMgfSxcbiAgICAgIHVzZXJNc2c0OiB7IGZyb206IDAsIC4uLnVzZXJNc2c0IH0sXG4gICAgICBiYWNrdXBNc2c0OiB7IGZyb206IDEsIC4uLmJhY2t1cE1zZzQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHNpZ24gdHggcmVxdWVzdFxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1wY3YyUGFydHlJZCAtIHBhcnR5IGlkIGZvciB0aGUgc2lnbmVyIGludm9sdmVkIGluIHRoaXMgbXBjdjIgcmVxdWVzdCAoZWl0aGVyIDAgZm9yIHVzZXIgb3IgMSBmb3IgYmFja3VwKVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cblxuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUsIHBhcmFtcy5yZXFJZCwgdHhSZXF1ZXN0LmVudGVycHJpc2VJZCk7XG5cbiAgICBpZiAoIWJpdGdvR3BnUHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVR4UGFyYW1zID0gcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwgcGFyYW1zLnR4UGFyYW1zKTtcblxuICAgICAgLy8gRm9yIElDUCB0cmFuc2FjdGlvbnMsIHRoZSBIU00gc2lnbnMgdGhlIHNlcmlhbGl6ZWRUeEhleCwgd2hpbGUgdGhlIHVzZXIgc2lnbnMgdGhlIHNpZ25hYmxlSGV4IHNlcGFyYXRlbHkuXG4gICAgICAvLyBWZXJpZmljYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBkaXJlY3RseSBvbiB0aGUgc2lnbmFibGVIZXggYWxvbmUuIEhvd2V2ZXIsIHdlIGNhbiBwYXJzZSB0aGUgc2VyaWFsaXplZFR4SGV4XG4gICAgICAvLyB0byByZWdlbmVyYXRlIHRoZSBzaWduYWJsZUhleCBhbmQgY29tcGFyZSBpdCBhZ2FpbnN0IHRoZSBwcm92aWRlZCB2YWx1ZSBmb3IgdmVyaWZpY2F0aW9uLlxuICAgICAgLy8gSW4gY29udHJhc3QsIGZvciBvdGhlciBjb2luIGZhbWlsaWVzLCB2ZXJpZmljYXRpb24gaXMgdHlwaWNhbGx5IGRvbmUgdXNpbmcganVzdCB0aGUgc2lnbmFibGVIZXguXG4gICAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mYW1pbHkgPT09ICdpY3AnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LCB0eEluZm86IHVuc2lnbmVkVHguc2lnbmFibGVIZXggfSxcbiAgICAgICAgICB0eFBhcmFtczogZWZmZWN0aXZlVHhQYXJhbXMsXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IGVmZmVjdGl2ZVR4UGFyYW1zLFxuICAgICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB0eFJlcXVlc3QubWVzc2FnZXMhWzBdLm1lc3NhZ2VFbmNvZGVkO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB0eFJlcXVlc3QubWVzc2FnZXMhWzBdLmRlcml2YXRpb25QYXRoIHx8ICdtLzAnO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUnKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzaDogSGFzaDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gY3JlYXRlS2VjY2FrSGFzaCgna2VjY2FrMjU2JykgYXMgSGFzaDtcbiAgICB9XG4gICAgLy8gY2hlY2sgd2hhdCB0aGUgZW5jb2RpbmcgaXMgc3VwcG9zZWQgdG8gYmUgZm9yIG1lc3NhZ2VcbiAgICBjb25zdCBoYXNoQnVmZmVyID0gaGFzaC51cGRhdGUoYnVmZmVyQ29udGVudCkuZGlnZXN0KCk7XG4gICAgY29uc3Qgb3RoZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2coXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkICE9PSB1bmRlZmluZWQgPyBwYXJhbXMubXBjdjJQYXJ0eUlkIDogMCxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgaGFzaEJ1ZmZlclxuICAgICk7XG4gICAgY29uc3QgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEgPSBhd2FpdCBvdGhlclNpZ25lci5pbml0KCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKFxuICAgICAgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG5cbiAgICBsZXQgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgbGV0IGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMjogYW55O1xuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMiA9IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyID0gbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IEpTT04ucGFyc2UoXG4gICAgICBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDJbYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMUFuZDIgPSBhd2FpdCB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lKFxuICAgICAgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG5cbiAgICAvKiogUm91bmQgMiAqKi9cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMik7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IGRlc2VyaWFsaXplZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMgPSBvdGhlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDIsXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXNbdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIC8qKiBSb3VuZCAzICoqL1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUoXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0LFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG4gICAgLy8gU3VibWl0IGZvciBmaW5hbCBzaWduYXR1cmUgc2hhcmUgY29tYmluZVxuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWVdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0LndhbGxldElkLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZm9ybWF0dGluZyB1dGlsc1xuICBmb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYnJvYWRjYXN0TWVzc2FnZTogTVBDdjJCcm9hZGNhc3RNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGJyb2FkY2FzdE1lc3NhZ2UuZnJvbSxcbiAgICAgIHBheWxvYWQ6IHsgbWVzc2FnZTogYnJvYWRjYXN0TWVzc2FnZS5tZXNzYWdlLCBzaWduYXR1cmU6IGJyb2FkY2FzdE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdFAyUE1lc3NhZ2UocDJwTWVzc2FnZTogTVBDdjJQMlBNZXNzYWdlLCBjb21taXRtZW50Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBheWxvYWQ6IHsgZW5jcnlwdGVkTWVzc2FnZTogcDJwTWVzc2FnZS5lbmNyeXB0ZWRNZXNzYWdlLCBzaWduYXR1cmU6IHAycE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgICBmcm9tOiBwMnBNZXNzYWdlLmZyb20sXG4gICAgICB0bzogcDJwTWVzc2FnZS50byxcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBwcml2YXRlIHV0aWxzXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhhc2ggc3RyaW5nIGFuZCBkZXJpdmF0aW9uIHBhdGggZnJvbSB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtUeFJlcXVlc3R9IHR4UmVxdWVzdCAtIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge1JlcXVlc3RUeXBlfSByZXF1ZXN0VHlwZSAtIHRoZSByZXF1ZXN0IHR5cGVcbiAgICogQHJldHVybnMge3sgaGFzaEJ1ZmZlcjogQnVmZmVyOyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIH19IC0gdGhlIGhhc2ggc3RyaW5nIGFuZCBkZXJpdmF0aW9uIHBhdGhcbiAgICovXG4gIHByaXZhdGUgZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKFxuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IHsgaGFzaEJ1ZmZlcjogQnVmZmVyOyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIH0ge1xuICAgIGxldCB0eFRvU2lnbjogc3RyaW5nO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHR4UmVxdWVzdC50cmFuc2FjdGlvbnMubGVuZ3RoID09PSAxLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgdHhUb1NpZ24gPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2lnbmFibGVIZXg7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICAvLyBUT0RPKFdQLTIxNzYpOiBBZGQgc3VwcG9ydCBmb3IgbWVzc2FnZSBzaWduaW5nXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01QQ3YyIG1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlcXVlc3QgdHlwZSwgZ290OiAnICsgcmVxdWVzdFR5cGUpO1xuICAgIH1cblxuICAgIGxldCBoYXNoOiBIYXNoO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKSBhcyBIYXNoO1xuICAgIH1cbiAgICBjb25zdCBoYXNoQnVmZmVyID0gaGFzaC51cGRhdGUoQnVmZmVyLmZyb20odHhUb1NpZ24sICdoZXgnKSkuZGlnZXN0KCk7XG5cbiAgICByZXR1cm4geyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEJpdEdvIGFuZCB1c2VyIEdQRyBrZXlzIGZyb20gdGhlIEJpdEdvIHB1YmxpYyBHUEcga2V5IGFuZCB0aGUgZW5jcnlwdGVkIHVzZXIgR1BHIHByaXZhdGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYml0Z29QdWJsaWNHcGdLZXkgIC0gdGhlIEJpdEdvIHB1YmxpYyBHUEcga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ICAtIHRoZSBlbmNyeXB0ZWQgdXNlciBHUEcgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdhbGxldFBhc3NwaHJhc2UgIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGF0YSAtIHRoZSBhZGRpdGlvbmFsIGRhdGEgdG8gdmFsaWRhdGUgdGhlIEdQRyBrZXlzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHsgYml0Z29HcGdLZXk6IHBncC5LZXk7IHVzZXJHcGdLZXk6IHBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+IH0+fSAtIHRoZSBCaXRHbyBhbmQgdXNlciBHUEcga2V5c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmcsXG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nLFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBhZGF0YTogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIGJpdGdvR3BnS2V5OiBwZ3AuS2V5O1xuICAgIHVzZXJHcGdLZXk6IHBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+O1xuICB9PiB7XG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljR3BnS2V5IH0pO1xuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgRWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWSk7XG4gICAgY29uc3QgdXNlckRlY3J5cHRlZEtleSA9IGF3YWl0IHBncC5yZWFkS2V5KHtcbiAgICAgIGFybW9yZWRLZXk6IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyR3BnS2V5OiBwZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPiA9IHtcbiAgICAgIHByaXZhdGVLZXk6IHVzZXJEZWNyeXB0ZWRLZXkuYXJtb3IoKSxcbiAgICAgIHB1YmxpY0tleTogdXNlckRlY3J5cHRlZEtleS50b1B1YmxpYygpLmFybW9yKCksXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29HcGdLZXksXG4gICAgICB1c2VyR3BnS2V5LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBhZGF0YSBhbmQgY3lwaGVydGV4dC5cbiAgICogQHBhcmFtIGFkYXRhIHN0cmluZ1xuICAgKiBAcGFyYW0gY3lwaGVydGV4dCBzdHJpbmdcbiAgICogQHJldHVybnMgdm9pZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGFkYXRhIG9yIGN5cGhlcnRleHQgaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFkYXRhKGFkYXRhOiBzdHJpbmcsIGN5cGhlcnRleHQ6IHN0cmluZywgcm91bmREb21haW5TZXBhcmF0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBjeXBoZXJKc29uO1xuICAgIHRyeSB7XG4gICAgICBjeXBoZXJKc29uID0gSlNPTi5wYXJzZShjeXBoZXJ0ZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBjeXBoZXJ0ZXh0IHRvIEpTT04sIGdvdDogJyArIGN5cGhlcnRleHQpO1xuICAgIH1cbiAgICAvLyB1c2luZyBkZWNvZGVVUklDb21wb25lbnQgdG8gaGFuZGxlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgIGlmIChcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudChjeXBoZXJKc29uLmFkYXRhKSAhPT0gZGVjb2RlVVJJQ29tcG9uZW50KGAke3JvdW5kRG9tYWluU2VwYXJhdG9yfToke2FkYXRhfWApICYmXG4gICAgICBkZWNvZGVVUklDb21wb25lbnQoY3lwaGVySnNvbi5hZGF0YSkgIT09IGRlY29kZVVSSUNvbXBvbmVudChhZGF0YSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWRhdGEgZG9lcyBub3QgbWF0Y2ggY3lwaGVydGV4dCBhZGF0YScpO1xuICAgIH1cbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGV4dGVybmFsIHNpZ25lclxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgc2lnbkVjZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUgPSBSZXF1ZXN0VHlwZS50eFxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCByZXFJZCB9ID0gcGFyYW1zO1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuXG4gICAgLy8gVE9ETyhXUC0yMTc2KTogQWRkIHN1cHBvcnQgZm9yIG1lc3NhZ2Ugc2lnbmluZ1xuICAgIGFzc2VydChcbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICdPbmx5IHRyYW5zYWN0aW9uIHNpZ25pbmcgaXMgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIsIGdvdDogJyArIHJlcXVlc3RUeXBlXG4gICAgKTtcblxuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LCByZXFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gdHhSZXF1ZXN0O1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKFxuICAgICAgdHJ1ZSxcbiAgICAgIHBhcmFtcy5yZXFJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZFxuICAgICk7XG5cbiAgICBpZiAoIWJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcbiAgICB9XG5cbiAgICAvLyByb3VuZCAxXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9ID1cbiAgICAgIGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RSZXNvbHZlZCB9KTtcbiAgICBjb25zdCByb3VuZDFUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICAvLyByb3VuZCAyXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDFUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMlR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDJdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzLFxuICAgICAgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCdcbiAgICApO1xuXG4gICAgLy8gcm91bmQgM1xuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQyVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCwgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCByZXFJZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQxU2hhcmUocGFyYW1zOiB7IHR4UmVxdWVzdDogVHhSZXF1ZXN0OyBwcnY6IHN0cmluZzsgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0KTtcbiAgICBjb25zdCBhZGF0YSA9IGAke2hhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcblxuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgY29uc3QgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEgPSBhd2FpdCB1c2VyU2lnbmVyLmluaXQoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlclNpZ25lckJyb2FkY2FzdE1zZzEsIHVzZXJHcGdLZXkpO1xuICAgIGNvbnN0IHNlc3Npb24gPSB1c2VyU2lnbmVyLmdldFNlc3Npb24oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURX06JHthZGF0YX1gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlckdwZ1B1YktleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQyU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIGNvbnN0IHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtoYXNoQnVmZmVyLnRvU3RyaW5nKCdoZXgnKX06JHtkZXJpdmF0aW9uUGF0aH1gO1xuICAgIGNvbnN0IHsgYml0Z29HcGdLZXksIHVzZXJHcGdLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YVxuICAgICk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5bMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMSB0eFJlcXVlc3QnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBKU09OLnBhcnNlKFxuICAgICAgc2lnbmF0dXJlU2hhcmVzW3NpZ25hdHVyZVNoYXJlcy5sZW5ndGggLSAxXS5zaGFyZVxuICAgICkgYXMgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dDtcbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDEgPSBhd2FpdCB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lKFxuICAgICAgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnS2V5XG4gICAgKTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgRWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURSk7XG4gICAgY29uc3Qgcm91bmQxU2Vzc2lvbiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgYXdhaXQgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDIgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMixcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IHNlc3Npb24gPSB1c2VyU2lnbmVyLmdldFNlc3Npb24oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMl9TVEFURX06JHthZGF0YX1gLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyLFxuICAgICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kM1NoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMzogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIGFzc2VydCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHR4UmVxdWVzdC50cmFuc2FjdGlvbnMubGVuZ3RoID09PSAxLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtoYXNoQnVmZmVyLnRvU3RyaW5nKCdoZXgnKX06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhXG4gICAgKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/LlswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICBzaWduYXR1cmVTaGFyZXNbc2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgRWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMl9TVEFURSk7XG4gICAgY29uc3Qgcm91bmQyU2Vzc2lvbiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgYXdhaXQgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMlNlc3Npb24pO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQsIHVzZXJHcGdLZXksIGJpdGdvR3BnS2V5KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4ga2V5IHNoYXJlLCB3aGVuIGRlY3J5cHRlZCwgY29udGFpbnMgdmFsaWQgR0cxOCBzaWduaW5nIG1hdGVyaWFsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlTaGFyZSAtIFRoZSBlbmNyeXB0ZWQga2V5IHNoYXJlIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHVzZWQgdG8gZGVjcnlwdCB0aGUga2V5IHNoYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGVjcnlwdGVkIGRhdGEgY29udGFpbnMgdmFsaWQgc2lnbmluZyBtYXRlcmlhbCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dHMThTaWduaW5nTWF0ZXJpYWwoa2V5U2hhcmU6IHN0cmluZywgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBydiA9IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBrZXlTaGFyZSk7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIHJldHVybiAoXG4gICAgICBzaWduaW5nTWF0ZXJpYWwucFNoYXJlICYmXG4gICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUgJiZcbiAgICAgIChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSB8fCBzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqIEBwYXJhbSBlbmNyeXB0ZWRVc2VyS2V5IGVuY3J5cHRlZCBnZzE4IG9yIE1QQ3YyIHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkQmFja3VwS2V5IGVuY3J5cHRlZCBnZzE4IG9yIE1QQ3YyIGJhY2t1cCBrZXlcbiAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIHBhc3N3b3JkIGZvciB1c2VyIGFuZCBiYWNrdXAga2V5XG4gKiBAcmV0dXJucyBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlcyhcbiAgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuKTogUHJvbWlzZTx7XG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyO1xuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyO1xuICBjb21tb25LZXlDaGFpbjogc3RyaW5nO1xufT4ge1xuICBpZiAoaXNHRzE4U2lnbmluZ01hdGVyaWFsKGVuY3J5cHRlZFVzZXJLZXksIHdhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tR0cxOChlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UpO1xuICB9XG4gIHJldHVybiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoZW5jcnlwdGVkVXNlcktleSwgZW5jcnlwdGVkQmFja3VwS2V5LCB3YWxsZXRQYXNzcGhyYXNlKTtcbn1cblxuLyoqXG4gKiBTaWducyBhIG1lc3NhZ2UgaGFzaCB1c2luZyBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZUhhc2hcbiAqIEBwYXJhbSB7QnVmZmVyfSB1c2VyS2V5U2hhcmVcbiAqIEBwYXJhbSB7QnVmZmVyfSBiYWNrdXBLZXlTaGFyZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1vbktleUNoYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IHJlY2lkOiBudW1iZXIsIHI6IHN0cmluZywgczogc3RyaW5nLCB5OiBzdHJpbmcgfT59XG4gKlxuICogQGFzeW5jXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUmVjb3ZlcnlNcGNWMihcbiAgbWVzc2FnZUhhc2g6IEJ1ZmZlcixcbiAgdXNlcktleVNoYXJlOiBCdWZmZXIsXG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIsXG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmdcbik6IFByb21pc2U8e1xuICByZWNpZDogbnVtYmVyO1xuICByOiBzdHJpbmc7XG4gIHM6IHN0cmluZztcbiAgeTogc3RyaW5nO1xufT4ge1xuICBjb25zdCB1c2VyRHNnID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgJ20vMCcsIG1lc3NhZ2VIYXNoKTtcbiAgY29uc3QgYmFja3VwRHNnID0gbmV3IERrbHNEc2cuRHNnKGJhY2t1cEtleVNoYXJlLCAxLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuXG4gIGNvbnN0IHNpZ25hdHVyZVN0cmluZyA9IERrbHNVdGlscy52ZXJpZnlBbmRDb252ZXJ0RGtsc1NpZ25hdHVyZShcbiAgICBtZXNzYWdlSGFzaCxcbiAgICAoYXdhaXQgRGtsc1V0aWxzLmV4ZWN1dGVUaWxsUm91bmQoNSwgdXNlckRzZywgYmFja3VwRHNnKSkgYXMgRGtsc1R5cGVzLkRlc2VyaWFsaXplZERrbHNTaWduYXR1cmUsXG4gICAgY29tbW9uS2V5Q2hhaW4sXG4gICAgJ20vMCcsXG4gICAgdW5kZWZpbmVkLFxuICAgIGZhbHNlXG4gICk7XG4gIGNvbnN0IHNpZ1BhcnRzID0gc2lnbmF0dXJlU3RyaW5nLnNwbGl0KCc6Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICByZWNpZDogcGFyc2VJbnQoc2lnUGFydHNbMF0sIDEwKSxcbiAgICByOiBzaWdQYXJ0c1sxXSxcbiAgICBzOiBzaWdQYXJ0c1syXSxcbiAgICB5OiBzaWdQYXJ0c1szXSxcbiAgfTtcbn1cblxuLy8gI3JlZ2lvbiBwcml2YXRlIHV0aWxzXG5cbi8qKlxuICogR2V0IHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqIEBwYXJhbSBlbmNyeXB0ZWRHRzE4VXNlcktleSBlbmNyeXB0ZWQgZ2cxOCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThCYWNrdXBLZXkgZW5jcnlwdGVkIGdnMTggYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3dvcmQgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlcbiAqIEByZXR1cm5zIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tR0cxOChcbiAgZW5jcnlwdGVkR0cxOFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkR0cxOEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4pOiBQcm9taXNlPHtcbiAgdXNlcktleVNoYXJlOiBCdWZmZXI7XG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXI7XG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IFt1c2VyS2V5Q29tYmluZWQsIGJhY2t1cEtleUNvbWJpbmVkXSA9IGdldEtleUNvbWJpbmVkRnJvbVRzc0tleVNoYXJlcyhcbiAgICBlbmNyeXB0ZWRHRzE4VXNlcktleSxcbiAgICBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5LFxuICAgIHdhbGxldFBhc3NwaHJhc2VcbiAgKTtcbiAgY29uc3QgcmV0cm9maXREYXRhQTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9IHtcbiAgICB4U2hhcmU6IHVzZXJLZXlDb21iaW5lZC54U2hhcmUsXG4gIH07XG4gIGNvbnN0IHJldHJvZml0RGF0YUI6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiBiYWNrdXBLZXlDb21iaW5lZC54U2hhcmUsXG4gIH07XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXBdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlMm9mMktleVNoYXJlcyhyZXRyb2ZpdERhdGFBLCByZXRyb2ZpdERhdGFCKTtcblxuICBjb25zdCB1c2VyS2V5U2hhcmUgPSB1c2VyLmdldEtleVNoYXJlKCk7XG4gIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYmFja3VwLmdldEtleVNoYXJlKCk7XG4gIHJldHVybiB7XG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGNvbW1vbktleUNoYWluOiBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYmFja3VwS2V5U2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgTVBDIHYyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSB0aGUgcHJvdmlkZWQgdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZE1QQ3YyVXNlcktleVxuICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZE1QQ3YyQmFja3VwS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gW3dhbGxldFBhc3NwaHJhc2VdIC0gVGhlIHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXkgc2hhcmVzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW46IHN0cmluZyB9Pn1cbiAqXG4gKiBAYXN5bmNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5KFxuICBlbmNyeXB0ZWRNUEN2MlVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkTVBDdjJCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuKTogUHJvbWlzZTx7XG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyO1xuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyO1xuICBjb21tb25LZXlDaGFpbjogc3RyaW5nO1xufT4ge1xuICBjb25zdCB1c2VyQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRNUEN2MlVzZXJLZXkpLCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGJha2N1cENvbXByZXNzZWRQcnYgPSBCdWZmZXIuZnJvbShzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkTVBDdjJCYWNrdXBLZXkpLCAnYmFzZTY0Jyk7XG5cbiAgY29uc3QgdXNlclBydkpTT046IERrbHNUeXBlcy5SZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZSh1c2VyQ29tcHJlc3NlZFBydik7XG4gIGNvbnN0IGJhY2t1cFBydkpTT046IERrbHNUeXBlcy5SZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShiYWtjdXBDb21wcmVzc2VkUHJ2KTtcbiAgY29uc3QgdXNlcktleVJldHJvZml0OiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZToge1xuICAgICAgeDogQnVmZmVyLmZyb20odXNlclBydkpTT04ucHJ2KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBCdWZmZXIuZnJvbSh1c2VyUHJ2SlNPTi5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20odXNlclBydkpTT04ucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH0sXG4gICAgeGlMaXN0OiB1c2VyUHJ2SlNPTi54TGlzdC5zbGljZSgwLCAyKSxcbiAgfTtcbiAgY29uc3QgYmFja3VwS2V5UmV0cm9maXQ6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiB7XG4gICAgICB4OiBCdWZmZXIuZnJvbShiYWNrdXBQcnZKU09OLnBydikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeTogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4JyksXG4gICAgfSxcbiAgICB4aUxpc3Q6IGJhY2t1cFBydkpTT04ueExpc3Quc2xpY2UoMCwgMiksXG4gIH07XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXBdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlMm9mMktleVNoYXJlcyh1c2VyS2V5UmV0cm9maXQsIGJhY2t1cEtleVJldHJvZml0KTtcbiAgY29uc3QgdXNlcktleVNoYXJlID0gdXNlci5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IGJhY2t1cC5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBjb21tb25LZXlDaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyS2V5U2hhcmUpO1xuICByZXR1cm4geyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbWJpbmVkIGtleSBmb3IgR0cxOFxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThVc2VyS2V5IGVuY3J5cHRlZCBHRzE4IHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkR0cxOEJhY2t1cEtleSBlbmNyeXB0ZWQgR0cxOCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSB3YWxsZXQgcGFzc3BocmFzZVxuICogQHJldHVybnMga2V5IHNoYXJlc1xuICovXG5mdW5jdGlvbiBnZXRLZXlDb21iaW5lZEZyb21Uc3NLZXlTaGFyZXMoXG4gIGVuY3J5cHRlZEdHMThVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZEdHMThCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuKTogW0VDRFNBTWV0aG9kVHlwZXMuS2V5Q29tYmluZWQsIEVDRFNBTWV0aG9kVHlwZXMuS2V5Q29tYmluZWRdIHtcbiAgbGV0IGJhY2t1cFBydjtcbiAgbGV0IHVzZXJQcnY7XG4gIHRyeSB7XG4gICAgYmFja3VwUHJ2ID0gc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZEdHMThCYWNrdXBLZXkpO1xuICAgIHVzZXJQcnYgPSBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkR0cxOFVzZXJLZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZSh1c2VyUHJ2KSBhcyBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbDtcbiAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsO1xuXG4gIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXkgLSBtaXNzaW5nIGJhY2t1cE5TaGFyZScpO1xuICB9XG5cbiAgaWYgKCFiYWNrdXBTaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYWNrdXAga2V5IC0gbWlzc2luZyB1c2VyTlNoYXJlJyk7XG4gIH1cblxuICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcblxuICBjb25zdCB1c2VyS2V5Q29tYmluZWQgPSBNUEMua2V5Q29tYmluZSh1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsXG4gICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gIF0pO1xuICBjb25zdCBiYWNrdXBLZXlDb21iaW5lZCA9IE1QQy5rZXlDb21iaW5lKGJhY2t1cFNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICBiYWNrdXBTaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSxcbiAgICBiYWNrdXBTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsXG4gIF0pO1xuICBpZiAoXG4gICAgdXNlcktleUNvbWJpbmVkLnhTaGFyZS55ICE9PSBiYWNrdXBLZXlDb21iaW5lZC54U2hhcmUueSB8fFxuICAgIHVzZXJLZXlDb21iaW5lZC54U2hhcmUuY2hhaW5jb2RlICE9PSBiYWNrdXBLZXlDb21iaW5lZC54U2hhcmUuY2hhaW5jb2RlXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcbiAgfVxuICByZXR1cm4gW3VzZXJLZXlDb21iaW5lZCwgYmFja3VwS2V5Q29tYmluZWRdO1xufVxuXG4vLyAjZW5kcmVnaW9uXG4iXX0=
|
|
971
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4d0NBLHNEQVlDO0FBU0QsOERBYUM7QUFhRCw4Q0E4QkM7QUEzMUNELG9EQUF5RztBQUN6RyxrREFBb0M7QUFDcEMsb0RBQTRCO0FBQzVCLG1DQUFnQztBQUVoQyw2Q0FBNkM7QUFDN0Msb0RBQXNDO0FBQ3RDLDZDQUErQjtBQUUvQixzREFVNkI7QUFFN0IseURBQWdEO0FBR2hELHNDQUE4RDtBQUM5RCxnREFBMEU7QUFDMUUsNkNBQWdEO0FBQ2hELDhEQU11QztBQUV2QyxxREFBd0Q7QUFDeEQsNENBV3NCO0FBQ3RCLGlDQUF3QztBQUN4QyxxRUFBNkY7QUFDN0YsNERBQThGO0FBRTlGLE1BQWEsZUFBZ0IsU0FBUSxxQkFBYztJQUtqRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUtyQjtRQUNDLE1BQU0sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0Qsa0VBQWtFO1FBQ2xFLG9FQUFvRTtRQUNwRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRyxNQUFNLFFBQVEsR0FBRyxjQUFjLElB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QUksbUJBQUssRUFBRSxDQUFDO0lBRXhCLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFO1FBQ2pFLG1CQUFtQixDQUFDLFdBQVc7UUFDL0IsbUJBQW1CLENBQUMsWUFBWTtLQUNqQyxDQUFDLENBQUM7SUFDSCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFO1FBQ3JFLHFCQUFxQixDQUFDLFVBQVU7UUFDaEMscUJBQXFCLENBQUMsV0FBVztLQUNsQyxDQUFDLENBQUM7SUFDSCxJQUNFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQ3ZFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJpZ0ludFRvQnVmZmVyQkUsIERrbHNDb21tcywgRGtsc0RrZywgRGtsc0RzZywgRGtsc1R5cGVzLCBEa2xzVXRpbHMgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28vc2pjbCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCBjcmVhdGVLZWNjYWtIYXNoIGZyb20gJ2tlY2Nhayc7XG5pbXBvcnQgKiBhcyBwZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHtcbiAgTVBDdjJCcm9hZGNhc3RNZXNzYWdlLFxuICBNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlLFxuICBNUEN2MktleUdlblN0YXRlRW51bSxcbiAgTVBDdjJQMlBNZXNzYWdlLFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuaW1wb3J0IHsgRWNkc2EgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYic7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4vaUtleWNoYWlucyc7XG5pbXBvcnQgeyBFQ0RTQU1ldGhvZFR5cGVzLCBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHsgc2VuZFNpZ25hdHVyZVNoYXJlVjIsIHNlbmRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MvY29tbW9uJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuL3R5cGVzTVBDdjInO1xuaW1wb3J0IHtcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvLFxuICB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lLFxuICB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kVHdvLFxufSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvZWNkc2FNUEN2Mic7XG5pbXBvcnQgeyBLZXlDb21iaW5lZCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdQR0tleVBhaXIgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHtcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgUmVxdWVzdFR5cGUsXG4gIFNpZ25hdHVyZVNoYXJlUmVjb3JkLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBCYXNlRWNkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBFY2RzYU1QQ3YyS2V5R2VuU2VuZEZuLCBLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlIH0gZnJvbSAnLi9lY2RzYU1QQ3YyS2V5R2VuU2VuZGVyJztcbmltcG9ydCB7IGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcsIGlzQml0Z29NcGNQdWJLZXkgfSBmcm9tICcuLi8uLi8uLi90c3MvYml0Z29QdWJLZXlzJztcblxuZXhwb3J0IGNsYXNzIEVjZHNhTVBDdjJVdGlscyBleHRlbmRzIEJhc2VFY2RzYVV0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZID0gJ0RLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURSA9ICdES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBES0xTMjNfU0lHTklOR19ST1VORDJfU1RBVEUgPSAnREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFJztcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAgIHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgeyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9ID0gdGhpcy5nZXRVc2VyQW5kQmFja3VwU2Vzc2lvbigyLCAzLCBwYXJhbXMucmV0cm9maXQpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBtcGN2MktleSA9IG1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQobXBjdjJLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBtcGN2MktleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIC8vIEVuc3VyZSB0aGUgcHVibGljIGtleSBpcyBvbmUgb2YgdGhlIGV4cGVjdGVkIEJpdEdvIHB1YmxpYyBrZXlzIHdoZW4gaW4gdGVzdCBvciBwcm9kLlxuICAgICAgYXNzZXJ0KGlzQml0Z29NcGNQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXksICdtcGN2MicpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGdwZ0tleTogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGdwZ0tleTogYmFja3VwR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGNvbnN0IHVzZXJSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCB1c2VyU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgYmFja3VwU2Vzc2lvbi5pbml0RGtnKCk7XG5cbiAgICBjb25zdCByb3VuZDFTZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxQnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxLCBiaXRnb1RvQmFja3VwTXNnMiwgYml0Z29Ub1VzZXJNc2cyIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBwYXJhbXMucmV0cm9maXQ/LndhbGxldElkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4ucm91bmQxTWVzc2FnZXMsXG4gICAgICAgICAgICB3YWxsZXRJZDogcGFyYW1zLnJldHJvZml0LndhbGxldElkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiByb3VuZDFNZXNzYWdlc1xuICAgICk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnMSldIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJQMlBNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnKSwgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdGdvTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CaXRnb01zZzIsICdVc2VyIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKHVzZXJUb0JpdGdvTXNnMik7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIERrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpXSxcbiAgICB9KTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoYmFja3VwUm91bmQyUDJQTWVzc2FnZXMpLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyLCAnQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiwgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBiaXRnb0NvbW1pdG1lbnQyLFxuICAgICAgYml0Z29Ub1VzZXJNc2czLFxuICAgICAgYml0Z29Ub0JhY2t1cE1zZzMsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHNlc3Npb25JZCwgcm91bmQyTWVzc2FnZXMpO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgM1xuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIDIgU2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kMk1zZ3MucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQyTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW2JhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMiwgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2cyID0gYmFja3VwUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzIsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kM01lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW2JpdGdvVG9Vc2VyUm91bmQyTXNnLCBiYWNrdXBUb1VzZXJNc2cyXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CYWNrdXBNc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CYWNrdXBNc2czLCAnVXNlciB0byBCYWNrdXAgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCB1c2VyVG9CaXRnb01zZzMgPSB1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Nc2czLCAnVXNlciB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZSh1c2VyVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQzTWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvQmFja3VwUm91bmQyTXNnLCB1c2VyVG9CYWNrdXBNc2cyXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck1zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwVG9Vc2VyTXNnMywgJ0JhY2t1cCB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwVG9CaXRnb01zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvQml0Z29Nc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UoYmFja3VwVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2csICdCaXRHbyB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub1VzZXJSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kNE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW2JhY2t1cFRvVXNlck1zZzMsIGJpdGdvVG9Vc2VyUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cgPSB1c2VyUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGFzc2VydCh1c2VyUm91bmQ0QnJvYWRjYXN0TXNnLCAnVXNlciBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UodXNlclJvdW5kNEJyb2FkY2FzdE1zZyk7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDRNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW3VzZXJUb0JhY2t1cE1zZzMsIGJpdGdvVG9CYWNrdXBSb3VuZDNNc2ddLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZyA9IGJhY2t1cFJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZywgJ0JhY2t1cCBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3Qgcm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAge1xuICAgICAgICBwMnBNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMsIHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnM10sXG4gICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJSb3VuZDRCcm9hZGNhc3RNc2csIHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgICAgfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMyxcbiAgICAgIGJpdGdvTXNnNCxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKHBhcmFtcy5lbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kM01lc3NhZ2VzKTtcblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDMsICdSb3VuZCAxIGFuZCAzIFNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhcbiAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2c0KV0gfSxcbiAgICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApLmJyb2FkY2FzdE1lc3NhZ2VzO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDRCcm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuXG4gICAgYXNzZXJ0KGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgdXNlclJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSB1c2VyU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyUHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBQcml2YXRlTWF0ZXJpYWwpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIHVzZXJDb21tb25LZXljaGFpbiwgJ1VzZXIgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIGJhY2t1cENvbW1vbktleWNoYWluLCAnQmFja3VwIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCYWNrdXBLZXljaGFpbihcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbihiaXRnb0NvbW1vbktleWNoYWluKTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHVzZXJLZXljaGFpblByb21pc2UsXG4gICAgICBiYWNrdXBLZXljaGFpblByb21pc2UsXG4gICAgICBiaXRnb0tleWNoYWluUHJvbWlzZSxcbiAgICBdKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvLyAjcmVnaW9uIGtleWNoYWluIHV0aWxzXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgcGFydGljaXBhbnRJbmRleDogTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBsZXQgc291cmNlOiBzdHJpbmc7XG4gICAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWR1Y2VkRW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChwYXJ0aWNpcGFudEluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIHNvdXJjZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/ICd1c2VyJyA6ICdiYWNrdXAnO1xuICAgICAgICBhc3NlcnQocHJpdmF0ZU1hdGVyaWFsLCBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLCBgUmVkdWNlZCBwcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgZW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVuY3J5cHRzIHRoZSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlICh3aGljaCBjb250YWlucyB0aGUgcGFydHkncyBwcml2YXRlXG4gICAgICAgIC8vIHNjYWxhciBzX2kpIHdpdGggdGhlIHdhbGxldCBwYXNzcGhyYXNlLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyByZWR1Y2VkRW5jcnlwdGVkUHJ2XG4gICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2YgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICAgICAgLy8gYmV5b25kIHRoZSBzZXJ2ZXItc3RvcmVkIGVuY3J5cHRlZFBydi5cbiAgICAgICAgcmVkdWNlZEVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgLy8gQnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKSBjYW4gbm90IGJlIHVzZWQgaGVyZSBhcyBpdCBkb2VzIG5vdCB3b3JrIG9uIHRoZSBicm93c2VyLlxuICAgICAgICAgIC8vIFRoZSBicm93c2VyIGRlYWxzIHdpdGggYSBCdWZmZXIgYXMgVWludDhBcnJheSwgdGhlcmVmb3JlIGluIHRoZSBicm93c2VyIC50b1N0cmluZygnYmFzZTY0JykganVzdCBjcmVhdGVzIGEgY29tbWEgc2VwZXJhdGVkIHN0cmluZyBvZiB0aGUgYXJyYXkgdmFsdWVzLlxuICAgICAgICAgIGlucHV0OiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPOlxuICAgICAgICBzb3VyY2UgPSAnYml0Z28nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudCBpbmRleCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudEtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2UsXG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBpc01QQ3YyOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVzZXIgb3IgQmFja3VwIE1QQ3YxIFNpZ25pbmdNYXRlcmlhbCB0byBSZXRyb2ZpdERhdGEgbmVlZGVkIGJ5IE1QQ3YyIERLRy5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZEtleXNoYXJlIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgb3IgYmFja3VwIGFzIGEganNvbi5zdHJpbmdpZnkgc3RyaW5nIGFuZCBiaXRnbydzIEJpZyBTaS5cbiAgICogQHBhcmFtIHBhcnR5SWQgLSBUaGUgcGFydHkgSUQgb2YgdGhlIE1QQ3YxIGtleXNoYXJlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0cm9maXQgZGF0YSBuZWVkZWQgdG8gc3RhcnQgYW4gTVBDdjIgREtHIHNlc3Npb24uXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgZ2V0S2V5RGF0YUZvclJldHJvZml0KFxuICAgIGRlY3J5cHRlZEtleXNoYXJlOiBzdHJpbmcsXG4gICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgfCBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgKTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB7XG4gICAgY29uc3QgbXBjID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgeGlMaXN0ID0gW1xuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgxKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMiksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDMpLCAzMikpLFxuICAgIF07XG4gICAgcmV0dXJuIEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IGRlY3J5cHRlZEtleXNoYXJlLFxuICAgICAgbXBjdjFQYXJ0eUluZGV4OiBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAxIDogMixcbiAgICAgIHhpTGlzdCxcbiAgICAgIG1wYyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB1c2VyIGFuZCBiYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIFJldHJvZml0RGF0YSBuZWVkZWQgYnkgTVBDdjIgREtHLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgYW5kIGJhY2t1cCBhcyBhIGpzb24uc3RyaW5naWZ5IHN0cmluZyBhbmQgYml0Z28ncyBCaWcgU2kuXG4gICAqIEByZXR1cm5zIHt7IG1wY3YyVXNlcktleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhOyBtcGN2MkJha2N1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhIH19IC0gdGhlIHJldHJvZml0IGRhdGEgbmVlZGVkIHRvIHN0YXJ0IGFuIE1QQ3YyIERLRyBzZXNzaW9uLlxuICAgKi9cbiAgZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHBhcmFtczogeyBtcGN2MVVzZXJLZXlTaGFyZTogc3RyaW5nOyBtcGN2MUJhY2t1cEtleVNoYXJlOiBzdHJpbmcgfSk6IHtcbiAgICBtcGN2MlVzZXJLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTtcbiAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhO1xuICB9IHtcbiAgICBjb25zdCBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCB4aUxpc3QgPSBbXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDEpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgyKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMyksIDMyKSksXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXBjdjJVc2VyS2V5U2hhcmU6IEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICAgIG1wY3YxUGFydHlLZXlTaGFyZTogcGFyYW1zLm1wY3YxVXNlcktleVNoYXJlLFxuICAgICAgICBtcGN2MVBhcnR5SW5kZXg6IDEsXG4gICAgICAgIHhpTGlzdCxcbiAgICAgICAgbXBjLFxuICAgICAgfSksXG4gICAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBFY2RzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHBhcmFtcy5tcGN2MUJhY2t1cEtleVNoYXJlLFxuICAgICAgICBtcGN2MVBhcnR5SW5kZXg6IDIsXG4gICAgICAgIHhpTGlzdCxcbiAgICAgICAgbXBjLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV0cm9maXQgZGF0YSBmcm9tIE1QQ3YxIGtleSBzaGFyZS5cbiAgICogQHBhcmFtIG1wY3YxUGFydHlLZXlTaGFyZVxuICAgKiBAcGFyYW0gbXBjdjFQYXJ0eUluZGV4XG4gICAqIEBwYXJhbSB4aUxpc3RcbiAgICogQHBhcmFtIG1wY1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KHtcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmUsXG4gICAgbXBjdjFQYXJ0eUluZGV4LFxuICAgIHhpTGlzdCxcbiAgICBtcGMsXG4gIH06IHtcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHN0cmluZztcbiAgICBtcGN2MVBhcnR5SW5kZXg6IG51bWJlcjtcbiAgICB4aUxpc3Q6IG51bWJlcltdW107XG4gICAgbXBjOiBFY2RzYTtcbiAgfSk6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEge1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKG1wY3YxUGFydHlLZXlTaGFyZSk7XG4gICAgbGV0IGtleUNvbWJpbmVkOiBLZXlDb21iaW5lZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKG1wY3YxUGFydHlJbmRleCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsICdCaXRHbyBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgICAgICBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsICdCaXRHbyBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW3NpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLCAnQmFja3VwIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgICAgICAgXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB4U2hhcmU6IGtleUNvbWJpbmVkLnhTaGFyZSxcbiAgICAgIHhpTGlzdDogeGlMaXN0LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZFVzZXJLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEJhY2t1cEtleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQW5kQmFja3VwU2Vzc2lvbihtOiBudW1iZXIsIG46IG51bWJlciwgcmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQpIHtcbiAgICBpZiAocmV0cm9maXQpIHtcbiAgICAgIGNvbnN0IHJldHJvZml0RGF0YSA9IHRoaXMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHtcbiAgICAgICAgbXBjdjFVc2VyS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIG1wY3YxQmFja3VwS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1c2VyU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhLm1wY3YyVXNlcktleVNoYXJlKTtcbiAgICAgIGNvbnN0IGJhY2t1cFNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhLm1wY3YyQmFja3VwS2V5U2hhcmUpO1xuXG4gICAgICByZXR1cm4geyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgY29uc3QgYmFja3VwU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG5cbiAgICByZXR1cm4geyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBjb21tb25LZXljaGFpbik7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICB1c2VyR3BnUHVibGljS2V5OiBzdHJpbmcsXG4gICAgYmFja3VwR3BnUHVibGljS2V5OiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlcyAmIHsgd2FsbGV0SWQ/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgICAgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSxcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICBwYXlsb2FkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgc2Vzc2lvbklkLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgc2Vzc2lvbklkLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4sXG4gICAgdXNlckdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IERrbHNUeXBlcy5BdXRoRW5jTWVzc2FnZXMgJiB7IHdhbGxldElkPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJHcGdQdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhiYWNrdXBHcGdQdWJsaWNLZXkpLCAnQmFja3VwIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3QgdXNlck1zZzEgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzEsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMSA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzEsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjEnXSwge1xuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJNc2cxOiB7IGZyb206IDAsIC4uLnVzZXJNc2cxIH0sXG4gICAgICBiYWNrdXBNc2cxOiB7IGZyb206IDEsIC4uLmJhY2t1cE1zZzEgfSxcbiAgICAgIHdhbGxldElkOiBwYXlsb2FkLndhbGxldElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWNkc2FNUEN2MktleUdlblNlbmRGbjxNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPixcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhzZXNzaW9uSWQpLCAnU2Vzc2lvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cyID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQodXNlck1zZzIuY29tbWl0bWVudCwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJNc2cyLmNvbW1pdG1lbnQpLCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzIuY29tbWl0bWVudCwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwTXNnMi5jb21taXRtZW50KSwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG5cbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogdXNlck1zZzIucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IHVzZXJNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICB1c2VyQ29tbWl0bWVudDI6IHVzZXJNc2cyLmNvbW1pdG1lbnQsXG4gICAgICBiYWNrdXBNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgICB0bzogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICAgc2lnbmF0dXJlOiBiYWNrdXBNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiYWNrdXBNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICBiYWNrdXBDb21taXRtZW50MjogYmFja3VwTXNnMi5jb21taXRtZW50LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDNCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWNkc2FNUEN2MktleUdlblNlbmRGbjxNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlPixcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhzZXNzaW9uSWQpLCAnU2Vzc2lvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2czID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiYWNrdXBNc2czID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzMsICdCYWNrdXAgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCB1c2VyTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnNCwgJ1VzZXIgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiYWNrdXBNc2c0ID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQoYmFja3VwTXNnNCwgJ0JhY2t1cCBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuXG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMyddLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMzogeyBmcm9tOiAwLCB0bzogMiwgLi4udXNlck1zZzMgfSxcbiAgICAgIGJhY2t1cE1zZzM6IHsgZnJvbTogMSwgdG86IDIsIC4uLmJhY2t1cE1zZzMgfSxcbiAgICAgIHVzZXJNc2c0OiB7IGZyb206IDAsIC4uLnVzZXJNc2c0IH0sXG4gICAgICBiYWNrdXBNc2c0OiB7IGZyb206IDEsIC4uLmJhY2t1cE1zZzQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHNpZ24gdHggcmVxdWVzdFxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1wY3YyUGFydHlJZCAtIHBhcnR5IGlkIGZvciB0aGUgc2lnbmVyIGludm9sdmVkIGluIHRoaXMgbXBjdjIgcmVxdWVzdCAoZWl0aGVyIDAgZm9yIHVzZXIgb3IgMSBmb3IgYmFja3VwKVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cblxuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUsIHBhcmFtcy5yZXFJZCwgdHhSZXF1ZXN0LmVudGVycHJpc2VJZCk7XG5cbiAgICBpZiAoIWJpdGdvR3BnUHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG5cbiAgICAgIC8vIEZvciBJQ1AgdHJhbnNhY3Rpb25zLCB0aGUgSFNNIHNpZ25zIHRoZSBzZXJpYWxpemVkVHhIZXgsIHdoaWxlIHRoZSB1c2VyIHNpZ25zIHRoZSBzaWduYWJsZUhleCBzZXBhcmF0ZWx5LlxuICAgICAgLy8gVmVyaWZpY2F0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGhlIHNpZ25hYmxlSGV4IGFsb25lLiBIb3dldmVyLCB3ZSBjYW4gcGFyc2UgdGhlIHNlcmlhbGl6ZWRUeEhleFxuICAgICAgLy8gdG8gcmVnZW5lcmF0ZSB0aGUgc2lnbmFibGVIZXggYW5kIGNvbXBhcmUgaXQgYWdhaW5zdCB0aGUgcHJvdmlkZWQgdmFsdWUgZm9yIHZlcmlmaWNhdGlvbi5cbiAgICAgIC8vIEluIGNvbnRyYXN0LCBmb3Igb3RoZXIgY29pbiBmYW1pbGllcywgdmVyaWZpY2F0aW9uIGlzIHR5cGljYWxseSBkb25lIHVzaW5nIGp1c3QgdGhlIHNpZ25hYmxlSGV4LlxuICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0Q29uZmlnKCkuZmFtaWx5ID09PSAnaWNwJykge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCwgdHhJbmZvOiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcy50eFBhcmFtcyB8fCB7IHJlY2lwaWVudHM6IFtdIH0sXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcy50eFBhcmFtcyB8fCB7IHJlY2lwaWVudHM6IFtdIH0sXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHVuc2lnbmVkVHguc2lnbmFibGVIZXg7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHR4UmVxdWVzdC5tZXNzYWdlcyFbMF0ubWVzc2FnZUVuY29kZWQ7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uZGVyaXZhdGlvblBhdGggfHwgJ20vMCc7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlcXVlc3QgdHlwZScpO1xuICAgIH1cblxuICAgIGxldCBoYXNoOiBIYXNoO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKSBhcyBIYXNoO1xuICAgIH1cbiAgICAvLyBjaGVjayB3aGF0IHRoZSBlbmNvZGluZyBpcyBzdXBwb3NlZCB0byBiZSBmb3IgbWVzc2FnZVxuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBoYXNoLnVwZGF0ZShidWZmZXJDb250ZW50KS5kaWdlc3QoKTtcbiAgICBjb25zdCBvdGhlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyhcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIHBhcmFtcy5tcGN2MlBhcnR5SWQgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy5tcGN2MlBhcnR5SWQgOiAwLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBoYXNoQnVmZmVyXG4gICAgKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSA9IGF3YWl0IG90aGVyU2lnbmVyLmluaXQoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUoXG4gICAgICB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3QgT2JqZWN0Jyk7XG5cbiAgICBsZXQgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyOiBhbnk7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyID0gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIgPSBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICB9XG4gICAgLy8gVE9ETzogVXNlIGNvZGVjIGZvciBwYXJzaW5nXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gSlNPTi5wYXJzZShcbiAgICAgIGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMltiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMiA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUoXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIC8qKiBSb3VuZCAyICoqL1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZE1lc3NhZ2VzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDFBbmQyKTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyID0gb3RoZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZE1lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUd28gPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMixcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcbiAgICBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZFR3b10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3QgT2JqZWN0Jyk7XG5cbiAgICBjb25zdCB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgLy8gVE9ETzogVXNlIGNvZGVjIGZvciBwYXJzaW5nXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gSlNPTi5wYXJzZShcbiAgICAgIHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlc1t0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byhcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ1B1YktleSxcbiAgICAgIHBhcmFtcy5tcGN2MlBhcnR5SWRcbiAgICApO1xuXG4gICAgLyoqIFJvdW5kIDMgKiovXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0ID0gb3RoZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZShcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcbiAgICAvLyBTdWJtaXQgZm9yIGZpbmFsIHNpZ25hdHVyZSBzaGFyZSBjb21iaW5lXG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUaHJlZV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3Qud2FsbGV0SWQsIHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBmb3JtYXR0aW5nIHV0aWxzXG4gIGZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShicm9hZGNhc3RNZXNzYWdlOiBNUEN2MkJyb2FkY2FzdE1lc3NhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogYnJvYWRjYXN0TWVzc2FnZS5mcm9tLFxuICAgICAgcGF5bG9hZDogeyBtZXNzYWdlOiBicm9hZGNhc3RNZXNzYWdlLm1lc3NhZ2UsIHNpZ25hdHVyZTogYnJvYWRjYXN0TWVzc2FnZS5zaWduYXR1cmUgfSxcbiAgICB9O1xuICB9XG5cbiAgZm9ybWF0UDJQTWVzc2FnZShwMnBNZXNzYWdlOiBNUEN2MlAyUE1lc3NhZ2UsIGNvbW1pdG1lbnQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bG9hZDogeyBlbmNyeXB0ZWRNZXNzYWdlOiBwMnBNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UsIHNpZ25hdHVyZTogcDJwTWVzc2FnZS5zaWduYXR1cmUgfSxcbiAgICAgIGZyb206IHAycE1lc3NhZ2UuZnJvbSxcbiAgICAgIHRvOiBwMnBNZXNzYWdlLnRvLFxuICAgICAgY29tbWl0bWVudCxcbiAgICB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHByaXZhdGUgdXRpbHNcbiAgLyoqXG4gICAqIEdldCB0aGUgaGFzaCBzdHJpbmcgYW5kIGRlcml2YXRpb24gcGF0aCBmcm9tIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1R4UmVxdWVzdH0gdHhSZXF1ZXN0IC0gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7UmVxdWVzdFR5cGV9IHJlcXVlc3RUeXBlIC0gdGhlIHJlcXVlc3QgdHlwZVxuICAgKiBAcmV0dXJucyB7eyBoYXNoQnVmZmVyOiBCdWZmZXI7IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfX0gLSB0aGUgaGFzaCBzdHJpbmcgYW5kIGRlcml2YXRpb24gcGF0aFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgoXG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3QsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogeyBoYXNoQnVmZmVyOiBCdWZmZXI7IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfSB7XG4gICAgbGV0IHR4VG9TaWduOiBzdHJpbmc7XG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICB0eFRvU2lnbiA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaWduYWJsZUhleDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICAgIHRocm93IG5ldyBFcnJvcignTVBDdjIgbWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZSk7XG4gICAgfVxuXG4gICAgbGV0IGhhc2g6IEhhc2g7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IGNyZWF0ZUtlY2Nha0hhc2goJ2tlY2NhazI1NicpIGFzIEhhc2g7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBoYXNoLnVwZGF0ZShCdWZmZXIuZnJvbSh0eFRvU2lnbiwgJ2hleCcpKS5kaWdlc3QoKTtcblxuICAgIHJldHVybiB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQml0R28gYW5kIHVzZXIgR1BHIGtleXMgZnJvbSB0aGUgQml0R28gcHVibGljIEdQRyBrZXkgYW5kIHRoZSBlbmNyeXB0ZWQgdXNlciBHUEcgcHJpdmF0ZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiaXRnb1B1YmxpY0dwZ0tleSAgLSB0aGUgQml0R28gcHVibGljIEdQRyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgIC0gdGhlIGVuY3J5cHRlZCB1c2VyIEdQRyBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFzc3BocmFzZSAgLSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkYXRhIC0gdGhlIGFkZGl0aW9uYWwgZGF0YSB0byB2YWxpZGF0ZSB0aGUgR1BHIGtleXNcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBiaXRnb0dwZ0tleTogcGdwLktleTsgdXNlckdwZ0tleTogcGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gfT59IC0gdGhlIEJpdEdvIGFuZCB1c2VyIEdQRyBrZXlzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZyxcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGFkYXRhOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7XG4gICAgYml0Z29HcGdLZXk6IHBncC5LZXk7XG4gICAgdXNlckdwZ0tleTogcGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz47XG4gIH0+IHtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29QdWJsaWNHcGdLZXkgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZKTtcbiAgICBjb25zdCB1c2VyRGVjcnlwdGVkS2V5ID0gYXdhaXQgcGdwLnJlYWRLZXkoe1xuICAgICAgYXJtb3JlZEtleTogdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJHcGdLZXk6IHBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+ID0ge1xuICAgICAgcHJpdmF0ZUtleTogdXNlckRlY3J5cHRlZEtleS5hcm1vcigpLFxuICAgICAgcHVibGljS2V5OiB1c2VyRGVjcnlwdGVkS2V5LnRvUHVibGljKCkuYXJtb3IoKSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBiaXRnb0dwZ0tleSxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGFkYXRhIGFuZCBjeXBoZXJ0ZXh0LlxuICAgKiBAcGFyYW0gYWRhdGEgc3RyaW5nXG4gICAqIEBwYXJhbSBjeXBoZXJ0ZXh0IHN0cmluZ1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgYWRhdGEgb3IgY3lwaGVydGV4dCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQWRhdGEoYWRhdGE6IHN0cmluZywgY3lwaGVydGV4dDogc3RyaW5nLCByb3VuZERvbWFpblNlcGFyYXRvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGN5cGhlckpzb247XG4gICAgdHJ5IHtcbiAgICAgIGN5cGhlckpzb24gPSBKU09OLnBhcnNlKGN5cGhlcnRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIGN5cGhlcnRleHQgdG8gSlNPTiwgZ290OiAnICsgY3lwaGVydGV4dCk7XG4gICAgfVxuICAgIC8vIHVzaW5nIGRlY29kZVVSSUNvbXBvbmVudCB0byBoYW5kbGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKFxuICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KGN5cGhlckpzb24uYWRhdGEpICE9PSBkZWNvZGVVUklDb21wb25lbnQoYCR7cm91bmREb21haW5TZXBhcmF0b3J9OiR7YWRhdGF9YCkgJiZcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudChjeXBoZXJKc29uLmFkYXRhKSAhPT0gZGVjb2RlVVJJQ29tcG9uZW50KGFkYXRhKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGF0YSBkb2VzIG5vdCBtYXRjaCBjeXBoZXJ0ZXh0IGFkYXRhJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZXh0ZXJuYWwgc2lnbmVyXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBzaWduRWNkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHJlcUlkIH0gPSBwYXJhbXM7XG4gICAgbGV0IHR4UmVxdWVzdFJlc29sdmVkOiBUeFJlcXVlc3Q7XG5cbiAgICAvLyBUT0RPKFdQLTIxNzYpOiBBZGQgc3VwcG9ydCBmb3IgbWVzc2FnZSBzaWduaW5nXG4gICAgYXNzZXJ0KFxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4LFxuICAgICAgJ09ubHkgdHJhbnNhY3Rpb24gc2lnbmluZyBpcyBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciwgZ290OiAnICsgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QsIHJlcUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcoXG4gICAgICB0cnVlLFxuICAgICAgcGFyYW1zLnJlcUlkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQuZW50ZXJwcmlzZUlkXG4gICAgKTtcblxuICAgIGlmICghYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuICAgIH1cblxuICAgIC8vIHJvdW5kIDFcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH0gPVxuICAgICAgYXdhaXQgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3IoeyB0eFJlcXVlc3Q6IHR4UmVxdWVzdFJlc29sdmVkIH0pO1xuICAgIGNvbnN0IHJvdW5kMVR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDJcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMVR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQyVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMl0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuICAgIGFzc2VydChcbiAgICAgIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXMsXG4gICAgICAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0J1xuICAgICk7XG5cbiAgICAvLyByb3VuZCAzXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDJUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDNdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLCB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHJlcUlkKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDFTaGFyZShwYXJhbXM6IHsgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7IHBydjogc3RyaW5nOyB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQxOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICB1c2VyR3BnUHViS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QpO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7aGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyl9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSA9IGF3YWl0IHVzZXJTaWduZXIuaW5pdCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHVzZXJTaWduZXIuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb24sXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFfToke2FkYXRhfWAsXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyR3BnUHViS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDJTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDI6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPVxuICAgICAgcGFyYW1zO1xuXG4gICAgY29uc3QgeyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0KTtcbiAgICBjb25zdCBhZGF0YSA9IGAke2hhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWA7XG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhXG4gICAgKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/LlswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAxIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IEpTT04ucGFyc2UoXG4gICAgICBzaWduYXR1cmVTaGFyZXNbc2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMSA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUoXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFKTtcbiAgICBjb25zdCByb3VuZDFTZXNzaW9uID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBhd2FpdCB1c2VyU2lnbmVyLnNldFNlc3Npb24ocm91bmQxU2Vzc2lvbik7XG5cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxKTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyID0gdXNlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzID0gdXNlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMiA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28oXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyLFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ0tleVxuICAgICk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHVzZXJTaWduZXIuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb24sXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmF0dXJlU2hhcmVSb3VuZDIsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQzU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQzOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPVxuICAgICAgcGFyYW1zO1xuXG4gICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgY29uc3QgeyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0KTtcbiAgICBjb25zdCBhZGF0YSA9IGAke2hhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGFcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucz8uWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gSlNPTi5wYXJzZShcbiAgICAgIHNpZ25hdHVyZVNoYXJlc1tzaWduYXR1cmVTaGFyZXMubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byhcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ0tleVxuICAgICk7XG5cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFKTtcbiAgICBjb25zdCByb3VuZDJTZXNzaW9uID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBhd2FpdCB1c2VyU2lnbmVyLnNldFNlc3Npb24ocm91bmQyU2Vzc2lvbik7XG5cbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0ID0gdXNlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDMgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUodXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCwgdXNlckdwZ0tleSwgYml0Z29HcGdLZXkpO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBrZXkgc2hhcmUsIHdoZW4gZGVjcnlwdGVkLCBjb250YWlucyB2YWxpZCBHRzE4IHNpZ25pbmcgbWF0ZXJpYWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVNoYXJlIC0gVGhlIGVuY3J5cHRlZCBrZXkgc2hhcmUgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXkgc2hhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFJldHVybnMgYHRydWVgIGlmIHRoZSBkZWNyeXB0ZWQgZGF0YSBjb250YWlucyB2YWxpZCBzaWduaW5nIG1hdGVyaWFsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR0cxOFNpZ25pbmdNYXRlcmlhbChrZXlTaGFyZTogc3RyaW5nLCB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgcHJ2ID0gc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGtleVNoYXJlKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBydik7XG4gICAgcmV0dXJuIChcbiAgICAgIHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUgJiZcbiAgICAgIHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSAmJlxuICAgICAgKHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlIHx8IHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gdGhlIHByb3ZpZGVkIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzLlxuICogQHBhcmFtIGVuY3J5cHRlZFVzZXJLZXkgZW5jcnlwdGVkIGdnMTggb3IgTVBDdjIgdXNlciBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRCYWNrdXBLZXkgZW5jcnlwdGVkIGdnMTggb3IgTVBDdjIgYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3dvcmQgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlcbiAqIEByZXR1cm5zIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzKFxuICBlbmNyeXB0ZWRVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4pOiBQcm9taXNlPHtcbiAgdXNlcktleVNoYXJlOiBCdWZmZXI7XG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXI7XG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmc7XG59PiB7XG4gIGlmIChpc0dHMThTaWduaW5nTWF0ZXJpYWwoZW5jcnlwdGVkVXNlcktleSwgd2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICByZXR1cm4gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21HRzE4KGVuY3J5cHRlZFVzZXJLZXksIGVuY3J5cHRlZEJhY2t1cEtleSwgd2FsbGV0UGFzc3BocmFzZSk7XG4gIH1cbiAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UpO1xufVxuXG4vKipcbiAqIFNpZ25zIGEgbWVzc2FnZSBoYXNoIHVzaW5nIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlSGFzaFxuICogQHBhcmFtIHtCdWZmZXJ9IHVzZXJLZXlTaGFyZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJhY2t1cEtleVNoYXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbW9uS2V5Q2hhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgcmVjaWQ6IG51bWJlciwgcjogc3RyaW5nLCBzOiBzdHJpbmcsIHk6IHN0cmluZyB9Pn1cbiAqXG4gKiBAYXN5bmNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25SZWNvdmVyeU1wY1YyKFxuICBtZXNzYWdlSGFzaDogQnVmZmVyLFxuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcixcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcixcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZ1xuKTogUHJvbWlzZTx7XG4gIHJlY2lkOiBudW1iZXI7XG4gIHI6IHN0cmluZztcbiAgczogc3RyaW5nO1xuICB5OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHVzZXJEc2cgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuICBjb25zdCBiYWNrdXBEc2cgPSBuZXcgRGtsc0RzZy5Ec2coYmFja3VwS2V5U2hhcmUsIDEsICdtLzAnLCBtZXNzYWdlSGFzaCk7XG5cbiAgY29uc3Qgc2lnbmF0dXJlU3RyaW5nID0gRGtsc1V0aWxzLnZlcmlmeUFuZENvbnZlcnREa2xzU2lnbmF0dXJlKFxuICAgIG1lc3NhZ2VIYXNoLFxuICAgIChhd2FpdCBEa2xzVXRpbHMuZXhlY3V0ZVRpbGxSb3VuZCg1LCB1c2VyRHNnLCBiYWNrdXBEc2cpKSBhcyBEa2xzVHlwZXMuRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZSxcbiAgICBjb21tb25LZXlDaGFpbixcbiAgICAnbS8wJyxcbiAgICB1bmRlZmluZWQsXG4gICAgZmFsc2VcbiAgKTtcbiAgY29uc3Qgc2lnUGFydHMgPSBzaWduYXR1cmVTdHJpbmcuc3BsaXQoJzonKTtcblxuICByZXR1cm4ge1xuICAgIHJlY2lkOiBwYXJzZUludChzaWdQYXJ0c1swXSwgMTApLFxuICAgIHI6IHNpZ1BhcnRzWzFdLFxuICAgIHM6IHNpZ1BhcnRzWzJdLFxuICAgIHk6IHNpZ1BhcnRzWzNdLFxuICB9O1xufVxuXG4vLyAjcmVnaW9uIHByaXZhdGUgdXRpbHNcblxuLyoqXG4gKiBHZXQgdGhlIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gdGhlIHByb3ZpZGVkIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzLlxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThVc2VyS2V5IGVuY3J5cHRlZCBnZzE4IHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkR0cxOEJhY2t1cEtleSBlbmNyeXB0ZWQgZ2cxOCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzd29yZCBmb3IgdXNlciBhbmQgYmFja3VwIGtleVxuICogQHJldHVybnMgTVBDIHYyIHJlY292ZXJ5IGtleSBzaGFyZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21HRzE4KFxuICBlbmNyeXB0ZWRHRzE4VXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmdcbik6IFByb21pc2U8e1xuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZztcbn0+IHtcbiAgY29uc3QgW3VzZXJLZXlDb21iaW5lZCwgYmFja3VwS2V5Q29tYmluZWRdID0gZ2V0S2V5Q29tYmluZWRGcm9tVHNzS2V5U2hhcmVzKFxuICAgIGVuY3J5cHRlZEdHMThVc2VyS2V5LFxuICAgIGVuY3J5cHRlZEdHMThCYWNrdXBLZXksXG4gICAgd2FsbGV0UGFzc3BocmFzZVxuICApO1xuICBjb25zdCByZXRyb2ZpdERhdGFBOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZTogdXNlcktleUNvbWJpbmVkLnhTaGFyZSxcbiAgfTtcbiAgY29uc3QgcmV0cm9maXREYXRhQjogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9IHtcbiAgICB4U2hhcmU6IGJhY2t1cEtleUNvbWJpbmVkLnhTaGFyZSxcbiAgfTtcbiAgY29uc3QgW3VzZXIsIGJhY2t1cF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGUyb2YyS2V5U2hhcmVzKHJldHJvZml0RGF0YUEsIHJldHJvZml0RGF0YUIpO1xuXG4gIGNvbnN0IHVzZXJLZXlTaGFyZSA9IHVzZXIuZ2V0S2V5U2hhcmUoKTtcbiAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBiYWNrdXAuZ2V0S2V5U2hhcmUoKTtcbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgY29tbW9uS2V5Q2hhaW46IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBLZXlTaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jcnlwdGVkTVBDdjJVc2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jcnlwdGVkTVBDdjJCYWNrdXBLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbd2FsbGV0UGFzc3BocmFzZV0gLSBUaGUgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGtleSBzaGFyZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgdXNlcktleVNoYXJlOiBLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmU6IEtleVNoYXJlLCBjb21tb25LZXlDaGFpbjogc3RyaW5nIH0+fVxuICpcbiAqIEBhc3luY1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gIGVuY3J5cHRlZE1QQ3YyVXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRNUEN2MkJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4pOiBQcm9taXNlPHtcbiAgdXNlcktleVNoYXJlOiBCdWZmZXI7XG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXI7XG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHVzZXJDb21wcmVzc2VkUHJ2ID0gQnVmZmVyLmZyb20oc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZE1QQ3YyVXNlcktleSksICdiYXNlNjQnKTtcbiAgY29uc3QgYmFrY3VwQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRNUEN2MkJhY2t1cEtleSksICdiYXNlNjQnKTtcblxuICBjb25zdCB1c2VyUHJ2SlNPTjogRGtsc1R5cGVzLlJlZHVjZWRLZXlTaGFyZSA9IERrbHNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKHVzZXJDb21wcmVzc2VkUHJ2KTtcbiAgY29uc3QgYmFja3VwUHJ2SlNPTjogRGtsc1R5cGVzLlJlZHVjZWRLZXlTaGFyZSA9IERrbHNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKGJha2N1cENvbXByZXNzZWRQcnYpO1xuICBjb25zdCB1c2VyS2V5UmV0cm9maXQ6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiB7XG4gICAgICB4OiBCdWZmZXIuZnJvbSh1c2VyUHJ2SlNPTi5wcnYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHk6IEJ1ZmZlci5mcm9tKHVzZXJQcnZKU09OLnB1YikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgY2hhaW5jb2RlOiBCdWZmZXIuZnJvbSh1c2VyUHJ2SlNPTi5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4JyksXG4gICAgfSxcbiAgICB4aUxpc3Q6IHVzZXJQcnZKU09OLnhMaXN0LnNsaWNlKDAsIDIpLFxuICB9O1xuICBjb25zdCBiYWNrdXBLZXlSZXRyb2ZpdDogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9IHtcbiAgICB4U2hhcmU6IHtcbiAgICAgIHg6IEJ1ZmZlci5mcm9tKGJhY2t1cFBydkpTT04ucHJ2KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBCdWZmZXIuZnJvbShiYWNrdXBQcnZKU09OLnB1YikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgY2hhaW5jb2RlOiBCdWZmZXIuZnJvbShiYWNrdXBQcnZKU09OLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9LFxuICAgIHhpTGlzdDogYmFja3VwUHJ2SlNPTi54TGlzdC5zbGljZSgwLCAyKSxcbiAgfTtcbiAgY29uc3QgW3VzZXIsIGJhY2t1cF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGUyb2YyS2V5U2hhcmVzKHVzZXJLZXlSZXRyb2ZpdCwgYmFja3VwS2V5UmV0cm9maXQpO1xuICBjb25zdCB1c2VyS2V5U2hhcmUgPSB1c2VyLmdldEtleVNoYXJlKCk7XG4gIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYmFja3VwLmdldEtleVNoYXJlKCk7XG4gIGNvbnN0IGNvbW1vbktleUNoYWluID0gRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKHVzZXJLZXlTaGFyZSk7XG4gIHJldHVybiB7IHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGNvbW1vbktleUNoYWluIH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29tYmluZWQga2V5IGZvciBHRzE4XG4gKiBAcGFyYW0gZW5jcnlwdGVkR0cxOFVzZXJLZXkgZW5jcnlwdGVkIEdHMTggdXNlciBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5IGVuY3J5cHRlZCBHRzE4IGJhY2t1cCBrZXlcbiAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIHdhbGxldCBwYXNzcGhyYXNlXG4gKiBAcmV0dXJucyBrZXkgc2hhcmVzXG4gKi9cbmZ1bmN0aW9uIGdldEtleUNvbWJpbmVkRnJvbVRzc0tleVNoYXJlcyhcbiAgZW5jcnlwdGVkR0cxOFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkR0cxOEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4pOiBbRUNEU0FNZXRob2RUeXBlcy5LZXlDb21iaW5lZCwgRUNEU0FNZXRob2RUeXBlcy5LZXlDb21iaW5lZF0ge1xuICBsZXQgYmFja3VwUHJ2O1xuICBsZXQgdXNlclBydjtcbiAgdHJ5IHtcbiAgICBiYWNrdXBQcnYgPSBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkR0cxOEJhY2t1cEtleSk7XG4gICAgdXNlclBydiA9IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRHRzE4VXNlcktleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgYmFja3VwIGtleWNoYWluOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHVzZXJQcnYpIGFzIEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsO1xuICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWw7XG5cbiAgaWYgKCF1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gIH1cblxuICBpZiAoIWJhY2t1cFNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhY2t1cCBrZXkgLSBtaXNzaW5nIHVzZXJOU2hhcmUnKTtcbiAgfVxuXG4gIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuXG4gIGNvbnN0IHVzZXJLZXlDb21iaW5lZCA9IE1QQy5rZXlDb21iaW5lKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSxcbiAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgXSk7XG4gIGNvbnN0IGJhY2t1cEtleUNvbWJpbmVkID0gTVBDLmtleUNvbWJpbmUoYmFja3VwU2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLFxuICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSxcbiAgXSk7XG4gIGlmIChcbiAgICB1c2VyS2V5Q29tYmluZWQueFNoYXJlLnkgIT09IGJhY2t1cEtleUNvbWJpbmVkLnhTaGFyZS55IHx8XG4gICAgdXNlcktleUNvbWJpbmVkLnhTaGFyZS5jaGFpbmNvZGUgIT09IGJhY2t1cEtleUNvbWJpbmVkLnhTaGFyZS5jaGFpbmNvZGVcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuICB9XG4gIHJldHVybiBbdXNlcktleUNvbWJpbmVkLCBiYWNrdXBLZXlDb21iaW5lZF07XG59XG5cbi8vICNlbmRyZWdpb25cbiJdfQ==
|