@bitgo/sdk-coin-algo 2.10.9 → 2.11.1
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/algo.js +3 -3
- package/dist/test/unit/algo.js +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
package/dist/src/algo.js
CHANGED
|
@@ -629,8 +629,8 @@ class Algo extends sdk_core_1.BaseCoin {
|
|
|
629
629
|
throw new Error('bitgo public key from the keyCard is required for non-bitgo recovery');
|
|
630
630
|
}
|
|
631
631
|
try {
|
|
632
|
-
userPrv = this.bitgo.
|
|
633
|
-
backupPrv = this.bitgo.
|
|
632
|
+
userPrv = await this.bitgo.decryptAsync({ input: params.userKey, password: params.walletPassphrase });
|
|
633
|
+
backupPrv = await this.bitgo.decryptAsync({ input: params.backupKey, password: params.walletPassphrase });
|
|
634
634
|
const userKeyAddress = utils_1.default.privateKeyToAlgoAddress(userPrv);
|
|
635
635
|
const backupKeyAddress = utils_1.default.privateKeyToAlgoAddress(backupPrv);
|
|
636
636
|
txBuilder.numberOfRequiredSigners(2).setSigners([userKeyAddress, backupKeyAddress, params.bitgoKey]);
|
|
@@ -800,4 +800,4 @@ class Algo extends sdk_core_1.BaseCoin {
|
|
|
800
800
|
}
|
|
801
801
|
}
|
|
802
802
|
exports.Algo = Algo;
|
|
803
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbGdvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsMENBQTRCO0FBQzVCLG1EQUFnRDtBQUNoRCw0Q0FBbUQ7QUFDbkQsK0NBQWlDO0FBQ2pDLDhDQTBCeUI7QUFDekIsOERBQWtDO0FBQ2xDLGdFQUFxQztBQUNyQyx3REFBZ0M7QUFFaEMsaURBQW1DO0FBQ25DLGlFQUtrQztBQUNsQyxtQ0FBZ0M7QUFDaEMsbUNBQWtDO0FBRWxDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWM7QUFpSnhDLE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBSWhDLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBSk4saUJBQVksR0FBd0IsYUFBYSxDQUFDO1FBQ2xELGtCQUFhLEdBQXdCLGNBQWMsQ0FBQztJQUk3RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQjtRQUNwQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsMkJBQTJCO1FBQ3pCLE9BQU8s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QUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxPQUFPO0lBQ1QsQ0FBQztDQUNGO0FBcDNCRCxvQkFvM0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VlZFZhbGlkYXRvciB9IGZyb20gJy4vc2VlZFZhbGlkYXRvcic7XG5pbXBvcnQgeyBjb2lucywgQ29pbkZhbWlseSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCAqIGFzIEFsZ29MaWIgZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgQWRkcmVzc0NvaW5TcGVjaWZpYyxcbiAgQmFzZUJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQmFzZUJyb2FkY2FzdFRyYW5zYWN0aW9uUmVzdWx0LFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkS2V5LFxuICBLZXlJbmRpY2VzLFxuICBLZXlQYWlyLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUb2tlbk1hbmFnZW1lbnRUeXBlLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBOb3RTdXBwb3J0ZWQsXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIFR4SW50ZW50TWlzbWF0Y2hFcnJvcixcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCBzdGVsbGFyIGZyb20gJ3N0ZWxsYXItc2RrJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCBVdGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUeERhdGEgfSBmcm9tICcuL2xpYi9pZmFjZXMnO1xuaW1wb3J0ICogYXMgYWxnb3NkayBmcm9tICdhbGdvc2RrJztcbmltcG9ydCB7XG4gIE1BSU5ORVRfR0VORVNJU19IQVNILFxuICBNQUlOTkVUX0dFTkVTSVNfSUQsXG4gIFRFU1RORVRfR0VORVNJU19IQVNILFxuICBURVNUTkVUX0dFTkVTSVNfSUQsXG59IGZyb20gJy4vbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgdG9OdW1iZXIgfSBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCBTVVBQT1JURURfQUREUkVTU19WRVJTSU9OID0gMTtcbmNvbnN0IE1TSUdfVEhSRVNIT0xEID0gMjsgLy8gbSBpbiBtLW9mLW5cblxuZXhwb3J0IGludGVyZmFjZSBBbGdvQWRkcmVzc0NvaW5TcGVjaWZpY3MgZXh0ZW5kcyBBZGRyZXNzQ29pblNwZWNpZmljIHtcbiAgcm9vdEFkZHJlc3M6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgYml0Z29QdWJLZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3NWZXJzaW9uOiBudW1iZXI7XG4gIHRocmVzaG9sZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFsZ29BZGRyZXNzT3B0aW9ucyBleHRlbmRzIFZlcmlmeUFkZHJlc3NPcHRpb25zIHtcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbiAgY29pbjogc3RyaW5nO1xuICB3YWxsZXQ6IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBbGdvQWRkcmVzc0NvaW5TcGVjaWZpY3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb1RyYW5zYWN0aW9uRXhwbGFuYXRpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgbWVtbz86IHN0cmluZztcbiAgdHlwZT86IHN0cmluZyB8IG51bWJlcjtcbiAgdm90ZUtleT86IHN0cmluZztcbiAgc2VsZWN0aW9uS2V5Pzogc3RyaW5nO1xuICB2b3RlRmlyc3Q/OiBudW1iZXI7XG4gIHZvdGVMYXN0PzogbnVtYmVyO1xuICB2b3RlS2V5RGlsdXRpb24/OiBudW1iZXI7XG4gIHRva2VuSWQ/OiBudW1iZXI7XG4gIG9wZXJhdGlvbnM/OiBUcmFuc2FjdGlvbk9wZXJhdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3BlcmF0aW9uIHtcbiAgdHlwZTogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgcHJ2OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIGhhbGZTaWduZWQ/OiB7XG4gICAgdHhIZXg6IHN0cmluZztcbiAgfTtcbiAgdHhJbmZvOiB7XG4gICAgZnJvbTogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgZmVlOiBudW1iZXI7XG4gICAgZmlyc3RSb3VuZDogbnVtYmVyO1xuICAgIGxhc3RSb3VuZDogbnVtYmVyO1xuICAgIGdlbmVzaXNJRDogc3RyaW5nO1xuICAgIGdlbmVzaXNIYXNoOiBzdHJpbmc7XG4gICAgbm90ZT86IHN0cmluZztcbiAgfTtcbiAga2V5czogc3RyaW5nW107XG4gIGFkZHJlc3NWZXJzaW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVsbHlTaWduZWRUcmFuc2FjdGlvbiB7XG4gIHR4SGV4OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFsZlNpZ25lZFRyYW5zYWN0aW9uIHtcbiAgaGFsZlNpZ25lZDoge1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25GZWUge1xuICBmZWU6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4SGV4Pzogc3RyaW5nO1xuICBoYWxmU2lnbmVkPzoge1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gIH07XG4gIHB1YmxpY0tleXM/OiBzdHJpbmdbXTtcbiAgZmVlSW5mbzogVHJhbnNhY3Rpb25GZWU7XG59XG5cbmludGVyZmFjZSBOb2RlUGFyYW1zIHtcbiAgdG9rZW46IHN0cmluZztcbiAgYmFzZVNlcnZlcjogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpZWRUcmFuc2FjdGlvblBhcmFtZXRlcnMge1xuICB0eEhleDogc3RyaW5nO1xuICBhZGRyZXNzVmVyc2lvbjogbnVtYmVyO1xuICBzaWduZXJzOiBzdHJpbmdbXTtcbiAgcHJ2OiBzdHJpbmc7XG4gIGlzSGFsZlNpZ25lZDogYm9vbGVhbjtcbiAgbnVtYmVyU2lnbmVyczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5T3B0aW9ucyB7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIHJvb3RBZGRyZXNzOiBzdHJpbmc7XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgZmVlOiBudW1iZXI7XG4gIGZpcnN0Um91bmQ/OiBudW1iZXI7XG4gIG5vdGU/OiBzdHJpbmc7XG4gIG5vZGVQYXJhbXM6IE5vZGVQYXJhbXM7XG59XG5cbmludGVyZmFjZSBSZWNvdmVyeUluZm8ge1xuICBpZDogc3RyaW5nO1xuICB0eDogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG4gIGZlZTogbnVtYmVyO1xuICBmaXJzdFJvdW5kOiBudW1iZXI7XG4gIGxhc3RSb3VuZDogbnVtYmVyO1xuICBnZW5lc2lzSWQ6IHN0cmluZztcbiAgZ2VuZXNpc0hhc2g6IHN0cmluZztcbiAgbm90ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZmZsaW5lVmF1bHRUeEluZm8ge1xuICB0eEhleDogc3RyaW5nO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvaW46IHN0cmluZztcbiAgZmVlSW5mbzogbnVtYmVyO1xuICBhbW91bnQ6IHN0cmluZztcbiAgZmlyc3RSb3VuZDogbnVtYmVyO1xuICBsYXN0Um91bmQ6IG51bWJlcjtcbiAgZ2VuZXNpc0lkOiBzdHJpbmc7XG4gIGdlbmVzaXNIYXNoOiBzdHJpbmc7XG4gIG5vdGU/OiBzdHJpbmc7XG4gIGFkZHJlc3NWZXJzaW9uOiBudW1iZXI7XG4gIGtleXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMge1xuICBub2RlUGFyYW1zOiBOb2RlUGFyYW1zO1xufVxuXG5leHBvcnQgY2xhc3MgQWxnbyBleHRlbmRzIEJhc2VDb2luIHtcbiAgcmVhZG9ubHkgRU5BQkxFX1RPS0VOOiBUb2tlbk1hbmFnZW1lbnRUeXBlID0gJ2VuYWJsZXRva2VuJztcbiAgcmVhZG9ubHkgRElTQUJMRV9UT0tFTjogVG9rZW5NYW5hZ2VtZW50VHlwZSA9ICdkaXNhYmxldG9rZW4nO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UpIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IEFsZ28oYml0Z28pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FsZ28nO1xuICB9XG5cbiAgZ2V0QmFzZUNoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdhbGdvJztcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYWxnbyc7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnQWxnb3JhbmQnO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIHJldHVybiAxZTY7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGdvcmFuZCBzdXBwb3J0cyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLiBUaGVzZSBhcmUgdHJhbnNmZXJzIGZyb20gdGhlIHJlY2VpdmUgYWRkcmVzc2VzXG4gICAqIHRvIHRoZSBtYWluIGFkZHJlc3MuXG4gICAqL1xuICBhbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGRvYyAqL1xuICBkZXJpdmVLZXlXaXRoU2VlZCgpOiB7IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7IGtleTogc3RyaW5nIH0ge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ21ldGhvZCBkZXJpdmVLZXlXaXRoU2VlZCBub3Qgc3VwcG9ydGVkIGZvciBlZGRzYSBjdXJ2ZScpO1xuICB9XG5cbiAgLyoqIGluaGVyaXRkb2MgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBBbGdvTGliLktleVBhaXIoeyBzZWVkIH0pIDogbmV3IEFsZ29MaWIuS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleVBhaXIuZ2V0QWRkcmVzcygpLFxuICAgICAgcHJ2OiBBbGdvTGliLmFsZ29VdGlscy5lbmNvZGVTZWVkKEJ1ZmZlci5mcm9tKGtleVBhaXIuZ2V0U2lnbmluZ0tleSgpKSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZG9jICovXG4gIGdlbmVyYXRlUm9vdEtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEFsZ29MaWIuS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgQWxnb0xpYi5LZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7IHBydjoga2V5cy5wcnYgKyBrZXlzLnB1YiwgcHViOiBrZXlzLnB1YiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBbGdvTGliLmFsZ29VdGlscy5pc1ZhbGlkQWRkcmVzcyhwdWIpIHx8IEFsZ29MaWIuYWxnb1V0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgc2VlZCBmb3IgdGhlIGNvaW5cbiAgICogSW4gQWxnb3JhbmQsIHdoZW4gdGhlIHByaXZhdGUga2V5IGlzIGVuY29kZWQgYXMgYmFzZTMyIHN0cmluZyBvbmx5IHRoZSBmaXJzdCAzMiBieXRlcyBhcmUgdGFrZW4sXG4gICAqIHNvIHRoZSBlbmNvZGVkIHZhbHVlIGlzIGFjdHVhbGx5IHRoZSBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcnYgdGhlIHBydiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQcnYocHJ2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQWxnb0xpYi5hbGdvVXRpbHMuaXNWYWxpZFNlZWQocHJ2KSB8fCBBbGdvTGliLmFsZ29VdGlscy5pc1ZhbGlkUHJpdmF0ZUtleShwcnYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pblxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzcyB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFsZ29MaWIuYWxnb1V0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gbWVzc2FnZSB3aXRoIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogS2V5UGFpciwgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCBhbGdvS2V5cGFpciA9IG5ldyBBbGdvTGliLktleVBhaXIoeyBwcnY6IGtleS5wcnYgfSk7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihtZXNzYWdlKSkge1xuICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYWxnb0tleXBhaXIuc2lnbk1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGF0IGtleSB3ZSB3aWxsIG5lZWQgZm9yIHNpZ25pbmdgIC0gQWxnb3JhbmQgbmVlZHMgdGhlIGJhY2t1cCwgYml0Z28gcHVicy5cbiAgICovXG4gIGtleUlkc0ZvclNpZ25pbmcoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT107XG4gIH1cblxuICBnZXRUb2tlbk5hbWVCeUlkKHRva2VuSWQ6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdG9rZW5OYW1lcyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4gY29pbi5mYW1pbHkgPT09ICdhbGdvJyAmJiBjb2luLmlzVG9rZW4pLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUhKTtcbiAgICByZXR1cm4gdG9rZW5OYW1lcy5maW5kKCh0b2tlbk5hbWUpID0+IHRva2VuTmFtZS5zcGxpdCgnLScpWzFdID09PSBgJHt0b2tlbklkfWApIHx8ICdBbGdvVG9rZW4gdW5rbm93bic7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbi9wYXJzZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxBbGdvVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4SGV4IHx8IChwYXJhbXMuaGFsZlNpZ25lZCAmJiBwYXJhbXMuaGFsZlNpZ25lZC50eEhleCk7XG4gICAgaWYgKCF0eEhleCB8fCAhcGFyYW1zLmZlZUluZm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBleHBsYWluIHR4IHBhcmFtZXRlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyKCk7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBpZiAodHgudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0eEpzb24udG8sXG4gICAgICAgICAgYW1vdW50OiB0eEpzb24uYW1vdW50LFxuICAgICAgICAgIG1lbW86IHR4SnNvbi5ub3RlLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IFRyYW5zYWN0aW9uT3BlcmF0aW9uW10gPSBbXTtcblxuICAgICAgY29uc3QgaXNUb2tlblR4ID0gdGhpcy5pc1Rva2VuVHgodHhKc29uLnR5cGUpO1xuICAgICAgaWYgKGlzVG9rZW5UeCkge1xuICAgICAgICBjb25zdCB0eXBlID0gQWxnb0xpYi5hbGdvVXRpbHMuZ2V0VG9rZW5UeFR5cGUodHhKc29uLmFtb3VudCwgdHhKc29uLmZyb20sIHR4SnNvbi50bywgdHhKc29uLmNsb3NlUmVtYWluZGVyVG8pO1xuICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgY29pbjogdGhpcy5nZXRUb2tlbk5hbWVCeUlkKHR4SnNvbi50b2tlbklkKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgJ2ZlZScsXG4gICAgICAgICdtZW1vJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAnb3BlcmF0aW9ucycsXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHBsYW5hdGlvblJlc3VsdDogQWxnb1RyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSB7XG4gICAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgICAgaWQ6IHR4SnNvbi5pZCxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0eEpzb24uYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB0eEpzb24uZmVlLFxuICAgICAgICBtZW1vOiB0eEpzb24ubm90ZSxcbiAgICAgICAgdHlwZTogdHgudHlwZS50b1N0cmluZygpLFxuICAgICAgICBvcGVyYXRpb25zLFxuICAgICAgfTtcblxuICAgICAgaWYgKHR4SnNvbi50b2tlbklkKSB7XG4gICAgICAgIGV4cGxhbmF0aW9uUmVzdWx0LnRva2VuSWQgPSB0eEpzb24udG9rZW5JZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4cGxhbmF0aW9uUmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0eC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2ZlZScsXG4gICAgICAgICdtZW1vJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAndm90ZUtleScsXG4gICAgICAgICdzZWxlY3Rpb25LZXknLFxuICAgICAgICAndm90ZUZpcnN0JyxcbiAgICAgICAgJ3ZvdGVMYXN0JyxcbiAgICAgICAgJ3ZvdGVLZXlEaWx1dGlvbicsXG4gICAgICBdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHR4SnNvbi5mZWUsXG4gICAgICAgIG1lbW86IHR4SnNvbi5ub3RlLFxuICAgICAgICB0eXBlOiB0eC50eXBlLFxuICAgICAgICB2b3RlS2V5OiB0eEpzb24udm90ZUtleSxcbiAgICAgICAgc2VsZWN0aW9uS2V5OiB0eEpzb24uc2VsZWN0aW9uS2V5LFxuICAgICAgICB2b3RlRmlyc3Q6IHR4SnNvbi52b3RlRmlyc3QsXG4gICAgICAgIHZvdGVMYXN0OiB0eEpzb24udm90ZUxhc3QsXG4gICAgICAgIHZvdGVLZXlEaWx1dGlvbjogdHhKc29uLnZvdGVLZXlEaWx1dGlvbixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgaWYgYSB0eCBpcyBhIHRva2VuIHR4XG4gICAqIEBwYXJhbSB0eXBlIHtzdHJpbmd9IC0gdHggdHlwZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0J3MgYSB0b2tlbiB0eFxuICAgKi9cbiAgaXNUb2tlblR4KHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlID09PSAnYXhmZXInO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc2VlZCBpcyBhIHZhbGlkIHN0ZWxsYXIgc2VlZFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VlZCB0aGUgc2VlZCB0byBjaGVja1xuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgYSBTdGVsbGFyIHNlZWRcbiAgICovXG4gIGlzU3RlbGxhclNlZWQoc2VlZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFNlZWRWYWxpZGF0b3IuaXNWYWxpZEVkMjU1MTlTZWVkRm9yQ29pbihzZWVkLCBDb2luRmFtaWx5LlhMTSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHN0ZWxsYXIgc2VlZCB0byBhbiBhbGdvIHNlZWRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlZWQgdGhlIHNlZWQgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbiB8IG51bGx9IHNlZWQgaW4gYWxnbyBlbmNvZGluZ1xuICAgKi9cbiAgY29udmVydEZyb21TdGVsbGFyU2VlZChzZWVkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBhc3N1bWUgdGhpcyBpcyBhIHRydXN0IGN1c3RvZGlhbCBzZWVkIGlmIGl0cyBhIHZhbGlkIGVkMjU1MTkgcHJ2XG4gICAgaWYgKCF0aGlzLmlzU3RlbGxhclNlZWQoc2VlZCkgfHwgU2VlZFZhbGlkYXRvci5oYXNDb21wZXRpbmdTZWVkRm9ybWF0cyhzZWVkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKFNlZWRWYWxpZGF0b3IuaXNWYWxpZEVkMjU1MTlTZWVkRm9yQ29pbihzZWVkLCBDb2luRmFtaWx5LlhMTSkpIHtcbiAgICAgIHJldHVybiBBbGdvTGliLmFsZ29VdGlscy5jb252ZXJ0RnJvbVN0ZWxsYXJTZWVkKHNlZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmVyaWZ5U2lnblRyYW5zYWN0aW9uUGFyYW1zKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFZlcmlmaWVkVHJhbnNhY3Rpb25QYXJhbWV0ZXJzIHtcbiAgICBjb25zdCBwcnYgPSBwYXJhbXMucHJ2O1xuICAgIGNvbnN0IGFkZHJlc3NWZXJzaW9uID0gcGFyYW1zLnR4UHJlYnVpbGQuYWRkcmVzc1ZlcnNpb247XG4gICAgbGV0IGlzSGFsZlNpZ25lZCA9IGZhbHNlO1xuXG4gICAgLy8gaXQncyBwb3NzaWJsZSB0aGlzIHR4IHdhcyBhbHJlYWR5IHNpZ25lZCAtIHRha2UgdGhlIGhhbGZTaWduZWRcbiAgICAvLyB0eEhleCBpZiBpdCBpc1xuICAgIGxldCB0eEhleCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4O1xuICAgIGlmIChwYXJhbXMudHhQcmVidWlsZC5oYWxmU2lnbmVkKSB7XG4gICAgICBpc0hhbGZTaWduZWQgPSB0cnVlO1xuICAgICAgdHhIZXggPSBwYXJhbXMudHhQcmVidWlsZC5oYWxmU2lnbmVkLnR4SGV4O1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgdHlwZSAke3R5cGVvZiB0eEhleH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHJ2IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcHJ2IG11c3QgYmUgYSBzdHJpbmcsIGdvdCB0eXBlICR7dHlwZW9mIHBydn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKHBhcmFtcy50eFByZWJ1aWxkLCAna2V5cycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHVibGljIGtleXMgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOdW1iZXIoYWRkcmVzc1ZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYWRkcmVzc1ZlcnNpb24gcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZXJzID0gcGFyYW1zLnR4UHJlYnVpbGQua2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgLy8gaWYgd2UgYXJlIHJlY2VpdmluZyBhZGRyZXNzZXMgZG8gbm90IHRyeSB0byBjb252ZXJ0IHRoZW1cbiAgICAgIGlmICghQWxnb0xpYi5hbGdvVXRpbHMuaXNWYWxpZEFkZHJlc3Moa2V5KSkge1xuICAgICAgICByZXR1cm4gQWxnb0xpYi5hbGdvVXRpbHMucHVibGljS2V5VG9BbGdvQWRkcmVzcyhBbGdvTGliLmFsZ29VdGlscy50b1VpbnQ4QXJyYXkoa2V5KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH0pO1xuICAgIC8vIFRPRE8oaHR0cHM6Ly9iaXRnb2luYy5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9TVExYLTYwNjcpOiBmaXggdGhlIG51bWJlciBvZiBzaWduZXJzIHVzaW5nXG4gICAgLy8gc2hvdWxkIGJlIHNpbWlsYXIgdG8gb3RoZXIgY29pbnMgaW1wbGVtZW50YXRpb25cbiAgICAvLyBJZiB3ZSBoYXZlIGEgbnVtYmVyIHdpdGggZGlnaXRzIHRvIGVsaW1pbmF0ZSB0aGVtIHdpdGhvdXQgdGFraW5nIGFueSByb3VuZGluZyBjcml0ZXJpYS5cbiAgICBjb25zdCBudW1iZXJTaWduZXJzID0gTWF0aC50cnVuYyhzaWduZXJzLmxlbmd0aCAvIDIpICsgMTtcbiAgICByZXR1cm4geyB0eEhleCwgYWRkcmVzc1ZlcnNpb24sIHNpZ25lcnMsIHBydiwgaXNIYWxmU2lnbmVkLCBudW1iZXJTaWduZXJzIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZCB7VHJhbnNhY3Rpb25QcmVidWlsZH0gcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHBsYXRmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHtTdHJpbmd9IHVzZXIgcHJ2XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB0eEhleCwgc2lnbmVycywgcHJ2LCBpc0hhbGZTaWduZWQsIG51bWJlclNpZ25lcnMgfSA9IHRoaXMudmVyaWZ5U2lnblRyYW5zYWN0aW9uUGFyYW1zKHBhcmFtcyk7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgdHhCdWlsZGVyLm51bWJlck9mUmVxdWlyZWRTaWduZXJzKG51bWJlclNpZ25lcnMpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBwcnYgfSk7XG4gICAgdHhCdWlsZGVyLnNldFNpZ25lcnMoc2lnbmVycyk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVkVHhIZXggPSBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgaWYgKG51bWJlclNpZ25lcnMgPT09IDEpIHtcbiAgICAgIHJldHVybiB7IHR4SGV4OiBzaWduZWRUeEhleCB9O1xuICAgIH0gZWxzZSBpZiAoaXNIYWxmU2lnbmVkKSB7XG4gICAgICByZXR1cm4geyB0eEhleDogc2lnbmVkVHhIZXggfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgaGFsZlNpZ25lZDogeyB0eEhleDogc2lnbmVkVHhIZXggfSB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWRkcmVzcyBjYW4gYmUgdXNlZCB0byBzZW5kIGZ1bmRzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWlucyBwdWJsaWMga2V5cyB0byBnZW5lcmF0ZSB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBbGdvQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7XG4gICAgICBhZGRyZXNzLFxuICAgICAga2V5Y2hhaW5zLFxuICAgICAgY29pblNwZWNpZmljOiB7IGJpdGdvUHViS2V5IH0sXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0aXZlS2V5Y2hhaW4gPSBiaXRnb1B1YktleSA/IGtleWNoYWlucy5zbGljZSgwLCAtMSkuY29uY2F0KFt7IHB1YjogYml0Z29QdWJLZXkgfV0pIDoga2V5Y2hhaW5zO1xuICAgIGNvbnN0IHB1YktleXMgPSBlZmZlY3RpdmVLZXljaGFpbi5tYXAoKGtleSkgPT4gdGhpcy5zdGVsbGFyQWRkcmVzc1RvQWxnb0FkZHJlc3Moa2V5LnB1YikpO1xuXG4gICAgaWYgKCFwdWJLZXlzLmV2ZXJ5KChwdWJLZXkpID0+IHRoaXMuaXNWYWxpZFB1YihwdWJLZXkpKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXkoJ2ludmFsaWQgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gQWxnb0xpYi5hbGdvVXRpbHMubXVsdGlzaWdBZGRyZXNzKFNVUFBPUlRFRF9BRERSRVNTX1ZFUlNJT04sIE1TSUdfVEhSRVNIT0xELCBwdWJLZXlzKTtcblxuICAgIHJldHVybiByb290QWRkcmVzcyA9PT0gYWRkcmVzcztcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSA9IHBhcmFtcztcblxuICAgIGlmICghdHhQYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBpc1Rva2VuRW5hYmxlbWVudFR4ID0gdHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJztcblxuICAgIC8vIFZhbGlkYXRlIGJhc2VkIG9uIEFsZ29yYW5kIHRyYW5zYWN0aW9uIHR5cGVcbiAgICBpZiAoaXNUb2tlbkVuYWJsZW1lbnRUeCAmJiB2ZXJpZmljYXRpb24/LnZlcmlmeVRva2VuRW5hYmxlbWVudCkge1xuICAgICAgLy8gVmFsaWRhdGUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgICAgdGhpcy52YWxpZGF0ZVRva2VuRW5hYmxlbWVudFRyYW5zYWN0aW9uKHR4SnNvbiwgdHhQYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHR4SnNvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BheSc6XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVBheVRyYW5zYWN0aW9uKHR4SnNvbiwgdHhQYXJhbXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdheGZlcic6XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbih0eEpzb24sIHR4UGFyYW1zKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBGb3Igb3RoZXIgdHJhbnNhY3Rpb24gdHlwZXMsIHBlcmZvcm0gYmFzaWMgdmFsaWRhdGlvblxuICAgICAgICAgIHRoaXMudmFsaWRhdGVCYXNpY1RyYW5zYWN0aW9uKHR4SnNvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIHNlbmQgdG8gYmFzZSBhZGRyZXNzXG4gICAgaWYgKHZlcmlmaWNhdGlvbj8uY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3MpIHtcbiAgICAgIGlmICghd2FsbGV0Py5jb2luU3BlY2lmaWMoKT8ucm9vdEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGV0ZXJtaW5lIGJhc2UgYWRkcmVzcyBmb3IgY29uc29saWRhdGlvbicpO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB3YWxsZXQuY29pblNwZWNpZmljKCk/LnJvb3RBZGRyZXNzIGFzIHN0cmluZztcblxuICAgICAgLy8gVmVyaWZ5IHRoZSB0cmFuc2FjdGlvbiByZWNpcGllbnQgbWF0Y2hlcyB0aGUgcm9vdEFkZHJlc3NcbiAgICAgIGlmICghdHhKc29uLnRvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaXMgbWlzc2luZyByZWNpcGllbnQgYWRkcmVzcycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHhKc29uLnRvICE9PSByb290QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgVHhJbnRlbnRNaXNtYXRjaEVycm9yKFxuICAgICAgICAgICdDb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uIHJlY2lwaWVudCBkb2VzIG5vdCBtYXRjaCB3YWxsZXQgYmFzZSBhZGRyZXNzJyxcbiAgICAgICAgICB0eEpzb24udG8sXG4gICAgICAgICAgW3R4UGFyYW1zXSxcbiAgICAgICAgICB0eEpzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBiYXNpYyB0cmFuc2FjdGlvbiBmaWVsZHMgY29tbW9uIHRvIGFsbCB0cmFuc2FjdGlvbiB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUJhc2ljVHJhbnNhY3Rpb24odHhKc29uOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXR4SnNvbi5mcm9tKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgc2VuZGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4SnNvbi5mZWUgfHwgdHhKc29uLmZlZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogaW52YWxpZCBmZWUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgUGF5bWVudCAocGF5KSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBheVRyYW5zYWN0aW9uKHR4SnNvbjogYW55LCB0eFBhcmFtczogYW55KTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUJhc2ljVHJhbnNhY3Rpb24odHhKc29uKTtcblxuICAgIGlmICghdHhKc29uLnRvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgcmVjaXBpZW50IGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAodHhKc29uLmFtb3VudCA9PT0gdW5kZWZpbmVkIHx8IHR4SnNvbi5hbW91bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmVjaXBpZW50cyBpZiBwcm92aWRlZCBpbiB0eFBhcmFtc1xuICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWxnb3JhbmQgdHJhbnNhY3Rpb25zIGNhbiBvbmx5IGhhdmUgb25lIHJlY2lwaWVudCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZFJlY2lwaWVudCA9IHR4UGFyYW1zLnJlY2lwaWVudHNbMF07XG4gICAgICBjb25zdCBleHBlY3RlZEFtb3VudCA9IGV4cGVjdGVkUmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gZXhwZWN0ZWRSZWNpcGllbnQuYWRkcmVzcztcbiAgICAgIGNvbnN0IGFjdHVhbEFtb3VudCA9IHR4SnNvbi5hbW91bnQudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGFjdHVhbEFkZHJlc3MgPSB0eEpzb24udG87XG5cbiAgICAgIGlmIChleHBlY3RlZEFtb3VudCAhPT0gYWN0dWFsQW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gYW1vdW50IGluIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIGdpdmVuIGJ5IGNsaWVudCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhwZWN0ZWRBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IGFjdHVhbEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBBc3NldCBUcmFuc2ZlciAoYXhmZXIpIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKHR4SnNvbjogYW55LCB0eFBhcmFtczogYW55KTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUJhc2ljVHJhbnNhY3Rpb24odHhKc29uKTtcblxuICAgIC8vIEJhc2ljIGFtb3VudCB2YWxpZGF0aW9uIGlmIHByZXNlbnRcbiAgICBpZiAodHhKc29uLmFtb3VudCAhPT0gdW5kZWZpbmVkICYmIHR4SnNvbi5hbW91bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXNzZXQgdHJhbnNmZXIgdHJhbnNhY3Rpb246IGludmFsaWQgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCB0b2tlbiBJRCBmcm9tIHRva2VuIG5hbWVcbiAgICogVG9rZW4gbmFtZXMgYXJlIGluIGZvcm1hdCBsaWtlIFwidGFsZ286SlBULTE2MjA4NTQ0NlwiIHdoZXJlIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGxhc3QgaHlwaGVuIGlzIHRoZSB0b2tlbiBJRFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0VG9rZW5JZEZyb21OYW1lKHRva2VuTmFtZTogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgLy8gSGFuZGxlIGZvcm1hdCBsaWtlIFwidGFsZ286SlBULTE2MjA4NTQ0NlwiIG9yIFwiYWxnbzpUT0tFTi0xMjM0NTZcIlxuICAgIGNvbnN0IHBhcnRzID0gdG9rZW5OYW1lLnNwbGl0KCc6Jyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgcGFydCBhZnRlciBjb2xvbiAoZS5nLiwgXCJKUFQtMTYyMDg1NDQ2XCIpXG4gICAgY29uc3QgdG9rZW5QYXJ0ID0gcGFydHNbMV07XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGxhc3QgaHlwaGVuXG4gICAgY29uc3QgbGFzdEh5cGhlbkluZGV4ID0gdG9rZW5QYXJ0Lmxhc3RJbmRleE9mKCctJyk7XG4gICAgaWYgKGxhc3RIeXBoZW5JbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuSWRTdHIgPSB0b2tlblBhcnQuc3Vic3RyaW5nKGxhc3RIeXBoZW5JbmRleCArIDEpO1xuICAgIGNvbnN0IHRva2VuSWQgPSBwYXJzZUludCh0b2tlbklkU3RyLCAxMCk7XG5cbiAgICByZXR1cm4gaXNOYU4odG9rZW5JZCkgPyBudWxsIDogdG9rZW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBUb2tlbiBFbmFibGVtZW50IChvcHQtaW4pIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVG9rZW5FbmFibGVtZW50VHJhbnNhY3Rpb24odHhKc29uOiBhbnksIHR4UGFyYW1zOiBhbnkpOiBib29sZWFuIHtcbiAgICB0aGlzLnZhbGlkYXRlQmFzaWNUcmFuc2FjdGlvbih0eEpzb24pO1xuXG4gICAgLy8gVmVyaWZ5IGl0J3MgYW4gYXNzZXQgdHJhbnNmZXIgKGF4ZmVyKSB0cmFuc2FjdGlvblxuICAgIGlmICh0eEpzb24udHlwZSAhPT0gJ2F4ZmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb246IG11c3QgYmUgb2YgdHlwZSBheGZlcicpO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSBhbW91bnQgaXMgMCAodG9rZW4gb3B0LWluIHJlcXVpcmVtZW50KVxuICAgIGlmICh0b051bWJlcih0eEpzb24uYW1vdW50KSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb246IGFtb3VudCBtdXN0IGJlIDAgZm9yIHRva2VuIG9wdC1pbicpO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSBzZW5kZXIgYW5kIHJlY2lwaWVudCBhcmUgdGhlIHNhbWUgKHNlbGYtdHJhbnNhY3Rpb24pXG4gICAgaWYgKCF0eEpzb24uZnJvbSB8fCAhdHhKc29uLnRvIHx8IHR4SnNvbi5mcm9tICE9PSB0eEpzb24udG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uOiBzZW5kZXIgYW5kIHJlY2lwaWVudCBtdXN0IGJlIHRoZSBzYW1lIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdG9rZW4gSUQgaXMgcHJlc2VudFxuICAgIGlmICghdHhKc29uLnRva2VuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uOiBtaXNzaW5nIHRva2VuIElEJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdHhQYXJhbXMgc3BlY2lmaWVzIHRva2VuIGluZm9ybWF0aW9uLCB2ZXJpZnkgdGhlIHRva2VuIElEIG1hdGNoZXNcbiAgICBsZXQgZXhwZWN0ZWRUb2tlbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIENoZWNrIGZvciBlbmFibGVUb2tlbnMgYXJyYXkgKHVzZWQgaW4gVFNTIHdhbGxldHMpXG4gICAgaWYgKHR4UGFyYW1zLmVuYWJsZVRva2VucyAmJiBBcnJheS5pc0FycmF5KHR4UGFyYW1zLmVuYWJsZVRva2VucykgJiYgdHhQYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRva2VuTmFtZSA9IHR4UGFyYW1zLmVuYWJsZVRva2Vuc1swXS5uYW1lO1xuICAgICAgaWYgKHRva2VuTmFtZSkge1xuICAgICAgICBleHBlY3RlZFRva2VuSWQgPSB0aGlzLmV4dHJhY3RUb2tlbklkRnJvbU5hbWUodG9rZW5OYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIHJlY2lwaWVudHMgYXJyYXkgd2l0aCB0b2tlbk5hbWUgKHVzZWQgaW4gbm9uLVRTUyB3YWxsZXRzKVxuICAgIGVsc2UgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgJiYgQXJyYXkuaXNBcnJheSh0eFBhcmFtcy5yZWNpcGllbnRzKSAmJiB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHR4UGFyYW1zLnJlY2lwaWVudHNbMF07XG4gICAgICBpZiAocmVjaXBpZW50LnRva2VuTmFtZSkge1xuICAgICAgICBleHBlY3RlZFRva2VuSWQgPSB0aGlzLmV4dHJhY3RUb2tlbklkRnJvbU5hbWUocmVjaXBpZW50LnRva2VuTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRoZSB0b2tlbiBJRCBtYXRjaGVzIGlmIHdlIGhhdmUgYW4gZXhwZWN0ZWQgdmFsdWVcbiAgICBpZiAoZXhwZWN0ZWRUb2tlbklkICE9PSBudWxsICYmIHR4SnNvbi50b2tlbklkICE9PSBleHBlY3RlZFRva2VuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRva2VuIGVuYWJsZW1lbnQgdmVyaWZpY2F0aW9uIGZhaWxlZDogZXhwZWN0ZWQgdG9rZW4gSUQgJHtleHBlY3RlZFRva2VuSWR9IGJ1dCB0cmFuc2FjdGlvbiBoYXMgdG9rZW4gSUQgJHt0eEpzb24udG9rZW5JZH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGVjb2RlVHgodHhuOiBCdWZmZXIpOiB1bmtub3duIHtcbiAgICByZXR1cm4gQWxnb0xpYi5hbGdvVXRpbHMuZGVjb2RlQWxnb1R4bih0eG4pO1xuICB9XG5cbiAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkocHViS2V5OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gQWxnb0xpYi5hbGdvVXRpbHMucHVibGljS2V5VG9BbGdvQWRkcmVzcyhwdWJLZXkpO1xuICB9XG5cbiAgc3VwcG9ydHNEZXJpdmVLZXlXaXRoU2VlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbmZpZyBmb3IgaG93IHRva2VuIGVuYWJsZW1lbnRzIHdvcmsgZm9yIHRoaXMgY29pblxuICAgKiBAcmV0dXJuc1xuICAgKiAgICByZXF1aXJlc1Rva2VuRW5hYmxlbWVudDogVHJ1ZSBpZiB0b2tlbnMgbmVlZCB0byBiZSBlbmFibGVkIGZvciB0aGlzIGNvaW5cbiAgICogICAgc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHM6IFRydWUgaWYgbXVsdGlwbGUgdG9rZW5zIGNhbiBiZSBlbmFibGVkIGluIG9uZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1aXJlc1Rva2VuRW5hYmxlbWVudDogdHJ1ZSxcbiAgICAgIHN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJhbGFuY2Ugb2YgdGhlIHJvb3QgYWRkcmVzcyBpbiBiYXNlIHVuaXRzIG9mIGFsZ29cbiAgICogRWcuIElmIGJhbGFuY2UgaXMgMSBBbGdvLCB0aGlzIHJldHVybnMgMSoxMF42XG4gICAqIEBwYXJhbSByb290QWRkcmVzc1xuICAgKiBAcGFyYW0gY2xpZW50XG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50QmFsYW5jZShyb290QWRkcmVzczogc3RyaW5nLCBjbGllbnQ6IGFsZ29zZGsuQWxnb2R2Mik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgYWNjb3VudEluZm9ybWF0aW9uID0gYXdhaXQgY2xpZW50LmFjY291bnRJbmZvcm1hdGlvbihyb290QWRkcmVzcykuZG8oKTtcbiAgICAvLyBFeHRyYWN0IHRoZSBiYWxhbmNlIGZyb20gdGhlIGFjY291bnQgaW5mb3JtYXRpb25cbiAgICByZXR1cm4gYWNjb3VudEluZm9ybWF0aW9uLmFtb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBbGdvIGNsaWVudCBmb3IgdGhlIGdpdmVuIHRva2VuLCBiYXNlU2VydmVyIGFuZCBwb3J0XG4gICAqIFVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgQWxnbyBuZXR3b3JrXG4gICAqL1xuICBnZXRDbGllbnQodG9rZW46IHN0cmluZywgYmFzZVNlcnZlcjogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBhbGdvc2RrLkFsZ29kdjIge1xuICAgIHJldHVybiBuZXcgYWxnb3Nkay5BbGdvZHYyKHRva2VuLCBiYXNlU2VydmVyLCBwb3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxSZWNvdmVyeUluZm8gfCBPZmZsaW5lVmF1bHRUeEluZm8+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSB0aGlzLmlzVmFsaWRQdWIocGFyYW1zLnVzZXJLZXkpICYmIHRoaXMuaXNWYWxpZFB1YihwYXJhbXMuYmFja3VwS2V5KTtcblxuICAgIGlmICghcGFyYW1zLm5vZGVQYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgdGhlIGRldGFpbHMgb2YgYW4gQUxHTyBub2RlIHRvIHVzZSBmb3IgcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcm9vdCBhZGRyZXNzXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yb290QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByb290QWRkcmVzcywgZ290OiAnICsgcGFyYW1zLnJvb3RBZGRyZXNzKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uLCBnb3Q6ICcgKyBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5maXJzdFJvdW5kICYmIG5ldyBCaWdOdW1iZXIocGFyYW1zLmZpcnN0Um91bmQpLmlzTmVnYXRpdmUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaXJzdCByb3VuZCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuZXNpc0lkID0gdGhpcy5iaXRnby5nZXRFbnYoKSA9PT0gJ3Byb2QnID8gTUFJTk5FVF9HRU5FU0lTX0lEIDogVEVTVE5FVF9HRU5FU0lTX0lEO1xuICAgIGNvbnN0IGdlbmVzaXNIYXNoID0gdGhpcy5iaXRnby5nZXRFbnYoKSA9PT0gJ3Byb2QnID8gTUFJTk5FVF9HRU5FU0lTX0hBU0ggOiBURVNUTkVUX0dFTkVTSVNfSEFTSDtcblxuICAgIFV0aWxzLnZhbGlkYXRlQmFzZTY0KGdlbmVzaXNIYXNoKTtcblxuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwICYmICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciBub24tYml0Z28gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEFsZ29MaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ2FsZ28nKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgIGxldCB1c2VyUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJhY2t1cFBydjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBpZiAoIXBhcmFtcy5iaXRnb0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JpdGdvIHB1YmxpYyBrZXkgZnJvbSB0aGUga2V5Q2FyZCBpcyByZXF1aXJlZCBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5Jyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHBhcmFtcy51c2VyS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICAgIGJhY2t1cFBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBwYXJhbXMuYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICAgIGNvbnN0IHVzZXJLZXlBZGRyZXNzID0gVXRpbHMucHJpdmF0ZUtleVRvQWxnb0FkZHJlc3ModXNlclBydik7XG4gICAgICAgIGNvbnN0IGJhY2t1cEtleUFkZHJlc3MgPSBVdGlscy5wcml2YXRlS2V5VG9BbGdvQWRkcmVzcyhiYWNrdXBQcnYpO1xuICAgICAgICB0eEJ1aWxkZXIubnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoMikuc2V0U2lnbmVycyhbdXNlcktleUFkZHJlc3MsIGJhY2t1cEtleUFkZHJlc3MsIHBhcmFtcy5iaXRnb0tleV0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3VuYWJsZSB0byBkZWNyeXB0IHVzZXJLZXkgb3IgYmFja3VwS2V5IHdpdGggdGhlIHdhbGxldFBhc3NwaHJhc2UgcHJvdmlkZWQsIGdvdCBlcnJvcjogJyArIGUubWVzc2FnZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KHBhcmFtcy5ub2RlUGFyYW1zLnRva2VuLCBwYXJhbXMubm9kZVBhcmFtcy5iYXNlU2VydmVyLCBwYXJhbXMubm9kZVBhcmFtcy5wb3J0KTtcbiAgICBjb25zdCBuYXRpdmVCYWxhbmNlID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50QmFsYW5jZShwYXJhbXMucm9vdEFkZHJlc3MsIGNsaWVudCk7XG5cbiAgICAvLyBBbGdvcmFuZCBhY2NvdW50cyByZXF1aXJlIGEgbWluLiBiYWxhbmNlIG9mIDEgQUxHT1xuICAgIGNvbnN0IE1JTl9NSUNST0FMR09TX0JBTEFOQ0UgPSAxMDAwMDA7XG4gICAgY29uc3Qgc3BlbmRhYmxlQW1vdW50ID0gbmV3IEJpZ051bWJlcihuYXRpdmVCYWxhbmNlKS5taW51cyhwYXJhbXMuZmVlKS5taW51cyhNSU5fTUlDUk9BTEdPU19CQUxBTkNFKS50b051bWJlcigpO1xuXG4gICAgaWYgKG5ldyBCaWdOdW1iZXIoc3BlbmRhYmxlQW1vdW50KS5pc1plcm8oKSB8fCBuZXcgQmlnTnVtYmVyKHNwZW5kYWJsZUFtb3VudCkuaXNMZXNzVGhhbk9yRXF1YWxUbyhwYXJhbXMuZmVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSW5zdWZmaWNpZW50IGJhbGFuY2UgdG8gcmVjb3ZlciwgZ290IGJhbGFuY2U6ICcgK1xuICAgICAgICAgIG5hdGl2ZUJhbGFuY2UgK1xuICAgICAgICAgICcgZmVlOiAnICtcbiAgICAgICAgICBwYXJhbXMuZmVlICtcbiAgICAgICAgICAnIG1pbiBhY2NvdW50IGJhbGFuY2U6ICcgK1xuICAgICAgICAgIE1JTl9NSUNST0FMR09TX0JBTEFOQ0VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGxhdGVzdFJvdW5kOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwYXJhbXMuZmlyc3RSb3VuZCkge1xuICAgICAgbGF0ZXN0Um91bmQgPSBhd2FpdCBjbGllbnRcbiAgICAgICAgLnN0YXR1cygpXG4gICAgICAgIC5kbygpXG4gICAgICAgIC50aGVuKChzdGF0dXMpID0+IHN0YXR1c1snbGFzdC1yb3VuZCddKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFJvdW5kID0gIXBhcmFtcy5maXJzdFJvdW5kID8gbGF0ZXN0Um91bmQgOiBwYXJhbXMuZmlyc3RSb3VuZDtcbiAgICBpZiAoIWZpcnN0Um91bmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZldGNoIHRoZSBsYXRlc3Qgcm91bmQgZnJvbSB0aGUgbm9kZS4gUGxlYXNlIHByb3ZpZGUgdGhlIGZpcnN0Um91bmQgb3IgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgICBjb25zdCBMQVNUX1JPVU5EX0JVRkZFUiA9IDEwMDA7XG4gICAgY29uc3QgbGFzdFJvdW5kID0gZmlyc3RSb3VuZCArIExBU1RfUk9VTkRfQlVGRkVSO1xuXG4gICAgdHhCdWlsZGVyXG4gICAgICAuZmVlKHsgZmVlOiBwYXJhbXMuZmVlLnRvU3RyaW5nKCkgfSlcbiAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgIC5zZW5kZXIoe1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMucm9vdEFkZHJlc3MsXG4gICAgICB9KVxuICAgICAgLnRvKHtcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICB9KVxuICAgICAgLmFtb3VudChzcGVuZGFibGVBbW91bnQpXG4gICAgICAuZ2VuZXNpc0lkKGdlbmVzaXNJZClcbiAgICAgIC5nZW5lc2lzSGFzaChnZW5lc2lzSGFzaClcbiAgICAgIC5maXJzdFJvdW5kKG5ldyBCaWdOdW1iZXIoZmlyc3RSb3VuZCkudG9OdW1iZXIoKSlcbiAgICAgIC5sYXN0Um91bmQobmV3IEJpZ051bWJlcihsYXN0Um91bmQpLnRvTnVtYmVyKCkpO1xuXG4gICAgaWYgKHBhcmFtcy5ub3RlKSB7XG4gICAgICBjb25zdCBub3RlID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocGFyYW1zLm5vdGUsICd1dGYtOCcpKTtcbiAgICAgIHR4QnVpbGRlci5ub3RlKG5vdGUpO1xuICAgIH1cblxuICAgIC8vIENvbGQgd2FsbGV0LCBvZmZsaW5lIHZhdWx0XG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpIGFzIFR4RGF0YTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdHlwZTogdHhKc29uLnR5cGUsXG4gICAgICAgIHVzZXJLZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHBhcmFtcy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBwYXJhbXMuYml0Z29LZXksXG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5yb290QWRkcmVzcyxcbiAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICBmZWVJbmZvOiB0eEpzb24uZmVlLFxuICAgICAgICBhbW91bnQ6IHR4SnNvbi5hbW91bnQgPz8gbmF0aXZlQmFsYW5jZS50b1N0cmluZygpLFxuICAgICAgICBmaXJzdFJvdW5kOiB0eEpzb24uZmlyc3RSb3VuZCxcbiAgICAgICAgbGFzdFJvdW5kOiB0eEpzb24ubGFzdFJvdW5kLFxuICAgICAgICBnZW5lc2lzSWQ6IGdlbmVzaXNJZCxcbiAgICAgICAgZ2VuZXNpc0hhc2g6IGdlbmVzaXNIYXNoLFxuICAgICAgICBub3RlOiB0eEpzb24ubm90ZSA/IEJ1ZmZlci5mcm9tKHR4SnNvbi5ub3RlLmJ1ZmZlcikudG9TdHJpbmcoJ3V0Zi04JykgOiB1bmRlZmluZWQsXG4gICAgICAgIGtleXM6IFtwYXJhbXMudXNlcktleSwgcGFyYW1zLmJhY2t1cEtleSwgcGFyYW1zLmJpdGdvS2V5XSxcbiAgICAgICAgYWRkcmVzc1ZlcnNpb246IDEsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE5vbi1iaXRnbyBSZWNvdmVyeSAoSG90IHdhbGxldHMpXG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHVzZXJQcnYgfSk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGJhY2t1cFBydiB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCkgYXMgVHhEYXRhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4OiBCdWZmZXIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgZmVlOiB0eEpzb24uZmVlLFxuICAgICAgZmlyc3RSb3VuZDogdHhKc29uLmZpcnN0Um91bmQsXG4gICAgICBsYXN0Um91bmQ6IHR4SnNvbi5sYXN0Um91bmQsXG4gICAgICBnZW5lc2lzSWQ6IGdlbmVzaXNJZCxcbiAgICAgIGdlbmVzaXNIYXNoOiBnZW5lc2lzSGFzaCxcbiAgICAgIG5vdGU6IHR4SnNvbi5ub3RlID8gQnVmZmVyLmZyb20odHhKc29uLm5vdGUuYnVmZmVyKS50b1N0cmluZygndXRmLTgnKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSBmdWxseSBzaWduZWQgc2VyaWFsaXplZCBiYXNlNjQgdHJhbnNhY3Rpb24gYW5kIGJyb2FkY2FzdHMgaXQgb24gdGhlIG5ldHdvcmsuXG4gICAqIFVzZXMgdGhlIGV4dGVybmFsIG5vZGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudFxuICAgKiBAcGFyYW0gc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBub2RlUGFyYW1zXG4gICAqL1xuICBhc3luYyBicm9hZGNhc3RUcmFuc2FjdGlvbih7XG4gICAgc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIG5vZGVQYXJhbXMsXG4gIH06IEJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8QmFzZUJyb2FkY2FzdFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKCFub2RlUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIHRoZSBkZXRhaWxzIG9mIHRoZSBhbGdvcmFuZCBub2RlJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEhleCA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGFsZ29UeCA9IFV0aWxzLnRvVWludDhBcnJheSh0eEhleCk7XG4gICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmdldENsaWVudChub2RlUGFyYW1zLnRva2VuLCBub2RlUGFyYW1zLmJhc2VTZXJ2ZXIsIG5vZGVQYXJhbXMucG9ydCk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuc2VuZFJhd1RyYW5zYWN0aW9uKGFsZ29UeCkuZG8oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBicm9hZGNhc3QgdHJhbnNhY3Rpb24sIGVycm9yOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RlbGxhciBhbmQgQWxnb3JhbmQgYm90aCB1c2Uga2V5cyBvbiB0aGUgZWQyNTUxOSBjdXJ2ZSwgYnV0IHVzZSBkaWZmZXJlbnQgZW5jb2RpbmdzLlxuICAgKiBBcyB0aGUgSFNNIGRvZXNuJ3QgaGF2ZSBleHBsaWNpdCBzdXBwb3J0IHRvIGNyZWF0ZSBBbGdvcmFuZCBhZGRyZXNzZXMsIHdlIHVzZSB0aGUgU3RlbGxhclxuICAgKiBrZXlzIGFuZCByZS1lbmNvZGUgdGhlbSB0byB0aGUgQWxnb3JhbmQgZW5jb2RpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBjcmVhdGluZyBBbGdvcmFuZCBjdXN0b2RpYWwgd2FsbGV0cyByZXVzaW5nIFN0ZWxsYXIga2V5cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NPclB1YktleSBhIFN0ZWxsYXIgcHVia2V5IG9yIEFsZ29yYW5kIGFkZHJlc3NcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIHByaXZhdGUgc3RlbGxhckFkZHJlc3NUb0FsZ29BZGRyZXNzKGFkZHJlc3NPclB1YktleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyB3ZSBoYXZlIGFuIEFsZ29yYW5kIGFkZHJlc3NcbiAgICBpZiAodGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzT3JQdWJLZXkpKSB7XG4gICAgICByZXR1cm4gYWRkcmVzc09yUHViS2V5O1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgYSBzdGVsbGFyIGtleVxuICAgIGlmIChzdGVsbGFyLlN0cktleS5pc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShhZGRyZXNzT3JQdWJLZXkpKSB7XG4gICAgICBjb25zdCBzdGVsbGFyUHViID0gc3RlbGxhci5TdHJLZXkuZGVjb2RlRWQyNTUxOVB1YmxpY0tleShhZGRyZXNzT3JQdWJLZXkpO1xuICAgICAgY29uc3QgYWxnb0FkZHJlc3MgPSBBbGdvTGliLmFsZ29VdGlscy5lbmNvZGVBZGRyZXNzKHN0ZWxsYXJQdWIpO1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZEFkZHJlc3MoYWxnb0FkZHJlc3MpKSB7XG4gICAgICAgIHJldHVybiBhbGdvQWRkcmVzcztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCdDYW5ub3QgY29udmVydCBTdGVsbGFyIGFkZHJlc3MgdG8gYW4gQWxnb3JhbmQgYWRkcmVzcyB2aWEgc3RlbGxhciBwdWJrZXkuJyk7XG4gICAgICAvLyB3ZSBoYXZlIGEgcm9vdCBwdWJrZXlcbiAgICB9IGVsc2UgaWYgKEFsZ29MaWIuYWxnb1V0aWxzLmlzVmFsaWRQdWJsaWNLZXkoYWRkcmVzc09yUHViS2V5KSkge1xuICAgICAgY29uc3Qga3AgPSBuZXcgQWxnb0xpYi5LZXlQYWlyKHsgcHViOiBhZGRyZXNzT3JQdWJLZXkgfSk7XG4gICAgICBjb25zdCBhbGdvQWRkcmVzcyA9IGtwLmdldEFkZHJlc3MoKTtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWRBZGRyZXNzKGFsZ29BZGRyZXNzKSkge1xuICAgICAgICByZXR1cm4gYWxnb0FkZHJlc3M7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignSW52YWxpZCByb290IHB1YmtleS4nKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignTmVpdGhlciBhbiBBbGdvcmFuZCBhZGRyZXNzLCBhIHN0ZWxsYXIgcHVia2V5IG9yIGEgcm9vdCBwdWJsaWMga2V5LicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKCk6IEFsZ29MaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBBbGdvTGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleSh7IHB1YmxpY0tleSwgcHJ2LCBtdWx0aVNpZ1R5cGUgfTogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlID09PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aVNpZ1R5cGUnKTtcbiAgICB9XG5cbiAgICBsZXQgYWxnb0tleTtcbiAgICB0cnkge1xuICAgICAgYWxnb0tleSA9IG5ldyBBbGdvTGliLktleVBhaXIoeyBwcnYgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaXZhdGUga2V5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHB1YmxpY0tleSAmJiBwdWJsaWNLZXkgIT09IGFsZ29LZXkuZ2V0S2V5cygpLnB1Yikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn1cbiJdfQ==
|
|
803
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbGdvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsMENBQTRCO0FBQzVCLG1EQUFnRDtBQUNoRCw0Q0FBbUQ7QUFDbkQsK0NBQWlDO0FBQ2pDLDhDQTBCeUI7QUFDekIsOERBQWtDO0FBQ2xDLGdFQUFxQztBQUNyQyx3REFBZ0M7QUFFaEMsaURBQW1DO0FBQ25DLGlFQUtrQztBQUNsQyxtQ0FBZ0M7QUFDaEMsbUNBQWtDO0FBRWxDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWM7QUFpSnhDLE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBSWhDLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBSk4saUJBQVksR0FBd0IsYUFBYSxDQUFDO1FBQ2xELGtCQUFhLEdBQXdCLGNBQWMsQ0FBQztJQUk3RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQjtRQUNwQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsMkJBQTJCO1FBQ3pCLE9BQU8s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QUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsT0FBTztJQUNULENBQUM7Q0FDRjtBQXAzQkQsb0JBbzNCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFNlZWRWYWxpZGF0b3IgfSBmcm9tICcuL3NlZWRWYWxpZGF0b3InO1xuaW1wb3J0IHsgY29pbnMsIENvaW5GYW1pbHkgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBBbGdvTGliIGZyb20gJy4vbGliJztcbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3VsdCxcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgSW52YWxpZEtleSxcbiAgS2V5SW5kaWNlcyxcbiAgS2V5UGFpcixcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVG9rZW5NYW5hZ2VtZW50VHlwZSxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgTm90U3VwcG9ydGVkLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBUeEludGVudE1pc21hdGNoRXJyb3IsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgc3RlbGxhciBmcm9tICdzdGVsbGFyLXNkayc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgVHhEYXRhIH0gZnJvbSAnLi9saWIvaWZhY2VzJztcbmltcG9ydCAqIGFzIGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQge1xuICBNQUlOTkVUX0dFTkVTSVNfSEFTSCxcbiAgTUFJTk5FVF9HRU5FU0lTX0lELFxuICBURVNUTkVUX0dFTkVTSVNfSEFTSCxcbiAgVEVTVE5FVF9HRU5FU0lTX0lELFxufSBmcm9tICcuL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IHRvTnVtYmVyIH0gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgU1VQUE9SVEVEX0FERFJFU1NfVkVSU0lPTiA9IDE7XG5jb25zdCBNU0lHX1RIUkVTSE9MRCA9IDI7IC8vIG0gaW4gbS1vZi1uXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb0FkZHJlc3NDb2luU3BlY2lmaWNzIGV4dGVuZHMgQWRkcmVzc0NvaW5TcGVjaWZpYyB7XG4gIHJvb3RBZGRyZXNzOiBzdHJpbmc7XG4gIGJpdGdvS2V5OiBzdHJpbmc7XG4gIGJpdGdvUHViS2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzVmVyc2lvbjogbnVtYmVyO1xuICB0aHJlc2hvbGQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBbGdvQWRkcmVzc09wdGlvbnMgZXh0ZW5kcyBWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgd2FsbGV0OiBzdHJpbmc7XG4gIGNvaW5TcGVjaWZpYzogQWxnb0FkZHJlc3NDb2luU3BlY2lmaWNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsZ29UcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gIG1lbW8/OiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHZvdGVLZXk/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbktleT86IHN0cmluZztcbiAgdm90ZUZpcnN0PzogbnVtYmVyO1xuICB2b3RlTGFzdD86IG51bWJlcjtcbiAgdm90ZUtleURpbHV0aW9uPzogbnVtYmVyO1xuICB0b2tlbklkPzogbnVtYmVyO1xuICBvcGVyYXRpb25zPzogVHJhbnNhY3Rpb25PcGVyYXRpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbk9wZXJhdGlvbiB7XG4gIHR5cGU6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICBoYWxmU2lnbmVkPzoge1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gIH07XG4gIHR4SW5mbzoge1xuICAgIGZyb206IHN0cmluZztcbiAgICB0bzogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIGZlZTogbnVtYmVyO1xuICAgIGZpcnN0Um91bmQ6IG51bWJlcjtcbiAgICBsYXN0Um91bmQ6IG51bWJlcjtcbiAgICBnZW5lc2lzSUQ6IHN0cmluZztcbiAgICBnZW5lc2lzSGFzaDogc3RyaW5nO1xuICAgIG5vdGU/OiBzdHJpbmc7XG4gIH07XG4gIGtleXM6IHN0cmluZ1tdO1xuICBhZGRyZXNzVmVyc2lvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24ge1xuICB0eEhleDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbGZTaWduZWRUcmFuc2FjdGlvbiB7XG4gIGhhbGZTaWduZWQ6IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRmVlIHtcbiAgZmVlOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eEhleD86IHN0cmluZztcbiAgaGFsZlNpZ25lZD86IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICB9O1xuICBwdWJsaWNLZXlzPzogc3RyaW5nW107XG4gIGZlZUluZm86IFRyYW5zYWN0aW9uRmVlO1xufVxuXG5pbnRlcmZhY2UgTm9kZVBhcmFtcyB7XG4gIHRva2VuOiBzdHJpbmc7XG4gIGJhc2VTZXJ2ZXI6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWVkVHJhbnNhY3Rpb25QYXJhbWV0ZXJzIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgYWRkcmVzc1ZlcnNpb246IG51bWJlcjtcbiAgc2lnbmVyczogc3RyaW5nW107XG4gIHBydjogc3RyaW5nO1xuICBpc0hhbGZTaWduZWQ6IGJvb2xlYW47XG4gIG51bWJlclNpZ25lcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeU9wdGlvbnMge1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICByb290QWRkcmVzczogc3RyaW5nO1xuICByZWNvdmVyeURlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIGJpdGdvS2V5OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGZlZTogbnVtYmVyO1xuICBmaXJzdFJvdW5kPzogbnVtYmVyO1xuICBub3RlPzogc3RyaW5nO1xuICBub2RlUGFyYW1zOiBOb2RlUGFyYW1zO1xufVxuXG5pbnRlcmZhY2UgUmVjb3ZlcnlJbmZvIHtcbiAgaWQ6IHN0cmluZztcbiAgdHg6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBmZWU6IG51bWJlcjtcbiAgZmlyc3RSb3VuZDogbnVtYmVyO1xuICBsYXN0Um91bmQ6IG51bWJlcjtcbiAgZ2VuZXNpc0lkOiBzdHJpbmc7XG4gIGdlbmVzaXNIYXNoOiBzdHJpbmc7XG4gIG5vdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZmbGluZVZhdWx0VHhJbmZvIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG4gIGZlZUluZm86IG51bWJlcjtcbiAgYW1vdW50OiBzdHJpbmc7XG4gIGZpcnN0Um91bmQ6IG51bWJlcjtcbiAgbGFzdFJvdW5kOiBudW1iZXI7XG4gIGdlbmVzaXNJZDogc3RyaW5nO1xuICBnZW5lc2lzSGFzaDogc3RyaW5nO1xuICBub3RlPzogc3RyaW5nO1xuICBhZGRyZXNzVmVyc2lvbjogbnVtYmVyO1xuICBrZXlzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlQnJvYWRjYXN0VHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgbm9kZVBhcmFtczogTm9kZVBhcmFtcztcbn1cblxuZXhwb3J0IGNsYXNzIEFsZ28gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHJlYWRvbmx5IEVOQUJMRV9UT0tFTjogVG9rZW5NYW5hZ2VtZW50VHlwZSA9ICdlbmFibGV0b2tlbic7XG4gIHJlYWRvbmx5IERJU0FCTEVfVE9LRU46IFRva2VuTWFuYWdlbWVudFR5cGUgPSAnZGlzYWJsZXRva2VuJztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UpOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBBbGdvKGJpdGdvKTtcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdhbGdvJztcbiAgfVxuXG4gIGdldEJhc2VDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYWxnbyc7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FsZ28nO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0FsZ29yYW5kJztcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICByZXR1cm4gMWU2O1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgMCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWxnb3JhbmQgc3VwcG9ydHMgYWNjb3VudCBjb25zb2xpZGF0aW9ucy4gVGhlc2UgYXJlIHRyYW5zZmVycyBmcm9tIHRoZSByZWNlaXZlIGFkZHJlc3Nlc1xuICAgKiB0byB0aGUgbWFpbiBhZGRyZXNzLlxuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRkb2MgKi9cbiAgZGVyaXZlS2V5V2l0aFNlZWQoKTogeyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nOyBrZXk6IHN0cmluZyB9IHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdtZXRob2QgZGVyaXZlS2V5V2l0aFNlZWQgbm90IHN1cHBvcnRlZCBmb3IgZWRkc2EgY3VydmUnKTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZG9jICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgQWxnb0xpYi5LZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBBbGdvTGliLktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlQYWlyLmdldEFkZHJlc3MoKSxcbiAgICAgIHBydjogQWxnb0xpYi5hbGdvVXRpbHMuZW5jb2RlU2VlZChCdWZmZXIuZnJvbShrZXlQYWlyLmdldFNpZ25pbmdLZXkoKSkpLFxuICAgIH07XG4gIH1cblxuICAvKiogaW5oZXJpdGRvYyAqL1xuICBnZW5lcmF0ZVJvb3RLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBBbGdvTGliLktleVBhaXIoeyBzZWVkIH0pIDogbmV3IEFsZ29MaWIuS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4geyBwcnY6IGtleXMucHJ2ICsga2V5cy5wdWIsIHB1Yjoga2V5cy5wdWIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWIgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQWxnb0xpYi5hbGdvVXRpbHMuaXNWYWxpZEFkZHJlc3MocHViKSB8fCBBbGdvTGliLmFsZ29VdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHNlZWQgZm9yIHRoZSBjb2luXG4gICAqIEluIEFsZ29yYW5kLCB3aGVuIHRoZSBwcml2YXRlIGtleSBpcyBlbmNvZGVkIGFzIGJhc2UzMiBzdHJpbmcgb25seSB0aGUgZmlyc3QgMzIgYnl0ZXMgYXJlIHRha2VuLFxuICAgKiBzbyB0aGUgZW5jb2RlZCB2YWx1ZSBpcyBhY3R1YWxseSB0aGUgc2VlZFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJ2IHRoZSBwcnYgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFsZ29MaWIuYWxnb1V0aWxzLmlzVmFsaWRTZWVkKHBydikgfHwgQWxnb0xpYi5hbGdvVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkocHJ2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFkZHJlc3MgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBbGdvTGliLmFsZ29VdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIG1lc3NhZ2Ugd2l0aCBwcml2YXRlIGtleVxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShrZXk6IEtleVBhaXIsIG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgYWxnb0tleXBhaXIgPSBuZXcgQWxnb0xpYi5LZXlQYWlyKHsgcHJ2OiBrZXkucHJ2IH0pO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIobWVzc2FnZSkpIHtcbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFsZ29LZXlwYWlyLnNpZ25NZXNzYWdlKG1lc3NhZ2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hhdCBrZXkgd2Ugd2lsbCBuZWVkIGZvciBzaWduaW5nYCAtIEFsZ29yYW5kIG5lZWRzIHRoZSBiYWNrdXAsIGJpdGdvIHB1YnMuXG4gICAqL1xuICBrZXlJZHNGb3JTaWduaW5nKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dO1xuICB9XG5cbiAgZ2V0VG9rZW5OYW1lQnlJZCh0b2tlbklkOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRva2VuTmFtZXMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IGNvaW4uZmFtaWx5ID09PSAnYWxnbycgJiYgY29pbi5pc1Rva2VuKS5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lISk7XG4gICAgcmV0dXJuIHRva2VuTmFtZXMuZmluZCgodG9rZW5OYW1lKSA9PiB0b2tlbk5hbWUuc3BsaXQoJy0nKVsxXSA9PT0gYCR7dG9rZW5JZH1gKSB8fCAnQWxnb1Rva2VuIHVua25vd24nO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4vcGFyc2UgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8QWxnb1RyYW5zYWN0aW9uRXhwbGFuYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB0eEhleCA9IHBhcmFtcy50eEhleCB8fCAocGFyYW1zLmhhbGZTaWduZWQgJiYgcGFyYW1zLmhhbGZTaWduZWQudHhIZXgpO1xuICAgIGlmICghdHhIZXggfHwgIXBhcmFtcy5mZWVJbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgZXhwbGFpbiB0eCBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgaWYgKHR4LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdHhKc29uLnRvLFxuICAgICAgICAgIGFtb3VudDogdHhKc29uLmFtb3VudCxcbiAgICAgICAgICBtZW1vOiB0eEpzb24ubm90ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBvcGVyYXRpb25zOiBUcmFuc2FjdGlvbk9wZXJhdGlvbltdID0gW107XG5cbiAgICAgIGNvbnN0IGlzVG9rZW5UeCA9IHRoaXMuaXNUb2tlblR4KHR4SnNvbi50eXBlKTtcbiAgICAgIGlmIChpc1Rva2VuVHgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IEFsZ29MaWIuYWxnb1V0aWxzLmdldFRva2VuVHhUeXBlKHR4SnNvbi5hbW91bnQsIHR4SnNvbi5mcm9tLCB0eEpzb24udG8sIHR4SnNvbi5jbG9zZVJlbWFpbmRlclRvKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIGNvaW46IHRoaXMuZ2V0VG9rZW5OYW1lQnlJZCh0eEpzb24udG9rZW5JZCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbXG4gICAgICAgICdpZCcsXG4gICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICdmZWUnLFxuICAgICAgICAnbWVtbycsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ29wZXJhdGlvbnMnLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXhwbGFuYXRpb25SZXN1bHQ6IEFsZ29UcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICAgIG91dHB1dEFtb3VudDogdHhKc29uLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGZlZTogdHhKc29uLmZlZSxcbiAgICAgICAgbWVtbzogdHhKc29uLm5vdGUsXG4gICAgICAgIHR5cGU6IHR4LnR5cGUudG9TdHJpbmcoKSxcbiAgICAgICAgb3BlcmF0aW9ucyxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eEpzb24udG9rZW5JZCkge1xuICAgICAgICBleHBsYW5hdGlvblJlc3VsdC50b2tlbklkID0gdHhKc29uLnRva2VuSWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHBsYW5hdGlvblJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodHgudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbXG4gICAgICAgICdpZCcsXG4gICAgICAgICdmZWUnLFxuICAgICAgICAnbWVtbycsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ3ZvdGVLZXknLFxuICAgICAgICAnc2VsZWN0aW9uS2V5JyxcbiAgICAgICAgJ3ZvdGVGaXJzdCcsXG4gICAgICAgICd2b3RlTGFzdCcsXG4gICAgICAgICd2b3RlS2V5RGlsdXRpb24nLFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcwJyxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB0eEpzb24uZmVlLFxuICAgICAgICBtZW1vOiB0eEpzb24ubm90ZSxcbiAgICAgICAgdHlwZTogdHgudHlwZSxcbiAgICAgICAgdm90ZUtleTogdHhKc29uLnZvdGVLZXksXG4gICAgICAgIHNlbGVjdGlvbktleTogdHhKc29uLnNlbGVjdGlvbktleSxcbiAgICAgICAgdm90ZUZpcnN0OiB0eEpzb24udm90ZUZpcnN0LFxuICAgICAgICB2b3RlTGFzdDogdHhKc29uLnZvdGVMYXN0LFxuICAgICAgICB2b3RlS2V5RGlsdXRpb246IHR4SnNvbi52b3RlS2V5RGlsdXRpb24sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGlmIGEgdHggaXMgYSB0b2tlbiB0eFxuICAgKiBAcGFyYW0gdHlwZSB7c3RyaW5nfSAtIHR4IHR5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCdzIGEgdG9rZW4gdHhcbiAgICovXG4gIGlzVG9rZW5UeCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ2F4ZmVyJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHNlZWQgaXMgYSB2YWxpZCBzdGVsbGFyIHNlZWRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlZWQgdGhlIHNlZWQgdG8gY2hlY2tcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGlucHV0IGlzIGEgU3RlbGxhciBzZWVkXG4gICAqL1xuICBpc1N0ZWxsYXJTZWVkKHNlZWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBTZWVkVmFsaWRhdG9yLmlzVmFsaWRFZDI1NTE5U2VlZEZvckNvaW4oc2VlZCwgQ29pbkZhbWlseS5YTE0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBzdGVsbGFyIHNlZWQgdG8gYW4gYWxnbyBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZWVkIHRoZSBzZWVkIHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMge0Jvb2xlYW4gfCBudWxsfSBzZWVkIGluIGFsZ28gZW5jb2RpbmdcbiAgICovXG4gIGNvbnZlcnRGcm9tU3RlbGxhclNlZWQoc2VlZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gYXNzdW1lIHRoaXMgaXMgYSB0cnVzdCBjdXN0b2RpYWwgc2VlZCBpZiBpdHMgYSB2YWxpZCBlZDI1NTE5IHBydlxuICAgIGlmICghdGhpcy5pc1N0ZWxsYXJTZWVkKHNlZWQpIHx8IFNlZWRWYWxpZGF0b3IuaGFzQ29tcGV0aW5nU2VlZEZvcm1hdHMoc2VlZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChTZWVkVmFsaWRhdG9yLmlzVmFsaWRFZDI1NTE5U2VlZEZvckNvaW4oc2VlZCwgQ29pbkZhbWlseS5YTE0pKSB7XG4gICAgICByZXR1cm4gQWxnb0xpYi5hbGdvVXRpbHMuY29udmVydEZyb21TdGVsbGFyU2VlZChzZWVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZlcmlmeVNpZ25UcmFuc2FjdGlvblBhcmFtcyhwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBWZXJpZmllZFRyYW5zYWN0aW9uUGFyYW1ldGVycyB7XG4gICAgY29uc3QgcHJ2ID0gcGFyYW1zLnBydjtcbiAgICBjb25zdCBhZGRyZXNzVmVyc2lvbiA9IHBhcmFtcy50eFByZWJ1aWxkLmFkZHJlc3NWZXJzaW9uO1xuICAgIGxldCBpc0hhbGZTaWduZWQgPSBmYWxzZTtcblxuICAgIC8vIGl0J3MgcG9zc2libGUgdGhpcyB0eCB3YXMgYWxyZWFkeSBzaWduZWQgLSB0YWtlIHRoZSBoYWxmU2lnbmVkXG4gICAgLy8gdHhIZXggaWYgaXQgaXNcbiAgICBsZXQgdHhIZXggPSBwYXJhbXMudHhQcmVidWlsZC50eEhleDtcbiAgICBpZiAocGFyYW1zLnR4UHJlYnVpbGQuaGFsZlNpZ25lZCkge1xuICAgICAgaXNIYWxmU2lnbmVkID0gdHJ1ZTtcbiAgICAgIHR4SGV4ID0gcGFyYW1zLnR4UHJlYnVpbGQuaGFsZlNpZ25lZC50eEhleDtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyh0eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhIZXh9YCk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBydiBwYXJhbWV0ZXIgdG8gc2lnbiB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBydiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgdHlwZSAke3R5cGVvZiBwcnZ9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhwYXJhbXMudHhQcmVidWlsZCwgJ2tleXMnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHB1YmxpYyBrZXlzIHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTnVtYmVyKGFkZHJlc3NWZXJzaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGFkZHJlc3NWZXJzaW9uIHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVycyA9IHBhcmFtcy50eFByZWJ1aWxkLmtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIC8vIGlmIHdlIGFyZSByZWNlaXZpbmcgYWRkcmVzc2VzIGRvIG5vdCB0cnkgdG8gY29udmVydCB0aGVtXG4gICAgICBpZiAoIUFsZ29MaWIuYWxnb1V0aWxzLmlzVmFsaWRBZGRyZXNzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIEFsZ29MaWIuYWxnb1V0aWxzLnB1YmxpY0tleVRvQWxnb0FkZHJlc3MoQWxnb0xpYi5hbGdvVXRpbHMudG9VaW50OEFycmF5KGtleSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleTtcbiAgICB9KTtcbiAgICAvLyBUT0RPKGh0dHBzOi8vYml0Z29pbmMuYXRsYXNzaWFuLm5ldC9icm93c2UvU1RMWC02MDY3KTogZml4IHRoZSBudW1iZXIgb2Ygc2lnbmVycyB1c2luZ1xuICAgIC8vIHNob3VsZCBiZSBzaW1pbGFyIHRvIG90aGVyIGNvaW5zIGltcGxlbWVudGF0aW9uXG4gICAgLy8gSWYgd2UgaGF2ZSBhIG51bWJlciB3aXRoIGRpZ2l0cyB0byBlbGltaW5hdGUgdGhlbSB3aXRob3V0IHRha2luZyBhbnkgcm91bmRpbmcgY3JpdGVyaWEuXG4gICAgY29uc3QgbnVtYmVyU2lnbmVycyA9IE1hdGgudHJ1bmMoc2lnbmVycy5sZW5ndGggLyAyKSArIDE7XG4gICAgcmV0dXJuIHsgdHhIZXgsIGFkZHJlc3NWZXJzaW9uLCBzaWduZXJzLCBwcnYsIGlzSGFsZlNpZ25lZCwgbnVtYmVyU2lnbmVycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQge1RyYW5zYWN0aW9uUHJlYnVpbGR9IHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBwbGF0Zm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiB7U3RyaW5nfSB1c2VyIHBydlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj59XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdHhIZXgsIHNpZ25lcnMsIHBydiwgaXNIYWxmU2lnbmVkLCBudW1iZXJTaWduZXJzIH0gPSB0aGlzLnZlcmlmeVNpZ25UcmFuc2FjdGlvblBhcmFtcyhwYXJhbXMpO1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhIZXgpO1xuICAgIHR4QnVpbGRlci5udW1iZXJPZlJlcXVpcmVkU2lnbmVycyhudW1iZXJTaWduZXJzKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogcHJ2IH0pO1xuICAgIHR4QnVpbGRlci5zZXRTaWduZXJzKHNpZ25lcnMpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lZFR4SGV4ID0gQnVmZmVyLmZyb20odHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGlmIChudW1iZXJTaWduZXJzID09PSAxKSB7XG4gICAgICByZXR1cm4geyB0eEhleDogc2lnbmVkVHhIZXggfTtcbiAgICB9IGVsc2UgaWYgKGlzSGFsZlNpZ25lZCkge1xuICAgICAgcmV0dXJuIHsgdHhIZXg6IHNpZ25lZFR4SGV4IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IGhhbGZTaWduZWQ6IHsgdHhIZXg6IHNpZ25lZFR4SGV4IH0gfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgY2FuIGJlIHVzZWQgdG8gc2VuZCBmdW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgcHVibGljIGtleXMgdG8gZ2VuZXJhdGUgdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWxnb0FkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qge1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGtleWNoYWlucyxcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBiaXRnb1B1YktleSB9LFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGtleWNoYWlucycpO1xuICAgIH1cblxuICAgIGNvbnN0IGVmZmVjdGl2ZUtleWNoYWluID0gYml0Z29QdWJLZXkgPyBrZXljaGFpbnMuc2xpY2UoMCwgLTEpLmNvbmNhdChbeyBwdWI6IGJpdGdvUHViS2V5IH1dKSA6IGtleWNoYWlucztcbiAgICBjb25zdCBwdWJLZXlzID0gZWZmZWN0aXZlS2V5Y2hhaW4ubWFwKChrZXkpID0+IHRoaXMuc3RlbGxhckFkZHJlc3NUb0FsZ29BZGRyZXNzKGtleS5wdWIpKTtcblxuICAgIGlmICghcHViS2V5cy5ldmVyeSgocHViS2V5KSA9PiB0aGlzLmlzVmFsaWRQdWIocHViS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5KCdpbnZhbGlkIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290QWRkcmVzcyA9IEFsZ29MaWIuYWxnb1V0aWxzLm11bHRpc2lnQWRkcmVzcyhTVVBQT1JURURfQUREUkVTU19WRVJTSU9OLCBNU0lHX1RIUkVTSE9MRCwgcHViS2V5cyk7XG5cbiAgICByZXR1cm4gcm9vdEFkZHJlc3MgPT09IGFkZHJlc3M7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdHhQYXJhbXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgaXNUb2tlbkVuYWJsZW1lbnRUeCA9IHR4UGFyYW1zLnR5cGUgPT09ICdlbmFibGV0b2tlbic7XG5cbiAgICAvLyBWYWxpZGF0ZSBiYXNlZCBvbiBBbGdvcmFuZCB0cmFuc2FjdGlvbiB0eXBlXG4gICAgaWYgKGlzVG9rZW5FbmFibGVtZW50VHggJiYgdmVyaWZpY2F0aW9uPy52ZXJpZnlUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25cbiAgICAgIHRoaXMudmFsaWRhdGVUb2tlbkVuYWJsZW1lbnRUcmFuc2FjdGlvbih0eEpzb24sIHR4UGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoICh0eEpzb24udHlwZSkge1xuICAgICAgICBjYXNlICdwYXknOlxuICAgICAgICAgIHRoaXMudmFsaWRhdGVQYXlUcmFuc2FjdGlvbih0eEpzb24sIHR4UGFyYW1zKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXhmZXInOlxuICAgICAgICAgIHRoaXMudmFsaWRhdGVBc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24odHhKc29uLCB0eFBhcmFtcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRm9yIG90aGVyIHRyYW5zYWN0aW9uIHR5cGVzLCBwZXJmb3JtIGJhc2ljIHZhbGlkYXRpb25cbiAgICAgICAgICB0aGlzLnZhbGlkYXRlQmFzaWNUcmFuc2FjdGlvbih0eEpzb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcmlmeSBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBzZW5kIHRvIGJhc2UgYWRkcmVzc1xuICAgIGlmICh2ZXJpZmljYXRpb24/LmNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzKSB7XG4gICAgICBpZiAoIXdhbGxldD8uY29pblNwZWNpZmljKCk/LnJvb3RBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBiYXNlIGFkZHJlc3MgZm9yIGNvbnNvbGlkYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gd2FsbGV0LmNvaW5TcGVjaWZpYygpPy5yb290QWRkcmVzcyBhcyBzdHJpbmc7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gcmVjaXBpZW50IG1hdGNoZXMgdGhlIHJvb3RBZGRyZXNzXG4gICAgICBpZiAoIXR4SnNvbi50bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIG1pc3NpbmcgcmVjaXBpZW50IGFkZHJlc3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR4SnNvbi50byAhPT0gcm9vdEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR4SW50ZW50TWlzbWF0Y2hFcnJvcihcbiAgICAgICAgICAnQ29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggd2FsbGV0IGJhc2UgYWRkcmVzcycsXG4gICAgICAgICAgdHhKc29uLnRvLFxuICAgICAgICAgIFt0eFBhcmFtc10sXG4gICAgICAgICAgdHhKc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYmFzaWMgdHJhbnNhY3Rpb24gZmllbGRzIGNvbW1vbiB0byBhbGwgdHJhbnNhY3Rpb24gdHlwZXNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVCYXNpY1RyYW5zYWN0aW9uKHR4SnNvbjogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0eEpzb24uZnJvbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0eEpzb24uZmVlIHx8IHR4SnNvbi5mZWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgZmVlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIFBheW1lbnQgKHBheSkgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXlUcmFuc2FjdGlvbih0eEpzb246IGFueSwgdHhQYXJhbXM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRoaXMudmFsaWRhdGVCYXNpY1RyYW5zYWN0aW9uKHR4SnNvbik7XG5cbiAgICBpZiAoIXR4SnNvbi50bykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR4SnNvbi5hbW91bnQgPT09IHVuZGVmaW5lZCB8fCB0eEpzb24uYW1vdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBpbnZhbGlkIGFtb3VudCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJlY2lwaWVudHMgaWYgcHJvdmlkZWQgaW4gdHhQYXJhbXNcbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAmJiB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsZ29yYW5kIHRyYW5zYWN0aW9ucyBjYW4gb25seSBoYXZlIG9uZSByZWNpcGllbnQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwZWN0ZWRSZWNpcGllbnQgPSB0eFBhcmFtcy5yZWNpcGllbnRzWzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRBbW91bnQgPSBleHBlY3RlZFJlY2lwaWVudC5hbW91bnQudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IGV4cGVjdGVkUmVjaXBpZW50LmFkZHJlc3M7XG4gICAgICBjb25zdCBhY3R1YWxBbW91bnQgPSB0eEpzb24uYW1vdW50LnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBhY3R1YWxBZGRyZXNzID0gdHhKc29uLnRvO1xuXG4gICAgICBpZiAoZXhwZWN0ZWRBbW91bnQgIT09IGFjdHVhbEFtb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBnaXZlbiBieSBjbGllbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4cGVjdGVkQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBhY3R1YWxBZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXN0aW5hdGlvbiBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgQXNzZXQgVHJhbnNmZXIgKGF4ZmVyKSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbih0eEpzb246IGFueSwgdHhQYXJhbXM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRoaXMudmFsaWRhdGVCYXNpY1RyYW5zYWN0aW9uKHR4SnNvbik7XG5cbiAgICAvLyBCYXNpYyBhbW91bnQgdmFsaWRhdGlvbiBpZiBwcmVzZW50XG4gICAgaWYgKHR4SnNvbi5hbW91bnQgIT09IHVuZGVmaW5lZCAmJiB0eEpzb24uYW1vdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFzc2V0IHRyYW5zZmVyIHRyYW5zYWN0aW9uOiBpbnZhbGlkIGFtb3VudCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgdG9rZW4gSUQgZnJvbSB0b2tlbiBuYW1lXG4gICAqIFRva2VuIG5hbWVzIGFyZSBpbiBmb3JtYXQgbGlrZSBcInRhbGdvOkpQVC0xNjIwODU0NDZcIiB3aGVyZSB0aGUgbnVtYmVyIGFmdGVyIHRoZSBsYXN0IGh5cGhlbiBpcyB0aGUgdG9rZW4gSURcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFRva2VuSWRGcm9tTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIC8vIEhhbmRsZSBmb3JtYXQgbGlrZSBcInRhbGdvOkpQVC0xNjIwODU0NDZcIiBvciBcImFsZ286VE9LRU4tMTIzNDU2XCJcbiAgICBjb25zdCBwYXJ0cyA9IHRva2VuTmFtZS5zcGxpdCgnOicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBhcnQgYWZ0ZXIgY29sb24gKGUuZy4sIFwiSlBULTE2MjA4NTQ0NlwiKVxuICAgIGNvbnN0IHRva2VuUGFydCA9IHBhcnRzWzFdO1xuXG4gICAgLy8gRXh0cmFjdCB0aGUgbnVtYmVyIGFmdGVyIHRoZSBsYXN0IGh5cGhlblxuICAgIGNvbnN0IGxhc3RIeXBoZW5JbmRleCA9IHRva2VuUGFydC5sYXN0SW5kZXhPZignLScpO1xuICAgIGlmIChsYXN0SHlwaGVuSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbklkU3RyID0gdG9rZW5QYXJ0LnN1YnN0cmluZyhsYXN0SHlwaGVuSW5kZXggKyAxKTtcbiAgICBjb25zdCB0b2tlbklkID0gcGFyc2VJbnQodG9rZW5JZFN0ciwgMTApO1xuXG4gICAgcmV0dXJuIGlzTmFOKHRva2VuSWQpID8gbnVsbCA6IHRva2VuSWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVG9rZW4gRW5hYmxlbWVudCAob3B0LWluKSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRva2VuRW5hYmxlbWVudFRyYW5zYWN0aW9uKHR4SnNvbjogYW55LCB0eFBhcmFtczogYW55KTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUJhc2ljVHJhbnNhY3Rpb24odHhKc29uKTtcblxuICAgIC8vIFZlcmlmeSBpdCdzIGFuIGFzc2V0IHRyYW5zZmVyIChheGZlcikgdHJhbnNhY3Rpb25cbiAgICBpZiAodHhKc29uLnR5cGUgIT09ICdheGZlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uOiBtdXN0IGJlIG9mIHR5cGUgYXhmZXInKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgYW1vdW50IGlzIDAgKHRva2VuIG9wdC1pbiByZXF1aXJlbWVudClcbiAgICBpZiAodG9OdW1iZXIodHhKc29uLmFtb3VudCkgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uOiBhbW91bnQgbXVzdCBiZSAwIGZvciB0b2tlbiBvcHQtaW4nKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgc2VuZGVyIGFuZCByZWNpcGllbnQgYXJlIHRoZSBzYW1lIChzZWxmLXRyYW5zYWN0aW9uKVxuICAgIGlmICghdHhKc29uLmZyb20gfHwgIXR4SnNvbi50byB8fCB0eEpzb24uZnJvbSAhPT0gdHhKc29uLnRvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbjogc2VuZGVyIGFuZCByZWNpcGllbnQgbXVzdCBiZSB0aGUgc2FtZSBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRva2VuIElEIGlzIHByZXNlbnRcbiAgICBpZiAoIXR4SnNvbi50b2tlbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbjogbWlzc2luZyB0b2tlbiBJRCcpO1xuICAgIH1cblxuICAgIC8vIElmIHR4UGFyYW1zIHNwZWNpZmllcyB0b2tlbiBpbmZvcm1hdGlvbiwgdmVyaWZ5IHRoZSB0b2tlbiBJRCBtYXRjaGVzXG4gICAgbGV0IGV4cGVjdGVkVG9rZW5JZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBDaGVjayBmb3IgZW5hYmxlVG9rZW5zIGFycmF5ICh1c2VkIGluIFRTUyB3YWxsZXRzKVxuICAgIGlmICh0eFBhcmFtcy5lbmFibGVUb2tlbnMgJiYgQXJyYXkuaXNBcnJheSh0eFBhcmFtcy5lbmFibGVUb2tlbnMpICYmIHR4UGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSB0eFBhcmFtcy5lbmFibGVUb2tlbnNbMF0ubmFtZTtcbiAgICAgIGlmICh0b2tlbk5hbWUpIHtcbiAgICAgICAgZXhwZWN0ZWRUb2tlbklkID0gdGhpcy5leHRyYWN0VG9rZW5JZEZyb21OYW1lKHRva2VuTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciByZWNpcGllbnRzIGFycmF5IHdpdGggdG9rZW5OYW1lICh1c2VkIGluIG5vbi1UU1Mgd2FsbGV0cylcbiAgICBlbHNlIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICYmIEFycmF5LmlzQXJyYXkodHhQYXJhbXMucmVjaXBpZW50cykgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZWNpcGllbnQgPSB0eFBhcmFtcy5yZWNpcGllbnRzWzBdO1xuICAgICAgaWYgKHJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgICAgZXhwZWN0ZWRUb2tlbklkID0gdGhpcy5leHRyYWN0VG9rZW5JZEZyb21OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGUgdG9rZW4gSUQgbWF0Y2hlcyBpZiB3ZSBoYXZlIGFuIGV4cGVjdGVkIHZhbHVlXG4gICAgaWYgKGV4cGVjdGVkVG9rZW5JZCAhPT0gbnVsbCAmJiB0eEpzb24udG9rZW5JZCAhPT0gZXhwZWN0ZWRUb2tlbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUb2tlbiBlbmFibGVtZW50IHZlcmlmaWNhdGlvbiBmYWlsZWQ6IGV4cGVjdGVkIHRva2VuIElEICR7ZXhwZWN0ZWRUb2tlbklkfSBidXQgdHJhbnNhY3Rpb24gaGFzIHRva2VuIElEICR7dHhKc29uLnRva2VuSWR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGRlY29kZVR4KHR4bjogQnVmZmVyKTogdW5rbm93biB7XG4gICAgcmV0dXJuIEFsZ29MaWIuYWxnb1V0aWxzLmRlY29kZUFsZ29UeG4odHhuKTtcbiAgfVxuXG4gIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YktleTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFsZ29MaWIuYWxnb1V0aWxzLnB1YmxpY0tleVRvQWxnb0FkZHJlc3MocHViS2V5KTtcbiAgfVxuXG4gIHN1cHBvcnRzRGVyaXZlS2V5V2l0aFNlZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLm9uY2hhaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb25maWcgZm9yIGhvdyB0b2tlbiBlbmFibGVtZW50cyB3b3JrIGZvciB0aGlzIGNvaW5cbiAgICogQHJldHVybnNcbiAgICogICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IFRydWUgaWYgdG9rZW5zIG5lZWQgdG8gYmUgZW5hYmxlZCBmb3IgdGhpcyBjb2luXG4gICAqICAgIHN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzOiBUcnVlIGlmIG11bHRpcGxlIHRva2VucyBjYW4gYmUgZW5hYmxlZCBpbiBvbmUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGdldFRva2VuRW5hYmxlbWVudENvbmZpZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBiYWxhbmNlIG9mIHRoZSByb290IGFkZHJlc3MgaW4gYmFzZSB1bml0cyBvZiBhbGdvXG4gICAqIEVnLiBJZiBiYWxhbmNlIGlzIDEgQWxnbywgdGhpcyByZXR1cm5zIDEqMTBeNlxuICAgKiBAcGFyYW0gcm9vdEFkZHJlc3NcbiAgICogQHBhcmFtIGNsaWVudFxuICAgKi9cbiAgYXN5bmMgZ2V0QWNjb3VudEJhbGFuY2Uocm9vdEFkZHJlc3M6IHN0cmluZywgY2xpZW50OiBhbGdvc2RrLkFsZ29kdjIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGFjY291bnRJbmZvcm1hdGlvbiA9IGF3YWl0IGNsaWVudC5hY2NvdW50SW5mb3JtYXRpb24ocm9vdEFkZHJlc3MpLmRvKCk7XG4gICAgLy8gRXh0cmFjdCB0aGUgYmFsYW5jZSBmcm9tIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uXG4gICAgcmV0dXJuIGFjY291bnRJbmZvcm1hdGlvbi5hbW91bnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQWxnbyBjbGllbnQgZm9yIHRoZSBnaXZlbiB0b2tlbiwgYmFzZVNlcnZlciBhbmQgcG9ydFxuICAgKiBVc2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEFsZ28gbmV0d29ya1xuICAgKi9cbiAgZ2V0Q2xpZW50KHRva2VuOiBzdHJpbmcsIGJhc2VTZXJ2ZXI6IHN0cmluZywgcG9ydDogbnVtYmVyKTogYWxnb3Nkay5BbGdvZHYyIHtcbiAgICByZXR1cm4gbmV3IGFsZ29zZGsuQWxnb2R2Mih0b2tlbiwgYmFzZVNlcnZlciwgcG9ydCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IFJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8UmVjb3ZlcnlJbmZvIHwgT2ZmbGluZVZhdWx0VHhJbmZvPiB7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gdGhpcy5pc1ZhbGlkUHViKHBhcmFtcy51c2VyS2V5KSAmJiB0aGlzLmlzVmFsaWRQdWIocGFyYW1zLmJhY2t1cEtleSk7XG5cbiAgICBpZiAoIXBhcmFtcy5ub2RlUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIHRoZSBkZXRhaWxzIG9mIGFuIEFMR08gbm9kZSB0byB1c2UgZm9yIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJvb3QgYWRkcmVzc1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucm9vdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcm9vdEFkZHJlc3MsIGdvdDogJyArIHBhcmFtcy5yb290QWRkcmVzcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbiwgZ290OiAnICsgcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmlyc3RSb3VuZCAmJiBuZXcgQmlnTnVtYmVyKHBhcmFtcy5maXJzdFJvdW5kKS5pc05lZ2F0aXZlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmlyc3Qgcm91bmQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSB2YWx1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbmVzaXNJZCA9IHRoaXMuYml0Z28uZ2V0RW52KCkgPT09ICdwcm9kJyA/IE1BSU5ORVRfR0VORVNJU19JRCA6IFRFU1RORVRfR0VORVNJU19JRDtcbiAgICBjb25zdCBnZW5lc2lzSGFzaCA9IHRoaXMuYml0Z28uZ2V0RW52KCkgPT09ICdwcm9kJyA/IE1BSU5ORVRfR0VORVNJU19IQVNIIDogVEVTVE5FVF9HRU5FU0lTX0hBU0g7XG5cbiAgICBVdGlscy52YWxpZGF0ZUJhc2U2NChnZW5lc2lzSGFzaCk7XG5cbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCAmJiAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBpcyByZXF1aXJlZCBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBBbGdvTGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCdhbGdvJykpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICBsZXQgdXNlclBydjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBiYWNrdXBQcnY6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiaXRnbyBwdWJsaWMga2V5IGZyb20gdGhlIGtleUNhcmQgaXMgcmVxdWlyZWQgZm9yIG5vbi1iaXRnbyByZWNvdmVyeScpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdXNlclBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHsgaW5wdXQ6IHBhcmFtcy51c2VyS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICAgIGJhY2t1cFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHsgaW5wdXQ6IHBhcmFtcy5iYWNrdXBLZXksIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgICAgY29uc3QgdXNlcktleUFkZHJlc3MgPSBVdGlscy5wcml2YXRlS2V5VG9BbGdvQWRkcmVzcyh1c2VyUHJ2KTtcbiAgICAgICAgY29uc3QgYmFja3VwS2V5QWRkcmVzcyA9IFV0aWxzLnByaXZhdGVLZXlUb0FsZ29BZGRyZXNzKGJhY2t1cFBydik7XG4gICAgICAgIHR4QnVpbGRlci5udW1iZXJPZlJlcXVpcmVkU2lnbmVycygyKS5zZXRTaWduZXJzKFt1c2VyS2V5QWRkcmVzcywgYmFja3VwS2V5QWRkcmVzcywgcGFyYW1zLmJpdGdvS2V5XSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAndW5hYmxlIHRvIGRlY3J5cHQgdXNlcktleSBvciBiYWNrdXBLZXkgd2l0aCB0aGUgd2FsbGV0UGFzc3BocmFzZSBwcm92aWRlZCwgZ290IGVycm9yOiAnICsgZS5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5nZXRDbGllbnQocGFyYW1zLm5vZGVQYXJhbXMudG9rZW4sIHBhcmFtcy5ub2RlUGFyYW1zLmJhc2VTZXJ2ZXIsIHBhcmFtcy5ub2RlUGFyYW1zLnBvcnQpO1xuICAgIGNvbnN0IG5hdGl2ZUJhbGFuY2UgPSBhd2FpdCB0aGlzLmdldEFjY291bnRCYWxhbmNlKHBhcmFtcy5yb290QWRkcmVzcywgY2xpZW50KTtcblxuICAgIC8vIEFsZ29yYW5kIGFjY291bnRzIHJlcXVpcmUgYSBtaW4uIGJhbGFuY2Ugb2YgMSBBTEdPXG4gICAgY29uc3QgTUlOX01JQ1JPQUxHT1NfQkFMQU5DRSA9IDEwMDAwMDtcbiAgICBjb25zdCBzcGVuZGFibGVBbW91bnQgPSBuZXcgQmlnTnVtYmVyKG5hdGl2ZUJhbGFuY2UpLm1pbnVzKHBhcmFtcy5mZWUpLm1pbnVzKE1JTl9NSUNST0FMR09TX0JBTEFOQ0UpLnRvTnVtYmVyKCk7XG5cbiAgICBpZiAobmV3IEJpZ051bWJlcihzcGVuZGFibGVBbW91bnQpLmlzWmVybygpIHx8IG5ldyBCaWdOdW1iZXIoc3BlbmRhYmxlQW1vdW50KS5pc0xlc3NUaGFuT3JFcXVhbFRvKHBhcmFtcy5mZWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJbnN1ZmZpY2llbnQgYmFsYW5jZSB0byByZWNvdmVyLCBnb3QgYmFsYW5jZTogJyArXG4gICAgICAgICAgbmF0aXZlQmFsYW5jZSArXG4gICAgICAgICAgJyBmZWU6ICcgK1xuICAgICAgICAgIHBhcmFtcy5mZWUgK1xuICAgICAgICAgICcgbWluIGFjY291bnQgYmFsYW5jZTogJyArXG4gICAgICAgICAgTUlOX01JQ1JPQUxHT1NfQkFMQU5DRVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbGF0ZXN0Um91bmQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXBhcmFtcy5maXJzdFJvdW5kKSB7XG4gICAgICBsYXRlc3RSb3VuZCA9IGF3YWl0IGNsaWVudFxuICAgICAgICAuc3RhdHVzKClcbiAgICAgICAgLmRvKClcbiAgICAgICAgLnRoZW4oKHN0YXR1cykgPT4gc3RhdHVzWydsYXN0LXJvdW5kJ10pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0Um91bmQgPSAhcGFyYW1zLmZpcnN0Um91bmQgPyBsYXRlc3RSb3VuZCA6IHBhcmFtcy5maXJzdFJvdW5kO1xuICAgIGlmICghZmlyc3RSb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmV0Y2ggdGhlIGxhdGVzdCByb3VuZCBmcm9tIHRoZSBub2RlLiBQbGVhc2UgcHJvdmlkZSB0aGUgZmlyc3RSb3VuZCBvciB0cnkgYWdhaW4uJyk7XG4gICAgfVxuICAgIGNvbnN0IExBU1RfUk9VTkRfQlVGRkVSID0gMTAwMDtcbiAgICBjb25zdCBsYXN0Um91bmQgPSBmaXJzdFJvdW5kICsgTEFTVF9ST1VORF9CVUZGRVI7XG5cbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5mZWUoeyBmZWU6IHBhcmFtcy5mZWUudG9TdHJpbmcoKSB9KVxuICAgICAgLmlzRmxhdEZlZSh0cnVlKVxuICAgICAgLnNlbmRlcih7XG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5yb290QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgICAudG8oe1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIH0pXG4gICAgICAuYW1vdW50KHNwZW5kYWJsZUFtb3VudClcbiAgICAgIC5nZW5lc2lzSWQoZ2VuZXNpc0lkKVxuICAgICAgLmdlbmVzaXNIYXNoKGdlbmVzaXNIYXNoKVxuICAgICAgLmZpcnN0Um91bmQobmV3IEJpZ051bWJlcihmaXJzdFJvdW5kKS50b051bWJlcigpKVxuICAgICAgLmxhc3RSb3VuZChuZXcgQmlnTnVtYmVyKGxhc3RSb3VuZCkudG9OdW1iZXIoKSk7XG5cbiAgICBpZiAocGFyYW1zLm5vdGUpIHtcbiAgICAgIGNvbnN0IG5vdGUgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShwYXJhbXMubm90ZSwgJ3V0Zi04JykpO1xuICAgICAgdHhCdWlsZGVyLm5vdGUobm90ZSk7XG4gICAgfVxuXG4gICAgLy8gQ29sZCB3YWxsZXQsIG9mZmxpbmUgdmF1bHRcbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCkgYXMgVHhEYXRhO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLnJvb3RBZGRyZXNzLFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgIGZlZUluZm86IHR4SnNvbi5mZWUsXG4gICAgICAgIGFtb3VudDogdHhKc29uLmFtb3VudCA/PyBuYXRpdmVCYWxhbmNlLnRvU3RyaW5nKCksXG4gICAgICAgIGZpcnN0Um91bmQ6IHR4SnNvbi5maXJzdFJvdW5kLFxuICAgICAgICBsYXN0Um91bmQ6IHR4SnNvbi5sYXN0Um91bmQsXG4gICAgICAgIGdlbmVzaXNJZDogZ2VuZXNpc0lkLFxuICAgICAgICBnZW5lc2lzSGFzaDogZ2VuZXNpc0hhc2gsXG4gICAgICAgIG5vdGU6IHR4SnNvbi5ub3RlID8gQnVmZmVyLmZyb20odHhKc29uLm5vdGUuYnVmZmVyKS50b1N0cmluZygndXRmLTgnKSA6IHVuZGVmaW5lZCxcbiAgICAgICAga2V5czogW3BhcmFtcy51c2VyS2V5LCBwYXJhbXMuYmFja3VwS2V5LCBwYXJhbXMuYml0Z29LZXldLFxuICAgICAgICBhZGRyZXNzVmVyc2lvbjogMSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTm9uLWJpdGdvIFJlY292ZXJ5IChIb3Qgd2FsbGV0cylcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdXNlclBydiB9KTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYmFja3VwUHJ2IH0pO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKSBhcyBUeERhdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHg6IEJ1ZmZlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICBmZWU6IHR4SnNvbi5mZWUsXG4gICAgICBmaXJzdFJvdW5kOiB0eEpzb24uZmlyc3RSb3VuZCxcbiAgICAgIGxhc3RSb3VuZDogdHhKc29uLmxhc3RSb3VuZCxcbiAgICAgIGdlbmVzaXNJZDogZ2VuZXNpc0lkLFxuICAgICAgZ2VuZXNpc0hhc2g6IGdlbmVzaXNIYXNoLFxuICAgICAgbm90ZTogdHhKc29uLm5vdGUgPyBCdWZmZXIuZnJvbSh0eEpzb24ubm90ZS5idWZmZXIpLnRvU3RyaW5nKCd1dGYtOCcpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIGZ1bGx5IHNpZ25lZCBzZXJpYWxpemVkIGJhc2U2NCB0cmFuc2FjdGlvbiBhbmQgYnJvYWRjYXN0cyBpdCBvbiB0aGUgbmV0d29yay5cbiAgICogVXNlcyB0aGUgZXh0ZXJuYWwgbm9kZSBwcm92aWRlZCBieSB0aGUgY2xpZW50XG4gICAqIEBwYXJhbSBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIG5vZGVQYXJhbXNcbiAgICovXG4gIGFzeW5jIGJyb2FkY2FzdFRyYW5zYWN0aW9uKHtcbiAgICBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgbm9kZVBhcmFtcyxcbiAgfTogQnJvYWRjYXN0VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxCYXNlQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAoIW5vZGVQYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgdGhlIGRldGFpbHMgb2YgdGhlIGFsZ29yYW5kIG5vZGUnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4SGV4ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgYWxnb1R4ID0gVXRpbHMudG9VaW50OEFycmF5KHR4SGV4KTtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KG5vZGVQYXJhbXMudG9rZW4sIG5vZGVQYXJhbXMuYmFzZVNlcnZlciwgbm9kZVBhcmFtcy5wb3J0KTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5zZW5kUmF3VHJhbnNhY3Rpb24oYWxnb1R4KS5kbygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGJyb2FkY2FzdCB0cmFuc2FjdGlvbiwgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVsbGFyIGFuZCBBbGdvcmFuZCBib3RoIHVzZSBrZXlzIG9uIHRoZSBlZDI1NTE5IGN1cnZlLCBidXQgdXNlIGRpZmZlcmVudCBlbmNvZGluZ3MuXG4gICAqIEFzIHRoZSBIU00gZG9lc24ndCBoYXZlIGV4cGxpY2l0IHN1cHBvcnQgdG8gY3JlYXRlIEFsZ29yYW5kIGFkZHJlc3Nlcywgd2UgdXNlIHRoZSBTdGVsbGFyXG4gICAqIGtleXMgYW5kIHJlLWVuY29kZSB0aGVtIHRvIHRoZSBBbGdvcmFuZCBlbmNvZGluZy5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIEFsZ29yYW5kIGN1c3RvZGlhbCB3YWxsZXRzIHJldXNpbmcgU3RlbGxhciBrZXlzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc09yUHViS2V5IGEgU3RlbGxhciBwdWJrZXkgb3IgQWxnb3JhbmQgYWRkcmVzc1xuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGVsbGFyQWRkcmVzc1RvQWxnb0FkZHJlc3MoYWRkcmVzc09yUHViS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIHdlIGhhdmUgYW4gQWxnb3JhbmQgYWRkcmVzc1xuICAgIGlmICh0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3NPclB1YktleSkpIHtcbiAgICAgIHJldHVybiBhZGRyZXNzT3JQdWJLZXk7XG4gICAgfVxuXG4gICAgLy8gd2UgaGF2ZSBhIHN0ZWxsYXIga2V5XG4gICAgaWYgKHN0ZWxsYXIuU3RyS2V5LmlzVmFsaWRFZDI1NTE5UHVibGljS2V5KGFkZHJlc3NPclB1YktleSkpIHtcbiAgICAgIGNvbnN0IHN0ZWxsYXJQdWIgPSBzdGVsbGFyLlN0cktleS5kZWNvZGVFZDI1NTE5UHVibGljS2V5KGFkZHJlc3NPclB1YktleSk7XG4gICAgICBjb25zdCBhbGdvQWRkcmVzcyA9IEFsZ29MaWIuYWxnb1V0aWxzLmVuY29kZUFkZHJlc3Moc3RlbGxhclB1Yik7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkQWRkcmVzcyhhbGdvQWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGFsZ29BZGRyZXNzO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IFN0ZWxsYXIgYWRkcmVzcyB0byBhbiBBbGdvcmFuZCBhZGRyZXNzIHZpYSBzdGVsbGFyIHB1YmtleS4nKTtcbiAgICAgIC8vIHdlIGhhdmUgYSByb290IHB1YmtleVxuICAgIH0gZWxzZSBpZiAoQWxnb0xpYi5hbGdvVXRpbHMuaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzT3JQdWJLZXkpKSB7XG4gICAgICBjb25zdCBrcCA9IG5ldyBBbGdvTGliLktleVBhaXIoeyBwdWI6IGFkZHJlc3NPclB1YktleSB9KTtcbiAgICAgIGNvbnN0IGFsZ29BZGRyZXNzID0ga3AuZ2V0QWRkcmVzcygpO1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZEFkZHJlc3MoYWxnb0FkZHJlc3MpKSB7XG4gICAgICAgIHJldHVybiBhbGdvQWRkcmVzcztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHJvb3QgcHVia2V5LicpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCdOZWl0aGVyIGFuIEFsZ29yYW5kIGFkZHJlc3MsIGEgc3RlbGxhciBwdWJrZXkgb3IgYSByb290IHB1YmxpYyBrZXkuJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXIoKTogQWxnb0xpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IEFsZ29MaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRCYXNlQ2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgcHVibGljS2V5LCBwcnYsIG11bHRpU2lnVHlwZSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cblxuICAgIGxldCBhbGdvS2V5O1xuICAgIHRyeSB7XG4gICAgICBhbGdvS2V5ID0gbmV3IEFsZ29MaWIuS2V5UGFpcih7IHBydiB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBrZXk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocHVibGljS2V5ICYmIHB1YmxpY0tleSAhPT0gYWxnb0tleS5nZXRLZXlzKCkucHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxufVxuIl19
|