@bitgo/sdk-core 38.17.0 → 38.19.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/ed25519KeyPair.js +3 -3
- package/dist/src/account-lib/baseCoin/enum.d.ts +2 -1
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +4 -1
- package/dist/src/account-lib/index.d.ts +0 -1
- package/dist/src/account-lib/index.d.ts.map +1 -1
- package/dist/src/account-lib/index.js +1 -2
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +14 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/coinFactory.d.ts +7 -0
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +10 -1
- package/dist/src/bitgo/keychain/keychains.d.ts +4 -0
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +12 -8
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +3 -21
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +6 -145
- package/dist/src/bitgo/safe/iSafe.d.ts +7 -2
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafe.js +1 -1
- package/dist/src/bitgo/safe/index.d.ts +1 -1
- package/dist/src/bitgo/safe/index.d.ts.map +1 -1
- package/dist/src/bitgo/safe/index.js +2 -2
- package/dist/src/bitgo/safe/safe.d.ts +5 -1
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safe.js +21 -40
- package/dist/src/bitgo/safe/safes.js +4 -4
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +26 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +35 -24
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +1 -20
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +16 -68
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +2 -2
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +5 -4
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +16 -2
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +34 -6
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +3 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +0 -8
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +4 -23
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +3 -0
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +2 -1
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts +40 -0
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.js +103 -0
- package/dist/src/bitgo/wallet/safeKeychain.js +3 -3
- package/dist/test/unit/bitgo/safe/safe.js +42 -3
- package/dist/test/unit/bitgo/safe/safeDerivation.js +5 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +76 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +4 -3
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +66 -1
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.js +83 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -52
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -91
- package/dist/src/bitgo/safe/safeDerivation.d.ts +0 -43
- package/dist/src/bitgo/safe/safeDerivation.d.ts.map +0 -1
- package/dist/src/bitgo/safe/safeDerivation.js +0 -151
|
@@ -41,7 +41,7 @@ const assert_1 = __importDefault(require("assert"));
|
|
|
41
41
|
const _ = __importStar(require("lodash"));
|
|
42
42
|
const common = __importStar(require("../../common"));
|
|
43
43
|
const errors_1 = require("../errors");
|
|
44
|
-
const
|
|
44
|
+
const sdk_lib_safes_1 = require("@bitgo/sdk-lib-safes");
|
|
45
45
|
const utils_1 = require("../utils");
|
|
46
46
|
const ovcJsonCodec_1 = require("./ovcJsonCodec");
|
|
47
47
|
class Keychains {
|
|
@@ -100,6 +100,10 @@ class Keychains {
|
|
|
100
100
|
* This should be called when a user changes their login password, and are expecting
|
|
101
101
|
* that their wallet passwords are changed to match the new login password.
|
|
102
102
|
*
|
|
103
|
+
* Keychains that cannot be decrypted with `oldPassword` are silently skipped
|
|
104
|
+
* (absent from the result): wrong password, a different passphrase, or
|
|
105
|
+
* corrupt input. An empty result is not an error.
|
|
106
|
+
*
|
|
103
107
|
* @param params
|
|
104
108
|
* @param params.oldPassword - The old password used for encrypting the key
|
|
105
109
|
* @param params.newPassword - The new password to be used for encrypting the key
|
|
@@ -140,9 +144,9 @@ class Keychains {
|
|
|
140
144
|
}
|
|
141
145
|
}
|
|
142
146
|
catch (e) {
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
// 'failed to update keychain password: ...'
|
|
147
|
+
// A decrypt failure is usually not a wrong password — the keychain may be
|
|
148
|
+
// encrypted under a different passphrase. updateSingleKeychainPassword wraps
|
|
149
|
+
// such failures as 'failed to update keychain password: ...'; rethrow the rest.
|
|
146
150
|
if (!e.message.includes('private key is incorrect') &&
|
|
147
151
|
!e.message.includes('failed to update keychain password')) {
|
|
148
152
|
throw e;
|
|
@@ -216,7 +220,7 @@ class Keychains {
|
|
|
216
220
|
return _.assign({}, params.keychain, { encryptedPrv: newEncryptedPrv });
|
|
217
221
|
}
|
|
218
222
|
catch (e) {
|
|
219
|
-
//
|
|
223
|
+
// decryption failed: wrong password, different passphrase, or corrupt input
|
|
220
224
|
const errorDetail = e instanceof Error ? e.message : String(e);
|
|
221
225
|
throw new Error(`failed to update keychain password: ${errorDetail}`);
|
|
222
226
|
}
|
|
@@ -342,8 +346,8 @@ class Keychains {
|
|
|
342
346
|
// Stellar/Algorand/HBAR public key; coin-specific encoding happens after public soft
|
|
343
347
|
// derivation when the wallet child is minted.
|
|
344
348
|
const withKey = params;
|
|
345
|
-
if (params.safeId !== undefined && withKey.pub !== undefined && (0,
|
|
346
|
-
withKey.pub = (0,
|
|
349
|
+
if (params.safeId !== undefined && withKey.pub !== undefined && (0, sdk_lib_safes_1.isValidEd25519StrKeyPublicKey)(withKey.pub)) {
|
|
350
|
+
withKey.pub = (0, sdk_lib_safes_1.encodeDerivableEd25519Pub)((0, sdk_lib_safes_1.decodeEd25519StrKeyPublicKey)(withKey.pub), (0, sdk_lib_safes_1.generateEd25519ChainCode)());
|
|
347
351
|
}
|
|
348
352
|
const serverResponse = await this.add(params);
|
|
349
353
|
return _.extend({}, serverResponse, _.pick(params, ['prv', 'encryptedPrv', 'provider', 'source']));
|
|
@@ -629,4 +633,4 @@ class Keychains {
|
|
|
629
633
|
}
|
|
630
634
|
}
|
|
631
635
|
exports.Keychains = Keychains;
|
|
632
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxvREFBNEI7QUFDNUIsMENBQTRCO0FBQzVCLHFEQUF1QztBQUd2QyxzQ0FBNEQ7QUFDNUQscUVBS3FDO0FBQ3JDLG9DQUF1RztBQW1CdkcsaURBQXVGO0FBR3ZGLE1BQWEsU0FBUztJQUlwQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQTBCO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxD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LEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBQ2IsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxNQUFNO2dCQUNiLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjthQUM1QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzNDLElBQUksQ0FBQztZQUNKLFlBQVk7WUFDWixHQUFHO1lBQ0gsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1NBQ3BCLENBQUM7YUFDRCxNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQWtCO1FBQ3RDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDRjtBQS9vQkQsOEJBK29CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRzc1NldHRpbmdzIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgS2V5UGFpciB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBTYWZlTXBjQ2VyZW1vbnlVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7XG4gIGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSxcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG59IGZyb20gJy4uL3NhZmUvZGVyaXZhYmxlRWQyNTUxOVB1Yic7XG5pbXBvcnQgeyBkZWNvZGVPckVsc2UsIEVDRFNBVXRpbHMsIEVERFNBVXRpbHMsIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQsIFJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBZGRLZXljaGFpbk9wdGlvbnMsXG4gIEFwaUtleVNoYXJlLFxuICBDaGFuZ2VkS2V5Y2hhaW5zLFxuICBDcmVhdGVCYWNrdXBPcHRpb25zLFxuICBDcmVhdGVCaXRHb09wdGlvbnMsXG4gIENyZWF0ZU1wY09wdGlvbnMsXG4gIEdldEtleWNoYWluT3B0aW9ucyxcbiAgR2V0S2V5c0ZvclNpZ25pbmdPcHRpb25zLFxuICBJS2V5Y2hhaW5zLFxuICBLZXljaGFpbixcbiAgTGlzdEtleWNoYWluT3B0aW9ucyxcbiAgTGlzdEtleWNoYWluc1Jlc3VsdCxcbiAgUmVjcmVhdGVNcGNPcHRpb25zLFxuICBSb3RhdGVLZXljaGFpbk9wdGlvbnMsXG4gIFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyxcbiAgVXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZE9wdGlvbnMsXG59IGZyb20gJy4vaUtleWNoYWlucyc7XG5pbXBvcnQgeyBCaXRHb0tleUZyb21PdmNTaGFyZXMsIEJpdEdvVG9PdmNKU09OLCBPdmNUb0JpdEdvSlNPTiB9IGZyb20gJy4vb3ZjSnNvbkNvZGVjJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBJRW5jcnlwdGlvblNlc3Npb24gfSBmcm9tICcuLi8uLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgS2V5Y2hhaW5zIGltcGxlbWVudHMgSUtleWNoYWlucyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleWNoYWluIGJ5IElEXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5pZFxuICAgKiBAcGFyYW0gcGFyYW1zLnhwdWIgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLmV0aEFkZHJlc3MgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLnJlcUlkIChvcHRpb25hbClcbiAgICovXG4gIGFzeW5jIGdldChwYXJhbXM6IEdldEtleWNoYWluT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd4cHViJywgJ2V0aEFkZHJlc3MnXSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkO1xuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy9rZXkvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsaXN0IHRoZSB1c2VycyBrZXljaGFpbnNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpbWl0IC0gTWF4IG51bWJlciBvZiByZXN1bHRzIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMucHJldklkIC0gQ29udGludWUgaXRlcmF0aW5nIChwcm92aWRlZCBieSBuZXh0QmF0Y2hQcmV2SWQgaW4gdGhlIHByZXZpb3VzIGxpc3QpXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8TGlzdEtleWNoYWluc1Jlc3VsdD4ge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0OiBhbnkgPSB7fTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL2tleScpKS5xdWVyeShxdWVyeU9iamVjdCkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBkZWNyeXB0aW9uIHBhc3N3b3JkIGZvciBhbGwgcG9zc2libGUga2V5Y2hhaW5zIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgdGhyb3VnaCBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGRlY3J5cHRzXG4gICAqIHRoZW0gd2l0aCB0aGUgb2xkIHBhc3N3b3JkIGFuZCByZS1lbmNyeXB0cyB0aGVtIHdpdGggdGhlIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlaXIgbG9naW4gcGFzc3dvcmQsIGFuZCBhcmUgZXhwZWN0aW5nXG4gICAqIHRoYXQgdGhlaXIgd2FsbGV0IHBhc3N3b3JkcyBhcmUgY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IGxvZ2luIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMub2xkUGFzc3dvcmQgLSBUaGUgb2xkIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAgICogQHJldHVybnMgY2hhbmdlZEtleXMgT2JqZWN0IC0gZS5nLjpcbiAgICogIHtcbiAgICogICAgeHB1YjE6IGVuY3J5cHRlZFBydixcbiAgICogICAgLi4uXG4gICAqICB9XG4gICAqL1xuICBhc3luYyB1cGRhdGVQYXNzd29yZChwYXJhbXM6IFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8Q2hhbmdlZEtleWNoYWlucz4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnb2xkUGFzc3dvcmQnLCAnbmV3UGFzc3dvcmQnXSwgW10pO1xuICAgIGNvbnN0IGNoYW5nZWRLZXlzOiBDaGFuZ2VkS2V5Y2hhaW5zID0ge307XG4gICAgbGV0IHByZXZJZDtcbiAgICBsZXQga2V5c0xlZnQgPSB0cnVlO1xuICAgIHdoaWxlIChrZXlzTGVmdCkge1xuICAgICAgY29uc3QgcmVzdWx0OiBMaXN0S2V5Y2hhaW5zUmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0KHsgbGltaXQ6IDUwMCwgcHJldklkIH0pO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVzdWx0LmtleXMpIHtcbiAgICAgICAgY29uc3Qgb2xkRW5jcnlwdGVkUHJ2ID0ga2V5LmVuY3J5cHRlZFBydjtcbiAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQob2xkRW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEtleWNoYWluID0gYXdhaXQgdGhpcy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHtcbiAgICAgICAgICAgIGtleWNoYWluOiBrZXksXG4gICAgICAgICAgICBvbGRQYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkLFxuICAgICAgICAgICAgbmV3UGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2Vzc2lvbjogcGFyYW1zLmVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh1cGRhdGVkS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgICAvLyBCb3RoIFRTUyBhbmQgbXVsdGktdXNlci1vZmMga2V5cyBoYXZlIG11bHRpcGxlIHB1YmxpYyBrZXlzIGluIHRoZWlyIGtleSBkb2N1bWVudCBhbmQgdGh1cyBuZWVkIHRvIHVzZSBvYmplY3RJRFxuICAgICAgICAgICAgY29uc3QgY2hhbmdlZEtleUlkZW50aWZpZXIgPVxuICAgICAgICAgICAgICB1cGRhdGVkS2V5Y2hhaW4udHlwZSA9PT0gJ3RzcycgfHwgS2V5Y2hhaW5zLmlzTXVsdGlVc2VyS2V5KHVwZGF0ZWRLZXljaGFpbilcbiAgICAgICAgICAgICAgICA/IHVwZGF0ZWRLZXljaGFpbi5pZFxuICAgICAgICAgICAgICAgIDogdXBkYXRlZEtleWNoYWluLnB1YjtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkS2V5SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICBjaGFuZ2VkS2V5c1tjaGFuZ2VkS2V5SWRlbnRpZmllcl0gPSB1cGRhdGVkS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlmIHRoZSBwYXNzd29yZCB3YXMgaW5jb3JyZWN0LCBzaWxlbmNlIHRoZSBlcnJvciwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgICAgICAgIC8vIHVwZGF0ZVNpbmdsZUtleWNoYWluUGFzc3dvcmQgd3JhcHMgYSB3cm9uZy1wYXNzd29yZCAob3IgY29ycnVwdCBpbnB1dCkgZmFpbHVyZSBhc1xuICAgICAgICAgIC8vICdmYWlsZWQgdG8gdXBkYXRlIGtleWNoYWluIHBhc3N3b3JkOiAuLi4nLCBzbyB0cmVhdCB0aGF0IGFzIGEgc2tpcC1hYmxlIGVycm9yLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFlLm1lc3NhZ2UuaW5jbHVkZXMoJ3ByaXZhdGUga2V5IGlzIGluY29ycmVjdCcpICYmXG4gICAgICAgICAgICAhZS5tZXNzYWdlLmluY2x1ZGVzKCdmYWlsZWQgdG8gdXBkYXRlIGtleWNoYWluIHBhc3N3b3JkJylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Lm5leHRCYXRjaFByZXZJZCkge1xuICAgICAgICBwcmV2SWQgPSByZXN1bHQubmV4dEJhdGNoUHJldklkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5c0xlZnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWRLZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgZW5jcnlwdGlvbiB2ZXJzaW9uIG9mIGEgY2lwaGVydGV4dCBieSBpbnNwZWN0aW5nIGl0cyBcInZcIiBmaWVsZC5cbiAgICogICAtIHYxIChTSkNMIC8gUEJLREYyLVNIQTI1NiArIEFFUy0yNTYtQ0NNKTogXCJ2XCIgYWJzZW50IG9yIGV4cGxpY2l0bHkgMVxuICAgKiAgIC0gdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pOiBcInZcIiA9PT0gMlxuICAgKiBUaHJvd3Mgb24gdW5yZWNvZ25pemVkIHZhbHVlcyBzbyBjYWxsZXJzIGNhbm5vdCBzaWxlbnRseSBtaXMtaGFuZGxlIHVua25vd24gZW52ZWxvcGVzLlxuICAgKi9cbiAgZ2V0RW5jcnlwdGlvblZlcnNpb24oY2lwaGVydGV4dDogc3RyaW5nKTogRW5jcnlwdGlvblZlcnNpb24ge1xuICAgIGxldCBlbnZlbG9wZTogeyB2PzogdW5rbm93biB9O1xuICAgIHRyeSB7XG4gICAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgY2lwaGVydGV4dCBlbnZlbG9wZTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKGVudmVsb3BlLnYgPT09IDIpIHtcbiAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBpZiAoZW52ZWxvcGUudiA9PT0gdW5kZWZpbmVkIHx8IGVudmVsb3BlLnYgPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBlbmNyeXB0aW9uIHZlcnNpb246ICR7U3RyaW5nKGVudmVsb3BlLnYpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcGFzc3dvcmQgdXNlZCB0byBkZWNyeXB0IGEgc2luZ2xlIGtleWNoYWluLiBEZWZhdWx0cyB0byBwcmVzZXJ2aW5nIHRoZVxuICAgKiBzb3VyY2UgZW52ZWxvcGUgdmVyc2lvbiAodjEgc3RheXMgdjEsIHYyIHN0YXlzIHYyKSwgc28gdGhpcyBpcyBhIG5vLW9wIHdpdGggcmVzcGVjdCB0b1xuICAgKiBlbmNyeXB0aW9uIHZlcnNpb24gdW5sZXNzIHRoZSBjYWxsZXIgb3B0cyBpbi4gUGFzcyBgZW5jcnlwdGlvblZlcnNpb246IDJgIHRvIGV4cGxpY2l0bHlcbiAgICogdXBncmFkZSBhIHYxIChTSkNMKSBrZXljaGFpbiB0byB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSkgYXMgcGFydCBvZiB0aGUgcGFzc3dvcmQgY2hhbmdlXG4gICAqIChlLmcuIG9uY2UgYSBjYWxsZXIgaXMgcmVhZHksIGFmdGVyIHRoZSBTZXB0IDE1IGJyZWFraW5nLWNoYW5nZSB3aW5kb3cgY2xvc2VzKS5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWluIC0gVGhlIGtleWNoYWluIHdob3NlIHBhc3N3b3JkIHNob3VsZCBiZSB1cGRhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXMub2xkUGFzc3dvcmQgLSBUaGUgb2xkIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAgICogQHBhcmFtIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiAtIE9wdGlvbmFsIGVudmVsb3BlIHZlcnNpb24gdG8gZW1pdDsgZGVmYXVsdHMgdG8gdGhlIHNvdXJjZSBlbnZlbG9wZSdzIHZlcnNpb25cbiAgICogQHJldHVybnMge1Byb21pc2U8S2V5Y2hhaW4+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZChwYXJhbXM6IFVwZGF0ZVNpbmdsZUtleWNoYWluUGFzc3dvcmRPcHRpb25zID0ge30pOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5vbGRQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgb2xkIHBhc3N3b3JkIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5uZXdQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgbmV3IHBhc3N3b3JkIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5rZXljaGFpbikgfHwgIV8uaXNTdHJpbmcocGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQga2V5Y2hhaW4gdG8gYmUgYW4gb2JqZWN0IHdpdGggYW4gZW5jcnlwdGVkUHJ2IHByb3BlcnR5Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRW5jcnlwdGVkUHJ2ID0gcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IG9sZEVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy5vbGRQYXNzd29yZCB9KTtcbiAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHBhcmFtcy5lbmNyeXB0aW9uU2Vzc2lvblxuICAgICAgICA/IGF3YWl0IHBhcmFtcy5lbmNyeXB0aW9uU2Vzc2lvbi5lbmNyeXB0KGRlY3J5cHRlZFBydilcbiAgICAgICAgOiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IGRlY3J5cHRlZFBydixcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMubmV3UGFzc3dvcmQsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uID8/IHRoaXMuZ2V0RW5jcnlwdGlvblZlcnNpb24ob2xkRW5jcnlwdGVkUHJ2KSxcbiAgICAgICAgICB9KTtcbiAgICAgIHJldHVybiBfLmFzc2lnbih7fSwgcGFyYW1zLmtleWNoYWluLCB7IGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2IH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhdGNoaW5nIGFuIGVycm9yIGhlcmUgbWVhbnMgdGhhdCB0aGUgcGFzc3dvcmQgd2FzIGluY29ycmVjdCBvciwgbGVzcyBsaWtlbHksIHRoZSBpbnB1dCB0byBkZWNyeXB0IGlzIGNvcnJ1cHRlZFxuICAgICAgY29uc3QgZXJyb3JEZXRhaWwgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQ6ICR7ZXJyb3JEZXRhaWx9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY3J5cHQgYW4gZW5jcnlwdGVkIHByaXZhdGUga2V5IHdpdGggYHBhc3NwaHJhc2VgIGFuZCByZS1lbmNyeXB0IGl0IGFzIGEgdjJcbiAgICogKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pIGVudmVsb3BlIHdpdGggdGhlIHNhbWUgcGFzc3BocmFzZS5cbiAgICpcbiAgICogVXNlZCB0byB1cGdyYWRlIGxlZ2FjeSB2MSAoU0pDTCkgZW52ZWxvcGVzIHRvIHYyIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBhc3NwaHJhc2UuXG4gICAqIENhbGxlcnMgdGhhdCBuZWVkIHRvIHRyeSBhIGZhbGxiYWNrIHBhc3NwaHJhc2UgKGUuZy4gYW4gb3JpZ2luYWwgcGFzc3BocmFzZSBmcm9tXG4gICAqIGJlZm9yZSBhIHBhc3N3b3JkIHJvdGF0aW9uKSBzaG91bGQgaGFuZGxlIHRoYXQgdGhlbXNlbHZlcyDigJQgdGhpcyBwcmltaXRpdmUgZG9lcyBvbmVcbiAgICogdGhpbmcgYW5kIGxldHMgZGVjcnlwdGlvbiBlcnJvcnMgc3VyZmFjZSBkaXJlY3RseS5cbiAgICovXG4gIGFzeW5jIHJlZW5jcnlwdEFzVjIoZW5jcnlwdGVkUHJ2OiBzdHJpbmcsIHBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhc3NwaHJhc2UgfSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZW5jcnlwdCh7IGlucHV0OiBwcnYsIHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuc2VlZCBvcHRpb25hbCAtIHNlZWQgdG8gdXNlIGZvciBrZXlwYWlyIGdlbmVyYXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5pc1Jvb3RLZXkgb3B0aW9uYWwgLSB3aGV0aGVyIHRoZSByZXN1bHRpbmcga2V5cGFpciBzaG91bGQgYmUgYSByb290IGtleVxuICAgKiBAcmV0dXJucyB7S2V5UGFpcn0gLSB0aGUgZ2VuZXJhdGVkIGtleXBhaXJcbiAgICovXG4gIGNyZWF0ZShwYXJhbXM6IHsgc2VlZD86IEJ1ZmZlcjsgaXNSb290S2V5PzogYm9vbGVhbiB9ID0ge30pOiBLZXlQYWlyIHtcbiAgICBpZiAocGFyYW1zPy5pc1Jvb3RLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmdlbmVyYXRlUm9vdEtleVBhaXIocGFyYW1zLnNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5nZW5lcmF0ZUtleVBhaXIocGFyYW1zLnNlZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGtleWNoYWluIHRvIEJpdEdvJ3MgcmVjb3Jkc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhZGQocGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgcGFyYW1zLFxuICAgICAgW10sXG4gICAgICBbXG4gICAgICAgICdwdWInLFxuICAgICAgICAnZW5jcnlwdGVkUHJ2JyxcbiAgICAgICAgJ2tleVR5cGUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICdzb3VyY2UnLFxuICAgICAgICAnb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlJyxcbiAgICAgICAgJ2VudGVycHJpc2UnLFxuICAgICAgICAnZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCcsXG4gICAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoJyxcbiAgICAgICAgJ3BhcmVudCcsXG4gICAgICAgICdzYWZlSWQnLFxuICAgICAgXVxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVLUlNFbWFpbCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy9rZXknKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgcHViOiBwYXJhbXMucHViLFxuICAgICAgICBjb21tb25QdWI6IHBhcmFtcy5jb21tb25QdWIsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiBwYXJhbXMuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGVuY3J5cHRlZFBydjogcGFyYW1zLmVuY3J5cHRlZFBydixcbiAgICAgICAgdHlwZTogcGFyYW1zLnR5cGUsXG4gICAgICAgIGtleVR5cGU6IHBhcmFtcy5rZXlUeXBlLFxuICAgICAgICBzb3VyY2U6IHBhcmFtcy5zb3VyY2UsXG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IHBhcmFtcy5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkLFxuICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBwYXJhbXMuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCxcbiAgICAgICAgcGFyZW50OiBwYXJhbXMucGFyZW50LFxuICAgICAgICBkaXNhYmxlS1JTRW1haWw6IHBhcmFtcy5kaXNhYmxlS1JTRW1haWwsXG4gICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgIGtleVNoYXJlczogcGFyYW1zLmtleVNoYXJlcyxcbiAgICAgICAgdXNlckdQR1B1YmxpY0tleTogcGFyYW1zLnVzZXJHUEdQdWJsaWNLZXksXG4gICAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogcGFyYW1zLmJhY2t1cEdQR1B1YmxpY0tleSxcbiAgICAgICAgYWxnb1VzZWQ6IHBhcmFtcy5hbGdvVXNlZCxcbiAgICAgICAgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSxcbiAgICAgICAgaXNNUEN2MjogcGFyYW1zLmlzTVBDdjIsXG4gICAgICAgIGNvaW5TcGVjaWZpYzogcGFyYW1zLmNvaW5TcGVjaWZpYyxcbiAgICAgICAgd2ViYXV0aG5EZXZpY2VzOiBwYXJhbXMud2ViYXV0aG5EZXZpY2VzLFxuICAgICAgICB3ZWJhdXRobkluZm86IHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIHNhZmVJZDogcGFyYW1zLnNhZmVJZCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQml0R28ga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMgKGVtcHR5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQml0R28ocGFyYW1zOiBDcmVhdGVCaXRHb09wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMuc291cmNlID0gJ2JpdGdvJztcblxuICAgIHRoaXMuYmFzZUNvaW4ucHJlQ3JlYXRlQml0R28ocGFyYW1zIGFzIGFueSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYWRkKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIgKG9wdGlvbmFsKVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwKHBhcmFtczogQ3JlYXRlQmFja3VwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHBhcmFtcy5zb3VyY2UgPSAnYmFja3VwJztcblxuICAgIGNvbnN0IGlzVHNzQmFja3VwS2V5ID0gcGFyYW1zLnBydiAmJiAocGFyYW1zLmNvbW1vbktleWNoYWluIHx8IHBhcmFtcy5jb21tb25QdWIpO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnByb3ZpZGVyKSAmJiAhaXNUc3NCYWNrdXBLZXkpIHtcbiAgICAgIC8vIGlmIHRoZSBwcm92aWRlciBpcyB1bmRlZmluZWQsIHdlIGdlbmVyYXRlIGEgbG9jYWwga2V5IGFuZCBhZGQgdGhlIHNvdXJjZSBkZXRhaWxzXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgXy5leHRlbmQocGFyYW1zLCBrZXkpO1xuICAgICAgaWYgKHBhcmFtcy5wYXNzcGhyYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgXy5leHRlbmQocGFyYW1zLCB7XG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IGtleS5wcnYsXG4gICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXYWxsZXQgU2FmZXMgdjEgc2xvdCDikaMgKGBlZDI1NTE5TXVsdGlzaWdgKTogc3RvcmUgbmV1dHJhbCByYXcgZGVyaXZhdGlvbiBtYXRlcmlhbCBhc1xuICAgIC8vIHB1YmxpY0tleTMyIHx8IGNoYWluQ29kZTMyLCBzZXJpYWxpemVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzJcbiAgICAvLyAoZXhhY3RseSAxMDMgdXBwZXJjYXNlIGNoYXJhY3RlcnMpLiBUaGUgcm9vdCBpcyBkZWxpYmVyYXRlbHkgbm90IGVuY29kZWQgYXMgYVxuICAgIC8vIFN0ZWxsYXIvQWxnb3JhbmQvSEJBUiBwdWJsaWMga2V5OyBjb2luLXNwZWNpZmljIGVuY29kaW5nIGhhcHBlbnMgYWZ0ZXIgcHVibGljIHNvZnRcbiAgICAvLyBkZXJpdmF0aW9uIHdoZW4gdGhlIHdhbGxldCBjaGlsZCBpcyBtaW50ZWQuXG4gICAgY29uc3Qgd2l0aEtleSA9IHBhcmFtcyBhcyBDcmVhdGVCYWNrdXBPcHRpb25zICYgeyBwdWI/OiBzdHJpbmcgfTtcbiAgICBpZiAocGFyYW1zLnNhZmVJZCAhPT0gdW5kZWZpbmVkICYmIHdpdGhLZXkucHViICE9PSB1bmRlZmluZWQgJiYgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkod2l0aEtleS5wdWIpKSB7XG4gICAgICB3aXRoS2V5LnB1YiA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSh3aXRoS2V5LnB1YiksIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMuYWRkKHBhcmFtcyk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBzZXJ2ZXJSZXNwb25zZSwgXy5waWNrKHBhcmFtcywgWydwcnYnLCAnZW5jcnlwdGVkUHJ2JywgJ3Byb3ZpZGVyJywgJ3NvdXJjZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXlzIGZvciBzaWduaW5nIGZyb20gYSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbltdPn1cbiAgICovXG4gIGFzeW5jIGdldEtleXNGb3JTaWduaW5nKHBhcmFtczogR2V0S2V5c0ZvclNpZ25pbmdPcHRpb25zID0ge30pOiBQcm9taXNlPEtleWNoYWluW10+IHtcbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLndhbGxldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB3YWxsZXQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2FsbGV0ID0gcGFyYW1zLndhbGxldDtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGlkcyA9IHdhbGxldC5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCk7XG4gICAgY29uc3Qga2V5Y2hhaW5RdWVyaWVzQmx1ZWJpcmRzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0KHsgaWQ6IHdhbGxldC5rZXlJZHMoKVtpZF0sIHJlcUlkIH0pKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoa2V5Y2hhaW5RdWVyaWVzQmx1ZWJpcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHN0b3JlIE1QQyBrZXljaGFpbnMgd2l0aCBCaXRHby5cbiAgICogQHBhcmFtIHBhcmFtcyBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCBzZWNyZXQgbWF0ZXJpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8S2V5Y2hhaW5zVHJpcGxldD59IG5ld2x5IGNyZWF0ZWQgVXNlciwgQmFja3VwLCBhbmQgQml0R28ga2V5c1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlTXBjKHBhcmFtczogQ3JlYXRlTXBjT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8ubXVsdGlTaWdUeXBlVmVyc2lvbjtcblxuICAgIGNvbnN0IGlzTVBDdjIgPSBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInO1xuICAgIGlmIChwYXJhbXMuc2FmZUlkICYmICFpc01QQ3YyKSB7XG4gICAgICAvLyBUaGUgbGVnYWN5IE1QQ3YxIGNlcmVtb25pZXMgYWNjZXB0IGEgc2FmZUlkIGZvciBzaWduYXR1cmUgY29tcGF0aWJpbGl0eSBidXQgc2lsZW50bHlcbiAgICAgIC8vIGlnbm9yZSBpdCAoc2VlIEVERFNBVXRpbHMuZGVmYXVsdC5jcmVhdGVLZXljaGFpbnMgLyBFQ0RTQVV0aWxzLkVjZHNhVXRpbHMuY3JlYXRlS2V5Y2hhaW5zKSxcbiAgICAgIC8vIHNvIHRoZSByZXN1bHRpbmcga2V5cyBuZXZlciBnZXQgdGFnZ2VkIHdpdGggdGhlIHNhZmUgYW5kIFdQJ3MgZmluYWxpemUgc3RlcCByZWplY3RzIHRoZW1cbiAgICAgIC8vIHdpdGggYSBnZW5lcmljIDQwMC4gRmFpbCBmYXN0IGhlcmUgaW5zdGVhZCBvZiBsZXR0aW5nIHRoYXQgY29uZnVzaW5nIGVycm9yIHN1cmZhY2UgbGF0ZXIuXG4gICAgICB0aHJvdyBuZXcgU2FmZU1wY0NlcmVtb255VW5zdXBwb3J0ZWRFcnJvcih0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKTtcbiAgICB9XG5cbiAgICAvLyBBIHNhZmVJZCBvbiBhIGtleWdlbiBjZXJlbW9ueSBzZWxlY3RzIHRoZSBWUkYgdmFyaWFudCwgd2hpY2ggYWRkaXRpb25hbGx5IHJ1bnMgdGhlXG4gICAgLy8gVlJGIERLRyBhbG9uZ3NpZGUgdGhlIHNpZ25pbmcgREtHLiBPcmRpbmFyeSBUU1Mgd2FsbGV0IGNyZWF0aW9uIG5ldmVyIHNldHMgc2FmZUlkXG4gICAgLy8gYW5kIGtlZXBzIHRoZSBwbGFpbiBNUEN2MiBmbG93LlxuICAgIGxldCBNcGNVdGlscztcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VkZHNhJykge1xuICAgICAgTXBjVXRpbHMgPSBpc01QQ3YyXG4gICAgICAgID8gcGFyYW1zLnNhZmVJZFxuICAgICAgICAgID8gRUREU0FVdGlscy5FZGRzYVZyZk1QQ3YyVXRpbHNcbiAgICAgICAgICA6IEVERFNBVXRpbHMuRWRkc2FNUEN2MlV0aWxzXG4gICAgICAgIDogRUREU0FVdGlscy5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBNcGNVdGlscyA9IGlzTVBDdjJcbiAgICAgICAgPyBwYXJhbXMuc2FmZUlkXG4gICAgICAgICAgPyBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlsc1xuICAgICAgICAgIDogRUNEU0FVdGlscy5FY2RzYU1QQ3YyVXRpbHNcbiAgICAgICAgOiBFQ0RTQVV0aWxzLkVjZHNhVXRpbHM7XG4gICAgfVxuXG4gICAgY29uc3QgbXBjVXRpbHMgPSBuZXcgTXBjVXRpbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbik7XG4gICAgcmV0dXJuIGF3YWl0IG1wY1V0aWxzLmNyZWF0ZUtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcmV0cm9maXQ6IHBhcmFtcy5yZXRyb2ZpdCxcbiAgICAgIHdlYmF1dGhuSW5mbzogcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBzYWZlSWQ6IHBhcmFtcy5zYWZlSWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWNyZWF0ZU1wYyhwYXJhbXM6IFJlY3JlYXRlTXBjT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGFzc2VydChwYXJhbXMuY29pbiwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGNvaW4nKSk7XG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHdhbGxldElkJykpO1xuICAgIGFzc2VydChwYXJhbXMub3RwLCBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gb3RwJykpO1xuICAgIGFzc2VydChwYXJhbXMucGFzc3BocmFzZSwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHBhc3NwaHJhc2UnKSk7XG5cbiAgICBhc3NlcnQoXG4gICAgICBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlJylcbiAgICApO1xuICAgIGFzc2VydChwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGVuY3J5cHRlZFVzZXJLZXknKSk7XG4gICAgYXNzZXJ0KHBhcmFtcy5lbmNyeXB0ZWRNYXRlcmlhbC5lbmNyeXB0ZWRCYWNrdXBLZXksIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRCYWNrdXBLZXknKSk7XG5cbiAgICBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YxL3VzZXIvdW5sb2NrJykpLnNlbmQoeyBvdHA6IHBhcmFtcy5vdHAgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgeyByZWNvdmVyeUluZm8gfSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybChgL2FwaS92Mi8ke3BhcmFtcy5jb2lufS93YWxsZXQvJHtwYXJhbXMud2FsbGV0SWR9L3Bhc3Njb2RlcmVjb3ZlcnlgKSlcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGlmICghcmVjb3ZlcnlJbmZvIHx8ICEoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUnIGluIHJlY292ZXJ5SW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCByZWNvdmVyeSBpbmZvJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZE1hdGVyaWFsLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBwYXNzd29yZDogcmVjb3ZlcnlJbmZvLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRVc2VyS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgIHBhc3N3b3JkOiBkZWNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQmFja3VwS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkQmFja3VwS2V5LFxuICAgICAgcGFzc3dvcmQ6IGRlY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNcGMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIHJldHJvZml0OiB7XG4gICAgICAgIGRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIGRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgcGFyc2VzIHRoZSBKU09OIGRvd25sb2FkZWQgZnJvbSB0aGUgT1ZDIGZvciBwbGF0Zm9ybSAoQml0R28pLFxuICAgKiBhbmQgY3JlYXRlcyBhIGNvcnJlc3BvbmRpbmcgVFNTIEJpdEdvIGtleS4gSXQgYWxzbyByZXR1cm5zIHRoZSBKU09OIHRoYXQgbmVlZHNcbiAgICogdG8gYmUgdXBsb2FkZWQgYmFjayB0byB0aGUgT1ZDcyBjb250YWluaW5nIHRoZSBCaXRHbyAtPiBPVkMgc2hhcmVzLlxuICAgKiBAcGFyYW0gb3ZjT3V0cHV0SnNvbiBKU09OIGZvcm1hdCBvZiB0aGUgZmlsZSBkb3dubG9hZGVkIGZyb20gdGhlIE9WQyBmb3IgcGxhdGZvcm1cbiAgICogQHBhcmFtIGVudGVycHJpc2UgT3B0aW9uYWwgZW50ZXJwcmlzZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICAgKiBAcmV0dXJucyB7Qml0R29LZXlGcm9tT3ZjU2hhcmVzfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVHNzQml0R29LZXlGcm9tT3ZjU2hhcmVzKG92Y091dHB1dEpzb246IHVua25vd24sIGVudGVycHJpc2U/OiBzdHJpbmcpOiBQcm9taXNlPEJpdEdvS2V5RnJvbU92Y1NoYXJlcz4ge1xuICAgIGNvbnN0IGRlY29kZWRPdmNPdXRwdXQgPSBkZWNvZGVPckVsc2UoT3ZjVG9CaXRHb0pTT04ubmFtZSwgT3ZjVG9CaXRHb0pTT04sIG92Y091dHB1dEpzb24sIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IocykgcGFyc2luZyBPVkMgSlNPTjogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGVjb2RlZE92Y091dHB1dC5zdGF0ZSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGF0ZSBleHBlY3RlZCB0byBiZSBcIjFcIi4gUGxlYXNlIGNvbXBsZXRlIHRoZSBmaXJzdCB0d28gT1ZDIG9wZXJhdGlvbnMnKTtcbiAgICB9XG5cbiAgICAvLyBPVkMtMSBpcyByZXNwb25zaWJsZSBmb3IgdGhlIFVzZXIga2V5XG4gICAgY29uc3Qgb3ZjMSA9IGRlY29kZWRPdmNPdXRwdXQub3ZjWzFdO1xuICAgIC8vIE9WQy0yIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgQmFja3VwIGtleVxuICAgIGNvbnN0IG92YzIgPSBkZWNvZGVkT3ZjT3V0cHV0Lm92Y1syXTtcblxuICAgIGNvbnN0IGtleVNoYXJlczogQXBpS2V5U2hhcmVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgcHVibGljU2hhcmU6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmU6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnVTaWcudG9TdHJpbmcoKSA/PyAnJyxcbiAgICAgICAgdnNzUHJvb2Y6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnZzc1Byb29mID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICBwdWJsaWNTaGFyZTogb3ZjMi5vdmNUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgIHByaXZhdGVTaGFyZTogb3ZjMi5vdmNUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogb3ZjMi5vdmNUb0JpdGdvU2hhcmUudVNpZy50b1N0cmluZygpID8/ICcnLFxuICAgICAgICB2c3NQcm9vZjogb3ZjMi5vdmNUb0JpdGdvU2hhcmUudnNzUHJvb2YgPz8gJycsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlTaGFyZXMsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IG92YzEuZ3BnUHViS2V5LFxuICAgICAgYmFja3VwR1BHUHVibGljS2V5OiBvdmMyLmdwZ1B1YktleSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgfSk7XG4gICAgYXNzZXJ0KGtleS5rZXlTaGFyZXMpO1xuICAgIGFzc2VydChrZXkuY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChrZXkud2FsbGV0SFNNR1BHUHVibGljS2V5U2lncyk7XG5cbiAgICBjb25zdCBiaXRnb1RvVXNlclNoYXJlID0ga2V5LmtleVNoYXJlcy5maW5kKFxuICAgICAgKHZhbHVlOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSA9PiB2YWx1ZS5mcm9tID09PSAnYml0Z28nICYmIHZhbHVlLnRvID09PSAndXNlcidcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvVXNlclNoYXJlKTtcbiAgICBhc3NlcnQoYml0Z29Ub1VzZXJTaGFyZS52c3NQcm9vZik7XG4gICAgYXNzZXJ0KGJpdGdvVG9Vc2VyU2hhcmUucGFpbGxpZXJQdWJsaWNLZXkpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBTaGFyZSA9IGtleS5rZXlTaGFyZXMuZmluZChcbiAgICAgICh2YWx1ZTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkgPT4gdmFsdWUuZnJvbSA9PT0gJ2JpdGdvJyAmJiB2YWx1ZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUudnNzUHJvb2YpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUucGFpbGxpZXJQdWJsaWNLZXkpO1xuXG4gICAgLy8gQ3JlYXRlIEpTT04gZGF0YSB3aXRoIHBsYXRmb3JtIHNoYXJlcyBmb3IgT1ZDLTEgYW5kIE9WQy0yXG4gICAgY29uc3QgYml0Z29Ub092Y091dHB1dDogQml0R29Ub092Y0pTT04gPSB7XG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLi4uZGVjb2RlZE92Y091dHB1dCxcbiAgICAgICAgcGxhdGZvcm06IHtcbiAgICAgICAgICBjb21tb25LZXljaGFpbjoga2V5LmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIHdhbGxldEdwZ1B1YktleVNpZ3M6IGtleS53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzLFxuICAgICAgICAgIG92Yzoge1xuICAgICAgICAgICAgLy8gQml0R28gdG8gVXNlciAoT1ZDLTEpXG4gICAgICAgICAgICAxOiB7XG4gICAgICAgICAgICAgIGJpdGdvVG9PdmNTaGFyZToge1xuICAgICAgICAgICAgICAgIGk6IDEsXG4gICAgICAgICAgICAgICAgajogMyxcbiAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogYml0Z29Ub1VzZXJTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6IGJpdGdvVG9Vc2VyU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICAgICAgICAgIHBhaWxsaWVyUHVibGljS2V5OiBiaXRnb1RvVXNlclNoYXJlLnBhaWxsaWVyUHVibGljS2V5LFxuICAgICAgICAgICAgICAgIHZzc1Byb29mOiBiaXRnb1RvVXNlclNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEJpdEdvIHRvIEJhY2t1cCAoT1ZDLTIpXG4gICAgICAgICAgICAyOiB7XG4gICAgICAgICAgICAgIGJpdGdvVG9PdmNTaGFyZToge1xuICAgICAgICAgICAgICAgIGk6IDIsXG4gICAgICAgICAgICAgICAgajogMyxcbiAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogYml0Z29Ub0JhY2t1cFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgICAgIHByaXZhdGVTaGFyZTogYml0Z29Ub0JhY2t1cFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgICAgICBwYWlsbGllclB1YmxpY0tleTogYml0Z29Ub0JhY2t1cFNoYXJlLnBhaWxsaWVyUHVibGljS2V5LFxuICAgICAgICAgICAgICAgIHZzc1Byb29mOiBiaXRnb1RvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBNYXJrIGl0IHJlYWR5IGZvciBuZXh0IG9wZXJhdGlvbiwgc2hvdWxkIGJlIDJcbiAgICBiaXRnb1RvT3ZjT3V0cHV0LndhbGxldC5zdGF0ZSArPSAxO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBCaXRHb0tleUZyb21PdmNTaGFyZXMgPSB7XG4gICAgICBiaXRHb0tleUlkOiBrZXkuaWQsXG4gICAgICBiaXRHb091dHB1dEpzb25Gb3JPdmM6IGJpdGdvVG9PdmNPdXRwdXQsXG4gICAgfTtcblxuICAgIHJldHVybiBkZWNvZGVPckVsc2UoQml0R29LZXlGcm9tT3ZjU2hhcmVzLm5hbWUsIEJpdEdvS2V5RnJvbU92Y1NoYXJlcywgb3V0cHV0LCAoZXJyb3JzKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHByb2R1Y2luZyB0aGUgb3V0cHV0OiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdXNlciBrZXljaGFpbiwgZW5jcnlwdCB0aGUgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgd2FsbGV0IHBhc3NwaHJhc2UgYW5kIHN0b3JlIGl0IGluIEJpdEdvLlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiBAcmV0dXJucyBLZXljaGFpbiBpbmNsdWRpbmcgdGhlIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVXNlcktleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIHNlc3Npb24/OiBJRW5jcnlwdGlvblNlc3Npb25cbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgbmV3S2V5Y2hhaW4gPSBrZXljaGFpbnMuY3JlYXRlKCk7XG4gICAgY29uc3Qgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlID0gZ2VuZXJhdGVSYW5kb21QYXNzd29yZCg1KTtcblxuICAgIC8vIFdoZW4gYSBzZXNzaW9uIGlzIHRocmVhZGVkIGluICh0eXBpY2FsbHkgZnJvbSBhIGJ1bGsgb3BlcmF0aW9uIHRoYXQgYWxyZWFkeSByYW4gdGhlIEtERlxuICAgIC8vIG9uY2UpLCByZXVzZSBpdCBzbyB0aGlzIGVudmVsb3BlJ3MgQUVTIGtleSBkZXJpdmVzIHZpYSBIS0RGIGluc3RlYWQgb2YgYW5vdGhlciBBcmdvbjIuXG4gICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gc2Vzc2lvblxuICAgICAgPyBhd2FpdCBzZXNzaW9uLmVuY3J5cHQobmV3S2V5Y2hhaW4ucHJ2KVxuICAgICAgOiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIGlucHV0OiBuZXdLZXljaGFpbi5wcnYsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHB1YjogbmV3S2V5Y2hhaW4ucHViLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIH0pKSxcbiAgICAgIHBydjogbmV3S2V5Y2hhaW4ucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUm90YXRlIGFuIG9mYyBtdWx0aS11c2VyLWtleWNoYWluIGJ5IHJlY3JlYXRpbmcgYSBuZXcga2V5cGFpciwgZW5jcnlwdCBpdCB1c2luZyB0aGUgdXNlciBwYXNzd29yZCBhbmQgc2VudCBpdCB0byBXUFxuICAgKiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IG9mYyBtdWx0aS11c2VyLXdhbGxldCdzIGtleSwgYW5kIHdpbGwgdGhyb3cgaWYgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBSZXF1aXJlcyAyZmEgYXV0aCBiZWZvcmUgY2FsbGluZy4gQ2FsbCB0aGUgYml0Z28udW5sb2NrKCkgU0RLIG1ldGhvZCB0byB1bmxvY2sgdGhlIHNlc3Npb24gZmlyc3QuXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdGhlIHJvdGF0ZSBrZXljaGFpbiBtZXRob2RcbiAgICogQHJldHVybiByb3RhdGVkS2V5Y2hhaW5cbiAgICovXG4gIGFzeW5jIHJvdGF0ZUtleWNoYWluKHBhcmFtczogUm90YXRlS2V5Y2hhaW5PcHRpb25zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGtleUNoYWluID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogcGFyYW1zLmlkIH0pO1xuICAgIGlmICghS2V5Y2hhaW5zLmlzTXVsdGlVc2VyS2V5KGtleUNoYWluKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByb3RhdGVLZXljaGFpbiBpcyBvbmx5IHBlcm1pdHRlZCBmb3Igb2ZjIG11bHRpLXVzZXIta2V5IHdhbGxldGApO1xuICAgIH1cblxuICAgIGxldCBwdWI6IHN0cmluZywgZW5jcnlwdGVkUHJ2OiBzdHJpbmc7XG4gICAgaWYgKCdlbmNyeXB0ZWRQcnYnIGluIHBhcmFtcykge1xuICAgICAgLy8gY2xpZW50IHBhc3NlZCBpbiBwdWIgYW5kIGVuY3J5cHRlZFBydiBkaXJlY3RseVxuICAgICAgcHViID0gcGFyYW1zLnB1YjtcbiAgICAgIGVuY3J5cHRlZFBydiA9IHBhcmFtcy5lbmNyeXB0ZWRQcnY7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGJpdGdvIGdlbmVyYXRlIHB1YiBhbmQgcHJ2IGFuZCBlbmNyeXB0IGl0XG4gICAgICBjb25zdCB7IHB1Yjoga2V5UHViLCBwcnY6IGtleVBydiB9ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgIGlmICgha2V5UHViKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBhIHB1YmxpYyBrZXkgdG8gYmUgZ2VuZXJhdGVkJyk7XG4gICAgICB9XG4gICAgICBwdWIgPSBrZXlQdWI7XG4gICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDoga2V5UHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iYXNlQ29pbi51cmwoYC9rZXkvJHtwYXJhbXMuaWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgICAgcHViLFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgaGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSBrZXljaGFpbiBpcyBhIG9mYyBtdWx0aS11c2VyLWtleVxuICAgKiBAcGFyYW0ga2V5Y2hhaW5cbiAgICovXG4gIHN0YXRpYyBpc011bHRpVXNlcktleShrZXljaGFpbjogS2V5Y2hhaW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGtleWNoYWluLmNvaW5TcGVjaWZpYz8ub2ZjPy5bJ2ZlYXR1cmVzJ10gPz8gW10pLmluY2x1ZGVzKCdtdWx0aS11c2VyLWtleScpO1xuICB9XG59XG4iXX0=
|
|
636
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxvREFBNEI7QUFDNUIsMENBQTRCO0FBQzVCLHFEQUF1QztBQUd2QyxzQ0FBNEQ7QUFDNUQsd0RBSzhCO0FBQzlCLG9DQUF1RztBQW1CdkcsaURBQXVGO0FBR3ZGLE1BQWEsU0FBUztJQUlwQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQTBCO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxD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RUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUNiLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUN0QyxLQUFLLEVBQUUsTUFBTTtnQkFDYixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7YUFDNUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMzQyxJQUFJLENBQUM7WUFDSixZQUFZO1lBQ1osR0FBRztZQUNILEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztTQUNwQixDQUFDO2FBQ0QsTUFBTSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFrQjtRQUN0QyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRixDQUFDO0NBQ0Y7QUFucEJELDhCQW1wQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUc3NTZXR0aW5ncyB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQsIEtleVBhaXIgfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgU2FmZU1wY0NlcmVtb255VW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5LFxuICBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViLFxuICBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGUsXG4gIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5LFxufSBmcm9tICdAYml0Z28vc2RrLWxpYi1zYWZlcyc7XG5pbXBvcnQgeyBkZWNvZGVPckVsc2UsIEVDRFNBVXRpbHMsIEVERFNBVXRpbHMsIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQsIFJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBZGRLZXljaGFpbk9wdGlvbnMsXG4gIEFwaUtleVNoYXJlLFxuICBDaGFuZ2VkS2V5Y2hhaW5zLFxuICBDcmVhdGVCYWNrdXBPcHRpb25zLFxuICBDcmVhdGVCaXRHb09wdGlvbnMsXG4gIENyZWF0ZU1wY09wdGlvbnMsXG4gIEdldEtleWNoYWluT3B0aW9ucyxcbiAgR2V0S2V5c0ZvclNpZ25pbmdPcHRpb25zLFxuICBJS2V5Y2hhaW5zLFxuICBLZXljaGFpbixcbiAgTGlzdEtleWNoYWluT3B0aW9ucyxcbiAgTGlzdEtleWNoYWluc1Jlc3VsdCxcbiAgUmVjcmVhdGVNcGNPcHRpb25zLFxuICBSb3RhdGVLZXljaGFpbk9wdGlvbnMsXG4gIFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyxcbiAgVXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZE9wdGlvbnMsXG59IGZyb20gJy4vaUtleWNoYWlucyc7XG5pbXBvcnQgeyBCaXRHb0tleUZyb21PdmNTaGFyZXMsIEJpdEdvVG9PdmNKU09OLCBPdmNUb0JpdEdvSlNPTiB9IGZyb20gJy4vb3ZjSnNvbkNvZGVjJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBJRW5jcnlwdGlvblNlc3Npb24gfSBmcm9tICcuLi8uLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgS2V5Y2hhaW5zIGltcGxlbWVudHMgSUtleWNoYWlucyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleWNoYWluIGJ5IElEXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5pZFxuICAgKiBAcGFyYW0gcGFyYW1zLnhwdWIgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLmV0aEFkZHJlc3MgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLnJlcUlkIChvcHRpb25hbClcbiAgICovXG4gIGFzeW5jIGdldChwYXJhbXM6IEdldEtleWNoYWluT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd4cHViJywgJ2V0aEFkZHJlc3MnXSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkO1xuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy9rZXkvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsaXN0IHRoZSB1c2VycyBrZXljaGFpbnNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpbWl0IC0gTWF4IG51bWJlciBvZiByZXN1bHRzIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMucHJldklkIC0gQ29udGludWUgaXRlcmF0aW5nIChwcm92aWRlZCBieSBuZXh0QmF0Y2hQcmV2SWQgaW4gdGhlIHByZXZpb3VzIGxpc3QpXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8TGlzdEtleWNoYWluc1Jlc3VsdD4ge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0OiBhbnkgPSB7fTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL2tleScpKS5xdWVyeShxdWVyeU9iamVjdCkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBkZWNyeXB0aW9uIHBhc3N3b3JkIGZvciBhbGwgcG9zc2libGUga2V5Y2hhaW5zIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgdGhyb3VnaCBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGRlY3J5cHRzXG4gICAqIHRoZW0gd2l0aCB0aGUgb2xkIHBhc3N3b3JkIGFuZCByZS1lbmNyeXB0cyB0aGVtIHdpdGggdGhlIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlaXIgbG9naW4gcGFzc3dvcmQsIGFuZCBhcmUgZXhwZWN0aW5nXG4gICAqIHRoYXQgdGhlaXIgd2FsbGV0IHBhc3N3b3JkcyBhcmUgY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IGxvZ2luIHBhc3N3b3JkLlxuICAgKlxuICAgKiBLZXljaGFpbnMgdGhhdCBjYW5ub3QgYmUgZGVjcnlwdGVkIHdpdGggYG9sZFBhc3N3b3JkYCBhcmUgc2lsZW50bHkgc2tpcHBlZFxuICAgKiAoYWJzZW50IGZyb20gdGhlIHJlc3VsdCk6IHdyb25nIHBhc3N3b3JkLCBhIGRpZmZlcmVudCBwYXNzcGhyYXNlLCBvclxuICAgKiBjb3JydXB0IGlucHV0LiBBbiBlbXB0eSByZXN1bHQgaXMgbm90IGFuIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMub2xkUGFzc3dvcmQgLSBUaGUgb2xkIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAgICogQHJldHVybnMgY2hhbmdlZEtleXMgT2JqZWN0IC0gZS5nLjpcbiAgICogIHtcbiAgICogICAgeHB1YjE6IGVuY3J5cHRlZFBydixcbiAgICogICAgLi4uXG4gICAqICB9XG4gICAqL1xuICBhc3luYyB1cGRhdGVQYXNzd29yZChwYXJhbXM6IFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8Q2hhbmdlZEtleWNoYWlucz4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnb2xkUGFzc3dvcmQnLCAnbmV3UGFzc3dvcmQnXSwgW10pO1xuICAgIGNvbnN0IGNoYW5nZWRLZXlzOiBDaGFuZ2VkS2V5Y2hhaW5zID0ge307XG4gICAgbGV0IHByZXZJZDtcbiAgICBsZXQga2V5c0xlZnQgPSB0cnVlO1xuICAgIHdoaWxlIChrZXlzTGVmdCkge1xuICAgICAgY29uc3QgcmVzdWx0OiBMaXN0S2V5Y2hhaW5zUmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0KHsgbGltaXQ6IDUwMCwgcHJldklkIH0pO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVzdWx0LmtleXMpIHtcbiAgICAgICAgY29uc3Qgb2xkRW5jcnlwdGVkUHJ2ID0ga2V5LmVuY3J5cHRlZFBydjtcbiAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQob2xkRW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEtleWNoYWluID0gYXdhaXQgdGhpcy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHtcbiAgICAgICAgICAgIGtleWNoYWluOiBrZXksXG4gICAgICAgICAgICBvbGRQYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkLFxuICAgICAgICAgICAgbmV3UGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2Vzc2lvbjogcGFyYW1zLmVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh1cGRhdGVkS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgICAvLyBCb3RoIFRTUyBhbmQgbXVsdGktdXNlci1vZmMga2V5cyBoYXZlIG11bHRpcGxlIHB1YmxpYyBrZXlzIGluIHRoZWlyIGtleSBkb2N1bWVudCBhbmQgdGh1cyBuZWVkIHRvIHVzZSBvYmplY3RJRFxuICAgICAgICAgICAgY29uc3QgY2hhbmdlZEtleUlkZW50aWZpZXIgPVxuICAgICAgICAgICAgICB1cGRhdGVkS2V5Y2hhaW4udHlwZSA9PT0gJ3RzcycgfHwgS2V5Y2hhaW5zLmlzTXVsdGlVc2VyS2V5KHVwZGF0ZWRLZXljaGFpbilcbiAgICAgICAgICAgICAgICA/IHVwZGF0ZWRLZXljaGFpbi5pZFxuICAgICAgICAgICAgICAgIDogdXBkYXRlZEtleWNoYWluLnB1YjtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkS2V5SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICBjaGFuZ2VkS2V5c1tjaGFuZ2VkS2V5SWRlbnRpZmllcl0gPSB1cGRhdGVkS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIEEgZGVjcnlwdCBmYWlsdXJlIGlzIHVzdWFsbHkgbm90IGEgd3JvbmcgcGFzc3dvcmQg4oCUIHRoZSBrZXljaGFpbiBtYXkgYmVcbiAgICAgICAgICAvLyBlbmNyeXB0ZWQgdW5kZXIgYSBkaWZmZXJlbnQgcGFzc3BocmFzZS4gdXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCB3cmFwc1xuICAgICAgICAgIC8vIHN1Y2ggZmFpbHVyZXMgYXMgJ2ZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQ6IC4uLic7IHJldGhyb3cgdGhlIHJlc3QuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWUubWVzc2FnZS5pbmNsdWRlcygncHJpdmF0ZSBrZXkgaXMgaW5jb3JyZWN0JykgJiZcbiAgICAgICAgICAgICFlLm1lc3NhZ2UuaW5jbHVkZXMoJ2ZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQubmV4dEJhdGNoUHJldklkKSB7XG4gICAgICAgIHByZXZJZCA9IHJlc3VsdC5uZXh0QmF0Y2hQcmV2SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzTGVmdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSBlbmNyeXB0aW9uIHZlcnNpb24gb2YgYSBjaXBoZXJ0ZXh0IGJ5IGluc3BlY3RpbmcgaXRzIFwidlwiIGZpZWxkLlxuICAgKiAgIC0gdjEgKFNKQ0wgLyBQQktERjItU0hBMjU2ICsgQUVTLTI1Ni1DQ00pOiBcInZcIiBhYnNlbnQgb3IgZXhwbGljaXRseSAxXG4gICAqICAgLSB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSk6IFwidlwiID09PSAyXG4gICAqIFRocm93cyBvbiB1bnJlY29nbml6ZWQgdmFsdWVzIHNvIGNhbGxlcnMgY2Fubm90IHNpbGVudGx5IG1pcy1oYW5kbGUgdW5rbm93biBlbnZlbG9wZXMuXG4gICAqL1xuICBnZXRFbmNyeXB0aW9uVmVyc2lvbihjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBFbmNyeXB0aW9uVmVyc2lvbiB7XG4gICAgbGV0IGVudmVsb3BlOiB7IHY/OiB1bmtub3duIH07XG4gICAgdHJ5IHtcbiAgICAgIGVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjaXBoZXJ0ZXh0IGVudmVsb3BlOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoZW52ZWxvcGUudiA9PT0gMikge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGlmIChlbnZlbG9wZS52ID09PSB1bmRlZmluZWQgfHwgZW52ZWxvcGUudiA9PT0gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGVuY3J5cHRpb24gdmVyc2lvbjogJHtTdHJpbmcoZW52ZWxvcGUudil9YCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwYXNzd29yZCB1c2VkIHRvIGRlY3J5cHQgYSBzaW5nbGUga2V5Y2hhaW4uIERlZmF1bHRzIHRvIHByZXNlcnZpbmcgdGhlXG4gICAqIHNvdXJjZSBlbnZlbG9wZSB2ZXJzaW9uICh2MSBzdGF5cyB2MSwgdjIgc3RheXMgdjIpLCBzbyB0aGlzIGlzIGEgbm8tb3Agd2l0aCByZXNwZWN0IHRvXG4gICAqIGVuY3J5cHRpb24gdmVyc2lvbiB1bmxlc3MgdGhlIGNhbGxlciBvcHRzIGluLiBQYXNzIGBlbmNyeXB0aW9uVmVyc2lvbjogMmAgdG8gZXhwbGljaXRseVxuICAgKiB1cGdyYWRlIGEgdjEgKFNKQ0wpIGtleWNoYWluIHRvIHYyIChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKSBhcyBwYXJ0IG9mIHRoZSBwYXNzd29yZCBjaGFuZ2VcbiAgICogKGUuZy4gb25jZSBhIGNhbGxlciBpcyByZWFkeSwgYWZ0ZXIgdGhlIFNlcHQgMTUgYnJlYWtpbmctY2hhbmdlIHdpbmRvdyBjbG9zZXMpLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMua2V5Y2hhaW4gLSBUaGUga2V5Y2hhaW4gd2hvc2UgcGFzc3dvcmQgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICogQHBhcmFtIHBhcmFtcy5vbGRQYXNzd29yZCAtIFRoZSBvbGQgcGFzc3dvcmQgdXNlZCBmb3IgZW5jcnlwdGluZyB0aGUga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uIC0gT3B0aW9uYWwgZW52ZWxvcGUgdmVyc2lvbiB0byBlbWl0OyBkZWZhdWx0cyB0byB0aGUgc291cmNlIGVudmVsb3BlJ3MgdmVyc2lvblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbj59XG4gICAqL1xuICBhc3luYyB1cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHBhcmFtczogVXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLm9sZFBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBvbGQgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLm5ld1Bhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBuZXcgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSB8fCAhXy5pc1N0cmluZyhwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBrZXljaGFpbiB0byBiZSBhbiBvYmplY3Qgd2l0aCBhbiBlbmNyeXB0ZWRQcnYgcHJvcGVydHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRFbmNyeXB0ZWRQcnYgPSBwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogb2xkRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkIH0pO1xuICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gcGFyYW1zLmVuY3J5cHRpb25TZXNzaW9uXG4gICAgICAgID8gYXdhaXQgcGFyYW1zLmVuY3J5cHRpb25TZXNzaW9uLmVuY3J5cHQoZGVjcnlwdGVkUHJ2KVxuICAgICAgICA6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICBpbnB1dDogZGVjcnlwdGVkUHJ2LFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24gPz8gdGhpcy5nZXRFbmNyeXB0aW9uVmVyc2lvbihvbGRFbmNyeXB0ZWRQcnYpLFxuICAgICAgICAgIH0pO1xuICAgICAgcmV0dXJuIF8uYXNzaWduKHt9LCBwYXJhbXMua2V5Y2hhaW4sIHsgZW5jcnlwdGVkUHJ2OiBuZXdFbmNyeXB0ZWRQcnYgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZGVjcnlwdGlvbiBmYWlsZWQ6IHdyb25nIHBhc3N3b3JkLCBkaWZmZXJlbnQgcGFzc3BocmFzZSwgb3IgY29ycnVwdCBpbnB1dFxuICAgICAgY29uc3QgZXJyb3JEZXRhaWwgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQ6ICR7ZXJyb3JEZXRhaWx9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY3J5cHQgYW4gZW5jcnlwdGVkIHByaXZhdGUga2V5IHdpdGggYHBhc3NwaHJhc2VgIGFuZCByZS1lbmNyeXB0IGl0IGFzIGEgdjJcbiAgICogKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pIGVudmVsb3BlIHdpdGggdGhlIHNhbWUgcGFzc3BocmFzZS5cbiAgICpcbiAgICogVXNlZCB0byB1cGdyYWRlIGxlZ2FjeSB2MSAoU0pDTCkgZW52ZWxvcGVzIHRvIHYyIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBhc3NwaHJhc2UuXG4gICAqIENhbGxlcnMgdGhhdCBuZWVkIHRvIHRyeSBhIGZhbGxiYWNrIHBhc3NwaHJhc2UgKGUuZy4gYW4gb3JpZ2luYWwgcGFzc3BocmFzZSBmcm9tXG4gICAqIGJlZm9yZSBhIHBhc3N3b3JkIHJvdGF0aW9uKSBzaG91bGQgaGFuZGxlIHRoYXQgdGhlbXNlbHZlcyDigJQgdGhpcyBwcmltaXRpdmUgZG9lcyBvbmVcbiAgICogdGhpbmcgYW5kIGxldHMgZGVjcnlwdGlvbiBlcnJvcnMgc3VyZmFjZSBkaXJlY3RseS5cbiAgICovXG4gIGFzeW5jIHJlZW5jcnlwdEFzVjIoZW5jcnlwdGVkUHJ2OiBzdHJpbmcsIHBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhc3NwaHJhc2UgfSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZW5jcnlwdCh7IGlucHV0OiBwcnYsIHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuc2VlZCBvcHRpb25hbCAtIHNlZWQgdG8gdXNlIGZvciBrZXlwYWlyIGdlbmVyYXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5pc1Jvb3RLZXkgb3B0aW9uYWwgLSB3aGV0aGVyIHRoZSByZXN1bHRpbmcga2V5cGFpciBzaG91bGQgYmUgYSByb290IGtleVxuICAgKiBAcmV0dXJucyB7S2V5UGFpcn0gLSB0aGUgZ2VuZXJhdGVkIGtleXBhaXJcbiAgICovXG4gIGNyZWF0ZShwYXJhbXM6IHsgc2VlZD86IEJ1ZmZlcjsgaXNSb290S2V5PzogYm9vbGVhbiB9ID0ge30pOiBLZXlQYWlyIHtcbiAgICBpZiAocGFyYW1zPy5pc1Jvb3RLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmdlbmVyYXRlUm9vdEtleVBhaXIocGFyYW1zLnNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5nZW5lcmF0ZUtleVBhaXIocGFyYW1zLnNlZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGtleWNoYWluIHRvIEJpdEdvJ3MgcmVjb3Jkc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhZGQocGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgcGFyYW1zLFxuICAgICAgW10sXG4gICAgICBbXG4gICAgICAgICdwdWInLFxuICAgICAgICAnZW5jcnlwdGVkUHJ2JyxcbiAgICAgICAgJ2tleVR5cGUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICdzb3VyY2UnLFxuICAgICAgICAnb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlJyxcbiAgICAgICAgJ2VudGVycHJpc2UnLFxuICAgICAgICAnZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCcsXG4gICAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoJyxcbiAgICAgICAgJ3BhcmVudCcsXG4gICAgICAgICdzYWZlSWQnLFxuICAgICAgXVxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVLUlNFbWFpbCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy9rZXknKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgcHViOiBwYXJhbXMucHViLFxuICAgICAgICBjb21tb25QdWI6IHBhcmFtcy5jb21tb25QdWIsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiBwYXJhbXMuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGVuY3J5cHRlZFBydjogcGFyYW1zLmVuY3J5cHRlZFBydixcbiAgICAgICAgdHlwZTogcGFyYW1zLnR5cGUsXG4gICAgICAgIGtleVR5cGU6IHBhcmFtcy5rZXlUeXBlLFxuICAgICAgICBzb3VyY2U6IHBhcmFtcy5zb3VyY2UsXG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IHBhcmFtcy5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkLFxuICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBwYXJhbXMuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCxcbiAgICAgICAgcGFyZW50OiBwYXJhbXMucGFyZW50LFxuICAgICAgICBkaXNhYmxlS1JTRW1haWw6IHBhcmFtcy5kaXNhYmxlS1JTRW1haWwsXG4gICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgIGtleVNoYXJlczogcGFyYW1zLmtleVNoYXJlcyxcbiAgICAgICAgdXNlckdQR1B1YmxpY0tleTogcGFyYW1zLnVzZXJHUEdQdWJsaWNLZXksXG4gICAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogcGFyYW1zLmJhY2t1cEdQR1B1YmxpY0tleSxcbiAgICAgICAgYWxnb1VzZWQ6IHBhcmFtcy5hbGdvVXNlZCxcbiAgICAgICAgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSxcbiAgICAgICAgaXNNUEN2MjogcGFyYW1zLmlzTVBDdjIsXG4gICAgICAgIGNvaW5TcGVjaWZpYzogcGFyYW1zLmNvaW5TcGVjaWZpYyxcbiAgICAgICAgd2ViYXV0aG5EZXZpY2VzOiBwYXJhbXMud2ViYXV0aG5EZXZpY2VzLFxuICAgICAgICB3ZWJhdXRobkluZm86IHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIHNhZmVJZDogcGFyYW1zLnNhZmVJZCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQml0R28ga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMgKGVtcHR5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQml0R28ocGFyYW1zOiBDcmVhdGVCaXRHb09wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMuc291cmNlID0gJ2JpdGdvJztcblxuICAgIHRoaXMuYmFzZUNvaW4ucHJlQ3JlYXRlQml0R28ocGFyYW1zIGFzIGFueSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYWRkKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIgKG9wdGlvbmFsKVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwKHBhcmFtczogQ3JlYXRlQmFja3VwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHBhcmFtcy5zb3VyY2UgPSAnYmFja3VwJztcblxuICAgIGNvbnN0IGlzVHNzQmFja3VwS2V5ID0gcGFyYW1zLnBydiAmJiAocGFyYW1zLmNvbW1vbktleWNoYWluIHx8IHBhcmFtcy5jb21tb25QdWIpO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnByb3ZpZGVyKSAmJiAhaXNUc3NCYWNrdXBLZXkpIHtcbiAgICAgIC8vIGlmIHRoZSBwcm92aWRlciBpcyB1bmRlZmluZWQsIHdlIGdlbmVyYXRlIGEgbG9jYWwga2V5IGFuZCBhZGQgdGhlIHNvdXJjZSBkZXRhaWxzXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgXy5leHRlbmQocGFyYW1zLCBrZXkpO1xuICAgICAgaWYgKHBhcmFtcy5wYXNzcGhyYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgXy5leHRlbmQocGFyYW1zLCB7XG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IGtleS5wcnYsXG4gICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXYWxsZXQgU2FmZXMgdjEgc2xvdCDikaMgKGBlZDI1NTE5TXVsdGlzaWdgKTogc3RvcmUgbmV1dHJhbCByYXcgZGVyaXZhdGlvbiBtYXRlcmlhbCBhc1xuICAgIC8vIHB1YmxpY0tleTMyIHx8IGNoYWluQ29kZTMyLCBzZXJpYWxpemVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzJcbiAgICAvLyAoZXhhY3RseSAxMDMgdXBwZXJjYXNlIGNoYXJhY3RlcnMpLiBUaGUgcm9vdCBpcyBkZWxpYmVyYXRlbHkgbm90IGVuY29kZWQgYXMgYVxuICAgIC8vIFN0ZWxsYXIvQWxnb3JhbmQvSEJBUiBwdWJsaWMga2V5OyBjb2luLXNwZWNpZmljIGVuY29kaW5nIGhhcHBlbnMgYWZ0ZXIgcHVibGljIHNvZnRcbiAgICAvLyBkZXJpdmF0aW9uIHdoZW4gdGhlIHdhbGxldCBjaGlsZCBpcyBtaW50ZWQuXG4gICAgY29uc3Qgd2l0aEtleSA9IHBhcmFtcyBhcyBDcmVhdGVCYWNrdXBPcHRpb25zICYgeyBwdWI/OiBzdHJpbmcgfTtcbiAgICBpZiAocGFyYW1zLnNhZmVJZCAhPT0gdW5kZWZpbmVkICYmIHdpdGhLZXkucHViICE9PSB1bmRlZmluZWQgJiYgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkod2l0aEtleS5wdWIpKSB7XG4gICAgICB3aXRoS2V5LnB1YiA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSh3aXRoS2V5LnB1YiksIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMuYWRkKHBhcmFtcyk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBzZXJ2ZXJSZXNwb25zZSwgXy5waWNrKHBhcmFtcywgWydwcnYnLCAnZW5jcnlwdGVkUHJ2JywgJ3Byb3ZpZGVyJywgJ3NvdXJjZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXlzIGZvciBzaWduaW5nIGZyb20gYSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbltdPn1cbiAgICovXG4gIGFzeW5jIGdldEtleXNGb3JTaWduaW5nKHBhcmFtczogR2V0S2V5c0ZvclNpZ25pbmdPcHRpb25zID0ge30pOiBQcm9taXNlPEtleWNoYWluW10+IHtcbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLndhbGxldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB3YWxsZXQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2FsbGV0ID0gcGFyYW1zLndhbGxldDtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGlkcyA9IHdhbGxldC5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCk7XG4gICAgY29uc3Qga2V5Y2hhaW5RdWVyaWVzQmx1ZWJpcmRzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0KHsgaWQ6IHdhbGxldC5rZXlJZHMoKVtpZF0sIHJlcUlkIH0pKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoa2V5Y2hhaW5RdWVyaWVzQmx1ZWJpcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHN0b3JlIE1QQyBrZXljaGFpbnMgd2l0aCBCaXRHby5cbiAgICogQHBhcmFtIHBhcmFtcyBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCBzZWNyZXQgbWF0ZXJpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8S2V5Y2hhaW5zVHJpcGxldD59IG5ld2x5IGNyZWF0ZWQgVXNlciwgQmFja3VwLCBhbmQgQml0R28ga2V5c1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlTXBjKHBhcmFtczogQ3JlYXRlTXBjT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8ubXVsdGlTaWdUeXBlVmVyc2lvbjtcblxuICAgIGNvbnN0IGlzTVBDdjIgPSBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInO1xuICAgIGlmIChwYXJhbXMuc2FmZUlkICYmICFpc01QQ3YyKSB7XG4gICAgICAvLyBUaGUgbGVnYWN5IE1QQ3YxIGNlcmVtb25pZXMgYWNjZXB0IGEgc2FmZUlkIGZvciBzaWduYXR1cmUgY29tcGF0aWJpbGl0eSBidXQgc2lsZW50bHlcbiAgICAgIC8vIGlnbm9yZSBpdCAoc2VlIEVERFNBVXRpbHMuZGVmYXVsdC5jcmVhdGVLZXljaGFpbnMgLyBFQ0RTQVV0aWxzLkVjZHNhVXRpbHMuY3JlYXRlS2V5Y2hhaW5zKSxcbiAgICAgIC8vIHNvIHRoZSByZXN1bHRpbmcga2V5cyBuZXZlciBnZXQgdGFnZ2VkIHdpdGggdGhlIHNhZmUgYW5kIFdQJ3MgZmluYWxpemUgc3RlcCByZWplY3RzIHRoZW1cbiAgICAgIC8vIHdpdGggYSBnZW5lcmljIDQwMC4gRmFpbCBmYXN0IGhlcmUgaW5zdGVhZCBvZiBsZXR0aW5nIHRoYXQgY29uZnVzaW5nIGVycm9yIHN1cmZhY2UgbGF0ZXIuXG4gICAgICB0aHJvdyBuZXcgU2FmZU1wY0NlcmVtb255VW5zdXBwb3J0ZWRFcnJvcih0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKTtcbiAgICB9XG5cbiAgICAvLyBBIHNhZmVJZCBvbiBhIGtleWdlbiBjZXJlbW9ueSBzZWxlY3RzIHRoZSBWUkYgdmFyaWFudCwgd2hpY2ggYWRkaXRpb25hbGx5IHJ1bnMgdGhlXG4gICAgLy8gVlJGIERLRyBhbG9uZ3NpZGUgdGhlIHNpZ25pbmcgREtHLiBPcmRpbmFyeSBUU1Mgd2FsbGV0IGNyZWF0aW9uIG5ldmVyIHNldHMgc2FmZUlkXG4gICAgLy8gYW5kIGtlZXBzIHRoZSBwbGFpbiBNUEN2MiBmbG93LlxuICAgIGxldCBNcGNVdGlscztcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VkZHNhJykge1xuICAgICAgTXBjVXRpbHMgPSBpc01QQ3YyXG4gICAgICAgID8gcGFyYW1zLnNhZmVJZFxuICAgICAgICAgID8gRUREU0FVdGlscy5FZGRzYVZyZk1QQ3YyVXRpbHNcbiAgICAgICAgICA6IEVERFNBVXRpbHMuRWRkc2FNUEN2MlV0aWxzXG4gICAgICAgIDogRUREU0FVdGlscy5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBNcGNVdGlscyA9IGlzTVBDdjJcbiAgICAgICAgPyBwYXJhbXMuc2FmZUlkXG4gICAgICAgICAgPyBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlsc1xuICAgICAgICAgIDogRUNEU0FVdGlscy5FY2RzYU1QQ3YyVXRpbHNcbiAgICAgICAgOiBFQ0RTQVV0aWxzLkVjZHNhVXRpbHM7XG4gICAgfVxuXG4gICAgY29uc3QgbXBjVXRpbHMgPSBuZXcgTXBjVXRpbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbik7XG4gICAgcmV0dXJuIGF3YWl0IG1wY1V0aWxzLmNyZWF0ZUtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcmV0cm9maXQ6IHBhcmFtcy5yZXRyb2ZpdCxcbiAgICAgIHdlYmF1dGhuSW5mbzogcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBzYWZlSWQ6IHBhcmFtcy5zYWZlSWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWNyZWF0ZU1wYyhwYXJhbXM6IFJlY3JlYXRlTXBjT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGFzc2VydChwYXJhbXMuY29pbiwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGNvaW4nKSk7XG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHdhbGxldElkJykpO1xuICAgIGFzc2VydChwYXJhbXMub3RwLCBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gb3RwJykpO1xuICAgIGFzc2VydChwYXJhbXMucGFzc3BocmFzZSwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHBhc3NwaHJhc2UnKSk7XG5cbiAgICBhc3NlcnQoXG4gICAgICBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlJylcbiAgICApO1xuICAgIGFzc2VydChwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGVuY3J5cHRlZFVzZXJLZXknKSk7XG4gICAgYXNzZXJ0KHBhcmFtcy5lbmNyeXB0ZWRNYXRlcmlhbC5lbmNyeXB0ZWRCYWNrdXBLZXksIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRCYWNrdXBLZXknKSk7XG5cbiAgICBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YxL3VzZXIvdW5sb2NrJykpLnNlbmQoeyBvdHA6IHBhcmFtcy5vdHAgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgeyByZWNvdmVyeUluZm8gfSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybChgL2FwaS92Mi8ke3BhcmFtcy5jb2lufS93YWxsZXQvJHtwYXJhbXMud2FsbGV0SWR9L3Bhc3Njb2RlcmVjb3ZlcnlgKSlcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGlmICghcmVjb3ZlcnlJbmZvIHx8ICEoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUnIGluIHJlY292ZXJ5SW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCByZWNvdmVyeSBpbmZvJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZE1hdGVyaWFsLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBwYXNzd29yZDogcmVjb3ZlcnlJbmZvLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRVc2VyS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgIHBhc3N3b3JkOiBkZWNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQmFja3VwS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkQmFja3VwS2V5LFxuICAgICAgcGFzc3dvcmQ6IGRlY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNcGMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIHJldHJvZml0OiB7XG4gICAgICAgIGRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIGRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgcGFyc2VzIHRoZSBKU09OIGRvd25sb2FkZWQgZnJvbSB0aGUgT1ZDIGZvciBwbGF0Zm9ybSAoQml0R28pLFxuICAgKiBhbmQgY3JlYXRlcyBhIGNvcnJlc3BvbmRpbmcgVFNTIEJpdEdvIGtleS4gSXQgYWxzbyByZXR1cm5zIHRoZSBKU09OIHRoYXQgbmVlZHNcbiAgICogdG8gYmUgdXBsb2FkZWQgYmFjayB0byB0aGUgT1ZDcyBjb250YWluaW5nIHRoZSBCaXRHbyAtPiBPVkMgc2hhcmVzLlxuICAgKiBAcGFyYW0gb3ZjT3V0cHV0SnNvbiBKU09OIGZvcm1hdCBvZiB0aGUgZmlsZSBkb3dubG9hZGVkIGZyb20gdGhlIE9WQyBmb3IgcGxhdGZvcm1cbiAgICogQHBhcmFtIGVudGVycHJpc2UgT3B0aW9uYWwgZW50ZXJwcmlzZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICAgKiBAcmV0dXJucyB7Qml0R29LZXlGcm9tT3ZjU2hhcmVzfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVHNzQml0R29LZXlGcm9tT3ZjU2hhcmVzKG92Y091dHB1dEpzb246IHVua25vd24sIGVudGVycHJpc2U/OiBzdHJpbmcpOiBQcm9taXNlPEJpdEdvS2V5RnJvbU92Y1NoYXJlcz4ge1xuICAgIGNvbnN0IGRlY29kZWRPdmNPdXRwdXQgPSBkZWNvZGVPckVsc2UoT3ZjVG9CaXRHb0pTT04ubmFtZSwgT3ZjVG9CaXRHb0pTT04sIG92Y091dHB1dEpzb24sIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IocykgcGFyc2luZyBPVkMgSlNPTjogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGVjb2RlZE92Y091dHB1dC5zdGF0ZSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGF0ZSBleHBlY3RlZCB0byBiZSBcIjFcIi4gUGxlYXNlIGNvbXBsZXRlIHRoZSBmaXJzdCB0d28gT1ZDIG9wZXJhdGlvbnMnKTtcbiAgICB9XG5cbiAgICAvLyBPVkMtMSBpcyByZXNwb25zaWJsZSBmb3IgdGhlIFVzZXIga2V5XG4gICAgY29uc3Qgb3ZjMSA9IGRlY29kZWRPdmNPdXRwdXQub3ZjWzFdO1xuICAgIC8vIE9WQy0yIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgQmFja3VwIGtleVxuICAgIGNvbnN0IG92YzIgPSBkZWNvZGVkT3ZjT3V0cHV0Lm92Y1syXTtcblxuICAgIGNvbnN0IGtleVNoYXJlczogQXBpS2V5U2hhcmVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgcHVibGljU2hhcmU6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmU6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnVTaWcudG9TdHJpbmcoKSA/PyAnJyxcbiAgICAgICAgdnNzUHJvb2Y6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnZzc1Byb29mID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICBwdWJsaWNTaGFyZTogb3ZjMi5vdmNUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgIHByaXZhdGVTaGFyZTogb3ZjMi5vdmNUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogb3ZjMi5vdmNUb0JpdGdvU2hhcmUudVNpZy50b1N0cmluZygpID8/ICcnLFxuICAgICAgICB2c3NQcm9vZjogb3ZjMi5vdmNUb0JpdGdvU2hhcmUudnNzUHJvb2YgPz8gJycsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlTaGFyZXMsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IG92YzEuZ3BnUHViS2V5LFxuICAgICAgYmFja3VwR1BHUHVibGljS2V5OiBvdmMyLmdwZ1B1YktleSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgfSk7XG4gICAgYXNzZXJ0KGtleS5rZXlTaGFyZXMpO1xuICAgIGFzc2VydChrZXkuY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChrZXkud2FsbGV0SFNNR1BHUHVibGljS2V5U2lncyk7XG5cbiAgICBjb25zdCBiaXRnb1RvVXNlclNoYXJlID0ga2V5LmtleVNoYXJlcy5maW5kKFxuICAgICAgKHZhbHVlOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSA9PiB2YWx1ZS5mcm9tID09PSAnYml0Z28nICYmIHZhbHVlLnRvID09PSAndXNlcidcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvVXNlclNoYXJlKTtcbiAgICBhc3NlcnQoYml0Z29Ub1VzZXJTaGFyZS52c3NQcm9vZik7XG4gICAgYXNzZXJ0KGJpdGdvVG9Vc2VyU2hhcmUucGFpbGxpZXJQdWJsaWNLZXkpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBTaGFyZSA9IGtleS5rZXlTaGFyZXMuZmluZChcbiAgICAgICh2YWx1ZTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkgPT4gdmFsdWUuZnJvbSA9PT0gJ2JpdGdvJyAmJiB2YWx1ZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUudnNzUHJvb2YpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUucGFpbGxpZXJQdWJsaWNLZXkpO1xuXG4gICAgLy8gQ3JlYXRlIEpTT04gZGF0YSB3aXRoIHBsYXRmb3JtIHNoYXJlcyBmb3IgT1ZDLTEgYW5kIE9WQy0yXG4gICAgY29uc3QgYml0Z29Ub092Y091dHB1dDogQml0R29Ub092Y0pTT04gPSB7XG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLi4uZGVjb2RlZE92Y091dHB1dCxcbiAgICAgICAgcGxhdGZvcm06IHtcbiAgICAgICAgICBjb21tb25LZXljaGFpbjoga2V5LmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIHdhbGxldEdwZ1B1YktleVNpZ3M6IGtleS53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzLFxuICAgICAgICAgIG92Yzoge1xuICAgICAgICAgICAgLy8gQml0R28gdG8gVXNlciAoT1ZDLTEpXG4gICAgICAgICAgICAxOiB7XG4gICAgICAgICAgICAgIGJpdGdvVG9PdmNTaGFyZToge1xuICAgICAgICAgICAgICAgIGk6IDEsXG4gICAgICAgICAgICAgICAgajogMyxcbiAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogYml0Z29Ub1VzZXJTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6IGJpdGdvVG9Vc2VyU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICAgICAgICAgIHBhaWxsaWVyUHVibGljS2V5OiBiaXRnb1RvVXNlclNoYXJlLnBhaWxsaWVyUHVibGljS2V5LFxuICAgICAgICAgICAgICAgIHZzc1Byb29mOiBiaXRnb1RvVXNlclNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEJpdEdvIHRvIEJhY2t1cCAoT1ZDLTIpXG4gICAgICAgICAgICAyOiB7XG4gICAgICAgICAgICAgIGJpdGdvVG9PdmNTaGFyZToge1xuICAgICAgICAgICAgICAgIGk6IDIsXG4gICAgICAgICAgICAgICAgajogMyxcbiAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogYml0Z29Ub0JhY2t1cFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgICAgIHByaXZhdGVTaGFyZTogYml0Z29Ub0JhY2t1cFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgICAgICBwYWlsbGllclB1YmxpY0tleTogYml0Z29Ub0JhY2t1cFNoYXJlLnBhaWxsaWVyUHVibGljS2V5LFxuICAgICAgICAgICAgICAgIHZzc1Byb29mOiBiaXRnb1RvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBNYXJrIGl0IHJlYWR5IGZvciBuZXh0IG9wZXJhdGlvbiwgc2hvdWxkIGJlIDJcbiAgICBiaXRnb1RvT3ZjT3V0cHV0LndhbGxldC5zdGF0ZSArPSAxO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBCaXRHb0tleUZyb21PdmNTaGFyZXMgPSB7XG4gICAgICBiaXRHb0tleUlkOiBrZXkuaWQsXG4gICAgICBiaXRHb091dHB1dEpzb25Gb3JPdmM6IGJpdGdvVG9PdmNPdXRwdXQsXG4gICAgfTtcblxuICAgIHJldHVybiBkZWNvZGVPckVsc2UoQml0R29LZXlGcm9tT3ZjU2hhcmVzLm5hbWUsIEJpdEdvS2V5RnJvbU92Y1NoYXJlcywgb3V0cHV0LCAoZXJyb3JzKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHByb2R1Y2luZyB0aGUgb3V0cHV0OiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdXNlciBrZXljaGFpbiwgZW5jcnlwdCB0aGUgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgd2FsbGV0IHBhc3NwaHJhc2UgYW5kIHN0b3JlIGl0IGluIEJpdEdvLlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiBAcmV0dXJucyBLZXljaGFpbiBpbmNsdWRpbmcgdGhlIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVXNlcktleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIHNlc3Npb24/OiBJRW5jcnlwdGlvblNlc3Npb25cbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgbmV3S2V5Y2hhaW4gPSBrZXljaGFpbnMuY3JlYXRlKCk7XG4gICAgY29uc3Qgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlID0gZ2VuZXJhdGVSYW5kb21QYXNzd29yZCg1KTtcblxuICAgIC8vIFdoZW4gYSBzZXNzaW9uIGlzIHRocmVhZGVkIGluICh0eXBpY2FsbHkgZnJvbSBhIGJ1bGsgb3BlcmF0aW9uIHRoYXQgYWxyZWFkeSByYW4gdGhlIEtERlxuICAgIC8vIG9uY2UpLCByZXVzZSBpdCBzbyB0aGlzIGVudmVsb3BlJ3MgQUVTIGtleSBkZXJpdmVzIHZpYSBIS0RGIGluc3RlYWQgb2YgYW5vdGhlciBBcmdvbjIuXG4gICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gc2Vzc2lvblxuICAgICAgPyBhd2FpdCBzZXNzaW9uLmVuY3J5cHQobmV3S2V5Y2hhaW4ucHJ2KVxuICAgICAgOiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIGlucHV0OiBuZXdLZXljaGFpbi5wcnYsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHB1YjogbmV3S2V5Y2hhaW4ucHViLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIH0pKSxcbiAgICAgIHBydjogbmV3S2V5Y2hhaW4ucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUm90YXRlIGFuIG9mYyBtdWx0aS11c2VyLWtleWNoYWluIGJ5IHJlY3JlYXRpbmcgYSBuZXcga2V5cGFpciwgZW5jcnlwdCBpdCB1c2luZyB0aGUgdXNlciBwYXNzd29yZCBhbmQgc2VudCBpdCB0byBXUFxuICAgKiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IG9mYyBtdWx0aS11c2VyLXdhbGxldCdzIGtleSwgYW5kIHdpbGwgdGhyb3cgaWYgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBSZXF1aXJlcyAyZmEgYXV0aCBiZWZvcmUgY2FsbGluZy4gQ2FsbCB0aGUgYml0Z28udW5sb2NrKCkgU0RLIG1ldGhvZCB0byB1bmxvY2sgdGhlIHNlc3Npb24gZmlyc3QuXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdGhlIHJvdGF0ZSBrZXljaGFpbiBtZXRob2RcbiAgICogQHJldHVybiByb3RhdGVkS2V5Y2hhaW5cbiAgICovXG4gIGFzeW5jIHJvdGF0ZUtleWNoYWluKHBhcmFtczogUm90YXRlS2V5Y2hhaW5PcHRpb25zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGtleUNoYWluID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogcGFyYW1zLmlkIH0pO1xuICAgIGlmICghS2V5Y2hhaW5zLmlzTXVsdGlVc2VyS2V5KGtleUNoYWluKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByb3RhdGVLZXljaGFpbiBpcyBvbmx5IHBlcm1pdHRlZCBmb3Igb2ZjIG11bHRpLXVzZXIta2V5IHdhbGxldGApO1xuICAgIH1cblxuICAgIGxldCBwdWI6IHN0cmluZywgZW5jcnlwdGVkUHJ2OiBzdHJpbmc7XG4gICAgaWYgKCdlbmNyeXB0ZWRQcnYnIGluIHBhcmFtcykge1xuICAgICAgLy8gY2xpZW50IHBhc3NlZCBpbiBwdWIgYW5kIGVuY3J5cHRlZFBydiBkaXJlY3RseVxuICAgICAgcHViID0gcGFyYW1zLnB1YjtcbiAgICAgIGVuY3J5cHRlZFBydiA9IHBhcmFtcy5lbmNyeXB0ZWRQcnY7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGJpdGdvIGdlbmVyYXRlIHB1YiBhbmQgcHJ2IGFuZCBlbmNyeXB0IGl0XG4gICAgICBjb25zdCB7IHB1Yjoga2V5UHViLCBwcnY6IGtleVBydiB9ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgIGlmICgha2V5UHViKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBhIHB1YmxpYyBrZXkgdG8gYmUgZ2VuZXJhdGVkJyk7XG4gICAgICB9XG4gICAgICBwdWIgPSBrZXlQdWI7XG4gICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDoga2V5UHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iYXNlQ29pbi51cmwoYC9rZXkvJHtwYXJhbXMuaWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgICAgcHViLFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgaGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSBrZXljaGFpbiBpcyBhIG9mYyBtdWx0aS11c2VyLWtleVxuICAgKiBAcGFyYW0ga2V5Y2hhaW5cbiAgICovXG4gIHN0YXRpYyBpc011bHRpVXNlcktleShrZXljaGFpbjogS2V5Y2hhaW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGtleWNoYWluLmNvaW5TcGVjaWZpYz8ub2ZjPy5bJ2ZlYXR1cmVzJ10gPz8gW10pLmluY2x1ZGVzKCdtdWx0aS11c2VyLWtleScpO1xuICB9XG59XG4iXX0=
|
|
@@ -4,28 +4,10 @@
|
|
|
4
4
|
* Safe backup and BitGo roots store raw public key (32 bytes) || raw chain code (32 bytes),
|
|
5
5
|
* encoded together as canonical unpadded RFC 4648 base32. Coin-specific public-key encodings are
|
|
6
6
|
* applied only to derived wallet children.
|
|
7
|
+
*
|
|
8
|
+
* The pure codecs + composite-pub encoding moved to @bitgo/sdk-lib-safes. Only the WASM
|
|
9
|
+
* soft-derivation remains here (it needs Ed25519BIP32/Eddsa, which live in sdk-core).
|
|
7
10
|
*/
|
|
8
|
-
export declare const DERIVABLE_ED25519_PUBLIC_KEY_BYTES = 32;
|
|
9
|
-
export declare const DERIVABLE_ED25519_CHAIN_CODE_BYTES = 32;
|
|
10
|
-
export declare const DERIVABLE_ED25519_PUB_LENGTH = 103;
|
|
11
|
-
/** Returns true for canonical base32-encoded 64-byte public derivation material. */
|
|
12
|
-
export declare function isDerivableEd25519Pub(pub: string): boolean;
|
|
13
|
-
/** Throws unless the value is canonical base32-encoded 64-byte root material. */
|
|
14
|
-
export declare function assertDerivableEd25519Pub(pub: string): void;
|
|
15
|
-
/** Compose raw public-key and chain-code bytes into one base32 root value. */
|
|
16
|
-
export declare function encodeDerivableEd25519Pub(pub: Buffer, chainCode: Buffer): string;
|
|
17
|
-
/** Decode a base32 root into raw public-key and chain-code buffers. */
|
|
18
|
-
export declare function decodeDerivableEd25519Pub(composite: string): {
|
|
19
|
-
pub: Buffer;
|
|
20
|
-
chainCode: Buffer;
|
|
21
|
-
};
|
|
22
|
-
/** Generate a fresh raw 32-byte chain code for root composition. */
|
|
23
|
-
export declare function generateEd25519ChainCode(): Buffer;
|
|
24
|
-
export declare function decodeEd25519StrKeyPublicKey(pub: string): Buffer;
|
|
25
|
-
export declare function isValidEd25519StrKeyPublicKey(pub: string): boolean;
|
|
26
|
-
export declare function decodeEd25519StrKeySecretSeed(seed: string): Buffer;
|
|
27
|
-
export declare function encodeEd25519StrKeyPublicKey(rawPub: Buffer): string;
|
|
28
|
-
export declare function isChecksumValidStrKeyEd25519Pub(pub: string): boolean;
|
|
29
11
|
/** Soft-derive `m/<index>` and return the derived raw 32-byte public key. */
|
|
30
12
|
export declare function softDeriveChildPubEd25519(compositePub: string, index: number): Promise<Buffer>;
|
|
31
13
|
//# sourceMappingURL=derivableEd25519Pub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derivableEd25519Pub.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/derivableEd25519Pub.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"derivableEd25519Pub.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/derivableEd25519Pub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,6EAA6E;AAC7E,wBAAsB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpG"}
|
|
@@ -5,153 +5,14 @@
|
|
|
5
5
|
* Safe backup and BitGo roots store raw public key (32 bytes) || raw chain code (32 bytes),
|
|
6
6
|
* encoded together as canonical unpadded RFC 4648 base32. Coin-specific public-key encodings are
|
|
7
7
|
* applied only to derived wallet children.
|
|
8
|
+
*
|
|
9
|
+
* The pure codecs + composite-pub encoding moved to @bitgo/sdk-lib-safes. Only the WASM
|
|
10
|
+
* soft-derivation remains here (it needs Ed25519BIP32/Eddsa, which live in sdk-core).
|
|
8
11
|
*/
|
|
9
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.DERIVABLE_ED25519_PUB_LENGTH = exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES = exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES = void 0;
|
|
11
|
-
exports.isDerivableEd25519Pub = isDerivableEd25519Pub;
|
|
12
|
-
exports.assertDerivableEd25519Pub = assertDerivableEd25519Pub;
|
|
13
|
-
exports.encodeDerivableEd25519Pub = encodeDerivableEd25519Pub;
|
|
14
|
-
exports.decodeDerivableEd25519Pub = decodeDerivableEd25519Pub;
|
|
15
|
-
exports.generateEd25519ChainCode = generateEd25519ChainCode;
|
|
16
|
-
exports.decodeEd25519StrKeyPublicKey = decodeEd25519StrKeyPublicKey;
|
|
17
|
-
exports.isValidEd25519StrKeyPublicKey = isValidEd25519StrKeyPublicKey;
|
|
18
|
-
exports.decodeEd25519StrKeySecretSeed = decodeEd25519StrKeySecretSeed;
|
|
19
|
-
exports.encodeEd25519StrKeyPublicKey = encodeEd25519StrKeyPublicKey;
|
|
20
|
-
exports.isChecksumValidStrKeyEd25519Pub = isChecksumValidStrKeyEd25519Pub;
|
|
21
13
|
exports.softDeriveChildPubEd25519 = softDeriveChildPubEd25519;
|
|
22
|
-
const crypto_1 = require("crypto");
|
|
23
14
|
const account_lib_1 = require("../../account-lib");
|
|
24
|
-
|
|
25
|
-
exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES = 32;
|
|
26
|
-
exports.DERIVABLE_ED25519_PUB_LENGTH = 103;
|
|
27
|
-
const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
28
|
-
const BASE32_ROOT_REGEX = /^[A-Z2-7]{103}$/;
|
|
29
|
-
const STRKEY_PUBLIC_KEY_REGEX = /^G[A-Z2-7]{55}$/;
|
|
30
|
-
const STRKEY_SECRET_SEED_REGEX = /^S[A-Z2-7]{55}$/;
|
|
31
|
-
const STRKEY_VERSION_PUBLIC_KEY = 6 << 3;
|
|
32
|
-
const STRKEY_VERSION_SECRET_SEED = 18 << 3;
|
|
33
|
-
const STRKEY_DECODED_BYTES = 35;
|
|
34
|
-
function base32Decode(input) {
|
|
35
|
-
const output = Buffer.alloc(Math.floor((input.length * 5) / 8));
|
|
36
|
-
let bits = 0;
|
|
37
|
-
let value = 0;
|
|
38
|
-
let offset = 0;
|
|
39
|
-
for (const char of input) {
|
|
40
|
-
value = (value << 5) | BASE32_ALPHABET.indexOf(char);
|
|
41
|
-
bits += 5;
|
|
42
|
-
if (bits >= 8) {
|
|
43
|
-
bits -= 8;
|
|
44
|
-
output[offset++] = (value >>> bits) & 0xff;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return output;
|
|
48
|
-
}
|
|
49
|
-
function base32Encode(data) {
|
|
50
|
-
let bits = 0;
|
|
51
|
-
let value = 0;
|
|
52
|
-
let output = '';
|
|
53
|
-
for (const byte of data) {
|
|
54
|
-
value = (value << 8) | byte;
|
|
55
|
-
bits += 8;
|
|
56
|
-
while (bits >= 5) {
|
|
57
|
-
bits -= 5;
|
|
58
|
-
output += BASE32_ALPHABET[(value >>> bits) & 0x1f];
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (bits > 0) {
|
|
62
|
-
output += BASE32_ALPHABET[(value << (5 - bits)) & 0x1f];
|
|
63
|
-
}
|
|
64
|
-
return output;
|
|
65
|
-
}
|
|
66
|
-
function crc16Xmodem(data) {
|
|
67
|
-
let crc = 0;
|
|
68
|
-
for (const byte of data) {
|
|
69
|
-
crc ^= byte << 8;
|
|
70
|
-
for (let bit = 0; bit < 8; bit++) {
|
|
71
|
-
crc = crc & 0x8000 ? ((crc << 1) ^ 0x1021) & 0xffff : (crc << 1) & 0xffff;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return crc;
|
|
75
|
-
}
|
|
76
|
-
function decodeStrKey(value, version, label) {
|
|
77
|
-
const decoded = base32Decode(value);
|
|
78
|
-
if (decoded.length !== STRKEY_DECODED_BYTES ||
|
|
79
|
-
decoded[0] !== version ||
|
|
80
|
-
base32Encode(decoded) !== value ||
|
|
81
|
-
crc16Xmodem(decoded.subarray(0, STRKEY_DECODED_BYTES - 2)) !== decoded.readUInt16LE(STRKEY_DECODED_BYTES - 2)) {
|
|
82
|
-
throw new Error(`Invalid ed25519 StrKey ${label}`);
|
|
83
|
-
}
|
|
84
|
-
return decoded.subarray(1, 33);
|
|
85
|
-
}
|
|
86
|
-
/** Returns true for canonical base32-encoded 64-byte public derivation material. */
|
|
87
|
-
function isDerivableEd25519Pub(pub) {
|
|
88
|
-
return BASE32_ROOT_REGEX.test(pub) && base32Encode(base32Decode(pub)) === pub;
|
|
89
|
-
}
|
|
90
|
-
/** Throws unless the value is canonical base32-encoded 64-byte root material. */
|
|
91
|
-
function assertDerivableEd25519Pub(pub) {
|
|
92
|
-
if (!isDerivableEd25519Pub(pub)) {
|
|
93
|
-
throw new Error('Invalid derivable ed25519 pub: expected 64 bytes of canonical base32');
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
/** Compose raw public-key and chain-code bytes into one base32 root value. */
|
|
97
|
-
function encodeDerivableEd25519Pub(pub, chainCode) {
|
|
98
|
-
if (pub.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES || chainCode.length !== exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES) {
|
|
99
|
-
throw new Error('Invalid derivable ed25519 pub: expected 32-byte public key and chain code buffers');
|
|
100
|
-
}
|
|
101
|
-
return base32Encode(Buffer.concat([pub, chainCode]));
|
|
102
|
-
}
|
|
103
|
-
/** Decode a base32 root into raw public-key and chain-code buffers. */
|
|
104
|
-
function decodeDerivableEd25519Pub(composite) {
|
|
105
|
-
assertDerivableEd25519Pub(composite);
|
|
106
|
-
const decoded = base32Decode(composite);
|
|
107
|
-
return {
|
|
108
|
-
pub: decoded.subarray(0, exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES),
|
|
109
|
-
chainCode: decoded.subarray(exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
/** Generate a fresh raw 32-byte chain code for root composition. */
|
|
113
|
-
function generateEd25519ChainCode() {
|
|
114
|
-
return (0, crypto_1.randomBytes)(exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES);
|
|
115
|
-
}
|
|
116
|
-
function decodeEd25519StrKeyPublicKey(pub) {
|
|
117
|
-
if (!STRKEY_PUBLIC_KEY_REGEX.test(pub)) {
|
|
118
|
-
throw new Error('Invalid ed25519 StrKey public key');
|
|
119
|
-
}
|
|
120
|
-
return decodeStrKey(pub, STRKEY_VERSION_PUBLIC_KEY, 'public key');
|
|
121
|
-
}
|
|
122
|
-
function isValidEd25519StrKeyPublicKey(pub) {
|
|
123
|
-
try {
|
|
124
|
-
decodeEd25519StrKeyPublicKey(pub);
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
function decodeEd25519StrKeySecretSeed(seed) {
|
|
132
|
-
if (!STRKEY_SECRET_SEED_REGEX.test(seed)) {
|
|
133
|
-
throw new Error('Invalid ed25519 StrKey secret seed');
|
|
134
|
-
}
|
|
135
|
-
return decodeStrKey(seed, STRKEY_VERSION_SECRET_SEED, 'secret seed');
|
|
136
|
-
}
|
|
137
|
-
function encodeEd25519StrKeyPublicKey(rawPub) {
|
|
138
|
-
if (rawPub.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES) {
|
|
139
|
-
throw new Error('ed25519 public key must be 32 bytes');
|
|
140
|
-
}
|
|
141
|
-
const payload = Buffer.concat([Buffer.from([STRKEY_VERSION_PUBLIC_KEY]), rawPub]);
|
|
142
|
-
const checksum = Buffer.alloc(2);
|
|
143
|
-
checksum.writeUInt16LE(crc16Xmodem(payload), 0);
|
|
144
|
-
return base32Encode(Buffer.concat([payload, checksum]));
|
|
145
|
-
}
|
|
146
|
-
function isChecksumValidStrKeyEd25519Pub(pub) {
|
|
147
|
-
try {
|
|
148
|
-
decodeEd25519StrKeyPublicKey(pub);
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
15
|
+
const sdk_lib_safes_1 = require("@bitgo/sdk-lib-safes");
|
|
155
16
|
let eddsaPromise;
|
|
156
17
|
function getEddsa() {
|
|
157
18
|
if (!eddsaPromise) {
|
|
@@ -167,8 +28,8 @@ async function softDeriveChildPubEd25519(compositePub, index) {
|
|
|
167
28
|
if (!Number.isInteger(index) || index < 0 || index > 0x7fffffff) {
|
|
168
29
|
throw new Error(`ed25519 safe co-signer derivation index must be non-hardened, got ${index}`);
|
|
169
30
|
}
|
|
170
|
-
const { pub, chainCode } = decodeDerivableEd25519Pub(compositePub);
|
|
31
|
+
const { pub, chainCode } = (0, sdk_lib_safes_1.decodeDerivableEd25519Pub)(compositePub);
|
|
171
32
|
const eddsa = await getEddsa();
|
|
172
33
|
return Buffer.from(eddsa.deriveUnhardened(Buffer.concat([pub, chainCode]).toString('hex'), `m/${index}`).slice(0, 64), 'hex');
|
|
173
34
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBNEVILHNEQUVDO0FBR0QsOERBSUM7QUFHRCw4REFLQztBQUdELDhEQU9DO0FBR0QsNERBRUM7QUFFRCxvRUFLQztBQUVELHNFQU9DO0FBRUQsc0VBS0M7QUFFRCxvRUFRQztBQUVELDBFQU9DO0FBY0QsOERBVUM7QUE1S0QsbUNBQXFDO0FBQ3JDLG1EQUF3RDtBQUUzQyxRQUFBLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFBLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFBLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztBQUVoRCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsQ0FBQztBQUMzRCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0FBQzVDLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFDbEQsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNuRCxNQUFNLHlCQUF5QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRWhDLFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksTUFBTSxHQUFHLENB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QUFNLFFBQVEsRUFBRSxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQ2xHLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWQyNTUxOSBzYWZlLXJvb3QgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgYW5kIFN0ZWxsYXIgdXNlci1rZXkgY29kZWNzLlxuICpcbiAqIFNhZmUgYmFja3VwIGFuZCBCaXRHbyByb290cyBzdG9yZSByYXcgcHVibGljIGtleSAoMzIgYnl0ZXMpIHx8IHJhdyBjaGFpbiBjb2RlICgzMiBieXRlcyksXG4gKiBlbmNvZGVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIuIENvaW4tc3BlY2lmaWMgcHVibGljLWtleSBlbmNvZGluZ3MgYXJlXG4gKiBhcHBsaWVkIG9ubHkgdG8gZGVyaXZlZCB3YWxsZXQgY2hpbGRyZW4uXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRWQyNTUxOUJJUDMyLCBFZGRzYSB9IGZyb20gJy4uLy4uL2FjY291bnQtbGliJztcblxuZXhwb3J0IGNvbnN0IERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMgPSAzMjtcbmV4cG9ydCBjb25zdCBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTID0gMzI7XG5leHBvcnQgY29uc3QgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCA9IDEwMztcblxuY29uc3QgQkFTRTMyX0FMUEhBQkVUID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3JztcbmNvbnN0IEJBU0UzMl9ST09UX1JFR0VYID0gL15bQS1aMi03XXsxMDN9JC87XG5jb25zdCBTVFJLRVlfUFVCTElDX0tFWV9SRUdFWCA9IC9eR1tBLVoyLTddezU1fSQvO1xuY29uc3QgU1RSS0VZX1NFQ1JFVF9TRUVEX1JFR0VYID0gL15TW0EtWjItN117NTV9JC87XG5jb25zdCBTVFJLRVlfVkVSU0lPTl9QVUJMSUNfS0VZID0gNiA8PCAzO1xuY29uc3QgU1RSS0VZX1ZFUlNJT05fU0VDUkVUX1NFRUQgPSAxOCA8PCAzO1xuY29uc3QgU1RSS0VZX0RFQ09ERURfQllURVMgPSAzNTtcblxuZnVuY3Rpb24gYmFzZTMyRGVjb2RlKGlucHV0OiBzdHJpbmcpOiBCdWZmZXIge1xuICBjb25zdCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MoTWF0aC5mbG9vcigoaW5wdXQubGVuZ3RoICogNSkgLyA4KSk7XG4gIGxldCBiaXRzID0gMDtcbiAgbGV0IHZhbHVlID0gMDtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgY2hhciBvZiBpbnB1dCkge1xuICAgIHZhbHVlID0gKHZhbHVlIDw8IDUpIHwgQkFTRTMyX0FMUEhBQkVULmluZGV4T2YoY2hhcik7XG4gICAgYml0cyArPSA1O1xuICAgIGlmIChiaXRzID49IDgpIHtcbiAgICAgIGJpdHMgLT0gODtcbiAgICAgIG91dHB1dFtvZmZzZXQrK10gPSAodmFsdWUgPj4+IGJpdHMpICYgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gYmFzZTMyRW5jb2RlKGRhdGE6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGxldCBiaXRzID0gMDtcbiAgbGV0IHZhbHVlID0gMDtcbiAgbGV0IG91dHB1dCA9ICcnO1xuICBmb3IgKGNvbnN0IGJ5dGUgb2YgZGF0YSkge1xuICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgYnl0ZTtcbiAgICBiaXRzICs9IDg7XG4gICAgd2hpbGUgKGJpdHMgPj0gNSkge1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgb3V0cHV0ICs9IEJBU0UzMl9BTFBIQUJFVFsodmFsdWUgPj4+IGJpdHMpICYgMHgxZl07XG4gICAgfVxuICB9XG4gIGlmIChiaXRzID4gMCkge1xuICAgIG91dHB1dCArPSBCQVNFMzJfQUxQSEFCRVRbKHZhbHVlIDw8ICg1IC0gYml0cykpICYgMHgxZl07XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gY3JjMTZYbW9kZW0oZGF0YTogQnVmZmVyKTogbnVtYmVyIHtcbiAgbGV0IGNyYyA9IDA7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBkYXRhKSB7XG4gICAgY3JjIF49IGJ5dGUgPDwgODtcbiAgICBmb3IgKGxldCBiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykge1xuICAgICAgY3JjID0gY3JjICYgMHg4MDAwID8gKChjcmMgPDwgMSkgXiAweDEwMjEpICYgMHhmZmZmIDogKGNyYyA8PCAxKSAmIDB4ZmZmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNyYztcbn1cblxuZnVuY3Rpb24gZGVjb2RlU3RyS2V5KHZhbHVlOiBzdHJpbmcsIHZlcnNpb246IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGNvbnN0IGRlY29kZWQgPSBiYXNlMzJEZWNvZGUodmFsdWUpO1xuICBpZiAoXG4gICAgZGVjb2RlZC5sZW5ndGggIT09IFNUUktFWV9ERUNPREVEX0JZVEVTIHx8XG4gICAgZGVjb2RlZFswXSAhPT0gdmVyc2lvbiB8fFxuICAgIGJhc2UzMkVuY29kZShkZWNvZGVkKSAhPT0gdmFsdWUgfHxcbiAgICBjcmMxNlhtb2RlbShkZWNvZGVkLnN1YmFycmF5KDAsIFNUUktFWV9ERUNPREVEX0JZVEVTIC0gMikpICE9PSBkZWNvZGVkLnJlYWRVSW50MTZMRShTVFJLRVlfREVDT0RFRF9CWVRFUyAtIDIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlZDI1NTE5IFN0cktleSAke2xhYmVsfWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnN1YmFycmF5KDEsIDMzKTtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBmb3IgY2Fub25pY2FsIGJhc2UzMi1lbmNvZGVkIDY0LWJ5dGUgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZXJpdmFibGVFZDI1NTE5UHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBCQVNFMzJfUk9PVF9SRUdFWC50ZXN0KHB1YikgJiYgYmFzZTMyRW5jb2RlKGJhc2UzMkRlY29kZShwdWIpKSA9PT0gcHViO1xufVxuXG4vKiogVGhyb3dzIHVubGVzcyB0aGUgdmFsdWUgaXMgY2Fub25pY2FsIGJhc2UzMi1lbmNvZGVkIDY0LWJ5dGUgcm9vdCBtYXRlcmlhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZXJpdmFibGVFZDI1NTE5UHViKHB1Yjogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghaXNEZXJpdmFibGVFZDI1NTE5UHViKHB1YikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViOiBleHBlY3RlZCA2NCBieXRlcyBvZiBjYW5vbmljYWwgYmFzZTMyJyk7XG4gIH1cbn1cblxuLyoqIENvbXBvc2UgcmF3IHB1YmxpYy1rZXkgYW5kIGNoYWluLWNvZGUgYnl0ZXMgaW50byBvbmUgYmFzZTMyIHJvb3QgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWI6IEJ1ZmZlciwgY2hhaW5Db2RlOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAocHViLmxlbmd0aCAhPT0gREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUyB8fCBjaGFpbkNvZGUubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1YjogZXhwZWN0ZWQgMzItYnl0ZSBwdWJsaWMga2V5IGFuZCBjaGFpbiBjb2RlIGJ1ZmZlcnMnKTtcbiAgfVxuICByZXR1cm4gYmFzZTMyRW5jb2RlKEJ1ZmZlci5jb25jYXQoW3B1YiwgY2hhaW5Db2RlXSkpO1xufVxuXG4vKiogRGVjb2RlIGEgYmFzZTMyIHJvb3QgaW50byByYXcgcHVibGljLWtleSBhbmQgY2hhaW4tY29kZSBidWZmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlOiBzdHJpbmcpOiB7IHB1YjogQnVmZmVyOyBjaGFpbkNvZGU6IEJ1ZmZlciB9IHtcbiAgYXNzZXJ0RGVyaXZhYmxlRWQyNTUxOVB1Yihjb21wb3NpdGUpO1xuICBjb25zdCBkZWNvZGVkID0gYmFzZTMyRGVjb2RlKGNvbXBvc2l0ZSk7XG4gIHJldHVybiB7XG4gICAgcHViOiBkZWNvZGVkLnN1YmFycmF5KDAsIERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMpLFxuICAgIGNoYWluQ29kZTogZGVjb2RlZC5zdWJhcnJheShERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTKSxcbiAgfTtcbn1cblxuLyoqIEdlbmVyYXRlIGEgZnJlc2ggcmF3IDMyLWJ5dGUgY2hhaW4gY29kZSBmb3Igcm9vdCBjb21wb3NpdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGUoKTogQnVmZmVyIHtcbiAgcmV0dXJuIHJhbmRvbUJ5dGVzKERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShwdWI6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGlmICghU1RSS0VZX1BVQkxJQ19LRVlfUkVHRVgudGVzdChwdWIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVkMjU1MTkgU3RyS2V5IHB1YmxpYyBrZXknKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlU3RyS2V5KHB1YiwgU1RSS0VZX1ZFUlNJT05fUFVCTElDX0tFWSwgJ3B1YmxpYyBrZXknKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShwdWIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkKHNlZWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGlmICghU1RSS0VZX1NFQ1JFVF9TRUVEX1JFR0VYLnRlc3Qoc2VlZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWQyNTUxOSBTdHJLZXkgc2VjcmV0IHNlZWQnKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlU3RyS2V5KHNlZWQsIFNUUktFWV9WRVJTSU9OX1NFQ1JFVF9TRUVELCAnc2VjcmV0IHNlZWQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkocmF3UHViOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAocmF3UHViLmxlbmd0aCAhPT0gREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUykge1xuICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBwdWJsaWMga2V5IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oW1NUUktFWV9WRVJTSU9OX1BVQkxJQ19LRVldKSwgcmF3UHViXSk7XG4gIGNvbnN0IGNoZWNrc3VtID0gQnVmZmVyLmFsbG9jKDIpO1xuICBjaGVja3N1bS53cml0ZVVJbnQxNkxFKGNyYzE2WG1vZGVtKHBheWxvYWQpLCAwKTtcbiAgcmV0dXJuIGJhc2UzMkVuY29kZShCdWZmZXIuY29uY2F0KFtwYXlsb2FkLCBjaGVja3N1bV0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hlY2tzdW1WYWxpZFN0cktleUVkMjU1MTlQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KHB1Yik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5sZXQgZWRkc2FQcm9taXNlOiBQcm9taXNlPEVkZHNhPiB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldEVkZHNhKCk6IFByb21pc2U8RWRkc2E+IHtcbiAgaWYgKCFlZGRzYVByb21pc2UpIHtcbiAgICBlZGRzYVByb21pc2UgPSAoYXN5bmMgKCkgPT4gRWRkc2EuaW5pdGlhbGl6ZShhd2FpdCBFZDI1NTE5QklQMzIuaW5pdGlhbGl6ZSgpKSkoKTtcbiAgICBlZGRzYVByb21pc2UuY2F0Y2goKCkgPT4ge1xuICAgICAgZWRkc2FQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlZGRzYVByb21pc2U7XG59XG5cbi8qKiBTb2Z0LWRlcml2ZSBgbS88aW5kZXg+YCBhbmQgcmV0dXJuIHRoZSBkZXJpdmVkIHJhdyAzMi1ieXRlIHB1YmxpYyBrZXkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShjb21wb3NpdGVQdWI6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgfHwgaW5kZXggPCAwIHx8IGluZGV4ID4gMHg3ZmZmZmZmZikge1xuICAgIHRocm93IG5ldyBFcnJvcihgZWQyNTUxOSBzYWZlIGNvLXNpZ25lciBkZXJpdmF0aW9uIGluZGV4IG11c3QgYmUgbm9uLWhhcmRlbmVkLCBnb3QgJHtpbmRleH1gKTtcbiAgfVxuICBjb25zdCB7IHB1YiwgY2hhaW5Db2RlIH0gPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKGNvbXBvc2l0ZVB1Yik7XG4gIGNvbnN0IGVkZHNhID0gYXdhaXQgZ2V0RWRkc2EoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIGVkZHNhLmRlcml2ZVVuaGFyZGVuZWQoQnVmZmVyLmNvbmNhdChbcHViLCBjaGFpbkNvZGVdKS50b1N0cmluZygnaGV4JyksIGBtLyR7aW5kZXh9YCkuc2xpY2UoMCwgNjQpLFxuICAgICdoZXgnXG4gICk7XG59XG4iXX0=
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7QUFpQkgsOERBVUM7QUF6QkQsbURBQXdEO0FBQ3hELHdEQUFpRTtBQUVqRSxJQUFJLFlBQXdDLENBQUM7QUFDN0MsU0FBUyxRQUFRO0lBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLFlBQVksR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsbUJBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSwwQkFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ3RCLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELDZFQUE2RTtBQUN0RSxLQUFLLFVBQVUseUJBQXlCLENBQUMsWUFBb0IsRUFBRSxLQUFhO0lBQ2pGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSx5Q0FBeUIsRUFBQyxZQUFZLENBQUMsQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQ2xHLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWQyNTUxOSBzYWZlLXJvb3QgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgYW5kIFN0ZWxsYXIgdXNlci1rZXkgY29kZWNzLlxuICpcbiAqIFNhZmUgYmFja3VwIGFuZCBCaXRHbyByb290cyBzdG9yZSByYXcgcHVibGljIGtleSAoMzIgYnl0ZXMpIHx8IHJhdyBjaGFpbiBjb2RlICgzMiBieXRlcyksXG4gKiBlbmNvZGVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIuIENvaW4tc3BlY2lmaWMgcHVibGljLWtleSBlbmNvZGluZ3MgYXJlXG4gKiBhcHBsaWVkIG9ubHkgdG8gZGVyaXZlZCB3YWxsZXQgY2hpbGRyZW4uXG4gKlxuICogVGhlIHB1cmUgY29kZWNzICsgY29tcG9zaXRlLXB1YiBlbmNvZGluZyBtb3ZlZCB0byBAYml0Z28vc2RrLWxpYi1zYWZlcy4gT25seSB0aGUgV0FTTVxuICogc29mdC1kZXJpdmF0aW9uIHJlbWFpbnMgaGVyZSAoaXQgbmVlZHMgRWQyNTUxOUJJUDMyL0VkZHNhLCB3aGljaCBsaXZlIGluIHNkay1jb3JlKS5cbiAqL1xuXG5pbXBvcnQgeyBFZDI1NTE5QklQMzIsIEVkZHNhIH0gZnJvbSAnLi4vLi4vYWNjb3VudC1saWInO1xuaW1wb3J0IHsgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YiB9IGZyb20gJ0BiaXRnby9zZGstbGliLXNhZmVzJztcblxubGV0IGVkZHNhUHJvbWlzZTogUHJvbWlzZTxFZGRzYT4gfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRFZGRzYSgpOiBQcm9taXNlPEVkZHNhPiB7XG4gIGlmICghZWRkc2FQcm9taXNlKSB7XG4gICAgZWRkc2FQcm9taXNlID0gKGFzeW5jICgpID0+IEVkZHNhLmluaXRpYWxpemUoYXdhaXQgRWQyNTUxOUJJUDMyLmluaXRpYWxpemUoKSkpKCk7XG4gICAgZWRkc2FQcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIGVkZHNhUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZWRkc2FQcm9taXNlO1xufVxuXG4vKiogU29mdC1kZXJpdmUgYG0vPGluZGV4PmAgYW5kIHJldHVybiB0aGUgZGVyaXZlZCByYXcgMzItYnl0ZSBwdWJsaWMga2V5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoY29tcG9zaXRlUHViOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaW5kZXgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IDB4N2ZmZmZmZmYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGVkMjU1MTkgc2FmZSBjby1zaWduZXIgZGVyaXZhdGlvbiBpbmRleCBtdXN0IGJlIG5vbi1oYXJkZW5lZCwgZ290ICR7aW5kZXh9YCk7XG4gIH1cbiAgY29uc3QgeyBwdWIsIGNoYWluQ29kZSB9ID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yihjb21wb3NpdGVQdWIpO1xuICBjb25zdCBlZGRzYSA9IGF3YWl0IGdldEVkZHNhKCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICBlZGRzYS5kZXJpdmVVbmhhcmRlbmVkKEJ1ZmZlci5jb25jYXQoW3B1YiwgY2hhaW5Db2RlXSkudG9TdHJpbmcoJ2hleCcpLCBgbS8ke2luZGV4fWApLnNsaWNlKDAsIDY0KSxcbiAgICAnaGV4J1xuICApO1xufVxuIl19
|
|
@@ -10,6 +10,10 @@ import type { Wallet, WalletShare } from '../wallet';
|
|
|
10
10
|
export interface InitializeSafeOptions {
|
|
11
11
|
label: string;
|
|
12
12
|
}
|
|
13
|
+
/** @experimental */
|
|
14
|
+
export interface UpdateSafeOptions {
|
|
15
|
+
label: string;
|
|
16
|
+
}
|
|
13
17
|
/**
|
|
14
18
|
* Phase 3 — the client hands back the 12 key ids it created in Phase 2.
|
|
15
19
|
* @experimental
|
|
@@ -28,8 +32,8 @@ export interface CreateSafeWalletOptions {
|
|
|
28
32
|
passphrase: string;
|
|
29
33
|
type?: 'hot';
|
|
30
34
|
/**
|
|
31
|
-
* `onchain` (default)
|
|
32
|
-
*
|
|
35
|
+
* Mint scheme: `onchain` (default) uses the independent multisig root slot for the coin's
|
|
36
|
+
* curve; `tss` uses the MPC root slot. Independent of the coin's default wallet multisig type.
|
|
33
37
|
*/
|
|
34
38
|
multisigType?: 'onchain' | 'tss';
|
|
35
39
|
}
|
|
@@ -76,6 +80,7 @@ export interface ISafe {
|
|
|
76
80
|
status(): SafeData['status'];
|
|
77
81
|
url(extra?: string): string;
|
|
78
82
|
createWallet(params: CreateSafeWalletOptions): Promise<Wallet>;
|
|
83
|
+
update(params: UpdateSafeOptions): Promise<SafeData>;
|
|
79
84
|
addMember(params: AddSafeMemberOptions): Promise<SafeData>;
|
|
80
85
|
addMemberToWallet(params: AddSafeWalletMemberOptions): Promise<WalletShareData>;
|
|
81
86
|
listShares(params?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iSafe.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/iSafe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,oBAAoB;AACpB,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAI1C,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;CAClC;AAED,UAAU,iBAAiB;IACzB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,gGAAgG;IAChG,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,4EAA4E;AAC5E,MAAM,MAAM,oBAAoB,GAC5B,CAAC,iBAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACvD,CAAC,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAE5D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,uGAAuG;IACvG,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AACF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,+BAA+B,GAAG,kCAAkC,CAAC;AAE1G;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,IAAI,MAAM,CAAC;IACb,YAAY,IAAI,MAAM,CAAC;IACvB,KAAK,IAAI,MAAM,CAAC;IAChB,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"iSafe.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/iSafe.ts"],"names":[],"mappings":"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"}
|