@bitgo-beta/sdk-core 8.2.1-beta.9 → 8.2.1-beta.91
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 +151 -0
- package/dist/src/account-lib/baseCoin/enum.d.ts +4 -1
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +7 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +33 -10
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +551 -141
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +70 -55
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +0 -3
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +16 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +15 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +18 -2
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/environments.d.ts +7 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +17 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -0
- 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 +30 -24
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +124 -89
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +31 -24
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +12 -1
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +11 -1
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts +7 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +9 -1
- package/dist/src/bitgo/tss/common.d.ts +15 -4
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +26 -11
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +11 -8
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +36 -33
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +2 -2
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +4 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +16 -5
- package/dist/src/bitgo/tss/types.d.ts +19 -0
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +53 -12
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +62 -9
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +99 -8
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +26 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +44 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +229 -86
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +18 -5
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +76 -22
- package/dist/src/bitgo/wallet/iWallet.d.ts +12 -1
- 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/wallet.d.ts +10 -2
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +108 -14
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/src/openssl/index.d.ts +4 -1
- package/dist/src/openssl/index.d.ts.map +1 -1
- package/dist/src/openssl/index.js +7 -12
- package/dist/tsconfig.tsbuildinfo +1 -8272
- package/package.json +8 -7
- package/dist/src/openssl/openssl.d.ts +0 -12
- package/dist/src/openssl/openssl.d.ts.map +0 -1
- package/dist/src/openssl/openssl.js +0 -48
- package/dist/src/openssl/opensslbytes.d.ts +0 -4
- package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
- package/dist/src/openssl/opensslbytes.js +0 -20
|
@@ -26,6 +26,7 @@ exports.EcdsaUtils = void 0;
|
|
|
26
26
|
const assert_1 = __importDefault(require("assert"));
|
|
27
27
|
const buffer_1 = require("buffer");
|
|
28
28
|
const openpgp = __importStar(require("openpgp"));
|
|
29
|
+
const elliptic_1 = require("elliptic");
|
|
29
30
|
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
30
31
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
31
32
|
const tss_1 = require("../../../../account-lib/mpc/tss");
|
|
@@ -38,7 +39,7 @@ const opengpgUtils_1 = require("../../opengpgUtils");
|
|
|
38
39
|
const ecdsa_2 = require("../../../tss/ecdsa/ecdsa");
|
|
39
40
|
const ecdh_1 = require("../../../ecdh");
|
|
40
41
|
const common_1 = require("../../../tss/common");
|
|
41
|
-
const
|
|
42
|
+
const types_2 = require("../../../tss/types");
|
|
42
43
|
const encryptNShare = ecdsa_1.default.encryptNShare;
|
|
43
44
|
/** @inheritdoc */
|
|
44
45
|
class EcdsaUtils extends baseTSSUtils_1.default {
|
|
@@ -422,61 +423,28 @@ class EcdsaUtils extends baseTSSUtils_1.default {
|
|
|
422
423
|
? await keychains.add(recipientKeychainParams)
|
|
423
424
|
: await keychains.createBackup(recipientKeychainParams);
|
|
424
425
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
* @param {string} params.prv - decrypted private key
|
|
429
|
-
* @param { string} params.reqId - request id
|
|
430
|
-
* @returns {Promise<TxRequest>}
|
|
431
|
-
*/
|
|
432
|
-
async signRequestBase(params, requestType) {
|
|
433
|
-
var _a;
|
|
434
|
-
const pendingEcdsaTssInitialization = (_a = this.wallet.coinSpecific()) === null || _a === void 0 ? void 0 : _a.pendingEcdsaTssInitialization;
|
|
435
|
-
if (pendingEcdsaTssInitialization) {
|
|
436
|
-
throw new Error('Wallet is not ready for TSS ECDSA signing. Please contact your enterprise admin to finish the enterprise TSS initialization.');
|
|
437
|
-
}
|
|
438
|
-
const userSigningMaterial = JSON.parse(params.prv);
|
|
426
|
+
async createTssEcdsaStep1SigningMaterial(params) {
|
|
427
|
+
const { challenges, derivationPath, prv } = params;
|
|
428
|
+
const userSigningMaterial = JSON.parse(prv);
|
|
439
429
|
if (userSigningMaterial.pShare.i !== 1) {
|
|
440
430
|
throw new Error('Invalid user key');
|
|
441
431
|
}
|
|
442
432
|
if (!userSigningMaterial.backupNShare) {
|
|
443
433
|
throw new Error('Invalid user key - missing backupNShare');
|
|
444
434
|
}
|
|
445
|
-
const txRequest = typeof params.txRequest === 'string'
|
|
446
|
-
? await tss_2.getTxRequest(this.bitgo, this.wallet.id(), params.txRequest)
|
|
447
|
-
: params.txRequest;
|
|
448
|
-
let signablePayload;
|
|
449
|
-
let derivationPath;
|
|
450
|
-
if (requestType === baseTypes_1.RequestType.tx) {
|
|
451
|
-
assert_1.default(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
452
|
-
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
453
|
-
signablePayload = buffer_1.Buffer.from(unsignedTx.signableHex, 'hex');
|
|
454
|
-
derivationPath = unsignedTx.derivationPath;
|
|
455
|
-
}
|
|
456
|
-
else if (requestType === baseTypes_1.RequestType.message) {
|
|
457
|
-
signablePayload = params.bufferToSign;
|
|
458
|
-
// TODO BG-67299 Message signing with derivation path
|
|
459
|
-
derivationPath = '';
|
|
460
|
-
}
|
|
461
435
|
const MPC = new tss_1.Ecdsa();
|
|
462
436
|
const signingKey = MPC.keyDerive(userSigningMaterial.pShare, [userSigningMaterial.bitgoNShare, userSigningMaterial.backupNShare], derivationPath);
|
|
463
|
-
const bitgoIndex =
|
|
464
|
-
const userIndex =
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
};
|
|
470
|
-
const challenges = await this.getEcdsaSigningChallenges(txRequest.txRequestId, requestType, 0);
|
|
471
|
-
const signingKeyWithChallenge = await MPC.appendChallenge(signingKey.xShare, yShare, challenges.enterpriseChallenge);
|
|
472
|
-
const userSignShare = await ecdsa_1.default.createUserSignShare(signingKeyWithChallenge.xShare, {
|
|
437
|
+
const bitgoIndex = types_2.ShareKeyPosition.BITGO;
|
|
438
|
+
const userIndex = userSigningMaterial.pShare.i;
|
|
439
|
+
const { ntilde: ntildea, h1: h1a, h2: h2a, p: pa } = challenges.enterpriseChallenge;
|
|
440
|
+
const { ntilde: ntildeb, h1: h1b, h2: h2b, p: pb, n: nb } = challenges.bitgoChallenge;
|
|
441
|
+
const userXShare = MPC.appendChallenge(signingKey.xShare, { ntilde: ntildea, h1: h1a, h2: h2a }, { p: pa });
|
|
442
|
+
const bitgoYShare = MPC.appendChallenge({
|
|
473
443
|
i: userIndex,
|
|
474
444
|
j: bitgoIndex,
|
|
475
|
-
n:
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
h2: challenges.bitgoChallenge.h2,
|
|
479
|
-
});
|
|
445
|
+
n: nb,
|
|
446
|
+
}, { ntilde: ntildeb, h1: h1b, h2: h2b }, { p: pb });
|
|
447
|
+
const userSignShare = await ecdsa_1.default.createUserSignShare(userXShare, bitgoYShare);
|
|
480
448
|
const u = signingKey.nShares[bitgoIndex].u;
|
|
481
449
|
let chaincode = userSigningMaterial.bitgoNShare.chaincode;
|
|
482
450
|
while (chaincode.length < 64) {
|
|
@@ -498,20 +466,184 @@ class EcdsaUtils extends baseTSSUtils_1.default {
|
|
|
498
466
|
const vssProof = signingKey.nShares[bitgoIndex].v;
|
|
499
467
|
const userPublicGpgKey = userGpgKey.publicKey;
|
|
500
468
|
const publicShare = signingKey.nShares[bitgoIndex].y + signingKey.nShares[bitgoIndex].chaincode;
|
|
501
|
-
|
|
502
|
-
|
|
469
|
+
return {
|
|
470
|
+
privateShareProof: privateShareProof,
|
|
471
|
+
vssProof: vssProof,
|
|
472
|
+
publicShare: publicShare,
|
|
473
|
+
encryptedSignerOffsetShare: encryptedSignerShare,
|
|
474
|
+
userPublicGpgKey: userPublicGpgKey,
|
|
475
|
+
kShare: userSignShare.kShare,
|
|
476
|
+
wShare: params.walletPassphrase
|
|
477
|
+
? this.bitgo.encrypt({ input: JSON.stringify(userSignShare.wShare), password: params.walletPassphrase })
|
|
478
|
+
: userSignShare.wShare,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
async createTssEcdsaStep2SigningMaterial(params) {
|
|
503
482
|
// Append the BitGo challenge to the Ashare to be used in subsequent proofs
|
|
504
483
|
const bitgoToUserAShareWithNtilde = {
|
|
505
|
-
...
|
|
506
|
-
...
|
|
484
|
+
...params.aShareFromBitgo,
|
|
485
|
+
...params.bitgoChallenge,
|
|
507
486
|
};
|
|
508
|
-
const userGammaAndMuShares = await ecdsa_1.default.createUserGammaAndMuShare(
|
|
487
|
+
const userGammaAndMuShares = await ecdsa_1.default.createUserGammaAndMuShare(params.wShare, bitgoToUserAShareWithNtilde);
|
|
509
488
|
const userOmicronAndDeltaShare = await ecdsa_1.default.createUserOmicronAndDeltaShare(userGammaAndMuShares.gShare);
|
|
510
|
-
|
|
511
|
-
|
|
489
|
+
return {
|
|
490
|
+
muDShare: {
|
|
491
|
+
muShare: userGammaAndMuShares.muShare,
|
|
492
|
+
dShare: userOmicronAndDeltaShare.dShare,
|
|
493
|
+
i: userGammaAndMuShares.muShare.i,
|
|
494
|
+
},
|
|
495
|
+
oShare: params.walletPassphrase
|
|
496
|
+
? this.bitgo.encrypt({
|
|
497
|
+
input: JSON.stringify(userOmicronAndDeltaShare.oShare),
|
|
498
|
+
password: params.walletPassphrase,
|
|
499
|
+
})
|
|
500
|
+
: userOmicronAndDeltaShare.oShare,
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
getOfflineSignerPaillierModulus(params) {
|
|
504
|
+
assert_1.default(params.prv, 'Params to get paillier modulus are missing prv.');
|
|
505
|
+
const userSigningMaterial = JSON.parse(params.prv);
|
|
506
|
+
return { userPaillierModulus: userSigningMaterial.pShare.n };
|
|
507
|
+
}
|
|
508
|
+
async createOfflineKShare(params) {
|
|
509
|
+
const { tssParams, prv, requestType, challenges } = params;
|
|
510
|
+
assert_1.default(typeof tssParams.txRequest !== 'string', 'Invalid txRequest type');
|
|
511
|
+
const txRequest = tssParams.txRequest;
|
|
512
|
+
let derivationPath;
|
|
513
|
+
if (requestType === baseTypes_1.RequestType.tx) {
|
|
514
|
+
assert_1.default(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
515
|
+
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
516
|
+
derivationPath = unsignedTx.derivationPath;
|
|
517
|
+
}
|
|
518
|
+
else if (requestType === baseTypes_1.RequestType.message) {
|
|
519
|
+
// TODO BG-67299 Message signing with derivation path
|
|
520
|
+
derivationPath = '';
|
|
521
|
+
}
|
|
522
|
+
return this.createTssEcdsaStep1SigningMaterial({
|
|
523
|
+
prv: prv,
|
|
524
|
+
challenges: challenges,
|
|
525
|
+
derivationPath: derivationPath,
|
|
526
|
+
walletPassphrase: params.walletPassphrase,
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
async createOfflineMuDeltaShare(params) {
|
|
530
|
+
const decryptedWShare = this.bitgo.decrypt({ input: params.encryptedWShare, password: params.walletPassphrase });
|
|
531
|
+
return await this.createTssEcdsaStep2SigningMaterial({
|
|
532
|
+
aShareFromBitgo: params.aShareFromBitgo,
|
|
533
|
+
bitgoChallenge: params.bitgoChallenge,
|
|
534
|
+
wShare: JSON.parse(decryptedWShare),
|
|
535
|
+
walletPassphrase: params.walletPassphrase,
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
async createOfflineSShare(params) {
|
|
539
|
+
const { tssParams, requestType, dShareFromBitgo, encryptedOShare, walletPassphrase } = params;
|
|
540
|
+
assert_1.default(typeof tssParams.txRequest !== 'string', 'Invalid txRequest type');
|
|
541
|
+
const txRequest = tssParams.txRequest;
|
|
542
|
+
let signablePayload;
|
|
543
|
+
if (requestType === baseTypes_1.RequestType.tx) {
|
|
544
|
+
assert_1.default(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
545
|
+
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
546
|
+
signablePayload = buffer_1.Buffer.from(unsignedTx.signableHex, 'hex');
|
|
547
|
+
}
|
|
548
|
+
else if (requestType === baseTypes_1.RequestType.message) {
|
|
549
|
+
signablePayload = params.tssParams.bufferToSign;
|
|
550
|
+
}
|
|
551
|
+
const decryptedOShare = this.bitgo.decrypt({ input: encryptedOShare, password: walletPassphrase });
|
|
552
|
+
return await ecdsa_1.default.createUserSignatureShare(JSON.parse(decryptedOShare), dShareFromBitgo, signablePayload);
|
|
553
|
+
}
|
|
554
|
+
async signEcdsaTssUsingExternalSigner(params, requestType, externalSignerPaillierModulusGetter, externalSignerKShareGenerator, externalSignerMuDeltaShareGenerator, externalSignerSShareGenerator) {
|
|
555
|
+
var _a;
|
|
556
|
+
const { txRequest } = params;
|
|
557
|
+
const pendingEcdsaTssInitialization = (_a = this.wallet.coinSpecific()) === null || _a === void 0 ? void 0 : _a.pendingEcdsaTssInitialization;
|
|
558
|
+
if (pendingEcdsaTssInitialization) {
|
|
559
|
+
throw new Error('Wallet is not ready for TSS ECDSA signing. Please contact your enterprise admin to finish the enterprise TSS initialization.');
|
|
560
|
+
}
|
|
561
|
+
const txRequestObj = await tss_2.getTxRequest(this.bitgo, this.wallet.id(), txRequest);
|
|
562
|
+
const { userPaillierModulus } = await externalSignerPaillierModulusGetter({ txRequest: txRequestObj });
|
|
563
|
+
const { enterpriseChallenge, bitgoChallenge } = await this.getEcdsaSigningChallenges(txRequest, requestType, userPaillierModulus, 0);
|
|
564
|
+
const step1SigningMaterial = await externalSignerKShareGenerator({
|
|
565
|
+
tssParams: {
|
|
566
|
+
...params,
|
|
567
|
+
txRequest: txRequestObj,
|
|
568
|
+
},
|
|
569
|
+
challenges: { enterpriseChallenge, bitgoChallenge },
|
|
570
|
+
requestType: requestType,
|
|
571
|
+
});
|
|
572
|
+
// signing stage one with K share send to bitgo and receives A share
|
|
573
|
+
const bitgoToUserAShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequestObj.txRequestId, requestType, types_1.SendShareType.KShare, step1SigningMaterial.kShare, step1SigningMaterial.encryptedSignerOffsetShare, step1SigningMaterial.vssProof, step1SigningMaterial.privateShareProof, step1SigningMaterial.publicShare, step1SigningMaterial.userPublicGpgKey)); // WP/HSM does not return the initial challenge
|
|
574
|
+
const step2Return = await externalSignerMuDeltaShareGenerator({
|
|
575
|
+
txRequest: txRequestObj,
|
|
576
|
+
aShareFromBitgo: bitgoToUserAShare,
|
|
577
|
+
bitgoChallenge: bitgoChallenge,
|
|
578
|
+
encryptedWShare: step1SigningMaterial.wShare,
|
|
579
|
+
});
|
|
580
|
+
// signing stage two with muShare and dShare send to bitgo and receives D share
|
|
581
|
+
const bitgoToUserDShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequestObj.txRequestId, requestType, types_1.SendShareType.MUShare, step2Return.muDShare));
|
|
582
|
+
const userSShare = await externalSignerSShareGenerator({
|
|
583
|
+
tssParams: {
|
|
584
|
+
...params,
|
|
585
|
+
txRequest: txRequestObj,
|
|
586
|
+
},
|
|
587
|
+
dShareFromBitgo: bitgoToUserDShare,
|
|
588
|
+
requestType: requestType,
|
|
589
|
+
encryptedOShare: step2Return.oShare,
|
|
590
|
+
});
|
|
591
|
+
// signing stage three with SShare send to bitgo and receives SShare
|
|
592
|
+
await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequestObj.txRequestId, requestType, types_1.SendShareType.SShare, userSShare);
|
|
593
|
+
return await tss_2.getTxRequest(this.bitgo, this.wallet.id(), txRequestObj.txRequestId);
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Gets signing key, txRequestResolved and txRequestId
|
|
597
|
+
* @param {string | TxRequest} params.txRequest - transaction request object or id
|
|
598
|
+
* @param {string} params.prv - decrypted private key
|
|
599
|
+
* @param { string} params.reqId - request id
|
|
600
|
+
* @returns {Promise<TxRequest>}
|
|
601
|
+
*/
|
|
602
|
+
async signRequestBase(params, requestType) {
|
|
603
|
+
var _a;
|
|
604
|
+
const pendingEcdsaTssInitialization = (_a = this.wallet.coinSpecific()) === null || _a === void 0 ? void 0 : _a.pendingEcdsaTssInitialization;
|
|
605
|
+
if (pendingEcdsaTssInitialization) {
|
|
606
|
+
throw new Error('Wallet is not ready for TSS ECDSA signing. Please contact your enterprise admin to finish the enterprise TSS initialization.');
|
|
607
|
+
}
|
|
608
|
+
const userSigningMaterial = JSON.parse(params.prv);
|
|
609
|
+
if (userSigningMaterial.pShare.i !== 1) {
|
|
610
|
+
throw new Error('Invalid user key');
|
|
611
|
+
}
|
|
612
|
+
if (!userSigningMaterial.backupNShare) {
|
|
613
|
+
throw new Error('Invalid user key - missing backupNShare');
|
|
614
|
+
}
|
|
615
|
+
const txRequest = typeof params.txRequest === 'string'
|
|
616
|
+
? await tss_2.getTxRequest(this.bitgo, this.wallet.id(), params.txRequest)
|
|
617
|
+
: params.txRequest;
|
|
618
|
+
let signablePayload = new buffer_1.Buffer('');
|
|
619
|
+
let derivationPath = '';
|
|
620
|
+
if (requestType === baseTypes_1.RequestType.tx) {
|
|
621
|
+
assert_1.default(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
622
|
+
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
623
|
+
signablePayload = buffer_1.Buffer.from(unsignedTx.signableHex, 'hex');
|
|
624
|
+
derivationPath = unsignedTx.derivationPath;
|
|
625
|
+
}
|
|
626
|
+
else if (requestType === baseTypes_1.RequestType.message) {
|
|
627
|
+
signablePayload = params.bufferToSign;
|
|
628
|
+
// TODO BG-67299 Message signing with derivation path
|
|
629
|
+
}
|
|
630
|
+
const paillierModulus = this.getOfflineSignerPaillierModulus({ prv: params.prv });
|
|
631
|
+
const challenges = await this.getEcdsaSigningChallenges(txRequest.txRequestId, requestType, paillierModulus.userPaillierModulus, 0);
|
|
632
|
+
const step1Return = await this.createTssEcdsaStep1SigningMaterial({
|
|
633
|
+
prv: params.prv,
|
|
634
|
+
challenges: challenges,
|
|
635
|
+
derivationPath: derivationPath,
|
|
636
|
+
});
|
|
637
|
+
// signing stage one with K share send to bitgo and receives A share
|
|
638
|
+
const bitgoToUserAShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequest.txRequestId, requestType, types_1.SendShareType.KShare, step1Return.kShare, step1Return.encryptedSignerOffsetShare, step1Return.vssProof, step1Return.privateShareProof, step1Return.publicShare, step1Return.userPublicGpgKey)); // WP/HSM does not return the initial challenge
|
|
639
|
+
const step2Return = await this.createTssEcdsaStep2SigningMaterial({
|
|
640
|
+
aShareFromBitgo: bitgoToUserAShare,
|
|
641
|
+
bitgoChallenge: challenges.bitgoChallenge,
|
|
642
|
+
wShare: step1Return.wShare,
|
|
643
|
+
});
|
|
512
644
|
// signing stage two with muShare and dShare send to bitgo and receives D share
|
|
513
|
-
const bitgoToUserDShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequest.txRequestId, requestType, types_1.SendShareType.MUShare,
|
|
514
|
-
const userSShare = await ecdsa_1.default.createUserSignatureShare(
|
|
645
|
+
const bitgoToUserDShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequest.txRequestId, requestType, types_1.SendShareType.MUShare, step2Return.muDShare));
|
|
646
|
+
const userSShare = await ecdsa_1.default.createUserSignatureShare(step2Return.oShare, bitgoToUserDShare, signablePayload, params.hash);
|
|
515
647
|
// signing stage three with SShare send to bitgo and receives SShare
|
|
516
648
|
await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequest.txRequestId, requestType, types_1.SendShareType.SShare, userSShare);
|
|
517
649
|
return await tss_2.getTxRequest(this.bitgo, this.wallet.id(), txRequest.txRequestId);
|
|
@@ -544,53 +676,53 @@ class EcdsaUtils extends baseTSSUtils_1.default {
|
|
|
544
676
|
* Only returns the challenges if they are verified by the user's enterprise admin's ecdh key
|
|
545
677
|
* @param {string} txRequestId - transaction request id
|
|
546
678
|
* @param {RequestType} requestType - (0 for tx, 1 for message)
|
|
679
|
+
* @param {string} walletPaillierModulus - paillier pubkey $n$
|
|
547
680
|
* @param {number} index - index of the requestType
|
|
548
681
|
*/
|
|
549
|
-
async getEcdsaSigningChallenges(txRequestId, requestType, index = 0) {
|
|
682
|
+
async getEcdsaSigningChallenges(txRequestId, requestType, walletPaillierModulus, index = 0) {
|
|
550
683
|
const enterpriseId = this.wallet.toJSON().enterprise;
|
|
551
684
|
if (!enterpriseId) {
|
|
552
685
|
throw new Error('Wallet must be an enterprise wallet.');
|
|
553
686
|
}
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
const result = await this.wallet.getChallengesForEcdsaSigning();
|
|
566
|
-
const enterpriseChallenge = result.enterpriseChallenge;
|
|
567
|
-
const bitgoChallenge = result.bitgoChallenge;
|
|
568
|
-
const challengeVerifierUserId = result.createdBy;
|
|
687
|
+
// create BitGo range proof and paillier proof challenge
|
|
688
|
+
const createBitgoChallengeResponse = await common_1.getTxRequestChallenge(this.bitgo, this.wallet.id(), txRequestId, index.toString(), requestType, walletPaillierModulus);
|
|
689
|
+
const bitgoToEnterprisePaillierChallenge = { p: createBitgoChallengeResponse.p };
|
|
690
|
+
const enterpriseToBitgoPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({
|
|
691
|
+
p: await sdk_lib_mpc_1.EcdsaPaillierProof.generateP(sdk_lib_mpc_1.hexToBigInt(createBitgoChallengeResponse.n)),
|
|
692
|
+
});
|
|
693
|
+
// TODO(BG-78764): once the paillier proofs are complete, reduce challenge creation to one API call
|
|
694
|
+
const walletChallenges = await this.wallet.getChallengesForEcdsaSigning();
|
|
695
|
+
const challengeVerifierUserId = walletChallenges.createdBy;
|
|
569
696
|
const adminSigningKeyResponse = await this.bitgo.getSigningKeyForUser(enterpriseId, challengeVerifierUserId);
|
|
570
697
|
const pubkeyOfAdminEcdhKeyHex = adminSigningKeyResponse.derivedPubkey;
|
|
571
|
-
// Verify enterprise's challenge is signed by the respective
|
|
698
|
+
// Verify enterprise's challenge is signed by the respective admins ecdh keychain
|
|
572
699
|
const enterpriseRawChallenge = {
|
|
573
|
-
ntilde: enterpriseChallenge.ntilde,
|
|
574
|
-
h1: enterpriseChallenge.h1,
|
|
575
|
-
h2: enterpriseChallenge.h2,
|
|
700
|
+
ntilde: walletChallenges.enterpriseChallenge.ntilde,
|
|
701
|
+
h1: walletChallenges.enterpriseChallenge.h1,
|
|
702
|
+
h2: walletChallenges.enterpriseChallenge.h2,
|
|
576
703
|
};
|
|
577
|
-
const adminSignatureOnEntChallenge = enterpriseChallenge.verifiers.adminSignature;
|
|
704
|
+
const adminSignatureOnEntChallenge = walletChallenges.enterpriseChallenge.verifiers.adminSignature;
|
|
578
705
|
if (!ecdh_1.verifyEcdhSignature(EcdsaUtils.getMessageToSignFromChallenge(enterpriseRawChallenge), adminSignatureOnEntChallenge, buffer_1.Buffer.from(pubkeyOfAdminEcdhKeyHex, 'hex'))) {
|
|
579
706
|
throw new Error(`Admin signature for enterprise challenge is not valid. Please contact your enterprise admin.`);
|
|
580
707
|
}
|
|
581
708
|
// Verify that the BitGo challenge's ZK proofs have been verified by the admin
|
|
582
|
-
const
|
|
583
|
-
ntilde: bitgoChallenge.ntilde,
|
|
584
|
-
h1: bitgoChallenge.h1,
|
|
585
|
-
h2: bitgoChallenge.h2,
|
|
709
|
+
const bitgoChallenge = {
|
|
710
|
+
ntilde: walletChallenges.bitgoChallenge.ntilde,
|
|
711
|
+
h1: walletChallenges.bitgoChallenge.h1,
|
|
712
|
+
h2: walletChallenges.bitgoChallenge.h2,
|
|
713
|
+
p: bitgoToEnterprisePaillierChallenge.p,
|
|
714
|
+
n: createBitgoChallengeResponse.n,
|
|
586
715
|
};
|
|
587
|
-
const adminVerificationSignatureForBitGoChallenge = bitgoChallenge.verifiers.adminSignature;
|
|
588
|
-
if (!ecdh_1.verifyEcdhSignature(EcdsaUtils.getMessageToSignFromChallenge(
|
|
716
|
+
const adminVerificationSignatureForBitGoChallenge = walletChallenges.bitgoChallenge.verifiers.adminSignature;
|
|
717
|
+
if (!ecdh_1.verifyEcdhSignature(EcdsaUtils.getMessageToSignFromChallenge(bitgoChallenge), adminVerificationSignatureForBitGoChallenge, buffer_1.Buffer.from(pubkeyOfAdminEcdhKeyHex, 'hex'))) {
|
|
589
718
|
throw new Error(`Admin signature for BitGo's challenge is not valid. Please contact your enterprise admin.`);
|
|
590
719
|
}
|
|
591
720
|
return {
|
|
592
|
-
enterpriseChallenge:
|
|
593
|
-
|
|
721
|
+
enterpriseChallenge: {
|
|
722
|
+
...enterpriseRawChallenge,
|
|
723
|
+
p: enterpriseToBitgoPaillierChallenge.p,
|
|
724
|
+
},
|
|
725
|
+
bitgoChallenge,
|
|
594
726
|
};
|
|
595
727
|
}
|
|
596
728
|
/**
|
|
@@ -792,7 +924,7 @@ class EcdsaUtils extends baseTSSUtils_1.default {
|
|
|
792
924
|
throw new Error('Incorrect password. Please try again.');
|
|
793
925
|
}
|
|
794
926
|
// Generate and sign enterprise challenge
|
|
795
|
-
const entChallengeWithProof = challenge !== null && challenge !== void 0 ? challenge : (await sdk_lib_mpc_1.EcdsaRangeProof.generateNtilde(
|
|
927
|
+
const entChallengeWithProof = challenge !== null && challenge !== void 0 ? challenge : (await sdk_lib_mpc_1.EcdsaRangeProof.generateNtilde(sdk_lib_mpc_1.minModulusBitLength));
|
|
796
928
|
const serializedEntChallengeWithProof = sdk_lib_mpc_1.EcdsaTypes.serializeNtildeWithProofs(entChallengeWithProof);
|
|
797
929
|
const signedEnterpriseChallenge = EcdsaUtils.signChallenge(serializedEntChallengeWithProof, xprv, userSigningKey.derivationPath);
|
|
798
930
|
await this.uploadChallengesToEnterprise(bitgo, entId, serializedEntChallengeWithProof, signedEnterpriseChallenge.toString('hex'), bitgoInstChallengeProofSignature.toString('hex'), bitgoNitroChallengeProofSignature.toString('hex'));
|
|
@@ -837,6 +969,17 @@ class EcdsaUtils extends baseTSSUtils_1.default {
|
|
|
837
969
|
.send(body)
|
|
838
970
|
.result();
|
|
839
971
|
}
|
|
972
|
+
/**
|
|
973
|
+
* util function that checks that a commonKeychain is valid and can ultimately resolve to a valid public key
|
|
974
|
+
* @param commonKeychain - a user uploaded commonKeychain string
|
|
975
|
+
* @throws if the commonKeychain is invalid length or invalid format
|
|
976
|
+
*/
|
|
977
|
+
static validateCommonKeychainPublicKey(commonKeychain) {
|
|
978
|
+
const pub = EcdsaUtils.getPublicKeyFromCommonKeychain(commonKeychain);
|
|
979
|
+
const secp256k1 = new elliptic_1.ec('secp256k1');
|
|
980
|
+
const key = secp256k1.keyFromPublic(pub, 'hex');
|
|
981
|
+
return key.getPublic().encode('hex', false).slice(2);
|
|
982
|
+
}
|
|
840
983
|
}
|
|
841
984
|
exports.EcdsaUtils = EcdsaUtils;
|
|
842
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQWdDO0FBRWhDLGlEQUFtQztBQUVuQyx5REFBc0U7QUFDdEUsbURBQTZDO0FBRTdDLHlEQUErRDtBQUUvRCwrREFBb0U7QUFFcEUsbUVBQTJDO0FBUzNDLDRDQVFzQjtBQUN0QixzQ0FBNEM7QUFDNUMsb0RBQTBGO0FBQzFGLHFEQUFnSDtBQUdoSCxvREFBc0g7QUFDdEgsd0NBQW1GO0FBQ25GLGdEQUE0RDtBQUM1RCxvREFBa0Q7QUFFbEQsTUFBTSxhQUFhLEdBQUcsZUFBWSxDQUFDLGFBQWEsQ0FBQztBQUVqRCxrQkFBa0I7QUFDbEIsTUFBYSxVQUFXLFNBQVEsc0JBQXNCO0lBSXBELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLE1BQWdCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSmpDLDZLQUE2SztRQUNySyxzQkFBaUIsR0FBNEIsU0FBUyxDQUFDO1FBSTdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUs7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sZ0NBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixnQ0FBZ0M7WUFDaEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJB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QUUsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFO2dCQUM3QixFQUFFLEVBQUUsc0JBQXNCLENBQUMsRUFBRTtnQkFDN0IsV0FBVyxFQUFFO29CQUNYLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsT0FBTztvQkFDbkQsT0FBTyxFQUFFLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxPQUFPO2lCQUNwRDtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLHFCQUFxQjtpQkFDdEM7YUFDRjtZQUNELHFCQUFxQixFQUFFO2dCQUNyQixTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLDBCQUEwQjtpQkFDM0M7YUFDRjtZQUNELGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLDRCQUE0QjtpQkFDN0M7YUFDRjtTQUNGLENBQUM7UUFDRixNQUFNLEtBQUs7YUFDUixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBdm5DRCxnQ0F1bkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IEtleSwgU2VyaWFsaXplZEtleVBhaXIgfSBmcm9tICdvcGVucGdwJztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5cbmltcG9ydCB7IEVjZHNhUmFuZ2VQcm9vZiwgRWNkc2FUeXBlcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5pbXBvcnQgeyBFQ0RTQSwgRWNkc2EgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYi9tcGMvdHNzJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgQXBpS2V5U2hhcmUsIENyZWF0ZUJhY2t1cE9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IEVDRFNBTWV0aG9kcywgeyBFQ0RTQU1ldGhvZFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCBiYXNlVFNTVXRpbHMgZnJvbSAnLi4vYmFzZVRTU1V0aWxzJztcbmltcG9ydCB7XG4gIEJpdEdvUHJvb2ZTaWduYXR1cmVzLFxuICBDcmVhdGVFY2RzYUJpdEdvS2V5Y2hhaW5QYXJhbXMsXG4gIENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMsXG4gIERlY3J5cHRhYmxlTlNoYXJlLFxuICBHZXRCaXRHb0NoYWxsZW5nZXNBcGksXG4gIEtleVNoYXJlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEJhY2t1cEdwZ0tleSxcbiAgQmFja3VwS2V5U2hhcmUsXG4gIEJpdGdvSGVsZEJhY2t1cEtleVNoYXJlLFxuICBSZXF1ZXN0VHlwZSxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHsgQVNoYXJlLCBEU2hhcmUsIEVuY3J5cHRlZE5TaGFyZSwgU2VuZFNoYXJlVHlwZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTaGFyZVByb29mLCBnZW5lcmF0ZUdQR0tleVBhaXIsIGdldEJpdGdvR3BnUHViS2V5LCBnZXRUcnVzdEdwZ1B1YktleSB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgQmFja3VwUHJvdmlkZXIsIElXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQnO1xuaW1wb3J0IHsgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUsIGdldFBhcnRpY2lwYW50RnJvbUluZGV4LCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvZWNkc2EnO1xuaW1wb3J0IHsgc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXksIHZlcmlmeUVjZGhTaWduYXR1cmUgfSBmcm9tICcuLi8uLi8uLi9lY2RoJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdENoYWxsZW5nZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgRW50ZXJwcmlzZXMgfSBmcm9tICcuLi8uLi8uLi9lbnRlcnByaXNlJztcblxuY29uc3QgZW5jcnlwdE5TaGFyZSA9IEVDRFNBTWV0aG9kcy5lbmNyeXB0TlNoYXJlO1xuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBjbGFzcyBFY2RzYVV0aWxzIGV4dGVuZHMgYmFzZVRTU1V0aWxzPEtleVNoYXJlPiB7XG4gIC8vIFdlIGRvIG5vdCBoYXZlIGZ1bGwgc3VwcG9ydCBmb3IgMy1wYXJ0eSB2ZXJpZmljYXRpb24gKHcvIGV4dGVybmFsIHNvdXJjZSkgb2Yga2V5IHNoYXJlcyBhbmQgc2lnbmF0dXJlIHNoYXJlcy4gVGhlcmUgaXMgbm8gM3JkIHBhcnR5IGtleSBzZXJ2aWNlIHN1cHBvcnQgd2l0aCB0aGlzIHJlbGVhc2UuXG4gIHByaXZhdGUgYml0Z29QdWJsaWNHcGdLZXk6IG9wZW5wZ3AuS2V5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldD86IElXYWxsZXQpIHtcbiAgICBzdXBlcihiaXRnbywgYmFzZUNvaW4sIHdhbGxldCk7XG4gICAgdGhpcy5zZXRCaXRnb0dwZ1B1YktleShiaXRnbyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldEJpdGdvR3BnUHViS2V5KGJpdGdvKSB7XG4gICAgdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KGJpdGdvKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpdGdvUHVibGljR3BnS2V5KCk6IFByb21pc2U8b3BlbnBncC5LZXk+IHtcbiAgICBpZiAoIXRoaXMuYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgIC8vIHJldHJ5IGdldHRpbmcgYml0Z28ncyBncGcga2V5XG4gICAgICBhd2FpdCB0aGlzLnNldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pO1xuICAgICAgaWYgKCF0aGlzLmJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBnZXQgQml0Z28ncyBncGcga2V5XCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvUHVibGljR3BnS2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbW1vbiBwdWJsaWMga2V5IGZyb20gY29tbW9uS2V5Y2hhaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb21tb25LZXljaGFpbiBjb21tb24ga2V5IGNoYWluIGJldHdlZW4gbiBwYXJ0aWVzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGVuY29kZWQgcHVibGljIGtleVxuICAgKi9cbiAgc3RhdGljIGdldFB1YmxpY0tleUZyb21Db21tb25LZXljaGFpbihjb21tb25LZXljaGFpbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoY29tbW9uS2V5Y2hhaW4ubGVuZ3RoICE9PSAxMzApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21tb25LZXljaGFpbiBsZW5ndGgsIGV4cGVjdGVkIDEzMCwgZ290ICR7Y29tbW9uS2V5Y2hhaW4ubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBjb21tb25QdWJIZXhTdHIgPSBjb21tb25LZXljaGFpbi5zbGljZSgwLCA2Nik7XG4gICAgcmV0dXJuIGNvbW1vblB1YkhleFN0cjtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5OiBLZXlcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIDIsXG4gICAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICB1c2VyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwS2V5U2hhcmUgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcz8uZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGNvbnN0IHVzZXJQdWJsaWNTaGFyZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0ueSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0uY2hhaW5jb2RlLCAnaGV4JyksXG4gICAgXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwS2V5U2hhcmUpO1xuICAgIGNvbnN0IGtleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJhc2VDb2luLnVybChgL2tycy9iYWNrdXBrZXlzLyR7a2V5SWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgICB0bzogJ2JhY2t1cCcsXG4gICAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgICAgICB2c3NQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaXRnb1RvQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGlmICgha2V5UmVzcG9uc2UgfHwgIWtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCBiYWNrdXAga2V5IHZlcmlmaWNhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBrZXlSZXNwb25zZS5pZCxcbiAgICAgIGtleVNoYXJlczoga2V5UmVzcG9uc2Uua2V5U2hhcmVzLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBiYWNrdXBQcm92aWRlcj86IEJhY2t1cFByb3ZpZGVyO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBhd2FpdCBNUEMua2V5U2hhcmUoMSwgbSwgbik7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgaXNUaGlyZFBhcnR5QmFja3VwID0gdGhpcy5pc1ZhbGlkVGhpcmRQYXJ0eUJhY2t1cFByb3ZpZGVyKHBhcmFtcy5iYWNrdXBQcm92aWRlcik7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEtleVNoYXJlcyhpc1RoaXJkUGFydHlCYWNrdXAsIHVzZXJHcGdLZXksIHBhcmFtcy5lbnRlcnByaXNlKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEdwZ1B1YktleShpc1RoaXJkUGFydHlCYWNrdXApO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBwdWJsaWMga2V5IGJhc2VkIG9uIHVzZXIvZW50ZXJwcmlzZSBmZWF0dXJlIGZsYWdzXG4gICAgLy8gSWYgaXQgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgcHVibGljIGtleSBmcm9tIHRoZSBjb25zdGFudHNcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9XG4gICAgICAoYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UpKSA/PyB0aGlzLmJpdGdvUHVibGljR3BnS2V5O1xuXG4gICAgY29uc3QgYml0Z29LZXljaGFpbiA9IGF3YWl0IHRoaXMuY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgaXNUaGlyZFBhcnR5QmFja3VwLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZVVzZXJLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgYmFja3VwUHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBQcm92aWRlcixcbiAgICB9KTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW5Qcm9taXNlLCBiYWNrdXBLZXljaGFpblByb21pc2VdKTtcblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIHRoaXJkIHBhcnR5IGJhY2t1cCBpcyByZXF1ZXN0ZWQsIGl0IHdpbGwgY3JlYXRlIGJhY2t1cCBzaGFyZXMgZnJvbVxuICAgKiBhIHRoaXJkIHBhcnR5IChCaXRHbyBhcyBvZiBub3cpLCBvdGhlcndpc2UgdGhlIGtleSBzaGFyZXMgd2lsbCBiZSBjbGllbnQgZ2VuZXJhdGVkXG4gICAqL1xuICBhc3luYyBjcmVhdGVCYWNrdXBLZXlTaGFyZXMoXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2UsXG4gICAgdXNlckdwZ1B1YktleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGxldCBiYWNrdXBLZXlTaGFyZTogQmFja3VwS2V5U2hhcmU7XG4gICAgaWYgKGlzVGhpcmRQYXJ0eUJhY2t1cCkge1xuICAgICAgY29uc3QgYml0Z29IZWxkQmFja3VwS2V5U2hhcmVzID0gYXdhaXQgdGhpcy5jcmVhdGVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSh1c2VyR3BnUHViS2V5LCBlbnRlcnByaXNlKTtcbiAgICAgIGJhY2t1cEtleVNoYXJlID0ge1xuICAgICAgICBiaXRHb0hlbGRLZXlTaGFyZXM6IGJpdGdvSGVsZEJhY2t1cEtleVNoYXJlcyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgICAgY29uc3QgbSA9IDI7XG4gICAgICBjb25zdCBuID0gMztcbiAgICAgIGJhY2t1cEtleVNoYXJlID0ge1xuICAgICAgICB1c2VySGVsZEtleVNoYXJlOiBhd2FpdCBNUEMua2V5U2hhcmUoMiwgbSwgbiksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYmFja3VwS2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBiYWNrdXAgcHViIGdwZyBrZXkgc3RyaW5nXG4gICAqIGlmIGEgdGhpcmQgcGFydHkgcHJvdmlkZWQgdGhlbiBnZXQgZnJvbSB0cnVzdFxuICAgKiBAcGFyYW0gaXNUaGlyZFBhcnR5QmFja3VwXG4gICAqL1xuICBhc3luYyBnZXRCYWNrdXBHcGdQdWJLZXkoaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2UpOiBQcm9taXNlPEJhY2t1cEdwZ0tleT4ge1xuICAgIHJldHVybiBpc1RoaXJkUGFydHlCYWNrdXAgPyBnZXRUcnVzdEdwZ1B1YktleSh0aGlzLmJpdGdvKSA6IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gIH1cblxuICBjcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIHBhc3NwaHJhc2UsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlLFxuICB9OiBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGlmICghcGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuICAgIGlmIChpc1RoaXJkUGFydHlCYWNrdXAgJiYgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzPy5rZXlTaGFyZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVzZXJLZXljaGFpbkZyb21UaGlyZFBhcnR5QmFja3VwKFxuICAgICAgICB1c2VyR3BnS2V5LFxuICAgICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgICAgYmFja3VwR3BnS2V5IGFzIEtleSxcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMua2V5U2hhcmVzLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICAgICk7XG4gICAgfVxuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAxLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICBwYXNzcGhyYXNlLFxuICAgIGJhY2t1cFByb3ZpZGVyLFxuICB9OiBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGlmICh0aGlzLmlzVmFsaWRUaGlyZFBhcnR5QmFja3VwUHJvdmlkZXIoYmFja3VwUHJvdmlkZXIpICYmIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcz8ua2V5U2hhcmVzKSB7XG4gICAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgICBjb25zdCBmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZSA9IGF3YWl0IHRoaXMuZmluYWxpemVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZShcbiAgICAgICAgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzLmlkLFxuICAgICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHVzZXJHcGdLZXksXG4gICAgICAgIGJhY2t1cEdwZ0tleSBhcyBLZXlcbiAgICAgICk7XG4gICAgICBpZiAoZmluYWxpemVkQmFja3VwS2V5U2hhcmUuY29tbW9uS2V5Y2hhaW4gIT09IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGJhY2t1cCBrZXljaGFpbiAtIGNvbW1vbktleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cEtleVBhcmFtczogQ3JlYXRlQmFja3VwT3B0aW9ucyA9IHtcbiAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiBmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZS5jb21tb25LZXljaGFpbixcbiAgICAgICAgcHJvdmlkZXI6IGJhY2t1cFByb3ZpZGVyID8/ICdCaXRHb1RydXN0QXNLcnMnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoYmFja3VwS2V5UGFyYW1zKTtcbiAgICAgIGJhY2t1cEtleWNoYWluLmtleVNoYXJlcyA9IGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmtleVNoYXJlcztcbiAgICAgIHJldHVybiBiYWNrdXBLZXljaGFpbjtcbiAgICB9XG4gICAgYXNzZXJ0KGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIGFzc2VydChwYXNzcGhyYXNlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAyLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVCaXRnb0tleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICBpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZSxcbiAgfTogQ3JlYXRlRWNkc2FCaXRHb0tleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IHJlY2lwaWVudEluZGV4ID0gMztcbiAgICBjb25zdCB1c2VyVG9CaXRnb1NoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZSh1c2VyS2V5U2hhcmUsIHJlY2lwaWVudEluZGV4LCBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLCB1c2VyR3BnS2V5KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29TaGFyZSA9IGF3YWl0IHRoaXMuZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgICk7XG5cbiAgICBjb25zdCBjcmVhdGVCaXRHb01QQ1BhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVNoYXJlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogdXNlclRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogdXNlclRvQml0Z29TaGFyZS5uLFxuICAgICAgICAgIHZzc1Byb29mOiB1c2VyVG9CaXRnb1NoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiB1c2VyVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYmFja3VwVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgICAgdnNzUHJvb2Y6IGJhY2t1cFRvQml0Z29TaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogYmFja3VwVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgYmFja3VwR1BHUHVibGljS2V5OiBpc1RoaXJkUGFydHlCYWNrdXBcbiAgICAgICAgPyAoYmFja3VwR3BnS2V5IGFzIEtleSkuYXJtb3IoKVxuICAgICAgICA6IChiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPikucHVibGljS2V5LFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZSxcbiAgICAgIGFsZ29Vc2VkOiAnZWNkc2EnLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoY3JlYXRlQml0R29NUENQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgYnVpbGRzIHRoZSByZWxldmFudCBiYWNrdXAgZW5jcnlwdGVkTlNoYXJlIGJhc2VkIG9uIHdoZXRoZXIgdGhlXG4gICAqIGJhY2t1cCBrZXkgaXMgdXNlciBvciB0aGlyZCBwYXJ0eSBnZW5lcmF0ZWRcbiAgICogQHBhcmFtIGJhY2t1cFNoYXJlIGNhbiBlaXRoZXIgaGF2ZSBrZXkgc2hhcmVzIGZyb20gdGhlIHVzZXIgb3IgdGhpcmQgcGFydHlcbiAgICogQHBhcmFtIHJlY2lwaWVudEluZGV4IGluZGV4IG9mIHRoZSBwYXJ0eSByZWNlaXZpbmcgdGhlIGJhY2t1cCBzaGFyZXNcbiAgICogQHBhcmFtIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yIGdwZyBhcm1vciBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSBiYWNrdXBHcGdLZXkgYmFja3VwIGdwZyBrZXlcbiAgICogQHBhcmFtIGlzVGhpcmRQYXJ0eUJhY2t1cCB3aGV0aGVyIHRoZSBiYWNrdXAgaXMgZ2VuZXJhdGVkIGJ5IHRoaXJkIHBhcnR5XG4gICAqL1xuICBhc3luYyBnZXRCYWNrdXBFbmNyeXB0ZWROU2hhcmUoXG4gICAgYmFja3VwU2hhcmU6IEJhY2t1cEtleVNoYXJlLFxuICAgIHJlY2lwaWVudEluZGV4OiBudW1iZXIsXG4gICAgcmVjaXBpZW50R3BnUHVibGljQXJtb3I6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2VcbiAgKTogUHJvbWlzZTxFbmNyeXB0ZWROU2hhcmU+IHtcbiAgICBsZXQgYmFja3VwVG9SZWNpcGllbnRTaGFyZTogRW5jcnlwdGVkTlNoYXJlO1xuICAgIGlmIChpc1RoaXJkUGFydHlCYWNrdXApIHtcbiAgICAgIGlmICghYmFja3VwU2hhcmUuYml0R29IZWxkS2V5U2hhcmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0aGlyZCBwYXJ0eSBiYWNrdXAga2V5IHNoYXJlc2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwVG9SZWNpcGllbnRBcGlTaGFyZSA9IGJhY2t1cFNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcy5rZXlTaGFyZXMuZmluZChcbiAgICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYmFja3VwJyAmJiBrZXlTaGFyZS50byA9PT0gZ2V0UGFydGljaXBhbnRGcm9tSW5kZXgocmVjaXBpZW50SW5kZXgpXG4gICAgICApO1xuICAgICAgaWYgKCFiYWNrdXBUb1JlY2lwaWVudEFwaVNoYXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBiYWNrdXAgdG8gJHtnZXRQYXJ0aWNpcGFudEZyb21JbmRleChyZWNpcGllbnRJbmRleCl9IGtleSBzaGFyZWApO1xuICAgICAgfVxuICAgICAgLy8gU2luY2UgYmFja3VwIGlzIGZyb20gYSB0aGlyZCBwYXJ0eSwgaXQgaXMgYWxyZWFkeSBlbmNyeXB0ZWRcbiAgICAgIGJhY2t1cFRvUmVjaXBpZW50U2hhcmUgPSBhd2FpdCBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZShiYWNrdXBUb1JlY2lwaWVudEFwaVNoYXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGJhY2t1cFNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgICAgYmFja3VwVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICAgIGJhY2t1cFNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICAgIHJlY2lwaWVudEluZGV4LFxuICAgICAgICByZWNpcGllbnRHcGdQdWJsaWNBcm1vcixcbiAgICAgICAgYmFja3VwR3BnS2V5XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYmFja3VwVG9SZWNpcGllbnRTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHVzZXMgdGhlIGJhY2t1cCBrZXkgZnJvbSBhIHRoaXJkIHBhcnR5IChiaXRnbyBpbiB0aGlzIGNhc2UpXG4gICAqIHRvIGNyZWF0ZSB0aGUgdXNlciBrZXljaGFpbiB2aWEgV1AuXG4gICAqL1xuICBhc3luYyBjcmVhdGVVc2VyS2V5Y2hhaW5Gcm9tVGhpcmRQYXJ0eUJhY2t1cChcbiAgICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IEtleSxcbiAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5OiBLZXksXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICB0aGlyZFBhcnR5YmFja3VwS2V5U2hhcmVzOiBBcGlLZXlTaGFyZVtdLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGJpdGdvS2V5U2hhcmVzID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM7XG4gICAgaWYgKCFiaXRnb0tleVNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIGtleSBzaGFyZXMnKTtcbiAgICB9XG4gICAgaWYgKCFiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY29tbW9uIGtleSBjaGFpbjogJHtiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWlufWApO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9Vc2VyU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ3VzZXInKTtcbiAgICBpZiAoIWJpdEdvVG9Vc2VyU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyB0byBVc2VyIGtleSBzaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlclNoYXJlID0gdGhpcmRQYXJ0eWJhY2t1cEtleVNoYXJlcy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYmFja3VwJyAmJiBrZXlTaGFyZS50byA9PT0gJ3VzZXInXG4gICAgKTtcbiAgICBpZiAoIWJhY2t1cFRvVXNlclNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQmFja3VwIHRvIFVzZXIga2V5IHNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTlNoYXJlID0gYXdhaXQgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUoYmFja3VwVG9Vc2VyU2hhcmUpO1xuICAgIGNvbnN0IGJpdEdvVG9Vc2VyTlNoYXJlID0gYXdhaXQgYnVpbGROU2hhcmVGcm9tQVBJS2V5U2hhcmUoYml0R29Ub1VzZXJTaGFyZSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTlNoYXJlczogRGVjcnlwdGFibGVOU2hhcmVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgblNoYXJlOiBiYWNrdXBUb1VzZXJOU2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogdGhpcmRQYXJ0eUJhY2t1cFB1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgICBpc2JzNThFbmNvZGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5TaGFyZTogYml0R29Ub1VzZXJOU2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB1c2VyQ29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBlbmNyeXB0ZWROU2hhcmVzLFxuICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpblxuICAgICk7XG4gICAgaWYgKHVzZXJDb21iaW5lZEtleS5jb21tb25LZXljaGFpbiAhPT0gYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHVzZXIga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHVzZXJDb21iaW5lZEtleS5zaWduaW5nTWF0ZXJpYWwpO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiB1c2VyQ29tYmluZWRLZXkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcnY6IHBydixcbiAgICAgIGVuY3J5cHRlZFBydjogdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IHBydixcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICB9KSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICByZXR1cm4gYXdhaXQga2V5Y2hhaW5zLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIHVzZXJMb2NhbEJhY2t1cEdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGJpdGdvUHVibGljR3BnS2V5OiBLZXksXG4gICAgcmVjaXBpZW50SW5kZXg6IG51bWJlcixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBrZXkgc2hhcmVzJyk7XG4gICAgfVxuICAgIGlmICghYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNvbW1vbiBrZXkgY2hhaW46ICR7Yml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbn1gKTtcbiAgICB9XG5cbiAgICBsZXQgcmVjaXBpZW50OiBzdHJpbmc7XG4gICAgbGV0IGtleVNoYXJlOiBLZXlTaGFyZTtcbiAgICBsZXQgb3RoZXJTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IHJlY2lwaWVudEdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+O1xuICAgIGxldCBzZW5kZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBpZiAocmVjaXBpZW50SW5kZXggPT09IDEpIHtcbiAgICAgIGtleVNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgcmVjaXBpZW50ID0gJ3VzZXInO1xuICAgICAgcmVjaXBpZW50R3BnS2V5ID0gdXNlckdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICB9IGVsc2UgaWYgKHJlY2lwaWVudEluZGV4ID09PSAyKSB7XG4gICAgICBrZXlTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICdiYWNrdXAnO1xuICAgICAgcmVjaXBpZW50R3BnS2V5ID0gdXNlckxvY2FsQmFja3VwR3BnS2V5O1xuICAgICAgc2VuZGVyR3BnS2V5ID0gdXNlckdwZ0tleTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvUmVjaXBpZW50U2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSByZWNpcGllbnRcbiAgICApO1xuICAgIGlmICghYml0R29Ub1JlY2lwaWVudFNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgQml0R28gdG8gJHtyZWNpcGllbnR9IGtleSBzaGFyZWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRlZFNoYXJlID0gYXdhaXQgdGhpcy5kZWNyeXB0UHJpdmF0ZVNoYXJlKGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsIHJlY2lwaWVudEdwZ0tleSk7XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVzZXJMb2NhbEJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleFxuICAgICk7XG5cbiAgICBjb25zdCBzZW5kZXJUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIG90aGVyU2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIHJlY2lwaWVudEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBzZW5kZXJHcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIC8vIHVzZXJUb0JhY2t1cCBvciBiYWNrdXBUb1VzZXJcbiAgICAgICAgblNoYXJlOiBzZW5kZXJUb1JlY2lwaWVudFNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHJlY2lwaWVudEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogc2VuZGVyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGJpdGdvVG9SZWNpcGllbnRcbiAgICAgICAgblNoYXJlOiB7XG4gICAgICAgICAgaTogcmVjaXBpZW50SW5kZXgsXG4gICAgICAgICAgajogMyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIGVuY3J5cHRlZFByaXZhdGVTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUubiEsXG4gICAgICAgICAgdnNzUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgICB9LFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHJlY2lwaWVudEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCByZWNpcGllbnRDb21iaW5lZEtleSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVDb21iaW5lZEtleShcbiAgICAgIGtleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuXG4gICAgY29uc3QgcHJ2ID0gSlNPTi5zdHJpbmdpZnkocmVjaXBpZW50Q29tYmluZWRLZXkuc2lnbmluZ01hdGVyaWFsKTtcbiAgICBjb25zdCByZWNpcGllbnRLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgIHNvdXJjZTogcmVjaXBpZW50LFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHJlY2lwaWVudEluZGV4ID09PSAxXG4gICAgICA/IGF3YWl0IGtleWNoYWlucy5hZGQocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpXG4gICAgICA6IGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgc2lnbmluZyBrZXksIHR4UmVxdWVzdFJlc29sdmVkIGFuZCB0eFJlcXVlc3RJZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7IHN0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UocGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLCByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uID0gdGhpcy53YWxsZXQuY29pblNwZWNpZmljKCk/LnBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uO1xuICAgIGlmIChwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2FsbGV0IGlzIG5vdCByZWFkeSBmb3IgVFNTIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbiB0byBmaW5pc2ggdGhlIGVudGVycHJpc2UgVFNTIGluaXRpYWxpemF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBhcmFtcy5wcnYpO1xuICAgIGlmICh1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZS5pICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXknKTtcbiAgICB9XG4gICAgaWYgKCF1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5IC0gbWlzc2luZyBiYWNrdXBOU2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9XG4gICAgICB0eXBlb2YgcGFyYW1zLnR4UmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgcGFyYW1zLnR4UmVxdWVzdClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGg7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcyBhcyBUU1NQYXJhbXNGb3JNZXNzYWdlKS5idWZmZXJUb1NpZ247XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgICAgZGVyaXZhdGlvblBhdGggPSAnJztcbiAgICB9XG5cbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBzaWduaW5nS2V5ID0gTVBDLmtleURlcml2ZShcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLFxuICAgICAgW3VzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlXSxcbiAgICAgIGRlcml2YXRpb25QYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvSW5kZXggPSAzO1xuICAgIGNvbnN0IHVzZXJJbmRleCA9IDE7XG4gICAgY29uc3QgeVNoYXJlID0ge1xuICAgICAgaTogdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSxcbiAgICAgIGo6IGJpdGdvSW5kZXgsXG4gICAgICBuOiBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0ubixcbiAgICB9O1xuXG4gICAgY29uc3QgY2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMuZ2V0RWNkc2FTaWduaW5nQ2hhbGxlbmdlcyh0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCAwKTtcbiAgICBjb25zdCBzaWduaW5nS2V5V2l0aENoYWxsZW5nZSA9IGF3YWl0IE1QQy5hcHBlbmRDaGFsbGVuZ2UoXG4gICAgICBzaWduaW5nS2V5LnhTaGFyZSxcbiAgICAgIHlTaGFyZSxcbiAgICAgIGNoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduU2hhcmUoc2lnbmluZ0tleVdpdGhDaGFsbGVuZ2UueFNoYXJlLCB7XG4gICAgICBpOiB1c2VySW5kZXgsXG4gICAgICBqOiBiaXRnb0luZGV4LFxuICAgICAgbjogdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZS5uLFxuICAgICAgbnRpbGRlOiBjaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLm50aWxkZSxcbiAgICAgIGgxOiBjaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IGNoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UuaDIsXG4gICAgfSk7XG4gICAgY29uc3QgdSA9IHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS51O1xuXG4gICAgbGV0IGNoYWluY29kZSA9IHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUuY2hhaW5jb2RlO1xuICAgIHdoaWxlIChjaGFpbmNvZGUubGVuZ3RoIDwgNjQpIHtcbiAgICAgIGNoYWluY29kZSA9ICcwJyArIGNoYWluY29kZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVyU2hhcmUgPSBiaXAzMi5mcm9tUHJpdmF0ZUtleShCdWZmZXIuZnJvbSh1LCAnaGV4JyksIEJ1ZmZlci5mcm9tKGNoYWluY29kZSwgJ2hleCcpKS50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgY29uc3QgZW5jcnlwdGVkU2lnbmVyU2hhcmUgPSAoYXdhaXQgb3BlbnBncC5lbmNyeXB0KHtcbiAgICAgIG1lc3NhZ2U6IGF3YWl0IG9wZW5wZ3AuY3JlYXRlTWVzc2FnZSh7XG4gICAgICAgIHRleHQ6IHNpZ25lclNoYXJlLFxuICAgICAgfSksXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVqZWN0Q3VydmVzOiBuZXcgU2V0KCksXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbktleXM6IFtiaXRnb0dwZ0tleV0sXG4gICAgfSkpIGFzIHN0cmluZztcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBwcml2YXRlU2hhcmVQcm9vZiA9IGF3YWl0IGNyZWF0ZVNoYXJlUHJvb2YodXNlckdwZ0tleS5wcml2YXRlS2V5LCBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0udSwgJ2VjZHNhJyk7XG4gICAgY29uc3QgdnNzUHJvb2YgPSBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0udjtcbiAgICBjb25zdCB1c2VyUHVibGljR3BnS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG4gICAgY29uc3QgcHVibGljU2hhcmUgPSBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0ueSArIHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS5jaGFpbmNvZGU7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIG9uZSB3aXRoIEsgc2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgQSBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgdXNlclNpZ25TaGFyZS5rU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJTaGFyZSxcbiAgICAgIHZzc1Byb29mLFxuICAgICAgcHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICBwdWJsaWNTaGFyZSxcbiAgICAgIHVzZXJQdWJsaWNHcGdLZXlcbiAgICApKSBhcyBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47IC8vIFdQL0hTTSBkb2VzIG5vdCByZXR1cm4gdGhlIGluaXRpYWwgY2hhbGxlbmdlXG5cbiAgICAvLyBBcHBlbmQgdGhlIEJpdEdvIGNoYWxsZW5nZSB0byB0aGUgQXNoYXJlIHRvIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBwcm9vZnNcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZVdpdGhOdGlsZGU6IEFTaGFyZSA9IHtcbiAgICAgIC4uLmJpdGdvVG9Vc2VyQVNoYXJlLFxuICAgICAgLi4uY2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdXNlckdhbW1hQW5kTXVTaGFyZXMgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlckdhbW1hQW5kTXVTaGFyZShcbiAgICAgIHVzZXJTaWduU2hhcmUud1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJBU2hhcmVXaXRoTnRpbGRlXG4gICAgKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG4gICAgY29uc3QgbXVTaGFyZSA9IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUhO1xuICAgIGNvbnN0IGRTaGFyZSA9IHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5kU2hhcmU7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHR3byB3aXRoIG11U2hhcmUgYW5kIGRTaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBEIHNoYXJlXG4gICAgY29uc3QgYml0Z29Ub1VzZXJEU2hhcmUgPSAoYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5NVVNoYXJlLFxuICAgICAgeyBtdVNoYXJlLCBkU2hhcmUsIGk6IG11U2hhcmUuaSB9XG4gICAgKSkgYXMgRFNoYXJlO1xuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUub1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBwYXJhbXMuaGFzaFxuICAgICk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHRocmVlIHdpdGggU1NoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIFNTaGFyZVxuICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuU1NoYXJlLFxuICAgICAgdXNlclNTaGFyZVxuICAgICk7XG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlUmF3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhdyBtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgZm9yIGVudGVycHJpc2UgYW5kIEJpdEdvIGluIEVDRFNBIHNpZ25pbmdcbiAgICogT25seSByZXR1cm5zIHRoZSBjaGFsbGVuZ2VzIGlmIHRoZXkgYXJlIHZlcmlmaWVkIGJ5IHRoZSB1c2VyJ3MgZW50ZXJwcmlzZSBhZG1pbidzIGVjZGgga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRyYW5zYWN0aW9uIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtSZXF1ZXN0VHlwZX0gcmVxdWVzdFR5cGUgLSAgKDAgZm9yIHR4LCAxIGZvciBtZXNzYWdlKVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgcmVxdWVzdFR5cGVcbiAgICovXG4gIGFzeW5jIGdldEVjZHNhU2lnbmluZ0NoYWxsZW5nZXMoXG4gICAgdHhSZXF1ZXN0SWQ6IHN0cmluZyxcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUsXG4gICAgaW5kZXggPSAwXG4gICk6IFByb21pc2U8e1xuICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZTtcbiAgICBiaXRnb0NoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlO1xuICB9PiB7XG4gICAgY29uc3QgZW50ZXJwcmlzZUlkID0gdGhpcy53YWxsZXQudG9KU09OKCkuZW50ZXJwcmlzZTtcbiAgICBpZiAoIWVudGVycHJpc2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgbXVzdCBiZSBhbiBlbnRlcnByaXNlIHdhbGxldC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXNlRW50ZXJwcmlzZUNoYWxsZW5nZSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnRlcnByaXNlID0gYXdhaXQgbmV3IEVudGVycHJpc2VzKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmdldCh7IGlkOiBlbnRlcnByaXNlSWQgfSk7XG4gICAgICByZXR1cm4gZW50ZXJwcmlzZS5oYXNGZWF0dXJlRmxhZ3MoWyd1c2VFbnRlcnByaXNlRWNkc2FUc3NDaGFsbGVuZ2UnXSk7XG4gICAgfSkoKTtcblxuICAgIGlmICghc2hvdWxkVXNlRW50ZXJwcmlzZUNoYWxsZW5nZSkge1xuICAgICAgY29uc3QgZW50Q2hhbGxlbmdlID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLmdlbmVyYXRlTnRpbGRlKDMwNzIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZTogRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUoZW50Q2hhbGxlbmdlKSxcbiAgICAgICAgYml0Z29DaGFsbGVuZ2U6IGF3YWl0IGdldFR4UmVxdWVzdENoYWxsZW5nZShcbiAgICAgICAgICB0aGlzLmJpdGdvLFxuICAgICAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgICAgaW5kZXgudG9TdHJpbmcoKSxcbiAgICAgICAgICByZXF1ZXN0VHlwZSxcbiAgICAgICAgICAnZWNkc2EnXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMud2FsbGV0LmdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTtcbiAgICBjb25zdCBlbnRlcnByaXNlQ2hhbGxlbmdlID0gcmVzdWx0LmVudGVycHJpc2VDaGFsbGVuZ2U7XG4gICAgY29uc3QgYml0Z29DaGFsbGVuZ2UgPSByZXN1bHQuYml0Z29DaGFsbGVuZ2U7XG5cbiAgICBjb25zdCBjaGFsbGVuZ2VWZXJpZmllclVzZXJJZCA9IHJlc3VsdC5jcmVhdGVkQnk7XG4gICAgY29uc3QgYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCwgY2hhbGxlbmdlVmVyaWZpZXJVc2VySWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UuZGVyaXZlZFB1YmtleTtcblxuICAgIC8vIFZlcmlmeSBlbnRlcnByaXNlJ3MgY2hhbGxlbmdlIGlzIHNpZ25lZCBieSB0aGUgcmVzcGVjdGl2ZSBhZG1pbidzIGVjZGgga2V5Y2hhaW5cbiAgICBjb25zdCBlbnRlcnByaXNlUmF3Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiBlbnRlcnByaXNlQ2hhbGxlbmdlLm50aWxkZSxcbiAgICAgIGgxOiBlbnRlcnByaXNlQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IGVudGVycHJpc2VDaGFsbGVuZ2UuaDIsXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblNpZ25hdHVyZU9uRW50Q2hhbGxlbmdlOiBzdHJpbmcgPSBlbnRlcnByaXNlQ2hhbGxlbmdlLnZlcmlmaWVycy5hZG1pblNpZ25hdHVyZTtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZ5RWNkaFNpZ25hdHVyZShcbiAgICAgICAgRWNkc2FVdGlscy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShlbnRlcnByaXNlUmF3Q2hhbGxlbmdlKSxcbiAgICAgICAgYWRtaW5TaWduYXR1cmVPbkVudENoYWxsZW5nZSxcbiAgICAgICAgQnVmZmVyLmZyb20ocHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsICdoZXgnKVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZG1pbiBzaWduYXR1cmUgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlIGlzIG5vdCB2YWxpZC4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluLmApO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBCaXRHbyBjaGFsbGVuZ2UncyBaSyBwcm9vZnMgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IHRoZSBhZG1pblxuICAgIGNvbnN0IGJpdEdvUmF3Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2UuaDEsXG4gICAgICBoMjogYml0Z29DaGFsbGVuZ2UuaDIsXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblZlcmlmaWNhdGlvblNpZ25hdHVyZUZvckJpdEdvQ2hhbGxlbmdlID0gYml0Z29DaGFsbGVuZ2UudmVyaWZpZXJzLmFkbWluU2lnbmF0dXJlO1xuICAgIGlmIChcbiAgICAgICF2ZXJpZnlFY2RoU2lnbmF0dXJlKFxuICAgICAgICBFY2RzYVV0aWxzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGJpdEdvUmF3Q2hhbGxlbmdlKSxcbiAgICAgICAgYWRtaW5WZXJpZmljYXRpb25TaWduYXR1cmVGb3JCaXRHb0NoYWxsZW5nZSxcbiAgICAgICAgQnVmZmVyLmZyb20ocHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsICdoZXgnKVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZG1pbiBzaWduYXR1cmUgZm9yIEJpdEdvJ3MgY2hhbGxlbmdlIGlzIG5vdCB2YWxpZC4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluLmApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbnRlcnByaXNlQ2hhbGxlbmdlOiBlbnRlcnByaXNlUmF3Q2hhbGxlbmdlLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IGJpdEdvUmF3Q2hhbGxlbmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHUtdmFsdWUgcHJvb2ZzIGFuZCBHUEcga2V5cyB1c2VkIGluIGdlbmVyYXRpbmcgYSBUU1MgRUNEU0Egd2FsbGV0LlxuICAgKiBAcGFyYW0gdXNlckdwZ1B1YiBUaGUgdXNlcidzIHB1YmxpYyBHUEcga2V5IGZvciBlbmNyeXB0aW9uIGJldHdlZW4gdXNlci9zZXJ2ZXJcbiAgICogQHBhcmFtIGJhY2t1cEdwZ1B1YiBUaGUgYmFja3VwJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiBiYWNrdXAvc2VydmVyXG4gICAqIEBwYXJhbSBiaXRnb0tleWNoYWluIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIGRlY3J5cHRlZFNoYXJlIFRoZSBkZWNyeXB0ZWQgYml0Z28tdG8tdXNlci9iYWNrdXAgcHJpdmF0ZSBzaGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUga2V5Y2hhaW5cbiAgICogQHBhcmFtIHZlcmlmaWVySW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYXJ0eSB0byB2ZXJpZnk6IDEgPSB1c2VyLCAyID0gYmFja3VwXG4gICAqL1xuICBhc3luYyB2ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgIHVzZXJHcGdQdWI6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWI6IHN0cmluZyxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBkZWNyeXB0ZWRTaGFyZTogc3RyaW5nLFxuICAgIHZlcmlmaWVySW5kZXg6IDEgfCAyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzKTtcblxuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgY29uc3QgdXNlcktleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdQdWIgfSk7XG4gICAgY29uc3QgdXNlcktleUlkID0gdXNlcktleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBHcGdQdWIgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5SWQgPSBiYWNrdXBLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG5cbiAgICBjb25zdCB3YWxsZXRTaWduYXR1cmVzID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5cyh7IGFybW9yZWRLZXlzOiBiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MgfSk7XG4gICAgaWYgKHdhbGxldFNpZ25hdHVyZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgd2FsbGV0IHNpZ25hdHVyZXMnKTtcbiAgICB9XG4gICAgaWYgKHVzZXJLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1swXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaXJzdCB3YWxsZXQgc2lnbmF0dXJlJ3MgZmluZ2VycHJpbnQgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIHVzZXIgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuICAgIGlmIChiYWNrdXBLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1sxXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWNvbmQgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCBiYWNrdXAgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1swXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgd2FsbGV0U2lnbmF0dXJlOiB3YWxsZXRTaWduYXR1cmVzWzFdLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyS2V5SWQsXG4gICAgICBiYWNrdXBLZXlJZCxcbiAgICAgIGJpdGdvUHViOiBiaXRnb0dwZ0tleSxcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgdmVyaWZpZXJJbmRleCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIGNoYWxsZW5nZSB3aXRoIHRoZSBwcm92aWRlZCB2MSBlY2RoIGtleSBhdCBhIGRlcml2ZWQgcGF0aFxuICAgKiBAcGFyYW0gY2hhbGxlbmdlIGNoYWxsZW5nZSB0byBzaWduXG4gICAqIEBwYXJhbSBlY2RoWHBydiB4cHJ2IG9mIHRoZSBlY2RoIGtleVxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggdGhlIGRlcml2ZWQgcGF0aCBhdCB3aGljaCB0aGUgZWNkaCBrZXkgd2lsbCBzaWduXG4gICAqL1xuICBzdGF0aWMgc2lnbkNoYWxsZW5nZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSwgZWNkaFhwcnY6IHN0cmluZywgZGVyaXZhdGlvblBhdGg6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgY29uc3QgbWVzc2FnZVRvU2lnbiA9IHRoaXMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoY2hhbGxlbmdlKTtcbiAgICByZXR1cm4gc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXkobWVzc2FnZVRvU2lnbiwgZWNkaFhwcnYsIGRlcml2YXRpb25QYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBjaGFsbGVuZ2UgdG8gYSBjb21tb24gbWVzc2FnZSBmb3JtYXQgd2hpY2ggY2FuIGJlIHNpZ25lZC5cbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2hhbGxlbmdlLm50aWxkZS5jb25jYXQoY2hhbGxlbmdlLmgxKS5jb25jYXQoY2hhbGxlbmdlLmgyKTtcbiAgfVxuXG4gIC8qKlxuICAgVmVyaWZpZXMgWksgcHJvb2ZzIG9mIEJpdEdvJ3MgY2hhbGxlbmdlcyBmb3IgYm90aCBuaXRybyBhbmQgaW5zdGl0dXRpb25hbCBIU01zXG4gICB3aGljaCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBXUCBBUEkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5Qml0R29DaGFsbGVuZ2VzKGJpdGdvQ2hhbGxlbmdlczogR2V0Qml0R29DaGFsbGVuZ2VzQXBpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gVmVyaWZ5IGluc3RpdHV0aW9uYWwgaHNtIGNoYWxsZW5nZSBwcm9vZlxuICAgIGNvbnN0IGluc3RDaGFsbGVuZ2VWZXJpZmllZCA9IGF3YWl0IHRoaXMudmVyaWZ5Qml0R29DaGFsbGVuZ2Uoe1xuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZSxcbiAgICAgIGgxOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDIsXG4gICAgICBudGlsZGVQcm9vZjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGVQcm9vZixcbiAgICB9KTtcblxuICAgIC8vIFZlcmlmeSBuaXRybyBoc20gY2hhbGxlbmdlIHByb29mXG4gICAgY29uc3Qgbml0cm9DaGFsbGVuZ2VWZXJpZmllZCA9IGF3YWl0IHRoaXMudmVyaWZ5Qml0R29DaGFsbGVuZ2Uoe1xuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29OaXRyb0hzbS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20uaDEsXG4gICAgICBoMjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20uaDIsXG4gICAgICBudGlsZGVQcm9vZjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20ubnRpbGRlUHJvb2YsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5zdENoYWxsZW5nZVZlcmlmaWVkICYmIG5pdHJvQ2hhbGxlbmdlVmVyaWZpZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgWksgcHJvb2YgZm9yIGEgc2luZ2xlIEJpdEdvIGNoYWxsZW5nZVxuICAgKiBAcGFyYW0gYml0Z29DaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyB2ZXJpZnlCaXRHb0NoYWxsZW5nZShiaXRnb0NoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlV2l0aFByb29mcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlV2l0aFByb29mcyhiaXRnb0NoYWxsZW5nZSk7XG4gICAgY29uc3QgbnRpbGRlUHJvb2ZIMVdydEgyVmVyaWZpZWQgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YudmVyaWZ5TnRpbGRlUHJvb2YoXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGUsXG4gICAgICAgIGgxOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgxLFxuICAgICAgICBoMjogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMixcbiAgICAgIH0sXG4gICAgICBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZVByb29mLmgxV3J0SDJcbiAgICApO1xuICAgIGNvbnN0IG50aWxkZVByb29mSDJXcnRIMVZlcmlmaWVkID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnZlcmlmeU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMixcbiAgICAgICAgaDI6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDEsXG4gICAgICB9LFxuICAgICAgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGVQcm9vZi5oMldydEgxXG4gICAgKTtcbiAgICByZXR1cm4gbnRpbGRlUHJvb2ZIMVdydEgyVmVyaWZpZWQgJiYgbnRpbGRlUHJvb2ZIMldydEgxVmVyaWZpZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYml0Z28gY2hhbGxlbmdlcyBmb3IgYm90aCBuaXRybyBhbmQgaW5zdGl0dXRpb25hbCBIU01zIGZyb20gV1AgQVBJLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRCaXRHb0NoYWxsZW5nZXMoYml0Z286IEJpdEdvQmFzZSk6IFByb21pc2U8R2V0Qml0R29DaGFsbGVuZ2VzQXBpPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYml0Z28uZ2V0KGJpdGdvLnVybCgnL3Rzcy9lY2RzYS9jaGFsbGVuZ2VzJywgMikpLnNlbmQoKS5yZXN1bHQoKTtcbiAgICBpZiAoXG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20gfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5udGlsZGUgfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5oMSB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLmgyIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20ubnRpbGRlUHJvb2YgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGUgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgxIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMiB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlUHJvb2ZcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgQml0R28gY2hhbGxlbmdlIHByb29mIHRvIGJlIHByZXNlbnQuIENvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb20uJyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBCaXRHbydzIHByb29mcyBmcm9tIEFQSSBhbmQgc2lnbnMgdGhlbSBpZiB0aGUgcHJvb2ZzIGFyZSB2YWxpZC5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJQYXNzd29yZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldFZlcmlmeUFuZFNpZ25CaXRHb0NoYWxsZW5nZXMoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICB1c2VyUGFzc3dvcmQ6IHN0cmluZ1xuICApOiBQcm9taXNlPEJpdEdvUHJvb2ZTaWduYXR1cmVzPiB7XG4gICAgLy8gRmV0Y2ggQml0R28ncyBjaGFsbGVuZ2UgYW5kIHZlcmlmeVxuICAgIGNvbnN0IGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMgPSBhd2FpdCBFY2RzYVV0aWxzLmdldEJpdEdvQ2hhbGxlbmdlcyhiaXRnbyk7XG4gICAgaWYgKCEoYXdhaXQgRWNkc2FVdGlscy52ZXJpZnlCaXRHb0NoYWxsZW5nZXMoYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdmVyaWZ5IEJpdEdvJ3MgY2hhbGxlbmdlIG5lZWRlZCB0byBlbmFibGUgRUNEU0Egc2lnbmluZy4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb21gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgRWNkc2FVdGlscy5zaWduQml0Z29DaGFsbGVuZ2VzKGJpdGdvLCBlbnRlcnByaXNlSWQsIHVzZXJQYXNzd29yZCwgYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBCaXRnbydzIHByb29mcywgdmVyaWZpY2F0aW9uIG9mIHByb29mcyBpcyBsZWZ0IHRvIHRoZSBjYWxsZXJcbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJQYXNzd29yZFxuICAgKiBAcGFyYW0gYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcyBPcHRpb25hbGx5IHByb3ZpZGUgQml0Z28gQ2hhbGxhZW5nZSAmIFByb29mcyBpbnN0ZWFkIG9mIGZldGNoaW5nIGZyb20gQVBJXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2lnbkJpdGdvQ2hhbGxlbmdlcyhcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudGVycHJpc2VJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nLFxuICAgIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnM/OiBHZXRCaXRHb0NoYWxsZW5nZXNBcGlcbiAgKTogUHJvbWlzZTxCaXRHb1Byb29mU2lnbmF0dXJlcz4ge1xuICAgIC8vIGZldGNoIGNoYWxsZW5nZSAmIHByb29mIGlmIG5vbmUgYXJlIHByb3ZpZGVkXG4gICAgY29uc3QgY2hhbGxlbmdlc1dpdGhQcm9vZnMgPSBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzXG4gICAgICA/IGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnNcbiAgICAgIDogYXdhaXQgRWNkc2FVdGlscy5nZXRCaXRHb0NoYWxsZW5nZXMoYml0Z28pO1xuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCB1c2VyU2lnbmluZ0tleSA9IGF3YWl0IGJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCk7XG4gICAgaWYgKCF1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4gfHwgIXVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHVzZXIga2V5Y2hhaW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyRWNkaEtleWNoYWluID0gYXdhaXQgYml0Z28uZ2V0RUNESEtleWNoYWluKHVzZXJTaWduaW5nS2V5LmVjZGhLZXljaGFpbik7XG4gICAgbGV0IHhwcnY7XG4gICAgdHJ5IHtcbiAgICAgIHhwcnYgPSBiaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJQYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHVzZXJFY2RoS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZWRCaXRHb0luc3RDaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb0luc3RpdHV0aW9uYWxIc20sXG4gICAgICB4cHJ2LFxuICAgICAgdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZEJpdEdvTml0cm9DaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb05pdHJvSHNtLFxuICAgICAgeHBydixcbiAgICAgIHVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29JbnN0SHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSxcbiAgICAgIGJpdGdvTml0cm9Ic21BZG1pblNpZ25hdHVyZTogc2lnbmVkQml0R29OaXRyb0NoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBJdCByZWNlaXZlcyB0aGUgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgYW5kIHNpZ25hdHVyZXMgb2YgdmVyaWZpZWQgYml0Z28gcHJvb2ZzXG4gICAqIGFuZCB1cGxvYWRzIHRoZW0gb24gdGhlIGVudGVycHJpc2UuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIGlkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgLSBlbnRlcnByaXNlIGFkbWluJ3MgbG9naW4gcHdcbiAgICogQHBhcmFtIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIG9wdGlvbmFsbHkgdXNlIHRoZSBjaGFsbGVuZ2UgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5pdGlhdGVDaGFsbGVuZ2VzRm9yRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBjaGFsbGVuZ2U/OiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnNcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRmV0Y2ggdXNlcidzIGVjZGggcHVibGljIGtleWNoYWluIG5lZWRlZCBmb3Igc2lnbmluZyB0aGUgY2hhbGxlbmdlc1xuICAgIGNvbnN0IHVzZXJTaWduaW5nS2V5ID0gYXdhaXQgYml0Z28uZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50SWQpO1xuICAgIGlmICghdXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluIHx8ICF1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB1c2VyIGtleWNoYWluLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckVjZGhLZXljaGFpbiA9IGF3YWl0IGJpdGdvLmdldEVDREhLZXljaGFpbih1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4pO1xuICAgIGxldCB4cHJ2O1xuICAgIHRyeSB7XG4gICAgICB4cHJ2ID0gYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB1c2VyRWNkaEtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgc2lnbiBlbnRlcnByaXNlIGNoYWxsZW5nZVxuICAgIGNvbnN0IGVudENoYWxsZW5nZVdpdGhQcm9vZiA9IGNoYWxsZW5nZSA/PyAoYXdhaXQgRWNkc2FSYW5nZVByb29mLmdlbmVyYXRlTnRpbGRlKDMwNzIpKTtcbiAgICBjb25zdCBzZXJpYWxpemVkRW50Q2hhbGxlbmdlV2l0aFByb29mID0gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGVXaXRoUHJvb2ZzKGVudENoYWxsZW5nZVdpdGhQcm9vZik7XG4gICAgY29uc3Qgc2lnbmVkRW50ZXJwcmlzZUNoYWxsZW5nZSA9IEVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YsXG4gICAgICB4cHJ2LFxuICAgICAgdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy51cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgICAgYml0Z28sXG4gICAgICBlbnRJZCxcbiAgICAgIHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YsXG4gICAgICBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvTml0cm9DaGFsbGVuZ2VQcm9vZlNpZ25hdHVyZS50b1N0cmluZygnaGV4JylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIHNpZ25lZCBjaGFsbGVuZ2VzIGFuZCB0aGVpciBwcm9vZnMgb24gdGhlIGVudGVycHJpc2UuXG4gICAqIFRoaXMgaW5pdGlhdGVzIGVjZHNhIHNpZ25pbmcgZm9yIHRoZSBlbnRlcnByaXNlIHVzZXJzLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudElkIC0gZW50ZXJwcmlzZSB0byBlbmFibGUgZWNkc2Egc2lnbmluZyBvblxuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlV2l0aFByb29mcyAtIGNsaWVudCBzaWRlIGdlbmVyYXRlZCBlbnQgY2hhbGxlbmdlIHdpdGggWksgcHJvb2ZzXG4gICAqIEBwYXJhbSBlbnRDaGFsbGVuZ2VTaWduYXR1cmUgLSBzaWduYXR1cmUgb24gZW50ZXJwcmlzZSBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvSW50Q2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIEJpdEdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIEJpdEdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHVwbG9hZENoYWxsZW5nZXNUb0VudGVycHJpc2UoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRJZDogc3RyaW5nLFxuICAgIGVudENoYWxsZW5nZVdpdGhQcm9vZnM6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMsXG4gICAgZW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmU6IHN0cmluZyxcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGVudGVycHJpc2U6IHtcbiAgICAgICAgbnRpbGRlOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLm50aWxkZSxcbiAgICAgICAgaDE6IGVudENoYWxsZW5nZVdpdGhQcm9vZnMuaDEsXG4gICAgICAgIGgyOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLmgyLFxuICAgICAgICBudGlsZGVQcm9vZjoge1xuICAgICAgICAgIGgxV3J0SDI6IGVudENoYWxsZW5nZVdpdGhQcm9vZnMubnRpbGRlUHJvb2YuaDFXcnRIMixcbiAgICAgICAgICBoMldydEgxOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLm50aWxkZVByb29mLmgyV3J0SDEsXG4gICAgICAgIH0sXG4gICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiBlbnRDaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYml0Z29JbnN0aXR1dGlvbmFsSHNtOiB7XG4gICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiBiaXRnb0ludENoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBiaXRnb05pdHJvSHNtOiB7XG4gICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IGJpdGdvXG4gICAgICAucHV0KGJpdGdvLnVybChgL2VudGVycHJpc2UvJHtlbnRJZH0vdHNzY29uZmlnL2VjZHNhL2NoYWxsZW5nZWAsIDIpKVxuICAgICAgLnNlbmQoYm9keSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxufVxuIl19
|
|
985
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQWdDO0FBRWhDLGlEQUFtQztBQUNuQyx1Q0FBOEI7QUFFOUIseURBQTRIO0FBQzVILG1EQUE2QztBQUU3Qyx5REFBK0Q7QUFFL0QsK0RBQW9FO0FBRXBFLG1FQUEyQztBQVMzQyw0Q0FZc0I7QUFDdEIsc0NBQTRDO0FBQzVDLG9EQUFrSDtBQUNsSCxxREFBZ0g7QUFHaEgsb0RBQXNIO0FBQ3RILHdDQUFtRjtBQUNuRixnREFBNEQ7QUFDNUQsOENBSzRCO0FBRTVCLE1BQU0sYUFBYSxHQUFHLGVBQVksQ0FBQyxhQUFhLENBQUM7QUFFakQsa0JBQWtCO0FBQ2xCLE1BQWEsVUFBVyxTQUFRLHNCQUFzQjtJQUlwRCxZQUFZLEtBQWdCLEVBQUUsUUFBbUIsRUFBRSxNQUFnQjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUpqQyw2S0FBNks7UUFDckssc0JBQWlCLEdBQTRCLFNBQVMsQ0FBQztRQUk3RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLGdDQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsZ0NBQWdDO1lBQ2hDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMs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ZUFBZSxLQUFLLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDVixNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBRUgsTUFBTSxDQUFDLCtCQUErQixDQUFDLGNBQXNCO1FBQzNELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxJQUFJLGFBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUEvMUNELGdDQSsxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgS2V5LCBTZXJpYWxpemVkS2V5UGFpciB9IGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IGVjIH0gZnJvbSAnZWxsaXB0aWMnO1xuXG5pbXBvcnQgeyBFY2RzYVBhaWxsaWVyUHJvb2YsIEVjZHNhUmFuZ2VQcm9vZiwgRWNkc2FUeXBlcywgaGV4VG9CaWdJbnQsIG1pbk1vZHVsdXNCaXRMZW5ndGggfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHsgRUNEU0EsIEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3Rzcyc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEFwaUtleVNoYXJlLCBDcmVhdGVCYWNrdXBPcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCBFQ0RTQU1ldGhvZHMsIHsgRUNEU0FNZXRob2RUeXBlcyB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYSc7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQgYmFzZVRTU1V0aWxzIGZyb20gJy4uL2Jhc2VUU1NVdGlscyc7XG5pbXBvcnQge1xuICBCaXRHb1Byb29mU2lnbmF0dXJlcyxcbiAgQ3JlYXRlRWNkc2FCaXRHb0tleWNoYWluUGFyYW1zLFxuICBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zLFxuICBEZWNyeXB0YWJsZU5TaGFyZSxcbiAgR2V0Qml0R29DaGFsbGVuZ2VzQXBpLFxuICBLZXlTaGFyZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBCYWNrdXBHcGdLZXksXG4gIEJhY2t1cEtleVNoYXJlLFxuICBCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSxcbiAgQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbVBhaWxsaWVyTW9kdWx1c0dldHRlckZ1bmN0aW9uLFxuICBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5pbXBvcnQgeyBBU2hhcmUsIERTaGFyZSwgRW5jcnlwdGVkTlNoYXJlLCBPU2hhcmUsIFNlbmRTaGFyZVR5cGUsIFNTaGFyZSwgV1NoYXJlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNoYXJlUHJvb2YsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXksIGdldFRydXN0R3BnUHViS2V5IH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBCYWNrdXBQcm92aWRlciwgSVdhbGxldCB9IGZyb20gJy4uLy4uLy4uL3dhbGxldCc7XG5pbXBvcnQgeyBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZSwgZ2V0UGFydGljaXBhbnRGcm9tSW5kZXgsIHZlcmlmeVdhbGxldFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYSc7XG5pbXBvcnQgeyBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleSwgdmVyaWZ5RWNkaFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL2VjZGgnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0Q2hhbGxlbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQge1xuICBTaGFyZUtleVBvc2l0aW9uLFxuICBUc3NFY2RzYVN0ZXAxUmV0dXJuTWVzc2FnZSxcbiAgVHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2UsXG4gIFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi8uLi8uLi90c3MvdHlwZXMnO1xuXG5jb25zdCBlbmNyeXB0TlNoYXJlID0gRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmU7XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGNsYXNzIEVjZHNhVXRpbHMgZXh0ZW5kcyBiYXNlVFNTVXRpbHM8S2V5U2hhcmU+IHtcbiAgLy8gV2UgZG8gbm90IGhhdmUgZnVsbCBzdXBwb3J0IGZvciAzLXBhcnR5IHZlcmlmaWNhdGlvbiAody8gZXh0ZXJuYWwgc291cmNlKSBvZiBrZXkgc2hhcmVzIGFuZCBzaWduYXR1cmUgc2hhcmVzLiBUaGVyZSBpcyBubyAzcmQgcGFydHkga2V5IHNlcnZpY2Ugc3VwcG9ydCB3aXRoIHRoaXMgcmVsZWFzZS5cbiAgcHJpdmF0ZSBiaXRnb1B1YmxpY0dwZ0tleTogb3BlbnBncC5LZXkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0PzogSVdhbGxldCkge1xuICAgIHN1cGVyKGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0KTtcbiAgICB0aGlzLnNldEJpdGdvR3BnUHViS2V5KGJpdGdvKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pIHtcbiAgICB0aGlzLmJpdGdvUHVibGljR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pO1xuICB9XG5cbiAgYXN5bmMgZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTogUHJvbWlzZTxvcGVucGdwLktleT4ge1xuICAgIGlmICghdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgLy8gcmV0cnkgZ2V0dGluZyBiaXRnbydzIGdwZyBrZXlcbiAgICAgIGF3YWl0IHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgICBpZiAoIXRoaXMuYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBCaXRnbydzIGdwZyBrZXlcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29QdWJsaWNHcGdLZXk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29tbW9uIHB1YmxpYyBrZXkgZnJvbSBjb21tb25LZXljaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1vbktleWNoYWluIGNvbW1vbiBrZXkgY2hhaW4gYmV0d2VlbiBuIHBhcnRpZXNcbiAgICogQHJldHVybnMge3N0cmluZ30gZW5jb2RlZCBwdWJsaWMga2V5XG4gICAqL1xuICBzdGF0aWMgZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjb21tb25LZXljaGFpbi5sZW5ndGggIT09IDEzMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbW1vbktleWNoYWluIGxlbmd0aCwgZXhwZWN0ZWQgMTMwLCBnb3QgJHtjb21tb25LZXljaGFpbi5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vblB1YkhleFN0ciA9IGNvbW1vbktleWNoYWluLnNsaWNlKDAsIDY2KTtcbiAgICByZXR1cm4gY29tbW9uUHViSGV4U3RyO1xuICB9XG5cbiAgYXN5bmMgZmluYWxpemVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZShcbiAgICBrZXlJZDogc3RyaW5nLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICB1c2VyR3BnS2V5OiBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXk6IEtleVxuICApOiBQcm9taXNlPEJpdGdvSGVsZEJhY2t1cEtleVNoYXJlPiB7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgMixcbiAgICAgIHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgIHVzZXJHcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBLZXlTaGFyZSA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzPy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSAnYmFja3VwJ1xuICAgICk7XG4gICAgY29uc3QgdXNlclB1YmxpY1NoYXJlID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUublNoYXJlc1syXS55LCAnaGV4JyksXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUublNoYXJlc1syXS5jaGFpbmNvZGUsICdoZXgnKSxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0KGJpdGdvVG9CYWNrdXBLZXlTaGFyZSk7XG4gICAgY29uc3Qga2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMuYmFzZUNvaW4udXJsKGAva3JzL2JhY2t1cGtleXMvJHtrZXlJZH1gKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGtleVNoYXJlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICAgIHRvOiAnYmFja3VwJyxcbiAgICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyUHVibGljU2hhcmUsXG4gICAgICAgICAgICBwcml2YXRlU2hhcmU6IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgICAgIHZzc1Byb29mOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS52c3NQcm9vZixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJpdGdvVG9CYWNrdXBLZXlTaGFyZSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgaWYgKCFrZXlSZXNwb25zZSB8fCAha2V5UmVzcG9uc2UuY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIGJhY2t1cCBrZXkgdmVyaWZpY2F0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGtleVJlc3BvbnNlLmlkLFxuICAgICAga2V5U2hhcmVzOiBrZXlSZXNwb25zZS5rZXlTaGFyZXMsXG4gICAgICBjb21tb25LZXljaGFpbjoga2V5UmVzcG9uc2UuY29tbW9uS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGJhY2t1cFByb3ZpZGVyPzogQmFja3VwUHJvdmlkZXI7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBtID0gMjtcbiAgICBjb25zdCBuID0gMztcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IGF3YWl0IE1QQy5rZXlTaGFyZSgxLCBtLCBuKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBpc1RoaXJkUGFydHlCYWNrdXAgPSB0aGlzLmlzVmFsaWRUaGlyZFBhcnR5QmFja3VwUHJvdmlkZXIocGFyYW1zLmJhY2t1cFByb3ZpZGVyKTtcbiAgICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwS2V5U2hhcmVzKGlzVGhpcmRQYXJ0eUJhY2t1cCwgdXNlckdwZ0tleSwgcGFyYW1zLmVudGVycHJpc2UpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0QmFja3VwR3BnUHViS2V5KGlzVGhpcmRQYXJ0eUJhY2t1cCk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID1cbiAgICAgIChhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhwYXJhbXMuZW50ZXJwcmlzZSkpID8/IHRoaXMuYml0Z29QdWJsaWNHcGdLZXk7XG5cbiAgICBjb25zdCBiaXRnb0tleWNoYWluID0gYXdhaXQgdGhpcy5jcmVhdGVCaXRnb0tleWNoYWluKHtcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICBpc1RoaXJkUGFydHlCYWNrdXAsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuY3JlYXRlVXNlcktleWNoYWluKHtcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgaXNUaGlyZFBhcnR5QmFja3VwLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuY3JlYXRlQmFja3VwS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBiYWNrdXBQcm92aWRlcjogcGFyYW1zLmJhY2t1cFByb3ZpZGVyLFxuICAgIH0pO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3VzZXJLZXljaGFpblByb21pc2UsIGJhY2t1cEtleWNoYWluUHJvbWlzZV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgdGhpcmQgcGFydHkgYmFja3VwIGlzIHJlcXVlc3RlZCwgaXQgd2lsbCBjcmVhdGUgYmFja3VwIHNoYXJlcyBmcm9tXG4gICAqIGEgdGhpcmQgcGFydHkgKEJpdEdvIGFzIG9mIG5vdyksIG90aGVyd2lzZSB0aGUga2V5IHNoYXJlcyB3aWxsIGJlIGNsaWVudCBnZW5lcmF0ZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleVNoYXJlcyhcbiAgICBpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZSxcbiAgICB1c2VyR3BnUHViS2V5OiBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIGVudGVycHJpc2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPEJhY2t1cEtleVNoYXJlPiB7XG4gICAgbGV0IGJhY2t1cEtleVNoYXJlOiBCYWNrdXBLZXlTaGFyZTtcbiAgICBpZiAoaXNUaGlyZFBhcnR5QmFja3VwKSB7XG4gICAgICBjb25zdCBiaXRnb0hlbGRCYWNrdXBLZXlTaGFyZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKHVzZXJHcGdQdWJLZXksIGVudGVycHJpc2UpO1xuICAgICAgYmFja3VwS2V5U2hhcmUgPSB7XG4gICAgICAgIGJpdEdvSGVsZEtleVNoYXJlczogYml0Z29IZWxkQmFja3VwS2V5U2hhcmVzLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgICBjb25zdCBtID0gMjtcbiAgICAgIGNvbnN0IG4gPSAzO1xuICAgICAgYmFja3VwS2V5U2hhcmUgPSB7XG4gICAgICAgIHVzZXJIZWxkS2V5U2hhcmU6IGF3YWl0IE1QQy5rZXlTaGFyZSgyLCBtLCBuKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBiYWNrdXBLZXlTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJhY2t1cCBwdWIgZ3BnIGtleSBzdHJpbmdcbiAgICogaWYgYSB0aGlyZCBwYXJ0eSBwcm92aWRlZCB0aGVuIGdldCBmcm9tIHRydXN0XG4gICAqIEBwYXJhbSBpc1RoaXJkUGFydHlCYWNrdXBcbiAgICovXG4gIGFzeW5jIGdldEJhY2t1cEdwZ1B1YktleShpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZSk6IFByb21pc2U8QmFja3VwR3BnS2V5PiB7XG4gICAgcmV0dXJuIGlzVGhpcmRQYXJ0eUJhY2t1cCA/IGdldFRydXN0R3BnUHViS2V5KHRoaXMuYml0Z28pIDogZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgfVxuXG4gIGNyZWF0ZVVzZXJLZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZSxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2UsXG4gIH06IENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgaWYgKCFwYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGlzVGhpcmRQYXJ0eUJhY2t1cCAmJiBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXM/LmtleVNoYXJlcykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVXNlcktleWNoYWluRnJvbVRoaXJkUGFydHlCYWNrdXAoXG4gICAgICAgIHVzZXJHcGdLZXksXG4gICAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgICBiYWNrdXBHcGdLZXkgYXMgS2V5LFxuICAgICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcy5rZXlTaGFyZXMsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHBhc3NwaHJhc2UsXG4gICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICAgKTtcbiAgICB9XG4gICAgYXNzZXJ0KGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIDEsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIHBhc3NwaHJhc2UsXG4gICAgYmFja3VwUHJvdmlkZXIsXG4gIH06IENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZFRoaXJkUGFydHlCYWNrdXBQcm92aWRlcihiYWNrdXBQcm92aWRlcikgJiYgYmFja3VwS2V5U2hhcmUuYml0R29IZWxkS2V5U2hhcmVzPy5rZXlTaGFyZXMpIHtcbiAgICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICAgIGNvbnN0IGZpbmFsaXplZEJhY2t1cEtleVNoYXJlID0gYXdhaXQgdGhpcy5maW5hbGl6ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKFxuICAgICAgICBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMuaWQsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgICAgdXNlckdwZ0tleSxcbiAgICAgICAgYmFja3VwR3BnS2V5IGFzIEtleVxuICAgICAgKTtcbiAgICAgIGlmIChmaW5hbGl6ZWRCYWNrdXBLZXlTaGFyZS5jb21tb25LZXljaGFpbiAhPT0gYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYmFja3VwIGtleWNoYWluIC0gY29tbW9uS2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwS2V5UGFyYW1zOiBDcmVhdGVCYWNrdXBPcHRpb25zID0ge1xuICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46IGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmNvbW1vbktleWNoYWluLFxuICAgICAgICBwcm92aWRlcjogYmFja3VwUHJvdmlkZXIgPz8gJ0JpdEdvVHJ1c3RBc0tycycsXG4gICAgICB9O1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cChiYWNrdXBLZXlQYXJhbXMpO1xuICAgICAgYmFja3VwS2V5Y2hhaW4ua2V5U2hhcmVzID0gZmluYWxpemVkQmFja3VwS2V5U2hhcmUua2V5U2hhcmVzO1xuICAgICAgcmV0dXJuIGJhY2t1cEtleWNoYWluO1xuICAgIH1cbiAgICBhc3NlcnQoYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgYXNzZXJ0KHBhc3NwaHJhc2UpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIDIsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2VcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlLFxuICB9OiBDcmVhdGVFY2RzYUJpdEdvS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgcmVjaXBpZW50SW5kZXggPSAzO1xuICAgIGNvbnN0IHVzZXJUb0JpdGdvU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKHVzZXJLZXlTaGFyZSwgcmVjaXBpZW50SW5kZXgsIGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksIHVzZXJHcGdLZXkpO1xuXG4gICAgY29uc3QgYmFja3VwVG9CaXRnb1NoYXJlID0gYXdhaXQgdGhpcy5nZXRCYWNrdXBFbmNyeXB0ZWROU2hhcmUoXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIHJlY2lwaWVudEluZGV4LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgaXNUaGlyZFBhcnR5QmFja3VwXG4gICAgKTtcblxuICAgIGNvbnN0IGNyZWF0ZUJpdEdvTVBDUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgc291cmNlOiAnYml0Z28nLFxuICAgICAga2V5U2hhcmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IHVzZXJUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiB1c2VyVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgICAgdnNzUHJvb2Y6IHVzZXJUb0JpdGdvU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IHVzZXJUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYmFja3VwVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogYmFja3VwVG9CaXRnb1NoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiYWNrdXBUb0JpdGdvU2hhcmUubixcbiAgICAgICAgICB2c3NQcm9vZjogYmFja3VwVG9CaXRnb1NoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBiYWNrdXBUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdXNlckdQR1B1YmxpY0tleTogdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiYWNrdXBHUEdQdWJsaWNLZXk6IGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgICAgICA/IChiYWNrdXBHcGdLZXkgYXMgS2V5KS5hcm1vcigpXG4gICAgICAgIDogKGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+KS5wdWJsaWNLZXksXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLFxuICAgICAgYWxnb1VzZWQ6ICdlY2RzYScsXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChjcmVhdGVCaXRHb01QQ1BhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBidWlsZHMgdGhlIHJlbGV2YW50IGJhY2t1cCBlbmNyeXB0ZWROU2hhcmUgYmFzZWQgb24gd2hldGhlciB0aGVcbiAgICogYmFja3VwIGtleSBpcyB1c2VyIG9yIHRoaXJkIHBhcnR5IGdlbmVyYXRlZFxuICAgKiBAcGFyYW0gYmFja3VwU2hhcmUgY2FuIGVpdGhlciBoYXZlIGtleSBzaGFyZXMgZnJvbSB0aGUgdXNlciBvciB0aGlyZCBwYXJ0eVxuICAgKiBAcGFyYW0gcmVjaXBpZW50SW5kZXggaW5kZXggb2YgdGhlIHBhcnR5IHJlY2VpdmluZyB0aGUgYmFja3VwIHNoYXJlc1xuICAgKiBAcGFyYW0gcmVjaXBpZW50R3BnUHVibGljQXJtb3IgZ3BnIGFybW9yIG9mIHRoZSBwYXJ0eSByZWNlaXZpbmcgdGhlIGJhY2t1cCBzaGFyZXNcbiAgICogQHBhcmFtIGJhY2t1cEdwZ0tleSBiYWNrdXAgZ3BnIGtleVxuICAgKiBAcGFyYW0gaXNUaGlyZFBhcnR5QmFja3VwIHdoZXRoZXIgdGhlIGJhY2t1cCBpcyBnZW5lcmF0ZWQgYnkgdGhpcmQgcGFydHlcbiAgICovXG4gIGFzeW5jIGdldEJhY2t1cEVuY3J5cHRlZE5TaGFyZShcbiAgICBiYWNrdXBTaGFyZTogQmFja3VwS2V5U2hhcmUsXG4gICAgcmVjaXBpZW50SW5kZXg6IG51bWJlcixcbiAgICByZWNpcGllbnRHcGdQdWJsaWNBcm1vcjogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBpc1RoaXJkUGFydHlCYWNrdXAgPSBmYWxzZVxuICApOiBQcm9taXNlPEVuY3J5cHRlZE5TaGFyZT4ge1xuICAgIGxldCBiYWNrdXBUb1JlY2lwaWVudFNoYXJlOiBFbmNyeXB0ZWROU2hhcmU7XG4gICAgaWYgKGlzVGhpcmRQYXJ0eUJhY2t1cCkge1xuICAgICAgaWYgKCFiYWNrdXBTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRoaXJkIHBhcnR5IGJhY2t1cCBrZXkgc2hhcmVzYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBUb1JlY2lwaWVudEFwaVNoYXJlID0gYmFja3VwU2hhcmUuYml0R29IZWxkS2V5U2hhcmVzLmtleVNoYXJlcy5maW5kKFxuICAgICAgICAoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiYWNrdXAnICYmIGtleVNoYXJlLnRvID09PSBnZXRQYXJ0aWNpcGFudEZyb21JbmRleChyZWNpcGllbnRJbmRleClcbiAgICAgICk7XG4gICAgICBpZiAoIWJhY2t1cFRvUmVjaXBpZW50QXBpU2hhcmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGJhY2t1cCB0byAke2dldFBhcnRpY2lwYW50RnJvbUluZGV4KHJlY2lwaWVudEluZGV4KX0ga2V5IHNoYXJlYCk7XG4gICAgICB9XG4gICAgICAvLyBTaW5jZSBiYWNrdXAgaXMgZnJvbSBhIHRoaXJkIHBhcnR5LCBpdCBpcyBhbHJlYWR5IGVuY3J5cHRlZFxuICAgICAgYmFja3VwVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJhY2t1cFRvUmVjaXBpZW50QXBpU2hhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoYmFja3VwU2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgICBiYWNrdXBUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgICAgYmFja3VwU2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICAgIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yLFxuICAgICAgICBiYWNrdXBHcGdLZXlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrdXBUb1JlY2lwaWVudFNoYXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgdXNlcyB0aGUgYmFja3VwIGtleSBmcm9tIGEgdGhpcmQgcGFydHkgKGJpdGdvIGluIHRoaXMgY2FzZSlcbiAgICogdG8gY3JlYXRlIHRoZSB1c2VyIGtleWNoYWluIHZpYSBXUC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVVzZXJLZXljaGFpbkZyb21UaGlyZFBhcnR5QmFja3VwKFxuICAgIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogS2V5LFxuICAgIHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXk6IEtleSxcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIHRoaXJkUGFydHliYWNrdXBLZXlTaGFyZXM6IEFwaUtleVNoYXJlW10sXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjb21tb24ga2V5IGNoYWluOiAke2JpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW59YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1VzZXJTaGFyZSA9IGJpdGdvS2V5U2hhcmVzLmZpbmQoKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSAndXNlcicpO1xuICAgIGlmICghYml0R29Ub1VzZXJTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIHRvIFVzZXIga2V5IHNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyU2hhcmUgPSB0aGlyZFBhcnR5YmFja3VwS2V5U2hhcmVzLmZpbmQoXG4gICAgICAoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiYWNrdXAnICYmIGtleVNoYXJlLnRvID09PSAndXNlcidcbiAgICApO1xuICAgIGlmICghYmFja3VwVG9Vc2VyU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCYWNrdXAgdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJOU2hhcmUgPSBhd2FpdCBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZShiYWNrdXBUb1VzZXJTaGFyZSk7XG4gICAgY29uc3QgYml0R29Ub1VzZXJOU2hhcmUgPSBhd2FpdCBidWlsZE5TaGFyZUZyb21BUElLZXlTaGFyZShiaXRHb1RvVXNlclNoYXJlKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmVzOiBEZWNyeXB0YWJsZU5TaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICBuU2hhcmU6IGJhY2t1cFRvVXNlck5TaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgblNoYXJlOiBiaXRHb1RvVXNlck5TaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgICBpc2JzNThFbmNvZGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHVzZXJDb21iaW5lZEtleSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVDb21iaW5lZEtleShcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGVuY3J5cHRlZE5TaGFyZXMsXG4gICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluXG4gICAgKTtcbiAgICBpZiAodXNlckNvbWJpbmVkS2V5LmNvbW1vbktleWNoYWluICE9PSBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgdXNlciBrZXljaGFpbiAtIGNvbW1vbktleWNoYWlucyBkbyBub3QgbWF0Y2guJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJ2ID0gSlNPTi5zdHJpbmdpZnkodXNlckNvbWJpbmVkS2V5LnNpZ25pbmdNYXRlcmlhbCk7XG4gICAgY29uc3QgdXNlcktleWNoYWluUGFyYW1zID0ge1xuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IHVzZXJDb21iaW5lZEtleS5jb21tb25LZXljaGFpbixcbiAgICAgIHBydjogcHJ2LFxuICAgICAgZW5jcnlwdGVkUHJ2OiB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogcHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgIH0pLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiBhd2FpdCBrZXljaGFpbnMuYWRkKHVzZXJLZXljaGFpblBhcmFtcyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdXNlckxvY2FsQmFja3VwR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IEtleSxcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGJpdGdvS2V5U2hhcmVzID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM7XG4gICAgaWYgKCFiaXRnb0tleVNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIGtleSBzaGFyZXMnKTtcbiAgICB9XG4gICAgaWYgKCFiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY29tbW9uIGtleSBjaGFpbjogJHtiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWlufWApO1xuICAgIH1cblxuICAgIGxldCByZWNpcGllbnQ6IHN0cmluZztcbiAgICBsZXQga2V5U2hhcmU6IEtleVNoYXJlO1xuICAgIGxldCBvdGhlclNoYXJlOiBLZXlTaGFyZTtcbiAgICBsZXQgcmVjaXBpZW50R3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz47XG4gICAgbGV0IHNlbmRlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+O1xuICAgIGlmIChyZWNpcGllbnRJbmRleCA9PT0gMSkge1xuICAgICAga2V5U2hhcmUgPSB1c2VyS2V5U2hhcmU7XG4gICAgICBvdGhlclNoYXJlID0gYmFja3VwS2V5U2hhcmU7XG4gICAgICByZWNpcGllbnQgPSAndXNlcic7XG4gICAgICByZWNpcGllbnRHcGdLZXkgPSB1c2VyR3BnS2V5O1xuICAgICAgc2VuZGVyR3BnS2V5ID0gdXNlckxvY2FsQmFja3VwR3BnS2V5O1xuICAgIH0gZWxzZSBpZiAocmVjaXBpZW50SW5kZXggPT09IDIpIHtcbiAgICAgIGtleVNoYXJlID0gYmFja3VwS2V5U2hhcmU7XG4gICAgICBvdGhlclNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgcmVjaXBpZW50ID0gJ2JhY2t1cCc7XG4gICAgICByZWNpcGllbnRHcGdLZXkgPSB1c2VyTG9jYWxCYWNrdXBHcGdLZXk7XG4gICAgICBzZW5kZXJHcGdLZXkgPSB1c2VyR3BnS2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBpbmRleCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9SZWNpcGllbnRTaGFyZSA9IGJpdGdvS2V5U2hhcmVzLmZpbmQoXG4gICAgICAoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09IHJlY2lwaWVudFxuICAgICk7XG4gICAgaWYgKCFiaXRHb1RvUmVjaXBpZW50U2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBCaXRHbyB0byAke3JlY2lwaWVudH0ga2V5IHNoYXJlYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjcnlwdGVkU2hhcmUgPSBhd2FpdCB0aGlzLmRlY3J5cHRQcml2YXRlU2hhcmUoYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZSwgcmVjaXBpZW50R3BnS2V5KTtcblxuICAgIGF3YWl0IHRoaXMudmVyaWZ5V2FsbGV0U2lnbmF0dXJlcyhcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdXNlckxvY2FsQmFja3VwR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHJlY2lwaWVudEluZGV4XG4gICAgKTtcblxuICAgIGNvbnN0IHNlbmRlclRvUmVjaXBpZW50U2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKFxuICAgICAgb3RoZXJTaGFyZSxcbiAgICAgIHJlY2lwaWVudEluZGV4LFxuICAgICAgcmVjaXBpZW50R3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHNlbmRlckdwZ0tleVxuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkTlNoYXJlczogRGVjcnlwdGFibGVOU2hhcmVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgLy8gdXNlclRvQmFja3VwIG9yIGJhY2t1cFRvVXNlclxuICAgICAgICBuU2hhcmU6IHNlbmRlclRvUmVjaXBpZW50U2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogcmVjaXBpZW50R3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBzZW5kZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gYml0Z29Ub1JlY2lwaWVudFxuICAgICAgICBuU2hhcmU6IHtcbiAgICAgICAgICBpOiByZWNpcGllbnRJbmRleCxcbiAgICAgICAgICBqOiAzLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgZW5jcnlwdGVkUHJpdmF0ZVNoYXJlOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5uISxcbiAgICAgICAgICB2c3NQcm9vZjogYml0R29Ub1JlY2lwaWVudFNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogcmVjaXBpZW50R3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgICBpc2JzNThFbmNvZGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHJlY2lwaWVudENvbWJpbmVkS2V5ID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZUNvbWJpbmVkS2V5KFxuICAgICAga2V5U2hhcmUsXG4gICAgICBlbmNyeXB0ZWROU2hhcmVzLFxuICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpblxuICAgICk7XG5cbiAgICBjb25zdCBwcnYgPSBKU09OLnN0cmluZ2lmeShyZWNpcGllbnRDb21iaW5lZEtleS5zaWduaW5nTWF0ZXJpYWwpO1xuICAgIGNvbnN0IHJlY2lwaWVudEtleWNoYWluUGFyYW1zID0ge1xuICAgICAgc291cmNlOiByZWNpcGllbnQsXG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcnY6IHBydixcbiAgICAgIGVuY3J5cHRlZFBydjogdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IHBydixcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICB9KSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICByZXR1cm4gcmVjaXBpZW50SW5kZXggPT09IDFcbiAgICAgID8gYXdhaXQga2V5Y2hhaW5zLmFkZChyZWNpcGllbnRLZXljaGFpblBhcmFtcylcbiAgICAgIDogYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cChyZWNpcGllbnRLZXljaGFpblBhcmFtcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVRzc0VjZHNhU3RlcDFTaWduaW5nTWF0ZXJpYWwocGFyYW1zOiB7XG4gICAgY2hhbGxlbmdlczoge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkRWNkc2FDaGFsbGVuZ2VzO1xuICAgICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIH07XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxUc3NFY2RzYVN0ZXAxUmV0dXJuTWVzc2FnZT4ge1xuICAgIGNvbnN0IHsgY2hhbGxlbmdlcywgZGVyaXZhdGlvblBhdGgsIHBydiB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIGlmICh1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZS5pICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXknKTtcbiAgICB9XG4gICAgaWYgKCF1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5IC0gbWlzc2luZyBiYWNrdXBOU2hhcmUnKTtcbiAgICB9XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3Qgc2lnbmluZ0tleSA9IE1QQy5rZXlEZXJpdmUoXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZSxcbiAgICAgIFt1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLCB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZV0sXG4gICAgICBkZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb0luZGV4ID0gU2hhcmVLZXlQb3NpdGlvbi5CSVRHTztcbiAgICBjb25zdCB1c2VySW5kZXggPSB1c2VyU2lnbmluZ01hdGVyaWFsLnBTaGFyZS5pO1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWEsIGgxOiBoMWEsIGgyOiBoMmEsIHA6IHBhIH0gPSBjaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2U7XG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWIsIGgxOiBoMWIsIGgyOiBoMmIsIHA6IHBiLCBuOiBuYiB9ID0gY2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZTtcbiAgICBjb25zdCB1c2VyWFNoYXJlID0gTVBDLmFwcGVuZENoYWxsZW5nZShzaWduaW5nS2V5LnhTaGFyZSwgeyBudGlsZGU6IG50aWxkZWEsIGgxOiBoMWEsIGgyOiBoMmEgfSwgeyBwOiBwYSB9KTtcbiAgICBjb25zdCBiaXRnb1lTaGFyZSA9IE1QQy5hcHBlbmRDaGFsbGVuZ2UoXG4gICAgICB7XG4gICAgICAgIGk6IHVzZXJJbmRleCxcbiAgICAgICAgajogYml0Z29JbmRleCxcbiAgICAgICAgbjogbmIsXG4gICAgICB9LFxuICAgICAgeyBudGlsZGU6IG50aWxkZWIsIGgxOiBoMWIsIGgyOiBoMmIgfSxcbiAgICAgIHsgcDogcGIgfVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduU2hhcmUodXNlclhTaGFyZSwgYml0Z29ZU2hhcmUpO1xuICAgIGNvbnN0IHUgPSBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0udTtcblxuICAgIGxldCBjaGFpbmNvZGUgPSB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLmNoYWluY29kZTtcbiAgICB3aGlsZSAoY2hhaW5jb2RlLmxlbmd0aCA8IDY0KSB7XG4gICAgICBjaGFpbmNvZGUgPSAnMCcgKyBjaGFpbmNvZGU7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lclNoYXJlID0gYmlwMzIuZnJvbVByaXZhdGVLZXkoQnVmZmVyLmZyb20odSwgJ2hleCcpLCBCdWZmZXIuZnJvbShjaGFpbmNvZGUsICdoZXgnKSkudG9CYXNlNTgoKTtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gKGF3YWl0IG9wZW5wZ3AuZW5jcnlwdCh7XG4gICAgICBtZXNzYWdlOiBhd2FpdCBvcGVucGdwLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgICB0ZXh0OiBzaWduZXJTaGFyZSxcbiAgICAgIH0pLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25LZXlzOiBbYml0Z29HcGdLZXldLFxuICAgIH0pKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgcHJpdmF0ZVNoYXJlUHJvb2YgPSBhd2FpdCBjcmVhdGVTaGFyZVByb29mKHVzZXJHcGdLZXkucHJpdmF0ZUtleSwgc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnUsICdlY2RzYScpO1xuICAgIGNvbnN0IHZzc1Byb29mID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnY7XG4gICAgY29uc3QgdXNlclB1YmxpY0dwZ0tleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IHB1YmxpY1NoYXJlID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnkgKyBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuICAgIHJldHVybiB7XG4gICAgICBwcml2YXRlU2hhcmVQcm9vZjogcHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICB2c3NQcm9vZjogdnNzUHJvb2YsXG4gICAgICBwdWJsaWNTaGFyZTogcHVibGljU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZTogZW5jcnlwdGVkU2lnbmVyU2hhcmUsXG4gICAgICB1c2VyUHVibGljR3BnS2V5OiB1c2VyUHVibGljR3BnS2V5LFxuICAgICAga1NoYXJlOiB1c2VyU2lnblNoYXJlLmtTaGFyZSxcbiAgICAgIHdTaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25TaGFyZS53U2hhcmUpLCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSlcbiAgICAgICAgOiB1c2VyU2lnblNoYXJlLndTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB3U2hhcmU6IFdTaGFyZTtcbiAgICBhU2hhcmVGcm9tQml0Z286IE9taXQ8QVNoYXJlLCAnaDEnIHwgJ2gyJyB8ICdudGlsZGUnPjtcbiAgICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxUc3NFY2RzYVN0ZXAyUmV0dXJuTWVzc2FnZT4ge1xuICAgIC8vIEFwcGVuZCB0aGUgQml0R28gY2hhbGxlbmdlIHRvIHRoZSBBc2hhcmUgdG8gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IHByb29mc1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE50aWxkZTogQVNoYXJlID0ge1xuICAgICAgLi4ucGFyYW1zLmFTaGFyZUZyb21CaXRnbyxcbiAgICAgIC4uLnBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXJHYW1tYUFuZE11U2hhcmVzID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUoXG4gICAgICBwYXJhbXMud1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJBU2hhcmVXaXRoTnRpbGRlXG4gICAgKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11RFNoYXJlOiB7XG4gICAgICAgIG11U2hhcmU6IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUsXG4gICAgICAgIGRTaGFyZTogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLmRTaGFyZSxcbiAgICAgICAgaTogdXNlckdhbW1hQW5kTXVTaGFyZXMubXVTaGFyZS5pLFxuICAgICAgfSxcbiAgICAgIG9TaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5vU2hhcmUpLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLm9TaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0T2ZmbGluZVNpZ25lclBhaWxsaWVyTW9kdWx1cyhwYXJhbXM6IHsgcHJ2OiBzdHJpbmcgfSk6IHsgdXNlclBhaWxsaWVyTW9kdWx1czogc3RyaW5nIH0ge1xuICAgIGFzc2VydChwYXJhbXMucHJ2LCAnUGFyYW1zIHRvIGdldCBwYWlsbGllciBtb2R1bHVzIGFyZSBtaXNzaW5nIHBydi4nKTtcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocGFyYW1zLnBydik7XG4gICAgcmV0dXJuIHsgdXNlclBhaWxsaWVyTW9kdWx1czogdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUubiB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZUtTaGFyZShwYXJhbXM6IHtcbiAgICB0c3NQYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2U7XG4gICAgY2hhbGxlbmdlczoge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkRWNkc2FDaGFsbGVuZ2VzO1xuICAgICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIH07XG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlO1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcHJ2LCByZXF1ZXN0VHlwZSwgY2hhbGxlbmdlcyB9ID0gcGFyYW1zO1xuICAgIGFzc2VydCh0eXBlb2YgdHNzUGFyYW1zLnR4UmVxdWVzdCAhPT0gJ3N0cmluZycsICdJbnZhbGlkIHR4UmVxdWVzdCB0eXBlJyk7XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPSB0c3NQYXJhbXMudHhSZXF1ZXN0O1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCAodHhSZXF1ZXN0IGFzIFR4UmVxdWVzdCkudW5zaWduZWRUeHMsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgICAgZGVyaXZhdGlvblBhdGggPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbCh7XG4gICAgICBwcnY6IHBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVNdURlbHRhU2hhcmUocGFyYW1zOiB7XG4gICAgYVNoYXJlRnJvbUJpdGdvOiBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47XG4gICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIGVuY3J5cHRlZFdTaGFyZTogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCBkZWNyeXB0ZWRXU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZFdTaGFyZSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBwYXJhbXMuYVNoYXJlRnJvbUJpdGdvLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IHBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHdTaGFyZTogSlNPTi5wYXJzZShkZWNyeXB0ZWRXU2hhcmUpLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lU1NoYXJlKHBhcmFtczoge1xuICAgIHRzc1BhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZTtcbiAgICBkU2hhcmVGcm9tQml0Z286IERTaGFyZTtcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGU7XG4gICAgZW5jcnlwdGVkT1NoYXJlOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTU2hhcmU+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcmVxdWVzdFR5cGUsIGRTaGFyZUZyb21CaXRnbywgZW5jcnlwdGVkT1NoYXJlLCB3YWxsZXRQYXNzcGhyYXNlIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHR5cGVvZiB0c3NQYXJhbXMudHhSZXF1ZXN0ICE9PSAnc3RyaW5nJywgJ0ludmFsaWQgdHhSZXF1ZXN0IHR5cGUnKTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9IHRzc1BhcmFtcy50eFJlcXVlc3Q7XG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcy50c3NQYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgIH1cbiAgICBjb25zdCBkZWNyeXB0ZWRPU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkT1NoYXJlLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICByZXR1cm4gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduYXR1cmVTaGFyZShKU09OLnBhcnNlKGRlY3J5cHRlZE9TaGFyZSksIGRTaGFyZUZyb21CaXRnbywgc2lnbmFibGVQYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSxcbiAgICBleHRlcm5hbFNpZ25lclBhaWxsaWVyTW9kdWx1c0dldHRlcjogQ3VzdG9tUGFpbGxpZXJNb2R1bHVzR2V0dGVyRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3I6IEN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvcjogQ3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyU1NoYXJlR2VuZXJhdG9yOiBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uID0gdGhpcy53YWxsZXQuY29pblNwZWNpZmljKCk/LnBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uO1xuICAgIGlmIChwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2FsbGV0IGlzIG5vdCByZWFkeSBmb3IgVFNTIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbiB0byBmaW5pc2ggdGhlIGVudGVycHJpc2UgVFNTIGluaXRpYWxpemF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHR4UmVxdWVzdE9iajogVHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IHsgdXNlclBhaWxsaWVyTW9kdWx1cyB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJQYWlsbGllck1vZHVsdXNHZXR0ZXIoeyB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaiB9KTtcbiAgICBjb25zdCB7IGVudGVycHJpc2VDaGFsbGVuZ2UsIGJpdGdvQ2hhbGxlbmdlIH0gPSBhd2FpdCB0aGlzLmdldEVjZHNhU2lnbmluZ0NoYWxsZW5nZXMoXG4gICAgICB0eFJlcXVlc3QgYXMgc3RyaW5nLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB1c2VyUGFpbGxpZXJNb2R1bHVzLFxuICAgICAgMFxuICAgICk7XG4gICAgY29uc3Qgc3RlcDFTaWduaW5nTWF0ZXJpYWwgPSBhd2FpdCBleHRlcm5hbFNpZ25lcktTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0c3NQYXJhbXM6IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIH0sXG4gICAgICBjaGFsbGVuZ2VzOiB7IGVudGVycHJpc2VDaGFsbGVuZ2UsIGJpdGdvQ2hhbGxlbmdlIH0sXG4gICAgICByZXF1ZXN0VHlwZTogcmVxdWVzdFR5cGUsXG4gICAgfSk7XG4gICAgLy8gc2lnbmluZyBzdGFnZSBvbmUgd2l0aCBLIHNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEEgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0T2JqLnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLktTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLmtTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLmVuY3J5cHRlZFNpZ25lck9mZnNldFNoYXJlLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwudnNzUHJvb2YsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnB1YmxpY1NoYXJlLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwudXNlclB1YmxpY0dwZ0tleVxuICAgICkpIGFzIE9taXQ8QVNoYXJlLCAnbnRpbGRlJyB8ICdoMScgfCAnaDInPjsgLy8gV1AvSFNNIGRvZXMgbm90IHJldHVybiB0aGUgaW5pdGlhbCBjaGFsbGVuZ2VcbiAgICBjb25zdCBzdGVwMlJldHVybiA9IGF3YWl0IGV4dGVybmFsU2lnbmVyTXVEZWx0YVNoYXJlR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0T2JqLFxuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBiaXRnb1RvVXNlckFTaGFyZSxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBiaXRnb0NoYWxsZW5nZSxcbiAgICAgIGVuY3J5cHRlZFdTaGFyZTogc3RlcDFTaWduaW5nTWF0ZXJpYWwud1NoYXJlIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgICAvLyBzaWduaW5nIHN0YWdlIHR3byB3aXRoIG11U2hhcmUgYW5kIGRTaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBEIHNoYXJlXG4gICAgY29uc3QgYml0Z29Ub1VzZXJEU2hhcmUgPSAoYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5NVVNoYXJlLFxuICAgICAgc3RlcDJSZXR1cm4ubXVEU2hhcmVcbiAgICApKSBhcyBEU2hhcmU7XG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyU1NoYXJlR2VuZXJhdG9yKHtcbiAgICAgIHRzc1BhcmFtczoge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0T2JqLFxuICAgICAgfSxcbiAgICAgIGRTaGFyZUZyb21CaXRnbzogYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICByZXF1ZXN0VHlwZTogcmVxdWVzdFR5cGUsXG4gICAgICBlbmNyeXB0ZWRPU2hhcmU6IHN0ZXAyUmV0dXJuLm9TaGFyZSBhcyBzdHJpbmcsXG4gICAgfSk7XG4gICAgLy8gc2lnbmluZyBzdGFnZSB0aHJlZSB3aXRoIFNTaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBTU2hhcmVcbiAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0T2JqLnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLlNTaGFyZSxcbiAgICAgIHVzZXJTU2hhcmVcbiAgICApO1xuICAgIHJldHVybiBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0T2JqLnR4UmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ25pbmcga2V5LCB0eFJlcXVlc3RSZXNvbHZlZCBhbmQgdHhSZXF1ZXN0SWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0geyBzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSwgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCBwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbiA9IHRoaXMud2FsbGV0LmNvaW5TcGVjaWZpYygpPy5wZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbjtcbiAgICBpZiAocGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1dhbGxldCBpcyBub3QgcmVhZHkgZm9yIFRTUyBFQ0RTQSBzaWduaW5nLiBQbGVhc2UgY29udGFjdCB5b3VyIGVudGVycHJpc2UgYWRtaW4gdG8gZmluaXNoIHRoZSBlbnRlcnByaXNlIFRTUyBpbml0aWFsaXphdGlvbi4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocGFyYW1zLnBydik7XG4gICAgaWYgKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLmkgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXkgLSBtaXNzaW5nIGJhY2t1cE5TaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0KVxuICAgICAgICA6IHBhcmFtcy50eFJlcXVlc3Q7XG5cbiAgICBsZXQgc2lnbmFibGVQYXlsb2FkID0gbmV3IEJ1ZmZlcignJyk7XG4gICAgbGV0IGRlcml2YXRpb25QYXRoID0gJyc7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcyBhcyBUU1NQYXJhbXNGb3JNZXNzYWdlKS5idWZmZXJUb1NpZ247XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgIH1cbiAgICBjb25zdCBwYWlsbGllck1vZHVsdXMgPSB0aGlzLmdldE9mZmxpbmVTaWduZXJQYWlsbGllck1vZHVsdXMoeyBwcnY6IHBhcmFtcy5wcnYgfSk7XG4gICAgY29uc3QgY2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMuZ2V0RWNkc2FTaWduaW5nQ2hhbGxlbmdlcyhcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgcGFpbGxpZXJNb2R1bHVzLnVzZXJQYWlsbGllck1vZHVsdXMsXG4gICAgICAwXG4gICAgKTtcblxuICAgIGNvbnN0IHN0ZXAxUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVUc3NFY2RzYVN0ZXAxU2lnbmluZ01hdGVyaWFsKHtcbiAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgfSk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIG9uZSB3aXRoIEsgc2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgQSBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4ua1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4uZW5jcnlwdGVkU2lnbmVyT2Zmc2V0U2hhcmUsXG4gICAgICBzdGVwMVJldHVybi52c3NQcm9vZixcbiAgICAgIHN0ZXAxUmV0dXJuLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgc3RlcDFSZXR1cm4ucHVibGljU2hhcmUsXG4gICAgICBzdGVwMVJldHVybi51c2VyUHVibGljR3BnS2V5XG4gICAgKSkgYXMgT21pdDxBU2hhcmUsICdudGlsZGUnIHwgJ2gxJyB8ICdoMic+OyAvLyBXUC9IU00gZG9lcyBub3QgcmV0dXJuIHRoZSBpbml0aWFsIGNoYWxsZW5nZVxuXG4gICAgY29uc3Qgc3RlcDJSZXR1cm4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBiaXRnb1RvVXNlckFTaGFyZSxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBjaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLFxuICAgICAgd1NoYXJlOiBzdGVwMVJldHVybi53U2hhcmUgYXMgV1NoYXJlLFxuICAgIH0pO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHN0ZXAyUmV0dXJuLm11RFNoYXJlXG4gICAgKSkgYXMgRFNoYXJlO1xuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICBzdGVwMlJldHVybi5vU2hhcmUgYXMgT1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBwYXJhbXMuaGFzaFxuICAgICk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHRocmVlIHdpdGggU1NoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIFNTaGFyZVxuICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuU1NoYXJlLFxuICAgICAgdXNlclNTaGFyZVxuICAgICk7XG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlUmF3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhdyBtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgZm9yIGVudGVycHJpc2UgYW5kIEJpdEdvIGluIEVDRFNBIHNpZ25pbmdcbiAgICogT25seSByZXR1cm5zIHRoZSBjaGFsbGVuZ2VzIGlmIHRoZXkgYXJlIHZlcmlmaWVkIGJ5IHRoZSB1c2VyJ3MgZW50ZXJwcmlzZSBhZG1pbidzIGVjZGgga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRyYW5zYWN0aW9uIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtSZXF1ZXN0VHlwZX0gcmVxdWVzdFR5cGUgLSAgKDAgZm9yIHR4LCAxIGZvciBtZXNzYWdlKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFpbGxpZXJNb2R1bHVzIC0gcGFpbGxpZXIgcHVia2V5ICRuJFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgcmVxdWVzdFR5cGVcbiAgICovXG4gIGFzeW5jIGdldEVjZHNhU2lnbmluZ0NoYWxsZW5nZXMoXG4gICAgdHhSZXF1ZXN0SWQ6IHN0cmluZyxcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUsXG4gICAgd2FsbGV0UGFpbGxpZXJNb2R1bHVzOiBzdHJpbmcsXG4gICAgaW5kZXggPSAwXG4gICk6IFByb21pc2U8e1xuICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2U7XG4gIH0+IHtcbiAgICBjb25zdCBlbnRlcnByaXNlSWQgPSB0aGlzLndhbGxldC50b0pTT04oKS5lbnRlcnByaXNlO1xuICAgIGlmICghZW50ZXJwcmlzZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBtdXN0IGJlIGFuIGVudGVycHJpc2Ugd2FsbGV0LicpO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBCaXRHbyByYW5nZSBwcm9vZiBhbmQgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3QgY3JlYXRlQml0Z29DaGFsbGVuZ2VSZXNwb25zZSA9IGF3YWl0IGdldFR4UmVxdWVzdENoYWxsZW5nZShcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICBpbmRleC50b1N0cmluZygpLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB3YWxsZXRQYWlsbGllck1vZHVsdXNcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29Ub0VudGVycHJpc2VQYWlsbGllckNoYWxsZW5nZSA9IHsgcDogY3JlYXRlQml0Z29DaGFsbGVuZ2VSZXNwb25zZS5wIH07XG4gICAgY29uc3QgZW50ZXJwcmlzZVRvQml0Z29QYWlsbGllckNoYWxsZW5nZSA9IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2Uoe1xuICAgICAgcDogYXdhaXQgRWNkc2FQYWlsbGllclByb29mLmdlbmVyYXRlUChoZXhUb0JpZ0ludChjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLm4pKSxcbiAgICB9KTtcblxuICAgIC8vIFRPRE8oQkctNzg3NjQpOiBvbmNlIHRoZSBwYWlsbGllciBwcm9vZnMgYXJlIGNvbXBsZXRlLCByZWR1Y2UgY2hhbGxlbmdlIGNyZWF0aW9uIHRvIG9uZSBBUEkgY2FsbFxuICAgIGNvbnN0IHdhbGxldENoYWxsZW5nZXMgPSBhd2FpdCB0aGlzLndhbGxldC5nZXRDaGFsbGVuZ2VzRm9yRWNkc2FTaWduaW5nKCk7XG5cbiAgICBjb25zdCBjaGFsbGVuZ2VWZXJpZmllclVzZXJJZCA9IHdhbGxldENoYWxsZW5nZXMuY3JlYXRlZEJ5O1xuICAgIGNvbnN0IGFkbWluU2lnbmluZ0tleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRlcnByaXNlSWQsIGNoYWxsZW5nZVZlcmlmaWVyVXNlcklkKTtcbiAgICBjb25zdCBwdWJrZXlPZkFkbWluRWNkaEtleUhleCA9IGFkbWluU2lnbmluZ0tleVJlc3BvbnNlLmRlcml2ZWRQdWJrZXk7XG5cbiAgICAvLyBWZXJpZnkgZW50ZXJwcmlzZSdzIGNoYWxsZW5nZSBpcyBzaWduZWQgYnkgdGhlIHJlc3BlY3RpdmUgYWRtaW5zIGVjZGgga2V5Y2hhaW5cbiAgICBjb25zdCBlbnRlcnByaXNlUmF3Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiB3YWxsZXRDaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgaDE6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5oMSxcbiAgICAgIGgyOiB3YWxsZXRDaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2UuaDIsXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblNpZ25hdHVyZU9uRW50Q2hhbGxlbmdlOiBzdHJpbmcgPSB3YWxsZXRDaGFsbGVuZ2VzLmVudGVycHJpc2VDaGFsbGVuZ2UudmVyaWZpZXJzLmFkbWluU2lnbmF0dXJlO1xuICAgIGlmIChcbiAgICAgICF2ZXJpZnlFY2RoU2lnbmF0dXJlKFxuICAgICAgICBFY2RzYVV0aWxzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGVudGVycHJpc2VSYXdDaGFsbGVuZ2UpLFxuICAgICAgICBhZG1pblNpZ25hdHVyZU9uRW50Q2hhbGxlbmdlLFxuICAgICAgICBCdWZmZXIuZnJvbShwdWJrZXlPZkFkbWluRWNkaEtleUhleCwgJ2hleCcpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkbWluIHNpZ25hdHVyZSBmb3IgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgaXMgbm90IHZhbGlkLiBQbGVhc2UgY29udGFjdCB5b3VyIGVudGVycHJpc2UgYWRtaW4uYCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIEJpdEdvIGNoYWxsZW5nZSdzIFpLIHByb29mcyBoYXZlIGJlZW4gdmVyaWZpZWQgYnkgdGhlIGFkbWluXG4gICAgY29uc3QgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlID0ge1xuICAgICAgbnRpbGRlOiB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLm50aWxkZSxcbiAgICAgIGgxOiB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UuaDIsXG4gICAgICBwOiBiaXRnb1RvRW50ZXJwcmlzZVBhaWxsaWVyQ2hhbGxlbmdlLnAsXG4gICAgICBuOiBjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLm4sXG4gICAgfTtcbiAgICBjb25zdCBhZG1pblZlcmlmaWNhdGlvblNpZ25hdHVyZUZvckJpdEdvQ2hhbGxlbmdlID0gd2FsbGV0Q2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZS52ZXJpZmllcnMuYWRtaW5TaWduYXR1cmU7XG4gICAgaWYgKFxuICAgICAgIXZlcmlmeUVjZGhTaWduYXR1cmUoXG4gICAgICAgIEVjZHNhVXRpbHMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoYml0Z29DaGFsbGVuZ2UpLFxuICAgICAgICBhZG1pblZlcmlmaWNhdGlvblNpZ25hdHVyZUZvckJpdEdvQ2hhbGxlbmdlLFxuICAgICAgICBCdWZmZXIuZnJvbShwdWJrZXlPZkFkbWluRWNkaEtleUhleCwgJ2hleCcpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkbWluIHNpZ25hdHVyZSBmb3IgQml0R28ncyBjaGFsbGVuZ2UgaXMgbm90IHZhbGlkLiBQbGVhc2UgY29udGFjdCB5b3VyIGVudGVycHJpc2UgYWRtaW4uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IHtcbiAgICAgICAgLi4uZW50ZXJwcmlzZVJhd0NoYWxsZW5nZSxcbiAgICAgICAgcDogZW50ZXJwcmlzZVRvQml0Z29QYWlsbGllckNoYWxsZW5nZS5wLFxuICAgICAgfSxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHUtdmFsdWUgcHJvb2ZzIGFuZCBHUEcga2V5cyB1c2VkIGluIGdlbmVyYXRpbmcgYSBUU1MgRUNEU0Egd2FsbGV0LlxuICAgKiBAcGFyYW0gdXNlckdwZ1B1YiBUaGUgdXNlcidzIHB1YmxpYyBHUEcga2V5IGZvciBlbmNyeXB0aW9uIGJldHdlZW4gdXNlci9zZXJ2ZXJcbiAgICogQHBhcmFtIGJhY2t1cEdwZ1B1YiBUaGUgYmFja3VwJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiBiYWNrdXAvc2VydmVyXG4gICAqIEBwYXJhbSBiaXRnb0tleWNoYWluIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIGRlY3J5cHRlZFNoYXJlIFRoZSBkZWNyeXB0ZWQgYml0Z28tdG8tdXNlci9iYWNrdXAgcHJpdmF0ZSBzaGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUga2V5Y2hhaW5cbiAgICogQHBhcmFtIHZlcmlmaWVySW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYXJ0eSB0byB2ZXJpZnk6IDEgPSB1c2VyLCAyID0gYmFja3VwXG4gICAqL1xuICBhc3luYyB2ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgIHVzZXJHcGdQdWI6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWI6IHN0cmluZyxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBkZWNyeXB0ZWRTaGFyZTogc3RyaW5nLFxuICAgIHZlcmlmaWVySW5kZXg6IDEgfCAyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzKTtcblxuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgY29uc3QgdXNlcktleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdQdWIgfSk7XG4gICAgY29uc3QgdXNlcktleUlkID0gdXNlcktleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBHcGdQdWIgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5SWQgPSBiYWNrdXBLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG5cbiAgICBjb25zdCB3YWxsZXRTaWduYXR1cmVzID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5cyh7IGFybW9yZWRLZXlzOiBiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MgfSk7XG4gICAgaWYgKHdhbGxldFNpZ25hdHVyZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgd2FsbGV0IHNpZ25hdHVyZXMnKTtcbiAgICB9XG4gICAgaWYgKHVzZXJLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1swXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaXJzdCB3YWxsZXQgc2lnbmF0dXJlJ3MgZmluZ2VycHJpbnQgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIHVzZXIgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuICAgIGlmIChiYWNrdXBLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1sxXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWNvbmQgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCBiYWNrdXAgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1swXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgd2FsbGV0U2lnbmF0dXJlOiB3YWxsZXRTaWduYXR1cmVzWzFdLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyS2V5SWQsXG4gICAgICBiYWNrdXBLZXlJZCxcbiAgICAgIGJpdGdvUHViOiBiaXRnb0dwZ0tleSxcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgdmVyaWZpZXJJbmRleCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIGNoYWxsZW5nZSB3aXRoIHRoZSBwcm92aWRlZCB2MSBlY2RoIGtleSBhdCBhIGRlcml2ZWQgcGF0aFxuICAgKiBAcGFyYW0gY2hhbGxlbmdlIGNoYWxsZW5nZSB0byBzaWduXG4gICAqIEBwYXJhbSBlY2RoWHBydiB4cHJ2IG9mIHRoZSBlY2RoIGtleVxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggdGhlIGRlcml2ZWQgcGF0aCBhdCB3aGljaCB0aGUgZWNkaCBrZXkgd2lsbCBzaWduXG4gICAqL1xuICBzdGF0aWMgc2lnbkNoYWxsZW5nZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSwgZWNkaFhwcnY6IHN0cmluZywgZGVyaXZhdGlvblBhdGg6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgY29uc3QgbWVzc2FnZVRvU2lnbiA9IHRoaXMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoY2hhbGxlbmdlKTtcbiAgICByZXR1cm4gc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXkobWVzc2FnZVRvU2lnbiwgZWNkaFhwcnYsIGRlcml2YXRpb25QYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBjaGFsbGVuZ2UgdG8gYSBjb21tb24gbWVzc2FnZSBmb3JtYXQgd2hpY2ggY2FuIGJlIHNpZ25lZC5cbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2hhbGxlbmdlLm50aWxkZS5jb25jYXQoY2hhbGxlbmdlLmgxKS5jb25jYXQoY2hhbGxlbmdlLmgyKTtcbiAgfVxuXG4gIC8qKlxuICAgVmVyaWZpZXMgWksgcHJvb2ZzIG9mIEJpdEdvJ3MgY2hhbGxlbmdlcyBmb3IgYm90aCBuaXRybyBhbmQgaW5zdGl0dXRpb25hbCBIU01zXG4gICB3aGljaCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBXUCBBUEkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5Qml0R29DaGFsbGVuZ2VzKGJpdGdvQ2hhbGxlbmdlczogR2V0Qml0R29DaGFsbGVuZ2VzQXBpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gVmVyaWZ5IGluc3RpdHV0aW9uYWwgaHNtIGNoYWxsZW5nZSBwcm9vZlxuICAgIGNvbnN0IGluc3RDaGFsbGVuZ2VWZXJpZmllZCA9IGF3YWl0IHRoaXMudmVyaWZ5Qml0R29DaGFsbGVuZ2Uoe1xuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZSxcbiAgICAgIGgxOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDIsXG4gICAgICBudGlsZGVQcm9vZjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGVQcm9vZixcbiAgICB9KTtcblxuICAgIC8vIFZlcmlmeSBuaXRybyBoc20gY2hhbGxlbmdlIHByb29mXG4gICAgY29uc3Qgbml0cm9DaGFsbGVuZ2VWZXJpZmllZCA9IGF3YWl0IHRoaXMudmVyaWZ5Qml0R29DaGFsbGVuZ2Uoe1xuICAgICAgbnRpbGRlOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29OaXRyb0hzbS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20uaDEsXG4gICAgICBoMjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20uaDIsXG4gICAgICBudGlsZGVQcm9vZjogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20ubnRpbGRlUHJvb2YsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5zdENoYWxsZW5nZVZlcmlmaWVkICYmIG5pdHJvQ2hhbGxlbmdlVmVyaWZpZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgWksgcHJvb2YgZm9yIGEgc2luZ2xlIEJpdEdvIGNoYWxsZW5nZVxuICAgKiBAcGFyYW0gYml0Z29DaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyB2ZXJpZnlCaXRHb0NoYWxsZW5nZShiaXRnb0NoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlV2l0aFByb29mcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlV2l0aFByb29mcyhiaXRnb0NoYWxsZW5nZSk7XG4gICAgY29uc3QgbnRpbGRlUHJvb2ZIMVdydEgyVmVyaWZpZWQgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YudmVyaWZ5TnRpbGRlUHJvb2YoXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGUsXG4gICAgICAgIGgxOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgxLFxuICAgICAgICBoMjogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMixcbiAgICAgIH0sXG4gICAgICBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZVByb29mLmgxV3J0SDJcbiAgICApO1xuICAgIGNvbnN0IG50aWxkZVByb29mSDJXcnRIMVZlcmlmaWVkID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnZlcmlmeU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMixcbiAgICAgICAgaDI6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDEsXG4gICAgICB9LFxuICAgICAgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGVQcm9vZi5oMldydEgxXG4gICAgKTtcbiAgICByZXR1cm4gbnRpbGRlUHJvb2ZIMVdydEgyVmVyaWZpZWQgJiYgbnRpbGRlUHJvb2ZIMldydEgxVmVyaWZpZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYml0Z28gY2hhbGxlbmdlcyBmb3IgYm90aCBuaXRybyBhbmQgaW5zdGl0dXRpb25hbCBIU01zIGZyb20gV1AgQVBJLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRCaXRHb0NoYWxsZW5nZXMoYml0Z286IEJpdEdvQmFzZSk6IFByb21pc2U8R2V0Qml0R29DaGFsbGVuZ2VzQXBpPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYml0Z28uZ2V0KGJpdGdvLnVybCgnL3Rzcy9lY2RzYS9jaGFsbGVuZ2VzJywgMikpLnNlbmQoKS5yZXN1bHQoKTtcbiAgICBpZiAoXG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20gfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5udGlsZGUgfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5oMSB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLmgyIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20ubnRpbGRlUHJvb2YgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGUgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgxIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMiB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlUHJvb2ZcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgQml0R28gY2hhbGxlbmdlIHByb29mIHRvIGJlIHByZXNlbnQuIENvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb20uJyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBCaXRHbydzIHByb29mcyBmcm9tIEFQSSBhbmQgc2lnbnMgdGhlbSBpZiB0aGUgcHJvb2ZzIGFyZSB2YWxpZC5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJQYXNzd29yZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldFZlcmlmeUFuZFNpZ25CaXRHb0NoYWxsZW5nZXMoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICB1c2VyUGFzc3dvcmQ6IHN0cmluZ1xuICApOiBQcm9taXNlPEJpdEdvUHJvb2ZTaWduYXR1cmVzPiB7XG4gICAgLy8gRmV0Y2ggQml0R28ncyBjaGFsbGVuZ2UgYW5kIHZlcmlmeVxuICAgIGNvbnN0IGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMgPSBhd2FpdCBFY2RzYVV0aWxzLmdldEJpdEdvQ2hhbGxlbmdlcyhiaXRnbyk7XG4gICAgaWYgKCEoYXdhaXQgRWNkc2FVdGlscy52ZXJpZnlCaXRHb0NoYWxsZW5nZXMoYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdmVyaWZ5IEJpdEdvJ3MgY2hhbGxlbmdlIG5lZWRlZCB0byBlbmFibGUgRUNEU0Egc2lnbmluZy4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb21gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgRWNkc2FVdGlscy5zaWduQml0Z29DaGFsbGVuZ2VzKGJpdGdvLCBlbnRlcnByaXNlSWQsIHVzZXJQYXNzd29yZCwgYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBCaXRnbydzIHByb29mcywgdmVyaWZpY2F0aW9uIG9mIHByb29mcyBpcyBsZWZ0IHRvIHRoZSBjYWxsZXJcbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJQYXNzd29yZFxuICAgKiBAcGFyYW0gYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mcyBPcHRpb25hbGx5IHByb3ZpZGUgQml0Z28gQ2hhbGxhZW5nZSAmIFByb29mcyBpbnN0ZWFkIG9mIGZldGNoaW5nIGZyb20gQVBJXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2lnbkJpdGdvQ2hhbGxlbmdlcyhcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudGVycHJpc2VJZDogc3RyaW5nLFxuICAgIHVzZXJQYXNzd29yZDogc3RyaW5nLFxuICAgIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnM/OiBHZXRCaXRHb0NoYWxsZW5nZXNBcGlcbiAgKTogUHJvbWlzZTxCaXRHb1Byb29mU2lnbmF0dXJlcz4ge1xuICAgIC8vIGZldGNoIGNoYWxsZW5nZSAmIHByb29mIGlmIG5vbmUgYXJlIHByb3ZpZGVkXG4gICAgY29uc3QgY2hhbGxlbmdlc1dpdGhQcm9vZnMgPSBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzXG4gICAgICA/IGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnNcbiAgICAgIDogYXdhaXQgRWNkc2FVdGlscy5nZXRCaXRHb0NoYWxsZW5nZXMoYml0Z28pO1xuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCB1c2VyU2lnbmluZ0tleSA9IGF3YWl0IGJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCk7XG4gICAgaWYgKCF1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4gfHwgIXVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHVzZXIga2V5Y2hhaW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyRWNkaEtleWNoYWluID0gYXdhaXQgYml0Z28uZ2V0RUNESEtleWNoYWluKHVzZXJTaWduaW5nS2V5LmVjZGhLZXljaGFpbik7XG4gICAgbGV0IHhwcnY7XG4gICAgdHJ5IHtcbiAgICAgIHhwcnYgPSBiaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJQYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHVzZXJFY2RoS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZWRCaXRHb0luc3RDaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb0luc3RpdHV0aW9uYWxIc20sXG4gICAgICB4cHJ2LFxuICAgICAgdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZEJpdEdvTml0cm9DaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb05pdHJvSHNtLFxuICAgICAgeHBydixcbiAgICAgIHVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29JbnN0SHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSxcbiAgICAgIGJpdGdvTml0cm9Ic21BZG1pblNpZ25hdHVyZTogc2lnbmVkQml0R29OaXRyb0NoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBJdCByZWNlaXZlcyB0aGUgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgYW5kIHNpZ25hdHVyZXMgb2YgdmVyaWZpZWQgYml0Z28gcHJvb2ZzXG4gICAqIGFuZCB1cGxvYWRzIHRoZW0gb24gdGhlIGVudGVycHJpc2UuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIGlkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgLSBlbnRlcnByaXNlIGFkbWluJ3MgbG9naW4gcHdcbiAgICogQHBhcmFtIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIG9wdGlvbmFsbHkgdXNlIHRoZSBjaGFsbGVuZ2UgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5pdGlhdGVDaGFsbGVuZ2VzRm9yRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBjaGFsbGVuZ2U/OiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnNcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRmV0Y2ggdXNlcidzIGVjZGggcHVibGljIGtleWNoYWluIG5lZWRlZCBmb3Igc2lnbmluZyB0aGUgY2hhbGxlbmdlc1xuICAgIGNvbnN0IHVzZXJTaWduaW5nS2V5ID0gYXdhaXQgYml0Z28uZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50SWQpO1xuICAgIGlmICghdXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluIHx8ICF1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB1c2VyIGtleWNoYWluLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckVjZGhLZXljaGFpbiA9IGF3YWl0IGJpdGdvLmdldEVDREhLZXljaGFpbih1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4pO1xuICAgIGxldCB4cHJ2O1xuICAgIHRyeSB7XG4gICAgICB4cHJ2ID0gYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB1c2VyRWNkaEtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgc2lnbiBlbnRlcnByaXNlIGNoYWxsZW5nZVxuICAgIGNvbnN0IGVudENoYWxsZW5nZVdpdGhQcm9vZiA9IGNoYWxsZW5nZSA/PyAoYXdhaXQgRWNkc2FSYW5nZVByb29mLmdlbmVyYXRlTnRpbGRlKG1pbk1vZHVsdXNCaXRMZW5ndGgpKTtcbiAgICBjb25zdCBzZXJpYWxpemVkRW50Q2hhbGxlbmdlV2l0aFByb29mID0gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGVXaXRoUHJvb2ZzKGVudENoYWxsZW5nZVdpdGhQcm9vZik7XG4gICAgY29uc3Qgc2lnbmVkRW50ZXJwcmlzZUNoYWxsZW5nZSA9IEVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YsXG4gICAgICB4cHJ2LFxuICAgICAgdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy51cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgICAgYml0Z28sXG4gICAgICBlbnRJZCxcbiAgICAgIHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YsXG4gICAgICBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGJpdGdvTml0cm9DaGFsbGVuZ2VQcm9vZlNpZ25hdHVyZS50b1N0cmluZygnaGV4JylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIHNpZ25lZCBjaGFsbGVuZ2VzIGFuZCB0aGVpciBwcm9vZnMgb24gdGhlIGVudGVycHJpc2UuXG4gICAqIFRoaXMgaW5pdGlhdGVzIGVjZHNhIHNpZ25pbmcgZm9yIHRoZSBlbnRlcnByaXNlIHVzZXJzLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudElkIC0gZW50ZXJwcmlzZSB0byBlbmFibGUgZWNkc2Egc2lnbmluZyBvblxuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlV2l0aFByb29mcyAtIGNsaWVudCBzaWRlIGdlbmVyYXRlZCBlbnQgY2hhbGxlbmdlIHdpdGggWksgcHJvb2ZzXG4gICAqIEBwYXJhbSBlbnRDaGFsbGVuZ2VTaWduYXR1cmUgLSBzaWduYXR1cmUgb24gZW50ZXJwcmlzZSBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvSW50Q2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIEJpdEdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIEJpdEdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHVwbG9hZENoYWxsZW5nZXNUb0VudGVycHJpc2UoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRJZDogc3RyaW5nLFxuICAgIGVudENoYWxsZW5nZVdpdGhQcm9vZnM6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMsXG4gICAgZW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmU6IHN0cmluZyxcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGVudGVycHJpc2U6IHtcbiAgICAgICAgbnRpbGRlOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLm50aWxkZSxcbiAgICAgICAgaDE6IGVudENoYWxsZW5nZVdpdGhQcm9vZnMuaDEsXG4gICAgICAgIGgyOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLmgyLFxuICAgICAgICBudGlsZGVQcm9vZjoge1xuICAgICAgICAgIGgxV3J0SDI6IGVudENoYWxsZW5nZVdpdGhQcm9vZnMubnRpbGRlUHJvb2YuaDFXcnRIMixcbiAgICAgICAgICBoMldydEgxOiBlbnRDaGFsbGVuZ2VXaXRoUHJvb2ZzLm50aWxkZVByb29mLmgyV3J0SDEsXG4gICAgICAgIH0sXG4gICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiBlbnRDaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYml0Z29JbnN0aXR1dGlvbmFsSHNtOiB7XG4gICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiBiaXRnb0ludENoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBiaXRnb05pdHJvSHNtOiB7XG4gICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IGJpdGdvXG4gICAgICAucHV0KGJpdGdvLnVybChgL2VudGVycHJpc2UvJHtlbnRJZH0vdHNzY29uZmlnL2VjZHNhL2NoYWxsZW5nZWAsIDIpKVxuICAgICAgLnNlbmQoYm9keSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1dGlsIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRoYXQgYSBjb21tb25LZXljaGFpbiBpcyB2YWxpZCBhbmQgY2FuIHVsdGltYXRlbHkgcmVzb2x2ZSB0byBhIHZhbGlkIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIGNvbW1vbktleWNoYWluIC0gYSB1c2VyIHVwbG9hZGVkIGNvbW1vbktleWNoYWluIHN0cmluZ1xuICAgKiBAdGhyb3dzIGlmIHRoZSBjb21tb25LZXljaGFpbiBpcyBpbnZhbGlkIGxlbmd0aCBvciBpbnZhbGlkIGZvcm1hdFxuICAgKi9cblxuICBzdGF0aWMgdmFsaWRhdGVDb21tb25LZXljaGFpblB1YmxpY0tleShjb21tb25LZXljaGFpbjogc3RyaW5nKSB7XG4gICAgY29uc3QgcHViID0gRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW4pO1xuICAgIGNvbnN0IHNlY3AyNTZrMSA9IG5ldyBlYygnc2VjcDI1NmsxJyk7XG4gICAgY29uc3Qga2V5ID0gc2VjcDI1NmsxLmtleUZyb21QdWJsaWMocHViLCAnaGV4Jyk7XG4gICAgcmV0dXJuIGtleS5nZXRQdWJsaWMoKS5lbmNvZGUoJ2hleCcsIGZhbHNlKS5zbGljZSgyKTtcbiAgfVxufVxuIl19
|