@bitgo/sdk-core 36.30.0 → 36.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/enum.d.ts +16 -13
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +18 -14
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/environments.d.ts +2 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +13 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +1 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +2 -1
- package/dist/src/bitgo/utils/mpcUtils.js +2 -2
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +6 -6
- package/dist/src/coins/fiatinr.d.ts +32 -0
- package/dist/src/coins/fiatinr.d.ts.map +1 -0
- package/dist/src/coins/fiatinr.js +61 -0
- package/dist/src/coins/index.d.ts +2 -0
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +3 -1
- package/dist/src/coins/tfiatinr.d.ts +11 -0
- package/dist/src/coins/tfiatinr.d.ts.map +1 -0
- package/dist/src/coins/tfiatinr.js +17 -0
- package/dist/test/unit/bitgo/environment.js +17 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1153,10 +1153,6 @@ class Wallet {
|
|
|
1153
1153
|
.post(this.baseCoin.url('/wallet/' + this._wallet.id + '/address'))
|
|
1154
1154
|
.send(addressParams)
|
|
1155
1155
|
.result());
|
|
1156
|
-
// infer its address type
|
|
1157
|
-
if (_.isObject(newAddress.coinSpecific)) {
|
|
1158
|
-
newAddress.addressType = (0, utils_1.inferAddressType)(newAddress);
|
|
1159
|
-
}
|
|
1160
1156
|
newAddress.keychains = keychains;
|
|
1161
1157
|
newAddress.baseAddress = baseAddress ?? _.get(this._wallet, 'coinSpecific.baseAddress');
|
|
1162
1158
|
newAddress.format = addressParams.format;
|
|
@@ -1840,7 +1836,11 @@ class Wallet {
|
|
|
1840
1836
|
};
|
|
1841
1837
|
if (_.isFunction(params.customSigningFunction)) {
|
|
1842
1838
|
if (typeof this.baseCoin.signWithCustomSigningFunction === 'function') {
|
|
1843
|
-
|
|
1839
|
+
(0, assert_1.default)(pubs, 'pubs are required for custom signing');
|
|
1840
|
+
return this.baseCoin.signWithCustomSigningFunction(params.customSigningFunction, {
|
|
1841
|
+
...signTransactionParams,
|
|
1842
|
+
pubs,
|
|
1843
|
+
});
|
|
1844
1844
|
}
|
|
1845
1845
|
const keys = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
|
|
1846
1846
|
const signTransactionParamsWithSeed = {
|
|
@@ -3726,4 +3726,4 @@ class Wallet {
|
|
|
3726
3726
|
}
|
|
3727
3727
|
}
|
|
3728
3728
|
exports.Wallet = Wallet;
|
|
3729
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMseUNBQTJCO0FBQzNCLDBDQUE0QjtBQUU1QixxREFBdUM7QUFDdkMsa0RBQTREO0FBVTVELHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBTW1CO0FBRW5CLDBDQUEwQztBQUMxQywrREFBaUQ7QUFDakQsMENBQXdHO0FBQ3hHLDBFQUF1RTtBQUN2RSx3REFBeUY7QUFDekYsd0NBQTREO0FBQzVELHdDQUE0QztBQUM1QyxnQ0FBc0M7QUFDdEMsb0NBVWtCO0FBQ2xCLDBEQUF1RDtBQUN2RCw4Q0FBaUU7QUFDakUsK0RBQTRDO0FBQzVDLGtEQUF5RjtBQUN6RiwrQ0FBNEQ7QUEyRTVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNs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RSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQztZQUNILGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUs7aUJBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQ1QsSUFBSSxDQUFDO2dCQUNKLFNBQVMsRUFBRSxTQUFTO2FBQ3JCLENBQUM7aUJBQ0QsTUFBTSxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sa0JBQWtCLENBQUM7UUFDNUIsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO1lBQzdELEtBQUs7WUFDTCxnQkFBZ0I7U0FDakIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUc7WUFDcEIsVUFBVSxFQUFFLGtCQUFrQjtZQUM5QixRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0QixnQkFBZ0I7WUFDaEIsS0FBSztTQUNOLENBQUM7UUFFRixNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBbnFJRCx3QkFtcUlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgVHhTZW5kQm9keSwgdHlwZSBBZGRyZXNzUXVlcnlSZXN1bHQgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IENvaW5GYW1pbHkgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IElSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgQWRkcmVzc0Jvb2ssIElBZGRyZXNzQm9vayB9IGZyb20gJy4uL2FkZHJlc3MtYm9vayc7XG5pbXBvcnQge1xuICBJQmFzZUNvaW4sXG4gIE5GVFRyYW5zZmVyT3B0aW9ucyxcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7XG4gIEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsXG4gIEluY29ycmVjdFBhc3N3b3JkRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yLFxuICBOZWVkVXNlclNpZ251cEVycm9yLFxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uL2luc2NyaXB0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2ludGVybmFsJztcbmltcG9ydCB7IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksIEtleWNoYWluLCBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnYsIEtleUluZGljZXMgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBnZXRMaWdodG5pbmdBdXRoS2V5IH0gZnJvbSAnLi4vbGlnaHRuaW5nL2xpZ2h0bmluZ1dhbGxldFV0aWwnO1xuaW1wb3J0IHsgSVBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWxzIH0gZnJvbSAnLi4vcGVuZGluZ0FwcHJvdmFsJztcbmltcG9ydCB7IEdvU3Rha2luZ1dhbGxldCwgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi90cmFkaW5nJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uL3Rzcyc7XG5pbXBvcnQge1xuICBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gIGluZmVyQWRkcmVzc1R5cGUsXG4gIEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBSZXF1ZXN0VHlwZSxcbiAgVG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtcyxcbiAgVG9rZW5UeXBlLFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IEVjZHNhTVBDdjJVdGlscywgRWNkc2FVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lY2RzYSc7XG5pbXBvcnQgRWRkc2FVdGlscyBmcm9tICcuLi91dGlscy90c3MvZWRkc2EnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbiwgdmFsaWRhdGVUeFJlcXVlc3RBcGlWZXJzaW9uIH0gZnJvbSAnLi4vdXRpbHMvdHhSZXF1ZXN0JztcbmltcG9ydCB7IGJ1aWxkUGFyYW1LZXlzLCBCdWlsZFBhcmFtcyB9IGZyb20gJy4vQnVpbGRQYXJhbXMnO1xuaW1wb3J0IHtcbiAgQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyxcbiAgQWRkcmVzc2VzT3B0aW9ucyxcbiAgQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMsXG4gIEJ1bGtDcmVhdGVTaGFyZU9wdGlvbixcbiAgQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4sXG4gIEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMsXG4gIENoYW5nZUZlZU9wdGlvbnMsXG4gIENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zLFxuICBDcmVhdGVBZGRyZXNzT3B0aW9ucyxcbiAgQ3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlLFxuICBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgQ3JlYXRlU2hhcmVPcHRpb25zLFxuICBDcm9zc0NoYWluVVRYTyxcbiAgRGVjcnlwdGVkS2V5Y2hhaW5EYXRhLFxuICBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyxcbiAgRG93bmxvYWRLZXljYXJkT3B0aW9ucyxcbiAgRmFub3V0VW5zcGVudHNPcHRpb25zLFxuICBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGb3J3YXJkZXJCYWxhbmNlLFxuICBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyxcbiAgRnJlZXplT3B0aW9ucyxcbiAgRnVuZEZvcndhcmRlclBhcmFtcyxcbiAgRnVuZEZvcndhcmRlcnNPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICB0eXBlIElXYWxsZXQsXG4gIE1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbk9wdGlvbnMsXG4gIE1heGltdW1TcGVuZGFibGUsXG4gIE1heGltdW1TcGVuZGFibGVPcHRpb25zLFxuICBNb2RpZnlXZWJob29rT3B0aW9ucyxcbiAgTmZ0QmFsYW5jZSxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFJlY292ZXJUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBSZW1vdmVVc2VyT3B0aW9ucyxcbiAgU2VuZE1hbnlPcHRpb25zLFxuICBTZW5kTkZUT3B0aW9ucyxcbiAgU2VuZE5GVFJlc3VsdCxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlZEtleUNoYWluLFxuICBTaGFyZVdhbGxldE9wdGlvbnMsXG4gIFNpZ25BbmRTZW5kVHhSZXF1ZXN0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTdWJXYWxsZXRUeXBlLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgVXBkYXRlQnVpbGREZWZhdWx0T3B0aW9ucyxcbiAgVXBkYXRlV2FsbGV0T3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRFY2RzYUNoYWxsZW5nZXMsXG4gIFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMsXG4gIFdhbGxldFR5cGUsXG4gIEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlLFxuICBXYWxsZXRJbml0UmVzdWx0LFxufSBmcm9tICcuL2lXYWxsZXQnO1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JpdGdvOnYyOndhbGxldCcpO1xuXG50eXBlIE1hbmFnZVVuc3BlbnRzID0gJ2NvbnNvbGlkYXRlJyB8ICdmYW5vdXQnO1xuXG5jb25zdCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMgPSBUeFNlbmRCb2R5LnR5cGUudHlwZXMuZmxhdE1hcCgodCkgPT4gT2JqZWN0LmtleXModC5wcm9wcykpO1xuXG5leHBvcnQgZW51bSBNYW5hZ2VVbnNwZW50c09wdGlvbnMge1xuICBCVUlMRF9PTkxZLFxuICBCVUlMRF9TSUdOX1NFTkQsXG59XG5cbmZ1bmN0aW9uIGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChcbiAgcHJlYnVpbGRUeDogc3RyaW5nIHwgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHVuZGVmaW5lZFxuKTogcHJlYnVpbGRUeCBpcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHtcbiAgaWYgKCFwcmVidWlsZFR4IHx8IHR5cGVvZiBwcmVidWlsZFR4ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKHByZWJ1aWxkVHggYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCkud2FsbGV0SWQgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIFdhbGxldCBpbXBsZW1lbnRzIElXYWxsZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG4gIHB1YmxpYyBfd2FsbGV0OiBXYWxsZXREYXRhO1xuICBwcml2YXRlIHJlYWRvbmx5IHRzc1V0aWxzOiBFY2RzYVV0aWxzIHwgRWNkc2FNUEN2MlV0aWxzIHwgRWRkc2FVdGlscyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGVybWlzc2lvbnM/OiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXREYXRhOiBhbnkpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICAgIHRoaXMuX3dhbGxldCA9IHdhbGxldERhdGE7XG4gICAgY29uc3QgdXNlcklkID0gXy5nZXQoYml0Z28sICdfdXNlci5pZCcpO1xuICAgIGlmIChfLmlzU3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gXy5maW5kKHdhbGxldERhdGEudXNlcnMsIHsgdXNlcjogdXNlcklkIH0pO1xuICAgICAgdGhpcy5fcGVybWlzc2lvbnMgPSBfLmdldCh1c2VyRGV0YWlscywgJ3Blcm1pc3Npb25zJyk7XG4gICAgfVxuICAgIGlmIChiYXNlQ29pbj8uc3VwcG9ydHNUc3MoKSAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgc3dpdGNoIChiYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSkge1xuICAgICAgICBjYXNlICdlY2RzYSc6XG4gICAgICAgICAgaWYgKHdhbGxldERhdGEubXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFY2RzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFY2RzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGRzYSc6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBVUkwgdXNpbmcgdGhpcyB3YWxsZXQncyBpZCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgQml0R28gQVBJIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGV4dHJhIEFQSSBzcGVjaWZpYyBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSB3YWxsZXQgaWRcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhpcyB3YWxsZXQncyBpZFxuICAgKi9cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBmb3Igc3BlbmRpbmcgZnVuZHMgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYXBwcm92YWxzUmVxdWlyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBjb2RlYyBpbnN0ZWFkOiB0LmV4YWN0KEJ1aWxkUGFyYW1zKS5lbmNvZGUodikgKi9cbiAgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGJ1aWxkUGFyYW1LZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzdHJpY3Qgc3ViLXNldCBvZiBwcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zXG4gICAqL1xuICBwcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdjb25zb2xpZGF0ZUFkZHJlc3NlcycsXG4gICAgICAnbmZ0Q29sbGVjdGlvbklkJyxcbiAgICAgICduZnRJZCcsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWVtbycsXG4gICAgICAndmFsaWRGcm9tQmxvY2snLFxuICAgICAgJ3ZhbGlkVG9CbG9jaycsXG4gICAgICAncHJldmlldycsXG4gICAgICAna2VlcEFsaXZlJyxcbiAgICAgICdhcGlWZXJzaW9uJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBiYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29pbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBjb2luIHRoaXMgd2FsbGV0IGhvbGRzXG4gICAqL1xuICBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luO1xuICB9XG5cbiAgdHlwZSgpOiBXYWxsZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnR5cGUgfHwgJ2hvdCc7XG4gIH1cblxuICBtdWx0aXNpZ1R5cGUoKTogJ29uY2hhaW4nIHwgJ3Rzcycge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlVmVyc2lvbigpOiAnTVBDdjInIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb247XG4gIH1cblxuICBzdWJUeXBlKCk6IFN1YldhbGxldFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3ViVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhYmVsIChuYW1lKSBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubGFiZWw7XG4gIH1cblxuICBwdWJsaWMgZmxhZ3MoKTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LndhbGxldEZsYWdzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGZsYWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncygpLmZpbmQoKGZsYWcpID0+IGZsYWcubmFtZSA9PT0gbmFtZSk/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljIG9iamVjdCBpZHMgZm9yIHRoZSBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuXG4gICAqL1xuICBwdWJsaWMga2V5SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmtleXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVjZWl2ZSBhZGRyZXNzIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIHJlY2VpdmVBZGRyZXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5yZWNlaXZlQWRkcmVzcz8uYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiBuZnQgdG9rZW5zIGZvciB0aGlzIHdhbGxldC4gV2lsbCBhbHdheXMgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgd2FsbGV0XG4gICAqIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWxsVG9rZW5zIGZsYWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICBuZnRCYWxhbmNlcygpOiBOZnRCYWxhbmNlW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl93YWxsZXQubmZ0cykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fd2FsbGV0Lm5mdHMpLm1hcCgobmZ0RGF0YSkgPT4gbmZ0RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiB1bnN1cHBvcnRlZCBuZnQgdG9rZW5zIGZvciB0aGlzIHdhbGxldC4gV2lsbCBhbHdheXMgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgd2FsbGV0XG4gICAqIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWxsVG9rZW5zIGZsYWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICB1bnN1cHBvcnRlZE5mdEJhbGFuY2VzKCk6IE5mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC51bnN1cHBvcnRlZE5mdHMpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3dhbGxldC51bnN1cHBvcnRlZE5mdHMpLm1hcCgobmZ0RGF0YSkgPT4gbmZ0RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHdhbGxldHMgbmZ0ICYgdW5zdXBwb3J0ZWQgbmZ0cy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXX1cbiAgICovXG4gIGFzeW5jIGdldE5mdEJhbGFuY2VzKCk6IFByb21pc2U8TmZ0QmFsYW5jZVtdPiB7XG4gICAgY29uc3Qgd2FsbGV0RGF0YTogUGFydGlhbDxXYWxsZXREYXRhPiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHsgYWxsVG9rZW5zOiB0cnVlIH0pLnJlc3VsdCgpO1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkTmZ0cyA9IHdhbGxldERhdGE/Lm5mdHMgPyBPYmplY3QudmFsdWVzKHdhbGxldERhdGEubmZ0cykubWFwKChiYWxhbmNlKSA9PiBiYWxhbmNlKSA6IFtdO1xuXG4gICAgY29uc3QgdW5zdXBwb3J0ZWROZnRzID0gd2FsbGV0RGF0YT8udW5zdXBwb3J0ZWROZnRzXG4gICAgICA/IE9iamVjdC52YWx1ZXMod2FsbGV0RGF0YS51bnN1cHBvcnRlZE5mdHMpLm1hcCgoYmFsYW5jZSkgPT4gYmFsYW5jZSlcbiAgICAgIDogW107XG4gICAgcmV0dXJuIFsuLi5zdXBwb3J0ZWROZnRzLCAuLi51bnN1cHBvcnRlZE5mdHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgLSB0eEhhc2ggdGhlIHRyYW5zYWN0aW9uIGhhc2ggdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uKHBhcmFtczogR2V0VHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHhIYXNoJ10sIFtdKTtcblxuICAgIGNvbnN0IHBhZ2luYXRlZE9wdGlvbnM6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcGFnaW5hdGVkT3B0aW9ucy5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkgfHwgcGFyYW1zLmxpbWl0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBwYWdpbmF0ZWRPcHRpb25zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFnaW5hdGVkT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmluY2x1ZGVSYmYpIHtcbiAgICAgIHF1ZXJ5WydpbmNsdWRlUmJmJ10gPSBwYXJhbXMuaW5jbHVkZVJiZjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMudHhIYXNoKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2ZlcnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlcnMocGFyYW1zOiBUcmFuc2ZlcnNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBUcmFuc2ZlcnNPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2hMYWJlbCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5zZWFyY2hMYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlYXJjaExhYmVsIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWFyY2hMYWJlbCA9IHBhcmFtcy5zZWFyY2hMYWJlbDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHBhcmFtcy5hZGRyZXNzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgYWRkcmVzcyBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVHdGUpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVHdGUgPSBwYXJhbXMuZGF0ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVMdCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVMdCA9IHBhcmFtcy5kYXRlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVHdGUgPSBwYXJhbXMudmFsdWVHdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVMdCA9IHBhcmFtcy52YWx1ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZUhleCA9IHBhcmFtcy5pbmNsdWRlSGV4O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuc3RhdGUpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHBhcmFtcy5zdGF0ZS5mb3JFYWNoKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIHN0YXRlIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuc3RhdGUgPSBwYXJhbXMuc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy50eXBlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHlwZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVIZXggYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcyA9IHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcztcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3Vuc3BlbnRJZHMnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmJ1bGsgLSBpZiBzZXQgdG8gVHJ1ZSwgdGhpcyBlbmFibGVzIHRoZSBjb25zb2xpZGF0aW9uIG9mIGxhcmdlIG51bWJlciBvZiB1bnNwZW50cyBieSBjcmVhdGluZyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggdHJhbnNhY3Rpb24gY29tcG9zZWQgb2YgMjAwIHVuc3BlbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHdoaWNoIG1heSBoYXZlIGZld2VyIHVuc3BlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VVbnNwZW50cyhcbiAgICByb3V0ZU5hbWU6IE1hbmFnZVVuc3BlbnRzLFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgfCBGYW5vdXRVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB0eXBlOiAnY29uc29saWRhdGUnIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFub3V0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGN1c3RvZGlhbCB3YWxsZXRzJyk7XG4gICAgfVxuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZhbm91dElucHV0Rm9ybWF0ID0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlID8gJ21heE51bUlucHV0c1RvVXNlJyA6ICd1bnNwZW50cyc7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUGVyY2VudGFnZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcblxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAgICd0YXJnZXRBZGRyZXNzJyxcbiAgICAgICd0eEZvcm1hdCcsXG4gICAgICAnYnVsaycsXG5cbiAgICAgIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJyA/ICdsaW1pdCcgOiBmYW5vdXRJbnB1dEZvcm1hdCxcbiAgICAgICdudW1VbnNwZW50c1RvTWFrZScsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2U6IFRyYW5zYWN0aW9uUHJlYnVpbGQgfCBUcmFuc2FjdGlvblByZWJ1aWxkW10gPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybChgLyR7cm91dGVOYW1lfVVuc3BlbnRzYCkpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGlmIChvcHRpb24gPT09IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9PTkxZKSB7XG4gICAgICByZXR1cm4gYnVpbGRSZXNwb25zZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBwbGF0Zm9ybS1idWlsdCB0cmFuc2FjdGlvbiBtYXRjaGVzIHVzZXIgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHR4UHJlYnVpbGRzID0gQXJyYXkuaXNBcnJheShidWlsZFJlc3BvbnNlKSA/IGJ1aWxkUmVzcG9uc2UgOiBbYnVpbGRSZXNwb25zZV07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eFByZWJ1aWxkcy5tYXAoKHR4UHJlYnVpbGQpID0+XG4gICAgICAgIHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAuLi4ocGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fSksXG4gICAgICAgICAgICBrZXljaGFpbnM6IHtcbiAgICAgICAgICAgICAgdXNlcjoga2V5Y2hhaW5zWzBdLFxuICAgICAgICAgICAgICBiYWNrdXA6IGtleWNoYWluc1sxXSxcbiAgICAgICAgICAgICAgYml0Z286IGtleWNoYWluc1syXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXFJZCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgcHViczoga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KSxcbiAgICAgIC8vIEJ1aWxkaW5nIFBTQlRzIHdpdGggdGhlIGJ1bGsgZmxhZyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwcmV2aW91cyB0cmFuc2FjdGlvbiBmb3Igbm9uLXNlZ3dpdCBpbnB1dHMuXG4gICAgICAvLyBNYW51YWxseSBvdmVycmlkZSB0aGUgc2lnbmluZyBhbmQgdmFsaWRhdGluZyB0byBub3QgZmFpbC5cbiAgICAgIGFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHg6ICEhcGFyYW1zLmJ1bGssXG4gICAgfTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnLCAnYnVsayddKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eFByZWJ1aWxkcy5tYXAoYXN5bmMgKHR4UHJlYnVpbGQpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgICAgLi4udHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcywge1xuICAgICAgICAgIHR5cGU6IHJvdXRlTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidWlsZFJlc3BvbnNlKSA/IHJlc3BvbnNlIDogcmVzcG9uc2VbMF07XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlIHRoZSB1bnNwZW50IHJlc2VydmF0aW9ucyBvbiB0aGUgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMuY3JlYXRlIC0gY3JlYXRlIGEgbmV3IHJlc2VydmF0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMubW9kaWZ5IC0gbW9kaWZ5IGFuIGV4aXN0aW5nIHJlc2VydmF0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGVsZXRlIC0gZGVsZXRlIGFuIGV4aXN0aW5nIHJlc2VydmF0aW9uXG4gICAqL1xuICBhc3luYyBtYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25zKHBhcmFtczogTWFuYWdlVW5zcGVudFJlc2VydmF0aW9uT3B0aW9ucyk6IFByb21pc2U8e1xuICAgIHVuc3BlbnRzOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgd2FsbGV0SWQ6IHN0cmluZztcbiAgICAgIGV4cGlyZVRpbWU6IHN0cmluZztcbiAgICAgIHVzZXJJZD86IHN0cmluZztcbiAgICB9W107XG4gIH0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY3JlYXRlJywgJ21vZGlmeScsICdkZWxldGUnXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuICAgIC8vIFRoZSBVUkwgY2Fubm90IGNvbnRhaW4gdGhlIGNvaW5OYW1lLCBzbyB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgVVJMXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9yZXNlcnZlZHVuc3BlbnRzYCkucmVwbGFjZShgLyR7dGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpfWAsICcnKTtcbiAgICBpZiAoZmlsdGVyZWRQYXJhbXMuY3JlYXRlKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZENyZWF0ZVBhcmFtcyA9IF8ucGljayhwYXJhbXMuY3JlYXRlLCBbJ3Vuc3BlbnRJZHMnLCAnZXhwaXJlVGltZSddKTtcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKGZpbHRlcmVkQ3JlYXRlUGFyYW1zKS5yZXN1bHQoKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlcmVkUGFyYW1zLm1vZGlmeSkge1xuICAgICAgY29uc3QgZmlsdGVyZWRNb2RpZnlQYXJhbXMgPSBfLnBpY2socGFyYW1zLm1vZGlmeSwgWyd1bnNwZW50SWRzJywgJ2NoYW5nZXMnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5wdXQodXJsKS5zZW5kKGZpbHRlcmVkTW9kaWZ5UGFyYW1zKS5yZXN1bHQoKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlcmVkUGFyYW1zLmRlbGV0ZSkge1xuICAgICAgY29uc3QgZmlsdGVyZWREZWxldGVQYXJhbXMgPSBfLnBpY2socGFyYW1zLmRlbGV0ZSwgWydpZCddKTtcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh1cmwpLnF1ZXJ5KGZpbHRlcmVkRGVsZXRlUGFyYW1zKS5yZXN1bHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWQgbm90IGRldGVjdCBhIGNyZWF0aW9uLCBtb2RpZmljYXRpb24sIG9yIGRlbGV0aW9uIHJlcXVlc3QuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bVVuc3BlbnRzVG9NYWtlIC0gdGhlIG51bWJlciBvZiBuZXcgdW5zcGVudHMgdG8gbWFrZS4gSXQgaXMgbm90IGFwcGxpY2FibGUgZm9yIGlmIGJ1bGsgY29uc29saWRhdGUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmJ1bGsgLSBpZiBzZXQgdG8gVHJ1ZSwgdGhpcyBlbmFibGVzIHRoZSBjb25zb2xpZGF0aW9uIG9mIGxhcmdlIG51bWJlciBvZiB1bnNwZW50cyBieSBjcmVhdGluZyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggdHJhbnNhY3Rpb24gY29tcG9zZWQgb2YgMjAwIHVuc3BlbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHdoaWNoIG1heSBoYXZlIGZld2VyIHVuc3BlbnRzLlxuICAgKi9cbiAgYXN5bmMgY29uc29saWRhdGVVbnNwZW50cyhcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnY29uc29saWRhdGUnLCBwYXJhbXMsIG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRmFub3V0IHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcHJvcG9ydGlvbiBvZiBhbiB1bnNwZW50IHlvdSBhcmUgd2lsbGluZyB0byBsb3NlIHRvIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZGVzaXJlZCBmZWUgcmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIFRoZSBtYXggbGltaXQgZm9yIGEgZmVlIHJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAtIHRoZSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bVVuc3BlbnRzVG9NYWtlIC0gdGhlIG51bWJlciBvZiBuZXcgdW5zcGVudHMgdG8gbWFrZVxuICAgKlxuICAgKiBAcGFyYW0ge01hbmFnZVVuc3BlbnRzT3B0aW9uc30gb3B0aW9uIC0gZmxhZyB0byB0b2dnbGUgYnVpbGQgYW5kIHNlbmQgb3IgYnVpbGQgb25seVxuICAgKi9cbiAgYXN5bmMgZmFub3V0VW5zcGVudHMoXG4gICAgcGFyYW1zOiBGYW5vdXRVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdmYW5vdXQnLCBwYXJhbXMsIG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGUgd2FsbGV0LiBVcGRhdGVzIHRoZSB3YWxsZXQuXG4gICAqIFRva2VucyB3aWxsIG9ubHkgYmUgZmx1c2hlZCBmcm9tIGZvcndhcmRlciBjb250cmFjdHMgaWYgdGhlIGJhbGFuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBoZXJlLlxuICAgKiBAcGFyYW0gdGhyZXNob2xkcyB7T2JqZWN0fSAtIHBhaXJzIG9mIHsgW3Rva2VuTmFtZV06IHRocmVzaG9sZCB9IChiYXNlIHVuaXRzKVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVG9rZW5GbHVzaFRocmVzaG9sZHModGhyZXNob2xkczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cblxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy51cmwoKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgdG9rZW5GbHVzaFRocmVzaG9sZHM6IHRocmVzaG9sZHMsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG4gIC8qKlxuICAgICAgKiBVcGRhdGVzIHRoZSB3YWxsZXQuIFNldHMgZmxhZ3MgZm9yIGRlcGxveUZvcndhcmRlcnNNYW51YWxseSBhbmQgZmx1c2hGb3J3YXJkZXJzTWFudWFsbHkgb2YgdGhlIHdhbGxldC5cbiAgICAgICogQHBhcmFtIGZvcndhcmRlckZsYWdzIHtPYmplY3R9IC0ge1xuICAgICAgICBcImNvaW5TcGVjaWZpY1wiOiB7XG4gICAgICAgICAgW2NvaW5OYW1lXToge1xuICAgICAgICAgICAgXCJkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59LFxuICAgICAgICAgICAgXCJmbHVzaEZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICovXG4gIGFzeW5jIHVwZGF0ZUZvcndhcmRlcnMoZm9yd2FyZGVyRmxhZ3M6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZChmb3J3YXJkZXJGbGFncykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVG8gbWFudWFsbHkgZGVwbG95IGFuIEVUSCBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBkZXBsb3lGb3J3YXJkZXJzKHBhcmFtczogRGVwbG95Rm9yd2FyZGVyc09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS9kZXBsb3ltZW50YCk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogVG8gbWFudWFsbHkgZm9yd2FyZCB0b2tlbnMgZnJvbSBhbiBFVEggb3IgQ0VMTyBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRva2VuTmFtZSAtIE5hbWUgb2YgdG9rZW4gdGhhdCBuZWVkcyB0byBiZSBmb3J3YXJkZWQgZnJvbSB0aGUgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmdhc1ByaWNlXSAtIEV4cGxpY2l0IGdhcyBwcmljZSB0byB1c2Ugd2hlbiBmb3J3YXJkaW5nIHRva2VuIGZyb20gdGhlIGZvcndhcmRlciBjb250cmFjdCAoRVRIIGFuZCBDZWxvIG9ubHkpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGVzdGltYXRlZCBuZXR3b3JrIGdhcyBwcmljZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZWlwMTU1OV0gLSBTcGVjaWZ5IGVpcDE1NTkgZmVlIHBhcmFtZXRlcnMgaW4gdG9rZW4gZm9yd2FyZGluZyB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZmx1c2hGb3J3YXJkZXJUb2tlbihwYXJhbXM6IEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vdG9rZW5mb3J3YXJkYCk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogU3dlZXAgZnVuZHMgZm9yIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3MgLSBUaGUgYWRkcmVzcyB0byBzZW5kIGFsbCB0aGUgZnVuZHMgaW4gdGhlIHdhbGxldCB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBFc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoaW4gdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtwYXJhbXMubWF4RmVlUmF0ZV0gLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuYWxsb3dQYXJ0aWFsU3dlZXBdIC0gYWxsb3dzIHN3ZWVwaW5nIDIwMCB1bnNwZW50cyB3aGVuIHRoZSB3YWxsZXQgaGFzIG1vcmUgdGhhbiB0aGF0XG4gICAqIEByZXR1cm5zIHR4SGV4IHtTdHJpbmd9IHRoZSB0eEhleCBvZiB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBzd2VlcChwYXJhbXM6IFN3ZWVwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2JywgJ290cCddKTtcblxuICAgIC8vIFRoZSBzd2VlcCBBUEkgZW5kcG9pbnQgaXMgb25seSBhdmFpbGFibGUgdG8gdXR4by1iYXNlZCBjb2luc1xuXG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN3ZWVwV2l0aFNlbmRNYW55KCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKSAhPT0gdGhpcy5iYWxhbmNlU3RyaW5nKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc3dlZXAgd2hlbiB1bmNvbmZpcm1lZCBmdW5kcyBleGlzdCBvbiB0aGUgd2FsbGV0LCBwbGVhc2Ugd2FpdCB1bnRpbCBhbGwgaW5ib3VuZCB0cmFuc2FjdGlvbnMgY29uZmlybSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9tYXhpbXVtU3BlbmRhYmxlJykpLnJlc3VsdCgpO1xuICAgICAgY29uc3QgbWF4aW11bVNwZW5kYWJsZSA9IG5ldyBCaWdOdW1iZXIodmFsdWUubWF4aW11bVNwZW5kYWJsZSk7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtYXhpbXVtU3BlbmRhYmxlLmlzWmVybygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZnVuZHMgdG8gc3dlZXAnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VuZE1hbnlQYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfHwgJycsIC8vIEVuc3VyZSBhZGRyZXNzIGlzIGFsd2F5cyBhIHN0cmluZ1xuICAgICAgICAgICAgYW1vdW50OiBtYXhpbXVtU3BlbmRhYmxlLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHNlbmRNYW55UGFyYW1zKTtcbiAgICB9XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbG93IHdvcmtzIGZvciBhbGwgVVRYTyBjb2luc1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG4gICAgICAnYWxsb3dQYXJ0aWFsU3dlZXAnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc3dlZXBXYWxsZXQnKSkuc2VuZChmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmV4cGxhaW5UcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgaWYgKHRyYW5zYWN0aW9uPy5vdXRwdXRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgaW52YWxpZE91dHB1dEFkZHJlc3MgPSB0cmFuc2FjdGlvbi5vdXRwdXRzLmZpbmQoKG91dHB1dCkgPT4gb3V0cHV0LmFkZHJlc3MgIT09IHBhcmFtcy5hZGRyZXNzKTtcbiAgICAgIGlmIChpbnZhbGlkT3V0cHV0QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc3dlZXAgZGVzdGluYXRpb24gJHtpbnZhbGlkT3V0cHV0QWRkcmVzcy5hZGRyZXNzfSwgc3BlY2lmaWVkICR7cGFyYW1zLmFkZHJlc3N9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0cmFuc2FjdGlvbiwgbm8gZGVzdGluYXRpb24gYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KSkgYXMgYW55O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkOiByZXNwb25zZSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICB1c2VyS2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICBwcnY6IHBhcmFtcy54cHJ2LFxuICAgIH07XG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih0cmFuc2FjdGlvblBhcmFtcyk7XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ290cCddKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmVlemUgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGZyZWV6ZShwYXJhbXM6IEZyZWV6ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGlmIChwYXJhbXMuZHVyYXRpb24pIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkdXJhdGlvbjogc2hvdWxkIGJlIG51bWJlciBvZiBzZWNvbmRzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ZyZWV6ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNvbW1lbnQgb2YgYSB0cmFuc2ZlclxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJDb21tZW50KHBhcmFtczogVHJhbnNmZXJDb21tZW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnY29tbWVudCddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkICsgJy9jb21tZW50JykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgYWRkcmVzc2VzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgYWRkcmVzc2VzKHBhcmFtczogQWRkcmVzc2VzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxBZGRyZXNzUXVlcnlSZXN1bHQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMubWluZSkge1xuICAgICAgcXVlcnkubWluZSA9ICEhcGFyYW1zLm1pbmU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNvcnQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuc29ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNvcnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNvcnQgPSBwYXJhbXMuc29ydDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGFiZWxDb250YWlucykge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5sYWJlbENvbnRhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGFiZWxDb250YWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGFiZWxDb250YWlucyA9IHBhcmFtcy5sYWJlbENvbnRhaW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2Vnd2l0IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2Vnd2l0ID0gcGFyYW1zLnNlZ3dpdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmNoYWlucykpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBudW1iZXJzJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5jaGFpbnMgPSBwYXJhbXMuY2hhaW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZUJhbGFuY2VzKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZUJhbGFuY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUJhbGFuY2VzIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZUJhbGFuY2VzID0gcGFyYW1zLmluY2x1ZGVCYWxhbmNlcztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVUb2tlbnMgPSBwYXJhbXMuaW5jbHVkZVRva2VucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudCA9IHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZXR1cm5CYWxhbmNlc0ZvclRva2VuIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5yZXR1cm5CYWxhbmNlc0ZvclRva2VuID0gcGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGVuZGluZ0RlcGxveW1lbnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wZW5kaW5nRGVwbG95bWVudCA9IHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzZXMnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgc29ydGVkIGJ5IGJhbGFuY2UgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXNCeUJhbGFuY2UocGFyYW1zOiBBZGRyZXNzZXNCeUJhbGFuY2VPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyA9IHtcbiAgICAgIHRva2VuOiBwYXJhbXMudG9rZW4sXG4gICAgICBuZnRDb2xsZWN0aW9uSWQ6IHBhcmFtcy5uZnRDb2xsZWN0aW9uSWQsXG4gICAgICBuZnRJZDogcGFyYW1zLm5mdElkLFxuICAgIH07XG4gICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0ID8/IC0xO1xuICAgIHF1ZXJ5LnBhZ2UgPSBwYXJhbXMucGFnZSA/PyAxO1xuICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0ID8/IDUwMDtcblxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5zb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNvcnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LnBhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGFnZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNOdW1iZXIocXVlcnkubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKHF1ZXJ5LmxpbWl0IDwgMSB8fCBxdWVyeS5saW1pdCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaW1pdCBhcmd1bWVudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTAwJyk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0IHRoYXQgZWl0aGVyIGJvdGggbmZ0Q29sbGVjdGlvbklkIGFuZCBuZnRJZCBhcmUgcHJvdmlkZWQgb3IgbmVpdGhlciBhcmUgcHJvdmlkZWRcbiAgICBjb25zdCBoYXNOZnRDb2xsZWN0aW9uSWQgPSAhXy5pc1VuZGVmaW5lZChxdWVyeS5uZnRDb2xsZWN0aW9uSWQpO1xuICAgIGNvbnN0IGhhc05mdElkID0gIV8uaXNVbmRlZmluZWQocXVlcnkubmZ0SWQpO1xuICAgIGlmIChoYXNOZnRDb2xsZWN0aW9uSWQgIT09IGhhc05mdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25mdENvbGxlY3Rpb25JZCBhbmQgbmZ0SWQgbXVzdCBib3RoIGJlIHByb3ZpZGVkIG9yIGJvdGggYmUgb21pdHRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3Nlcy9iYWxhbmNlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB3YWxsZXQgYWRkcmVzcyBieSBpdHMgaWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldEFkZHJlc3MocGFyYW1zOiBHZXRBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydhZGRyZXNzJywgJ2lkJ10pO1xuICAgIGxldCBxdWVyeTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb25lIG9yIG1vcmUgbmV3IGFkZHJlc3MoZXMpIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbiAgICpcbiAgICogSWYgdGhlIGBjb3VudGAgZmllbGQgaXMgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDEsIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlXG4gICAqIGFycmF5IHByb3BlcnR5IG5hbWVkIGBhZGRyZXNzZXNgIGNvbnRhaW5pbmcgYGNvdW50YCBhZGRyZXNzIG9iamVjdHNcbiAgICogd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHNpbmdsZSBhZGRyZXNzIG9iamVjdCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNoYWluIG9uIHdoaWNoIHRoZSBuZXcgYWRkcmVzcyBzaG91bGQgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0geyhOdW1iZXJ8U3RyaW5nKX0gcGFyYW1zLmdhc1ByaWNlIGdhcyBwcmljZSBmb3IgbmV3IGFkZHJlc3MgY3JlYXRpb24sIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5sYWJlbCBsYWJlbCBmb3IgdGhlIG5ldyBhZGRyZXNzKGVzKVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNvdW50PTEgbnVtYmVyIG9mIG5ldyBhZGRyZXNzZXMgd2hpY2ggc2hvdWxkIGJlIGNyZWF0ZWQgKG1heGltdW0gMjUwKVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZvcndhcmRlclZlcnNpb24gVGhlIHZlcnNpb24gb2YgYWRkcmVzcyB0byBjcmVhdGUsIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubG93UHJpb3JpdHkgRXRoZXJldW0tc3BlY2lmaWMgcGFyYW0gdG8gY3JlYXRlIGFkZHJlc3MgdXNpbmcgbG93IHByaW9yaXR5IGZlZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYmFzZUFkZHJlc3MgYmFzZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQob3B0aW9uYWwgcGFyYW1ldGVyKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5hbGxvd1NraXBWZXJpZnlBZGRyZXNzIFdoZW4gc2V0IHRvIGZhbHNlLCBpdCB0aHJvd3MgZXJyb3IgaWYgYWRkcmVzcyB2ZXJpZmljYXRpb24gaXMgc2tpcHBlZCBmb3IgYW55IHJlYXNvbi4gRGVmYXVsdCBpcyB0cnVlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm9uVG9rZW4gbWFuZGF0b3J5IGluIGNhc2Ugb2YgdGhlIE9GQyB3YWxsZXQsIHRoZSBuYW1lIG9mIHRva2VuIHRvIGNyZWF0ZSBhZGRyZXNzIGZvclxuICAgKiBBZGRyZXNzIHZlcmlmaWNhdGlvbiBjYW4gYmUgc2tpcHBlZCB3aGVuIGZvcndhcmRlclZlcnNpb24gaXMgMCBhbmQgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gaXMgdHJ1ZSBPUlxuICAgKiBpZiAnY29pblNwZWNpZmljJyBpcyBub3QgcGFydCBvZiB0aGUgcmVzcG9uc2UgZnJvbSBhcGkgY2FsbCB0byBjcmVhdGUgYWRkcmVzc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWRkcmVzcyhwYXJhbXM6IENyZWF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3NQYXJhbXM6IENyZWF0ZUFkZHJlc3NPcHRpb25zID0ge307XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2hhaW4sXG4gICAgICBnYXNQcmljZSxcbiAgICAgIGxhYmVsLFxuICAgICAgbG93UHJpb3JpdHksXG4gICAgICBmb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgZm9ybWF0LFxuICAgICAgY291bnQgPSAxLFxuICAgICAgYmFzZUFkZHJlc3MsXG4gICAgICBhbGxvd1NraXBWZXJpZnlBZGRyZXNzID0gdHJ1ZSxcbiAgICAgIG9uVG9rZW4sXG4gICAgICBldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyxcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGNoYWluKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihjaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbiBoYXMgdG8gYmUgYW4gaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5jaGFpbiA9IGNoYWluO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChnYXNQcmljZSkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZ2FzUHJpY2UpICYmIChpc05hTihOdW1iZXIoZ2FzUHJpY2UpKSB8fCAhXy5pc1N0cmluZyhnYXNQcmljZSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2FzUHJpY2UgaGFzIHRvIGJlIGFuIGludGVnZXIgb3IgbnVtZXJpYyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9yd2FyZGVyVmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZm9yd2FyZGVyVmVyc2lvbikgfHwgZm9yd2FyZGVyVmVyc2lvbiA8IDAgfHwgZm9yd2FyZGVyVmVyc2lvbiA+IDUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXJWZXJzaW9uIGhhcyB0byBiZSBhbiBpbnRlZ2VyIDAsIDEsIDIsIDMsIDQgb3IgNScpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobGFiZWwpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcobGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbGFiZWwgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmxhYmVsID0gbGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhc2VBZGRyZXNzKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGJhc2VBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jhc2VBZGRyZXNzIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChhbGxvd1NraXBWZXJpZnlBZGRyZXNzKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihhbGxvd1NraXBWZXJpZnlBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbG93U2tpcFZlcmlmeUFkZHJlc3MgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0ludGVnZXIoY291bnQpIHx8IGNvdW50IDw9IDAgfHwgY291bnQgPiAyNTApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bnQgaGFzIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgMjUwJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxvd1ByaW9yaXR5KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihsb3dQcmlvcml0eSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb3dQcmlvcml0eSBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmxvd1ByaW9yaXR5ID0gbG93UHJpb3JpdHk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcm1hdCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhmb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9ybWF0IGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdvZmMnKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQob25Ub2tlbikpIHtcbiAgICAgICAgaWYgKCFfLmlzU3RyaW5nKG9uVG9rZW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NQYXJhbXMub25Ub2tlbiA9IG9uVG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBPRkMgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzU3RyaW5nKG9uVG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNFVk0oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBFVk0gY2hhaW5zJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MoZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MgbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MgPSBldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcztcbiAgICB9XG5cbiAgICAvLyBnZXQga2V5Y2hhaW5zIGZvciBhZGRyZXNzIHZlcmlmaWNhdGlvblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX3dhbGxldC5rZXlzLm1hcCgoaykgPT4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogaywgcmVxSWQgfSkpKTtcbiAgICBjb25zdCByb290QWRkcmVzcyA9IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ3JlY2VpdmVBZGRyZXNzLmFkZHJlc3MnKTtcblxuICAgIGNvbnN0IG5ld0FkZHJlc3NlcyA9IF8udGltZXMoY291bnQsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgICBjb25zdCBuZXdBZGRyZXNzID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzcycpKVxuICAgICAgICAuc2VuZChhZGRyZXNzUGFyYW1zKVxuICAgICAgICAucmVzdWx0KCkpIGFzIGFueTtcblxuICAgICAgLy8gaW5mZXIgaXRzIGFkZHJlc3MgdHlwZVxuICAgICAgaWYgKF8uaXNPYmplY3QobmV3QWRkcmVzcy5jb2luU3BlY2lmaWMpKSB7XG4gICAgICAgIG5ld0FkZHJlc3MuYWRkcmVzc1R5cGUgPSBpbmZlckFkZHJlc3NUeXBlKG5ld0FkZHJlc3MpO1xuICAgICAgfVxuXG4gICAgICBuZXdBZGRyZXNzLmtleWNoYWlucyA9IGtleWNoYWlucztcbiAgICAgIG5ld0FkZHJlc3MuYmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzcyA/PyBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MnKTtcbiAgICAgIG5ld0FkZHJlc3MuZm9ybWF0ID0gYWRkcmVzc1BhcmFtcy5mb3JtYXQ7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywge1xuICAgICAgICByb290QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLndhbGxldFZlcnNpb24nKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodmVyaWZpY2F0aW9uRGF0YS5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWRkcmVzc0dlbmVyYXRpb25FcnJvcih2ZXJpZmljYXRpb25EYXRhLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb24gPz8gdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWM/LmZvcndhcmRlclZlcnNpb247XG5cbiAgICAgIC8vIEZvciBTTUMgKFNlbGYtTWFuYWdlZCBDdXN0b2RpYWwpIHdhbGxldHMsIHBhc3MgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBmcm9tIHVzZXIga2V5Y2hhaW5cbiAgICAgIC8vIFRoZSB2ZXJpZmljYXRpb24gZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBkZXJpdmF0aW9uIHByZWZpeCBpbnRlcm5hbGx5XG4gICAgICAvLyBDdXN0b2RpYWwgd2FsbGV0cyBkb24ndCBuZWVkIHRoaXMgYXMgdGhlaXIgY29tbW9uS2V5Y2hhaW4gYWxyZWFkeSBhY2NvdW50cyBmb3IgdGhlIHByZWZpeFxuICAgICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnICYmIHRoaXMudHlwZSgpID09PSAnY29sZCcgJiYgdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoID4gS2V5SW5kaWNlcy5VU0VSKSB7XG4gICAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1tLZXlJbmRpY2VzLlVTRVJdIGFzIEtleWNoYWluIHwgdW5kZWZpbmVkO1xuICAgICAgICB2ZXJpZmljYXRpb25EYXRhLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSB1c2VyS2V5Y2hhaW4/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVdhbGxldEJ1aWxkRGVmYXVsdHMocGFyYW1zOiBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWluRmVlUmF0ZScsICdjaGFuZ2VBZGRyZXNzVHlwZScsICd0eEZvcm1hdCddKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVXYWxsZXQoe1xuICAgICAgYnVpbGREZWZhdWx0czoge1xuICAgICAgICBtaW5GZWVSYXRlOiBwYXJhbXMubWluRmVlUmF0ZSxcbiAgICAgICAgY2hhbmdlQWRkcmVzc1R5cGU6IHBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSxcbiAgICAgICAgdHhGb3JtYXQ6IHBhcmFtcy50eEZvcm1hdCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVXYWxsZXQocGFyYW1zOiBVcGRhdGVXYWxsZXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvaW5TcGVjaWZpYycsICdidWlsZERlZmF1bHRzJywgJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHsgY29pblNwZWNpZmljLCAuLi5yZXN0IH0gPSBmaWx0ZXJlZFBhcmFtcztcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICAuLi5yZXN0LFxuICAgICAgICAuLi4oY29pblNwZWNpZmljXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgIFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiBjb2luU3BlY2lmaWMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoZSB1c2VyIGtleWNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBwYXNzcGhyYXNlIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRlY3J5cHRpbmcgd2FsbGV0IHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgcHJpdmF0ZSBpc011bHRpVXNlcktleVdhbGxldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uZmVhdHVyZXM/LmluY2x1ZGVzKCdtdWx0aS1rZXktdXNlci1rZXknKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGVuY3J5cHRlZCB3YWxsZXQgc2hhcmUgdG8gQml0R28uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlKHBhcmFtczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSk7XG5cbiAgICBjb25zdCBpc011bHRpVXNlcktleVdhbGxldCA9IHRoaXMuaXNNdWx0aVVzZXJLZXlXYWxsZXQoKTtcblxuICAgIGlmIChpc011bHRpVXNlcktleVdhbGxldCkge1xuICAgICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBwcm92aWRlZCBmb3IgbXVsdGkta2V5LXVzZXIta2V5IHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBrZXljaGFpbiBmcm9tIHBhcmFtcyBpZiBwcmVzZW50c1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQoXy5vbWl0KHBhcmFtcywgJ2tleWNoYWluJykpLnJlc3VsdCgpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4ucHViIHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4uZnJvbVB1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4ucGF0aFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHB1YiwgZW5jcnlwdGVkUHJ2LCBmcm9tUHViS2V5LCB0b1B1YktleSwgcGF0aCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVzIGEgd2FsbGV0IHdpdGggbXVsdGlwbGUgdXNlcnMgYnkgY3JlYXRpbmcgYnVsayB3YWxsZXQgc2hhcmVzLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtCdWxrV2FsbGV0U2hhcmVPcHRpb25zfSBwYXJhbXMgLSBUaGUgb3B0aW9ucyBmb3Igc2hhcmluZyB3YWxsZXRzIGluIGJ1bGsuXG4gICAqIEBwYXJhbSB7QXJyYXk8U2hhcmVPcHRpb24+fSBwYXJhbXMuc2hhcmVPcHRpb25zIC0gQW4gYXJyYXkgb2Ygc2hhcmUgb3B0aW9uIG9iamVjdHMgY29udGFpbmluZyB1c2VyIGFuZCBwZXJtaXNzaW9ucyBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW5dIC0gVGhlIGtleWNoYWluIG9iamVjdCB1c2VkIHRvIHNoYXJlIHRoZSB3YWxsZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluLnRvUHViS2V5XSAtIFRoZSByZWNpcGllbnQncyBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbi5wYXRoXSAtIFRoZSBkZXJpdmF0aW9uIHBhdGggb2YgdGhlIGtleWNoYWluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNoYXJlT3B0aW9uc1tdLnVzZXIgLSBUaGUgdXNlciB0byBzaGFyZSB0aGUgd2FsbGV0IHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2hhcmVPcHRpb25zW10ucGVybWlzc2lvbnMgLSBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMud2FsbGV0UGFzc3BocmFzZV0gLSBUaGUgd2FsbGV0IHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXljaGFpbi5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGBzaGFyZU9wdGlvbnNgIGlzIGVtcHR5LCBvciBpZiByZXF1aXJlZCBrZXljaGFpbiBwYXJhbWV0ZXJzIChgdG9QdWJLZXlgIGFuZCBgcGF0aGApIGFyZSBtaXNzaW5nIHdoZW4gbmVlZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdW5hYmxlIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5Y2hhaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIG9mIHRoZSBidWxrIHdhbGxldCBzaGFyZSBjcmVhdGlvbi5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJ1bGtXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT4ge1xuICAgIGlmIChwYXJhbXMua2V5U2hhcmVPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaGFyZSBvcHRpb25zIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVsa0NyZWF0ZVNoYXJlT3B0aW9uczogQnVsa0NyZWF0ZVNoYXJlT3B0aW9uW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGlmIGFueSBzaGFyZSBvcHRpb24gbmVlZHMgYSBrZXljaGFpbiAoaGFzICdzcGVuZCcgcGVybWlzc2lvbilcbiAgICBjb25zdCBhbnlOZWVkc0tleWNoYWluID0gcGFyYW1zLmtleVNoYXJlT3B0aW9ucy5zb21lKChvcHQpID0+IG9wdC5wZXJtaXNzaW9ucyAmJiBvcHQucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykpO1xuXG4gICAgLy8gRmV0Y2ggYW5kIGRlY3J5cHQgdGhlIGtleWNoYWluIE9OQ0UgZm9yIGFsbCB1c2Vyc1xuICAgIGxldCBkZWNyeXB0ZWRLZXljaGFpbjogRGVjcnlwdGVkS2V5Y2hhaW5EYXRhIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFueU5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlY3J5cHRlZEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKSB7XG4gICAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2hhcmVPcHRpb24gb2YgcGFyYW1zLmtleVNoYXJlT3B0aW9ucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHNoYXJlT3B0aW9uLCBbJ3VzZXJJZCcsICdwdWJLZXknLCAncGF0aCddLCBbXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghc2hhcmVPcHRpb24ucHViS2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5lZWRVc2VyU2lnbnVwRXJyb3Ioc2hhcmVPcHRpb24udXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZWVkc0tleWNoYWluID0gc2hhcmVPcHRpb24ucGVybWlzc2lvbnMgJiYgc2hhcmVPcHRpb24ucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJyk7XG5cbiAgICAgIGlmIChuZWVkc0tleWNoYWluICYmIGRlY3J5cHRlZEtleWNoYWluKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleWNoYWluID0gdGhpcy5lbmNyeXB0UHJ2Rm9yVXNlcihcbiAgICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbi5wcnYsXG4gICAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4ucHViLFxuICAgICAgICAgIHNoYXJlT3B0aW9uLnB1YktleSxcbiAgICAgICAgICBzaGFyZU9wdGlvbi5wYXRoXG4gICAgICAgICk7XG5cbiAgICAgICAgYnVsa0NyZWF0ZVNoYXJlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICB1c2VyOiBzaGFyZU9wdGlvbi51c2VySWQsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHNoYXJlT3B0aW9uLnBlcm1pc3Npb25zLFxuICAgICAgICAgIGtleWNoYWluOiBzaGFyZWRLZXljaGFpbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQnVsa0tleVNoYXJlcyhidWxrQ3JlYXRlU2hhcmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGJ1bGsgd2FsbGV0IHNoYXJlIGVudHJpZXMgZm9yIHNwZWNpZmllZCBzaGFyZSBvcHRpb25zLlxuICAgKiBGaWx0ZXJzIG91dCBzaGFyZSBvcHRpb25zIHRoYXQgZG8gbm90IGNvbnRhaW4gdmFsaWQga2V5Y2hhaW4gaW5mb3JtYXRpb24gb3IgaGF2ZSBtaXNzaW5nIGtleWNoYWluIGZpZWxkcy5cbiAgICogSWYgYWxsIHNoYXJlIG9wdGlvbnMgYXJlIGludmFsaWQgb3IgZW1wdHksIGl0IHRocm93cyBhbiBlcnJvci5cbiAgICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSB3YWxsZXQgc2hhcmVzIGZvciB2YWxpZCBzaGFyZSBvcHRpb25zLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXX0gW3BhcmFtcz1bXV0gLSBUaGUgYXJyYXkgb2Ygc2hhcmUgb3B0aW9ucyB0byBwcm9jZXNzLlxuICAgKiAgIEtleWNoYWluIGVudHJpZXMgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBgcHViYCwgYGVuY3J5cHRlZFBydmAsIGBmcm9tUHViS2V5YCwgYHRvUHViS2V5YCwgYW5kIGBwYXRoYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPn0gQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0IG9mIHRoZSB3YWxsZXQgc2hhcmVzIGNyZWF0aW9uLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHNoYXJlIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQnVsa0tleVNoYXJlcyhwYXJhbXM6IEJ1bGtDcmVhdGVTaGFyZU9wdGlvbltdID0gW10pOiBQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5maWx0ZXIoKHNoYXJlT3B0aW9uKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMoc2hhcmVPcHRpb24ua2V5Y2hhaW4sIFsncHViJywgJ2VuY3J5cHRlZFBydicsICdmcm9tUHViS2V5JywgJ3RvUHViS2V5JywgJ3BhdGgnXSwgW10pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhjbHVkZSBzaGFyZSBvcHRpb25zIHdpdGggaW52YWxpZCBrZXljaGFpblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXBhcmFtcyB8fCBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZU9wdGlvbnMgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L3dhbGxldHNoYXJlc2AsIDIpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHsgc2hhcmVPcHRpb25zOiBwYXJhbXMgfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXljaGFpbiB3aXRoIGVuY3J5cHRlZCBwcml2YXRlIGtleSB0byBiZSBzaGFyZWQgZm9yIHdhbGxldCBzaGFyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbmNyeXB0ZWRXYWxsZXRLZXljaGFpbkZvcldhbGxldFNoYXJpbmcoKTogUHJvbWlzZTxLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2xuYnRjJykge1xuICAgICAgLy8gbGlnaHRuaW5nIGNvaW4gZG9lcyBub3QgdXNlIHVzZXIga2V5IHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9ucyBmcm9tIFNESy5cbiAgICAgIC8vIGl0IHVzZXMgdXNlciBhdXRoIGtleSBpbnN0ZWFkLlxuICAgICAgcmV0dXJuIGF3YWl0IGdldExpZ2h0bmluZ0F1dGhLZXkodGhpcywgJ3VzZXJBdXRoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuZCBkZWNyeXB0cyB0aGUgd2FsbGV0IGtleWNoYWluIGZvciBzaGFyaW5nLlxuICAgKiBUaGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBrZXljaGFpbiBvbmNlIGFuZCBkZWNyeXB0cyBpdCwgcmV0dXJuaW5nIHRoZSBkZWNyeXB0ZWRcbiAgICogcHJpdmF0ZSBrZXkgYW5kIHB1YmxpYyBrZXkgaW5mbyBuZWVkZWQgZm9yIHNoYXJpbmcgd2l0aCBtdWx0aXBsZSB1c2Vycy5cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSBrZXljaGFpblxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkZWNyeXB0ZWQgcHJ2IGFuZCBwdWIsIG9yIHVuZGVmaW5lZCBmb3IgY29sZCB3YWxsZXRzXG4gICAqL1xuICBhc3luYyBnZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcoXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8RGVjcnlwdGVkS2V5Y2hhaW5EYXRhIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFdhbGxldEtleWNoYWluRm9yV2FsbGV0U2hhcmluZygpO1xuXG4gICAgaWYgKCFrZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywga2V5Y2hhaW4sIHdhbGxldFBhc3NwaHJhc2UpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcignUGFzc3dvcmQgc2hhcmVkIGlzIGluY29ycmVjdCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IG9uZSBvZiBwdWIvY29tbW9uUHViL2NvbW1vbktleWNoYWluIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBrZXljaGFpblxuICAgIGxldCBwdWIgPSBrZXljaGFpbi5wdWIgPz8ga2V5Y2hhaW4uY29tbW9uUHViO1xuICAgIGlmIChrZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgcHViID1cbiAgICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VkZHNhJ1xuICAgICAgICAgID8gRWRkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pXG4gICAgICAgICAgOiBFY2RzYVV0aWxzLmdldFB1YmxpY0tleUZyb21Db21tb25LZXljaGFpbihrZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgfVxuXG4gICAgaWYgKCFwdWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBwdWJsaWMga2V5IGZyb20ga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcnYsIHB1YiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY3J5cHRzIGEgZGVjcnlwdGVkIHByaXZhdGUga2V5IGZvciBzaGFyaW5nIHdpdGggYSBzcGVjaWZpYyB1c2VyLlxuICAgKiBUaGlzIGlzIHRoZSBwdXJlIGVuY3J5cHRpb24gc3RlcCAtIG5vIEFQSSBjYWxscywgbm8gZGVjcnlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZFBydiAtIFRoZSBhbHJlYWR5LWRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0gcHViIC0gVGhlIHdhbGxldCdzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHVzZXJQdWJrZXkgLSBUaGUgcmVjaXBpZW50IHVzZXIncyBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGtleSBwYXRoXG4gICAqIEByZXR1cm5zIFRoZSBlbmNyeXB0ZWQga2V5Y2hhaW4gZm9yIHRoZSByZWNpcGllbnQgd2l0aCBhbGwgcmVxdWlyZWQgZmllbGRzXG4gICAqL1xuICBlbmNyeXB0UHJ2Rm9yVXNlcihkZWNyeXB0ZWRQcnY6IHN0cmluZywgcHViOiBzdHJpbmcsIHVzZXJQdWJrZXk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4ge1xuICAgIGNvbnN0IGVja2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20odXNlclB1YmtleSwgJ2hleCcpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHsgcGFzc3dvcmQ6IHNlY3JldCwgaW5wdXQ6IGRlY3J5cHRlZFBydiB9KTtcblxuICAgIGNvbnN0IGtleWNoYWluOiBCdWxrV2FsbGV0U2hhcmVLZXljaGFpbiA9IHtcbiAgICAgIHB1YixcbiAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHRvUHViS2V5OiB1c2VyUHVia2V5LFxuICAgICAgcGF0aDogcGF0aCxcbiAgICB9O1xuXG4gICAgYXNzZXJ0KGtleWNoYWluLnB1YiwgJ3B1YiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCAnZW5jcnlwdGVkUHJ2IG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuICAgIGFzc2VydChrZXljaGFpbi5mcm9tUHViS2V5LCAnZnJvbVB1YktleSBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4udG9QdWJLZXksICd0b1B1YktleSBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4ucGF0aCwgJ3BhdGggbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG5cbiAgICByZXR1cm4ga2V5Y2hhaW47XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBrZXljaGFpbiBmb3Igc2hhcmluZyB3aXRoIGFub3RoZXIgdXNlci5cbiAgICogRmV0Y2hlcyB0aGUgd2FsbGV0IGtleWNoYWluLCBkZWNyeXB0cyBpdCwgYW5kIGVuY3J5cHRzIGl0IGZvciB0aGUgcmVjaXBpZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIGtleWNoYWluXG4gICAqIEBwYXJhbSBwdWJrZXkgLSBUaGUgcmVjaXBpZW50J3MgcHVibGljIGtleVxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBrZXkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgZW5jcnlwdGVkIGtleWNoYWluIGZvciB0aGUgcmVjaXBpZW50XG4gICAqL1xuICBhc3luYyBwcmVwYXJlU2hhcmVkS2V5Y2hhaW4oXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmtleTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPFNoYXJlZEtleUNoYWluPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcod2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIWRlY3J5cHRlZEtleWNoYWluKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRQcnZGb3JVc2VyKGRlY3J5cHRlZEtleWNoYWluLnBydiwgZGVjcnlwdGVkS2V5Y2hhaW4ucHViLCBwdWJrZXksIHBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpIHtcbiAgICAgICAgLy8gaWdub3JlIHRoaXMgZXJyb3IgYmVjYXVzZSB0aGlzIGxvb2tzIGxpa2UgYSBjb2xkIHdhbGxldFxuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSB0aGlzIHdhbGxldCB3aXRoIGFub3RoZXIgQml0R28gdXNlci5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNoYXJlV2FsbGV0KHBhcmFtczogU2hhcmVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ21lc3NhZ2UnXSk7XG4gICAgaWYgKHBhcmFtcy5yZXNoYXJlICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5yZXNoYXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNoYXJlIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNraXBLZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2tpcEtleWNoYWluKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBza2lwS2V5Y2hhaW4gdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbXVsdGkta2V5LXVzZXIta2V5IE9GQyB3YWxsZXRcbiAgICAvLyBGb3IgbXVsdGkta2V5LXVzZXIta2V5IHdhbGxldHMsIHNraXAga2V5Y2hhaW4gcHJlcGFyYXRpb24gcmVnYXJkbGVzcyBvZiBvdGhlciBjb25kaXRpb25zXG4gICAgY29uc3QgbmVlZHNLZXljaGFpbiA9XG4gICAgICAhdGhpcy5pc011bHRpVXNlcktleVdhbGxldCgpICYmXG4gICAgICAhcGFyYW1zLnNraXBLZXljaGFpbiAmJlxuICAgICAgcGFyYW1zLnBlcm1pc3Npb25zICYmXG4gICAgICBwYXJhbXMucGVybWlzc2lvbnMuaW5kZXhPZignc3BlbmQnKSAhPT0gLTE7XG5cbiAgICBpZiAocGFyYW1zLmRpc2FibGVFbWFpbCAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlRW1haWwgdG8gYmUgYSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBlbWFpbCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmcgPSAoYXdhaXQgdGhpcy5iaXRnby5nZXRTaGFyaW5nS2V5KHtcbiAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwudG9Mb3dlckNhc2UoKSxcbiAgICB9KSkgYXMgYW55O1xuICAgIGxldCBzaGFyZWRLZXljaGFpbjtcbiAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgc2hhcmVkS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLnByZXBhcmVTaGFyZWRLZXljaGFpbihwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgc2hhcmluZy5wdWJrZXksIHNoYXJpbmcucGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIHNraXBLZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCxcbiAgICAgIGtleWNoYWluOiBPYmplY3Qua2V5cyhzaGFyZWRLZXljaGFpbiA/PyB7fSkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc2hhcmVkS2V5Y2hhaW4sXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIGZyb20gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB1c2VySWQgSWQgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVVc2VyKHBhcmFtczogUmVtb3ZlVXNlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VySWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXNlcklkID0gcGFyYW1zLnVzZXJJZDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy91c2VyLycgKyB1c2VySWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkICh1bnNpZ25lZCB0cmFuc2FjdGlvbikgZnJvbSBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgdW5zcGVudHMgZ29pbmcgaW50byB0aGlzIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2UgbWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyBvbiBjaGFuZ2UgKGludGVybmFsKSBpbnB1dHMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0LiBJZiB0aGUgd2FsbGV04oCZcyBjdXJyZW50IHVuc3BlbnQgY291bnQgaXMgbG93ZXIgdGhhbiB0aGUgdGFyZ2V0LCB1cCB0byBmb3VyIGFkZGl0aW9uYWwgY2hhbmdlIG91dHB1dHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNMaW1pdCAtIEN1c3RvbSBnYXMgbGltaXQgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9uUGFydGljaXBhdGlvbiAtIChBbGdvcmFuZCkgTm9uIHBhcnRpY2lwYXRpbmcga2V5IHJlZyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkRnJvbUJsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWluaW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRUb0Jsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWF4aW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBCdWlsZCB0aGlzIHRyYW5zYWN0aW9uIHRvIGNvbmZvcm0gd2l0aCBpbnN0YW50IHNlbmRpbmcgY29pbi1zcGVjaWZpYyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMua2VlcEFsaXZlIC0gKFBvbGthZG90KSBrZWVwIGFkZHJlc3MgYWxpdmUgYnkgc2VuZGluZyB0aGUgYWRkcmVzcyBtaW5pbXVtIGZ1bmRpbmcgYW1vdW50LCB1c2VkIGR1cmluZyB3YWxsZXQgY29uc29saWRhdGlvbiwgdHJ1ZSBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW0udHJhbnNmZXJJZCAtIHRyYW5zZmVyIElkIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IGNhc3BlcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzVHlwZSAtIFRoZSB0eXBlIG9mIGFkZHJlc3MgdG8gY3JlYXRlIGZvciBjaGFuZ2UuIE9uZSBvZiBgcDJzaGAsIGBwMnNoUDJ3c2hgLCBhbmQgYHAyd3NoYC4gQ2FzZS1zZW5zaXRpdmUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmhvcCAtIEJ1aWxkIHRoaXMgYXMgYW4gRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMucmVzZXJ2YXRpb24gLSBPYmplY3QgdG8gcmVzZXJ2ZSB0aGUgdW5zcGVudHMgdGhhdCB0aGlzIHR4IGJ1aWxkIHVzZXMuIEZvcm1hdCBpcyByZXNlcnZhdGlvbiA9IHsgZXhwaXJlVGltZTogSVNPRGF0ZVN0cmluZywgcGVuZGluZ0FwcHJvdmFsSWQ6IFN0cmluZyB9XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSB0byB0aGUgd2FsbGV0IHVzZXIga2V5LCB0byBzaWduIGNvbW1pdG1lbnQgZGF0YSBmb3IgRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIHVzZWQgYXMgdGhlIFwidG9cIiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgT2JqZWN0LmFzc2lnbih3aGl0ZWxpc3RlZFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogcGFyYW1zLm9mZmxpbmVWZXJpZmljYXRpb24gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBidWlsZFF1ZXJ5ID0gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvYnVpbGQnKSlcbiAgICAgIC5xdWVyeShxdWVyeVBhcmFtcylcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgYmxvY2tIZWlnaHRRdWVyeSA9IF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KVxuICAgICAgPyAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KHBhcmFtcy5yZXFJZClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcXVlcmllcyA9IFtidWlsZFF1ZXJ5LCBibG9ja0hlaWdodFF1ZXJ5XTtcbiAgICBjb25zdCBbYnVpbGRSZXNwb25zZSwgYmxvY2tIZWlnaHRdID0gKGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpKSBhcyBhbnk7XG4gICAgZGVidWcoJ3Bvc3Rwcm9jZXNzaW5nIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIGJ1aWxkUmVzcG9uc2UpO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChibG9ja0hlaWdodCkpIHtcbiAgICAgIGJ1aWxkUmVzcG9uc2UuYmxvY2tIZWlnaHQgPSBibG9ja0hlaWdodDtcbiAgICB9XG4gICAgbGV0IHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgIE9iamVjdC5hc3NpZ24oYnVpbGRSZXNwb25zZSwge1xuICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgIH0pXG4gICAgKSkgYXMgYW55O1xuICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgaWYgKHRoaXMuX3dhbGxldCAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljICYmICFwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzKSB7XG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwge1xuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBkZWJ1ZygnZmluYWwgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuICAgIHJldHVybiBwcmVidWlsZCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFVzZXIgS2V5Y2hhaW4gYW5kIHNpZ24gYSBUU1MgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4UmVxdWVzdElkIFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlkXG4gICAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIFRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBhc3luYyBnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uKHtcbiAgICB0eFJlcXVlc3RJZCxcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICB9OiB7XG4gICAgdHhSZXF1ZXN0SWQ6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1swXTtcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgdXNlciBrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IHR4UmVxdWVzdElkIH0sXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVxSWQsXG4gICAgICBrZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIFtrZXljaGFpbiAvIGtleV0gKG9iamVjdCkgb3IgcHJ2IChzdHJpbmcpXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiAtIHZlcmlmeVR4UGFyYW1zIChvcHRpb25hbCkgLSB3aGVuIHByb3ZpZGVkLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSB2ZXJpZmllZCBiZWZvcmUgc2lnbmluZ1xuICAgKiAgIC0gdHhQYXJhbXM6IHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMgdXNlZCBmb3IgdmVyaWZpY2F0aW9uXG4gICAqICAgLSB2ZXJpZmljYXRpb246IG9wdGlvbmFsIHZlcmlmaWNhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgVHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkLCBhcGlWZXJzaW9uLCB0eFJlcXVlc3RJZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFZERTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIHdvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKHRoaXMuYmFzZUNvaW4sIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIE1QQ3Yyd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0FNUEN2Mih0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCB8fCB0eXBlb2YgdHhQcmVidWlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIGlzIHJlcXVpcmVkIGZvciBvbi1jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBvciB0eFJlcXVlc3RJZCBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGV4dGVybmFsIHNpZ25lciBUU1MgZmxvd1xuICAgICAgcGFyYW1zLnR4UHJlYnVpbGQgPSB7IHR4UmVxdWVzdElkIH07XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGlmIHZlcmlmeVR4UGFyYW1zIGlzIHByb3ZpZGVkXG4gICAgaWYgKHBhcmFtcy52ZXJpZnlUeFBhcmFtcyAmJiB0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgY29uc3QgdmVyaWZ5UGFyYW1zID0ge1xuICAgICAgICB0eFByZWJ1aWxkOiB7IC4uLnR4UHJlYnVpbGQgfSxcbiAgICAgICAgdHhQYXJhbXM6IHBhcmFtcy52ZXJpZnlUeFBhcmFtcy50eFBhcmFtcyxcbiAgICAgICAgd2FsbGV0OiB0aGlzIGFzIElXYWxsZXQsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogcGFyYW1zLnZlcmlmeVR4UGFyYW1zLnZlcmlmaWNhdGlvbixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5tdWx0aXNpZ1R5cGUoKSBhcyAnb25jaGFpbicgfCAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5UGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJlxuICAgICAgIShwYXJhbXMua2V5Y2hhaW4gfHwgcGFyYW1zLmtleSkgJiZcbiAgICAgICh0aGlzLnR5cGUoKSA9PT0gJ2hvdCcgfHwgdGhpcy50eXBlKCkgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIC8vIHRoaXMgbG9naWMgc2hvdWxkIG9ubHkgYXBwbHkgdG8gaG90IHdhbGxldHNcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1swXTtcbiAgICAgIGlmICghdXNlcktleWNoYWluIHx8ICF1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5rZXljaGFpbiA9IHVzZXJLZXljaGFpbjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzaWduID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5wcmVzaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzcyh7XG4gICAgICAgIC4uLnByZXNpZ24sXG4gICAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHsgcHVicyB9ID0gcGFyYW1zO1xuICAgIGlmICghcHVicyAmJiB0aGlzLmJhc2VDb2luLmtleUlkc0ZvclNpZ25pbmcoKS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgcHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucHJlc2lnbixcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4udHhQcmVidWlsZCwgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLCBzaWduVHJhbnNhY3Rpb25QYXJhbXMpO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCA9IHtcbiAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uU2VlZDoga2V5c1swXT8uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbihzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHlwZWQgc3RydWN0dXJlZCBkYXRhIHVzaW5nIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduVHlwZWREYXRhKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNTaWduaW5nVHlwZWREYXRhKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbiB0eXBlZCBkYXRhIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy50eXBlZERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZWQgZGF0YSByZXF1aXJlZGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlZERhdGEudHlwZWREYXRhUmF3IG11c3QgYmUgSlNPTiBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YSkpIHtcbiAgICAgIHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKHBhcmFtcy50eXBlZERhdGEpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICBwdWI6IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zaWduVHlwZWREYXRhVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqICBTaWduIGEgbWVzc2FnZSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIE1lc3NhZ2VcbiAgICogLSBjdXN0b2RpYW5NZXNzYWdlSWRcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMubWVzc2FnZSB8fCAhcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVN0YW5kYXJkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGFuZCB0eXBlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZSkpIHtcbiAgICAgIHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVNZXNzYWdlKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnbk1lc3NhZ2VUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW5kIGNyZWF0ZXMgYSBzaWduIG1lc3NhZ2UgcmVxdWVzdCBmb3IgVFNTIHdhbGxldHMsIHRoYXQgY2FuIGJlIHVzZWQgbGF0ZXIgZm9yIHNpZ25pbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciBjcmVhdGluZyB0aGUgc2lnbiBtZXNzYWdlIHJlcXVlc3RcbiAgICogQHJldHVybnMgUHJvbWlzZTxUeFJlcXVlc3Q+IC0gVGhlIGNyZWF0ZWQgdHJhbnNhY3Rpb24gcmVxdWVzdCBmb3Igc2lnbmluZyBhIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c01lc3NhZ2VTaWduaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcgfHwgIXBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlU3RhbmRhcmRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgYW5kIHR5cGUgcmVxdWlyZWQgdG8gY3JlYXRlIG1lc3NhZ2Ugc2lnbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuICAgIGNvbnN0IG1lc3NhZ2VTdGFuZGFyZFR5cGUgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlU3RhbmRhcmRUeXBlO1xuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICAgIHJlcUlkLFxuICAgICAgICBpbnRlbnRUeXBlOiAnc2lnbk1lc3NhZ2UnLFxuICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZVN0YW5kYXJkVHlwZSxcbiAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGhpcy50c3NVdGlscykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RTUyB1dGlsaXRpZXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRzc1V0aWxzLmJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KGludGVudE9wdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIHNpZ24gcmVxdWVzdDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByaXZhdGUga2V5IGZyb20gZWl0aGVyIGEgZGVyaXZhdGlvbiBvciBhbiBlbmNyeXB0ZWQga2V5Y2hhaW5cbiAgICogQHBhcmFtIFtwYXJhbXMua2V5Y2hhaW4gLyBwYXJhbXMua2V5XSAob2JqZWN0KSBvciBwYXJhbXMucHJ2IChzdHJpbmcpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAoc3RyaW5nKVxuICAgKi9cbiAgZ2V0VXNlclBydihwYXJhbXM6IEdldFVzZXJQcnZPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHBhcmFtcy5rZXljaGFpbiB8fCBwYXJhbXMua2V5O1xuICAgIGxldCB1c2VyUHJ2ID0gcGFyYW1zLnBydjtcbiAgICBpZiAodXNlclBydiAmJiB0eXBlb2YgdXNlclBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyB1c2UgdGhlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCBwcm9wZXJ0eSBmcm9tIHRoZSB1c2VyIGtleWNoYWluIGFzIHRoZSBgY29sZERlcml2YXRpb25TZWVkYFxuICAgIC8vIGlmIG5vIG90aGVyIGBjb2xkRGVyaXZhdGlvblNlZWRgIHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgLy8gT25seSBmb3Igb25jaGFpbiBtdWx0aXNpZyB3YWxsZXRzLCBUU1Mga2V5IGRlcml2YXRpb24gaGFwcGVucyBkdXJpbmcgdGhlIHNpZ25pbmcgcHJvY2Vzc1xuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoe1xuICAgICAgICBrZXk6IHVzZXJQcnYsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICB9KTtcbiAgICAgIHVzZXJQcnYgPSBkZXJpdmF0aW9uLmtleTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmICghdXNlckVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBwcm9wZXJ0eSBtaXNzaW5nJyk7XG4gICAgICB9XG4gICAgICB1c2VyUHJ2ID0gZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIGlmICghdXNlclBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBCaXRHbywgdmFsaWRhdGUgaXQsIGFuZCB0aGVuIGRlY3J5cHQgdGhlIHVzZXIga2V5IGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSAmJiBwYXJhbXMuZ2FzUHJpY2UpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHBhcmFtcy5laXAxNTU5IGFuZCBwYXJhbXMuZ2FzUHJpY2UgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX2dhc1ByaWNlX2FuZF9laXAxNTU5Z2FzTW9kZWxfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJlYnVpbGRUeCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcHJlYnVpbGRUeCBhbmQgcmVjaXBpZW50cyBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfcHJlYnVpbGR0eF9hbmRfcmVjaXBpZW50c19zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgYXJyYXknKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucykgJiYgIXRoaXMuX3Blcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdubyBzcGVuZCBwZXJtaXNzaW9uIG9uIHRoaXMgd2FsbGV0Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3VzZXJfbm90X2FsbG93ZWRfdG9fc3BlbmRfZnJvbV93YWxsZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNlaXZlQWRkcmVzcyAmJiAocGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlcicgfHwgcGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlclRva2VuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCB1c2UgcmVjZWl2ZSBhZGRyZXNzIGZvciBUU1MgdHJhbnNhY3Rpb25zIG9mIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjZWl2ZV9hZGRyZXNzX25vdF9hbGxvd2VkX2Zvcl90c3Nfd2l0aGRyYXdhbHMnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmIChwYXJhbXMudHlwZSA9PT0gJ2ZpbGxOb25jZScgfHwgcGFyYW1zLnR5cGUgPT09ICdhY2NlbGVyYXRpb24nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHByb3ZpZGUgcmVjaXBpZW50cyBmb3IgdHJhbnNhY3Rpb24gdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hbGxvd2VkX2Zvcl9maWxsbm9uY2VfYW5kX2FjY2VsZXJhdGlvbl90eF90eXBlJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24pIHtcbiAgICAgIHZhbGlkYXRlVHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB9KTtcblxuICAgIGxldCB0eFByZWJ1aWxkUXVlcnk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHN0cmluZz47XG4gICAgaWYgKGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChwYXJhbXMucHJlYnVpbGRUeCkgJiYgcGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXM/LnByZXZpZXcpIHtcbiAgICAgIC8vIElmIHdlIHByZWJ1aWx0IHRoZSB0eFJlcXVlc3Qgd2l0aCBwcmV2aWV3PXRydWUsIHRoZW4gd2Ugc2hvdWxkIHJlYnVpbGQgd2l0aCBwcmV2aWV3PWZhbHNlIHRvIHBlcnNpc3QgdGhlIHJlcXVlc3RcbiAgICAgIHR4UHJlYnVpbGRRdWVyeSA9IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgLi4ueyAuLi5wYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcywgcHJldmlldzogZmFsc2UgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSBwYXJhbXMucHJlYnVpbGRUeCA/IFByb21pc2UucmVzb2x2ZShwYXJhbXMucHJlYnVpbGRUeCkgOiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsIC4uLnBhcmFtcyB9LFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fSxcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkIGZhaWxlZCBsb2NhbCB2YWxpZGF0aW9uOicsIGUubWVzc2FnZSk7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAndHJhbnNhY3Rpb24gcGFyYW1zOicsXG4gICAgICAgIF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknLCAnd2FsbGV0J10pXG4gICAgICApO1xuICAgICAgLy8gU2FuaXRpemUgdG8gcmVtb3ZlIF90b2tlbiBmcm9tIGJpdGdvXG4gICAgICBjb25zdCBzYW5pdGl6ZWRQcmVidWlsZCA9IHtcbiAgICAgICAgLi4uXy5vbWl0KHR4UHJlYnVpbGQsIFsnd2FsbGV0J10pLFxuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgIGJpdGdvOiBfLm9taXQodGhpcy5iaXRnbywgWydfdG9rZW4nXSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQ6Jywgc2FuaXRpemVkUHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAnb25jaGFpbicpIHtcbiAgICAgIHNpZ25pbmdQYXJhbXMucHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25pbmdQYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBpZiAodGhpcy50c3NVdGlscy5pc1BlbmRpbmdBcHByb3ZhbFR4UmVxdWVzdEZ1bGwodHhSZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gdHhSZXF1ZXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5fLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKSxcbiAgICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBiaXRnbzogXy5vbWl0KHRoaXMuYml0Z28sIFsnX3Rva2VuJ10pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkgb3IgUmVwbGFjZS1CeS1GZWUgKFJCRilcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBwYXJhbXMucmVjaXBpZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oe1xuICAgICAgLi4uKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSksXG4gICAgICAuLi5CdWlsZFBhcmFtcy5lbmNvZGUocGFyYW1zKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NlbGVyYXRpb25QYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKCFwYXJhbXMuY3BmcFR4SWRzICYmICFwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ211c3QgcGFzcyBjcGZwVHhJZHMgb3IgcmJmVHhJZHMnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX29yX3JiZnR4aWRzX3JlcXVpcmVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzICYmIHBhcmFtcy5yYmZUeElkcykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBjcGZwVHhJZHMgYW5kIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2Nhbm5vdF9zcGVjaWZ5X2JvdGhfY3BmcF9hbmRfcmJmX3R4aWRzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVSYmZQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSB8fCBwYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZhbHVlIGZvciAncmVjaXBpZW50cyc6IG11c3QgYmUgZW1wdHkgYXJyYXkgd2hlbiBzZXRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmJmVHhJZHMpIHx8IHBhcmFtcy5yYmZUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByYmZUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyYmZ0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuZmVlTXVsdGlwbGllcikge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZmVlTXVsdGlwbGllciBtdXN0IGJlIHNldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX25vdF9zZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWVNdWx0aXBsaWVyIDw9IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBhIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2ZlZW11bHRpcGxpZXJfZ3JlYXRlcl90aGFuX29uZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3BmcFR4SWRzKSB8fCBwYXJhbXMuY3BmcFR4SWRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGNwZnBUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjcGZwdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwRmVlUmF0ZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9DcGZwRmVlUmF0ZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9DcGZwRmVlUmF0ZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmNwZnBGZWVSYXRlKSB8fCBwYXJhbXMuY3BmcEZlZVJhdGUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9NYXhGZWUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgc2V0IHVubGVzcyBub01heEZlZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhGZWUpIHx8IHBhcmFtcy5tYXhGZWUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICogQHBhcmFtIHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcik6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24ocGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuXG4gICAgY29uc3QgaXNBbW91bnROZWdhdGl2ZSA9IGFtb3VudC5pc05lZ2F0aXZlKCk7XG4gICAgY29uc3QgaXNBbW91bnRaZXJvID0gYW1vdW50LmlzWmVybygpO1xuICAgIGNvbnN0IGlzQW1vdW50RGVjaW1hbCA9ICFhbW91bnQuaXNJbnRlZ2VyKCk7XG5cbiAgICBfLnNvbWUoW2lzQW1vdW50TmVnYXRpdmUsICFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGlzQW1vdW50WmVybywgaXNBbW91bnREZWNpbWFsXSwgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIEludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7XG4gICAgICByZWNpcGllbnRzLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHNlbmRNYW55T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBFUkMtNzIxIE5GVCBvciBFUkMtMTE1NSBORlQocykuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUgY2FsbCBkYXRhIGZvciBhbiBFUkMtNzIxLzExNTUgdG9rZW4gdHJhbnNmZXIsXG4gICAqIGFuZCBjYWxscyB0aGUgdG9rZW4gY29udHJhY3Qgd2l0aCB0aGUgZGF0YSwgYW5kIGFtb3VudCAwLiBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgYWx3YXlzIHByb2R1Y2VcbiAgICogYSBwZW5kaW5nIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcGFyYW0gc2VuZE9wdGlvbnMgT3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHNlbnQuXG4gICAqIEBwYXJhbSBzZW5kTmZ0T3B0aW9ucyBPcHRpb25zIHRvIHNwZWNpZnkgdGhlIE5GVChzKSB0byBiZSBzZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgcGVuZGluZyBhcHByb3ZhbCBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2VuZE5mdChzZW5kT3B0aW9uczogU2VuZE5GVE9wdGlvbnMsIHNlbmROZnRPcHRpb25zOiBORlRUcmFuc2Zlck9wdGlvbnMpOiBQcm9taXNlPFNlbmRORlRSZXN1bHQ+IHtcbiAgICBjb25zdCBuZnRDb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0TmZ0QmFsYW5jZXMoKTtcbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnRBZGRyZXNzLCB0eXBlIH0gPSBzZW5kTmZ0T3B0aW9ucztcblxuICAgIGNvbnN0IG5mdEJhbGFuY2UgPSBuZnRDb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLm1ldGFkYXRhLnRva2VuQ29udHJhY3RBZGRyZXNzID09PSB0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgaWYgKCFuZnRCYWxhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbGxlY3Rpb24gbm90IGZvdW5kIGZvciB0b2tlbiBjb250cmFjdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnRBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzICR7cmVjaXBpZW50QWRkcmVzc31gKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLmNvaW5TcGVjaWZpYygpPy5iYXNlQWRkcmVzcyB8fCB0aGlzLmNvaW5TcGVjaWZpYygpPy5yb290QWRkcmVzcztcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYmFzZSBhZGRyZXNzIGZvciB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAobmZ0QmFsYW5jZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBORlQgdHlwZSAke3R5cGV9IGRvZXMgbm90IG1hdGNoIGNvbGxlY3Rpb24gdHlwZSAke25mdEJhbGFuY2UudHlwZX1gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNlbmROZnRPcHRpb25zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0VSQzcyMSc6IHtcbiAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW3NlbmROZnRPcHRpb25zLnRva2VuSWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuICR7c2VuZE5mdE9wdGlvbnMudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHt0b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXNlQ29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgLi4uc2VuZE5mdE9wdGlvbnMsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlY2lwaWVudDtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICd2ZXQnKSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgICAgdG9rZW5EYXRhOiBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW3JlY2lwaWVudF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJDMTE1NSc6IHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IHNlbmROZnRPcHRpb25zLmVudHJpZXM7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tlbnRyeS50b2tlbklkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVG9rZW4gJHtlbnRyeS50b2tlbklkfSBub3QgZm91bmQgaW4gY29sbGVjdGlvbiAke3NlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzfSBvciBkb2VzIG5vdCBoYXZlIGEgc3BlbmRhYmxlIGJhbGFuY2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tlbnRyeS50b2tlbklkXSA8IGVudHJ5LmFtb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQW1vdW50ICR7ZW50cnkuYW1vdW50fSBleGNlZWRzIHNwZW5kYWJsZSBiYWxhbmNlIG9mICR7bmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tlbnRyeS50b2tlbklkXX0gZm9yIHRva2VuICR7XG4gICAgICAgICAgICAgICAgZW50cnkudG9rZW5JZFxuICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXNlQ29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgLi4uc2VuZE5mdE9wdGlvbnMsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUb2tlblR5cGUuRElHSVRBTF9BU1NFVDoge1xuICAgICAgICBpZiAoIW5mdEJhbGFuY2UuY29sbGVjdGlvbnNbc2VuZE5mdE9wdGlvbnMudG9rZW5JZF0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVG9rZW4gJHtzZW5kTmZ0T3B0aW9ucy50b2tlbklkfSBub3QgZm91bmQgaW4gY29sbGVjdGlvbiAke3Rva2VuQ29udHJhY3RBZGRyZXNzfSBvciBkb2VzIG5vdCBoYXZlIGEgc3BlbmRhYmxlIGJhbGFuY2VgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbkRhdGE6IFRva2VuVHJhbnNmZXJSZWNpcGllbnRQYXJhbXMgPSB7XG4gICAgICAgICAgdG9rZW5UeXBlOiBzZW5kTmZ0T3B0aW9ucy50eXBlLFxuICAgICAgICAgIHRva2VuUXVhbnRpdHk6ICcxJywgLy8gVGhpcyBORlQgc3RhbmRhcmQgd2lsbCBhbHdheXMgaGF2ZSBxdWFudGl0eSBvZiAxXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5JZDogc2VuZE5mdE9wdGlvbnMudG9rZW5JZCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiAnMScsIC8vIHRoZSBhbW91bnQgbmVlZHMgdG8gYmUgbm9uLXplcm8gZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSB2YWxpZCwgaXQgaXMgaWdub3JlZFxuICAgICAgICAgICAgICB0b2tlbkRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIG1vbmV5IHRvIG11bHRpcGxlIHJlY2lwaWVudHNcbiAgICogMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHBydlxuICAgKiAyLiBEZWNyeXB0cyB1c2VyIGtleVxuICAgKiAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4gICAqIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4gICAqIDUuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvdGhpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jb21tZW50IC0gQW55IGFkZGl0aW9uYWwgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIFNlbmQgdGhpcyB0cmFuc2FjdGlvbiB1c2luZyBjb2luLXNwZWNpZmljIGluc3RhbnQgc2VuZGluZyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHlwZSAtIFR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uIChlLmcuIHRydXN0bGluZSlcbiAgICogQHBhcmFtIHt7dG9rZW46IHBhcmFtcywgYWN0aW9uOiBTdHJpbmcsIGxpbWl0OiBTdHJpbmd9W119IG9wdGlvbnMudHJ1c3RsaW5lcyAtIEFycmF5IG9mIHRydXN0bGluZXMgdG8gbWFuYWdlIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kTWFueShwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydjb21tZW50JywgJ290cCddKTtcbiAgICBkZWJ1Zygnc2VuZE1hbnkgY2FsbGVkJyk7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBwYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuICAgIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMuZm9yRWFjaChmdW5jdGlvbiAocmVjaXBpZW50KSB7XG4gICAgICAgIGNvaW4uY2hlY2tSZWNpcGllbnQocmVjaXBpZW50KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWy4uLnRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpLCAnY29tbWVudCcsICdvdHAnLCAnaG9wJ10pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHNlbGVjdFBhcmFtcywgcmVxSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgYW4gdW5zdXBwb3J0ZWQgdG9rZW4gZnJvbSBhIEJpdEdvIG11bHRpc2lnIHdhbGxldFxuICAgKiBwYXJhbXMgYXJlIHZhbGlkYXRlZCBpbiBFdGgucHJvdG90eXBlLnJlY292ZXJUb2tlblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgdGhlIGNvbnRyYWN0IGFkZHJlc3Mgb2YgdGhlIHVuc3VwcG9ydGVkIHRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjaXBpZW50IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHJlY292ZXJlZCB0b2tlbnMgc2hvdWxkIGJlIHNlbnQgdG9cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiB0aGUgeHBydlxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlclRva2VuKHBhcmFtczogUmVjb3ZlclRva2VuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG9rZW4gcmVjb3Zlcnkgb25seSBzdXBwb3J0ZWQgZm9yIGV0aCB3YWxsZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcmVjaXBpZW50IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0b2tlbkNvbnRyYWN0QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHRva2VuQ29udHJhY3RBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocmVjaXBpZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgcmVjaXBpZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlclRva2VuT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcmVjaXBpZW50IH0sIHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ucmVjb3ZlclRva2VuKHJlY292ZXJUb2tlbk9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2FjdGlvbiBtZXRhZGF0YSBmb3IgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiB0aGF0IGlzIHN0aWxsIHBlbmRpbmcgb3IgYXR0ZW1wdGVkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IHdpdGggdHhpZCwgd2FsbGV0SWQsIHR4LCBhbmQgZmVlIChpZiBzdXBwb3J0ZWQgZm9yIGNvaW4pXG4gICAqL1xuICBhc3luYyBnZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gaW50ZXJuYWwuZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24oeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0sIHRoaXMuYmFzZUNvaW4sIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZmVlIG9uIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHR4aWQgdG8gdGhlIGdpdmVuIG5ldyBmZWVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4aWQgVGhlIHRyYW5zYWN0aW9uIElkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHdob3NlIGZlZSBpcyB0byBiZSBjaGFuZ2VkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmZlZV0gT3B0aW9uYWwgLSBUaGUgbmV3IGZlZSB0byBhcHBseSB0byB0aGUgZGVub3RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5laXAxNTU5XSBPcHRpb25hbCAtIHRoZSBlaXAxNTU5IHZhbHVlcyB0byBhcHBseSB0byB0aGUgZGVub3RlZCB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdHJhbnNhY3Rpb24gSUQgb2YgdGhlIG5ldyB0cmFuc2FjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgZmVlIHJhdGVcbiAgICovXG4gIGFzeW5jIGNoYW5nZUZlZShwYXJhbXM6IENoYW5nZUZlZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHBhcmFtcy5mZWUpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHhpZCcsICdmZWUnXSwgW10pO1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcy5laXAxNTU5LCBbJ21heEZlZVBlckdhcycsICdtYXhQcmlvcml0eUZlZVBlckdhcyddKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvY2hhbmdlRmVlJykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggaW5mbyBmcm9tIG1lcmNoYW50IHNlcnZlclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudXJsIFRoZSBVcmwgdG8gcmV0cmlldmUgaW5mbyBmcm9tXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBpbmZvIHJldHVybmVkIGZyb20gdGhlIG1lcmNoYW50IHNlcnZlclxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0UGF5bWVudEluZm8ocGFyYW1zOiB7IHVybD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wYXltZW50SW5mbycpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQganNvbiBwYXltZW50IHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5wYXltZW50VXJsIC0gVGhlIHVybCB0byBzZW5kIHRoZSBmdWxseSBzaWduZWQgdHJhbnNhY3Rpb24gdG9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggb2YgdGhlIHBheW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZW1vIHtTdHJpbmd9IC0gQSBtZW1vIHN1cHBsaWVkIGJ5IHRoZSBtZXJjaGFudCwgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgdHJhbnNmZXIgYXMgdGhlIGNvbW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5leHBpcmVzIHtTdHJpbmd9IC0gSVNPIERhdGUgZm9ybWF0IG9mIHdoZW4gdGhlIHBheW1lbnQgcmVxdWVzdCBleHBpcmVzXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBpbmZvIHJldHVybmVkIGZyb20gdGhlIG1lcmNoYW50IHNlcnZlciBQYXltZW50IEFja1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgc2VuZFBheW1lbnRSZXNwb25zZShwYXJhbXM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2VuZFBheW1lbnQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUG9saWN5UnVsZShwYXJhbXM6IENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnLCAndHlwZSddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmNvbmRpdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGNvbmRpdGlvbnMgb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5hY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBhY3Rpb24gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNldFBvbGljeVJ1bGUocGFyYW1zOiBhbnkgPSB7fSkge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnLCAndHlwZSddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmNvbmRpdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGNvbmRpdGlvbnMgb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5hY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBhY3Rpb24gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBQb2xpY3kgUnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUG9saWN5UnVsZShwYXJhbXM6IFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNyb3NzQ2hhaW4gVVRYT3NcbiAgICogQ3VycmVudGx5IG9ubHkgZm9yIEFWQVhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2VDaGFpbiB0aGUgc291cmNlY2hhaW4gdG8gcGljayBVVFhPcywgaWYgbm90IGdpdmVuLCB0aGVuIHBpY2sgZnJvbSBhbGwgYXZhaWxhYmxlIGNoYWlucyBbUCwgQ11cbiAgICovXG4gIGZldGNoQ3Jvc3NDaGFpblVUWE9zKHBhcmFtczogRmV0Y2hDcm9zc0NoYWluVVRYT3NPcHRpb25zKTogUHJvbWlzZTxDcm9zc0NoYWluVVRYT1tdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBfLnBpY2socGFyYW1zLCBbJ3NvdXJjZUNoYWluJ10pO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL2Nyb3NzQ2hhaW5VbnNwZW50cycpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhIEpTT04gcmVwcmVzZW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0pTT04oKTogV2FsbGV0RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0cmFkaW5nIGFjY291bnQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9UcmFkaW5nQWNjb3VudCgpOiBUcmFkaW5nQWNjb3VudCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IGNvbnZlcnQgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IHRvIGEgdHJhZGluZyBhY2NvdW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhZGluZ0FjY291bnQodGhpcy5fd2FsbGV0LmVudGVycHJpc2UsIHRoaXMsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYWRkcmVzcyBib29rIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9BZGRyZXNzQm9vaygpOiBJQWRkcmVzc0Jvb2sge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSB1c2UgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IGZvciB0aGUgYWRkcmVzcyBib29rJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQWRkcmVzc0Jvb2sodGhpcy5fd2FsbGV0LmVudGVycHJpc2UsIHRoaXMuYml0Z28sIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YWtpbmcgd2FsbGV0IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvU3Rha2luZ1dhbGxldCgpOiBTdGFraW5nV2FsbGV0IHtcbiAgICBjb25zdCBpc0V0aFRzcyA9XG4gICAgICB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09ICdldGgnICYmIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LndhbGxldFZlcnNpb25cbiAgICAgICAgPyB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLndhbGxldFZlcnNpb24gPj0gM1xuICAgICAgICA6IGZhbHNlO1xuICAgIHJldHVybiBuZXcgU3Rha2luZ1dhbGxldCh0aGlzLCBpc0V0aFRzcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ28gc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9Hb1N0YWtpbmdXYWxsZXQoKTogR29TdGFraW5nV2FsbGV0IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSBzdGFraW5nIHdhbGxldCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEdvU3Rha2luZ1dhbGxldCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBkb3dubG9hZHMgUERGIGtleWNhcmQgZm9yIHdhbGxldCAocmVxdWlyZXMgcmVzcG9uc2UgZnJvbSB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KVxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGlzIGV4YW1wbGUgY29kZSBhbmQgaXMgbm90IHRoZSB2ZXJzaW9uIHVzZWQgb24gYml0Z28uY29tXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAqIGpzUERGIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIGpzUERGIGxpYnJhcnlcbiAgICogICAqIFFSQ29kZSAtIGFuIGluc3RhbmNlIG9mIHRoZSBRUmlvdXMgbGlicmFyeVxuICAgKiAgICogdXNlcktleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIHVzZXIga2V5Y2hhaW5cbiAgICogICAqIGJhY2t1cEtleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJhY2t1cCBrZXljaGFpblxuICAgKiAgICogYml0Z29LZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiaXRnbyBrZXljaGFpblxuICAgKiAgICogcGFzc3BocmFzZSAtIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiAgICogcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAtIHRoZSBlbmNyeXB0aW9uIHNlY3JldCB1c2VkIGZvciBCb3ggRFxuICAgKiAgICogYWN0aXZhdGlvbkNvZGUgLSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBzaXgtZGlnaXQgYWN0aXZhdGlvbiBjb2RlXG4gICAqICAgKiB3YWxsZXRLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIHNpZ25pbmcga2V5XG4gICAqICAgKiBiYWNrdXBLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIGJhY2t1cCBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBkb3dubG9hZEtleWNhcmQocGFyYW1zOiBEb3dubG9hZEtleWNhcmRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkb3dubG9hZEtleWNhcmQgZnVuY3Rpb24gaXMgb25seSBjYWxsYWJsZSB3aXRoaW4gYSBicm93c2VyLicpO1xuICAgIH1cblxuICAgIC8vIEdyYWIgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgZm9yIGFjdGl2YXRpb25Db2RlXG4gICAgY29uc3Qge1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgICBhY3RpdmF0aW9uQ29kZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCArIDEwMDAwMCkudG9TdHJpbmcoKSxcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFqc1BERiB8fCB0eXBlb2YganNQREYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHBhc3MgaW4gYSB2YWxpZCBqc1BERiBpbnN0YW5jZScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGtleWNoYWluc1xuICAgIGlmICghdXNlcktleWNoYWluIHx8IHR5cGVvZiB1c2VyS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdhbGxldCBrZXljaGFpbiBtdXN0IGhhdmUgYSAndXNlcicgcHJvcGVydHlgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhY2t1cEtleWNoYWluIHx8IHR5cGVvZiBiYWNrdXBLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmFja3VwIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCB0eXBlb2YgYml0Z29LZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0Z28ga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHdhbGxldEtleUlEICYmIHR5cGVvZiB3YWxsZXRLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0S2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChiYWNrdXBLZXlJRCAmJiB0eXBlb2YgYmFja3VwS2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhY2t1cEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhY3RpdmF0aW9uIGNvZGUgaWYgcHJvdmlkZWRcbiAgICBpZiAodHlwZW9mIGFjdGl2YXRpb25Db2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIENvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmF0aW9uQ29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBjb2RlIG11c3QgYmUgc2l4IGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luU2hvcnROYW1lID0gdGhpcy5iYXNlQ29pbi50eXBlO1xuICAgIGNvbnN0IGNvaW5OYW1lID0gdGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpO1xuICAgIGNvbnN0IHdhbGxldExhYmVsID0gdGhpcy5fd2FsbGV0LmxhYmVsO1xuXG4gICAgY29uc3QgZG9jID0gZHJhd0tleWNhcmQoe1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICBlbmNyeXB0OiB0aGlzLmJpdGdvLmVuY3J5cHQsXG4gICAgICBjb2luU2hvcnROYW1lLFxuICAgICAgY29pbk5hbWUsXG4gICAgICBhY3RpdmF0aW9uQ29kZSxcbiAgICAgIHdhbGxldExhYmVsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0aGUgUERGIG9uIHRoZSB1c2VyJ3MgYnJvd3NlclxuICAgIGRvYy5zYXZlKGBCaXRHbyBLZXljYXJkIGZvciAke3dhbGxldExhYmVsfS5wZGZgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoXG4gICAgcGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICAvLyBXaGl0ZWxpc3QgcGFyYW1zIHRvIGJ1aWxkIHR4XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCkpO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY291bGQgcmV0dXJuIDEwMCBidWlsZCB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCkpIGFzIGFueTtcblxuICAgIGlmIChidWlsZFJlc3BvbnNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWNlaXZlIGFkZHJlc3NlcyB3aXRoIGJhbGFuY2UgZm91bmQgdG8gY29uc29saWRhdGUuJyk7XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzdGVwIG92ZXIgZWFjaCBwcmVidWlsZCBub3cgLSBzaG91bGQgYmUgaW4gYW4gYXJyYXkgaW4gdGhlIGJvZHlcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uczogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zb2xpZGF0ZUFjY291bnRCdWlsZCBvZiBidWlsZFJlc3BvbnNlKSB7XG4gICAgICBsZXQgcHJlYnVpbGQ6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkLCB7XG4gICAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG5cbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgICBkZWJ1ZygnZmluYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG5cbiAgICAgIGNvbnNvbGlkYXRpb25zLnB1c2gocHJlYnVpbGQpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc29saWRhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIHByZWJ1aWxkVHggICAtIHRoaXMgaXMgdGhlIHByZS1idWlsZCBjb25zb2xpZGF0aW9uIHR4LiB0aGlzIGlzIGEgbm9ybWFsbHkgYnVpbHQgdHggd2l0aFxuICAgKiAgICAgICAgICAgICAgICAgICAgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgb2YgY29uc29saWRhdGVJZC5cbiAgICogICAgIHZlcmlmaWNhdGlvbiAtIG5vcm1hbCBrZXljaGFpbnMsIGV0Yy4gZm9yIHZlcmlmaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICBwYXJhbXMudHlwZSA9ICdjb25zb2xpZGF0ZSc7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtcyBhcyBUeFNlbmRCb2R5LCBwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIG9uZSBvZiBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLnByZWJ1aWxkVHggPT09ICdzdHJpbmcnIHx8IHBhcmFtcy5wcmVidWlsZFR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGNvbnNvbGlkYXRpb24gaWQgb24gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHgudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zb2xpZGF0aW9uIHJlcXVlc3QgbWlzc2luZyB0eFJlcXVlc3RJZC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBhbnk7XG5cbiAgICAvLyBkZWNvcmF0ZSB3aXRoIG91ciBjb25zb2xpZGF0aW9uIGlkXG4gICAgc2lnbmVkUHJlYnVpbGQuY29uc29saWRhdGVJZCA9IHBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQ7XG5cbiAgICBkZWxldGUgc2lnbmVkUHJlYnVpbGQud2FsbGV0O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb25zLiBUaGlzIGlzIGludGVuZGVkIHRvIGZsdXNoIG1hbnkgYmFsYW5jZXMgdG8gdGhlIHJvb3Qgd2FsbGV0IGJhbGFuY2UuXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVZlcnNpb24gPVxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gPz9cbiAgICAgICh0aGlzLnRzc1V0aWxzICYmIHRoaXMudHNzVXRpbHMuc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMoKS5pbmNsdWRlcygnZnVsbCcpID8gJ2Z1bGwnIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzIGdpdmVzIHVzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgYXBpVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICB9KTtcbiAgICBpZiAodW5zaWduZWRCdWlsZHMgJiYgdW5zaWduZWRCdWlsZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gR2V0IHdhbGxldCdzIGJhc2UgYWRkcmVzcyB0byB2YWxpZGF0ZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAvLyBWYWxpZGF0ZSBhbGwgdHJhbnNhY3Rpb25zXG4gICAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICAgIGlmIChiYXNlQWRkcmVzcykge1xuICAgICAgICAgIGRlYnVnKCd2ZXJpZnlpbmcgdHhIZXgnLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgICAgICAgIC8vVmVyaWZ5IHRyYW5zYWN0aW9ucyBzZW5kIGZ1bmRzIHRvIHRoZSBiYXNlIGFkZHJlc3NcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICB0eFByZWJ1aWxkOiBidWlsZCxcbiAgICAgICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBvdXRwdXQgdGhhdCBkb2VzIG5vdCBjb25zb2xpZGF0ZSBmdW5kcyB0byBiYXNlIGFkZHJlc3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMuYXBpVmVyc2lvbiA9IGFwaVZlcnNpb247XG4gICAgICAgIHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucy5wcmVidWlsZFR4ID0gdW5zaWduZWRCdWlsZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRBY2NvdW50Q29uc29saWRhdGlvbih1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJucyBVbnNpZ25lZCB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYnVpbGRUb2tlbkVuYWJsZW1lbnRzKFxuICAgIHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH1cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50c2ApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHdhbGxldCB0eXBlIGlmIGNvaW4gcmVxdWlyZXMgaXRcbiAgICBpZiAodHlwZW9mIHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0ID09PSAnZnVuY3Rpb24nICYmIHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCh0aGlzLl93YWxsZXQudHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgaWYgKCFidWlsZFBhcmFtcy50eXBlKSB7XG4gICAgICBidWlsZFBhcmFtcy50eXBlID0gJ2VuYWJsZXRva2VuJztcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICAvLyBJZiB0b2tlbiBoYXMgbm9uIGFkZHJlc3MsIHRha2UgdGhlIGZpcnN0IHdhbGxldCBhZGRyZXNzIGlzIHN0b3JlZCBpbiBpdHMgY29pbi1zcGVjaWZpYyBwcm9wZXJ0eVxuICAgICAgICAvLyBJbiBhY2NvdW50LWJhc2VkIGNvaW4gaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIHdhbGxldCBjb250cmFjdHMsIHRoZSBhZGRyZXNzIGlzIGNhbGxlZCBiYXNlQWRkcmVzcyAoZS5nLiBldGgtbGlrZSwgeHR6KVxuICAgICAgICAvLyBmb3Igb3RoZXJzIGl0J3MgY2FsbGVkIHJvb3RBZGRyZXNzIChlLmcuIHhycCwgeGxtLCBhbGdvLCB0cngpXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB3YWxsZXQgaW5pdGlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9uc30gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkV2FsbGV0SW5pdGlhbGl6YXRpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5yZXF1aXJlc1dhbGxldEluaXRpYWxpemF0aW9uVHJhbnNhY3Rpb24oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQgaW5pdGlhbGl6YXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1aWxkUGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBpZiAoIWJ1aWxkUGFyYW1zLnR5cGUpIHtcbiAgICAgIGJ1aWxkUGFyYW1zLnR5cGUgPSAnY3JlYXRlQWNjb3VudCc7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3QvY29sZCB3YWxsZXRzXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgY3VzdG9kaWFsIHdhbGxldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50KHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBwYXJhbXMudmVyaWZpY2F0aW9uID0gcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fTtcbiAgICBwYXJhbXMudmVyaWZpY2F0aW9uLnZlcmlmeVRva2VuRW5hYmxlbWVudCA9IHBhcmFtcy52ZXJpZmljYXRpb24udmVyaWZ5VG9rZW5FbmFibGVtZW50ID8/IHRydWU7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uc2ApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHdhbGxldCB0eXBlIGlmIGNvaW4gcmVxdWlyZXMgaXRcbiAgICBpZiAodGVDb25maWcudmFsaWRhdGVXYWxsZXQgJiYgdGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgIHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0KHRoaXMuX3dhbGxldC50eXBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgIGNhc2UgJ2JhY2tpbmcnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFpbiBjYW50b24sIHJlcXVpcmVzIHRoZSB3YWxsZXQgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgc2VuZGluZyBvdXQgYSB0cmFuc2FjdGlvblxuICAgKiB0byBiZSBvbmJvYXJkZWQgb250byB0aGUgdmFsaWRhdG9yLlxuICAgKiBCdWlsZHMsIFNpZ25zIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGNhbnRvbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRXYWxsZXRJbml0aWFsaXphdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldEluaXRSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5idWlsZFdhbGxldEluaXRpYWxpemF0aW9uKHBhcmFtcyk7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBwcmVidWlsZFR4LFxuICAgIH07XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgY29uc3QgZmFpbGVkVHhzID0gbmV3IEFycmF5PEVycm9yPigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzZnVsVHhzLFxuICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgIH07XG4gIH1cblxuICAvKiBNQVJLOiBUU1MgSGVscGVycyAqL1xuXG4gIC8qKlxuICAgKiBQcmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmb3IgYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMoXG4gICAgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgLy8gVHdvIG9wdGlvbnMgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBmZWVzIHNlZW1zIHRvIG5vdyBiZSBzdXBwb3J0ZWQsIGZvciBub3cgd2Ugd2lsbCBzdXBwb3J0IGJvdGggdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGVcbiAgICAvLyBUT0RPKEJHLTU5Njg1KTogZGVwcmVjYXRlIG9uZSBvZiB0aGVzZSBzbyB0aGF0IHdlIGhhdmUgYSBzaW5nbGUgd2F5IHRvIHBhc3MgZmVlc1xuICAgIGxldCBmZWVPcHRpb25zO1xuICAgIGlmIChwYXJhbXMuZmVlT3B0aW9ucykge1xuICAgICAgZmVlT3B0aW9ucyA9IHBhcmFtcy5mZWVPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmdhc1ByaWNlICE9PSB1bmRlZmluZWQgfHwgcGFyYW1zLmVpcDE1NTkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9XG4gICAgICAgIHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGdhc1ByaWNlOiBwYXJhbXMuZ2FzUHJpY2UsIGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtYXhGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZlZU9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RyYW5zZmVyJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgY3VzdG9kaWFuVHJhbnNhY3Rpb25JZDogcGFyYW1zLmN1c3RvZGlhblRyYW5zYWN0aW9uSWQsXG4gICAgICAgICAgICB1bnNwZW50czogcGFyYW1zLnVuc3BlbnRzLFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzczogcGFyYW1zLnNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBpc1Rlc3RUcmFuc2FjdGlvbjogcGFyYW1zLmlzVGVzdFRyYW5zYWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RyYW5zZmVydG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b2tlbkFwcHJvdmFsJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndG9rZW5BcHByb3ZhbCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3JlYXRlQWNjb3VudCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2NyZWF0ZUFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJBY2NlcHQnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyQWNjZXB0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJSZWplY3QnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyUmVqZWN0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY3VzdG9tVHgnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdjdXN0b21UeCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgc29sSW5zdHJ1Y3Rpb25zOiBwYXJhbXMuc29sSW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgc29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBwYXJhbXMuc29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhLFxuICAgICAgICAgICAgYXB0b3NDdXN0b21UcmFuc2FjdGlvblBhcmFtczogcGFyYW1zLmFwdG9zQ3VzdG9tVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgbGV0IHVuc2lnbmVkVHg6IEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbjtcblxuICAgIGlmICh0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICBpZiAodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudW5zaWduZWRUeHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXRJZDogdGhpcy5pZCgpLFxuICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgIGZlZUluZm86IHVuc2lnbmVkVHguZmVlSW5mbyxcbiAgICAgIC4uLih0eFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQgJiYge1xuICAgICAgICBwZW5kaW5nQXBwcm92YWxJZDogdHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRWREU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSxcbiAgICBjb2luOiBJQmFzZUNvaW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgY29tbWl0bWVudCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBSIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEcgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAvLyBhZGRpbmcgdGhpcyB0byByZWJ1aWxkIHRoZSB0cmFuc2FjdGlvbiBqdXN0IGJlZm9yZSBzaWduaW5nIGZvciBFZERTQSB0cmFuc2FjdGlvbiB1c2luZyBleHRlcm5hbCBzaWduZXJcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQsIHJlcUlkKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgICBwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcmVxSWRcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiByZXF1ZXN0IGZyb20gYSBUU1MgKGhvdCkgd2FsbGV0LCBvciBhIFNNQyAoY29sZCkgd2FsbGV0IHdpdGggYW4gZXh0ZXJuYWwgc2lnbmVyLlxuICAgKiBNZWFudCB0byBiZSB1c2VkIGZvciBhIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2hlcmUgdGhlIHNpZ25pbmcgcHJvY2VzcyBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgIHR4UmVxdWVzdElkIC0gVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiAgICB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSB3YWxsZXQuXG4gICAqICAgIGlzVHhSZXF1ZXN0RnVsbCAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpcyBmdWxsLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFNpZ25lZFRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25BbmRTZW5kVHhSZXF1ZXN0KHBhcmFtczogU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuaXNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLnRzc1V0aWxzPy5kZWxldGVTaWduYXR1cmVTaGFyZXMocGFyYW1zLnR4UmVxdWVzdElkKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCB0aGlzLmdldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24oe1xuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB0eFJlcXVlc3RJZDogcGFyYW1zLnR4UmVxdWVzdElkLFxuICAgIH0pO1xuICAgIGlmICghcGFyYW1zLmlzVHhSZXF1ZXN0RnVsbCkge1xuICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGl0cyBub3QgYSBmdWxsIHR4IHJlcXVlc3QsIHRoZW4gaXQgaXMgYSBsaXRlIHR4IHJlcXVlc3RcbiAgICAgIGNvbnN0IHN1Ym1pdFR4ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJtaXRUeDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHNpZ25hdHVyZSBzaGFyZXMgYXJlIGluIGEgY2xlYW4gc3RhdGUgYmVmb3JlIHNpZ25pbmcgYSB0cmFuc2FjdGlvbi5cbiAgICogQXV0b21hdGljYWxseSBkZWxldGVzIHNpZ25hdHVyZSBzaGFyZXMgZm9yIEZ1bGwgVHhSZXF1ZXN0cyBiZWZvcmUgc2lnbmluZyB0byBwcmV2ZW50XG4gICAqIGlzc3VlcyB3aXRoIHN0YWxlIG9yIHBhcnRpYWwgc2lnbmF0dXJlcy5cbiAgICogVXNlIHRoaXMgZm9yIEV4cHJlc3MgQVBJIGFuZCBvdGhlciBpbnRlZ3JhdGlvbnMgdGhhdCBuZWVkIGF1dG9tYXRpYyBjbGVhbnVwIG9mIHNpZ25hdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBzaWduaW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5zdXJlQ2xlYW5TaWdTaGFyZXNBbmRTaWduVHJhbnNhY3Rpb24oXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkIHx8IHBhcmFtcy50eFByZWJ1aWxkPy50eFJlcXVlc3RJZDtcblxuICAgIGlmICh0eFJlcXVlc3RJZCAmJiB0aGlzLnRzc1V0aWxzICYmIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdCh0eFJlcXVlc3RJZCk7XG5cbiAgICAgIC8vIEFsd2F5cyBjbGVhbiBzaWduYXR1cmUgc2hhcmVzIGZvciBGdWxsIFR4UmVxdWVzdHMgYmVmb3JlIHNpZ25pbmdcbiAgICAgIGNvbnN0IGlzRnVsbCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgJiZcbiAgICAgICAgKCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zID8/IFtdKS5sZW5ndGggPiAwIHx8ICh0eFJlcXVlc3QubWVzc2FnZXMgPz8gW10pLmxlbmd0aCA+IDApO1xuXG4gICAgICBpZiAoaXNGdWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudHNzVXRpbHMuZGVsZXRlU2lnbmF0dXJlU2hhcmVzKHR4UmVxdWVzdElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRUNEU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQShcbiAgICBjb2luOiBJQmFzZUNvaW4sXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBwYWlsbGllciBtb2R1bHVzIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEsgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTXVEZWx0YSBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBTIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWNkc2FUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgICBwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVDRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0FNUEN2MihcbiAgICBjb2luOiBJQmFzZUNvaW4sXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAxIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVjZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW9uRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3Qoe1xuICAgICAgICB0eFJlcXVlc3Q6IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLFxuICAgICAgICB0eFBhcmFtczogcGFyYW1zLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBhcGlWZXJzaW9uOiBwYXJhbXMuYXBpVmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25NZXNzYWdlVHNzKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy5tZXNzYWdlLCAnbWVzc2FnZSByZXF1aXJlZCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBjb25zdCBtZXNzYWdlUmF3ID0gcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdztcblxuICAgICAgaWYgKCFwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduTWVzc2FnZScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgICBtZXNzYWdlU3RhbmRhcmRUeXBlOiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlU3RhbmRhcmRUeXBlLFxuICAgICAgICAgIHNpZ25lckFkZHJlc3M6IHBhcmFtcy5tZXNzYWdlLnNpZ25lckFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLmJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KGludGVudE9wdGlvbik7XG4gICAgICAgIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChcbiAgICAgICAgdHhSZXF1ZXN0Lm1lc3NhZ2VzICYmIHR4UmVxdWVzdC5tZXNzYWdlcy5sZW5ndGggPiAwLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gdHhSZXF1ZXN0IGZvciBtZXNzYWdlIHNpZ25pbmcnXG4gICAgICApO1xuICAgICAgY29uc3QgbWVzc2FnZUVuY29kZWQgPSB0eFJlcXVlc3QubWVzc2FnZXNbMF0ubWVzc2FnZUVuY29kZWQ7XG5cbiAgICAgIGNvbnN0IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZCxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBCdWZmZXIuZnJvbShtZXNzYWdlRW5jb2RlZCwgJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdCcpO1xuICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09IENvaW5GYW1pbHkuRVRIKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkTWVzc2FnZVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gbWVzc2FnZSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHlwZWQgZGF0YSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHlwZWREYXRhVHNzKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHR5cGVkIGRhdGEgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMudHlwZWREYXRhLCAndHlwZWREYXRhIHJlcXVpcmVkIGZvciB0eXBlZCBkYXRhIHNpZ25pbmcnKTtcbiAgICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduVHlwZWRTdHJ1Y3R1cmVkRGF0YScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgdHlwZWREYXRhUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgICB0eXBlZERhdGFFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcoaW50ZW50T3B0aW9ucyk7XG4gICAgICAgIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRUeXBlZERhdGFSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBKU09OLnN0cmluZ2lmeShwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyksXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHR5cGVkIGRhdGEgJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcy5hcGlWZXJzaW9uID0gZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgICBpZiAoIXNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIG1pc3NpbmcgZnJvbSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24gPT09ICdmdWxsJykge1xuICAgICAgY29uc3QgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyOiB7XG4gICAgICAgIHN0YXRlOiBzdHJpbmc7XG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbD86IHN0cmluZztcbiAgICAgICAgdHhpZD86IHN0cmluZztcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIHRoaXMuYml0Z28udXJsKFxuICAgICAgICAgICAgJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHhyZXF1ZXN0cy8nICsgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQgKyAnL3RyYW5zZmVycycsXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zZW5kKClcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgaWYgKGxhdGVzdFR4UmVxdWVzdC5zdGF0ZSA9PT0gJ3BlbmRpbmdBcHByb3ZhbCcpIHtcbiAgICAgICAgY29uc3QgcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pO1xuICAgICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWwgPSBhd2FpdCBwZW5kaW5nQXBwcm92YWxzLmdldCh7XG4gICAgICAgICAgaWQ6IGxhdGVzdFR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiBwZW5kaW5nQXBwcm92YWwudG9KU09OKCksXG4gICAgICAgICAgdHhSZXF1ZXN0OiBsYXRlc3RUeFJlcXVlc3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2ZlcixcbiAgICAgICAgdHhSZXF1ZXN0OiBsYXRlc3RUeFJlcXVlc3QsXG4gICAgICAgIHR4aWQ6IChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zID8/IFtdKVswXT8uc2lnbmVkVHg/LmlkLFxuICAgICAgICB0eDogKGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pWzBdPy5zaWduZWRUeD8udHgsXG4gICAgICAgIHN0YXR1czogdHJhbnNmZXIuc3RhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy50c3NVdGlscz8uc2VuZFR4UmVxdWVzdChzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCwgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLiBPbmx5IHN1cHBvcnRzIGV0aC1saWtlIGNvaW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIHRvIHNlbmQgZnVuZHMgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gQW1vdW50IHRvIHNlbmQgdGhlIGZvcndhcmRlciAob3B0aW9uYWwpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHNlbmRpbmcgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBuZWVkZWQgZm9yIGEgZnVuZCByZWNvdmVyeVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVyKHBhcmFtczogRnVuZEZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxXYWxsZXREYXRhPiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZvcndhcmRlckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlciBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZEZvcndhcmRlcicpO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtMaXN0fSBwYXJhbXMuZm9yd2FyZGVycyAtIGxpc3Qgb2YgZnVuZCBmb3J3YXJkZXIgb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVycyhwYXJhbXM6IEZ1bmRGb3J3YXJkZXJQYXJhbXMpOiBQcm9taXNlPFdhbGxldERhdGE+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVycykgfHwgcGFyYW1zLmZvcndhcmRlcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZnVuZCBmb3J3YXJkZXIgb3B0aW9ucyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2Z1bmRmb3J3YXJkZXJzJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBmb3J3YXJkZXIncyBiYWxhbmNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgZm9yd2FyZGVyIGFkZHJlc3MgYW5kIGJhbGFuY2VcbiAgICogaWYgcGFyYW1zIGlzIG5vdCBzZXQgdGhlbiByZXR1cm5zIGxvdyBiYWxhbmNlIGZvcndhcmRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGb3J3YXJkZXJCYWxhbmNlKHBhcmFtcz86IEZvcndhcmRlckJhbGFuY2VPcHRpb25zKTogUHJvbWlzZTxGb3J3YXJkZXJCYWxhbmNlW10+IHtcbiAgICBjb25zdCBxdWVyeTogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zPy5tYXhpbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWF4aW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1heGltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/Lm1pbmltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5taW5pbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWluaW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9mb3J3YXJkZXJzL2JhbGFuY2VzYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgRm9yd2FyZGVyQmFsYW5jZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVjZHNhIHRzcyBjaGFsbGVuZ2VzIGZvciBhIHdhbGxldC5cbiAgICogVGhlc2UgYXJlIHN0YXRpYyBjaGFsbGVuZ2VzIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IGFuIGVudGVycHJpc2UgYWRtaW4uXG4gICAqIENhbGxlcnMgc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGVudGVycHJpc2UgYWRtaW4gc2lnbmVkIHRoZSBjaGFsbGVuZ2UgdmFsdWVzIGJlZm9yZSB1c2luZyB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+fVxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlc0ZvckVjZHNhU2lnbmluZygpOiBQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz4ge1xuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGEgY29pbiBzcGVjaWZpYyByb3V0ZSwgd2UgY2Fubm90IHVzZSB0aGlzLnVybCguLilcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vY2hhbGxlbmdlc2AsIDIpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcikge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKSk7XG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9zZW5kJyksXG4gICAgICB0LmludGVyc2VjdGlvbihbVHhTZW5kQm9keSwgdC5wYXJ0aWFsKHsgbG9ja3RpbWU6IHQubnVtYmVyIH0pXSksXG4gICAgICB3aGl0ZWxpc3RlZFBhcmFtc1xuICAgICkucmVzdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBUeFNlbmRCb2R5LCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKSB7XG4gICAgLy8gZXh0cmFjdCB0aGUgd2hpdGVsaXN0ZWQgcGFyYW1zIGZyb20gdGhlIHRvcCBsZXZlbCwgaW4gY2FzZVxuICAgIC8vIG90aGVyIGludmFsaWQgcGFyYW1zIGFyZSBwcmVzZW50IHRoYXQgd291bGQgZmFpbCBlbmNvZGluZ1xuICAgIC8vIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGJvZHkgcGFyYW1zXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB0aGlzLmJhc2VDb2luLnByZXByb2Nlc3NCdWlsZFBhcmFtcyhfLnBpY2socGFyYW1zLCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMpKTtcbiAgICBjb25zdCByZXFUcmFjZXIgPSByZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXIpO1xuICAgIHJldHVybiBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2luaXRpYXRlJyksXG4gICAgICBUeFNlbmRCb2R5LFxuICAgICAgd2hpdGVsaXN0ZWRQYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQga2V5Y2hhaW5zIGFuZCB2YWxpZGF0ZSBwYXNzcGhyYXNlIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge1ByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zfSBwYXJhbXMgLSBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkIGZvciB0cmFjaW5nIHB1cnBvc2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24gLSBjdXN0b20gc2lnbmluZyBmdW5jdGlvbiBmb3IgZXh0ZXJuYWwgc2lnbmluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbltdPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICBjdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICByZXFJZCxcbiAgfTogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgJiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxLZXljaGFpbltdPiB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSk7XG5cbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgLy8gd2UgaWdub3JlIHRoaXMgY2hlY2sgd2l0aCBpZiBjdXN0b21TaWduaW5nRnVuY3Rpb24gaXMgcHJvdmlkZWRcbiAgICAvLyAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBoYW5kbGluZyB0aGUgc2lnbmluZyBpbiBleHRlcm5hbCBzaWduaW5nIG1vZGVcbiAgICBpZiAoIWN1c3RvbVNpZ25pbmdGdW5jdGlvbiAmJiBrZXljaGFpbnM/LlswXT8uZW5jcnlwdGVkUHJ2ICYmIHdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIGlmICghZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCBrZXljaGFpbnNbMF0sIHdhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9ID0gbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmFibGUgdG8gZGVjcnlwdCBrZXljaGFpbiB3aXRoIHRoZSBnaXZlbiB3YWxsZXQgcGFzc3BocmFzZWBcbiAgICAgICAgKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICd3YWxsZXRfcGFzc3BocmFzZV9pbmNvcnJlY3QnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleWNoYWlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIHRva2VuIGZvciB1c2Ugd2l0aCBhIGJhdGNoZXIgY29udHJhY3RcbiAgICogVGhpcyBmdW5jdGlvbiBidWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0b2tlbiBhcHByb3ZhbCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0b2tlbiB0byBiZSBhcHByb3ZlZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICAgKi9cbiAgYXN5bmMgYXBwcm92ZUVyYzIwVG9rZW4od2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLCB0b2tlbk5hbWU6IHN0cmluZyk6IFByb21pc2U8U3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IHRva2VuQXBwcm92YWxCdWlsZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L3Rva2VuL2FwcHJvdmFsL2J1aWxkYCk7XG4gICAgICB0b2tlbkFwcHJvdmFsQnVpbGQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHVybClcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZCxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgdHhQcmVidWlsZDogdG9rZW5BcHByb3ZhbEJ1aWxkLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICByZXFJZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0b2tlbiBhcHByb3ZhbCB0cmFuc2FjdGlvbiBmb3IgRVJDMjAgdG9rZW5zXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgcHJvdmlkZWQsIGFsc28gc2lnbnMgYW5kIHNlbmRzIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRva2VuIHRvIGJlIGFwcHJvdmVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbd2FsbGV0UGFzc3BocmFzZV0gLSBPcHRpb25hbCB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2lnbmluZyBhbmQgc2VuZGluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSB8IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+fSBUaGUgdG9rZW4gYXBwcm92YWwgYnVpbGQgcmVzcG9uc2Ugb3IgdHJhbnNhY3Rpb24gZGV0YWlscyBpZiBzaWduZWRcbiAgICovXG4gIGFzeW5jIGJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSB8IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGxldCB0b2tlbkFwcHJvdmFsQnVpbGQ6IEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS90b2tlbi9hcHByb3ZhbC9idWlsZGApO1xuICAgIHRyeSB7XG4gICAgICB0b2tlbkFwcHJvdmFsQnVpbGQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHVybClcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IgYnVpbGRpbmcgZXJjMjAgdG9rZW4gYXBwcm92YWwgdHg6ICR7ZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICByZXR1cm4gdG9rZW5BcHByb3ZhbEJ1aWxkO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25pbmdQYXJhbXMgPSB7XG4gICAgICB0eFByZWJ1aWxkOiB0b2tlbkFwcHJvdmFsQnVpbGQsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgIH07XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG59XG4iXX0=
|
|
3729
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMseUNBQTJCO0FBQzNCLDBDQUE0QjtBQUU1QixxREFBdUM7QUFDdkMsa0RBQTREO0FBVTVELHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBTW1CO0FBRW5CLDBDQUEwQztBQUMxQywrREFBaUQ7QUFDakQsMENBQXdHO0FBQ3hHLDBFQUF1RTtBQUN2RSx3REFBeUY7QUFDekYsd0NBQTREO0FBQzVELHdDQUE0QztBQUM1QyxnQ0FBc0M7QUFDdEMsb0NBU2tCO0FBQ2xCLDBEQUF1RDtBQUN2RCw4Q0FBaUU7QUFDakUsK0RBQTRDO0FBQzVDLGtEQUF5RjtBQUN6RiwrQ0FBNEQ7QUEyRTVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNs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QUMsS0FBSztpQkFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQztpQkFDVCxJQUFJLENBQUM7Z0JBQ0osU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQztpQkFDRCxNQUFNLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUM7WUFDN0QsS0FBSztZQUNMLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRztZQUNwQixVQUFVLEVBQUUsa0JBQWtCO1lBQzlCLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLGdCQUFnQjtZQUNoQixLQUFLO1NBQ04sQ0FBQztRQUVGLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFMUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFscUlELHdCQWtxSUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBUeFNlbmRCb2R5LCB0eXBlIEFkZHJlc3NRdWVyeVJlc3VsdCB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQ29pbkZhbWlseSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSVJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBBZGRyZXNzQm9vaywgSUFkZHJlc3NCb29rIH0gZnJvbSAnLi4vYWRkcmVzcy1ib29rJztcbmltcG9ydCB7XG4gIElCYXNlQ29pbixcbiAgTkZUVHJhbnNmZXJPcHRpb25zLFxuICBTaWduZWRNZXNzYWdlLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbn0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgbWFrZVJhbmRvbUtleSB9IGZyb20gJy4uL2JpdGNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc0dlbmVyYXRpb25FcnJvcixcbiAgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IsXG4gIE5lZWRVc2VyU2lnbnVwRXJyb3IsXG59IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTdWJtaXRUcmFuc2FjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vaW5zY3JpcHRpb25CdWlsZGVyJztcbmltcG9ydCB7IGRyYXdLZXljYXJkIH0gZnJvbSAnLi4vaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgaW50ZXJuYWwgZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJuYWwnO1xuaW1wb3J0IHsgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSwgS2V5Y2hhaW4sIEtleWNoYWluV2l0aEVuY3J5cHRlZFBydiwgS2V5SW5kaWNlcyB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IGdldExpZ2h0bmluZ0F1dGhLZXkgfSBmcm9tICcuLi9saWdodG5pbmcvbGlnaHRuaW5nV2FsbGV0VXRpbCc7XG5pbXBvcnQgeyBJUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWwsIFBlbmRpbmdBcHByb3ZhbHMgfSBmcm9tICcuLi9wZW5kaW5nQXBwcm92YWwnO1xuaW1wb3J0IHsgR29TdGFraW5nV2FsbGV0LCBTdGFraW5nV2FsbGV0IH0gZnJvbSAnLi4vc3Rha2luZyc7XG5pbXBvcnQgeyBUcmFkaW5nQWNjb3VudCB9IGZyb20gJy4uL3RyYWRpbmcnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vdHNzJztcbmltcG9ydCB7XG4gIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gIEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFJlcXVlc3RUeXBlLFxuICBUb2tlblRyYW5zZmVyUmVjaXBpZW50UGFyYW1zLFxuICBUb2tlblR5cGUsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgcG9zdFdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL3Bvc3RXaXRoQ29kZWMnO1xuaW1wb3J0IHsgRWNkc2FNUEN2MlV0aWxzLCBFY2RzYVV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvdHNzL2VjZHNhJztcbmltcG9ydCBFZGRzYVV0aWxzIGZyb20gJy4uL3V0aWxzL3Rzcy9lZGRzYSc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uLCB2YWxpZGF0ZVR4UmVxdWVzdEFwaVZlcnNpb24gfSBmcm9tICcuLi91dGlscy90eFJlcXVlc3QnO1xuaW1wb3J0IHsgYnVpbGRQYXJhbUtleXMsIEJ1aWxkUGFyYW1zIH0gZnJvbSAnLi9CdWlsZFBhcmFtcyc7XG5pbXBvcnQge1xuICBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBBZGRyZXNzZXNCeUJhbGFuY2VPcHRpb25zLFxuICBBZGRyZXNzZXNPcHRpb25zLFxuICBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyxcbiAgQnVsa0NyZWF0ZVNoYXJlT3B0aW9uLFxuICBCdWxrV2FsbGV0U2hhcmVLZXljaGFpbixcbiAgQnVsa1dhbGxldFNoYXJlT3B0aW9ucyxcbiAgQ2hhbmdlRmVlT3B0aW9ucyxcbiAgQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMsXG4gIENyZWF0ZUFkZHJlc3NPcHRpb25zLFxuICBDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2UsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIENyb3NzQ2hhaW5VVFhPLFxuICBEZWNyeXB0ZWRLZXljaGFpbkRhdGEsXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyxcbiAgRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMsXG4gIEZvcndhcmRlckJhbGFuY2UsXG4gIEZvcndhcmRlckJhbGFuY2VPcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBGdW5kRm9yd2FyZGVyUGFyYW1zLFxuICBGdW5kRm9yd2FyZGVyc09wdGlvbnMsXG4gIEdldEFkZHJlc3NPcHRpb25zLFxuICBHZXRQcnZPcHRpb25zLFxuICBHZXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEdldFRyYW5zZmVyT3B0aW9ucyxcbiAgR2V0VXNlclBydk9wdGlvbnMsXG4gIHR5cGUgSVdhbGxldCxcbiAgTWFuYWdlVW5zcGVudFJlc2VydmF0aW9uT3B0aW9ucyxcbiAgTWF4aW11bVNwZW5kYWJsZSxcbiAgTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMsXG4gIE1vZGlmeVdlYmhvb2tPcHRpb25zLFxuICBOZnRCYWxhbmNlLFxuICBQYWdpbmF0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCxcbiAgUmVjb3ZlclRva2VuT3B0aW9ucyxcbiAgUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMsXG4gIFJlbW92ZVVzZXJPcHRpb25zLFxuICBTZW5kTWFueU9wdGlvbnMsXG4gIFNlbmRORlRPcHRpb25zLFxuICBTZW5kTkZUUmVzdWx0LFxuICBTZW5kT3B0aW9ucyxcbiAgU2hhcmVkS2V5Q2hhaW4sXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zLFxuICBTaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1YldhbGxldFR5cGUsXG4gIFN3ZWVwT3B0aW9ucyxcbiAgVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zLFxuICBUcmFuc2ZlckNvbW1lbnRPcHRpb25zLFxuICBUcmFuc2ZlcnNPcHRpb25zLFxuICBVbnNwZW50c09wdGlvbnMsXG4gIFVwZGF0ZUFkZHJlc3NPcHRpb25zLFxuICBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zLFxuICBVcGRhdGVXYWxsZXRPcHRpb25zLFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG4gIFdhbGxldERhdGEsXG4gIFdhbGxldEVjZHNhQ2hhbGxlbmdlcyxcbiAgV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyxcbiAgV2FsbGV0VHlwZSxcbiAgQnVpbGRUb2tlbkFwcHJvdmFsUmVzcG9uc2UsXG4gIFdhbGxldEluaXRSZXN1bHQsXG59IGZyb20gJy4vaVdhbGxldCc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmNvbnN0IHdoaXRlbGlzdGVkU2VuZFBhcmFtcyA9IFR4U2VuZEJvZHkudHlwZS50eXBlcy5mbGF0TWFwKCh0KSA9PiBPYmplY3Qua2V5cyh0LnByb3BzKSk7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFY2RzYU1QQ3YyVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICBpZiAod2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VkZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVkZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIFVSTCB1c2luZyB0aGlzIHdhbGxldCdzIGlkIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBCaXRHbyBBUEkgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZXh0cmEgQVBJIHNwZWNpZmljIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIHdhbGxldCBpZFxuICAgKi9cbiAgdXJsKGV4dHJhID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgZXh0cmEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGlzIHdhbGxldCdzIGlkXG4gICAqL1xuICBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuaWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIGZvciBzcGVuZGluZyBmdW5kcyBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICBhcHByb3ZhbHNSZXF1aXJlZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYXBwcm92YWxzUmVxdWlyZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmJhbGFuY2U7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIGNvZGVjIGluc3RlYWQ6IHQuZXhhY3QoQnVpbGRQYXJhbXMpLmVuY29kZSh2KSAqL1xuICBwcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gYnVpbGRQYXJhbUtleXM7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHN0cmljdCBzdWItc2V0IG9mIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXNcbiAgICovXG4gIHByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICduZnRDb2xsZWN0aW9uSWQnLFxuICAgICAgJ25mdElkJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdwcmV2aWV3JyxcbiAgICAgICdrZWVwQWxpdmUnLFxuICAgICAgJ2FwaVZlcnNpb24nLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb2luIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGNvaW4gdGhpcyB3YWxsZXQgaG9sZHNcbiAgICovXG4gIGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW47XG4gIH1cblxuICB0eXBlKCk6IFdhbGxldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQudHlwZSB8fCAnaG90JztcbiAgfVxuXG4gIG11bHRpc2lnVHlwZSgpOiAnb25jaGFpbicgfCAndHNzJyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGU7XG4gIH1cblxuICBtdWx0aXNpZ1R5cGVWZXJzaW9uKCk6ICdNUEN2MicgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbjtcbiAgfVxuXG4gIHN1YlR5cGUoKTogU3ViV2FsbGV0VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zdWJUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIHB1YmxpYyBmbGFncygpOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQud2FsbGV0RmxhZ3MgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZmxhZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsYWdzKCkuZmluZCgoZmxhZykgPT4gZmxhZy5uYW1lID09PSBuYW1lKT8udmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwdWJsaWMgb2JqZWN0IGlkcyBmb3IgdGhlIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC5cbiAgICovXG4gIHB1YmxpYyBrZXlJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQua2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWNlaXZlIGFkZHJlc3MgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgcmVjZWl2ZUFkZHJlc3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnJlY2VpdmVBZGRyZXNzPy5hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2FsbGV0IGlkIG9mIHRoZSB3YWxsZXQgdGhhdCB0aGlzIHdhbGxldCB3YXMgbWlncmF0ZWQgZnJvbS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgYSBCQ0ggd2FsbGV0IHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSBhIEJUQyB3YWxsZXQsXG4gICAqIHRoZSBCQ0ggd2FsbGV0IG1pZ3JhdGVkIGZyb20gZmllbGQgd291bGQgaGF2ZSB0aGUgQlRDIHdhbGxldCBpZC5cbiAgICovXG4gIHB1YmxpYyBtaWdyYXRlZEZyb20oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm1pZ3JhdGVkRnJvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoaXMgd2FsbGV0XG4gICAqIEByZXR1cm4geyp8T2JqZWN0fSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGRzIH0gYmFzZSB1bml0c1xuICAgKi9cbiAgdG9rZW5GbHVzaFRocmVzaG9sZHMoKTogYW55IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMudG9rZW5GbHVzaFRocmVzaG9sZHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIGNvaW4gaW1wbGVtZW50YXRpb25zXG4gICAqL1xuICBjb2luU3BlY2lmaWMoKTogV2FsbGV0Q29pblNwZWNpZmljIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgYXBwcm92YWxzIG9uIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IElQZW5kaW5nQXBwcm92YWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5wZW5kaW5nQXBwcm92YWxzLm1hcCgoY3VycmVudEFwcHJvdmFsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFBlbmRpbmdBcHByb3ZhbCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBjdXJyZW50QXBwcm92YWwsIHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtXYWxsZXR9XG4gICAqL1xuICBhc3luYyByZWZyZXNoKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9ucyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHgnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIG5mdCB0b2tlbnMgZm9yIHRoaXMgd2FsbGV0LiBXaWxsIGFsd2F5cyByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZSB3YWxsZXRcbiAgICogd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBhbGxUb2tlbnMgZmxhZy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIG5mdEJhbGFuY2VzKCk6IE5mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5uZnRzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl93YWxsZXQubmZ0cykubWFwKChuZnREYXRhKSA9PiBuZnREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIHVuc3VwcG9ydGVkIG5mdCB0b2tlbnMgZm9yIHRoaXMgd2FsbGV0LiBXaWxsIGFsd2F5cyByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZSB3YWxsZXRcbiAgICogd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBhbGxUb2tlbnMgZmxhZy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHVuc3VwcG9ydGVkTmZ0QmFsYW5jZXMoKTogTmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fd2FsbGV0LnVuc3VwcG9ydGVkTmZ0cykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fd2FsbGV0LnVuc3VwcG9ydGVkTmZ0cykubWFwKChuZnREYXRhKSA9PiBuZnREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgd2FsbGV0cyBuZnQgJiB1bnN1cHBvcnRlZCBuZnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7TmZ0QmFsYW5jZVtdfVxuICAgKi9cbiAgYXN5bmMgZ2V0TmZ0QmFsYW5jZXMoKTogUHJvbWlzZTxOZnRCYWxhbmNlW10+IHtcbiAgICBjb25zdCB3YWxsZXREYXRhOiBQYXJ0aWFsPFdhbGxldERhdGE+ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucXVlcnkoeyBhbGxUb2tlbnM6IHRydWUgfSkucmVzdWx0KCk7XG5cbiAgICBjb25zdCBzdXBwb3J0ZWROZnRzID0gd2FsbGV0RGF0YT8ubmZ0cyA/IE9iamVjdC52YWx1ZXMod2FsbGV0RGF0YS5uZnRzKS5tYXAoKGJhbGFuY2UpID0+IGJhbGFuY2UpIDogW107XG5cbiAgICBjb25zdCB1bnN1cHBvcnRlZE5mdHMgPSB3YWxsZXREYXRhPy51bnN1cHBvcnRlZE5mdHNcbiAgICAgID8gT2JqZWN0LnZhbHVlcyh3YWxsZXREYXRhLnVuc3VwcG9ydGVkTmZ0cykubWFwKChiYWxhbmNlKSA9PiBiYWxhbmNlKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4gWy4uLnN1cHBvcnRlZE5mdHMsIC4uLnVuc3VwcG9ydGVkTmZ0c107XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcGFnaW5hdGVkT3B0aW9uczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBwYWdpbmF0ZWRPcHRpb25zLnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSB8fCBwYXJhbXMubGltaXQgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIHBhZ2luYXRlZE9wdGlvbnMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSBwYWdpbmF0ZWRPcHRpb25zO1xuICAgIGlmIChwYXJhbXMuaW5jbHVkZVJiZikge1xuICAgICAgcXVlcnlbJ2luY2x1ZGVSYmYnXSA9IHBhcmFtcy5pbmNsdWRlUmJmO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMudXJsKCcvdHgvJyArIHBhcmFtcy50eEhhc2gpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zZmVycyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVycyhwYXJhbXM6IFRyYW5zZmVyc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFRyYW5zZmVyc09wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zLnByZXZJZCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFsbFRva2Vucykge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuYWxsVG9rZW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWxsVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuYWxsVG9rZW5zID0gcGFyYW1zLmFsbFRva2VucztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaExhYmVsKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnNlYXJjaExhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2VhcmNoTGFiZWwgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlYXJjaExhYmVsID0gcGFyYW1zLnNlYXJjaExhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgcGFyYW1zLmFkZHJlc3MuZm9yRWFjaCgoYWRkcmVzcykgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBhZGRyZXNzIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuYWRkcmVzcyA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZGF0ZUd0ZSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuZGF0ZUd0ZSA9IHBhcmFtcy5kYXRlR3RlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZGF0ZUx0KSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuZGF0ZUx0ID0gcGFyYW1zLmRhdGVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlR3RlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS52YWx1ZUd0ZSA9IHBhcmFtcy52YWx1ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnZhbHVlTHQpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUx0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS52YWx1ZUx0ID0gcGFyYW1zLnZhbHVlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVIZXggYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlSGV4ID0gcGFyYW1zLmluY2x1ZGVIZXg7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5zdGF0ZSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5zdGF0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXRlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkpIHtcbiAgICAgICAgcGFyYW1zLnN0YXRlLmZvckVhY2goKHN0YXRlKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKHN0YXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXRlIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2Ygc3RhdGUgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zdGF0ZSA9IHBhcmFtcy5zdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnR5cGUpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0eXBlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS50eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzID0gcGFyYW1zLmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNmZXJzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFRyYW5zZmVyKHBhcmFtczogR2V0VHJhbnNmZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJCeVNlcXVlbmNlSWQocGFyYW1zOiBUcmFuc2ZlckJ5U2VxdWVuY2VJZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci9zZXF1ZW5jZUlkLycgKyBwYXJhbXMuc2VxdWVuY2VJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBhbW91bnQgeW91IGNhbiBzcGVuZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAtIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGFibGUgdW5zcGVudHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZXMgbWluQ29uZmlybXMgb24gY2hhbmdlIGlucHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBmZWUgcmF0ZSB0byB1c2UgaW4gY2FsY3VsYXRpb24gb2YgbWF4aW11bSBzcGVuZGFibGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5yZWNpcGllbnRBZGRyZXNzIC0gcmVjaXBpZW50IGFkZHJlc3NlcyBmb3IgYSBtb3JlIGFjY3VyYXRlIGNhbGN1bGF0aW9uIG9mIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB0byBzZW5kXG4gICAqIEByZXR1cm5zIHt7bWF4aW11bVNwZW5kYWJsZTogTnVtYmVyLCBjb2luOiBTdHJpbmd9fVxuICAgKiBOT1RFIDogZmVlVHhDb25maXJtVGFyZ2V0IG9taXR0ZWQgb24gcHVycG9zZSBiZWNhdXNlIGdhdWdpbmcgdGhlIG1heGltdW0gc3BlbmRhYmxlIGFtb3VudCB3aXRoIGR5bmFtaWMgZmVlcyBkb2VzIG5vdCBtYWtlIHNlbnNlXG4gICAqL1xuICBhc3luYyBtYXhpbXVtU3BlbmRhYmxlKHBhcmFtczogTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWF4aW11bVNwZW5kYWJsZT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncGxhaW5UYXJnZXQnLFxuICAgICAgJ3JlY2lwaWVudEFkZHJlc3MnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9tYXhpbXVtU3BlbmRhYmxlJykpLnF1ZXJ5KGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1bnNwZW50cyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVuc3BlbnRzKHBhcmFtczogVW5zcGVudHNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2NoYWlucycsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncHJldklkJyxcbiAgICAgICdzZWd3aXQnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgICAndW5zcGVudElkcycsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy91bnNwZW50cycpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgb3IgZmFub3V0IHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByb3V0ZU5hbWUgLSBlaXRoZXIgYGNvbnNvbGlkYXRlYCBvciBgZmFub3V0YFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICpcbiAgICogV2FsbGV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBGZWUgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqXG4gICAqIElucHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBPdXRwdXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVVuc3BlbnRzKFxuICAgIHJvdXRlTmFtZTogTWFuYWdlVW5zcGVudHMsXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyB8IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24oeyAuLi5wYXJhbXMsIHR5cGU6ICdjb25zb2xpZGF0ZScgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgcm91dGVOYW1lID09PSAnZmFub3V0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYW5vdXQgaXMgbm90IHN1cHBvcnRlZCBmb3IgY3VzdG9kaWFsIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmFub3V0SW5wdXRGb3JtYXQgPSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgPyAnbWF4TnVtSW5wdXRzVG9Vc2UnIDogJ3Vuc3BlbnRzJztcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICAgICdidWxrJyxcblxuICAgICAgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnID8gJ2xpbWl0JyA6IGZhbm91dElucHV0Rm9ybWF0LFxuICAgICAgJ251bVVuc3BlbnRzVG9NYWtlJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZTogVHJhbnNhY3Rpb25QcmVidWlsZCB8IFRyYW5zYWN0aW9uUHJlYnVpbGRbXSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKGAvJHtyb3V0ZU5hbWV9VW5zcGVudHNgKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgaWYgKG9wdGlvbiA9PT0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX09OTFkpIHtcbiAgICAgIHJldHVybiBidWlsZFJlc3BvbnNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCB0aGlzLmJhc2VDb2luXG4gICAgICAua2V5Y2hhaW5zKClcbiAgICAgIC5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIHVua25vd24gYXMgS2V5Y2hhaW5bXTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHBsYXRmb3JtLWJ1aWx0IHRyYW5zYWN0aW9uIG1hdGNoZXMgdXNlciBwYXJhbWV0ZXJzXG4gICAgY29uc3QgdHhQcmVidWlsZHMgPSBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gYnVpbGRSZXNwb25zZSA6IFtidWlsZFJlc3BvbnNlXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4UHJlYnVpbGRzLm1hcCgodHhQcmVidWlsZCkgPT5cbiAgICAgICAgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIC4uLihwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9KSxcbiAgICAgICAgICAgIGtleWNoYWluczoge1xuICAgICAgICAgICAgICB1c2VyOiBrZXljaGFpbnNbMF0sXG4gICAgICAgICAgICAgIGJhY2t1cDoga2V5Y2hhaW5zWzFdLFxuICAgICAgICAgICAgICBiaXRnbzoga2V5Y2hhaW5zWzJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBwdWJzOiBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pLFxuICAgICAgLy8gQnVpbGRpbmcgUFNCVHMgd2l0aCB0aGUgYnVsayBmbGFnIGRvZXMgbm90IGluY2x1ZGUgdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uIGZvciBub24tc2Vnd2l0IGlucHV0cy5cbiAgICAgIC8vIE1hbnVhbGx5IG92ZXJyaWRlIHRoZSBzaWduaW5nIGFuZCB2YWxpZGF0aW5nIHRvIG5vdCBmYWlsLlxuICAgICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogISFwYXJhbXMuYnVsayxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjb21tZW50JywgJ290cCcsICdidWxrJ10pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4UHJlYnVpbGRzLm1hcChhc3luYyAodHhQcmVidWlsZCkgPT4ge1xuICAgICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAuLi50cmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCB7XG4gICAgICAgICAgdHlwZTogcm91dGVOYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gcmVzcG9uc2UgOiByZXNwb25zZVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2UgdGhlIHVuc3BlbnQgcmVzZXJ2YXRpb25zIG9uIHRoZSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5jcmVhdGUgLSBjcmVhdGUgYSBuZXcgcmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tb2RpZnkgLSBtb2RpZnkgYW4gZXhpc3RpbmcgcmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5kZWxldGUgLSBkZWxldGUgYW4gZXhpc3RpbmcgcmVzZXJ2YXRpb25cbiAgICovXG4gIGFzeW5jIG1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMocGFyYW1zOiBNYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25PcHRpb25zKTogUHJvbWlzZTx7XG4gICAgdW5zcGVudHM6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB3YWxsZXRJZDogc3RyaW5nO1xuICAgICAgZXhwaXJlVGltZTogc3RyaW5nO1xuICAgICAgdXNlcklkPzogc3RyaW5nO1xuICAgIH1bXTtcbiAgfT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjcmVhdGUnLCAnbW9kaWZ5JywgJ2RlbGV0ZSddKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIobmV3IFJlcXVlc3RUcmFjZXIoKSk7XG4gICAgLy8gVGhlIFVSTCBjYW5ub3QgY29udGFpbiB0aGUgY29pbk5hbWUsIHNvIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBVUkxcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL3Jlc2VydmVkdW5zcGVudHNgKS5yZXBsYWNlKGAvJHt0aGlzLmJhc2VDb2luLmdldENoYWluKCl9YCwgJycpO1xuICAgIGlmIChmaWx0ZXJlZFBhcmFtcy5jcmVhdGUpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkQ3JlYXRlUGFyYW1zID0gXy5waWNrKHBhcmFtcy5jcmVhdGUsIFsndW5zcGVudElkcycsICdleHBpcmVUaW1lJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQoZmlsdGVyZWRDcmVhdGVQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyZWRQYXJhbXMubW9kaWZ5KSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZE1vZGlmeVBhcmFtcyA9IF8ucGljayhwYXJhbXMubW9kaWZ5LCBbJ3Vuc3BlbnRJZHMnLCAnY2hhbmdlcyddKTtcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoZmlsdGVyZWRNb2RpZnlQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyZWRQYXJhbXMuZGVsZXRlKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZERlbGV0ZVBhcmFtcyA9IF8ucGljayhwYXJhbXMuZGVsZXRlLCBbJ2lkJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHVybCkucXVlcnkoZmlsdGVyZWREZWxldGVQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZGV0ZWN0IGEgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiwgb3IgZGVsZXRpb24gcmVxdWVzdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlLiBJdCBpcyBub3QgYXBwbGljYWJsZSBmb3IgaWYgYnVsayBjb25zb2xpZGF0ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqXG4gICAqIEBwYXJhbSB7TWFuYWdlVW5zcGVudHNPcHRpb25zfSBvcHRpb24gLSBmbGFnIHRvIHRvZ2dsZSBidWlsZCBhbmQgc2VuZCBvciBidWlsZCBvbmx5XG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhcbiAgICBwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2Zhbm91dCcsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL21heGltdW1TcGVuZGFibGUnKSkucmVzdWx0KCk7XG4gICAgICBjb25zdCBtYXhpbXVtU3BlbmRhYmxlID0gbmV3IEJpZ051bWJlcih2YWx1ZS5tYXhpbXVtU3BlbmRhYmxlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IG1heGltdW1TcGVuZGFibGUuaXNaZXJvKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZW5kTWFueVBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB8fCAnJywgLy8gRW5zdXJlIGFkZHJlc3MgaXMgYWx3YXlzIGEgc3RyaW5nXG4gICAgICAgICAgICBhbW91bnQ6IG1heGltdW1TcGVuZGFibGUudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlQYXJhbXMpO1xuICAgIH1cbiAgICAvLyB0aGUgZm9sbG93aW5nIGZsb3cgd29ya3MgZm9yIGFsbCBVVFhPIGNvaW5zXG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcbiAgICAgICdhbGxvd1BhcnRpYWxTd2VlcCcsXG4gICAgICAndHhGb3JtYXQnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICBpZiAodHJhbnNhY3Rpb24/Lm91dHB1dHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkT3V0cHV0QWRkcmVzcyA9IHRyYW5zYWN0aW9uLm91dHB1dHMuZmluZCgob3V0cHV0KSA9PiBvdXRwdXQuYWRkcmVzcyAhPT0gcGFyYW1zLmFkZHJlc3MpO1xuICAgICAgaWYgKGludmFsaWRPdXRwdXRBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzd2VlcCBkZXN0aW5hdGlvbiAke2ludmFsaWRPdXRwdXRBZGRyZXNzLmFkZHJlc3N9LCBzcGVjaWZpZWQgJHtwYXJhbXMuYWRkcmVzc31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYW5zYWN0aW9uLCBubyBkZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyBhbnk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHBydjogcGFyYW1zLnhwcnYsXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcyk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPEFkZHJlc3NRdWVyeVJlc3VsdD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBzb3J0ZWQgYnkgYmFsYW5jZSBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3Nlc0J5QmFsYW5jZShwYXJhbXM6IEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNCeUJhbGFuY2VPcHRpb25zID0ge1xuICAgICAgdG9rZW46IHBhcmFtcy50b2tlbixcbiAgICAgIG5mdENvbGxlY3Rpb25JZDogcGFyYW1zLm5mdENvbGxlY3Rpb25JZCxcbiAgICAgIG5mdElkOiBwYXJhbXMubmZ0SWQsXG4gICAgfTtcbiAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQgPz8gLTE7XG4gICAgcXVlcnkucGFnZSA9IHBhcmFtcy5wYWdlID8/IDE7XG4gICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQgPz8gNTAwO1xuXG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LnNvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNOdW1iZXIocXVlcnkucGFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYWdlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAocXVlcnkubGltaXQgPCAxIHx8IHF1ZXJ5LmxpbWl0ID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpbWl0IGFyZ3VtZW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MDAnKTtcbiAgICB9XG5cbiAgICAvLyBBc3NlcnQgdGhhdCBlaXRoZXIgYm90aCBuZnRDb2xsZWN0aW9uSWQgYW5kIG5mdElkIGFyZSBwcm92aWRlZCBvciBuZWl0aGVyIGFyZSBwcm92aWRlZFxuICAgIGNvbnN0IGhhc05mdENvbGxlY3Rpb25JZCA9ICFfLmlzVW5kZWZpbmVkKHF1ZXJ5Lm5mdENvbGxlY3Rpb25JZCk7XG4gICAgY29uc3QgaGFzTmZ0SWQgPSAhXy5pc1VuZGVmaW5lZChxdWVyeS5uZnRJZCk7XG4gICAgaWYgKGhhc05mdENvbGxlY3Rpb25JZCAhPT0gaGFzTmZ0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbmZ0Q29sbGVjdGlvbklkIGFuZCBuZnRJZCBtdXN0IGJvdGggYmUgcHJvdmlkZWQgb3IgYm90aCBiZSBvbWl0dGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzL2JhbGFuY2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICAgIGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoY2hhaW4pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGNoYWluKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYWluIGhhcyB0byBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmNoYWluID0gY2hhaW47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGdhc1ByaWNlKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihnYXNQcmljZSkgJiYgKGlzTmFOKE51bWJlcihnYXNQcmljZSkpIHx8ICFfLmlzU3RyaW5nKGdhc1ByaWNlKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnYXNQcmljZSBoYXMgdG8gYmUgYW4gaW50ZWdlciBvciBudW1lcmljIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3J3YXJkZXJWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihmb3J3YXJkZXJWZXJzaW9uKSB8fCBmb3J3YXJkZXJWZXJzaW9uIDwgMCB8fCBmb3J3YXJkZXJWZXJzaW9uID4gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlclZlcnNpb24gaGFzIHRvIGJlIGFuIGludGVnZXIgMCwgMSwgMiwgMywgNCBvciA1Jyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsYWJlbCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhsYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYWJlbCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFzZUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoYmFzZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFzZUFkZHJlc3MgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihjb3VudCkgfHwgY291bnQgPD0gMCB8fCBjb3VudCA+IDI1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VudCBoYXMgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTAnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobG93UHJpb3JpdHkpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGxvd1ByaW9yaXR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvd1ByaW9yaXR5IGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubG93UHJpb3JpdHkgPSBsb3dQcmlvcml0eTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9ybWF0KSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtYXQgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ29mYycpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChvblRva2VuKSkge1xuICAgICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcmFtcy5vblRva2VuID0gb25Ub2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIE9GQyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc0VWTSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEVWTSBjaGFpbnMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5ldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyA9IGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzO1xuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICBuZXdBZGRyZXNzLmtleWNoYWlucyA9IGtleWNoYWlucztcbiAgICAgIG5ld0FkZHJlc3MuYmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzcyA/PyBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MnKTtcbiAgICAgIG5ld0FkZHJlc3MuZm9ybWF0ID0gYWRkcmVzc1BhcmFtcy5mb3JtYXQ7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywge1xuICAgICAgICByb290QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLndhbGxldFZlcnNpb24nKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodmVyaWZpY2F0aW9uRGF0YS5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWRkcmVzc0dlbmVyYXRpb25FcnJvcih2ZXJpZmljYXRpb25EYXRhLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb24gPz8gdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWM/LmZvcndhcmRlclZlcnNpb247XG5cbiAgICAgIC8vIEZvciBTTUMgKFNlbGYtTWFuYWdlZCBDdXN0b2RpYWwpIHdhbGxldHMsIHBhc3MgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBmcm9tIHVzZXIga2V5Y2hhaW5cbiAgICAgIC8vIFRoZSB2ZXJpZmljYXRpb24gZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBkZXJpdmF0aW9uIHByZWZpeCBpbnRlcm5hbGx5XG4gICAgICAvLyBDdXN0b2RpYWwgd2FsbGV0cyBkb24ndCBuZWVkIHRoaXMgYXMgdGhlaXIgY29tbW9uS2V5Y2hhaW4gYWxyZWFkeSBhY2NvdW50cyBmb3IgdGhlIHByZWZpeFxuICAgICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnICYmIHRoaXMudHlwZSgpID09PSAnY29sZCcgJiYgdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoID4gS2V5SW5kaWNlcy5VU0VSKSB7XG4gICAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1tLZXlJbmRpY2VzLlVTRVJdIGFzIEtleWNoYWluIHwgdW5kZWZpbmVkO1xuICAgICAgICB2ZXJpZmljYXRpb25EYXRhLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSB1c2VyS2V5Y2hhaW4/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVdhbGxldEJ1aWxkRGVmYXVsdHMocGFyYW1zOiBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWluRmVlUmF0ZScsICdjaGFuZ2VBZGRyZXNzVHlwZScsICd0eEZvcm1hdCddKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVXYWxsZXQoe1xuICAgICAgYnVpbGREZWZhdWx0czoge1xuICAgICAgICBtaW5GZWVSYXRlOiBwYXJhbXMubWluRmVlUmF0ZSxcbiAgICAgICAgY2hhbmdlQWRkcmVzc1R5cGU6IHBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSxcbiAgICAgICAgdHhGb3JtYXQ6IHBhcmFtcy50eEZvcm1hdCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVXYWxsZXQocGFyYW1zOiBVcGRhdGVXYWxsZXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvaW5TcGVjaWZpYycsICdidWlsZERlZmF1bHRzJywgJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHsgY29pblNwZWNpZmljLCAuLi5yZXN0IH0gPSBmaWx0ZXJlZFBhcmFtcztcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICAuLi5yZXN0LFxuICAgICAgICAuLi4oY29pblNwZWNpZmljXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgIFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiBjb2luU3BlY2lmaWMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoZSB1c2VyIGtleWNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBwYXNzcGhyYXNlIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRlY3J5cHRpbmcgd2FsbGV0IHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgcHJpdmF0ZSBpc011bHRpVXNlcktleVdhbGxldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uZmVhdHVyZXM/LmluY2x1ZGVzKCdtdWx0aS1rZXktdXNlci1rZXknKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGVuY3J5cHRlZCB3YWxsZXQgc2hhcmUgdG8gQml0R28uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlKHBhcmFtczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSk7XG5cbiAgICBjb25zdCBpc011bHRpVXNlcktleVdhbGxldCA9IHRoaXMuaXNNdWx0aVVzZXJLZXlXYWxsZXQoKTtcblxuICAgIGlmIChpc011bHRpVXNlcktleVdhbGxldCkge1xuICAgICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBwcm92aWRlZCBmb3IgbXVsdGkta2V5LXVzZXIta2V5IHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBrZXljaGFpbiBmcm9tIHBhcmFtcyBpZiBwcmVzZW50c1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQoXy5vbWl0KHBhcmFtcywgJ2tleWNoYWluJykpLnJlc3VsdCgpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4ucHViIHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4uZnJvbVB1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4ucGF0aFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHB1YiwgZW5jcnlwdGVkUHJ2LCBmcm9tUHViS2V5LCB0b1B1YktleSwgcGF0aCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVzIGEgd2FsbGV0IHdpdGggbXVsdGlwbGUgdXNlcnMgYnkgY3JlYXRpbmcgYnVsayB3YWxsZXQgc2hhcmVzLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtCdWxrV2FsbGV0U2hhcmVPcHRpb25zfSBwYXJhbXMgLSBUaGUgb3B0aW9ucyBmb3Igc2hhcmluZyB3YWxsZXRzIGluIGJ1bGsuXG4gICAqIEBwYXJhbSB7QXJyYXk8U2hhcmVPcHRpb24+fSBwYXJhbXMuc2hhcmVPcHRpb25zIC0gQW4gYXJyYXkgb2Ygc2hhcmUgb3B0aW9uIG9iamVjdHMgY29udGFpbmluZyB1c2VyIGFuZCBwZXJtaXNzaW9ucyBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW5dIC0gVGhlIGtleWNoYWluIG9iamVjdCB1c2VkIHRvIHNoYXJlIHRoZSB3YWxsZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluLnRvUHViS2V5XSAtIFRoZSByZWNpcGllbnQncyBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbi5wYXRoXSAtIFRoZSBkZXJpdmF0aW9uIHBhdGggb2YgdGhlIGtleWNoYWluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNoYXJlT3B0aW9uc1tdLnVzZXIgLSBUaGUgdXNlciB0byBzaGFyZSB0aGUgd2FsbGV0IHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2hhcmVPcHRpb25zW10ucGVybWlzc2lvbnMgLSBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMud2FsbGV0UGFzc3BocmFzZV0gLSBUaGUgd2FsbGV0IHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXljaGFpbi5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGBzaGFyZU9wdGlvbnNgIGlzIGVtcHR5LCBvciBpZiByZXF1aXJlZCBrZXljaGFpbiBwYXJhbWV0ZXJzIChgdG9QdWJLZXlgIGFuZCBgcGF0aGApIGFyZSBtaXNzaW5nIHdoZW4gbmVlZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdW5hYmxlIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5Y2hhaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIG9mIHRoZSBidWxrIHdhbGxldCBzaGFyZSBjcmVhdGlvbi5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJ1bGtXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT4ge1xuICAgIGlmIChwYXJhbXMua2V5U2hhcmVPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaGFyZSBvcHRpb25zIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVsa0NyZWF0ZVNoYXJlT3B0aW9uczogQnVsa0NyZWF0ZVNoYXJlT3B0aW9uW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGlmIGFueSBzaGFyZSBvcHRpb24gbmVlZHMgYSBrZXljaGFpbiAoaGFzICdzcGVuZCcgcGVybWlzc2lvbilcbiAgICBjb25zdCBhbnlOZWVkc0tleWNoYWluID0gcGFyYW1zLmtleVNoYXJlT3B0aW9ucy5zb21lKChvcHQpID0+IG9wdC5wZXJtaXNzaW9ucyAmJiBvcHQucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykpO1xuXG4gICAgLy8gRmV0Y2ggYW5kIGRlY3J5cHQgdGhlIGtleWNoYWluIE9OQ0UgZm9yIGFsbCB1c2Vyc1xuICAgIGxldCBkZWNyeXB0ZWRLZXljaGFpbjogRGVjcnlwdGVkS2V5Y2hhaW5EYXRhIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFueU5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlY3J5cHRlZEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKSB7XG4gICAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2hhcmVPcHRpb24gb2YgcGFyYW1zLmtleVNoYXJlT3B0aW9ucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHNoYXJlT3B0aW9uLCBbJ3VzZXJJZCcsICdwdWJLZXknLCAncGF0aCddLCBbXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghc2hhcmVPcHRpb24ucHViS2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5lZWRVc2VyU2lnbnVwRXJyb3Ioc2hhcmVPcHRpb24udXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZWVkc0tleWNoYWluID0gc2hhcmVPcHRpb24ucGVybWlzc2lvbnMgJiYgc2hhcmVPcHRpb24ucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJyk7XG5cbiAgICAgIGlmIChuZWVkc0tleWNoYWluICYmIGRlY3J5cHRlZEtleWNoYWluKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleWNoYWluID0gdGhpcy5lbmNyeXB0UHJ2Rm9yVXNlcihcbiAgICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbi5wcnYsXG4gICAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4ucHViLFxuICAgICAgICAgIHNoYXJlT3B0aW9uLnB1YktleSxcbiAgICAgICAgICBzaGFyZU9wdGlvbi5wYXRoXG4gICAgICAgICk7XG5cbiAgICAgICAgYnVsa0NyZWF0ZVNoYXJlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICB1c2VyOiBzaGFyZU9wdGlvbi51c2VySWQsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHNoYXJlT3B0aW9uLnBlcm1pc3Npb25zLFxuICAgICAgICAgIGtleWNoYWluOiBzaGFyZWRLZXljaGFpbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQnVsa0tleVNoYXJlcyhidWxrQ3JlYXRlU2hhcmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGJ1bGsgd2FsbGV0IHNoYXJlIGVudHJpZXMgZm9yIHNwZWNpZmllZCBzaGFyZSBvcHRpb25zLlxuICAgKiBGaWx0ZXJzIG91dCBzaGFyZSBvcHRpb25zIHRoYXQgZG8gbm90IGNvbnRhaW4gdmFsaWQga2V5Y2hhaW4gaW5mb3JtYXRpb24gb3IgaGF2ZSBtaXNzaW5nIGtleWNoYWluIGZpZWxkcy5cbiAgICogSWYgYWxsIHNoYXJlIG9wdGlvbnMgYXJlIGludmFsaWQgb3IgZW1wdHksIGl0IHRocm93cyBhbiBlcnJvci5cbiAgICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSB3YWxsZXQgc2hhcmVzIGZvciB2YWxpZCBzaGFyZSBvcHRpb25zLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXX0gW3BhcmFtcz1bXV0gLSBUaGUgYXJyYXkgb2Ygc2hhcmUgb3B0aW9ucyB0byBwcm9jZXNzLlxuICAgKiAgIEtleWNoYWluIGVudHJpZXMgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBgcHViYCwgYGVuY3J5cHRlZFBydmAsIGBmcm9tUHViS2V5YCwgYHRvUHViS2V5YCwgYW5kIGBwYXRoYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPn0gQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0IG9mIHRoZSB3YWxsZXQgc2hhcmVzIGNyZWF0aW9uLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHNoYXJlIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQnVsa0tleVNoYXJlcyhwYXJhbXM6IEJ1bGtDcmVhdGVTaGFyZU9wdGlvbltdID0gW10pOiBQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5maWx0ZXIoKHNoYXJlT3B0aW9uKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMoc2hhcmVPcHRpb24ua2V5Y2hhaW4sIFsncHViJywgJ2VuY3J5cHRlZFBydicsICdmcm9tUHViS2V5JywgJ3RvUHViS2V5JywgJ3BhdGgnXSwgW10pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhjbHVkZSBzaGFyZSBvcHRpb25zIHdpdGggaW52YWxpZCBrZXljaGFpblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXBhcmFtcyB8fCBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZU9wdGlvbnMgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L3dhbGxldHNoYXJlc2AsIDIpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHsgc2hhcmVPcHRpb25zOiBwYXJhbXMgfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXljaGFpbiB3aXRoIGVuY3J5cHRlZCBwcml2YXRlIGtleSB0byBiZSBzaGFyZWQgZm9yIHdhbGxldCBzaGFyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbmNyeXB0ZWRXYWxsZXRLZXljaGFpbkZvcldhbGxldFNoYXJpbmcoKTogUHJvbWlzZTxLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2xuYnRjJykge1xuICAgICAgLy8gbGlnaHRuaW5nIGNvaW4gZG9lcyBub3QgdXNlIHVzZXIga2V5IHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9ucyBmcm9tIFNESy5cbiAgICAgIC8vIGl0IHVzZXMgdXNlciBhdXRoIGtleSBpbnN0ZWFkLlxuICAgICAgcmV0dXJuIGF3YWl0IGdldExpZ2h0bmluZ0F1dGhLZXkodGhpcywgJ3VzZXJBdXRoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuZCBkZWNyeXB0cyB0aGUgd2FsbGV0IGtleWNoYWluIGZvciBzaGFyaW5nLlxuICAgKiBUaGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBrZXljaGFpbiBvbmNlIGFuZCBkZWNyeXB0cyBpdCwgcmV0dXJuaW5nIHRoZSBkZWNyeXB0ZWRcbiAgICogcHJpdmF0ZSBrZXkgYW5kIHB1YmxpYyBrZXkgaW5mbyBuZWVkZWQgZm9yIHNoYXJpbmcgd2l0aCBtdWx0aXBsZSB1c2Vycy5cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSBrZXljaGFpblxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkZWNyeXB0ZWQgcHJ2IGFuZCBwdWIsIG9yIHVuZGVmaW5lZCBmb3IgY29sZCB3YWxsZXRzXG4gICAqL1xuICBhc3luYyBnZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcoXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8RGVjcnlwdGVkS2V5Y2hhaW5EYXRhIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFdhbGxldEtleWNoYWluRm9yV2FsbGV0U2hhcmluZygpO1xuXG4gICAgaWYgKCFrZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywga2V5Y2hhaW4sIHdhbGxldFBhc3NwaHJhc2UpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcignUGFzc3dvcmQgc2hhcmVkIGlzIGluY29ycmVjdCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IG9uZSBvZiBwdWIvY29tbW9uUHViL2NvbW1vbktleWNoYWluIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBrZXljaGFpblxuICAgIGxldCBwdWIgPSBrZXljaGFpbi5wdWIgPz8ga2V5Y2hhaW4uY29tbW9uUHViO1xuICAgIGlmIChrZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgcHViID1cbiAgICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VkZHNhJ1xuICAgICAgICAgID8gRWRkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pXG4gICAgICAgICAgOiBFY2RzYVV0aWxzLmdldFB1YmxpY0tleUZyb21Db21tb25LZXljaGFpbihrZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgfVxuXG4gICAgaWYgKCFwdWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBwdWJsaWMga2V5IGZyb20ga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcnYsIHB1YiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY3J5cHRzIGEgZGVjcnlwdGVkIHByaXZhdGUga2V5IGZvciBzaGFyaW5nIHdpdGggYSBzcGVjaWZpYyB1c2VyLlxuICAgKiBUaGlzIGlzIHRoZSBwdXJlIGVuY3J5cHRpb24gc3RlcCAtIG5vIEFQSSBjYWxscywgbm8gZGVjcnlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZFBydiAtIFRoZSBhbHJlYWR5LWRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0gcHViIC0gVGhlIHdhbGxldCdzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHVzZXJQdWJrZXkgLSBUaGUgcmVjaXBpZW50IHVzZXIncyBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGtleSBwYXRoXG4gICAqIEByZXR1cm5zIFRoZSBlbmNyeXB0ZWQga2V5Y2hhaW4gZm9yIHRoZSByZWNpcGllbnQgd2l0aCBhbGwgcmVxdWlyZWQgZmllbGRzXG4gICAqL1xuICBlbmNyeXB0UHJ2Rm9yVXNlcihkZWNyeXB0ZWRQcnY6IHN0cmluZywgcHViOiBzdHJpbmcsIHVzZXJQdWJrZXk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4ge1xuICAgIGNvbnN0IGVja2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20odXNlclB1YmtleSwgJ2hleCcpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHsgcGFzc3dvcmQ6IHNlY3JldCwgaW5wdXQ6IGRlY3J5cHRlZFBydiB9KTtcblxuICAgIGNvbnN0IGtleWNoYWluOiBCdWxrV2FsbGV0U2hhcmVLZXljaGFpbiA9IHtcbiAgICAgIHB1YixcbiAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHRvUHViS2V5OiB1c2VyUHVia2V5LFxuICAgICAgcGF0aDogcGF0aCxcbiAgICB9O1xuXG4gICAgYXNzZXJ0KGtleWNoYWluLnB1YiwgJ3B1YiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCAnZW5jcnlwdGVkUHJ2IG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuICAgIGFzc2VydChrZXljaGFpbi5mcm9tUHViS2V5LCAnZnJvbVB1YktleSBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4udG9QdWJLZXksICd0b1B1YktleSBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4ucGF0aCwgJ3BhdGggbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG5cbiAgICByZXR1cm4ga2V5Y2hhaW47XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBrZXljaGFpbiBmb3Igc2hhcmluZyB3aXRoIGFub3RoZXIgdXNlci5cbiAgICogRmV0Y2hlcyB0aGUgd2FsbGV0IGtleWNoYWluLCBkZWNyeXB0cyBpdCwgYW5kIGVuY3J5cHRzIGl0IGZvciB0aGUgcmVjaXBpZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIGtleWNoYWluXG4gICAqIEBwYXJhbSBwdWJrZXkgLSBUaGUgcmVjaXBpZW50J3MgcHVibGljIGtleVxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBrZXkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgZW5jcnlwdGVkIGtleWNoYWluIGZvciB0aGUgcmVjaXBpZW50XG4gICAqL1xuICBhc3luYyBwcmVwYXJlU2hhcmVkS2V5Y2hhaW4oXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmtleTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPFNoYXJlZEtleUNoYWluPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcod2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIWRlY3J5cHRlZEtleWNoYWluKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRQcnZGb3JVc2VyKGRlY3J5cHRlZEtleWNoYWluLnBydiwgZGVjcnlwdGVkS2V5Y2hhaW4ucHViLCBwdWJrZXksIHBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpIHtcbiAgICAgICAgLy8gaWdub3JlIHRoaXMgZXJyb3IgYmVjYXVzZSB0aGlzIGxvb2tzIGxpa2UgYSBjb2xkIHdhbGxldFxuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSB0aGlzIHdhbGxldCB3aXRoIGFub3RoZXIgQml0R28gdXNlci5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNoYXJlV2FsbGV0KHBhcmFtczogU2hhcmVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ21lc3NhZ2UnXSk7XG4gICAgaWYgKHBhcmFtcy5yZXNoYXJlICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5yZXNoYXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNoYXJlIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNraXBLZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2tpcEtleWNoYWluKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBza2lwS2V5Y2hhaW4gdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbXVsdGkta2V5LXVzZXIta2V5IE9GQyB3YWxsZXRcbiAgICAvLyBGb3IgbXVsdGkta2V5LXVzZXIta2V5IHdhbGxldHMsIHNraXAga2V5Y2hhaW4gcHJlcGFyYXRpb24gcmVnYXJkbGVzcyBvZiBvdGhlciBjb25kaXRpb25zXG4gICAgY29uc3QgbmVlZHNLZXljaGFpbiA9XG4gICAgICAhdGhpcy5pc011bHRpVXNlcktleVdhbGxldCgpICYmXG4gICAgICAhcGFyYW1zLnNraXBLZXljaGFpbiAmJlxuICAgICAgcGFyYW1zLnBlcm1pc3Npb25zICYmXG4gICAgICBwYXJhbXMucGVybWlzc2lvbnMuaW5kZXhPZignc3BlbmQnKSAhPT0gLTE7XG5cbiAgICBpZiAocGFyYW1zLmRpc2FibGVFbWFpbCAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlRW1haWwgdG8gYmUgYSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBlbWFpbCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmcgPSAoYXdhaXQgdGhpcy5iaXRnby5nZXRTaGFyaW5nS2V5KHtcbiAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwudG9Mb3dlckNhc2UoKSxcbiAgICB9KSkgYXMgYW55O1xuICAgIGxldCBzaGFyZWRLZXljaGFpbjtcbiAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgc2hhcmVkS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLnByZXBhcmVTaGFyZWRLZXljaGFpbihwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgc2hhcmluZy5wdWJrZXksIHNoYXJpbmcucGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIHNraXBLZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCxcbiAgICAgIGtleWNoYWluOiBPYmplY3Qua2V5cyhzaGFyZWRLZXljaGFpbiA/PyB7fSkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc2hhcmVkS2V5Y2hhaW4sXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIGZyb20gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB1c2VySWQgSWQgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVVc2VyKHBhcmFtczogUmVtb3ZlVXNlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VySWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXNlcklkID0gcGFyYW1zLnVzZXJJZDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy91c2VyLycgKyB1c2VySWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkICh1bnNpZ25lZCB0cmFuc2FjdGlvbikgZnJvbSBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgdW5zcGVudHMgZ29pbmcgaW50byB0aGlzIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2UgbWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyBvbiBjaGFuZ2UgKGludGVybmFsKSBpbnB1dHMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0LiBJZiB0aGUgd2FsbGV04oCZcyBjdXJyZW50IHVuc3BlbnQgY291bnQgaXMgbG93ZXIgdGhhbiB0aGUgdGFyZ2V0LCB1cCB0byBmb3VyIGFkZGl0aW9uYWwgY2hhbmdlIG91dHB1dHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNMaW1pdCAtIEN1c3RvbSBnYXMgbGltaXQgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9uUGFydGljaXBhdGlvbiAtIChBbGdvcmFuZCkgTm9uIHBhcnRpY2lwYXRpbmcga2V5IHJlZyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkRnJvbUJsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWluaW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRUb0Jsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWF4aW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBCdWlsZCB0aGlzIHRyYW5zYWN0aW9uIHRvIGNvbmZvcm0gd2l0aCBpbnN0YW50IHNlbmRpbmcgY29pbi1zcGVjaWZpYyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMua2VlcEFsaXZlIC0gKFBvbGthZG90KSBrZWVwIGFkZHJlc3MgYWxpdmUgYnkgc2VuZGluZyB0aGUgYWRkcmVzcyBtaW5pbXVtIGZ1bmRpbmcgYW1vdW50LCB1c2VkIGR1cmluZyB3YWxsZXQgY29uc29saWRhdGlvbiwgdHJ1ZSBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW0udHJhbnNmZXJJZCAtIHRyYW5zZmVyIElkIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IGNhc3BlcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzVHlwZSAtIFRoZSB0eXBlIG9mIGFkZHJlc3MgdG8gY3JlYXRlIGZvciBjaGFuZ2UuIE9uZSBvZiBgcDJzaGAsIGBwMnNoUDJ3c2hgLCBhbmQgYHAyd3NoYC4gQ2FzZS1zZW5zaXRpdmUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmhvcCAtIEJ1aWxkIHRoaXMgYXMgYW4gRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMucmVzZXJ2YXRpb24gLSBPYmplY3QgdG8gcmVzZXJ2ZSB0aGUgdW5zcGVudHMgdGhhdCB0aGlzIHR4IGJ1aWxkIHVzZXMuIEZvcm1hdCBpcyByZXNlcnZhdGlvbiA9IHsgZXhwaXJlVGltZTogSVNPRGF0ZVN0cmluZywgcGVuZGluZ0FwcHJvdmFsSWQ6IFN0cmluZyB9XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSB0byB0aGUgd2FsbGV0IHVzZXIga2V5LCB0byBzaWduIGNvbW1pdG1lbnQgZGF0YSBmb3IgRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIHVzZWQgYXMgdGhlIFwidG9cIiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgT2JqZWN0LmFzc2lnbih3aGl0ZWxpc3RlZFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogcGFyYW1zLm9mZmxpbmVWZXJpZmljYXRpb24gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBidWlsZFF1ZXJ5ID0gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvYnVpbGQnKSlcbiAgICAgIC5xdWVyeShxdWVyeVBhcmFtcylcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgYmxvY2tIZWlnaHRRdWVyeSA9IF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KVxuICAgICAgPyAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KHBhcmFtcy5yZXFJZClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcXVlcmllcyA9IFtidWlsZFF1ZXJ5LCBibG9ja0hlaWdodFF1ZXJ5XTtcbiAgICBjb25zdCBbYnVpbGRSZXNwb25zZSwgYmxvY2tIZWlnaHRdID0gKGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpKSBhcyBhbnk7XG4gICAgZGVidWcoJ3Bvc3Rwcm9jZXNzaW5nIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIGJ1aWxkUmVzcG9uc2UpO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChibG9ja0hlaWdodCkpIHtcbiAgICAgIGJ1aWxkUmVzcG9uc2UuYmxvY2tIZWlnaHQgPSBibG9ja0hlaWdodDtcbiAgICB9XG4gICAgbGV0IHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgIE9iamVjdC5hc3NpZ24oYnVpbGRSZXNwb25zZSwge1xuICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgIH0pXG4gICAgKSkgYXMgYW55O1xuICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgaWYgKHRoaXMuX3dhbGxldCAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljICYmICFwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzKSB7XG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwge1xuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBkZWJ1ZygnZmluYWwgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuICAgIHJldHVybiBwcmVidWlsZCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFVzZXIgS2V5Y2hhaW4gYW5kIHNpZ24gYSBUU1MgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4UmVxdWVzdElkIFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlkXG4gICAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIFRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBhc3luYyBnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uKHtcbiAgICB0eFJlcXVlc3RJZCxcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICB9OiB7XG4gICAgdHhSZXF1ZXN0SWQ6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1swXTtcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgdXNlciBrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IHR4UmVxdWVzdElkIH0sXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVxSWQsXG4gICAgICBrZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIFtrZXljaGFpbiAvIGtleV0gKG9iamVjdCkgb3IgcHJ2IChzdHJpbmcpXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiAtIHZlcmlmeVR4UGFyYW1zIChvcHRpb25hbCkgLSB3aGVuIHByb3ZpZGVkLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSB2ZXJpZmllZCBiZWZvcmUgc2lnbmluZ1xuICAgKiAgIC0gdHhQYXJhbXM6IHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMgdXNlZCBmb3IgdmVyaWZpY2F0aW9uXG4gICAqICAgLSB2ZXJpZmljYXRpb246IG9wdGlvbmFsIHZlcmlmaWNhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgVHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkLCBhcGlWZXJzaW9uLCB0eFJlcXVlc3RJZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFZERTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIHdvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKHRoaXMuYmFzZUNvaW4sIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIE1QQ3Yyd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0FNUEN2Mih0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCB8fCB0eXBlb2YgdHhQcmVidWlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIGlzIHJlcXVpcmVkIGZvciBvbi1jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBvciB0eFJlcXVlc3RJZCBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGV4dGVybmFsIHNpZ25lciBUU1MgZmxvd1xuICAgICAgcGFyYW1zLnR4UHJlYnVpbGQgPSB7IHR4UmVxdWVzdElkIH07XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGlmIHZlcmlmeVR4UGFyYW1zIGlzIHByb3ZpZGVkXG4gICAgaWYgKHBhcmFtcy52ZXJpZnlUeFBhcmFtcyAmJiB0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgY29uc3QgdmVyaWZ5UGFyYW1zID0ge1xuICAgICAgICB0eFByZWJ1aWxkOiB7IC4uLnR4UHJlYnVpbGQgfSxcbiAgICAgICAgdHhQYXJhbXM6IHBhcmFtcy52ZXJpZnlUeFBhcmFtcy50eFBhcmFtcyxcbiAgICAgICAgd2FsbGV0OiB0aGlzIGFzIElXYWxsZXQsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogcGFyYW1zLnZlcmlmeVR4UGFyYW1zLnZlcmlmaWNhdGlvbixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5tdWx0aXNpZ1R5cGUoKSBhcyAnb25jaGFpbicgfCAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5UGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJlxuICAgICAgIShwYXJhbXMua2V5Y2hhaW4gfHwgcGFyYW1zLmtleSkgJiZcbiAgICAgICh0aGlzLnR5cGUoKSA9PT0gJ2hvdCcgfHwgdGhpcy50eXBlKCkgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIC8vIHRoaXMgbG9naWMgc2hvdWxkIG9ubHkgYXBwbHkgdG8gaG90IHdhbGxldHNcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1swXTtcbiAgICAgIGlmICghdXNlcktleWNoYWluIHx8ICF1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5rZXljaGFpbiA9IHVzZXJLZXljaGFpbjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzaWduID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5wcmVzaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzcyh7XG4gICAgICAgIC4uLnByZXNpZ24sXG4gICAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHsgcHVicyB9ID0gcGFyYW1zO1xuICAgIGlmICghcHVicyAmJiB0aGlzLmJhc2VDb2luLmtleUlkc0ZvclNpZ25pbmcoKS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgcHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucHJlc2lnbixcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4udHhQcmVidWlsZCwgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3NlcnQocHVicywgJ3B1YnMgYXJlIHJlcXVpcmVkIGZvciBjdXN0b20gc2lnbmluZycpO1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLCB7XG4gICAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgIHB1YnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCA9IHtcbiAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uU2VlZDoga2V5c1swXT8uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbihzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHlwZWQgc3RydWN0dXJlZCBkYXRhIHVzaW5nIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduVHlwZWREYXRhKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNTaWduaW5nVHlwZWREYXRhKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbiB0eXBlZCBkYXRhIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy50eXBlZERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZWQgZGF0YSByZXF1aXJlZGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlZERhdGEudHlwZWREYXRhUmF3IG11c3QgYmUgSlNPTiBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YSkpIHtcbiAgICAgIHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKHBhcmFtcy50eXBlZERhdGEpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICBwdWI6IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zaWduVHlwZWREYXRhVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqICBTaWduIGEgbWVzc2FnZSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIE1lc3NhZ2VcbiAgICogLSBjdXN0b2RpYW5NZXNzYWdlSWRcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMubWVzc2FnZSB8fCAhcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVN0YW5kYXJkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGFuZCB0eXBlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZSkpIHtcbiAgICAgIHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVNZXNzYWdlKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnbk1lc3NhZ2VUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW5kIGNyZWF0ZXMgYSBzaWduIG1lc3NhZ2UgcmVxdWVzdCBmb3IgVFNTIHdhbGxldHMsIHRoYXQgY2FuIGJlIHVzZWQgbGF0ZXIgZm9yIHNpZ25pbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciBjcmVhdGluZyB0aGUgc2lnbiBtZXNzYWdlIHJlcXVlc3RcbiAgICogQHJldHVybnMgUHJvbWlzZTxUeFJlcXVlc3Q+IC0gVGhlIGNyZWF0ZWQgdHJhbnNhY3Rpb24gcmVxdWVzdCBmb3Igc2lnbmluZyBhIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c01lc3NhZ2VTaWduaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcgfHwgIXBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlU3RhbmRhcmRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgYW5kIHR5cGUgcmVxdWlyZWQgdG8gY3JlYXRlIG1lc3NhZ2Ugc2lnbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuICAgIGNvbnN0IG1lc3NhZ2VTdGFuZGFyZFR5cGUgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlU3RhbmRhcmRUeXBlO1xuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICAgIHJlcUlkLFxuICAgICAgICBpbnRlbnRUeXBlOiAnc2lnbk1lc3NhZ2UnLFxuICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZVN0YW5kYXJkVHlwZSxcbiAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGhpcy50c3NVdGlscykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RTUyB1dGlsaXRpZXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRzc1V0aWxzLmJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KGludGVudE9wdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIHNpZ24gcmVxdWVzdDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByaXZhdGUga2V5IGZyb20gZWl0aGVyIGEgZGVyaXZhdGlvbiBvciBhbiBlbmNyeXB0ZWQga2V5Y2hhaW5cbiAgICogQHBhcmFtIFtwYXJhbXMua2V5Y2hhaW4gLyBwYXJhbXMua2V5XSAob2JqZWN0KSBvciBwYXJhbXMucHJ2IChzdHJpbmcpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAoc3RyaW5nKVxuICAgKi9cbiAgZ2V0VXNlclBydihwYXJhbXM6IEdldFVzZXJQcnZPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHBhcmFtcy5rZXljaGFpbiB8fCBwYXJhbXMua2V5O1xuICAgIGxldCB1c2VyUHJ2ID0gcGFyYW1zLnBydjtcbiAgICBpZiAodXNlclBydiAmJiB0eXBlb2YgdXNlclBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyB1c2UgdGhlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCBwcm9wZXJ0eSBmcm9tIHRoZSB1c2VyIGtleWNoYWluIGFzIHRoZSBgY29sZERlcml2YXRpb25TZWVkYFxuICAgIC8vIGlmIG5vIG90aGVyIGBjb2xkRGVyaXZhdGlvblNlZWRgIHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgLy8gT25seSBmb3Igb25jaGFpbiBtdWx0aXNpZyB3YWxsZXRzLCBUU1Mga2V5IGRlcml2YXRpb24gaGFwcGVucyBkdXJpbmcgdGhlIHNpZ25pbmcgcHJvY2Vzc1xuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoe1xuICAgICAgICBrZXk6IHVzZXJQcnYsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICB9KTtcbiAgICAgIHVzZXJQcnYgPSBkZXJpdmF0aW9uLmtleTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmICghdXNlckVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBwcm9wZXJ0eSBtaXNzaW5nJyk7XG4gICAgICB9XG4gICAgICB1c2VyUHJ2ID0gZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIGlmICghdXNlclBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBCaXRHbywgdmFsaWRhdGUgaXQsIGFuZCB0aGVuIGRlY3J5cHQgdGhlIHVzZXIga2V5IGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSAmJiBwYXJhbXMuZ2FzUHJpY2UpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHBhcmFtcy5laXAxNTU5IGFuZCBwYXJhbXMuZ2FzUHJpY2UgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX2dhc1ByaWNlX2FuZF9laXAxNTU5Z2FzTW9kZWxfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJlYnVpbGRUeCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcHJlYnVpbGRUeCBhbmQgcmVjaXBpZW50cyBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfcHJlYnVpbGR0eF9hbmRfcmVjaXBpZW50c19zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgYXJyYXknKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucykgJiYgIXRoaXMuX3Blcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdubyBzcGVuZCBwZXJtaXNzaW9uIG9uIHRoaXMgd2FsbGV0Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3VzZXJfbm90X2FsbG93ZWRfdG9fc3BlbmRfZnJvbV93YWxsZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNlaXZlQWRkcmVzcyAmJiAocGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlcicgfHwgcGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlclRva2VuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCB1c2UgcmVjZWl2ZSBhZGRyZXNzIGZvciBUU1MgdHJhbnNhY3Rpb25zIG9mIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjZWl2ZV9hZGRyZXNzX25vdF9hbGxvd2VkX2Zvcl90c3Nfd2l0aGRyYXdhbHMnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmIChwYXJhbXMudHlwZSA9PT0gJ2ZpbGxOb25jZScgfHwgcGFyYW1zLnR5cGUgPT09ICdhY2NlbGVyYXRpb24nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHByb3ZpZGUgcmVjaXBpZW50cyBmb3IgdHJhbnNhY3Rpb24gdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hbGxvd2VkX2Zvcl9maWxsbm9uY2VfYW5kX2FjY2VsZXJhdGlvbl90eF90eXBlJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24pIHtcbiAgICAgIHZhbGlkYXRlVHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB9KTtcblxuICAgIGxldCB0eFByZWJ1aWxkUXVlcnk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHN0cmluZz47XG4gICAgaWYgKGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChwYXJhbXMucHJlYnVpbGRUeCkgJiYgcGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXM/LnByZXZpZXcpIHtcbiAgICAgIC8vIElmIHdlIHByZWJ1aWx0IHRoZSB0eFJlcXVlc3Qgd2l0aCBwcmV2aWV3PXRydWUsIHRoZW4gd2Ugc2hvdWxkIHJlYnVpbGQgd2l0aCBwcmV2aWV3PWZhbHNlIHRvIHBlcnNpc3QgdGhlIHJlcXVlc3RcbiAgICAgIHR4UHJlYnVpbGRRdWVyeSA9IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgLi4ueyAuLi5wYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcywgcHJldmlldzogZmFsc2UgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSBwYXJhbXMucHJlYnVpbGRUeCA/IFByb21pc2UucmVzb2x2ZShwYXJhbXMucHJlYnVpbGRUeCkgOiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsIC4uLnBhcmFtcyB9LFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fSxcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkIGZhaWxlZCBsb2NhbCB2YWxpZGF0aW9uOicsIGUubWVzc2FnZSk7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAndHJhbnNhY3Rpb24gcGFyYW1zOicsXG4gICAgICAgIF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknLCAnd2FsbGV0J10pXG4gICAgICApO1xuICAgICAgLy8gU2FuaXRpemUgdG8gcmVtb3ZlIF90b2tlbiBmcm9tIGJpdGdvXG4gICAgICBjb25zdCBzYW5pdGl6ZWRQcmVidWlsZCA9IHtcbiAgICAgICAgLi4uXy5vbWl0KHR4UHJlYnVpbGQsIFsnd2FsbGV0J10pLFxuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgIGJpdGdvOiBfLm9taXQodGhpcy5iaXRnbywgWydfdG9rZW4nXSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQ6Jywgc2FuaXRpemVkUHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAnb25jaGFpbicpIHtcbiAgICAgIHNpZ25pbmdQYXJhbXMucHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25pbmdQYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBpZiAodGhpcy50c3NVdGlscy5pc1BlbmRpbmdBcHByb3ZhbFR4UmVxdWVzdEZ1bGwodHhSZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gdHhSZXF1ZXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5fLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKSxcbiAgICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBiaXRnbzogXy5vbWl0KHRoaXMuYml0Z28sIFsnX3Rva2VuJ10pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkgb3IgUmVwbGFjZS1CeS1GZWUgKFJCRilcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBwYXJhbXMucmVjaXBpZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oe1xuICAgICAgLi4uKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSksXG4gICAgICAuLi5CdWlsZFBhcmFtcy5lbmNvZGUocGFyYW1zKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NlbGVyYXRpb25QYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKCFwYXJhbXMuY3BmcFR4SWRzICYmICFwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ211c3QgcGFzcyBjcGZwVHhJZHMgb3IgcmJmVHhJZHMnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX29yX3JiZnR4aWRzX3JlcXVpcmVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzICYmIHBhcmFtcy5yYmZUeElkcykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBjcGZwVHhJZHMgYW5kIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2Nhbm5vdF9zcGVjaWZ5X2JvdGhfY3BmcF9hbmRfcmJmX3R4aWRzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVSYmZQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSB8fCBwYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZhbHVlIGZvciAncmVjaXBpZW50cyc6IG11c3QgYmUgZW1wdHkgYXJyYXkgd2hlbiBzZXRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmJmVHhJZHMpIHx8IHBhcmFtcy5yYmZUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByYmZUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyYmZ0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuZmVlTXVsdGlwbGllcikge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZmVlTXVsdGlwbGllciBtdXN0IGJlIHNldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX25vdF9zZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWVNdWx0aXBsaWVyIDw9IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBhIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2ZlZW11bHRpcGxpZXJfZ3JlYXRlcl90aGFuX29uZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3BmcFR4SWRzKSB8fCBwYXJhbXMuY3BmcFR4SWRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGNwZnBUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjcGZwdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwRmVlUmF0ZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9DcGZwRmVlUmF0ZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9DcGZwRmVlUmF0ZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmNwZnBGZWVSYXRlKSB8fCBwYXJhbXMuY3BmcEZlZVJhdGUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9NYXhGZWUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgc2V0IHVubGVzcyBub01heEZlZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhGZWUpIHx8IHBhcmFtcy5tYXhGZWUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICogQHBhcmFtIHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcik6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24ocGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuXG4gICAgY29uc3QgaXNBbW91bnROZWdhdGl2ZSA9IGFtb3VudC5pc05lZ2F0aXZlKCk7XG4gICAgY29uc3QgaXNBbW91bnRaZXJvID0gYW1vdW50LmlzWmVybygpO1xuICAgIGNvbnN0IGlzQW1vdW50RGVjaW1hbCA9ICFhbW91bnQuaXNJbnRlZ2VyKCk7XG5cbiAgICBfLnNvbWUoW2lzQW1vdW50TmVnYXRpdmUsICFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGlzQW1vdW50WmVybywgaXNBbW91bnREZWNpbWFsXSwgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIEludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7XG4gICAgICByZWNpcGllbnRzLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHNlbmRNYW55T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBFUkMtNzIxIE5GVCBvciBFUkMtMTE1NSBORlQocykuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUgY2FsbCBkYXRhIGZvciBhbiBFUkMtNzIxLzExNTUgdG9rZW4gdHJhbnNmZXIsXG4gICAqIGFuZCBjYWxscyB0aGUgdG9rZW4gY29udHJhY3Qgd2l0aCB0aGUgZGF0YSwgYW5kIGFtb3VudCAwLiBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgYWx3YXlzIHByb2R1Y2VcbiAgICogYSBwZW5kaW5nIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcGFyYW0gc2VuZE9wdGlvbnMgT3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHNlbnQuXG4gICAqIEBwYXJhbSBzZW5kTmZ0T3B0aW9ucyBPcHRpb25zIHRvIHNwZWNpZnkgdGhlIE5GVChzKSB0byBiZSBzZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgcGVuZGluZyBhcHByb3ZhbCBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2VuZE5mdChzZW5kT3B0aW9uczogU2VuZE5GVE9wdGlvbnMsIHNlbmROZnRPcHRpb25zOiBORlRUcmFuc2Zlck9wdGlvbnMpOiBQcm9taXNlPFNlbmRORlRSZXN1bHQ+IHtcbiAgICBjb25zdCBuZnRDb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0TmZ0QmFsYW5jZXMoKTtcbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnRBZGRyZXNzLCB0eXBlIH0gPSBzZW5kTmZ0T3B0aW9ucztcblxuICAgIGNvbnN0IG5mdEJhbGFuY2UgPSBuZnRDb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLm1ldGFkYXRhLnRva2VuQ29udHJhY3RBZGRyZXNzID09PSB0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgaWYgKCFuZnRCYWxhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbGxlY3Rpb24gbm90IGZvdW5kIGZvciB0b2tlbiBjb250cmFjdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnRBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzICR7cmVjaXBpZW50QWRkcmVzc31gKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLmNvaW5TcGVjaWZpYygpPy5iYXNlQWRkcmVzcyB8fCB0aGlzLmNvaW5TcGVjaWZpYygpPy5yb290QWRkcmVzcztcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYmFzZSBhZGRyZXNzIGZvciB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAobmZ0QmFsYW5jZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBORlQgdHlwZSAke3R5cGV9IGRvZXMgbm90IG1hdGNoIGNvbGxlY3Rpb24gdHlwZSAke25mdEJhbGFuY2UudHlwZX1gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNlbmROZnRPcHRpb25zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0VSQzcyMSc6IHtcbiAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW3NlbmROZnRPcHRpb25zLnRva2VuSWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuICR7c2VuZE5mdE9wdGlvbnMudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHt0b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXNlQ29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgLi4uc2VuZE5mdE9wdGlvbnMsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlY2lwaWVudDtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICd2ZXQnKSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgICAgdG9rZW5EYXRhOiBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW3JlY2lwaWVudF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJDMTE1NSc6IHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IHNlbmROZnRPcHRpb25zLmVudHJpZXM7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tlbnRyeS50b2tlbklkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVG9rZW4gJHtlbnRyeS50b2tlbklkfSBub3QgZm91bmQgaW4gY29sbGVjdGlvbiAke3NlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzfSBvciBkb2VzIG5vdCBoYXZlIGEgc3BlbmRhYmxlIGJhbGFuY2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tlbnRyeS50b2tlbklkXSA8IGVudHJ5LmFtb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQW1vdW50ICR7ZW50cnkuYW1vdW50fSBleGNlZWRzIHNwZW5kYWJsZSBiYWxhbmNlIG9mICR7bmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tlbnRyeS50b2tlbklkXX0gZm9yIHRva2VuICR7XG4gICAgICAgICAgICAgICAgZW50cnkudG9rZW5JZFxuICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXNlQ29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgLi4uc2VuZE5mdE9wdGlvbnMsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUb2tlblR5cGUuRElHSVRBTF9BU1NFVDoge1xuICAgICAgICBpZiAoIW5mdEJhbGFuY2UuY29sbGVjdGlvbnNbc2VuZE5mdE9wdGlvbnMudG9rZW5JZF0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVG9rZW4gJHtzZW5kTmZ0T3B0aW9ucy50b2tlbklkfSBub3QgZm91bmQgaW4gY29sbGVjdGlvbiAke3Rva2VuQ29udHJhY3RBZGRyZXNzfSBvciBkb2VzIG5vdCBoYXZlIGEgc3BlbmRhYmxlIGJhbGFuY2VgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbkRhdGE6IFRva2VuVHJhbnNmZXJSZWNpcGllbnRQYXJhbXMgPSB7XG4gICAgICAgICAgdG9rZW5UeXBlOiBzZW5kTmZ0T3B0aW9ucy50eXBlLFxuICAgICAgICAgIHRva2VuUXVhbnRpdHk6ICcxJywgLy8gVGhpcyBORlQgc3RhbmRhcmQgd2lsbCBhbHdheXMgaGF2ZSBxdWFudGl0eSBvZiAxXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5JZDogc2VuZE5mdE9wdGlvbnMudG9rZW5JZCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiAnMScsIC8vIHRoZSBhbW91bnQgbmVlZHMgdG8gYmUgbm9uLXplcm8gZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSB2YWxpZCwgaXQgaXMgaWdub3JlZFxuICAgICAgICAgICAgICB0b2tlbkRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIG1vbmV5IHRvIG11bHRpcGxlIHJlY2lwaWVudHNcbiAgICogMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHBydlxuICAgKiAyLiBEZWNyeXB0cyB1c2VyIGtleVxuICAgKiAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4gICAqIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4gICAqIDUuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvdGhpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jb21tZW50IC0gQW55IGFkZGl0aW9uYWwgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIFNlbmQgdGhpcyB0cmFuc2FjdGlvbiB1c2luZyBjb2luLXNwZWNpZmljIGluc3RhbnQgc2VuZGluZyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHlwZSAtIFR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uIChlLmcuIHRydXN0bGluZSlcbiAgICogQHBhcmFtIHt7dG9rZW46IHBhcmFtcywgYWN0aW9uOiBTdHJpbmcsIGxpbWl0OiBTdHJpbmd9W119IG9wdGlvbnMudHJ1c3RsaW5lcyAtIEFycmF5IG9mIHRydXN0bGluZXMgdG8gbWFuYWdlIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kTWFueShwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydjb21tZW50JywgJ290cCddKTtcbiAgICBkZWJ1Zygnc2VuZE1hbnkgY2FsbGVkJyk7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBwYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuICAgIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMuZm9yRWFjaChmdW5jdGlvbiAocmVjaXBpZW50KSB7XG4gICAgICAgIGNvaW4uY2hlY2tSZWNpcGllbnQocmVjaXBpZW50KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWy4uLnRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpLCAnY29tbWVudCcsICdvdHAnLCAnaG9wJ10pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHNlbGVjdFBhcmFtcywgcmVxSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgYW4gdW5zdXBwb3J0ZWQgdG9rZW4gZnJvbSBhIEJpdEdvIG11bHRpc2lnIHdhbGxldFxuICAgKiBwYXJhbXMgYXJlIHZhbGlkYXRlZCBpbiBFdGgucHJvdG90eXBlLnJlY292ZXJUb2tlblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgdGhlIGNvbnRyYWN0IGFkZHJlc3Mgb2YgdGhlIHVuc3VwcG9ydGVkIHRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjaXBpZW50IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHJlY292ZXJlZCB0b2tlbnMgc2hvdWxkIGJlIHNlbnQgdG9cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiB0aGUgeHBydlxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlclRva2VuKHBhcmFtczogUmVjb3ZlclRva2VuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG9rZW4gcmVjb3Zlcnkgb25seSBzdXBwb3J0ZWQgZm9yIGV0aCB3YWxsZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcmVjaXBpZW50IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0b2tlbkNvbnRyYWN0QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHRva2VuQ29udHJhY3RBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocmVjaXBpZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgcmVjaXBpZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlclRva2VuT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcmVjaXBpZW50IH0sIHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ucmVjb3ZlclRva2VuKHJlY292ZXJUb2tlbk9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2FjdGlvbiBtZXRhZGF0YSBmb3IgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiB0aGF0IGlzIHN0aWxsIHBlbmRpbmcgb3IgYXR0ZW1wdGVkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IHdpdGggdHhpZCwgd2FsbGV0SWQsIHR4LCBhbmQgZmVlIChpZiBzdXBwb3J0ZWQgZm9yIGNvaW4pXG4gICAqL1xuICBhc3luYyBnZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gaW50ZXJuYWwuZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24oeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0sIHRoaXMuYmFzZUNvaW4sIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZmVlIG9uIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHR4aWQgdG8gdGhlIGdpdmVuIG5ldyBmZWVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4aWQgVGhlIHRyYW5zYWN0aW9uIElkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHdob3NlIGZlZSBpcyB0byBiZSBjaGFuZ2VkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmZlZV0gT3B0aW9uYWwgLSBUaGUgbmV3IGZlZSB0byBhcHBseSB0byB0aGUgZGVub3RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5laXAxNTU5XSBPcHRpb25hbCAtIHRoZSBlaXAxNTU5IHZhbHVlcyB0byBhcHBseSB0byB0aGUgZGVub3RlZCB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdHJhbnNhY3Rpb24gSUQgb2YgdGhlIG5ldyB0cmFuc2FjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgZmVlIHJhdGVcbiAgICovXG4gIGFzeW5jIGNoYW5nZUZlZShwYXJhbXM6IENoYW5nZUZlZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHBhcmFtcy5mZWUpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHhpZCcsICdmZWUnXSwgW10pO1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcy5laXAxNTU5LCBbJ21heEZlZVBlckdhcycsICdtYXhQcmlvcml0eUZlZVBlckdhcyddKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvY2hhbmdlRmVlJykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggaW5mbyBmcm9tIG1lcmNoYW50IHNlcnZlclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudXJsIFRoZSBVcmwgdG8gcmV0cmlldmUgaW5mbyBmcm9tXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBpbmZvIHJldHVybmVkIGZyb20gdGhlIG1lcmNoYW50IHNlcnZlclxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0UGF5bWVudEluZm8ocGFyYW1zOiB7IHVybD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wYXltZW50SW5mbycpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQganNvbiBwYXltZW50IHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5wYXltZW50VXJsIC0gVGhlIHVybCB0byBzZW5kIHRoZSBmdWxseSBzaWduZWQgdHJhbnNhY3Rpb24gdG9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggb2YgdGhlIHBheW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZW1vIHtTdHJpbmd9IC0gQSBtZW1vIHN1cHBsaWVkIGJ5IHRoZSBtZXJjaGFudCwgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgdHJhbnNmZXIgYXMgdGhlIGNvbW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5leHBpcmVzIHtTdHJpbmd9IC0gSVNPIERhdGUgZm9ybWF0IG9mIHdoZW4gdGhlIHBheW1lbnQgcmVxdWVzdCBleHBpcmVzXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBpbmZvIHJldHVybmVkIGZyb20gdGhlIG1lcmNoYW50IHNlcnZlciBQYXltZW50IEFja1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgc2VuZFBheW1lbnRSZXNwb25zZShwYXJhbXM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2VuZFBheW1lbnQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUG9saWN5UnVsZShwYXJhbXM6IENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnLCAndHlwZSddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmNvbmRpdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGNvbmRpdGlvbnMgb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5hY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBhY3Rpb24gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNldFBvbGljeVJ1bGUocGFyYW1zOiBhbnkgPSB7fSkge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnLCAndHlwZSddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmNvbmRpdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGNvbmRpdGlvbnMgb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5hY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBhY3Rpb24gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBQb2xpY3kgUnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUG9saWN5UnVsZShwYXJhbXM6IFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNyb3NzQ2hhaW4gVVRYT3NcbiAgICogQ3VycmVudGx5IG9ubHkgZm9yIEFWQVhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2VDaGFpbiB0aGUgc291cmNlY2hhaW4gdG8gcGljayBVVFhPcywgaWYgbm90IGdpdmVuLCB0aGVuIHBpY2sgZnJvbSBhbGwgYXZhaWxhYmxlIGNoYWlucyBbUCwgQ11cbiAgICovXG4gIGZldGNoQ3Jvc3NDaGFpblVUWE9zKHBhcmFtczogRmV0Y2hDcm9zc0NoYWluVVRYT3NPcHRpb25zKTogUHJvbWlzZTxDcm9zc0NoYWluVVRYT1tdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBfLnBpY2socGFyYW1zLCBbJ3NvdXJjZUNoYWluJ10pO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL2Nyb3NzQ2hhaW5VbnNwZW50cycpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhIEpTT04gcmVwcmVzZW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0pTT04oKTogV2FsbGV0RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0cmFkaW5nIGFjY291bnQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9UcmFkaW5nQWNjb3VudCgpOiBUcmFkaW5nQWNjb3VudCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IGNvbnZlcnQgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IHRvIGEgdHJhZGluZyBhY2NvdW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhZGluZ0FjY291bnQodGhpcy5fd2FsbGV0LmVudGVycHJpc2UsIHRoaXMsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYWRkcmVzcyBib29rIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9BZGRyZXNzQm9vaygpOiBJQWRkcmVzc0Jvb2sge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSB1c2UgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IGZvciB0aGUgYWRkcmVzcyBib29rJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQWRkcmVzc0Jvb2sodGhpcy5fd2FsbGV0LmVudGVycHJpc2UsIHRoaXMuYml0Z28sIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YWtpbmcgd2FsbGV0IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvU3Rha2luZ1dhbGxldCgpOiBTdGFraW5nV2FsbGV0IHtcbiAgICBjb25zdCBpc0V0aFRzcyA9XG4gICAgICB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09ICdldGgnICYmIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LndhbGxldFZlcnNpb25cbiAgICAgICAgPyB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLndhbGxldFZlcnNpb24gPj0gM1xuICAgICAgICA6IGZhbHNlO1xuICAgIHJldHVybiBuZXcgU3Rha2luZ1dhbGxldCh0aGlzLCBpc0V0aFRzcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ28gc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9Hb1N0YWtpbmdXYWxsZXQoKTogR29TdGFraW5nV2FsbGV0IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSBzdGFraW5nIHdhbGxldCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEdvU3Rha2luZ1dhbGxldCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBkb3dubG9hZHMgUERGIGtleWNhcmQgZm9yIHdhbGxldCAocmVxdWlyZXMgcmVzcG9uc2UgZnJvbSB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KVxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGlzIGV4YW1wbGUgY29kZSBhbmQgaXMgbm90IHRoZSB2ZXJzaW9uIHVzZWQgb24gYml0Z28uY29tXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAqIGpzUERGIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIGpzUERGIGxpYnJhcnlcbiAgICogICAqIFFSQ29kZSAtIGFuIGluc3RhbmNlIG9mIHRoZSBRUmlvdXMgbGlicmFyeVxuICAgKiAgICogdXNlcktleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIHVzZXIga2V5Y2hhaW5cbiAgICogICAqIGJhY2t1cEtleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJhY2t1cCBrZXljaGFpblxuICAgKiAgICogYml0Z29LZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiaXRnbyBrZXljaGFpblxuICAgKiAgICogcGFzc3BocmFzZSAtIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiAgICogcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAtIHRoZSBlbmNyeXB0aW9uIHNlY3JldCB1c2VkIGZvciBCb3ggRFxuICAgKiAgICogYWN0aXZhdGlvbkNvZGUgLSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBzaXgtZGlnaXQgYWN0aXZhdGlvbiBjb2RlXG4gICAqICAgKiB3YWxsZXRLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIHNpZ25pbmcga2V5XG4gICAqICAgKiBiYWNrdXBLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIGJhY2t1cCBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBkb3dubG9hZEtleWNhcmQocGFyYW1zOiBEb3dubG9hZEtleWNhcmRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkb3dubG9hZEtleWNhcmQgZnVuY3Rpb24gaXMgb25seSBjYWxsYWJsZSB3aXRoaW4gYSBicm93c2VyLicpO1xuICAgIH1cblxuICAgIC8vIEdyYWIgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgZm9yIGFjdGl2YXRpb25Db2RlXG4gICAgY29uc3Qge1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgICBhY3RpdmF0aW9uQ29kZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCArIDEwMDAwMCkudG9TdHJpbmcoKSxcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFqc1BERiB8fCB0eXBlb2YganNQREYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHBhc3MgaW4gYSB2YWxpZCBqc1BERiBpbnN0YW5jZScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGtleWNoYWluc1xuICAgIGlmICghdXNlcktleWNoYWluIHx8IHR5cGVvZiB1c2VyS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdhbGxldCBrZXljaGFpbiBtdXN0IGhhdmUgYSAndXNlcicgcHJvcGVydHlgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhY2t1cEtleWNoYWluIHx8IHR5cGVvZiBiYWNrdXBLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmFja3VwIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCB0eXBlb2YgYml0Z29LZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0Z28ga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHdhbGxldEtleUlEICYmIHR5cGVvZiB3YWxsZXRLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0S2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChiYWNrdXBLZXlJRCAmJiB0eXBlb2YgYmFja3VwS2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhY2t1cEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhY3RpdmF0aW9uIGNvZGUgaWYgcHJvdmlkZWRcbiAgICBpZiAodHlwZW9mIGFjdGl2YXRpb25Db2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIENvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmF0aW9uQ29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBjb2RlIG11c3QgYmUgc2l4IGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luU2hvcnROYW1lID0gdGhpcy5iYXNlQ29pbi50eXBlO1xuICAgIGNvbnN0IGNvaW5OYW1lID0gdGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpO1xuICAgIGNvbnN0IHdhbGxldExhYmVsID0gdGhpcy5fd2FsbGV0LmxhYmVsO1xuXG4gICAgY29uc3QgZG9jID0gZHJhd0tleWNhcmQoe1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICBlbmNyeXB0OiB0aGlzLmJpdGdvLmVuY3J5cHQsXG4gICAgICBjb2luU2hvcnROYW1lLFxuICAgICAgY29pbk5hbWUsXG4gICAgICBhY3RpdmF0aW9uQ29kZSxcbiAgICAgIHdhbGxldExhYmVsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0aGUgUERGIG9uIHRoZSB1c2VyJ3MgYnJvd3NlclxuICAgIGRvYy5zYXZlKGBCaXRHbyBLZXljYXJkIGZvciAke3dhbGxldExhYmVsfS5wZGZgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoXG4gICAgcGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICAvLyBXaGl0ZWxpc3QgcGFyYW1zIHRvIGJ1aWxkIHR4XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCkpO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY291bGQgcmV0dXJuIDEwMCBidWlsZCB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCkpIGFzIGFueTtcblxuICAgIGlmIChidWlsZFJlc3BvbnNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWNlaXZlIGFkZHJlc3NlcyB3aXRoIGJhbGFuY2UgZm91bmQgdG8gY29uc29saWRhdGUuJyk7XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzdGVwIG92ZXIgZWFjaCBwcmVidWlsZCBub3cgLSBzaG91bGQgYmUgaW4gYW4gYXJyYXkgaW4gdGhlIGJvZHlcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uczogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zb2xpZGF0ZUFjY291bnRCdWlsZCBvZiBidWlsZFJlc3BvbnNlKSB7XG4gICAgICBsZXQgcHJlYnVpbGQ6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkLCB7XG4gICAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG5cbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgICBkZWJ1ZygnZmluYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG5cbiAgICAgIGNvbnNvbGlkYXRpb25zLnB1c2gocHJlYnVpbGQpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc29saWRhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIHByZWJ1aWxkVHggICAtIHRoaXMgaXMgdGhlIHByZS1idWlsZCBjb25zb2xpZGF0aW9uIHR4LiB0aGlzIGlzIGEgbm9ybWFsbHkgYnVpbHQgdHggd2l0aFxuICAgKiAgICAgICAgICAgICAgICAgICAgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgb2YgY29uc29saWRhdGVJZC5cbiAgICogICAgIHZlcmlmaWNhdGlvbiAtIG5vcm1hbCBrZXljaGFpbnMsIGV0Yy4gZm9yIHZlcmlmaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICBwYXJhbXMudHlwZSA9ICdjb25zb2xpZGF0ZSc7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtcyBhcyBUeFNlbmRCb2R5LCBwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIG9uZSBvZiBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLnByZWJ1aWxkVHggPT09ICdzdHJpbmcnIHx8IHBhcmFtcy5wcmVidWlsZFR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGNvbnNvbGlkYXRpb24gaWQgb24gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHgudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zb2xpZGF0aW9uIHJlcXVlc3QgbWlzc2luZyB0eFJlcXVlc3RJZC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBhbnk7XG5cbiAgICAvLyBkZWNvcmF0ZSB3aXRoIG91ciBjb25zb2xpZGF0aW9uIGlkXG4gICAgc2lnbmVkUHJlYnVpbGQuY29uc29saWRhdGVJZCA9IHBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQ7XG5cbiAgICBkZWxldGUgc2lnbmVkUHJlYnVpbGQud2FsbGV0O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb25zLiBUaGlzIGlzIGludGVuZGVkIHRvIGZsdXNoIG1hbnkgYmFsYW5jZXMgdG8gdGhlIHJvb3Qgd2FsbGV0IGJhbGFuY2UuXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVZlcnNpb24gPVxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gPz9cbiAgICAgICh0aGlzLnRzc1V0aWxzICYmIHRoaXMudHNzVXRpbHMuc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMoKS5pbmNsdWRlcygnZnVsbCcpID8gJ2Z1bGwnIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzIGdpdmVzIHVzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgYXBpVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICB9KTtcbiAgICBpZiAodW5zaWduZWRCdWlsZHMgJiYgdW5zaWduZWRCdWlsZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gR2V0IHdhbGxldCdzIGJhc2UgYWRkcmVzcyB0byB2YWxpZGF0ZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAvLyBWYWxpZGF0ZSBhbGwgdHJhbnNhY3Rpb25zXG4gICAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICAgIGlmIChiYXNlQWRkcmVzcykge1xuICAgICAgICAgIGRlYnVnKCd2ZXJpZnlpbmcgdHhIZXgnLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgICAgICAgIC8vVmVyaWZ5IHRyYW5zYWN0aW9ucyBzZW5kIGZ1bmRzIHRvIHRoZSBiYXNlIGFkZHJlc3NcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICB0eFByZWJ1aWxkOiBidWlsZCxcbiAgICAgICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBvdXRwdXQgdGhhdCBkb2VzIG5vdCBjb25zb2xpZGF0ZSBmdW5kcyB0byBiYXNlIGFkZHJlc3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMuYXBpVmVyc2lvbiA9IGFwaVZlcnNpb247XG4gICAgICAgIHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucy5wcmVidWlsZFR4ID0gdW5zaWduZWRCdWlsZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRBY2NvdW50Q29uc29saWRhdGlvbih1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJucyBVbnNpZ25lZCB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYnVpbGRUb2tlbkVuYWJsZW1lbnRzKFxuICAgIHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH1cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50c2ApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHdhbGxldCB0eXBlIGlmIGNvaW4gcmVxdWlyZXMgaXRcbiAgICBpZiAodHlwZW9mIHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0ID09PSAnZnVuY3Rpb24nICYmIHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCh0aGlzLl93YWxsZXQudHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgaWYgKCFidWlsZFBhcmFtcy50eXBlKSB7XG4gICAgICBidWlsZFBhcmFtcy50eXBlID0gJ2VuYWJsZXRva2VuJztcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICAvLyBJZiB0b2tlbiBoYXMgbm9uIGFkZHJlc3MsIHRha2UgdGhlIGZpcnN0IHdhbGxldCBhZGRyZXNzIGlzIHN0b3JlZCBpbiBpdHMgY29pbi1zcGVjaWZpYyBwcm9wZXJ0eVxuICAgICAgICAvLyBJbiBhY2NvdW50LWJhc2VkIGNvaW4gaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIHdhbGxldCBjb250cmFjdHMsIHRoZSBhZGRyZXNzIGlzIGNhbGxlZCBiYXNlQWRkcmVzcyAoZS5nLiBldGgtbGlrZSwgeHR6KVxuICAgICAgICAvLyBmb3Igb3RoZXJzIGl0J3MgY2FsbGVkIHJvb3RBZGRyZXNzIChlLmcuIHhycCwgeGxtLCBhbGdvLCB0cngpXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB3YWxsZXQgaW5pdGlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9uc30gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkV2FsbGV0SW5pdGlhbGl6YXRpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5yZXF1aXJlc1dhbGxldEluaXRpYWxpemF0aW9uVHJhbnNhY3Rpb24oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQgaW5pdGlhbGl6YXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1aWxkUGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBpZiAoIWJ1aWxkUGFyYW1zLnR5cGUpIHtcbiAgICAgIGJ1aWxkUGFyYW1zLnR5cGUgPSAnY3JlYXRlQWNjb3VudCc7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3QvY29sZCB3YWxsZXRzXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgY3VzdG9kaWFsIHdhbGxldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50KHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBwYXJhbXMudmVyaWZpY2F0aW9uID0gcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fTtcbiAgICBwYXJhbXMudmVyaWZpY2F0aW9uLnZlcmlmeVRva2VuRW5hYmxlbWVudCA9IHBhcmFtcy52ZXJpZmljYXRpb24udmVyaWZ5VG9rZW5FbmFibGVtZW50ID8/IHRydWU7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uc2ApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHdhbGxldCB0eXBlIGlmIGNvaW4gcmVxdWlyZXMgaXRcbiAgICBpZiAodGVDb25maWcudmFsaWRhdGVXYWxsZXQgJiYgdGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgIHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0KHRoaXMuX3dhbGxldC50eXBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgIGNhc2UgJ2JhY2tpbmcnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFpbiBjYW50b24sIHJlcXVpcmVzIHRoZSB3YWxsZXQgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgc2VuZGluZyBvdXQgYSB0cmFuc2FjdGlvblxuICAgKiB0byBiZSBvbmJvYXJkZWQgb250byB0aGUgdmFsaWRhdG9yLlxuICAgKiBCdWlsZHMsIFNpZ25zIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGNhbnRvbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRXYWxsZXRJbml0aWFsaXphdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldEluaXRSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5idWlsZFdhbGxldEluaXRpYWxpemF0aW9uKHBhcmFtcyk7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBwcmVidWlsZFR4LFxuICAgIH07XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgY29uc3QgZmFpbGVkVHhzID0gbmV3IEFycmF5PEVycm9yPigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzZnVsVHhzLFxuICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgIH07XG4gIH1cblxuICAvKiBNQVJLOiBUU1MgSGVscGVycyAqL1xuXG4gIC8qKlxuICAgKiBQcmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmb3IgYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMoXG4gICAgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgLy8gVHdvIG9wdGlvbnMgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBmZWVzIHNlZW1zIHRvIG5vdyBiZSBzdXBwb3J0ZWQsIGZvciBub3cgd2Ugd2lsbCBzdXBwb3J0IGJvdGggdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGVcbiAgICAvLyBUT0RPKEJHLTU5Njg1KTogZGVwcmVjYXRlIG9uZSBvZiB0aGVzZSBzbyB0aGF0IHdlIGhhdmUgYSBzaW5nbGUgd2F5IHRvIHBhc3MgZmVlc1xuICAgIGxldCBmZWVPcHRpb25zO1xuICAgIGlmIChwYXJhbXMuZmVlT3B0aW9ucykge1xuICAgICAgZmVlT3B0aW9ucyA9IHBhcmFtcy5mZWVPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmdhc1ByaWNlICE9PSB1bmRlZmluZWQgfHwgcGFyYW1zLmVpcDE1NTkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9XG4gICAgICAgIHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGdhc1ByaWNlOiBwYXJhbXMuZ2FzUHJpY2UsIGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtYXhGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZlZU9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RyYW5zZmVyJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgY3VzdG9kaWFuVHJhbnNhY3Rpb25JZDogcGFyYW1zLmN1c3RvZGlhblRyYW5zYWN0aW9uSWQsXG4gICAgICAgICAgICB1bnNwZW50czogcGFyYW1zLnVuc3BlbnRzLFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzczogcGFyYW1zLnNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBpc1Rlc3RUcmFuc2FjdGlvbjogcGFyYW1zLmlzVGVzdFRyYW5zYWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RyYW5zZmVydG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b2tlbkFwcHJvdmFsJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndG9rZW5BcHByb3ZhbCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3JlYXRlQWNjb3VudCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2NyZWF0ZUFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJBY2NlcHQnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyQWNjZXB0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJSZWplY3QnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyUmVqZWN0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY3VzdG9tVHgnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdjdXN0b21UeCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgc29sSW5zdHJ1Y3Rpb25zOiBwYXJhbXMuc29sSW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgc29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBwYXJhbXMuc29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhLFxuICAgICAgICAgICAgYXB0b3NDdXN0b21UcmFuc2FjdGlvblBhcmFtczogcGFyYW1zLmFwdG9zQ3VzdG9tVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgbGV0IHVuc2lnbmVkVHg6IEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbjtcblxuICAgIGlmICh0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICBpZiAodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudW5zaWduZWRUeHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXRJZDogdGhpcy5pZCgpLFxuICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgIGZlZUluZm86IHVuc2lnbmVkVHguZmVlSW5mbyxcbiAgICAgIC4uLih0eFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQgJiYge1xuICAgICAgICBwZW5kaW5nQXBwcm92YWxJZDogdHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRWREU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSxcbiAgICBjb2luOiBJQmFzZUNvaW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgY29tbWl0bWVudCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBSIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEcgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAvLyBhZGRpbmcgdGhpcyB0byByZWJ1aWxkIHRoZSB0cmFuc2FjdGlvbiBqdXN0IGJlZm9yZSBzaWduaW5nIGZvciBFZERTQSB0cmFuc2FjdGlvbiB1c2luZyBleHRlcm5hbCBzaWduZXJcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQsIHJlcUlkKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgICBwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcmVxSWRcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiByZXF1ZXN0IGZyb20gYSBUU1MgKGhvdCkgd2FsbGV0LCBvciBhIFNNQyAoY29sZCkgd2FsbGV0IHdpdGggYW4gZXh0ZXJuYWwgc2lnbmVyLlxuICAgKiBNZWFudCB0byBiZSB1c2VkIGZvciBhIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2hlcmUgdGhlIHNpZ25pbmcgcHJvY2VzcyBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgIHR4UmVxdWVzdElkIC0gVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiAgICB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSB3YWxsZXQuXG4gICAqICAgIGlzVHhSZXF1ZXN0RnVsbCAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpcyBmdWxsLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFNpZ25lZFRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25BbmRTZW5kVHhSZXF1ZXN0KHBhcmFtczogU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuaXNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLnRzc1V0aWxzPy5kZWxldGVTaWduYXR1cmVTaGFyZXMocGFyYW1zLnR4UmVxdWVzdElkKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCB0aGlzLmdldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24oe1xuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB0eFJlcXVlc3RJZDogcGFyYW1zLnR4UmVxdWVzdElkLFxuICAgIH0pO1xuICAgIGlmICghcGFyYW1zLmlzVHhSZXF1ZXN0RnVsbCkge1xuICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGl0cyBub3QgYSBmdWxsIHR4IHJlcXVlc3QsIHRoZW4gaXQgaXMgYSBsaXRlIHR4IHJlcXVlc3RcbiAgICAgIGNvbnN0IHN1Ym1pdFR4ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJtaXRUeDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHNpZ25hdHVyZSBzaGFyZXMgYXJlIGluIGEgY2xlYW4gc3RhdGUgYmVmb3JlIHNpZ25pbmcgYSB0cmFuc2FjdGlvbi5cbiAgICogQXV0b21hdGljYWxseSBkZWxldGVzIHNpZ25hdHVyZSBzaGFyZXMgZm9yIEZ1bGwgVHhSZXF1ZXN0cyBiZWZvcmUgc2lnbmluZyB0byBwcmV2ZW50XG4gICAqIGlzc3VlcyB3aXRoIHN0YWxlIG9yIHBhcnRpYWwgc2lnbmF0dXJlcy5cbiAgICogVXNlIHRoaXMgZm9yIEV4cHJlc3MgQVBJIGFuZCBvdGhlciBpbnRlZ3JhdGlvbnMgdGhhdCBuZWVkIGF1dG9tYXRpYyBjbGVhbnVwIG9mIHNpZ25hdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBzaWduaW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5zdXJlQ2xlYW5TaWdTaGFyZXNBbmRTaWduVHJhbnNhY3Rpb24oXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkIHx8IHBhcmFtcy50eFByZWJ1aWxkPy50eFJlcXVlc3RJZDtcblxuICAgIGlmICh0eFJlcXVlc3RJZCAmJiB0aGlzLnRzc1V0aWxzICYmIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdCh0eFJlcXVlc3RJZCk7XG5cbiAgICAgIC8vIEFsd2F5cyBjbGVhbiBzaWduYXR1cmUgc2hhcmVzIGZvciBGdWxsIFR4UmVxdWVzdHMgYmVmb3JlIHNpZ25pbmdcbiAgICAgIGNvbnN0IGlzRnVsbCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgJiZcbiAgICAgICAgKCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zID8/IFtdKS5sZW5ndGggPiAwIHx8ICh0eFJlcXVlc3QubWVzc2FnZXMgPz8gW10pLmxlbmd0aCA+IDApO1xuXG4gICAgICBpZiAoaXNGdWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudHNzVXRpbHMuZGVsZXRlU2lnbmF0dXJlU2hhcmVzKHR4UmVxdWVzdElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRUNEU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQShcbiAgICBjb2luOiBJQmFzZUNvaW4sXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBwYWlsbGllciBtb2R1bHVzIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEsgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTXVEZWx0YSBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBTIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWNkc2FUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgICBwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVDRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0FNUEN2MihcbiAgICBjb2luOiBJQmFzZUNvaW4sXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAxIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVjZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW9uRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3Qoe1xuICAgICAgICB0eFJlcXVlc3Q6IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLFxuICAgICAgICB0eFBhcmFtczogcGFyYW1zLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBhcGlWZXJzaW9uOiBwYXJhbXMuYXBpVmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25NZXNzYWdlVHNzKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy5tZXNzYWdlLCAnbWVzc2FnZSByZXF1aXJlZCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBjb25zdCBtZXNzYWdlUmF3ID0gcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdztcblxuICAgICAgaWYgKCFwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduTWVzc2FnZScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgICBtZXNzYWdlU3RhbmRhcmRUeXBlOiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlU3RhbmRhcmRUeXBlLFxuICAgICAgICAgIHNpZ25lckFkZHJlc3M6IHBhcmFtcy5tZXNzYWdlLnNpZ25lckFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLmJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KGludGVudE9wdGlvbik7XG4gICAgICAgIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChcbiAgICAgICAgdHhSZXF1ZXN0Lm1lc3NhZ2VzICYmIHR4UmVxdWVzdC5tZXNzYWdlcy5sZW5ndGggPiAwLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gdHhSZXF1ZXN0IGZvciBtZXNzYWdlIHNpZ25pbmcnXG4gICAgICApO1xuICAgICAgY29uc3QgbWVzc2FnZUVuY29kZWQgPSB0eFJlcXVlc3QubWVzc2FnZXNbMF0ubWVzc2FnZUVuY29kZWQ7XG5cbiAgICAgIGNvbnN0IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZCxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBCdWZmZXIuZnJvbShtZXNzYWdlRW5jb2RlZCwgJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdCcpO1xuICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09IENvaW5GYW1pbHkuRVRIKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkTWVzc2FnZVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gbWVzc2FnZSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHlwZWQgZGF0YSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHlwZWREYXRhVHNzKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHR5cGVkIGRhdGEgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMudHlwZWREYXRhLCAndHlwZWREYXRhIHJlcXVpcmVkIGZvciB0eXBlZCBkYXRhIHNpZ25pbmcnKTtcbiAgICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduVHlwZWRTdHJ1Y3R1cmVkRGF0YScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgdHlwZWREYXRhUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgICB0eXBlZERhdGFFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcoaW50ZW50T3B0aW9ucyk7XG4gICAgICAgIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRUeXBlZERhdGFSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBKU09OLnN0cmluZ2lmeShwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyksXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHR5cGVkIGRhdGEgJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcy5hcGlWZXJzaW9uID0gZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgICBpZiAoIXNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIG1pc3NpbmcgZnJvbSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24gPT09ICdmdWxsJykge1xuICAgICAgY29uc3QgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyOiB7XG4gICAgICAgIHN0YXRlOiBzdHJpbmc7XG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbD86IHN0cmluZztcbiAgICAgICAgdHhpZD86IHN0cmluZztcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIHRoaXMuYml0Z28udXJsKFxuICAgICAgICAgICAgJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHhyZXF1ZXN0cy8nICsgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQgKyAnL3RyYW5zZmVycycsXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zZW5kKClcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgaWYgKGxhdGVzdFR4UmVxdWVzdC5zdGF0ZSA9PT0gJ3BlbmRpbmdBcHByb3ZhbCcpIHtcbiAgICAgICAgY29uc3QgcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pO1xuICAgICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWwgPSBhd2FpdCBwZW5kaW5nQXBwcm92YWxzLmdldCh7XG4gICAgICAgICAgaWQ6IGxhdGVzdFR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiBwZW5kaW5nQXBwcm92YWwudG9KU09OKCksXG4gICAgICAgICAgdHhSZXF1ZXN0OiBsYXRlc3RUeFJlcXVlc3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2ZlcixcbiAgICAgICAgdHhSZXF1ZXN0OiBsYXRlc3RUeFJlcXVlc3QsXG4gICAgICAgIHR4aWQ6IChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zID8/IFtdKVswXT8uc2lnbmVkVHg/LmlkLFxuICAgICAgICB0eDogKGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pWzBdPy5zaWduZWRUeD8udHgsXG4gICAgICAgIHN0YXR1czogdHJhbnNmZXIuc3RhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy50c3NVdGlscz8uc2VuZFR4UmVxdWVzdChzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCwgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLiBPbmx5IHN1cHBvcnRzIGV0aC1saWtlIGNvaW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIHRvIHNlbmQgZnVuZHMgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gQW1vdW50IHRvIHNlbmQgdGhlIGZvcndhcmRlciAob3B0aW9uYWwpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHNlbmRpbmcgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBuZWVkZWQgZm9yIGEgZnVuZCByZWNvdmVyeVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVyKHBhcmFtczogRnVuZEZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxXYWxsZXREYXRhPiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZvcndhcmRlckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlciBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZEZvcndhcmRlcicpO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtMaXN0fSBwYXJhbXMuZm9yd2FyZGVycyAtIGxpc3Qgb2YgZnVuZCBmb3J3YXJkZXIgb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVycyhwYXJhbXM6IEZ1bmRGb3J3YXJkZXJQYXJhbXMpOiBQcm9taXNlPFdhbGxldERhdGE+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVycykgfHwgcGFyYW1zLmZvcndhcmRlcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZnVuZCBmb3J3YXJkZXIgb3B0aW9ucyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2Z1bmRmb3J3YXJkZXJzJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBmb3J3YXJkZXIncyBiYWxhbmNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgZm9yd2FyZGVyIGFkZHJlc3MgYW5kIGJhbGFuY2VcbiAgICogaWYgcGFyYW1zIGlzIG5vdCBzZXQgdGhlbiByZXR1cm5zIGxvdyBiYWxhbmNlIGZvcndhcmRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGb3J3YXJkZXJCYWxhbmNlKHBhcmFtcz86IEZvcndhcmRlckJhbGFuY2VPcHRpb25zKTogUHJvbWlzZTxGb3J3YXJkZXJCYWxhbmNlW10+IHtcbiAgICBjb25zdCBxdWVyeTogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zPy5tYXhpbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWF4aW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1heGltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/Lm1pbmltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5taW5pbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWluaW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9mb3J3YXJkZXJzL2JhbGFuY2VzYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgRm9yd2FyZGVyQmFsYW5jZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVjZHNhIHRzcyBjaGFsbGVuZ2VzIGZvciBhIHdhbGxldC5cbiAgICogVGhlc2UgYXJlIHN0YXRpYyBjaGFsbGVuZ2VzIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IGFuIGVudGVycHJpc2UgYWRtaW4uXG4gICAqIENhbGxlcnMgc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGVudGVycHJpc2UgYWRtaW4gc2lnbmVkIHRoZSBjaGFsbGVuZ2UgdmFsdWVzIGJlZm9yZSB1c2luZyB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+fVxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlc0ZvckVjZHNhU2lnbmluZygpOiBQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz4ge1xuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGEgY29pbiBzcGVjaWZpYyByb3V0ZSwgd2UgY2Fubm90IHVzZSB0aGlzLnVybCguLilcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vY2hhbGxlbmdlc2AsIDIpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcikge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKSk7XG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9zZW5kJyksXG4gICAgICB0LmludGVyc2VjdGlvbihbVHhTZW5kQm9keSwgdC5wYXJ0aWFsKHsgbG9ja3RpbWU6IHQubnVtYmVyIH0pXSksXG4gICAgICB3aGl0ZWxpc3RlZFBhcmFtc1xuICAgICkucmVzdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBUeFNlbmRCb2R5LCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKSB7XG4gICAgLy8gZXh0cmFjdCB0aGUgd2hpdGVsaXN0ZWQgcGFyYW1zIGZyb20gdGhlIHRvcCBsZXZlbCwgaW4gY2FzZVxuICAgIC8vIG90aGVyIGludmFsaWQgcGFyYW1zIGFyZSBwcmVzZW50IHRoYXQgd291bGQgZmFpbCBlbmNvZGluZ1xuICAgIC8vIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGJvZHkgcGFyYW1zXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB0aGlzLmJhc2VDb2luLnByZXByb2Nlc3NCdWlsZFBhcmFtcyhfLnBpY2socGFyYW1zLCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMpKTtcbiAgICBjb25zdCByZXFUcmFjZXIgPSByZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXIpO1xuICAgIHJldHVybiBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2luaXRpYXRlJyksXG4gICAgICBUeFNlbmRCb2R5LFxuICAgICAgd2hpdGVsaXN0ZWRQYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQga2V5Y2hhaW5zIGFuZCB2YWxpZGF0ZSBwYXNzcGhyYXNlIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge1ByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zfSBwYXJhbXMgLSBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkIGZvciB0cmFjaW5nIHB1cnBvc2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24gLSBjdXN0b20gc2lnbmluZyBmdW5jdGlvbiBmb3IgZXh0ZXJuYWwgc2lnbmluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbltdPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICBjdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICByZXFJZCxcbiAgfTogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgJiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxLZXljaGFpbltdPiB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSk7XG5cbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgLy8gd2UgaWdub3JlIHRoaXMgY2hlY2sgd2l0aCBpZiBjdXN0b21TaWduaW5nRnVuY3Rpb24gaXMgcHJvdmlkZWRcbiAgICAvLyAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBoYW5kbGluZyB0aGUgc2lnbmluZyBpbiBleHRlcm5hbCBzaWduaW5nIG1vZGVcbiAgICBpZiAoIWN1c3RvbVNpZ25pbmdGdW5jdGlvbiAmJiBrZXljaGFpbnM/LlswXT8uZW5jcnlwdGVkUHJ2ICYmIHdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIGlmICghZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCBrZXljaGFpbnNbMF0sIHdhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9ID0gbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmFibGUgdG8gZGVjcnlwdCBrZXljaGFpbiB3aXRoIHRoZSBnaXZlbiB3YWxsZXQgcGFzc3BocmFzZWBcbiAgICAgICAgKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICd3YWxsZXRfcGFzc3BocmFzZV9pbmNvcnJlY3QnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleWNoYWlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIHRva2VuIGZvciB1c2Ugd2l0aCBhIGJhdGNoZXIgY29udHJhY3RcbiAgICogVGhpcyBmdW5jdGlvbiBidWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0b2tlbiBhcHByb3ZhbCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0b2tlbiB0byBiZSBhcHByb3ZlZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICAgKi9cbiAgYXN5bmMgYXBwcm92ZUVyYzIwVG9rZW4od2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLCB0b2tlbk5hbWU6IHN0cmluZyk6IFByb21pc2U8U3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IHRva2VuQXBwcm92YWxCdWlsZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L3Rva2VuL2FwcHJvdmFsL2J1aWxkYCk7XG4gICAgICB0b2tlbkFwcHJvdmFsQnVpbGQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHVybClcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZCxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgdHhQcmVidWlsZDogdG9rZW5BcHByb3ZhbEJ1aWxkLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICByZXFJZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0b2tlbiBhcHByb3ZhbCB0cmFuc2FjdGlvbiBmb3IgRVJDMjAgdG9rZW5zXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgcHJvdmlkZWQsIGFsc28gc2lnbnMgYW5kIHNlbmRzIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRva2VuIHRvIGJlIGFwcHJvdmVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbd2FsbGV0UGFzc3BocmFzZV0gLSBPcHRpb25hbCB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2lnbmluZyBhbmQgc2VuZGluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSB8IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+fSBUaGUgdG9rZW4gYXBwcm92YWwgYnVpbGQgcmVzcG9uc2Ugb3IgdHJhbnNhY3Rpb24gZGV0YWlscyBpZiBzaWduZWRcbiAgICovXG4gIGFzeW5jIGJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSB8IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGxldCB0b2tlbkFwcHJvdmFsQnVpbGQ6IEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS90b2tlbi9hcHByb3ZhbC9idWlsZGApO1xuICAgIHRyeSB7XG4gICAgICB0b2tlbkFwcHJvdmFsQnVpbGQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHVybClcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IgYnVpbGRpbmcgZXJjMjAgdG9rZW4gYXBwcm92YWwgdHg6ICR7ZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICByZXR1cm4gdG9rZW5BcHByb3ZhbEJ1aWxkO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25pbmdQYXJhbXMgPSB7XG4gICAgICB0eFByZWJ1aWxkOiB0b2tlbkFwcHJvdmFsQnVpbGQsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgIH07XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG59XG4iXX0=
|