@bitgo/sdk-core 32.2.0 → 33.1.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/CHANGELOG.md +58 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -2
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
- package/dist/src/account-lib/baseCoin/iface.d.ts +1 -28
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +1 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +2 -4
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +3 -3
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/environments.d.ts +9 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +10 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +1 -8
- package/dist/src/bitgo/utils/index.d.ts +0 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +1 -3
- package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -3
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +18 -1
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +0 -5
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +1 -13
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +1 -7
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +1 -9
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +5 -2
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +2 -1
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +1 -3
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/base.js +3 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +6 -17
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +24 -125
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +7 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +0 -2
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts +8 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +25 -5
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +2 -3
- package/dist/src/bitgo/wallet/wallet.d.ts +8 -2
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +64 -6
- package/dist/src/bitgo/wallet/wallets.d.ts +31 -2
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +229 -21
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -4
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -76
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -223
- package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
- package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/blsUtils.js +0 -237
- package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
- package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
|
@@ -97,9 +97,8 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
97
97
|
const n = 3;
|
|
98
98
|
const userKeyShare = await MPC.keyShare(1, m, n);
|
|
99
99
|
const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
-
const backupGpgKey = await this.getBackupGpgPubKey(isThirdPartyBackup);
|
|
100
|
+
const backupKeyShare = await this.createBackupKeyShares();
|
|
101
|
+
const backupGpgKey = await this.getBackupGpgPubKey();
|
|
103
102
|
// Get the BitGo public key based on user/enterprise feature flags
|
|
104
103
|
// If it doesn't work, use the default public key from the constants
|
|
105
104
|
const bitgoPublicGpgKey = (await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise)) ?? this.bitgoPublicGpgKey;
|
|
@@ -110,7 +109,6 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
110
109
|
userKeyShare,
|
|
111
110
|
backupKeyShare,
|
|
112
111
|
enterprise: params.enterprise,
|
|
113
|
-
isThirdPartyBackup,
|
|
114
112
|
});
|
|
115
113
|
const userKeychainPromise = this.createUserKeychain({
|
|
116
114
|
userGpgKey,
|
|
@@ -121,7 +119,6 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
121
119
|
bitgoKeychain,
|
|
122
120
|
passphrase: params.passphrase,
|
|
123
121
|
originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
|
|
124
|
-
isThirdPartyBackup,
|
|
125
122
|
});
|
|
126
123
|
const backupKeychainPromise = this.createBackupKeychain({
|
|
127
124
|
userGpgKey,
|
|
@@ -131,7 +128,6 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
131
128
|
backupKeyShare,
|
|
132
129
|
bitgoKeychain,
|
|
133
130
|
passphrase: params.passphrase,
|
|
134
|
-
backupProvider: params.backupProvider,
|
|
135
131
|
});
|
|
136
132
|
const [userKeychain, backupKeychain] = await Promise.all([userKeychainPromise, backupKeychainPromise]);
|
|
137
133
|
return {
|
|
@@ -140,64 +136,32 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
140
136
|
bitgoKeychain,
|
|
141
137
|
};
|
|
142
138
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const bitgoHeldBackupKeyShares = await this.createBitgoHeldBackupKeyShare(userGpgPubKey, enterprise);
|
|
151
|
-
backupKeyShare = {
|
|
152
|
-
bitGoHeldKeyShares: bitgoHeldBackupKeyShares,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
const MPC = new tss_1.Ecdsa();
|
|
157
|
-
const m = 2;
|
|
158
|
-
const n = 3;
|
|
159
|
-
backupKeyShare = {
|
|
160
|
-
userHeldKeyShare: await MPC.keyShare(2, m, n),
|
|
161
|
-
};
|
|
162
|
-
}
|
|
139
|
+
async createBackupKeyShares() {
|
|
140
|
+
const MPC = new tss_1.Ecdsa();
|
|
141
|
+
const m = 2;
|
|
142
|
+
const n = 3;
|
|
143
|
+
const backupKeyShare = {
|
|
144
|
+
userHeldKeyShare: await MPC.keyShare(2, m, n),
|
|
145
|
+
};
|
|
163
146
|
return backupKeyShare;
|
|
164
147
|
}
|
|
165
|
-
createUserKeychain({ userGpgKey, backupGpgKey, bitgoPublicGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode,
|
|
148
|
+
createUserKeychain({ userGpgKey, backupGpgKey, bitgoPublicGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode, }) {
|
|
166
149
|
if (!passphrase) {
|
|
167
150
|
throw new Error('Please provide a wallet passphrase');
|
|
168
151
|
}
|
|
169
|
-
if (isThirdPartyBackup && backupKeyShare.bitGoHeldKeyShares?.keyShares) {
|
|
170
|
-
return this.createUserKeychainFromThirdPartyBackup(userGpgKey, bitgoPublicGpgKey, backupGpgKey, userKeyShare, backupKeyShare.bitGoHeldKeyShares.keyShares, bitgoKeychain, passphrase, originalPasscodeEncryptionCode);
|
|
171
|
-
}
|
|
172
152
|
(0, assert_1.default)(backupKeyShare.userHeldKeyShare);
|
|
173
153
|
return this.createParticipantKeychain(userGpgKey, backupGpgKey, bitgoPublicGpgKey, 1, userKeyShare, backupKeyShare.userHeldKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode);
|
|
174
154
|
}
|
|
175
|
-
async createBackupKeychain({ userGpgKey, userKeyShare, backupGpgKey, backupKeyShare, bitgoKeychain, bitgoPublicGpgKey, passphrase,
|
|
176
|
-
if (this.isValidThirdPartyBackupProvider(backupProvider) && backupKeyShare.bitGoHeldKeyShares?.keyShares) {
|
|
177
|
-
(0, assert_1.default)(bitgoKeychain.commonKeychain);
|
|
178
|
-
const finalizedBackupKeyShare = await this.finalizeBitgoHeldBackupKeyShare(backupKeyShare.bitGoHeldKeyShares.id, bitgoKeychain.commonKeychain, userKeyShare, bitgoKeychain, userGpgKey, backupGpgKey);
|
|
179
|
-
if (finalizedBackupKeyShare.commonKeychain !== bitgoKeychain.commonKeychain) {
|
|
180
|
-
throw new Error('Failed to create backup keychain - commonKeychains do not match');
|
|
181
|
-
}
|
|
182
|
-
const backupKeyParams = {
|
|
183
|
-
source: 'backup',
|
|
184
|
-
keyType: 'tss',
|
|
185
|
-
commonKeychain: finalizedBackupKeyShare.commonKeychain,
|
|
186
|
-
provider: backupProvider ?? 'BitGoTrustAsKrs',
|
|
187
|
-
};
|
|
188
|
-
const backupKeychain = await this.baseCoin.keychains().createBackup(backupKeyParams);
|
|
189
|
-
backupKeychain.keyShares = finalizedBackupKeyShare.keyShares;
|
|
190
|
-
return backupKeychain;
|
|
191
|
-
}
|
|
155
|
+
async createBackupKeychain({ userGpgKey, userKeyShare, backupGpgKey, backupKeyShare, bitgoKeychain, bitgoPublicGpgKey, passphrase, }) {
|
|
192
156
|
(0, assert_1.default)(backupKeyShare.userHeldKeyShare);
|
|
193
157
|
(0, assert_1.default)(passphrase);
|
|
194
158
|
return this.createParticipantKeychain(userGpgKey, backupGpgKey, bitgoPublicGpgKey, 2, userKeyShare, backupKeyShare.userHeldKeyShare, bitgoKeychain, passphrase);
|
|
195
159
|
}
|
|
196
160
|
/** @inheritdoc */
|
|
197
|
-
async createBitgoKeychain({ userGpgKey, backupGpgKey, userKeyShare, backupKeyShare, enterprise, bitgoPublicGpgKey,
|
|
161
|
+
async createBitgoKeychain({ userGpgKey, backupGpgKey, userKeyShare, backupKeyShare, enterprise, bitgoPublicGpgKey, }) {
|
|
198
162
|
const recipientIndex = 3;
|
|
199
163
|
const userToBitgoShare = await encryptNShare(userKeyShare, recipientIndex, bitgoPublicGpgKey.armor(), userGpgKey);
|
|
200
|
-
const backupToBitgoShare = await this.getBackupEncryptedNShare(backupKeyShare, recipientIndex, bitgoPublicGpgKey.armor(), backupGpgKey
|
|
164
|
+
const backupToBitgoShare = await this.getBackupEncryptedNShare(backupKeyShare, recipientIndex, bitgoPublicGpgKey.armor(), backupGpgKey);
|
|
201
165
|
const createBitGoMPCParams = {
|
|
202
166
|
keyType: 'tss',
|
|
203
167
|
source: 'bitgo',
|
|
@@ -222,9 +186,7 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
222
186
|
},
|
|
223
187
|
],
|
|
224
188
|
userGPGPublicKey: userGpgKey.publicKey,
|
|
225
|
-
backupGPGPublicKey:
|
|
226
|
-
? backupGpgKey.armor()
|
|
227
|
-
: backupGpgKey.publicKey,
|
|
189
|
+
backupGPGPublicKey: backupGpgKey.publicKey,
|
|
228
190
|
enterprise: enterprise,
|
|
229
191
|
algoUsed: 'ecdsa',
|
|
230
192
|
};
|
|
@@ -239,80 +201,11 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
239
201
|
* @param backupGpgKey backup gpg key
|
|
240
202
|
* @param isThirdPartyBackup whether the backup is generated by third party
|
|
241
203
|
*/
|
|
242
|
-
async getBackupEncryptedNShare(backupShare, recipientIndex, recipientGpgPublicArmor, backupGpgKey
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
if (!backupShare.bitGoHeldKeyShares) {
|
|
246
|
-
throw new Error(`Missing third party backup key shares`);
|
|
247
|
-
}
|
|
248
|
-
const backupToRecipientApiShare = backupShare.bitGoHeldKeyShares.keyShares.find((keyShare) => keyShare.from === 'backup' && keyShare.to === (0, ecdsa_2.getParticipantFromIndex)(recipientIndex));
|
|
249
|
-
if (!backupToRecipientApiShare) {
|
|
250
|
-
throw new Error(`Missing backup to ${(0, ecdsa_2.getParticipantFromIndex)(recipientIndex)} key share`);
|
|
251
|
-
}
|
|
252
|
-
// Since backup is from a third party, it is already encrypted
|
|
253
|
-
backupToRecipientShare = await (0, ecdsa_2.buildNShareFromAPIKeyShare)(backupToRecipientApiShare);
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
(0, assert_1.default)(backupShare.userHeldKeyShare);
|
|
257
|
-
backupToRecipientShare = await encryptNShare(backupShare.userHeldKeyShare, recipientIndex, recipientGpgPublicArmor, backupGpgKey);
|
|
258
|
-
}
|
|
204
|
+
async getBackupEncryptedNShare(backupShare, recipientIndex, recipientGpgPublicArmor, backupGpgKey) {
|
|
205
|
+
(0, assert_1.default)(backupShare.userHeldKeyShare);
|
|
206
|
+
const backupToRecipientShare = await encryptNShare(backupShare.userHeldKeyShare, recipientIndex, recipientGpgPublicArmor, backupGpgKey);
|
|
259
207
|
return backupToRecipientShare;
|
|
260
208
|
}
|
|
261
|
-
/**
|
|
262
|
-
* This uses the backup key from a third party (bitgo in this case)
|
|
263
|
-
* to create the user keychain via WP.
|
|
264
|
-
*/
|
|
265
|
-
async createUserKeychainFromThirdPartyBackup(userGpgKey, bitgoPublicGpgKey, thirdPartyBackupPublicGpgKey, userKeyShare, thirdPartybackupKeyShares, bitgoKeychain, passphrase, originalPasscodeEncryptionCode) {
|
|
266
|
-
const bitgoKeyShares = bitgoKeychain.keyShares;
|
|
267
|
-
if (!bitgoKeyShares) {
|
|
268
|
-
throw new Error('Missing BitGo key shares');
|
|
269
|
-
}
|
|
270
|
-
if (!bitgoKeychain.commonKeychain) {
|
|
271
|
-
throw new Error(`Missing common key chain: ${bitgoKeychain.commonKeychain}`);
|
|
272
|
-
}
|
|
273
|
-
const bitGoToUserShare = bitgoKeyShares.find((keyShare) => keyShare.from === 'bitgo' && keyShare.to === 'user');
|
|
274
|
-
if (!bitGoToUserShare) {
|
|
275
|
-
throw new Error('Missing BitGo to User key share');
|
|
276
|
-
}
|
|
277
|
-
const backupToUserShare = thirdPartybackupKeyShares.find((keyShare) => keyShare.from === 'backup' && keyShare.to === 'user');
|
|
278
|
-
if (!backupToUserShare) {
|
|
279
|
-
throw new Error('Missing Backup to User key share');
|
|
280
|
-
}
|
|
281
|
-
const backupToUserNShare = await (0, ecdsa_2.buildNShareFromAPIKeyShare)(backupToUserShare);
|
|
282
|
-
const bitGoToUserNShare = await (0, ecdsa_2.buildNShareFromAPIKeyShare)(bitGoToUserShare);
|
|
283
|
-
const encryptedNShares = [
|
|
284
|
-
{
|
|
285
|
-
nShare: backupToUserNShare,
|
|
286
|
-
recipientPrivateArmor: userGpgKey.privateKey,
|
|
287
|
-
senderPublicArmor: thirdPartyBackupPublicGpgKey.armor(),
|
|
288
|
-
isbs58Encoded: false,
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
nShare: bitGoToUserNShare,
|
|
292
|
-
recipientPrivateArmor: userGpgKey.privateKey,
|
|
293
|
-
senderPublicArmor: bitgoPublicGpgKey.armor(),
|
|
294
|
-
isbs58Encoded: false,
|
|
295
|
-
},
|
|
296
|
-
];
|
|
297
|
-
const userCombinedKey = await ecdsa_1.default.createCombinedKey(userKeyShare, encryptedNShares, bitgoKeychain.commonKeychain);
|
|
298
|
-
if (userCombinedKey.commonKeychain !== bitgoKeychain.commonKeychain) {
|
|
299
|
-
throw new Error('Failed to create user keychain - commonKeychains do not match.');
|
|
300
|
-
}
|
|
301
|
-
const prv = JSON.stringify(userCombinedKey.signingMaterial);
|
|
302
|
-
const userKeychainParams = {
|
|
303
|
-
source: 'user',
|
|
304
|
-
keyType: 'tss',
|
|
305
|
-
commonKeychain: userCombinedKey.commonKeychain,
|
|
306
|
-
prv: prv,
|
|
307
|
-
encryptedPrv: this.bitgo.encrypt({
|
|
308
|
-
input: prv,
|
|
309
|
-
password: passphrase,
|
|
310
|
-
}),
|
|
311
|
-
originalPasscodeEncryptionCode,
|
|
312
|
-
};
|
|
313
|
-
const keychains = this.baseCoin.keychains();
|
|
314
|
-
return await keychains.add(userKeychainParams);
|
|
315
|
-
}
|
|
316
209
|
/** @inheritdoc */
|
|
317
210
|
async createParticipantKeychain(userGpgKey, userLocalBackupGpgKey, bitgoPublicGpgKey, recipientIndex, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode) {
|
|
318
211
|
const bitgoKeyShares = bitgoKeychain.keyShares;
|
|
@@ -601,6 +494,12 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
601
494
|
if (requestType === baseTypes_1.RequestType.tx) {
|
|
602
495
|
(0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
603
496
|
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
497
|
+
await this.baseCoin.verifyTransaction({
|
|
498
|
+
txPrebuild: { txHex: unsignedTx.signableHex },
|
|
499
|
+
txParams: params.txParams || { recipients: [] },
|
|
500
|
+
wallet: this.wallet,
|
|
501
|
+
walletType: this.wallet.multisigType(),
|
|
502
|
+
});
|
|
604
503
|
signablePayload = buffer_1.Buffer.from(unsignedTx.signableHex, 'hex');
|
|
605
504
|
derivationPath = unsignedTx.derivationPath;
|
|
606
505
|
}
|
|
@@ -934,4 +833,4 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
934
833
|
}
|
|
935
834
|
}
|
|
936
835
|
exports.EcdsaUtils = EcdsaUtils;
|
|
937
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFDaEMsaURBQW1DO0FBR25DLG9EQUF1SDtBQUN2SCw4Q0FBd0M7QUFFeEMseURBQStEO0FBRS9ELCtEQUFvRTtBQVVwRSw0Q0Fhc0I7QUFDdEIsc0NBQTRDO0FBQzVDLG9EQUFrSDtBQUNsSCxxREFBNkY7QUFHN0Ysb0RBQXNIO0FBQ3RILHdDQUFtRjtBQUNuRixnREFBNEQ7QUFDNUQsOENBSzRCO0FBQzVCLGlDQUF3QztBQUd4QyxNQUFNLGFBQWEsR0FBRyxlQUFZLENBQUMsYUFBYSxDQUFDO0FBRWpELGtCQUFrQjtBQUNsQixNQUFhLFVBQVcsU0FBUSxxQkFBYztJQUM1QyxLQUFLLENBQUMsK0JBQStCLENBQ25DLEtBQWEsRUFDYixjQUFzQixFQUN0QixZQUFzQixFQUN0QixhQUF1QixFQUN2QixVQUFxQyxFQUNyQyw0QkFBaUM7UUFFakMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLGFBQWEsQ0FDcEQsWUFBWSxFQUNaLENBQUMsRUFDRCw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsRUFDcEMsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUN6RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQ3BFLENBQUM7UUFDRixNQUFNLGVBQWUsR0FBRyxlQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3BDLGVBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQzdDLGVBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO1NBQ3RELENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsSUFBQSxnQkFBTSxFQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSzthQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDO1lBQ0osY0FBYztZQUNkLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixFQUFFLEVBQUUsUUFBUTtvQkFDWixXQUFXLEVBQUUsZUFBZTtvQkFDNUIsWUFBWSxFQUFFLDBCQUEwQixDQUFDLHFCQUFxQjtvQkFDOUQsaUJBQWlCLEVBQUUsMEJBQTBCLENBQUMsaUJBQWlCO29CQUMvRCxRQUFRLEVBQUUsMEJBQTBCLENBQUMsUUFBUTtpQkFDOUM7Z0JBQ0QscUJBQXFCO2FBQ3RCO1NBQ0YsQ0FBQzthQUNELE1BQU0sRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELE9BQU87WUFDTCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDbEIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1lBQ2hDLGNBQWMsRUFBRSxXQUFXLENBQUMsY0FBYztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsZUFBZSxDQUFDLE1BS3JCO1FBQ0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFWixNQUFNLFlBQVksR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0csTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUV2RSxrRUFBa0U7UUFDbEUsb0VBQW9FO1FBQ3BFLE1BQU0saUJBQWlCLEdBQ3JCLENBQUMsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBRWpHLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ25ELFVBQVU7WUFDVixZQUFZO1lBQ1osaUJBQWlCO1lBQ2pCLFlBQVk7WUFDWixjQUFjO1lBQ2QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLGtCQUFrQjtTQUNuQixDQUFDLENBQUM7UUFDSCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUNsRCxVQUFVO1lBQ1YsWUFBWTtZQUNaLGlCQUFpQjtZQUNqQixZQUFZO1lBQ1osY0FBYztZQUNkLGFBQWE7WUFDYixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsOEJBQThCLEVBQUUsTUFBTSxDQUFDLDhCQUE4QjtZQUNyRSxrQkFBa0I7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDdEQsVUFBVTtZQUNWLFlBQVk7WUFDWixpQkFBaUI7WUFDakIsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1lBQ2IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztTQUN0QyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUV2RyxPQUFPO1lBQ0wsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLGtCQUFrQixHQUFHLEtBQUssRUFDMUIsYUFBd0MsRUFDeEMsVUFBOEI7UUFFOUIsSUFBSSxjQUE4QixDQUFDO1FBQ25DLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLHdCQUF3QixHQUFHLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRyxjQUFjLEdBQUc7Z0JBQ2Ysa0JBQWtCLEVBQUUsd0JBQXdCO2FBQzdDLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBSyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1osY0FBYyxHQUFHO2dCQUNmLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM5QyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUNqQixVQUFVLEVBQ1YsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osY0FBYyxFQUNkLGFBQWEsRUFDYixVQUFVLEVBQ1YsOEJBQThCLEVBQzlCLGtCQUFrQixHQUFHLEtBQUssR0FDQTtRQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxJQUFJLGtCQUFrQixJQUFJLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUN2RSxPQUFPLElBQUksQ0FBQyxzQ0FBc0MsQ0FDaEQsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFtQixFQUNuQixZQUFZLEVBQ1osY0FBYyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFDM0MsYUFBYSxFQUNiLFVBQVUsRUFDViw4QkFBOEIsQ0FDL0IsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFBLGdCQUFNLEVBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLFVBQVUsRUFDVixZQUF5QyxFQUN6QyxpQkFBaUIsRUFDakIsQ0FBQyxFQUNELFlBQVksRUFDWixjQUFjLENBQUMsZ0JBQWdCLEVBQy9CLGFBQWEsRUFDYixVQUFVLEVBQ1YsOEJBQThCLENBQy9CLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQ3pCLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLGNBQWMsRUFDZCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEdBQ1k7UUFDMUIsSUFBSSxJQUFJLENBQUMsK0JBQStCLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxDQUFDLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3pHLElBQUEsZ0JBQU0sRUFBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FDeEUsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFDcEMsYUFBYSxDQUFDLGNBQWMsRUFDNUIsWUFBWSxFQUNaLGFBQWEsRUFDYixVQUFVLEVBQ1YsWUFBbUIsQ0FDcEIsQ0FBQztZQUNGLElBQUksdUJBQXVCLENBQUMsY0FBYyxLQUFLLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBd0I7Z0JBQzNDLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixPQUFPLEVBQUUsS0FBSztnQkFDZCxjQUFjLEVBQUUsdUJBQXVCLENBQUMsY0FBYztnQkFDdEQsUUFBUSxFQUFFLGNBQWMsSUFBSSxpQkFBaUI7YUFDOUMsQ0FBQztZQUNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckYsY0FBYyxDQUFDLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQyxTQUFTLENBQUM7WUFDN0QsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUEsZ0JBQU0sRUFBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLFVBQVUsRUFDVixZQUF5QyxFQUN6QyxpQkFBaUIsRUFDakIsQ0FBQyxFQUNELFlBQVksRUFDWixjQUFjLENBQUMsZ0JBQWdCLEVBQy9CLGFBQWEsRUFDYixVQUFVLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQ3hCLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLGNBQWMsRUFDZCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUFHLEtBQUssR0FDSztRQUMvQixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLGFBQWEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWxILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQzVELGNBQWMsRUFDZCxjQUFjLEVBQ2QsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEVBQ3pCLFlBQXlDLEVBQ3pDLGtCQUFrQixDQUNuQixDQUFDO1FBRUYsTUFBTSxvQkFBb0IsR0FBdUI7WUFDL0MsT0FBTyxFQUFFLEtBQWdCO1lBQ3pCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLEVBQUUsRUFBRSxPQUFPO29CQUNYLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXO29CQUN6QyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMscUJBQXFCO29CQUNwRCxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDckIsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7b0JBQ25DLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLGlCQUFpQjtpQkFDdEQ7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsRUFBRSxFQUFFLE9BQU87b0JBQ1gsV0FBVyxFQUFFLGtCQUFrQixDQUFDLFdBQVc7b0JBQzNDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxxQkFBcUI7b0JBQ3RELENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO29CQUN2QixRQUFRLEVBQUUsa0JBQWtCLENBQUMsUUFBUTtvQkFDckMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsaUJBQWlCO2lCQUN4RDthQUNGO1lBQ0QsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDdEMsa0JBQWtCLEVBQUUsa0JBQWtCO2dCQUNwQyxDQUFDLENBQUUsWUFBb0IsQ0FBQyxLQUFLLEVBQUU7Z0JBQy9CLENBQUMsQ0FBRSxZQUEwQyxDQUFDLFNBQVM7WUFDekQsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQztRQUVGLE9BQU8sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FDNUIsV0FBMkIsRUFDM0IsY0FBc0IsRUFDdEIsdUJBQStCLEVBQy9CLFlBQXVDLEVBQ3ZDLGtCQUFrQixHQUFHLEtBQUs7UUFFMUIsSUFBSSxzQkFBdUMsQ0FBQztRQUM1QyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQzdFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUEsK0JBQXVCLEVBQUMsY0FBYyxDQUFDLENBQ3BHLENBQUM7WUFDRixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsSUFBQSwrQkFBdUIsRUFBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUYsQ0FBQztZQUNELDhEQUE4RDtZQUM5RCxzQkFBc0IsR0FBRyxNQUFNLElBQUEsa0NBQTBCLEVBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN2RixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyQyxzQkFBc0IsR0FBRyxNQUFNLGFBQWEsQ0FDMUMsV0FBVyxDQUFDLGdCQUFnQixFQUM1QixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLFlBQVksQ0FDYixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxzQ0FBc0MsQ0FDMUMsVUFBNkMsRUFDN0MsaUJBQXNCLEVBQ3RCLDRCQUFpQyxFQUNqQyxZQUFzQixFQUN0Qix5QkFBd0MsRUFDeEMsYUFBdUIsRUFDdkIsVUFBa0IsRUFDbEIsOEJBQXVDO1FBRXZDLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ2hILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQyxJQUFJLENBQ3RELENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FDbkUsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUEsa0NBQTBCLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBQSxrQ0FBMEIsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sZ0JBQWdCLEdBQXdCO1lBQzVDO2dCQUNFLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxVQUFVO2dCQUM1QyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZELGFBQWEsRUFBRSxLQUFLO2FBQ3JCO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIscUJBQXFCLEVBQUUsVUFBVSxDQUFDLFVBQVU7Z0JBQzVDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRTtnQkFDNUMsYUFBYSxFQUFFLEtBQUs7YUFDckI7U0FDRixDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsTUFBTSxlQUFZLENBQUMsaUJBQWlCLENBQzFELFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsYUFBYSxDQUFDLGNBQWMsQ0FDN0IsQ0FBQztRQUNGLElBQUksZUFBZSxDQUFDLGNBQWMsS0FBSyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1RCxNQUFNLGtCQUFrQixHQUFHO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLEtBQWdCO1lBQ3pCLGNBQWMsRUFBRSxlQUFlLENBQUMsY0FBYztZQUM5QyxHQUFHLEVBQUUsR0FBRztZQUNSLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsUUFBUSxFQUFFLFVBQVU7YUFDckIsQ0FBQztZQUNGLDhCQUE4QjtTQUMvQixDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxPQUFPLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixVQUE2QyxFQUM3QyxxQkFBd0QsRUFDeEQsaUJBQXNCLEVBQ3RCLGNBQXNCLEVBQ3RCLFlBQXNCLEVBQ3RCLGNBQXdCLEVBQ3hCLGFBQXVCLEVBQ3ZCLFVBQWtCLEVBQ2xCLDhCQUF1QztRQUV2QyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxVQUFvQixDQUFDO1FBQ3pCLElBQUksZUFBa0QsQ0FBQztRQUN2RCxJQUFJLFlBQStDLENBQUM7UUFDcEQsSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsUUFBUSxHQUFHLFlBQVksQ0FBQztZQUN4QixVQUFVLEdBQUcsY0FBYyxDQUFDO1lBQzVCLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDbkIsZUFBZSxHQUFHLFVBQVUsQ0FBQztZQUM3QixZQUFZLEdBQUcscUJBQXFCLENBQUM7UUFDdkMsQ0FBQzthQUFNLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFFBQVEsR0FBRyxjQUFjLENBQUM7WUFDMUIsVUFBVSxHQUFHLFlBQVksQ0FBQztZQUMxQixTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQztZQUN4QyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQy9DLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FDckUsQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFNBQVMsWUFBWSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUUzRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FDL0IsVUFBVSxDQUFDLFNBQVMsRUFDcEIscUJBQXFCLENBQUMsU0FBUyxFQUMvQixhQUFhLEVBQ2IsY0FBYyxFQUNkLGNBQWMsQ0FDZixDQUFDO1FBRUYsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLGFBQWEsQ0FDaEQsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLENBQUMsU0FBUyxFQUN6QixZQUFZLENBQ2IsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQXdCO1lBQzVDO2dCQUNFLCtCQUErQjtnQkFDL0IsTUFBTSxFQUFFLHNCQUFzQjtnQkFDOUIscUJBQXFCLEVBQUUsZUFBZSxDQUFDLFVBQVU7Z0JBQ2pELGlCQUFpQixFQUFFLFlBQVksQ0FBQyxTQUFTO2FBQzFDO1lBQ0Q7Z0JBQ0UsbUJBQW1CO2dCQUNuQixNQUFNLEVBQUU7b0JBQ04sQ0FBQyxFQUFFLGNBQWM7b0JBQ2pCLENBQUMsRUFBRSxDQUFDO29CQUNKLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxXQUFXO29CQUM5QyxxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQyxZQUFZO29CQUN6RCxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBRTtvQkFDM0IsUUFBUSxFQUFFLHFCQUFxQixDQUFDLFFBQVE7b0JBQ3hDLGlCQUFpQixFQUFFLHFCQUFxQixDQUFDLGlCQUFpQjtpQkFDM0Q7Z0JBQ0QscUJBQXFCLEVBQUUsZUFBZSxDQUFDLFVBQVU7Z0JBQ2pELGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRTtnQkFDNUMsYUFBYSxFQUFFLEtBQUs7YUFDckI7U0FDRixDQUFDO1FBRUYsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLGVBQVksQ0FBQyxpQkFBaUIsQ0FDL0QsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixhQUFhLENBQUMsY0FBYyxDQUM3QixDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRSxNQUFNLHVCQUF1QixHQUFHO1lBQzlCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE9BQU8sRUFBRSxLQUFnQjtZQUN6QixjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWM7WUFDNUMsR0FBRyxFQUFFLEdBQUc7WUFDUixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLEtBQUssRUFBRSxHQUFHO2dCQUNWLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUM7WUFDRiw4QkFBOEI7U0FDL0IsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsT0FBTyxjQUFjLEtBQUssQ0FBQztZQUN6QixDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDO1lBQzlDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGtDQUFrQyxDQUFDLE1BUWhEO1FBQ0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ25ELE1BQU0sbUJBQW1CLEdBQXFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUM5QixtQkFBbUIsQ0FBQyxNQUFNLEVBQzFCLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUNuRSxjQUFjLENBQ2YsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLHdCQUFnQixDQUFDLEtBQUssQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDO1FBQ3BGLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDO1FBQ3RGLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1RyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUNyQztZQUNFLENBQUMsRUFBRSxTQUFTO1lBQ1osQ0FBQyxFQUFFLFVBQVU7WUFDYixDQUFDLEVBQUUsRUFBRTtTQUNOLEVBQ0QsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUNyQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDVixDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsTUFBTSxlQUFZLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNDLElBQUksU0FBUyxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDMUQsT0FBTyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzdCLFNBQVMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQzlCLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxnQkFBSyxDQUFDLGNBQWMsQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFHLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxJQUFBLGdDQUFpQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNoRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2xELE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQ25DLElBQUksRUFBRSxXQUFXO2FBQ2xCLENBQUM7WUFDRixNQUFNLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLElBQUksR0FBRyxFQUFFO2FBQ3hCO1lBQ0QsY0FBYyxFQUFFLENBQUMsV0FBVyxDQUFDO1NBQzlCLENBQUMsQ0FBVyxDQUFDO1FBQ2QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFBLCtCQUFnQixFQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkgsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hHLE9BQU87WUFDTCxpQkFBaUIsRUFBRSxpQkFBaUI7WUFDcEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVc7WUFDeEIsMEJBQTBCLEVBQUUsb0JBQW9CO1lBQ2hELGdCQUFnQixFQUFFLGdCQUFnQjtZQUNsQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07WUFDNUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7Z0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hHLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTTtTQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxNQUtoRDtRQUNDLDJFQUEyRTtRQUMzRSxNQUFNLDJCQUEyQixHQUFXO1lBQzFDLEdBQUcsTUFBTSxDQUFDLGVBQWU7WUFDekIsR0FBRyxNQUFNLENBQUMsY0FBYztTQUN6QixDQUFDO1FBQ0YsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLGVBQVksQ0FBQyx5QkFBeUIsQ0FDdkUsTUFBTSxDQUFDLE1BQU0sRUFDYiwyQkFBMkIsQ0FDNUIsQ0FBQztRQUNGLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxlQUFZLENBQUMsOEJBQThCLENBQ2hGLG9CQUFvQixDQUFDLE1BQXNCLENBQzVDLENBQUM7UUFDRixPQUFPO1lBQ0wsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxPQUFPO2dCQUNyQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsTUFBTTtnQkFDdkMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7Z0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztvQkFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO29CQUN0RCxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtpQkFDbEMsQ0FBQztnQkFDSixDQUFDLENBQUMsd0JBQXdCLENBQUMsTUFBTTtTQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtCQUErQixDQUFDLE1BQXVCO1FBQ3JELElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsR0FBRyxFQUFFLGlEQUFpRCxDQUFDLENBQUM7UUFDdEUsTUFBTSxtQkFBbUIsR0FBcUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BU3pCO1FBQ0MsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMzRCxJQUFBLGdCQUFNLEVBQUMsT0FBTyxTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sU0FBUyxHQUFjLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDakQsSUFBSSxjQUFjLENBQUM7UUFFbkIsSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxJQUFBLGdCQUFNLEVBQ0osU0FBUyxDQUFDLFlBQVksSUFBSyxTQUF1QixDQUFDLFdBQVcsRUFDOUQsMENBQTBDLENBQzNDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FDZCxTQUFTLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckcsY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUM7UUFDN0MsQ0FBQzthQUFNLElBQUksV0FBVyxLQUFLLHVCQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0MscURBQXFEO1lBQ3JELGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDO1lBQzdDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsVUFBVSxFQUFFLFVBQVU7WUFDdEIsY0FBYyxFQUFFLGNBQWM7WUFDOUIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BSy9CO1FBQ0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNqSCxPQUFPLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUFDO1lBQ25ELGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZTtZQUN2QyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ25DLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQU16QjtRQUNDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDOUYsSUFBQSxnQkFBTSxFQUFDLE9BQU8sU0FBUyxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUMxRSxNQUFNLFNBQVMsR0FBYyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ2pELElBQUksZUFBZSxDQUFDO1FBQ3BCLElBQUksV0FBVyxLQUFLLHVCQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkMsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sVUFBVSxHQUNkLFNBQVMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRyxlQUFlLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUFJLFdBQVcsS0FBSyx1QkFBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9DLGVBQWUsR0FBSSxNQUFNLENBQUMsU0FBaUMsQ0FBQyxZQUFZLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksSUFBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksR0FBRyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLGVBQVksQ0FBQyx3QkFBd0IsQ0FDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFDM0IsZUFBZSxFQUNmLGVBQWUsRUFDZixJQUFJLENBQ0wsQ0FBQztRQUNGLDJEQUEyRDtRQUMzRCxPQUFPO1lBQ0wsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxNQUF1QyxFQUN2QyxXQUF3QixFQUN4QixtQ0FBd0UsRUFDeEUsNkJBQTZELEVBQzdELG1DQUF5RSxFQUN6RSw2QkFBNkQ7UUFFN0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUM3QixNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsNkJBQTZCLENBQUM7UUFDaEcsSUFBSSw2QkFBNkIsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEhBQThILENBQy9ILENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQWMsTUFBTSxJQUFBLGtCQUFZLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQW1CLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BILE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE1BQU0sbUNBQW1DLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQ2xGLFNBQW1CLEVBQ25CLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsQ0FBQyxFQUNELE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSw2QkFBNkIsQ0FBQztZQUMvRCxTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxNQUFNO2dCQUNULFNBQVMsRUFBRSxZQUFZO2FBQ3hCO1lBQ0QsVUFBVSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFO1lBQ25ELFdBQVcsRUFBRSxXQUFXO1NBQ3pCLENBQUMsQ0FBQztRQUNILG9FQUFvRTtRQUNwRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxlQUFZLENBQUMsZ0JBQWdCLENBQzVELElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDaEIsWUFBWSxDQUFDLFdBQVcsRUFDeEIsV0FBVyxFQUNYLHFCQUFhLENBQUMsTUFBTSxFQUNwQixvQkFBb0IsQ0FBQyxNQUFNLEVBQzNCLG9CQUFvQixDQUFDLDBCQUEwQixFQUMvQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQzdCLG9CQUFvQixDQUFDLGlCQUFpQixFQUN0QyxvQkFBb0IsQ0FBQyxXQUFXLEVBQ2hDLG9CQUFvQixDQUFDLGdCQUFnQixFQUNyQyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQXlDLENBQUMsQ0FBQywrQ0FBK0M7UUFDM0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxtQ0FBbUMsQ0FBQztZQUM1RCxTQUFTLEVBQUUsWUFBWTtZQUN2QixlQUFlLEVBQUUsaUJBQWlCO1lBQ2xDLGNBQWMsRUFBRSxjQUFjO1lBQzlCLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxNQUFnQjtTQUN2RCxDQUFDLENBQUM7UUFDSCwrRUFBK0U7UUFDL0UsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sZUFBWSxDQUFDLGdCQUFnQixDQUM1RCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQ2hCLFlBQVksQ0FBQyxXQUFXLEVBQ3hCLFdBQVcsRUFDWCxxQkFBYSxDQUFDLE9BQU8sRUFDckIsV0FBVyxDQUFDLFFBQVEsRUFDcEIsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFNLENBQUMsS0FBSyxDQUNiLENBQVcsQ0FBQztRQUNiLE1BQU0sVUFBVSxHQUFHLE1BQU0sNkJBQTZCLENBQUM7WUFDckQsU0FBUyxFQUFFO2dCQUNULEdBQUcsTUFBTTtnQkFDVCxTQUFTLEVBQUUsWUFBWTthQUN4QjtZQUNELGVBQWUsRUFBRSxpQkFBaUI7WUFDbEMsV0FBVyxFQUFFLFdBQVc7WUFDeEIsZUFBZSxFQUFFLFdBQVcsQ0FBQyxNQUFnQjtTQUM5QyxDQUFDLENBQUM7UUFDSCxvRUFBb0U7UUFDcEUsTUFBTSxlQUFZLENBQUMsZ0JBQWdCLENBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDaEIsWUFBWSxDQUFDLFdBQVcsRUFDeEIsV0FBVyxFQUNYLHFCQUFhLENBQUMsTUFBTSxFQUNwQixVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFDRixPQUFPLE1BQU0sSUFBQSxrQkFBWSxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGVBQWUsQ0FDM0IsTUFBcUQsRUFDckQsV0FBd0I7UUFFeEIsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLDZCQUE2QixDQUFDO1FBQ2hHLElBQUksNkJBQTZCLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLDhIQUE4SCxDQUMvSCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQXFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JGLElBQUksbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQ2xDLENBQUMsQ0FBQyxNQUFNLElBQUEsa0JBQVksRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBRXZCLElBQUksZUFBZSxHQUFHLElBQUksZUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUV4QixJQUFJLFdBQVcsS0FBSyx1QkFBVyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUNwRyxNQUFNLFVBQVUsR0FDZCxTQUFTLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckcsZUFBZSxHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RCxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxlQUFlLEdBQUksTUFBOEIsQ0FBQyxZQUFZLENBQUM7WUFDL0QscURBQXFEO1FBQ3ZELENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQ3JELFNBQVMsQ0FBQyxXQUFXLEVBQ3JCLFdBQVcsRUFDWCxlQUFlLENBQUMsbUJBQW1CLEVBQ25DLENBQUMsRUFDRCxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztZQUNoRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7WUFDZixVQUFVLEVBQUUsVUFBVTtZQUN0QixjQUFjLEVBQUUsY0FBYztTQUMvQixDQUFDLENBQUM7UUFFSCxvRUFBb0U7UUFDcEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sZUFBWSxDQUFDLGdCQUFnQixDQUM1RCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQ2hCLFNBQVMsQ0FBQyxXQUFXLEVBQ3JCLFdBQVcsRUFDWCxxQkFBYSxDQUFDLE1BQU0sRUFDcEIsV0FBVyxDQUFDLE1BQU0sRUFDbEIsV0FBVyxDQUFDLDBCQUEwQixFQUN0QyxXQUFXLENBQUMsUUFBUSxFQUNwQixXQUFXLENBQUMsaUJBQWlCLEVBQzdCLFdBQVcsQ0FBQyxXQUFXLEVBQ3ZCLFdBQVcsQ0FBQyxnQkFBZ0IsRUFDNUIsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUF5QyxDQUFDLENBQUMsK0NBQStDO1FBRTNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUFDO1lBQ2hFLGVBQWUsRUFBRSxpQkFBaUI7WUFDbEMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO1lBQ3pDLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBZ0I7U0FDckMsQ0FBQyxDQUFDO1FBRUgsK0VBQStFO1FBQy9FLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFNLGVBQVksQ0FBQyxnQkFBZ0IsQ0FDNUQsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUNoQixTQUFTLENBQUMsV0FBVyxFQUNyQixXQUFXLEVBQ1gscUJBQWEsQ0FBQyxPQUFPLEVBQ3JCLFdBQVcsQ0FBQyxRQUFRLEVBQ3BCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFXLENBQUM7UUFFYix5RUFBeUU7UUFDekUsK0RBQStEO1FBQy9ELElBQUksSUFBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksR0FBRyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sZUFBWSxDQUFDLHdCQUF3QixDQUM1RCxXQUFXLENBQUMsTUFBZ0IsRUFDNUIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixJQUFJLENBQ0wsQ0FBQztRQUVGLG9FQUFvRTtRQUNwRSxNQUFNLGVBQVksQ0FBQyxnQkFBZ0IsQ0FDakMsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUNoQixTQUFTLENBQUMsV0FBVyxFQUNyQixXQUFXLEVBQ1gscUJBQWEsQ0FBQyxNQUFNLEVBQ3BCLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztRQUNGLE9BQU8sTUFBTSxJQUFBLGtCQUFZLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQXdCO1FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsdUJBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE1BQWtDO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLHVCQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixXQUFtQixFQUNuQixXQUF3QixFQUN4QixxQkFBNkIsRUFDN0IsS0FBSyxHQUFHLENBQUMsRUFDVCxLQUFzQjtRQUt0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNyRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLElBQUEsOEJBQXFCLEVBQzlELElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDaEIsV0FBVyxFQUNYLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFDaEIsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixLQUFLLENBQ04sQ0FBQztRQUVGLE1BQU0sa0NBQWtDLEdBQUcsRUFBRSxDQUFDLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakYsTUFBTSxrQ0FBa0MsR0FBRyx3QkFBVSxDQUFDLDBCQUEwQixDQUFDO1lBQy9FLENBQUMsRUFBRSxNQUFNLGdDQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFBLHlCQUFXLEVBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkYsQ0FBQyxDQUFDO1FBRUgsbUdBQW1HO1FBQ25HLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFMUUsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDM0QsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDN0csTUFBTSx1QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQyxhQUFhLENBQUM7UUFFdEUsaUZBQWlGO1FBQ2pGLE1BQU0sc0JBQXNCLEdBQUc7WUFDN0IsTUFBTSxFQUFFLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLE1BQU07WUFDbkQsRUFBRSxFQUFFLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDM0MsRUFBRSxFQUFFLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7U0FDNUMsQ0FBQztRQUNGLE1BQU0sNEJBQTRCLEdBQVcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUMzRyxJQUNFLENBQUMsSUFBQSwwQkFBbUIsRUFDbEIsVUFBVSxDQUFDLDZCQUE2QixDQUFDLHNCQUFzQixDQUFDLEVBQ2hFLDRCQUE0QixFQUM1QixlQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUM1QyxFQUNELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhGQUE4RixDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUVELDhFQUE4RTtRQUM5RSxNQUFNLGNBQWMsR0FBK0I7WUFDakQsTUFBTSxFQUFFLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQzlDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUN0QyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDdEMsQ0FBQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLENBQUM7U0FDbEMsQ0FBQztRQUNGLE1BQU0sMkNBQTJDLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFDN0csSUFDRSxDQUFDLElBQUEsMEJBQW1CLEVBQ2xCLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsRUFDeEQsMkNBQTJDLEVBQzNDLGVBQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQzVDLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMkZBQTJGLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBRUQsT0FBTztZQUNMLG1CQUFtQixFQUFFO2dCQUNuQixHQUFHLHNCQUFzQjtnQkFDekIsQ0FBQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7YUFDeEM7WUFDRCxjQUFjO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixhQUF1QixFQUN2QixjQUFzQixFQUN0QixhQUFvQjtRQUVwQixJQUFBLGdCQUFNLEVBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLElBQUEsZ0JBQU0sRUFBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBQSxnQ0FBaUIsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN6RSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUM7UUFDMUcsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDM0csQ0FBQztRQUNELElBQUksV0FBVyxLQUFLLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsMEZBQTBGLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsTUFBTSxJQUFBLDZCQUFxQixFQUFDO1lBQzFCLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDcEMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjO1lBQzVDLFNBQVM7WUFDVCxXQUFXO1lBQ1gsUUFBUSxFQUFFLFdBQVc7WUFDckIsY0FBYztZQUNkLGFBQWE7U0FDZCxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUEsNkJBQXFCLEVBQUM7WUFDMUIsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUNwQyxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWM7WUFDNUMsU0FBUztZQUNULFdBQVc7WUFDWCxRQUFRLEVBQUUsV0FBVztZQUNyQixjQUFjO1lBQ2QsYUFBYTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBc0MsRUFBRSxRQUFnQixFQUFFLGNBQXNCO1FBQ25HLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRSxPQUFPLElBQUEsb0NBQTZCLEVBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFNBQXNDO1FBQ3pFLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsZUFBc0M7UUFDdkUsMkNBQTJDO1FBQzNDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDNUQsTUFBTSxFQUFFLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNO1lBQ3BELEVBQUUsRUFBRSxlQUFlLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUM1QyxFQUFFLEVBQUUsZUFBZSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDNUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXO1NBQy9ELENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQzdELE1BQU0sRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDNUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNwQyxFQUFFLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3BDLFdBQVcsRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVc7U0FDdkQsQ0FBQyxDQUFDO1FBRUgsT0FBTyxxQkFBcUIsSUFBSSxzQkFBc0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxjQUFxRDtRQUNyRixNQUFNLHlCQUF5QixHQUFHLHdCQUFVLENBQUMsMkJBQTJCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekYsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLDZCQUFlLENBQUMsaUJBQWlCLENBQ3hFO1lBQ0UsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU07WUFDeEMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7WUFDaEMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7U0FDakMsRUFDRCx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUM5QyxDQUFDO1FBQ0YsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLDZCQUFlLENBQUMsaUJBQWlCLENBQ3hFO1lBQ0UsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU07WUFDeEMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7WUFDaEMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7U0FDakMsRUFDRCx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUM5QyxDQUFDO1FBQ0YsT0FBTywwQkFBMEIsSUFBSSwwQkFBMEIsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFnQjtRQUM5QyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25GLElBQ0UsQ0FBQyxHQUFHLENBQUMsYUFBYTtZQUNsQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTTtZQUN6QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNyQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNyQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVztZQUM5QixDQUFDLEdBQUcsQ0FBQyxxQkFBcUI7WUFDMUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsTUFBTTtZQUNqQyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1lBQzdCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDN0IsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUN0QyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQzFDLEtBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLFlBQW9CO1FBRXBCLHFDQUFxQztRQUNyQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sVUFBVSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxDQUFDLE1BQU0sVUFBVSxDQUFDLHFCQUFxQixDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQ2IscUdBQXFHLENBQ3RHLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUM5QixLQUFnQixFQUNoQixZQUFvQixFQUNwQixZQUFvQixFQUNwQix5QkFBaUQ7UUFFakQsK0NBQStDO1FBQy9DLE1BQU0sb0JBQW9CLEdBQUcseUJBQXlCO1lBQ3BELENBQUMsQ0FBQyx5QkFBeUI7WUFDM0IsQ0FBQyxDQUFDLE1BQU0sVUFBVSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9DLHNFQUFzRTtRQUN0RSxNQUFNLFdBQVcsR0FBRyxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFbEYsTUFBTSx3QkFBd0IsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUN2RCxvQkFBb0IsQ0FBQyxxQkFBcUIsRUFDMUMsV0FBVyxDQUFDLElBQUksRUFDaEIsV0FBVyxDQUFDLGNBQWMsQ0FDM0IsQ0FBQztRQUNGLE1BQU0seUJBQXlCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FDeEQsb0JBQW9CLENBQUMsYUFBYSxFQUNsQyxXQUFXLENBQUMsSUFBSSxFQUNoQixXQUFXLENBQUMsY0FBYyxDQUMzQixDQUFDO1FBQ0YsT0FBTztZQUNMLDBCQUEwQixFQUFFLHdCQUF3QjtZQUNwRCwyQkFBMkIsRUFBRSx5QkFBeUI7U0FDdkQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FDMUMsS0FBZ0IsRUFDaEIsS0FBYSxFQUNiLFlBQW9CLEVBQ3BCLGdDQUF3QyxFQUN4QyxpQ0FBeUMsRUFDekMsWUFBd0IsRUFDeEIsU0FBbUQ7UUFFbkQsc0VBQXNFO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzRSx5Q0FBeUM7UUFDekMsTUFBTSxxQkFBcUIsR0FDekIsU0FBUyxJQUFJLENBQUMsTUFBTSw2QkFBZSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsaUNBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sK0JBQStCLEdBQUcsd0JBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BHLE1BQU0seUJBQXlCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FDeEQsK0JBQStCLEVBQy9CLFdBQVcsQ0FBQyxJQUFJLEVBQ2hCLFdBQVcsQ0FBQyxjQUFjLENBQzNCLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDckMsS0FBSyxFQUNMLEtBQUssRUFDTCwrQkFBK0IsRUFDL0IseUJBQXlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUN6QyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ2hELGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUN2QyxLQUFnQixFQUNoQixLQUFhLEVBQ2IsWUFBaUYsRUFDakYscUJBQTZCLEVBQzdCLDBCQUFrQyxFQUNsQyw0QkFBb0M7UUFFcEMsTUFBTSxJQUFJLEdBQUc7WUFDWCxVQUFVLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO2dCQUMzQixFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ25CLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDbkIsU0FBUyxFQUFFO29CQUNULGNBQWMsRUFBRSxxQkFBcUI7aUJBQ3RDO2FBQ0Y7WUFDRCxxQkFBcUIsRUFBRTtnQkFDckIsU0FBUyxFQUFFO29CQUNULGNBQWMsRUFBRSwwQkFBMEI7aUJBQzNDO2FBQ0Y7WUFDRCxhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFO29CQUNULGNBQWMsRUFBRSw0QkFBNEI7aUJBQzdDO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsSUFBSSxhQUFhLElBQUksWUFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQzVELENBQUM7UUFDRCxNQUFNLEtBQUs7YUFDUixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBejBDRCxnQ0F5MENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBLZXksIFNlcmlhbGl6ZWRLZXlQYWlyIH0gZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IEVjZHNhUGFpbGxpZXJQcm9vZiwgRWNkc2FSYW5nZVByb29mLCBFY2RzYVR5cGVzLCBoZXhUb0JpZ0ludCwgbWluTW9kdWx1c0JpdExlbmd0aCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmltcG9ydCB7IEVDRFNBLCBFY2RzYSB9IGZyb20gJy4uLy4uLy4uLy4uL2FjY291bnQtbGliL21wYy90c3MnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBBcGlLZXlTaGFyZSwgQ3JlYXRlQmFja3VwT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUgfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgRUNEU0FNZXRob2RzLCB7IEVDRFNBTWV0aG9kVHlwZXMgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7XG4gIEJpdEdvUHJvb2ZTaWduYXR1cmVzLFxuICBDcmVhdGVFY2RzYUJpdEdvS2V5Y2hhaW5QYXJhbXMsXG4gIENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMsXG4gIERlY3J5cHRhYmxlTlNoYXJlLFxuICBHZXRCaXRHb0NoYWxsZW5nZXNBcGksXG4gIEtleVNoYXJlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEJhY2t1cEtleVNoYXJlLFxuICBCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSxcbiAgQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbVBhaWxsaWVyTW9kdWx1c0dldHRlckZ1bmN0aW9uLFxuICBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHsgQVNoYXJlLCBEU2hhcmUsIEVuY3J5cHRlZE5TaGFyZSwgU2VuZFNoYXJlVHlwZSwgU1NoYXJlLCBXU2hhcmUsIE9TaGFyZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTaGFyZVByb29mLCBnZW5lcmF0ZUdQR0tleVBhaXIsIGdldEJpdGdvR3BnUHViS2V5IH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBCYWNrdXBQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3dhbGxldCc7XG5pbXBvcnQgeyBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZSwgZ2V0UGFydGljaXBhbnRGcm9tSW5kZXgsIHZlcmlmeVdhbGxldFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYSc7XG5pbXBvcnQgeyBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleSwgdmVyaWZ5RWNkaFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL2VjZGgnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0Q2hhbGxlbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQge1xuICBTaGFyZUtleVBvc2l0aW9uLFxuICBUc3NFY2RzYVN0ZXAxUmV0dXJuTWVzc2FnZSxcbiAgVHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2UsXG4gIFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi8uLi8uLi90c3MvdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUVjZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgSVJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGknO1xuXG5jb25zdCBlbmNyeXB0TlNoYXJlID0gRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmU7XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGNsYXNzIEVjZHNhVXRpbHMgZXh0ZW5kcyBCYXNlRWNkc2FVdGlscyB7XG4gIGFzeW5jIGZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5OiBLZXlcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIDIsXG4gICAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICB1c2VyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwS2V5U2hhcmUgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcz8uZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGNvbnN0IHVzZXJQdWJsaWNTaGFyZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0ueSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0uY2hhaW5jb2RlLCAnaGV4JyksXG4gICAgXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwS2V5U2hhcmUpO1xuICAgIGNvbnN0IGtleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJhc2VDb2luLnVybChgL2tycy9iYWNrdXBrZXlzLyR7a2V5SWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgICB0bzogJ2JhY2t1cCcsXG4gICAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgICAgICB2c3NQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaXRnb1RvQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGlmICgha2V5UmVzcG9uc2UgfHwgIWtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCBiYWNrdXAga2V5IHZlcmlmaWNhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBrZXlSZXNwb25zZS5pZCxcbiAgICAgIGtleVNoYXJlczoga2V5UmVzcG9uc2Uua2V5U2hhcmVzLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBiYWNrdXBQcm92aWRlcj86IEJhY2t1cFByb3ZpZGVyO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBhd2FpdCBNUEMua2V5U2hhcmUoMSwgbSwgbik7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgaXNUaGlyZFBhcnR5QmFja3VwID0gdGhpcy5pc1ZhbGlkVGhpcmRQYXJ0eUJhY2t1cFByb3ZpZGVyKHBhcmFtcy5iYWNrdXBQcm92aWRlcik7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEtleVNoYXJlcyhpc1RoaXJkUGFydHlCYWNrdXAsIHVzZXJHcGdLZXksIHBhcmFtcy5lbnRlcnByaXNlKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEdwZ1B1YktleShpc1RoaXJkUGFydHlCYWNrdXApO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBwdWJsaWMga2V5IGJhc2VkIG9uIHVzZXIvZW50ZXJwcmlzZSBmZWF0dXJlIGZsYWdzXG4gICAgLy8gSWYgaXQgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgcHVibGljIGtleSBmcm9tIHRoZSBjb25zdGFudHNcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9XG4gICAgICAoYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UpKSA/PyB0aGlzLmJpdGdvUHVibGljR3BnS2V5O1xuXG4gICAgY29uc3QgYml0Z29LZXljaGFpbiA9IGF3YWl0IHRoaXMuY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgaXNUaGlyZFBhcnR5QmFja3VwLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZVVzZXJLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgYmFja3VwUHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBQcm92aWRlcixcbiAgICB9KTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW5Qcm9taXNlLCBiYWNrdXBLZXljaGFpblByb21pc2VdKTtcblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIHRoaXJkIHBhcnR5IGJhY2t1cCBpcyByZXF1ZXN0ZWQsIGl0IHdpbGwgY3JlYXRlIGJhY2t1cCBzaGFyZXMgZnJvbVxuICAgKiBhIHRoaXJkIHBhcnR5IChCaXRHbyBhcyBvZiBub3cpLCBvdGhlcndpc2UgdGhlIGtleSBzaGFyZXMgd2lsbCBiZSBjbGllbnQgZ2VuZXJhdGVkXG4gICAqL1xuICBhc3luYyBjcmVhdGVCYWNrdXBLZXlTaGFyZXMoXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2UsXG4gICAgdXNlckdwZ1B1YktleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGxldCBiYWNrdXBLZXlTaGFyZTogQmFja3VwS2V5U2hhcmU7XG4gICAgaWYgKGlzVGhpcmRQYXJ0eUJhY2t1cCkge1xuICAgICAgY29uc3QgYml0Z29IZWxkQmFja3VwS2V5U2hhcmVzID0gYXdhaXQgdGhpcy5jcmVhdGVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSh1c2VyR3BnUHViS2V5LCBlbnRlcnByaXNlKTtcbiAgICAgIGJhY2t1cEtleVNoYXJlID0ge1xuICAgICAgICBiaXRHb0hlbGRLZXlTaGFyZXM6IGJpdGdvSGVsZEJhY2t1cEtleVNoYXJlcyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgICAgY29uc3QgbSA9IDI7XG4gICAgICBjb25zdCBuID0gMztcbiAgICAgIGJhY2t1cEtleVNoYXJlID0ge1xuICAgICAgICB1c2VySGVsZEtleVNoYXJlOiBhd2FpdCBNUEMua2V5U2hhcmUoMiwgbSwgbiksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYmFja3VwS2V5U2hhcmU7XG4gIH1cblxuICBjcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIHBhc3NwaHJhc2UsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlLFxuICB9OiBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGlmICghcGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuICAgIGlmIChpc1RoaXJkUGFydHlCYWNrdXAgJiYgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzPy5rZXlTaGFyZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVzZXJLZXljaGFpbkZyb21UaGlyZFBhcnR5QmFja3VwKFxuICAgICAgICB1c2VyR3BnS2V5LFxuICAgICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgICAgYmFja3VwR3BnS2V5IGFzIEtleSxcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMua2V5U2hhcmVzLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICAgICk7XG4gICAgfVxuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAxLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICBwYXNzcGhyYXNlLFxuICAgIGJhY2t1cFByb3ZpZGVyLFxuICB9OiBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGlmICh0aGlzLmlzVmFsaWRUaGlyZFBhcnR5QmFja3VwUHJvdmlkZXIoYmFja3VwUHJvdmlkZXIpICYmIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcz8ua2V5U2hhcmVzKSB7XG4gICAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgICBjb25zdCBmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZSA9IGF3YWl0IHRoaXMuZmluYWxpemVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZShcbiAgICAgICAgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzLmlkLFxuICAgICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHVzZXJHcGdLZXksXG4gICAgICAgIGJhY2t1cEdwZ0tleSBhcyBLZXlcbiAgICAgICk7XG4gICAgICBpZiAoZmluYWxpemVkQmFja3VwS2V5U2hhcmUuY29tbW9uS2V5Y2hhaW4gIT09IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGJhY2t1cCBrZXljaGFpbiAtIGNvbW1vbktleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cEtleVBhcmFtczogQ3JlYXRlQmFja3VwT3B0aW9ucyA9IHtcbiAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiBmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZS5jb21tb25LZXljaGFpbixcbiAgICAgICAgcHJvdmlkZXI6IGJhY2t1cFByb3ZpZGVyID8/ICdCaXRHb1RydXN0QXNLcnMnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoYmFja3VwS2V5UGFyYW1zKTtcbiAgICAgIGJhY2t1cEtleWNoYWluLmtleVNoYXJlcyA9IGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmtleVNoYXJlcztcbiAgICAgIHJldHVybiBiYWNrdXBLZXljaGFpbjtcbiAgICB9XG4gICAgYXNzZXJ0KGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIGFzc2VydChwYXNzcGhyYXNlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAyLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVCaXRnb0tleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICBpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZSxcbiAgfTogQ3JlYXRlRWNkc2FCaXRHb0tleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IHJlY2lwaWVudEluZGV4ID0gMztcbiAgICBjb25zdCB1c2VyVG9CaXRnb1NoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZSh1c2VyS2V5U2hhcmUsIHJlY2lwaWVudEluZGV4LCBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLCB1c2VyR3BnS2V5KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29TaGFyZSA9IGF3YWl0IHRoaXMuZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgICk7XG5cbiAgICBjb25zdCBjcmVhdGVCaXRHb01QQ1BhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVNoYXJlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogdXNlclRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogdXNlclRvQml0Z29TaGFyZS5uLFxuICAgICAgICAgIHZzc1Byb29mOiB1c2VyVG9CaXRnb1NoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiB1c2VyVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYmFja3VwVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgICAgdnNzUHJvb2Y6IGJhY2t1cFRvQml0Z29TaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogYmFja3VwVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgYmFja3VwR1BHUHVibGljS2V5OiBpc1RoaXJkUGFydHlCYWNrdXBcbiAgICAgICAgPyAoYmFja3VwR3BnS2V5IGFzIEtleSkuYXJtb3IoKVxuICAgICAgICA6IChiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPikucHVibGljS2V5LFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZSxcbiAgICAgIGFsZ29Vc2VkOiAnZWNkc2EnLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoY3JlYXRlQml0R29NUENQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgYnVpbGRzIHRoZSByZWxldmFudCBiYWNrdXAgZW5jcnlwdGVkTlNoYXJlIGJhc2VkIG9uIHdoZXRoZXIgdGhlXG4gICAqIGJhY2t1cCBrZXkgaXMgdXNlciBvciB0aGlyZCBwYXJ0eSBnZW5lcmF0ZWRcbiAgICogQHBhcmFtIGJhY2t1cFNoYXJlIGNhbiBlaXRoZXIgaGF2ZSBrZXkgc2hhcmVzIGZyb20gdGhlIHVzZXIgb3IgdGhpcmQgcGFydHlcbiAgICogQHBhcmFtIHJlY2lwaWVudEluZGV4IGluZGV4IG9mIHRoZSBwYXJ0eSByZWNlaXZpbmcgdGhlIGJhY2t1cCBzaGFyZXNcbiAgICogQHBhcmFtIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yIGdwZyBhcm1vciBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSBiYWNrdXBHcGdLZXkgYmFja3VwIGdwZyBrZXlcbiAgICogQHBhcmFtIGlzVGhpcmRQYXJ0eUJhY2t1cCB3aGV0aGVyIHRoZSBiYWNrdXAgaXMgZ2VuZXJhdGVkIGJ5IHRoaXJkIHBhcnR5XG4gICAqL1xuICBhc3luYyBnZXRCYWNrdXBFbmNyeXB0ZWROU2hhcmUoXG4gICAgYmFja3VwU2hhcmU6IEJhY2t1cEtleVNoYXJlLFxuICAgIHJlY2lwaWVudEluZGV4OiBudW1iZXIsXG4gICAgcmVjaXBpZW50R3BnUHVibGljQXJtb3I6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2VcbiAgKTogUHJvbWlzZTxFbmNyeXB0ZWROU2hhcmU+IHtcbiAgICBsZXQgYmFja3VwVG9SZWNpcGllbnRTaGFyZTogRW5jcnlwdGVkTlNoYXJlO1xuICAgIGlmIChpc1RoaXJkUGFydHlCYWNrdXApIHtcbiAgICAgIGlmICghYmFja3VwU2hhcmUuYml0R29IZWxkS2V5U2hhcmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0aGlyZCBwYXJ0eSBiYWNrdXAga2V5IHNoYXJlc2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwVG9SZWNpcGllbnRBcGlTaGFyZSA9IGJhY2t1cFNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcy5rZXlTaGFyZXMuZmluZChcbiAgICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYmFja3VwJyAmJiBrZXlTaGFyZS50byA9PT0gZ2V0UGFydGljaXBhbnRGcm9tSW5kZXgocmVjaXBpZW50SW5kZXgpXG4gICAgICApO1xuICAgICAgaWYgKCFiYWNrdXBUb1JlY2lwaWVudEFwaVNoYXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBiYWNrdXAgdG8gJHtnZXRQYXJ0aWNpcGFudEZyb21JbmRleChyZWNpcGllbnRJbmRleCl9IGtleSBzaGFyZWApO1xuICAgICAgfVxuICAgICAgLy8gU2luY2UgYmFja3VwIGlzIGZyb20gYSB0aGlyZCBwYXJ0eSwgaXQgaXMgYWxyZWFkeSBlbmNyeXB0ZWRcbiAgICAgIGJhY2t1cFRvUmVjaXBpZW50U2hhcmUgPSBhd2FpdCBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZShiYWNrdXBUb1JlY2lwaWVudEFwaVNoYXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGJhY2t1cFNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgICAgYmFja3VwVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICAgIGJhY2t1cFNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICAgIHJlY2lwaWVudEluZGV4LFxuICAgICAgICByZWNpcGllbnRHcGdQdWJsaWNBcm1vcixcbiAgICAgICAgYmFja3VwR3BnS2V5XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYmFja3VwVG9SZWNpcGllbnRTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHVzZXMgdGhlIGJhY2t1cCBrZXkgZnJvbSBhIHRoaXJkIHBhcnR5IChiaXRnbyBpbiB0aGlzIGNhc2UpXG4gICAqIHRvIGNyZWF0ZSB0aGUgdXNlciBrZXljaGFpbiB2aWEgV1AuXG4gICAqL1xuICBhc3luYyBjcmVhdGVVc2VyS2V5Y2hhaW5Gcm9tVGhpcmRQYXJ0eUJhY2t1cChcbiAgICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IEtleSxcbiAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5OiBLZXksXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICB0aGlyZFBhcnR5YmFja3VwS2V5U2hhcmVzOiBBcGlLZXlTaGFyZVtdLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGJpdGdvS2V5U2hhcmVzID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM7XG4gICAgaWYgKCFiaXRnb0tleVNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIGtleSBzaGFyZXMnKTtcbiAgICB9XG4gICAgaWYgKCFiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY29tbW9uIGtleSBjaGFpbjogJHtiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWlufWApO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9Vc2VyU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ3VzZXInKTtcbiAgICBpZiAoIWJpdEdvVG9Vc2VyU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyB0byBVc2VyIGtleSBzaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlclNoYXJlID0gdGhpcmRQYXJ0eWJhY2t1cEtleVNoYXJlcy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYmFja3VwJyAmJiBrZXlTaGFyZS50byA9PT0gJ3VzZXInXG4gICAgKTtcbiAgICBpZiAoIWJhY2t1cFRvVXNlclNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQmFja3VwIHRvIFVzZXIga2V5IHNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTlNoYXJlID0gYXdhaXQgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUoYmFja3VwVG9Vc2VyU2hhcmUpO1xuICAgIGNvbnN0IGJpdEdvVG9Vc2VyTlNoYXJlID0gYXdhaXQgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUoYml0R29Ub1VzZXJTaGFyZSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTlNoYXJlczogRGVjcnlwdGFibGVOU2hhcmVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgblNoYXJlOiBiYWNrdXBUb1VzZXJOU2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgICBpc2JzNThFbmNvZGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5TaGFyZTogYml0R29Ub1VzZXJOU2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB1c2VyQ29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBlbmNyeXB0ZWROU2hhcmVzLFxuICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpblxuICAgICk7XG4gICAgaWYgKHVzZXJDb21iaW5lZEtleS5jb21tb25LZXljaGFpbiAhPT0gYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHVzZXIga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHVzZXJDb21iaW5lZEtleS5zaWduaW5nTWF0ZXJpYWwpO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiB1c2VyQ29tYmluZWRLZXkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcnY6IHBydixcbiAgICAgIGVuY3J5cHRlZFBydjogdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IHBydixcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICB9KSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICByZXR1cm4gYXdhaXQga2V5Y2hhaW5zLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIHVzZXJMb2NhbEJhY2t1cEdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGJpdGdvUHVibGljR3BnS2V5OiBLZXksXG4gICAgcmVjaXBpZW50SW5kZXg6IG51bWJlcixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBrZXkgc2hhcmVzJyk7XG4gICAgfVxuICAgIGlmICghYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNvbW1vbiBrZXkgY2hhaW46ICR7Yml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbn1gKTtcbiAgICB9XG5cbiAgICBsZXQgcmVjaXBpZW50OiBzdHJpbmc7XG4gICAgbGV0IGtleVNoYXJlOiBLZXlTaGFyZTtcbiAgICBsZXQgb3RoZXJTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IHJlY2lwaWVudEdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+O1xuICAgIGxldCBzZW5kZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBpZiAocmVjaXBpZW50SW5kZXggPT09IDEpIHtcbiAgICAgIGtleVNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgcmVjaXBpZW50ID0gJ3VzZXInO1xuICAgICAgcmVjaXBpZW50R3BnS2V5ID0gdXNlckdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICB9IGVsc2UgaWYgKHJlY2lwaWVudEluZGV4ID09PSAyKSB7XG4gICAgICBrZXlTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICdiYWNrdXAnO1xuICAgICAgcmVjaXBpZW50R3BnS2V5ID0gdXNlckxvY2FsQmFja3VwR3BnS2V5O1xuICAgICAgc2VuZGVyR3BnS2V5ID0gdXNlckdwZ0tleTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvUmVjaXBpZW50U2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSByZWNpcGllbnRcbiAgICApO1xuICAgIGlmICghYml0R29Ub1JlY2lwaWVudFNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgQml0R28gdG8gJHtyZWNpcGllbnR9IGtleSBzaGFyZWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRlZFNoYXJlID0gYXdhaXQgdGhpcy5kZWNyeXB0UHJpdmF0ZVNoYXJlKGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsIHJlY2lwaWVudEdwZ0tleSk7XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVzZXJMb2NhbEJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleFxuICAgICk7XG5cbiAgICBjb25zdCBzZW5kZXJUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIG90aGVyU2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIHJlY2lwaWVudEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBzZW5kZXJHcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIC8vIHVzZXJUb0JhY2t1cCBvciBiYWNrdXBUb1VzZXJcbiAgICAgICAgblNoYXJlOiBzZW5kZXJUb1JlY2lwaWVudFNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHJlY2lwaWVudEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogc2VuZGVyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGJpdGdvVG9SZWNpcGllbnRcbiAgICAgICAgblNoYXJlOiB7XG4gICAgICAgICAgaTogcmVjaXBpZW50SW5kZXgsXG4gICAgICAgICAgajogMyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIGVuY3J5cHRlZFByaXZhdGVTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUubiEsXG4gICAgICAgICAgdnNzUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHJlY2lwaWVudEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCByZWNpcGllbnRDb21iaW5lZEtleSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVDb21iaW5lZEtleShcbiAgICAgIGtleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuXG4gICAgY29uc3QgcHJ2ID0gSlNPTi5zdHJpbmdpZnkocmVjaXBpZW50Q29tYmluZWRLZXkuc2lnbmluZ01hdGVyaWFsKTtcbiAgICBjb25zdCByZWNpcGllbnRLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgIHNvdXJjZTogcmVjaXBpZW50LFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHJlY2lwaWVudEluZGV4ID09PSAxXG4gICAgICA/IGF3YWl0IGtleWNoYWlucy5hZGQocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpXG4gICAgICA6IGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAxU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGNoYWxsZW5nZXM6IHtcbiAgICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB9O1xuICAgIHBydjogc3RyaW5nO1xuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IGNoYWxsZW5nZXMsIGRlcml2YXRpb25QYXRoLCBwcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IHNpZ25pbmdLZXkgPSBNUEMua2V5RGVyaXZlKFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsXG4gICAgICBbdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmVdLFxuICAgICAgZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29JbmRleCA9IFNoYXJlS2V5UG9zaXRpb24uQklUR087XG4gICAgY29uc3QgdXNlckluZGV4ID0gdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhLCBwOiBwYSB9ID0gY2hhbGxlbmdlcy5lbnRlcnByaXNlQ2hhbGxlbmdlO1xuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiLCBwOiBwYiwgbjogbmIgfSA9IGNoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2U7XG4gICAgY29uc3QgdXNlclhTaGFyZSA9IE1QQy5hcHBlbmRDaGFsbGVuZ2Uoc2lnbmluZ0tleS54U2hhcmUsIHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0sIHsgcDogcGEgfSk7XG4gICAgY29uc3QgYml0Z29ZU2hhcmUgPSBNUEMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAge1xuICAgICAgICBpOiB1c2VySW5kZXgsXG4gICAgICAgIGo6IGJpdGdvSW5kZXgsXG4gICAgICAgIG46IG5iLFxuICAgICAgfSxcbiAgICAgIHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiIH0sXG4gICAgICB7IHA6IHBiIH1cbiAgICApO1xuXG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnblNoYXJlKHVzZXJYU2hhcmUsIGJpdGdvWVNoYXJlKTtcbiAgICBjb25zdCB1ID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnU7XG5cbiAgICBsZXQgY2hhaW5jb2RlID0gdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZS5jaGFpbmNvZGU7XG4gICAgd2hpbGUgKGNoYWluY29kZS5sZW5ndGggPCA2NCkge1xuICAgICAgY2hhaW5jb2RlID0gJzAnICsgY2hhaW5jb2RlO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXJTaGFyZSA9IGJpcDMyLmZyb21Qcml2YXRlS2V5KEJ1ZmZlci5mcm9tKHUsICdoZXgnKSwgQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpLnRvQmFzZTU4KCk7XG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gKGF3YWl0IG9wZW5wZ3AuZW5jcnlwdCh7XG4gICAgICBtZXNzYWdlOiBhd2FpdCBvcGVucGdwLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgICB0ZXh0OiBzaWduZXJTaGFyZSxcbiAgICAgIH0pLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25LZXlzOiBbYml0Z29HcGdLZXldLFxuICAgIH0pKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgcHJpdmF0ZVNoYXJlUHJvb2YgPSBhd2FpdCBjcmVhdGVTaGFyZVByb29mKHVzZXJHcGdLZXkucHJpdmF0ZUtleSwgc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnUsICdlY2RzYScpO1xuICAgIGNvbnN0IHZzc1Byb29mID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnY7XG4gICAgY29uc3QgdXNlclB1YmxpY0dwZ0tleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IHB1YmxpY1NoYXJlID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnkgKyBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuICAgIHJldHVybiB7XG4gICAgICBwcml2YXRlU2hhcmVQcm9vZjogcHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICB2c3NQcm9vZjogdnNzUHJvb2YsXG4gICAgICBwdWJsaWNTaGFyZTogcHVibGljU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZTogZW5jcnlwdGVkU2lnbmVyU2hhcmUsXG4gICAgICB1c2VyUHVibGljR3BnS2V5OiB1c2VyUHVibGljR3BnS2V5LFxuICAgICAga1NoYXJlOiB1c2VyU2lnblNoYXJlLmtTaGFyZSxcbiAgICAgIHdTaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25TaGFyZS53U2hhcmUpLCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSlcbiAgICAgICAgOiB1c2VyU2lnblNoYXJlLndTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB3U2hhcmU6IFdTaGFyZTtcbiAgICBhU2hhcmVGcm9tQml0Z286IE9taXQ8QVNoYXJlLCAnaDEnIHwgJ2gyJyB8ICdudGlsZGUnPjtcbiAgICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxUc3NFY2RzYVN0ZXAyUmV0dXJuTWVzc2FnZT4ge1xuICAgIC8vIEFwcGVuZCB0aGUgQml0R28gY2hhbGxlbmdlIHRvIHRoZSBBc2hhcmUgdG8gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IHByb29mc1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE50aWxkZTogQVNoYXJlID0ge1xuICAgICAgLi4ucGFyYW1zLmFTaGFyZUZyb21CaXRnbyxcbiAgICAgIC4uLnBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXJHYW1tYUFuZE11U2hhcmVzID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUoXG4gICAgICBwYXJhbXMud1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJBU2hhcmVXaXRoTnRpbGRlXG4gICAgKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11RFNoYXJlOiB7XG4gICAgICAgIG11U2hhcmU6IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUsXG4gICAgICAgIGRTaGFyZTogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLmRTaGFyZSxcbiAgICAgICAgaTogdXNlckdhbW1hQW5kTXVTaGFyZXMubXVTaGFyZS5pLFxuICAgICAgfSxcbiAgICAgIG9TaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5vU2hhcmUpLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLm9TaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0T2ZmbGluZVNpZ25lclBhaWxsaWVyTW9kdWx1cyhwYXJhbXM6IHsgcHJ2OiBzdHJpbmcgfSk6IHsgdXNlclBhaWxsaWVyTW9kdWx1czogc3RyaW5nIH0ge1xuICAgIGFzc2VydChwYXJhbXMucHJ2LCAnUGFyYW1zIHRvIGdldCBwYWlsbGllciBtb2R1bHVzIGFyZSBtaXNzaW5nIHBydi4nKTtcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocGFyYW1zLnBydik7XG4gICAgcmV0dXJuIHsgdXNlclBhaWxsaWVyTW9kdWx1czogdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUubiB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZUtTaGFyZShwYXJhbXM6IHtcbiAgICB0c3NQYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2U7XG4gICAgY2hhbGxlbmdlczoge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkRWNkc2FDaGFsbGVuZ2VzO1xuICAgICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIH07XG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlO1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcHJ2LCByZXF1ZXN0VHlwZSwgY2hhbGxlbmdlcyB9ID0gcGFyYW1zO1xuICAgIGFzc2VydCh0eXBlb2YgdHNzUGFyYW1zLnR4UmVxdWVzdCAhPT0gJ3N0cmluZycsICdJbnZhbGlkIHR4UmVxdWVzdCB0eXBlJyk7XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPSB0c3NQYXJhbXMudHhSZXF1ZXN0O1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCAodHhSZXF1ZXN0IGFzIFR4UmVxdWVzdCkudW5zaWduZWRUeHMsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgICAgZGVyaXZhdGlvblBhdGggPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbCh7XG4gICAgICBwcnY6IHBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVNdURlbHRhU2hhcmUocGFyYW1zOiB7XG4gICAgYVNoYXJlRnJvbUJpdGdvOiBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47XG4gICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIGVuY3J5cHRlZFdTaGFyZTogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCBkZWNyeXB0ZWRXU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZFdTaGFyZSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBwYXJhbXMuYVNoYXJlRnJvbUJpdGdvLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IHBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHdTaGFyZTogSlNPTi5wYXJzZShkZWNyeXB0ZWRXU2hhcmUpLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lU1NoYXJlKHBhcmFtczoge1xuICAgIHRzc1BhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZTtcbiAgICBkU2hhcmVGcm9tQml0Z286IERTaGFyZTtcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGU7XG4gICAgZW5jcnlwdGVkT1NoYXJlOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTU2hhcmU+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcmVxdWVzdFR5cGUsIGRTaGFyZUZyb21CaXRnbywgZW5jcnlwdGVkT1NoYXJlLCB3YWxsZXRQYXNzcGhyYXNlIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHR5cGVvZiB0c3NQYXJhbXMudHhSZXF1ZXN0ICE9PSAnc3RyaW5nJywgJ0ludmFsaWQgdHhSZXF1ZXN0IHR5cGUnKTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9IHRzc1BhcmFtcy50eFJlcXVlc3Q7XG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcy50c3NQYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgIH1cbiAgICBsZXQgaGFzaDogSGFzaCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZWNyeXB0ZWRPU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkT1NoYXJlLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCB7IGksIFIsIHMsIHkgfSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICBKU09OLnBhcnNlKGRlY3J5cHRlZE9TaGFyZSksXG4gICAgICBkU2hhcmVGcm9tQml0Z28sXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBoYXNoXG4gICAgKTtcbiAgICAvLyByZXR1cm4gb25seSByZXF1aXJlZCBTU2hhcmUgd2l0aG91dCBiaWdpbnRzIGZyb20gVkFTaGFyZVxuICAgIHJldHVybiB7XG4gICAgICBpLFxuICAgICAgUixcbiAgICAgIHMsXG4gICAgICB5LFxuICAgIH07XG4gIH1cbiAgYXN5bmMgc2lnbkVjZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLFxuICAgIGV4dGVybmFsU2lnbmVyUGFpbGxpZXJNb2R1bHVzR2V0dGVyOiBDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lcktTaGFyZUdlbmVyYXRvcjogQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTXVEZWx0YVNoYXJlR2VuZXJhdG9yOiBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJTU2hhcmVHZW5lcmF0b3I6IEN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb24gPSB0aGlzLndhbGxldC5jb2luU3BlY2lmaWMoKT8ucGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb247XG4gICAgaWYgKHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXYWxsZXQgaXMgbm90IHJlYWR5IGZvciBUU1MgRUNEU0Egc2lnbmluZy4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluIHRvIGZpbmlzaCB0aGUgZW50ZXJwcmlzZSBUU1MgaW5pdGlhbGl6YXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdHhSZXF1ZXN0T2JqOiBUeFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0IGFzIHN0cmluZywgcGFyYW1zLnJlcUlkKTtcbiAgICBjb25zdCB7IHVzZXJQYWlsbGllck1vZHVsdXMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyUGFpbGxpZXJNb2R1bHVzR2V0dGVyKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmogfSk7XG4gICAgY29uc3QgeyBlbnRlcnByaXNlQ2hhbGxlbmdlLCBiaXRnb0NoYWxsZW5nZSB9ID0gYXdhaXQgdGhpcy5nZXRFY2RzYVNpZ25pbmdDaGFsbGVuZ2VzKFxuICAgICAgdHhSZXF1ZXN0IGFzIHN0cmluZyxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdXNlclBhaWxsaWVyTW9kdWx1cyxcbiAgICAgIDAsXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGNvbnN0IHN0ZXAxU2lnbmluZ01hdGVyaWFsID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3Ioe1xuICAgICAgdHNzUGFyYW1zOiB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmosXG4gICAgICB9LFxuICAgICAgY2hhbGxlbmdlczogeyBlbnRlcnByaXNlQ2hhbGxlbmdlLCBiaXRnb0NoYWxsZW5nZSB9LFxuICAgICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2Ugb25lIHdpdGggSyBzaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBBIHNoYXJlXG4gICAgY29uc3QgYml0Z29Ub1VzZXJBU2hhcmUgPSAoYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5LU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5rU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5lbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnZzc1Byb29mLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5wdWJsaWNTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnVzZXJQdWJsaWNHcGdLZXksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApKSBhcyBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47IC8vIFdQL0hTTSBkb2VzIG5vdCByZXR1cm4gdGhlIGluaXRpYWwgY2hhbGxlbmdlXG4gICAgY29uc3Qgc3RlcDJSZXR1cm4gPSBhd2FpdCBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIGFTaGFyZUZyb21CaXRnbzogYml0Z29Ub1VzZXJBU2hhcmUsXG4gICAgICBiaXRnb0NoYWxsZW5nZTogYml0Z29DaGFsbGVuZ2UsXG4gICAgICBlbmNyeXB0ZWRXU2hhcmU6IHN0ZXAxU2lnbmluZ01hdGVyaWFsLndTaGFyZSBhcyBzdHJpbmcsXG4gICAgfSk7XG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RPYmoudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHN0ZXAyUmV0dXJuLm11RFNoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgRFNoYXJlO1xuICAgIGNvbnN0IHVzZXJTU2hhcmUgPSBhd2FpdCBleHRlcm5hbFNpZ25lclNTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0c3NQYXJhbXM6IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIH0sXG4gICAgICBkU2hhcmVGcm9tQml0Z286IGJpdGdvVG9Vc2VyRFNoYXJlLFxuICAgICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgICAgZW5jcnlwdGVkT1NoYXJlOiBzdGVwMlJldHVybi5vU2hhcmUgYXMgc3RyaW5nLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdGhyZWUgd2l0aCBTU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgU1NoYXJlXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5TU2hhcmUsXG4gICAgICB1c2VyU1NoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ25pbmcga2V5LCB0eFJlcXVlc3RSZXNvbHZlZCBhbmQgdHhSZXF1ZXN0SWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0geyBzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKFxuICAgIHBhcmFtczogVFNTUGFyYW1zV2l0aFBydiB8IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uID0gdGhpcy53YWxsZXQuY29pblNwZWNpZmljKCk/LnBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uO1xuICAgIGlmIChwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2FsbGV0IGlzIG5vdCByZWFkeSBmb3IgVFNTIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbiB0byBmaW5pc2ggdGhlIGVudGVycHJpc2UgVFNTIGluaXRpYWxpemF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwYXJhbXMucHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZCA9IG5ldyBCdWZmZXIoJycpO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aCA9ICcnO1xuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IChwYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgICAgLy8gVE9ETyBCRy02NzI5OSBNZXNzYWdlIHNpZ25pbmcgd2l0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICB9XG4gICAgY29uc3QgcGFpbGxpZXJNb2R1bHVzID0gdGhpcy5nZXRPZmZsaW5lU2lnbmVyUGFpbGxpZXJNb2R1bHVzKHsgcHJ2OiBwYXJhbXMucHJ2IH0pO1xuICAgIGNvbnN0IGNoYWxsZW5nZXMgPSBhd2FpdCB0aGlzLmdldEVjZHNhU2lnbmluZ0NoYWxsZW5nZXMoXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHBhaWxsaWVyTW9kdWx1cy51c2VyUGFpbGxpZXJNb2R1bHVzLFxuICAgICAgMCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBzdGVwMVJldHVybiA9IGF3YWl0IHRoaXMuY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbCh7XG4gICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICBjaGFsbGVuZ2VzOiBjaGFsbGVuZ2VzLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IGRlcml2YXRpb25QYXRoLFxuICAgIH0pO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSBvbmUgd2l0aCBLIHNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEEgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLktTaGFyZSxcbiAgICAgIHN0ZXAxUmV0dXJuLmtTaGFyZSxcbiAgICAgIHN0ZXAxUmV0dXJuLmVuY3J5cHRlZFNpZ25lck9mZnNldFNoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4udnNzUHJvb2YsXG4gICAgICBzdGVwMVJldHVybi5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgIHN0ZXAxUmV0dXJuLnB1YmxpY1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4udXNlclB1YmxpY0dwZ0tleSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICkpIGFzIE9taXQ8QVNoYXJlLCAnbnRpbGRlJyB8ICdoMScgfCAnaDInPjsgLy8gV1AvSFNNIGRvZXMgbm90IHJldHVybiB0aGUgaW5pdGlhbCBjaGFsbGVuZ2VcblxuICAgIGNvbnN0IHN0ZXAyUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHtcbiAgICAgIGFTaGFyZUZyb21CaXRnbzogYml0Z29Ub1VzZXJBU2hhcmUsXG4gICAgICBiaXRnb0NoYWxsZW5nZTogY2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHdTaGFyZTogc3RlcDFSZXR1cm4ud1NoYXJlIGFzIFdTaGFyZSxcbiAgICB9KTtcblxuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdHdvIHdpdGggbXVTaGFyZSBhbmQgZFNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEQgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckRTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLk1VU2hhcmUsXG4gICAgICBzdGVwMlJldHVybi5tdURTaGFyZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICkpIGFzIERTaGFyZTtcblxuICAgIC8vIElmIG9ubHkgdGhlIGdldEhhc2hGdW5jdGlvbigpIGlzIGRlZmluZWQgZm9yIHRoZSBjb2luIHVzZSBpdCBvdGhlcndpc2VcbiAgICAvLyBwYXNzIHVuZGVmaW5lZCBoYXNoLCBkZWZhdWx0IGhhc2ggd2lsbCBiZSB1c2VkIGluIHRoYXQgY2FzZS5cbiAgICBsZXQgaGFzaDogSGFzaCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJTU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25hdHVyZVNoYXJlKFxuICAgICAgc3RlcDJSZXR1cm4ub1NoYXJlIGFzIE9TaGFyZSxcbiAgICAgIGJpdGdvVG9Vc2VyRFNoYXJlLFxuICAgICAgc2lnbmFibGVQYXlsb2FkLFxuICAgICAgaGFzaFxuICAgICk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHRocmVlIHdpdGggU1NoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIFNTaGFyZVxuICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuU1NoYXJlLFxuICAgICAgdXNlclNTaGFyZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgaWYgKCFwYXJhbXMubWVzc2FnZVJhdykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYXcgbWVzc2FnZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjaGFsbGVuZ2UgdmFsdWVzIGZvciBlbnRlcnByaXNlIGFuZCBCaXRHbyBpbiBFQ0RTQSBzaWduaW5nXG4gICAqIE9ubHkgcmV0dXJucyB0aGUgY2hhbGxlbmdlcyBpZiB0aGV5IGFyZSB2ZXJpZmllZCBieSB0aGUgdXNlcidzIGVudGVycHJpc2UgYWRtaW4ncyBlY2RoIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHhSZXF1ZXN0SWQgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlkXG4gICAqIEBwYXJhbSB7UmVxdWVzdFR5cGV9IHJlcXVlc3RUeXBlIC0gICgwIGZvciB0eCwgMSBmb3IgbWVzc2FnZSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdhbGxldFBhaWxsaWVyTW9kdWx1cyAtIHBhaWxsaWVyIHB1YmtleSAkbiRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5kZXggb2YgdGhlIHJlcXVlc3RUeXBlXG4gICAqIEBwYXJhbSB7SVJlcXVlc3RUcmFjZXJ9IHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKi9cbiAgYXN5bmMgZ2V0RWNkc2FTaWduaW5nQ2hhbGxlbmdlcyhcbiAgICB0eFJlcXVlc3RJZDogc3RyaW5nLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSxcbiAgICB3YWxsZXRQYWlsbGllck1vZHVsdXM6IHN0cmluZyxcbiAgICBpbmRleCA9IDAsXG4gICAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlclxuICApOiBQcm9taXNlPHtcbiAgICBlbnRlcnByaXNlQ2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRFY2RzYUNoYWxsZW5nZXM7XG4gICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICB9PiB7XG4gICAgY29uc3QgZW50ZXJwcmlzZUlkID0gdGhpcy53YWxsZXQudG9KU09OKCkuZW50ZXJwcmlzZTtcbiAgICBpZiAoIWVudGVycHJpc2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgbXVzdCBiZSBhbiBlbnRlcnByaXNlIHdhbGxldC4nKTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgQml0R28gcmFuZ2UgcHJvb2YgYW5kIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UgPSBhd2FpdCBnZXRUeFJlcXVlc3RDaGFsbGVuZ2UoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgaW5kZXgudG9TdHJpbmcoKSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgd2FsbGV0UGFpbGxpZXJNb2R1bHVzLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29Ub0VudGVycHJpc2VQYWlsbGllckNoYWxsZW5nZSA9IHsgcDogY3JlYXRlQml0Z29DaGFsbGVuZ2VSZXNwb25zZS5wIH07XG4gICAgY29uc3QgZW50ZXJwcmlzZVRvQml0Z29QYWlsbGllckNoYWxsZW5nZSA9IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2Uoe1xuICAgICAgcDogYXdhaXQgRWNkc2FQYWlsbGllclByb29mLmdlbmVyYXRlUChoZXhUb0JpZ0ludChjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLm4pKSxcbiAgICB9KTtcblxuICAgIC8vIFRPRE8oQkctNzg3NjQpOiBvbmNlIHRoZSBwYWlsbGllciBwcm9vZnMgYXJlIGNvbXBsZXRlLCByZWR1Y2UgY2hhbGxlbmdlIGNyZWF0aW9uIHRvIG9uZSBBUEkgY2FsbFxuICAgIGNvbnN0IHdhbGxldENoYWxsZW5nZXMgPSBhd2FpdCB0aGlzLndhbGxldC5nZXRDaGFsbGVuZ2VzRm9yRWNkc2FTaWduaW5nKCk7XG5cbiAgICBjb25zdCBjaGFsbGVuZ2VWZXJpZmllclVzZXJJZCA9IHdhbGxldENoYWxsZW5nZXMuY3JlYXRlZEJ5O1xuICAgIGNvbnN0IGFkbWluU2lnbmluZ0tleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRlcnByaXNlSWQsIGNoYWxsZW5nZVZlcmlmaWVyVXNlcklkKTtcbiAgICBjb25zdCBwdWJrZXlPZkFkbWluRWNkaEtleUhleCA9IGFkbWluU2lnbmluZ0tleVJlc3BvbnNlLmRlcml2ZWRQdWJrZXk7XG5cbiAgICAvLyBWZXJpZnkgZW50ZXJwcmlzZSdzIGNoYWxsZW5nZSBpcyBzaWduZWQgYnkgdGhlIHJlc3BlY3RpdmUgYWRtaW5zIGVjZGgga2V5Y2hhaW5cbiAgICBjb25zdCBlbnRlcnByaXNlUmF3Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiB3YWxsZXRDaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgaDE6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5oMSxcbiAgICAgIGgyOiB3YWxsZXRDaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2UuaDIsXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblNpZ25hdHVyZU9uRW50Q2hhbGxlbmdlOiBzdHJpbmcgPSB3YWxsZXRDaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2UudmVyaWZpZXJzLmFkbWluU2lnbmF0dXJlO1xuICAgIGlmIChcbiAgICAgICF2ZXJpZnlFY2RoU2lnbmF0dXJlKFxuICAgICAgICBFY2RzYVV0aWxzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGVudGVycHJpc2VSYXdDaGFsbGVuZ2UpLFxuICAgICAgICBhZG1pblNpZ25hdHVyZU9uRW50Q2hhbGxlbmdlLFxuICAgICAgICBCdWZmZXIuZnJvbShwdWJrZXlPZkFkbWluRWNkaEtleUhleCwgJ2hleCcpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkbWluIHNpZ25hdHVyZSBmb3IgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgaXMgbm90IHZhbGlkLiBQbGVhc2UgY29udGFjdCB5b3VyIGVudGVycHJpc2UgYWRtaW4uYCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIEJpdEdvIGNoYWxsZW5nZSdzIFpLIHByb29mcyBoYXZlIGJlZW4gdmVyaWZpZWQgYnkgdGhlIGFkbWluXG4gICAgY29uc3QgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlID0ge1xuICAgICAgbnRpbGRlOiB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLm50aWxkZSxcbiAgICAgIGgxOiB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UuaDIsXG4gICAgICBwOiBiaXRnb1RvRW50ZXJwcmlzZVBhaWxsaWVyQ2hhbGxlbmdlLnAsXG4gICAgICBuOiBjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLm4sXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblZlcmlmaWNhdGlvblNpZ25hdHVyZUZvckJpdEdvQ2hhbGxlbmdlID0gd2FsbGV0Q2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZS52ZXJpZmllcnMuYWRtaW5TaWduYXR1cmU7XG4gICAgaWYgKFxuICAgICAgIXZlcmlmeUVjZGhTaWduYXR1cmUoXG4gICAgICAgIEVjZHNhVXRpbHMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoYml0Z29DaGFsbGVuZ2UpLFxuICAgICAgICBhZG1pblZlcmlmaWNhdGlvblNpZ25hdHVyZUZvckJpdEdvQ2hhbGxlbmdlLFxuICAgICAgICBCdWZmZXIuZnJvbShwdWJrZXlPZkFkbWluRWNkaEtleUhleCwgJ2hleCcpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkbWluIHNpZ25hdHVyZSBmb3IgQml0R28ncyBjaGFsbGVuZ2UgaXMgbm90IHZhbGlkLiBQbGVhc2UgY29udGFjdCB5b3VyIGVudGVycHJpc2UgYWRtaW4uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IHtcbiAgICAgICAgLi4uZW50ZXJwcmlzZVJhd0NoYWxsZW5nZSxcbiAgICAgICAgcDogZW50ZXJwcmlzZVRvQml0Z29QYWlsbGllckNoYWxsZW5nZS5wLFxuICAgICAgfSxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHUtdmFsdWUgcHJvb2ZzIGFuZCBHUEcga2V5cyB1c2VkIGluIGdlbmVyYXRpbmcgYSBUU1MgRUNEU0Egd2FsbGV0LlxuICAgKiBAcGFyYW0gdXNlckdwZ1B1YiBUaGUgdXNlcidzIHB1YmxpYyBHUEcga2V5IGZvciBlbmNyeXB0aW9uIGJldHdlZW4gdXNlci9zZXJ2ZXJcbiAgICogQHBhcmFtIGJhY2t1cEdwZ1B1YiBUaGUgYmFja3VwJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiBiYWNrdXAvc2VydmVyXG4gICAqIEBwYXJhbSBiaXRnb0tleWNoYWluIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIGRlY3J5cHRlZFNoYXJlIFRoZSBkZWNyeXB0ZWQgYml0Z28tdG8tdXNlci9iYWNrdXAgcHJpdmF0ZSBzaGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUga2V5Y2hhaW5cbiAgICogQHBhcmFtIHZlcmlmaWVySW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYXJ0eSB0byB2ZXJpZnk6IDEgPSB1c2VyLCAyID0gYmFja3VwXG4gICAqL1xuICBhc3luYyB2ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgIHVzZXJHcGdQdWI6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWI6IHN0cmluZyxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBkZWNyeXB0ZWRTaGFyZTogc3RyaW5nLFxuICAgIHZlcmlmaWVySW5kZXg6IDEgfCAyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzKTtcblxuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gKGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pKS5tcGNWMTtcbiAgICBjb25zdCB1c2VyS2V5UHViID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogdXNlckdwZ1B1YiB9KTtcbiAgICBjb25zdCB1c2VyS2V5SWQgPSB1c2VyS2V5UHViLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpO1xuICAgIGNvbnN0IGJhY2t1cEtleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJhY2t1cEdwZ1B1YiB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXlJZCA9IGJhY2t1cEtleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcblxuICAgIGNvbnN0IHdhbGxldFNpZ25hdHVyZXMgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXlzKHsgYXJtb3JlZEtleXM6IGJpdGdvS2V5Y2hhaW4ud2FsbGV0SFNNR1BHUHVibGljS2V5U2lncyB9KTtcbiAgICBpZiAod2FsbGV0U2lnbmF0dXJlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB3YWxsZXQgc2lnbmF0dXJlcycpO1xuICAgIH1cbiAgICBpZiAodXNlcktleUlkICE9PSB3YWxsZXRTaWduYXR1cmVzWzBdLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZpcnN0IHdhbGxldCBzaWduYXR1cmUncyBmaW5nZXJwcmludCBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgdXNlciBncGcga2V5J3MgZmluZ2VycHJpbnRgKTtcbiAgICB9XG4gICAgaWYgKGJhY2t1cEtleUlkICE9PSB3YWxsZXRTaWduYXR1cmVzWzFdLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlY29uZCB3YWxsZXQgc2lnbmF0dXJlJ3MgZmluZ2VycHJpbnQgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIGJhY2t1cCBncGcga2V5J3MgZmluZ2VycHJpbnRgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgd2FsbGV0U2lnbmF0dXJlOiB3YWxsZXRTaWduYXR1cmVzWzBdLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyS2V5SWQsXG4gICAgICBiYWNrdXBLZXlJZCxcbiAgICAgIGJpdGdvUHViOiBiaXRnb0dwZ0tleSxcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgdmVyaWZpZXJJbmRleCxcbiAgICB9KTtcblxuICAgIGF3YWl0IHZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICB3YWxsZXRTaWduYXR1cmU6IHdhbGxldFNpZ25hdHVyZXNbMV0sXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJLZXlJZCxcbiAgICAgIGJhY2t1cEtleUlkLFxuICAgICAgYml0Z29QdWI6IGJpdGdvR3BnS2V5LFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICB2ZXJpZmllckluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgY2hhbGxlbmdlIHdpdGggdGhlIHByb3ZpZGVkIHYxIGVjZGgga2V5IGF0IGEgZGVyaXZlZCBwYXRoXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2UgY2hhbGxlbmdlIHRvIHNpZ25cbiAgICogQHBhcmFtIGVjZGhYcHJ2IHhwcnYgb2YgdGhlIGVjZGgga2V5XG4gICAqIEBwYXJhbSBkZXJpdmF0aW9uUGF0aCB0aGUgZGVyaXZlZCBwYXRoIGF0IHdoaWNoIHRoZSBlY2RoIGtleSB3aWxsIHNpZ25cbiAgICovXG4gIHN0YXRpYyBzaWduQ2hhbGxlbmdlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlLCBlY2RoWHBydjogc3RyaW5nLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBjb25zdCBtZXNzYWdlVG9TaWduID0gdGhpcy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShjaGFsbGVuZ2UpO1xuICAgIHJldHVybiBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleShtZXNzYWdlVG9TaWduLCBlY2RoWHBydiwgZGVyaXZhdGlvblBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGNoYWxsZW5nZSB0byBhIGNvbW1vbiBtZXNzYWdlIGZvcm1hdCB3aGljaCBjYW4gYmUgc2lnbmVkLlxuICAgKiBAcGFyYW0gY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBjaGFsbGVuZ2UubnRpbGRlLmNvbmNhdChjaGFsbGVuZ2UuaDEpLmNvbmNhdChjaGFsbGVuZ2UuaDIpO1xuICB9XG5cbiAgLyoqXG4gICBWZXJpZmllcyBaSyBwcm9vZnMgb2YgQml0R28ncyBjaGFsbGVuZ2VzIGZvciBib3RoIG5pdHJvIGFuZCBpbnN0aXR1dGlvbmFsIEhTTXNcbiAgIHdoaWNoIGFyZSBmZXRjaGVkIGZyb20gdGhlIFdQIEFQSS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyB2ZXJpZnlCaXRHb0NoYWxsZW5nZXMoYml0Z29DaGFsbGVuZ2VzOiBHZXRCaXRHb0NoYWxsZW5nZXNBcGkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBWZXJpZnkgaW5zdGl0dXRpb25hbCBoc20gY2hhbGxlbmdlIHByb29mXG4gICAgY29uc3QgaW5zdENoYWxsZW5nZVZlcmlmaWVkID0gYXdhaXQgdGhpcy52ZXJpZnlCaXRHb0NoYWxsZW5nZSh7XG4gICAgICBudGlsZGU6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlLFxuICAgICAgaDE6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDEsXG4gICAgICBoMjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMixcbiAgICAgIG50aWxkZVByb29mOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZVByb29mLFxuICAgIH0pO1xuXG4gICAgLy8gVmVyaWZ5IG5pdHJvIGhzbSBjaGFsbGVuZ2UgcHJvb2ZcbiAgICBjb25zdCBuaXRyb0NoYWxsZW5nZVZlcmlmaWVkID0gYXdhaXQgdGhpcy52ZXJpZnlCaXRHb0NoYWxsZW5nZSh7XG4gICAgICBudGlsZGU6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLm50aWxkZSxcbiAgICAgIGgxOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29OaXRyb0hzbS5oMSxcbiAgICAgIGgyOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29OaXRyb0hzbS5oMixcbiAgICAgIG50aWxkZVByb29mOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29OaXRyb0hzbS5udGlsZGVQcm9vZixcbiAgICB9KTtcblxuICAgIHJldHVybiBpbnN0Q2hhbGxlbmdlVmVyaWZpZWQgJiYgbml0cm9DaGFsbGVuZ2VWZXJpZmllZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBaSyBwcm9vZiBmb3IgYSBzaW5nbGUgQml0R28gY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb0NoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZlcmlmeUJpdEdvQ2hhbGxlbmdlKGJpdGdvQ2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZSA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGVXaXRoUHJvb2ZzKGJpdGdvQ2hhbGxlbmdlKTtcbiAgICBjb25zdCBudGlsZGVQcm9vZkgxV3J0SDJWZXJpZmllZCA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlOdGlsZGVQcm9vZihcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDEsXG4gICAgICAgIGgyOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgyLFxuICAgICAgfSxcbiAgICAgIGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDFXcnRIMlxuICAgICk7XG4gICAgY29uc3QgbnRpbGRlUHJvb2ZIMldydEgxVmVyaWZpZWQgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YudmVyaWZ5TnRpbGRlUHJvb2YoXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGUsXG4gICAgICAgIGgxOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgyLFxuICAgICAgICBoMjogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMSxcbiAgICAgIH0sXG4gICAgICBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZVByb29mLmgyV3J0SDFcbiAgICApO1xuICAgIHJldHVybiBudGlsZGVQcm9vZkgxV3J0SDJWZXJpZmllZCAmJiBudGlsZGVQcm9vZkgyV3J0SDFWZXJpZmllZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBiaXRnbyBjaGFsbGVuZ2VzIGZvciBib3RoIG5pdHJvIGFuZCBpbnN0aXR1dGlvbmFsIEhTTXMgZnJvbSBXUCBBUEkuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEJpdEdvQ2hhbGxlbmdlcyhiaXRnbzogQml0R29CYXNlKTogUHJvbWlzZTxHZXRCaXRHb0NoYWxsZW5nZXNBcGk+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBiaXRnby5nZXQoYml0Z28udXJsKCcvdHNzL2VjZHNhL2NoYWxsZW5nZXMnLCAyKSkuc2VuZCgpLnJlc3VsdCgpO1xuICAgIGlmIChcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbSB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLm50aWxkZSB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLmgxIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20uaDIgfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5udGlsZGVQcm9vZiB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20gfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDEgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgyIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGVQcm9vZlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBCaXRHbyBjaGFsbGVuZ2UgcHJvb2YgdG8gYmUgcHJlc2VudC4gQ29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIEJpdEdvJ3MgcHJvb2ZzIGZyb20gQVBJIGFuZCBzaWducyB0aGVtIGlmIHRoZSBwcm9vZnMgYXJlIHZhbGlkLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0VmVyaWZ5QW5kU2lnbkJpdEdvQ2hhbGxlbmdlcyhcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudGVycHJpc2VJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nXG4gICk6IFByb21pc2U8Qml0R29Qcm9vZlNpZ25hdHVyZXM+IHtcbiAgICAvLyBGZXRjaCBCaXRHbydzIGNoYWxsZW5nZSBhbmQgdmVyaWZ5XG4gICAgY29uc3QgYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcyA9IGF3YWl0IEVjZHNhVXRpbHMuZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvKTtcbiAgICBpZiAoIShhd2FpdCBFY2RzYVV0aWxzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlcyhiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB2ZXJpZnkgQml0R28ncyBjaGFsbGVuZ2UgbmVlZGVkIHRvIGVuYWJsZSBFQ0RTQSBzaWduaW5nLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBFY2RzYVV0aWxzLnNpZ25CaXRnb0NoYWxsZW5nZXMoYml0Z28sIGVudGVycHJpc2VJZCwgdXNlclBhc3N3b3JkLCBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIEJpdGdvJ3MgcHJvb2ZzLCB2ZXJpZmljYXRpb24gb2YgcHJvb2ZzIGlzIGxlZnQgdG8gdGhlIGNhbGxlclxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkXG4gICAqIEBwYXJhbSBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzIE9wdGlvbmFsbHkgcHJvdmlkZSBCaXRnbyBDaGFsbGFlbmdlICYgUHJvb2ZzIGluc3RlYWQgb2YgZmV0Y2hpbmcgZnJvbSBBUElcbiAgICovXG4gIHN0YXRpYyBhc3luYyBzaWduQml0Z29DaGFsbGVuZ2VzKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50ZXJwcmlzZUlkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcz86IEdldEJpdEdvQ2hhbGxlbmdlc0FwaVxuICApOiBQcm9taXNlPEJpdEdvUHJvb2ZTaWduYXR1cmVzPiB7XG4gICAgLy8gZmV0Y2ggY2hhbGxlbmdlICYgcHJvb2YgaWYgbm9uZSBhcmUgcHJvdmlkZWRcbiAgICBjb25zdCBjaGFsbGVuZ2VzV2l0aFByb29mcyA9IGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnNcbiAgICAgID8gYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mc1xuICAgICAgOiBhd2FpdCBFY2RzYVV0aWxzLmdldEJpdEdvQ2hhbGxlbmdlcyhiaXRnbyk7XG5cbiAgICAvLyBGZXRjaCB1c2VyJ3MgZWNkaCBwdWJsaWMga2V5Y2hhaW4gbmVlZGVkIGZvciBzaWduaW5nIHRoZSBjaGFsbGVuZ2VzXG4gICAgY29uc3QgZWNkaEtleXBhaXIgPSBhd2FpdCBiaXRnby5nZXRFY2RoS2V5cGFpclByaXZhdGUodXNlclBhc3N3b3JkLCBlbnRlcnByaXNlSWQpO1xuXG4gICAgY29uc3Qgc2lnbmVkQml0R29JbnN0Q2hhbGxlbmdlID0gRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgY2hhbGxlbmdlc1dpdGhQcm9vZnMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLFxuICAgICAgZWNkaEtleXBhaXIueHBydixcbiAgICAgIGVjZGhLZXlwYWlyLmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICBjb25zdCBzaWduZWRCaXRHb05pdHJvQ2hhbGxlbmdlID0gRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgY2hhbGxlbmdlc1dpdGhQcm9vZnMuYml0Z29OaXRyb0hzbSxcbiAgICAgIGVjZGhLZXlwYWlyLnhwcnYsXG4gICAgICBlY2RoS2V5cGFpci5kZXJpdmF0aW9uUGF0aFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJpdGdvSW5zdEhzbUFkbWluU2lnbmF0dXJlOiBzaWduZWRCaXRHb0luc3RDaGFsbGVuZ2UsXG4gICAgICBiaXRnb05pdHJvSHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvTml0cm9DaGFsbGVuZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG5lZWRlZCB0byBlbmFibGUgZWNkc2Egc2lnbmluZyBvbiB0aGUgZW50ZXJwcmlzZS5cbiAgICogSXQgcmVjZWl2ZXMgdGhlIGVudGVycHJpc2UgY2hhbGxlbmdlIGFuZCBzaWduYXR1cmVzIG9mIHZlcmlmaWVkIGJpdGdvIHByb29mc1xuICAgKiBhbmQgdXBsb2FkcyB0aGVtIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudElkIC0gZW50ZXJwcmlzZSBpZCB0byBlbmFibGUgZWNkc2Egc2lnbmluZyBvblxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkIC0gZW50ZXJwcmlzZSBhZG1pbidzIGxvZ2luIHB3XG4gICAqIEBwYXJhbSBiaXRnb0luc3RDaGFsbGVuZ2VQcm9vZlNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBiaXRnbydzIGluc3RpdHV0aW9uYWwgSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGJpdGdvTml0cm9DaGFsbGVuZ2VQcm9vZlNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBiaXRnbydzIG5pdHJvIEhTTSBjaGFsbGVuZ2UgYWZ0ZXIgdmVyaWZpY2F0aW9uXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2UgLSBvcHRpb25hbGx5IHVzZSB0aGUgY2hhbGxlbmdlIGZvciBlbnRlcnByaXNlIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluaXRpYXRlQ2hhbGxlbmdlc0ZvckVudGVycHJpc2UoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nLFxuICAgIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlOiBCdWZmZXIsXG4gICAgYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlOiBCdWZmZXIsXG4gICAgb3BlblNTTEJ5dGVzOiBVaW50OEFycmF5LFxuICAgIGNoYWxsZW5nZT86IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlV2l0aFByb29mc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBGZXRjaCB1c2VyJ3MgZWNkaCBwdWJsaWMga2V5Y2hhaW4gbmVlZGVkIGZvciBzaWduaW5nIHRoZSBjaGFsbGVuZ2VzXG4gICAgY29uc3QgZWNkaEtleXBhaXIgPSBhd2FpdCBiaXRnby5nZXRFY2RoS2V5cGFpclByaXZhdGUodXNlclBhc3N3b3JkLCBlbnRJZCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgc2lnbiBlbnRlcnByaXNlIGNoYWxsZW5nZVxuICAgIGNvbnN0IGVudENoYWxsZW5nZVdpdGhQcm9vZiA9XG4gICAgICBjaGFsbGVuZ2UgPz8gKGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5nZW5lcmF0ZU50aWxkZShvcGVuU1NMQnl0ZXMsIG1pbk1vZHVsdXNCaXRMZW5ndGgpKTtcbiAgICBjb25zdCBzZXJpYWxpemVkRW50Q2hhbGxlbmdlV2l0aFByb29mID0gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGVXaXRoUHJvb2ZzKGVudENoYWxsZW5nZVdpdGhQcm9vZik7XG4gICAgY29uc3Qgc2lnbmVkRW50ZXJwcmlzZUNoYWxsZW5nZSA9IEVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YsXG4gICAgICBlY2RoS2V5cGFpci54cHJ2LFxuICAgICAgZWNkaEtleXBhaXIuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy51cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgICAgYml0Z28sXG4gICAgICBlbnRJZCxcbiAgICAgIHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YsXG4gICAgICBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvTml0cm9DaGFsbGVuZ2VQcm9vZlNpZ25hdHVyZS50b1N0cmluZygnaGV4JylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIHNpZ25lZCBjaGFsbGVuZ2VzIGFuZCB0aGVpciBwcm9vZnMgb24gdGhlIGVudGVycHJpc2UuXG4gICAqIFRoaXMgaW5pdGlhdGVzIGVjZHNhIHNpZ25pbmcgZm9yIHRoZSBlbnRlcnByaXNlIHVzZXJzLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudElkIC0gZW50ZXJwcmlzZSB0byBlbmFibGUgZWNkc2Egc2lnbmluZyBvblxuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlIC0gY2xpZW50IHNpZGUgZ2VuZXJhdGVkIGVudCBjaGFsbGVuZ2Ugd2l0aCBaSyBwcm9vZnNcbiAgICogQHBhcmFtIGVudENoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBlbnRlcnByaXNlIGNoYWxsZW5nZVxuICAgKiBAcGFyYW0gYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmUgLSBzaWduYXR1cmUgb24gQml0R28ncyBpbnN0aXR1dGlvbmFsIEhTTSBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvTml0cm9DaGFsbGVuZ2VTaWduYXR1cmUgLSBzaWduYXR1cmUgb24gQml0R28ncyBuaXRybyBIU00gY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdXBsb2FkQ2hhbGxlbmdlc1RvRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgZW50Q2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUgfCBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzLFxuICAgIGVudENoYWxsZW5nZVNpZ25hdHVyZTogc3RyaW5nLFxuICAgIGJpdGdvSW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZTogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICBlbnRlcnByaXNlOiB7XG4gICAgICAgIG50aWxkZTogZW50Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGVudENoYWxsZW5nZS5oMSxcbiAgICAgICAgaDI6IGVudENoYWxsZW5nZS5oMixcbiAgICAgICAgdmVyaWZpZXJzOiB7XG4gICAgICAgICAgYWRtaW5TaWduYXR1cmU6IGVudENoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBiaXRnb0luc3RpdHV0aW9uYWxIc206IHtcbiAgICAgICAgdmVyaWZpZXJzOiB7XG4gICAgICAgICAgYWRtaW5TaWduYXR1cmU6IGJpdGdvSW50Q2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJpdGdvTml0cm9Ic206IHtcbiAgICAgICAgdmVyaWZpZXJzOiB7XG4gICAgICAgICAgYWRtaW5TaWduYXR1cmU6IGJpdGdvTml0cm9DaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKCdudGlsZGVQcm9vZicgaW4gZW50Q2hhbGxlbmdlKSB7XG4gICAgICBib2R5LmVudGVycHJpc2VbJ250aWxkZVByb29mJ10gPSBlbnRDaGFsbGVuZ2UubnRpbGRlUHJvb2Y7XG4gICAgfVxuICAgIGF3YWl0IGJpdGdvXG4gICAgICAucHV0KGJpdGdvLnVybChgL2VudGVycHJpc2UvJHtlbnRJZH0vdHNzY29uZmlnL2VjZHNhL2NoYWxsZW5nZWAsIDIpKVxuICAgICAgLnNlbmQoYm9keSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxufVxuIl19
|
|
836
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFDaEMsaURBQW1DO0FBR25DLG9EQUF1SDtBQUN2SCw4Q0FBd0M7QUFFeEMseURBQStEO0FBRS9ELCtEQUFvRTtBQVVwRSw0Q0Fhc0I7QUFDdEIsc0NBQTRDO0FBQzVDLG9EQUFrSDtBQUNsSCxxREFBNkY7QUFFN0Ysb0RBQWlFO0FBQ2pFLHdDQUFtRjtBQUNuRixnREFBNEQ7QUFDNUQsOENBSzRCO0FBQzVCLGlDQUF3QztBQUd4QyxNQUFNLGFBQWEsR0FBRyxlQUFZLENBQUMsYUFBYSxDQUFDO0FBRWpELGtCQUFrQjtBQUNsQixNQUFhLFVBQVcsU0FBUSxxQkFBYztJQUM1QyxLQUFLLENBQUMsK0JBQStCLENBQ25DLEtBQWEsRUFDYixjQUFzQixFQUN0QixZQUFzQixFQUN0QixhQUF1QixFQUN2QixVQUFxQyxFQUNyQyw0QkFBaUM7UUFFakMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLGFBQWEsQ0FDcEQsWUFBWSxFQUNaLENBQUMsRUFDRCw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsRUFDcEMsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUN6RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQ3BFLENBQUM7UUFDRixNQUFNLGVBQWUsR0FBRyxlQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3BDLGVBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMs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QyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ2hELGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUN2QyxLQUFnQixFQUNoQixLQUFhLEVBQ2IsWUFBaUYsRUFDakYscUJBQTZCLEVBQzdCLDBCQUFrQyxFQUNsQyw0QkFBb0M7UUFFcEMsTUFBTSxJQUFJLEdBQUc7WUFDWCxVQUFVLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO2dCQUMzQixFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ25CLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDbkIsU0FBUyxFQUFFO29CQUNULGNBQWMsRUFBRSxxQkFBcUI7aUJBQ3RDO2FBQ0Y7WUFDRCxxQkFBcUIsRUFBRTtnQkFDckIsU0FBUyxFQUFFO29CQUNULGNBQWMsRUFBRSwwQkFBMEI7aUJBQzNDO2FBQ0Y7WUFDRCxhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFO29CQUNULGNBQWMsRUFBRSw0QkFBNEI7aUJBQzdDO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsSUFBSSxhQUFhLElBQUksWUFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQzVELENBQUM7UUFDRCxNQUFNLEtBQUs7YUFDUixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBcHJDRCxnQ0FvckNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBLZXksIFNlcmlhbGl6ZWRLZXlQYWlyIH0gZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IEVjZHNhUGFpbGxpZXJQcm9vZiwgRWNkc2FSYW5nZVByb29mLCBFY2RzYVR5cGVzLCBoZXhUb0JpZ0ludCwgbWluTW9kdWx1c0JpdExlbmd0aCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmltcG9ydCB7IEVDRFNBLCBFY2RzYSB9IGZyb20gJy4uLy4uLy4uLy4uL2FjY291bnQtbGliL21wYy90c3MnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCBFQ0RTQU1ldGhvZHMsIHsgRUNEU0FNZXRob2RUeXBlcyB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYSc7XG5pbXBvcnQgeyBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHtcbiAgQml0R29Qcm9vZlNpZ25hdHVyZXMsXG4gIENyZWF0ZUVjZHNhQml0R29LZXljaGFpblBhcmFtcyxcbiAgQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyxcbiAgRGVjcnlwdGFibGVOU2hhcmUsXG4gIEdldEJpdEdvQ2hhbGxlbmdlc0FwaSxcbiAgS2V5U2hhcmUsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQmFja3VwS2V5U2hhcmUsXG4gIEJpdGdvSGVsZEJhY2t1cEtleVNoYXJlLFxuICBDdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tUGFpbGxpZXJNb2R1bHVzR2V0dGVyRnVuY3Rpb24sXG4gIEN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgUmVxdWVzdFR5cGUsXG4gIFRTU1BhcmFtcyxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gIFRTU1BhcmFtc1dpdGhQcnYsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5pbXBvcnQgeyBBU2hhcmUsIERTaGFyZSwgRW5jcnlwdGVkTlNoYXJlLCBTZW5kU2hhcmVUeXBlLCBTU2hhcmUsIFdTaGFyZSwgT1NoYXJlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNoYXJlUHJvb2YsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXkgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IHZlcmlmeVdhbGxldFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYSc7XG5pbXBvcnQgeyBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleSwgdmVyaWZ5RWNkaFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL2VjZGgnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0Q2hhbGxlbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQge1xuICBTaGFyZUtleVBvc2l0aW9uLFxuICBUc3NFY2RzYVN0ZXAxUmV0dXJuTWVzc2FnZSxcbiAgVHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2UsXG4gIFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi8uLi8uLi90c3MvdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUVjZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgSVJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGknO1xuXG5jb25zdCBlbmNyeXB0TlNoYXJlID0gRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmU7XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGNsYXNzIEVjZHNhVXRpbHMgZXh0ZW5kcyBCYXNlRWNkc2FVdGlscyB7XG4gIGFzeW5jIGZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5OiBLZXlcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIDIsXG4gICAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICB1c2VyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwS2V5U2hhcmUgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcz8uZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGNvbnN0IHVzZXJQdWJsaWNTaGFyZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0ueSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0uY2hhaW5jb2RlLCAnaGV4JyksXG4gICAgXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwS2V5U2hhcmUpO1xuICAgIGNvbnN0IGtleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJhc2VDb2luLnVybChgL2tycy9iYWNrdXBrZXlzLyR7a2V5SWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgICB0bzogJ2JhY2t1cCcsXG4gICAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgICAgICB2c3NQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaXRnb1RvQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGlmICgha2V5UmVzcG9uc2UgfHwgIWtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCBiYWNrdXAga2V5IHZlcmlmaWNhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBrZXlSZXNwb25zZS5pZCxcbiAgICAgIGtleVNoYXJlczoga2V5UmVzcG9uc2Uua2V5U2hhcmVzLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IG0gPSAyO1xuICAgIGNvbnN0IG4gPSAzO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gYXdhaXQgTVBDLmtleVNoYXJlKDEsIG0sIG4pO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEdwZ1B1YktleSgpO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBwdWJsaWMga2V5IGJhc2VkIG9uIHVzZXIvZW50ZXJwcmlzZSBmZWF0dXJlIGZsYWdzXG4gICAgLy8gSWYgaXQgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgcHVibGljIGtleSBmcm9tIHRoZSBjb25zdGFudHNcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9XG4gICAgICAoYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UpKSA/PyB0aGlzLmJpdGdvUHVibGljR3BnS2V5O1xuXG4gICAgY29uc3QgYml0Z29LZXljaGFpbiA9IGF3YWl0IHRoaXMuY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZVVzZXJLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3VzZXJLZXljaGFpblByb21pc2UsIGJhY2t1cEtleWNoYWluUHJvbWlzZV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5U2hhcmVzKCk6IFByb21pc2U8QmFja3VwS2V5U2hhcmU+IHtcbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBtID0gMjtcbiAgICBjb25zdCBuID0gMztcbiAgICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IHtcbiAgICAgIHVzZXJIZWxkS2V5U2hhcmU6IGF3YWl0IE1QQy5rZXlTaGFyZSgyLCBtLCBuKSxcbiAgICB9O1xuICAgIHJldHVybiBiYWNrdXBLZXlTaGFyZTtcbiAgfVxuXG4gIGNyZWF0ZVVzZXJLZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZSxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gIH06IENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgaWYgKCFwYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG4gICAgYXNzZXJ0KGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIDEsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIHBhc3NwaHJhc2UsXG4gIH06IENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgYXNzZXJ0KGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIGFzc2VydChwYXNzcGhyYXNlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAyLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVCaXRnb0tleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgfTogQ3JlYXRlRWNkc2FCaXRHb0tleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IHJlY2lwaWVudEluZGV4ID0gMztcbiAgICBjb25zdCB1c2VyVG9CaXRnb1NoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZSh1c2VyS2V5U2hhcmUsIHJlY2lwaWVudEluZGV4LCBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLCB1c2VyR3BnS2V5KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29TaGFyZSA9IGF3YWl0IHRoaXMuZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPlxuICAgICk7XG5cbiAgICBjb25zdCBjcmVhdGVCaXRHb01QQ1BhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVNoYXJlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogdXNlclRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogdXNlclRvQml0Z29TaGFyZS5uLFxuICAgICAgICAgIHZzc1Byb29mOiB1c2VyVG9CaXRnb1NoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiB1c2VyVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYmFja3VwVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgICAgdnNzUHJvb2Y6IGJhY2t1cFRvQml0Z29TaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogYmFja3VwVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgYmFja3VwR1BHUHVibGljS2V5OiAoYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4pLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2UsXG4gICAgICBhbGdvVXNlZDogJ2VjZHNhJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGNyZWF0ZUJpdEdvTVBDUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGJ1aWxkcyB0aGUgcmVsZXZhbnQgYmFja3VwIGVuY3J5cHRlZE5TaGFyZSBiYXNlZCBvbiB3aGV0aGVyIHRoZVxuICAgKiBiYWNrdXAga2V5IGlzIHVzZXIgb3IgdGhpcmQgcGFydHkgZ2VuZXJhdGVkXG4gICAqIEBwYXJhbSBiYWNrdXBTaGFyZSBjYW4gZWl0aGVyIGhhdmUga2V5IHNoYXJlcyBmcm9tIHRoZSB1c2VyIG9yIHRoaXJkIHBhcnR5XG4gICAqIEBwYXJhbSByZWNpcGllbnRJbmRleCBpbmRleCBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSByZWNpcGllbnRHcGdQdWJsaWNBcm1vciBncGcgYXJtb3Igb2YgdGhlIHBhcnR5IHJlY2VpdmluZyB0aGUgYmFja3VwIHNoYXJlc1xuICAgKiBAcGFyYW0gYmFja3VwR3BnS2V5IGJhY2t1cCBncGcga2V5XG4gICAqIEBwYXJhbSBpc1RoaXJkUGFydHlCYWNrdXAgd2hldGhlciB0aGUgYmFja3VwIGlzIGdlbmVyYXRlZCBieSB0aGlyZCBwYXJ0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgIGJhY2t1cFNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yOiBzdHJpbmcsXG4gICAgYmFja3VwR3BnS2V5OiBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+XG4gICk6IFByb21pc2U8RW5jcnlwdGVkTlNoYXJlPiB7XG4gICAgYXNzZXJ0KGJhY2t1cFNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIGNvbnN0IGJhY2t1cFRvUmVjaXBpZW50U2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKFxuICAgICAgYmFja3VwU2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIHJlY2lwaWVudEluZGV4LFxuICAgICAgcmVjaXBpZW50R3BnUHVibGljQXJtb3IsXG4gICAgICBiYWNrdXBHcGdLZXlcbiAgICApO1xuICAgIHJldHVybiBiYWNrdXBUb1JlY2lwaWVudFNoYXJlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIHVzZXJMb2NhbEJhY2t1cEdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGJpdGdvUHVibGljR3BnS2V5OiBLZXksXG4gICAgcmVjaXBpZW50SW5kZXg6IG51bWJlcixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBrZXkgc2hhcmVzJyk7XG4gICAgfVxuICAgIGlmICghYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNvbW1vbiBrZXkgY2hhaW46ICR7Yml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbn1gKTtcbiAgICB9XG5cbiAgICBsZXQgcmVjaXBpZW50OiBzdHJpbmc7XG4gICAgbGV0IGtleVNoYXJlOiBLZXlTaGFyZTtcbiAgICBsZXQgb3RoZXJTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IHJlY2lwaWVudEdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+O1xuICAgIGxldCBzZW5kZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBpZiAocmVjaXBpZW50SW5kZXggPT09IDEpIHtcbiAgICAgIGtleVNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgcmVjaXBpZW50ID0gJ3VzZXInO1xuICAgICAgcmVjaXBpZW50R3BnS2V5ID0gdXNlckdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICB9IGVsc2UgaWYgKHJlY2lwaWVudEluZGV4ID09PSAyKSB7XG4gICAgICBrZXlTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICdiYWNrdXAnO1xuICAgICAgcmVjaXBpZW50R3BnS2V5ID0gdXNlckxvY2FsQmFja3VwR3BnS2V5O1xuICAgICAgc2VuZGVyR3BnS2V5ID0gdXNlckdwZ0tleTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvUmVjaXBpZW50U2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSByZWNpcGllbnRcbiAgICApO1xuICAgIGlmICghYml0R29Ub1JlY2lwaWVudFNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgQml0R28gdG8gJHtyZWNpcGllbnR9IGtleSBzaGFyZWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRlZFNoYXJlID0gYXdhaXQgdGhpcy5kZWNyeXB0UHJpdmF0ZVNoYXJlKGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsIHJlY2lwaWVudEdwZ0tleSk7XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVzZXJMb2NhbEJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleFxuICAgICk7XG5cbiAgICBjb25zdCBzZW5kZXJUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIG90aGVyU2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIHJlY2lwaWVudEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBzZW5kZXJHcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIC8vIHVzZXJUb0JhY2t1cCBvciBiYWNrdXBUb1VzZXJcbiAgICAgICAgblNoYXJlOiBzZW5kZXJUb1JlY2lwaWVudFNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHJlY2lwaWVudEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogc2VuZGVyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGJpdGdvVG9SZWNpcGllbnRcbiAgICAgICAgblNoYXJlOiB7XG4gICAgICAgICAgaTogcmVjaXBpZW50SW5kZXgsXG4gICAgICAgICAgajogMyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIGVuY3J5cHRlZFByaXZhdGVTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUubiEsXG4gICAgICAgICAgdnNzUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHJlY2lwaWVudEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCByZWNpcGllbnRDb21iaW5lZEtleSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVDb21iaW5lZEtleShcbiAgICAgIGtleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuXG4gICAgY29uc3QgcHJ2ID0gSlNPTi5zdHJpbmdpZnkocmVjaXBpZW50Q29tYmluZWRLZXkuc2lnbmluZ01hdGVyaWFsKTtcbiAgICBjb25zdCByZWNpcGllbnRLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgIHNvdXJjZTogcmVjaXBpZW50LFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHJlY2lwaWVudEluZGV4ID09PSAxXG4gICAgICA/IGF3YWl0IGtleWNoYWlucy5hZGQocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpXG4gICAgICA6IGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAxU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGNoYWxsZW5nZXM6IHtcbiAgICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB9O1xuICAgIHBydjogc3RyaW5nO1xuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IGNoYWxsZW5nZXMsIGRlcml2YXRpb25QYXRoLCBwcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IHNpZ25pbmdLZXkgPSBNUEMua2V5RGVyaXZlKFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsXG4gICAgICBbdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmVdLFxuICAgICAgZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29JbmRleCA9IFNoYXJlS2V5UG9zaXRpb24uQklUR087XG4gICAgY29uc3QgdXNlckluZGV4ID0gdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhLCBwOiBwYSB9ID0gY2hhbGxlbmdlcy5lbnRlcnByaXNlQ2hhbGxlbmdlO1xuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiLCBwOiBwYiwgbjogbmIgfSA9IGNoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2U7XG4gICAgY29uc3QgdXNlclhTaGFyZSA9IE1QQy5hcHBlbmRDaGFsbGVuZ2Uoc2lnbmluZ0tleS54U2hhcmUsIHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0sIHsgcDogcGEgfSk7XG4gICAgY29uc3QgYml0Z29ZU2hhcmUgPSBNUEMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAge1xuICAgICAgICBpOiB1c2VySW5kZXgsXG4gICAgICAgIGo6IGJpdGdvSW5kZXgsXG4gICAgICAgIG46IG5iLFxuICAgICAgfSxcbiAgICAgIHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiIH0sXG4gICAgICB7IHA6IHBiIH1cbiAgICApO1xuXG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnblNoYXJlKHVzZXJYU2hhcmUsIGJpdGdvWVNoYXJlKTtcbiAgICBjb25zdCB1ID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnU7XG5cbiAgICBsZXQgY2hhaW5jb2RlID0gdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZS5jaGFpbmNvZGU7XG4gICAgd2hpbGUgKGNoYWluY29kZS5sZW5ndGggPCA2NCkge1xuICAgICAgY2hhaW5jb2RlID0gJzAnICsgY2hhaW5jb2RlO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXJTaGFyZSA9IGJpcDMyLmZyb21Qcml2YXRlS2V5KEJ1ZmZlci5mcm9tKHUsICdoZXgnKSwgQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpLnRvQmFzZTU4KCk7XG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gKGF3YWl0IG9wZW5wZ3AuZW5jcnlwdCh7XG4gICAgICBtZXNzYWdlOiBhd2FpdCBvcGVucGdwLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgICB0ZXh0OiBzaWduZXJTaGFyZSxcbiAgICAgIH0pLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25LZXlzOiBbYml0Z29HcGdLZXldLFxuICAgIH0pKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgcHJpdmF0ZVNoYXJlUHJvb2YgPSBhd2FpdCBjcmVhdGVTaGFyZVByb29mKHVzZXJHcGdLZXkucHJpdmF0ZUtleSwgc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnUsICdlY2RzYScpO1xuICAgIGNvbnN0IHZzc1Byb29mID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnY7XG4gICAgY29uc3QgdXNlclB1YmxpY0dwZ0tleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IHB1YmxpY1NoYXJlID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnkgKyBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuICAgIHJldHVybiB7XG4gICAgICBwcml2YXRlU2hhcmVQcm9vZjogcHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICB2c3NQcm9vZjogdnNzUHJvb2YsXG4gICAgICBwdWJsaWNTaGFyZTogcHVibGljU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZTogZW5jcnlwdGVkU2lnbmVyU2hhcmUsXG4gICAgICB1c2VyUHVibGljR3BnS2V5OiB1c2VyUHVibGljR3BnS2V5LFxuICAgICAga1NoYXJlOiB1c2VyU2lnblNoYXJlLmtTaGFyZSxcbiAgICAgIHdTaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25TaGFyZS53U2hhcmUpLCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSlcbiAgICAgICAgOiB1c2VyU2lnblNoYXJlLndTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB3U2hhcmU6IFdTaGFyZTtcbiAgICBhU2hhcmVGcm9tQml0Z286IE9taXQ8QVNoYXJlLCAnaDEnIHwgJ2gyJyB8ICdudGlsZGUnPjtcbiAgICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxUc3NFY2RzYVN0ZXAyUmV0dXJuTWVzc2FnZT4ge1xuICAgIC8vIEFwcGVuZCB0aGUgQml0R28gY2hhbGxlbmdlIHRvIHRoZSBBc2hhcmUgdG8gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IHByb29mc1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE50aWxkZTogQVNoYXJlID0ge1xuICAgICAgLi4ucGFyYW1zLmFTaGFyZUZyb21CaXRnbyxcbiAgICAgIC4uLnBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXJHYW1tYUFuZE11U2hhcmVzID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUoXG4gICAgICBwYXJhbXMud1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJBU2hhcmVXaXRoTnRpbGRlXG4gICAgKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11RFNoYXJlOiB7XG4gICAgICAgIG11U2hhcmU6IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUsXG4gICAgICAgIGRTaGFyZTogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLmRTaGFyZSxcbiAgICAgICAgaTogdXNlckdhbW1hQW5kTXVTaGFyZXMubXVTaGFyZS5pLFxuICAgICAgfSxcbiAgICAgIG9TaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5vU2hhcmUpLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLm9TaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0T2ZmbGluZVNpZ25lclBhaWxsaWVyTW9kdWx1cyhwYXJhbXM6IHsgcHJ2OiBzdHJpbmcgfSk6IHsgdXNlclBhaWxsaWVyTW9kdWx1czogc3RyaW5nIH0ge1xuICAgIGFzc2VydChwYXJhbXMucHJ2LCAnUGFyYW1zIHRvIGdldCBwYWlsbGllciBtb2R1bHVzIGFyZSBtaXNzaW5nIHBydi4nKTtcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocGFyYW1zLnBydik7XG4gICAgcmV0dXJuIHsgdXNlclBhaWxsaWVyTW9kdWx1czogdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUubiB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZUtTaGFyZShwYXJhbXM6IHtcbiAgICB0c3NQYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2U7XG4gICAgY2hhbGxlbmdlczoge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkRWNkc2FDaGFsbGVuZ2VzO1xuICAgICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIH07XG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlO1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcHJ2LCByZXF1ZXN0VHlwZSwgY2hhbGxlbmdlcyB9ID0gcGFyYW1zO1xuICAgIGFzc2VydCh0eXBlb2YgdHNzUGFyYW1zLnR4UmVxdWVzdCAhPT0gJ3N0cmluZycsICdJbnZhbGlkIHR4UmVxdWVzdCB0eXBlJyk7XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPSB0c3NQYXJhbXMudHhSZXF1ZXN0O1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCAodHhSZXF1ZXN0IGFzIFR4UmVxdWVzdCkudW5zaWduZWRUeHMsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgICAgZGVyaXZhdGlvblBhdGggPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbCh7XG4gICAgICBwcnY6IHBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVNdURlbHRhU2hhcmUocGFyYW1zOiB7XG4gICAgYVNoYXJlRnJvbUJpdGdvOiBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47XG4gICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIGVuY3J5cHRlZFdTaGFyZTogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCBkZWNyeXB0ZWRXU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZFdTaGFyZSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBwYXJhbXMuYVNoYXJlRnJvbUJpdGdvLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IHBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHdTaGFyZTogSlNPTi5wYXJzZShkZWNyeXB0ZWRXU2hhcmUpLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lU1NoYXJlKHBhcmFtczoge1xuICAgIHRzc1BhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZTtcbiAgICBkU2hhcmVGcm9tQml0Z286IERTaGFyZTtcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGU7XG4gICAgZW5jcnlwdGVkT1NoYXJlOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTU2hhcmU+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcmVxdWVzdFR5cGUsIGRTaGFyZUZyb21CaXRnbywgZW5jcnlwdGVkT1NoYXJlLCB3YWxsZXRQYXNzcGhyYXNlIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHR5cGVvZiB0c3NQYXJhbXMudHhSZXF1ZXN0ICE9PSAnc3RyaW5nJywgJ0ludmFsaWQgdHhSZXF1ZXN0IHR5cGUnKTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9IHRzc1BhcmFtcy50eFJlcXVlc3Q7XG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcy50c3NQYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgIH1cbiAgICBsZXQgaGFzaDogSGFzaCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZWNyeXB0ZWRPU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkT1NoYXJlLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCB7IGksIFIsIHMsIHkgfSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICBKU09OLnBhcnNlKGRlY3J5cHRlZE9TaGFyZSksXG4gICAgICBkU2hhcmVGcm9tQml0Z28sXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBoYXNoXG4gICAgKTtcbiAgICAvLyByZXR1cm4gb25seSByZXF1aXJlZCBTU2hhcmUgd2l0aG91dCBiaWdpbnRzIGZyb20gVkFTaGFyZVxuICAgIHJldHVybiB7XG4gICAgICBpLFxuICAgICAgUixcbiAgICAgIHMsXG4gICAgICB5LFxuICAgIH07XG4gIH1cbiAgYXN5bmMgc2lnbkVjZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLFxuICAgIGV4dGVybmFsU2lnbmVyUGFpbGxpZXJNb2R1bHVzR2V0dGVyOiBDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lcktTaGFyZUdlbmVyYXRvcjogQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTXVEZWx0YVNoYXJlR2VuZXJhdG9yOiBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJTU2hhcmVHZW5lcmF0b3I6IEN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb24gPSB0aGlzLndhbGxldC5jb2luU3BlY2lmaWMoKT8ucGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb247XG4gICAgaWYgKHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXYWxsZXQgaXMgbm90IHJlYWR5IGZvciBUU1MgRUNEU0Egc2lnbmluZy4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluIHRvIGZpbmlzaCB0aGUgZW50ZXJwcmlzZSBUU1MgaW5pdGlhbGl6YXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdHhSZXF1ZXN0T2JqOiBUeFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0IGFzIHN0cmluZywgcGFyYW1zLnJlcUlkKTtcbiAgICBjb25zdCB7IHVzZXJQYWlsbGllck1vZHVsdXMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyUGFpbGxpZXJNb2R1bHVzR2V0dGVyKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmogfSk7XG4gICAgY29uc3QgeyBlbnRlcnByaXNlQ2hhbGxlbmdlLCBiaXRnb0NoYWxsZW5nZSB9ID0gYXdhaXQgdGhpcy5nZXRFY2RzYVNpZ25pbmdDaGFsbGVuZ2VzKFxuICAgICAgdHhSZXF1ZXN0IGFzIHN0cmluZyxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdXNlclBhaWxsaWVyTW9kdWx1cyxcbiAgICAgIDAsXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGNvbnN0IHN0ZXAxU2lnbmluZ01hdGVyaWFsID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3Ioe1xuICAgICAgdHNzUGFyYW1zOiB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmosXG4gICAgICB9LFxuICAgICAgY2hhbGxlbmdlczogeyBlbnRlcnByaXNlQ2hhbGxlbmdlLCBiaXRnb0NoYWxsZW5nZSB9LFxuICAgICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2Ugb25lIHdpdGggSyBzaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBBIHNoYXJlXG4gICAgY29uc3QgYml0Z29Ub1VzZXJBU2hhcmUgPSAoYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5LU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5rU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5lbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnZzc1Byb29mLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5wdWJsaWNTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnVzZXJQdWJsaWNHcGdLZXksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApKSBhcyBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47IC8vIFdQL0hTTSBkb2VzIG5vdCByZXR1cm4gdGhlIGluaXRpYWwgY2hhbGxlbmdlXG4gICAgY29uc3Qgc3RlcDJSZXR1cm4gPSBhd2FpdCBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIGFTaGFyZUZyb21CaXRnbzogYml0Z29Ub1VzZXJBU2hhcmUsXG4gICAgICBiaXRnb0NoYWxsZW5nZTogYml0Z29DaGFsbGVuZ2UsXG4gICAgICBlbmNyeXB0ZWRXU2hhcmU6IHN0ZXAxU2lnbmluZ01hdGVyaWFsLndTaGFyZSBhcyBzdHJpbmcsXG4gICAgfSk7XG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RPYmoudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHN0ZXAyUmV0dXJuLm11RFNoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgRFNoYXJlO1xuICAgIGNvbnN0IHVzZXJTU2hhcmUgPSBhd2FpdCBleHRlcm5hbFNpZ25lclNTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0c3NQYXJhbXM6IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIH0sXG4gICAgICBkU2hhcmVGcm9tQml0Z286IGJpdGdvVG9Vc2VyRFNoYXJlLFxuICAgICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgICAgZW5jcnlwdGVkT1NoYXJlOiBzdGVwMlJldHVybi5vU2hhcmUgYXMgc3RyaW5nLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdGhyZWUgd2l0aCBTU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgU1NoYXJlXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5TU2hhcmUsXG4gICAgICB1c2VyU1NoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ25pbmcga2V5LCB0eFJlcXVlc3RSZXNvbHZlZCBhbmQgdHhSZXF1ZXN0SWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0geyBzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKFxuICAgIHBhcmFtczogVFNTUGFyYW1zV2l0aFBydiB8IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uID0gdGhpcy53YWxsZXQuY29pblNwZWNpZmljKCk/LnBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uO1xuICAgIGlmIChwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2FsbGV0IGlzIG5vdCByZWFkeSBmb3IgVFNTIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbiB0byBmaW5pc2ggdGhlIGVudGVycHJpc2UgVFNTIGluaXRpYWxpemF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwYXJhbXMucHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZCA9IG5ldyBCdWZmZXIoJycpO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aCA9ICcnO1xuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHVuc2lnbmVkVHguc2lnbmFibGVIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHBhcmFtcy50eFBhcmFtcyB8fCB7IHJlY2lwaWVudHM6IFtdIH0sXG4gICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZSgpLFxuICAgICAgfSk7XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcyBhcyBUU1NQYXJhbXNGb3JNZXNzYWdlKS5idWZmZXJUb1NpZ247XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgIH1cbiAgICBjb25zdCBwYWlsbGllck1vZHVsdXMgPSB0aGlzLmdldE9mZmxpbmVTaWduZXJQYWlsbGllck1vZHVsdXMoeyBwcnY6IHBhcmFtcy5wcnYgfSk7XG4gICAgY29uc3QgY2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMuZ2V0RWNkc2FTaWduaW5nQ2hhbGxlbmdlcyhcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgcGFpbGxpZXJNb2R1bHVzLnVzZXJQYWlsbGllck1vZHVsdXMsXG4gICAgICAwLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGNvbnN0IHN0ZXAxUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVUc3NFY2RzYVN0ZXAxU2lnbmluZ01hdGVyaWFsKHtcbiAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgfSk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIG9uZSB3aXRoIEsgc2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgQSBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4ua1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4uZW5jcnlwdGVkU2lnbmVyT2Zmc2V0U2hhcmUsXG4gICAgICBzdGVwMVJldHVybi52c3NQcm9vZixcbiAgICAgIHN0ZXAxUmV0dXJuLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgc3RlcDFSZXR1cm4ucHVibGljU2hhcmUsXG4gICAgICBzdGVwMVJldHVybi51c2VyUHVibGljR3BnS2V5LFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgT21pdDxBU2hhcmUsICdudGlsZGUnIHwgJ2gxJyB8ICdoMic+OyAvLyBXUC9IU00gZG9lcyBub3QgcmV0dXJuIHRoZSBpbml0aWFsIGNoYWxsZW5nZVxuXG4gICAgY29uc3Qgc3RlcDJSZXR1cm4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBiaXRnb1RvVXNlckFTaGFyZSxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBjaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLFxuICAgICAgd1NoYXJlOiBzdGVwMVJldHVybi53U2hhcmUgYXMgV1NoYXJlLFxuICAgIH0pO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHN0ZXAyUmV0dXJuLm11RFNoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgRFNoYXJlO1xuXG4gICAgLy8gSWYgb25seSB0aGUgZ2V0SGFzaEZ1bmN0aW9uKCkgaXMgZGVmaW5lZCBmb3IgdGhlIGNvaW4gdXNlIGl0IG90aGVyd2lzZVxuICAgIC8vIHBhc3MgdW5kZWZpbmVkIGhhc2gsIGRlZmF1bHQgaGFzaCB3aWxsIGJlIHVzZWQgaW4gdGhhdCBjYXNlLlxuICAgIGxldCBoYXNoOiBIYXNoIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICBzdGVwMlJldHVybi5vU2hhcmUgYXMgT1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBoYXNoXG4gICAgKTtcblxuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdGhyZWUgd2l0aCBTU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgU1NoYXJlXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5TU2hhcmUsXG4gICAgICB1c2VyU1NoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlUmF3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhdyBtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgZm9yIGVudGVycHJpc2UgYW5kIEJpdEdvIGluIEVDRFNBIHNpZ25pbmdcbiAgICogT25seSByZXR1cm5zIHRoZSBjaGFsbGVuZ2VzIGlmIHRoZXkgYXJlIHZlcmlmaWVkIGJ5IHRoZSB1c2VyJ3MgZW50ZXJwcmlzZSBhZG1pbidzIGVjZGgga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRyYW5zYWN0aW9uIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtSZXF1ZXN0VHlwZX0gcmVxdWVzdFR5cGUgLSAgKDAgZm9yIHR4LCAxIGZvciBtZXNzYWdlKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFpbGxpZXJNb2R1bHVzIC0gcGFpbGxpZXIgcHVia2V5ICRuJFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgcmVxdWVzdFR5cGVcbiAgICogQHBhcmFtIHtJUmVxdWVzdFRyYWNlcn0gcmVxSWQgLSByZXF1ZXN0IHRyYWNlciByZXF1ZXN0IGlkXG4gICAqL1xuICBhc3luYyBnZXRFY2RzYVNpZ25pbmdDaGFsbGVuZ2VzKFxuICAgIHR4UmVxdWVzdElkOiBzdHJpbmcsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLFxuICAgIHdhbGxldFBhaWxsaWVyTW9kdWx1czogc3RyaW5nLFxuICAgIGluZGV4ID0gMCxcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyXG4gICk6IFByb21pc2U8e1xuICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2U7XG4gIH0+IHtcbiAgICBjb25zdCBlbnRlcnByaXNlSWQgPSB0aGlzLndhbGxldC50b0pTT04oKS5lbnRlcnByaXNlO1xuICAgIGlmICghZW50ZXJwcmlzZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBtdXN0IGJlIGFuIGVudGVycHJpc2Ugd2FsbGV0LicpO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBCaXRHbyByYW5nZSBwcm9vZiBhbmQgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3QgY3JlYXRlQml0Z29DaGFsbGVuZ2VSZXNwb25zZSA9IGF3YWl0IGdldFR4UmVxdWVzdENoYWxsZW5nZShcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICBpbmRleC50b1N0cmluZygpLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB3YWxsZXRQYWlsbGllck1vZHVsdXMsXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb1RvRW50ZXJwcmlzZVBhaWxsaWVyQ2hhbGxlbmdlID0geyBwOiBjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLnAgfTtcbiAgICBjb25zdCBlbnRlcnByaXNlVG9CaXRnb1BhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5zZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7XG4gICAgICBwOiBhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YuZ2VuZXJhdGVQKGhleFRvQmlnSW50KGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UubikpLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETyhCRy03ODc2NCk6IG9uY2UgdGhlIHBhaWxsaWVyIHByb29mcyBhcmUgY29tcGxldGUsIHJlZHVjZSBjaGFsbGVuZ2UgY3JlYXRpb24gdG8gb25lIEFQSSBjYWxsXG4gICAgY29uc3Qgd2FsbGV0Q2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMud2FsbGV0LmdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTtcblxuICAgIGNvbnN0IGNoYWxsZW5nZVZlcmlmaWVyVXNlcklkID0gd2FsbGV0Q2hhbGxlbmdlcy5jcmVhdGVkQnk7XG4gICAgY29uc3QgYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCwgY2hhbGxlbmdlVmVyaWZpZXJVc2VySWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UuZGVyaXZlZFB1YmtleTtcblxuICAgIC8vIFZlcmlmeSBlbnRlcnByaXNlJ3MgY2hhbGxlbmdlIGlzIHNpZ25lZCBieSB0aGUgcmVzcGVjdGl2ZSBhZG1pbnMgZWNkaCBrZXljaGFpblxuICAgIGNvbnN0IGVudGVycHJpc2VSYXdDaGFsbGVuZ2UgPSB7XG4gICAgICBudGlsZGU6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5udGlsZGUsXG4gICAgICBoMTogd2FsbGV0Q2hhbGxlbmdlcy5lbnRlcnByaXNlQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5oMixcbiAgICB9O1xuICAgIGNvbnN0IGFkbWluU2lnbmF0dXJlT25FbnRDaGFsbGVuZ2U6IHN0cmluZyA9IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS52ZXJpZmllcnMuYWRtaW5TaWduYXR1cmU7XG4gICAgaWYgKFxuICAgICAgIXZlcmlmeUVjZGhTaWduYXR1cmUoXG4gICAgICAgIEVjZHNhVXRpbHMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoZW50ZXJwcmlzZVJhd0NoYWxsZW5nZSksXG4gICAgICAgIGFkbWluU2lnbmF0dXJlT25FbnRDaGFsbGVuZ2UsXG4gICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LCAnaGV4JylcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRtaW4gc2lnbmF0dXJlIGZvciBlbnRlcnByaXNlIGNoYWxsZW5nZSBpcyBub3QgdmFsaWQuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbi5gKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQml0R28gY2hhbGxlbmdlJ3MgWksgcHJvb2ZzIGhhdmUgYmVlbiB2ZXJpZmllZCBieSB0aGUgYWRtaW5cbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2UgPSB7XG4gICAgICBudGlsZGU6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgaDE6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UuaDEsXG4gICAgICBoMjogd2FsbGV0Q2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZS5oMixcbiAgICAgIHA6IGJpdGdvVG9FbnRlcnByaXNlUGFpbGxpZXJDaGFsbGVuZ2UucCxcbiAgICAgIG46IGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UubixcbiAgICB9O1xuICAgIGNvbnN0IGFkbWluVmVyaWZpY2F0aW9uU2lnbmF0dXJlRm9yQml0R29DaGFsbGVuZ2UgPSB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLnZlcmlmaWVycy5hZG1pblNpZ25hdHVyZTtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZ5RWNkaFNpZ25hdHVyZShcbiAgICAgICAgRWNkc2FVdGlscy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShiaXRnb0NoYWxsZW5nZSksXG4gICAgICAgIGFkbWluVmVyaWZpY2F0aW9uU2lnbmF0dXJlRm9yQml0R29DaGFsbGVuZ2UsXG4gICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LCAnaGV4JylcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRtaW4gc2lnbmF0dXJlIGZvciBCaXRHbydzIGNoYWxsZW5nZSBpcyBub3QgdmFsaWQuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZToge1xuICAgICAgICAuLi5lbnRlcnByaXNlUmF3Q2hhbGxlbmdlLFxuICAgICAgICBwOiBlbnRlcnByaXNlVG9CaXRnb1BhaWxsaWVyQ2hhbGxlbmdlLnAsXG4gICAgICB9LFxuICAgICAgYml0Z29DaGFsbGVuZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgdS12YWx1ZSBwcm9vZnMgYW5kIEdQRyBrZXlzIHVzZWQgaW4gZ2VuZXJhdGluZyBhIFRTUyBFQ0RTQSB3YWxsZXQuXG4gICAqIEBwYXJhbSB1c2VyR3BnUHViIFRoZSB1c2VyJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiB1c2VyL3NlcnZlclxuICAgKiBAcGFyYW0gYmFja3VwR3BnUHViIFRoZSBiYWNrdXAncyBwdWJsaWMgR1BHIGtleSBmb3IgZW5jcnlwdGlvbiBiZXR3ZWVuIGJhY2t1cC9zZXJ2ZXJcbiAgICogQHBhcmFtIGJpdGdvS2V5Y2hhaW4gcHJldmlvdXNseSBjcmVhdGVkIEJpdEdvIGtleWNoYWluOyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlc1xuICAgKiBAcGFyYW0gZGVjcnlwdGVkU2hhcmUgVGhlIGRlY3J5cHRlZCBiaXRnby10by11c2VyL2JhY2t1cCBwcml2YXRlIHNoYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gdmVyaWZpZXJJbmRleCBUaGUgaW5kZXggb2YgdGhlIHBhcnR5IHRvIHZlcmlmeTogMSA9IHVzZXIsIDIgPSBiYWNrdXBcbiAgICovXG4gIGFzeW5jIHZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgdXNlckdwZ1B1Yjogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1Yjogc3RyaW5nLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIGRlY3J5cHRlZFNoYXJlOiBzdHJpbmcsXG4gICAgdmVyaWZpZXJJbmRleDogMSB8IDJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MpO1xuXG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuICAgIGNvbnN0IHVzZXJLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHViIH0pO1xuICAgIGNvbnN0IHVzZXJLZXlJZCA9IHVzZXJLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG4gICAgY29uc3QgYmFja3VwS2V5UHViID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYmFja3VwR3BnUHViIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleUlkID0gYmFja3VwS2V5UHViLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpO1xuXG4gICAgY29uc3Qgd2FsbGV0U2lnbmF0dXJlcyA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleXMoeyBhcm1vcmVkS2V5czogYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzIH0pO1xuICAgIGlmICh3YWxsZXRTaWduYXR1cmVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdhbGxldCBzaWduYXR1cmVzJyk7XG4gICAgfVxuICAgIGlmICh1c2VyS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMF0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmlyc3Qgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCB1c2VyIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cbiAgICBpZiAoYmFja3VwS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMV0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2Vjb25kIHdhbGxldCBzaWduYXR1cmUncyBmaW5nZXJwcmludCBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgYmFja3VwIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cblxuICAgIGF3YWl0IHZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICB3YWxsZXRTaWduYXR1cmU6IHdhbGxldFNpZ25hdHVyZXNbMF0sXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJLZXlJZCxcbiAgICAgIGJhY2t1cEtleUlkLFxuICAgICAgYml0Z29QdWI6IGJpdGdvR3BnS2V5LFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICB2ZXJpZmllckluZGV4LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1sxXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSBjaGFsbGVuZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgdjEgZWNkaCBrZXkgYXQgYSBkZXJpdmVkIHBhdGhcbiAgICogQHBhcmFtIGNoYWxsZW5nZSBjaGFsbGVuZ2UgdG8gc2lnblxuICAgKiBAcGFyYW0gZWNkaFhwcnYgeHBydiBvZiB0aGUgZWNkaCBrZXlcbiAgICogQHBhcmFtIGRlcml2YXRpb25QYXRoIHRoZSBkZXJpdmVkIHBhdGggYXQgd2hpY2ggdGhlIGVjZGgga2V5IHdpbGwgc2lnblxuICAgKi9cbiAgc3RhdGljIHNpZ25DaGFsbGVuZ2UoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUsIGVjZGhYcHJ2OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIGNvbnN0IG1lc3NhZ2VUb1NpZ24gPSB0aGlzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGNoYWxsZW5nZSk7XG4gICAgcmV0dXJuIHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5KG1lc3NhZ2VUb1NpZ24sIGVjZGhYcHJ2LCBkZXJpdmF0aW9uUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgY2hhbGxlbmdlIHRvIGEgY29tbW9uIG1lc3NhZ2UgZm9ybWF0IHdoaWNoIGNhbiBiZSBzaWduZWQuXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBnZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNoYWxsZW5nZS5udGlsZGUuY29uY2F0KGNoYWxsZW5nZS5oMSkuY29uY2F0KGNoYWxsZW5nZS5oMik7XG4gIH1cblxuICAvKipcbiAgIFZlcmlmaWVzIFpLIHByb29mcyBvZiBCaXRHbydzIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNc1xuICAgd2hpY2ggYXJlIGZldGNoZWQgZnJvbSB0aGUgV1AgQVBJLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZlcmlmeUJpdEdvQ2hhbGxlbmdlcyhiaXRnb0NoYWxsZW5nZXM6IEdldEJpdEdvQ2hhbGxlbmdlc0FwaSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFZlcmlmeSBpbnN0aXR1dGlvbmFsIGhzbSBjaGFsbGVuZ2UgcHJvb2ZcbiAgICBjb25zdCBpbnN0Q2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSxcbiAgICAgIGgyOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlUHJvb2YsXG4gICAgfSk7XG5cbiAgICAvLyBWZXJpZnkgbml0cm8gaHNtIGNoYWxsZW5nZSBwcm9vZlxuICAgIGNvbnN0IG5pdHJvQ2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20ubnRpbGRlLFxuICAgICAgaDE6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluc3RDaGFsbGVuZ2VWZXJpZmllZCAmJiBuaXRyb0NoYWxsZW5nZVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIFpLIHByb29mIGZvciBhIHNpbmdsZSBCaXRHbyBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5Qml0R29DaGFsbGVuZ2UoYml0Z29DaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMoYml0Z29DaGFsbGVuZ2UpO1xuICAgIGNvbnN0IG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnZlcmlmeU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMSxcbiAgICAgICAgaDI6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICB9LFxuICAgICAgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyXG4gICAgKTtcbiAgICBjb25zdCBudGlsZGVQcm9vZkgyV3J0SDFWZXJpZmllZCA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlOdGlsZGVQcm9vZihcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICAgIGgyOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgxLFxuICAgICAgfSxcbiAgICAgIGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDJXcnRIMVxuICAgICk7XG4gICAgcmV0dXJuIG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkICYmIG50aWxkZVByb29mSDJXcnRIMVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJpdGdvIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNcyBmcm9tIFdQIEFQSS5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvOiBCaXRHb0Jhc2UpOiBQcm9taXNlPEdldEJpdEdvQ2hhbGxlbmdlc0FwaT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJpdGdvLmdldChiaXRnby51cmwoJy90c3MvZWNkc2EvY2hhbGxlbmdlcycsIDIpKS5zZW5kKCkucmVzdWx0KCk7XG4gICAgaWYgKFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20ubnRpbGRlIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20uaDEgfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5oMiB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDIgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZVByb29mXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEJpdEdvIGNoYWxsZW5nZSBwcm9vZiB0byBiZSBwcmVzZW50LiBDb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgQml0R28ncyBwcm9vZnMgZnJvbSBBUEkgYW5kIHNpZ25zIHRoZW0gaWYgdGhlIHByb29mcyBhcmUgdmFsaWQuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRWZXJpZnlBbmRTaWduQml0R29DaGFsbGVuZ2VzKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50ZXJwcmlzZUlkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCaXRHb1Byb29mU2lnbmF0dXJlcz4ge1xuICAgIC8vIEZldGNoIEJpdEdvJ3MgY2hhbGxlbmdlIGFuZCB2ZXJpZnlcbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzID0gYXdhaXQgRWNkc2FVdGlscy5nZXRCaXRHb0NoYWxsZW5nZXMoYml0Z28pO1xuICAgIGlmICghKGF3YWl0IEVjZHNhVXRpbHMudmVyaWZ5Qml0R29DaGFsbGVuZ2VzKGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHZlcmlmeSBCaXRHbydzIGNoYWxsZW5nZSBuZWVkZWQgdG8gZW5hYmxlIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IEVjZHNhVXRpbHMuc2lnbkJpdGdvQ2hhbGxlbmdlcyhiaXRnbywgZW50ZXJwcmlzZUlkLCB1c2VyUGFzc3dvcmQsIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gQml0Z28ncyBwcm9vZnMsIHZlcmlmaWNhdGlvbiBvZiBwcm9vZnMgaXMgbGVmdCB0byB0aGUgY2FsbGVyXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMgT3B0aW9uYWxseSBwcm92aWRlIEJpdGdvIENoYWxsYWVuZ2UgJiBQcm9vZnMgaW5zdGVhZCBvZiBmZXRjaGluZyBmcm9tIEFQSVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpZ25CaXRnb0NoYWxsZW5nZXMoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICB1c2VyUGFzc3dvcmQ6IHN0cmluZyxcbiAgICBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzPzogR2V0Qml0R29DaGFsbGVuZ2VzQXBpXG4gICk6IFByb21pc2U8Qml0R29Qcm9vZlNpZ25hdHVyZXM+IHtcbiAgICAvLyBmZXRjaCBjaGFsbGVuZ2UgJiBwcm9vZiBpZiBub25lIGFyZSBwcm92aWRlZFxuICAgIGNvbnN0IGNoYWxsZW5nZXNXaXRoUHJvb2ZzID0gYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mc1xuICAgICAgPyBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzXG4gICAgICA6IGF3YWl0IEVjZHNhVXRpbHMuZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvKTtcblxuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCBlY2RoS2V5cGFpciA9IGF3YWl0IGJpdGdvLmdldEVjZGhLZXlwYWlyUHJpdmF0ZSh1c2VyUGFzc3dvcmQsIGVudGVycHJpc2VJZCk7XG5cbiAgICBjb25zdCBzaWduZWRCaXRHb0luc3RDaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb0luc3RpdHV0aW9uYWxIc20sXG4gICAgICBlY2RoS2V5cGFpci54cHJ2LFxuICAgICAgZWNkaEtleXBhaXIuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZEJpdEdvTml0cm9DaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb05pdHJvSHNtLFxuICAgICAgZWNkaEtleXBhaXIueHBydixcbiAgICAgIGVjZGhLZXlwYWlyLmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29JbnN0SHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSxcbiAgICAgIGJpdGdvTml0cm9Ic21BZG1pblNpZ25hdHVyZTogc2lnbmVkQml0R29OaXRyb0NoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBJdCByZWNlaXZlcyB0aGUgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgYW5kIHNpZ25hdHVyZXMgb2YgdmVyaWZpZWQgYml0Z28gcHJvb2ZzXG4gICAqIGFuZCB1cGxvYWRzIHRoZW0gb24gdGhlIGVudGVycHJpc2UuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIGlkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgLSBlbnRlcnByaXNlIGFkbWluJ3MgbG9naW4gcHdcbiAgICogQHBhcmFtIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIG9wdGlvbmFsbHkgdXNlIHRoZSBjaGFsbGVuZ2UgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5pdGlhdGVDaGFsbGVuZ2VzRm9yRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBvcGVuU1NMQnl0ZXM6IFVpbnQ4QXJyYXksXG4gICAgY2hhbGxlbmdlPzogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCBlY2RoS2V5cGFpciA9IGF3YWl0IGJpdGdvLmdldEVjZGhLZXlwYWlyUHJpdmF0ZSh1c2VyUGFzc3dvcmQsIGVudElkKTtcblxuICAgIC8vIEdlbmVyYXRlIGFuZCBzaWduIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAgY29uc3QgZW50Q2hhbGxlbmdlV2l0aFByb29mID1cbiAgICAgIGNoYWxsZW5nZSA/PyAoYXdhaXQgRWNkc2FSYW5nZVByb29mLmdlbmVyYXRlTnRpbGRlKG9wZW5TU0xCeXRlcywgbWluTW9kdWx1c0JpdExlbmd0aCkpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YgPSBFY2RzYVR5cGVzLnNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMoZW50Q2hhbGxlbmdlV2l0aFByb29mKTtcbiAgICBjb25zdCBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlID0gRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgc2VyaWFsaXplZEVudENoYWxsZW5nZVdpdGhQcm9vZixcbiAgICAgIGVjZGhLZXlwYWlyLnhwcnYsXG4gICAgICBlY2RoS2V5cGFpci5kZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLnVwbG9hZENoYWxsZW5nZXNUb0VudGVycHJpc2UoXG4gICAgICBiaXRnbyxcbiAgICAgIGVudElkLFxuICAgICAgc2VyaWFsaXplZEVudENoYWxsZW5nZVdpdGhQcm9vZixcbiAgICAgIHNpZ25lZEVudGVycHJpc2VDaGFsbGVuZ2UudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyB0aGUgc2lnbmVkIGNoYWxsZW5nZXMgYW5kIHRoZWlyIHByb29mcyBvbiB0aGUgZW50ZXJwcmlzZS5cbiAgICogVGhpcyBpbml0aWF0ZXMgZWNkc2Egc2lnbmluZyBmb3IgdGhlIGVudGVycHJpc2UgdXNlcnMuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSBlbnRDaGFsbGVuZ2UgLSBjbGllbnQgc2lkZSBnZW5lcmF0ZWQgZW50IGNoYWxsZW5nZSB3aXRoIFpLIHByb29mc1xuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb0ludENoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBCaXRHbydzIGluc3RpdHV0aW9uYWwgSFNNIGNoYWxsZW5nZVxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBCaXRHbydzIG5pdHJvIEhTTSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyB1cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50SWQ6IHN0cmluZyxcbiAgICBlbnRDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSB8IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMsXG4gICAgZW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmU6IHN0cmluZyxcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGVudGVycHJpc2U6IHtcbiAgICAgICAgbnRpbGRlOiBlbnRDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZW50Q2hhbGxlbmdlLmgxLFxuICAgICAgICBoMjogZW50Q2hhbGxlbmdlLmgyLFxuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogZW50Q2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJpdGdvSW5zdGl0dXRpb25hbEhzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYml0Z29OaXRyb0hzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoJ250aWxkZVByb29mJyBpbiBlbnRDaGFsbGVuZ2UpIHtcbiAgICAgIGJvZHkuZW50ZXJwcmlzZVsnbnRpbGRlUHJvb2YnXSA9IGVudENoYWxsZW5nZS5udGlsZGVQcm9vZjtcbiAgICB9XG4gICAgYXdhaXQgYml0Z29cbiAgICAgIC5wdXQoYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke2VudElkfS90c3Njb25maWcvZWNkc2EvY2hhbGxlbmdlYCwgMikpXG4gICAgICAuc2VuZChib2R5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG59XG4iXX0=
|