@bitgo/sdk-core 37.10.1 → 38.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -3
  2. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  3. package/dist/src/bitgo/baseCoin/baseCoin.js +3 -17
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +2 -2
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/bitgoBase.d.ts +3 -6
  8. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  9. package/dist/src/bitgo/bitgoBase.js +1 -1
  10. package/dist/src/bitgo/environments.d.ts.map +1 -1
  11. package/dist/src/bitgo/environments.js +9 -1
  12. package/dist/src/bitgo/internal/keycard.d.ts +9 -18
  13. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  14. package/dist/src/bitgo/internal/keycard.js +8 -56
  15. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +2 -12
  16. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
  17. package/dist/src/bitgo/keychain/decryptKeychain.js +6 -37
  18. package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -2
  19. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  20. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  21. package/dist/src/bitgo/keychain/keychains.d.ts +1 -12
  22. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  23. package/dist/src/bitgo/keychain/keychains.js +16 -44
  24. package/dist/src/bitgo/recovery/initiate.d.ts +2 -15
  25. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  26. package/dist/src/bitgo/recovery/initiate.js +7 -47
  27. package/dist/src/bitgo/trading/tradingAccount.js +2 -2
  28. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
  29. package/dist/src/bitgo/utils/tss/addressVerification.js +3 -10
  30. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  31. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +5 -5
  32. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +7 -7
  33. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +13 -8
  34. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +78 -103
  36. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -0
  37. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +61 -18
  39. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -3
  40. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +30 -46
  42. package/dist/src/bitgo/wallet/iWallet.d.ts +2 -4
  43. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  44. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  45. package/dist/src/bitgo/wallet/iWallets.d.ts +96 -2
  46. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  47. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  48. package/dist/src/bitgo/wallet/wallet.d.ts +8 -21
  49. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/wallet.js +26 -114
  51. package/dist/src/bitgo/wallet/wallets.d.ts +5 -0
  52. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/wallets.js +123 -27
  54. package/dist/src/index.d.ts +1 -0
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +1 -1
  57. package/dist/test/unit/bitgo/recovery/initiate.js +18 -89
  58. package/dist/test/unit/bitgo/trading/tradingAccount.js +5 -5
  59. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +26 -22
  60. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +14 -14
  61. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +129 -10
  62. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  63. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  64. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  65. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +47 -75
  66. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +4 -4
  67. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +16 -16
  68. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +364 -14
  69. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +2 -5
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +4 -4
@@ -1,48 +1,13 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.EcdsaMPCv2Utils = void 0;
40
7
  exports.isGG18SigningMaterial = isGG18SigningMaterial;
41
- exports.isGG18SigningMaterialAsync = isGG18SigningMaterialAsync;
42
8
  exports.getMpcV2RecoveryKeyShares = getMpcV2RecoveryKeyShares;
43
9
  exports.signRecoveryMpcV2 = signRecoveryMpcV2;
44
10
  const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
45
- const sjcl = __importStar(require("@bitgo/sjcl"));
46
11
  const assert_1 = __importDefault(require("assert"));
47
12
  const buffer_1 = require("buffer");
48
13
  const io_ts_types_1 = require("io-ts-types");
@@ -245,7 +210,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
245
210
  reducedEncryptedPrv = await encryptionSession.encrypt(btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))));
246
211
  }
247
212
  else {
248
- encryptedPrv = await this.bitgo.encryptAsync({
213
+ encryptedPrv = await this.bitgo.encrypt({
249
214
  input: privateMaterialBase64,
250
215
  password: passphrase,
251
216
  encryptionVersion,
@@ -254,7 +219,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
254
219
  // scalar s_i) with the wallet passphrase. The result is stored as reducedEncryptedPrv
255
220
  // on the key card QR code and represents a second copy of private key material
256
221
  // beyond the server-stored encryptedPrv.
257
- reducedEncryptedPrv = await this.bitgo.encryptAsync({
222
+ reducedEncryptedPrv = await this.bitgo.encrypt({
258
223
  // Buffer.toString('base64') can not be used here as it does not work on the browser.
259
224
  // The browser deals with a Buffer as Uint8Array, therefore in the browser .toString('base64') just creates a comma seperated string of the array values.
260
225
  input: btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))),
@@ -283,7 +248,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
283
248
  recipientKeychainParams.webauthnInfo = {
284
249
  otpDeviceId: webauthnInfo.otpDeviceId,
285
250
  prfSalt: webauthnInfo.prfSalt,
286
- encryptedPrv: await this.bitgo.encryptAsync({
251
+ encryptedPrv: await this.bitgo.encrypt({
287
252
  input: privateMaterialBase64,
288
253
  password: webauthnInfo.passphrase,
289
254
  encryptionVersion,
@@ -409,6 +374,64 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
409
374
  return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain);
410
375
  }
411
376
  // #endregion
377
+ /**
378
+ * Creates ECDSA MPCv2 keychains using external signer callbacks instead of a passphrase.
379
+ * The external signer holds all private key material; the SDK only coordinates the DKG protocol.
380
+ */
381
+ async createKeychainsWithExternalSigner(params) {
382
+ const { enterprise, callbacks } = params;
383
+ const { mpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(enterprise, true);
384
+ const mpcv2Key = mpcv2PublicKey ?? this.bitgoMPCv2PublicGpgKey;
385
+ (0, assert_1.default)(mpcv2Key, 'Failed to get BitGo MPCv2 GPG public key');
386
+ const bitgoPublicGpgKey = mpcv2Key.armor();
387
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
388
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoMpcPubKey)(bitgoPublicGpgKey, 'mpcv2'), 'Invalid BitGo GPG public key');
389
+ }
390
+ // Round 1: external signer generates GPG keys and initial DKG messages
391
+ const { userGpgPublicKey, backupGpgPublicKey, round1Messages, userState, backupState } = await callbacks.initializeCallback({
392
+ enterprise,
393
+ bitgoPublicGpgKey,
394
+ });
395
+ const { sessionId, bitgoMsg1, bitgoToUserMsg2, bitgoToBackupMsg2 } = await this.sendKeyGenerationRound1(enterprise, userGpgPublicKey, backupGpgPublicKey, round1Messages);
396
+ // Round 2: external signer processes BitGo's round 1 response
397
+ const { round2Messages, userState: userStateAfter2, backupState: backupStateAfter2, } = await callbacks.round2Callback({
398
+ sessionId,
399
+ bitgoMsg1,
400
+ bitgoToUserMsg2,
401
+ bitgoToBackupMsg2,
402
+ userState,
403
+ backupState,
404
+ });
405
+ const round2Response = await this.sendKeyGenerationRound2(enterprise, sessionId, round2Messages);
406
+ assert_1.default.strictEqual(round2Response.sessionId, sessionId, 'Session ID mismatch after round 2');
407
+ // Round 3: external signer processes BitGo's round 2 response
408
+ const { round3Messages, userState: userStateAfter3, backupState: backupStateAfter3, } = await callbacks.round3Callback({
409
+ sessionId,
410
+ bitgoCommitment2: round2Response.bitgoCommitment2,
411
+ bitgoToUserMsg3: round2Response.bitgoToUserMsg3,
412
+ bitgoToBackupMsg3: round2Response.bitgoToBackupMsg3,
413
+ userState: userStateAfter2,
414
+ backupState: backupStateAfter2,
415
+ });
416
+ const round3Response = await this.sendKeyGenerationRound3(enterprise, sessionId, round3Messages);
417
+ assert_1.default.strictEqual(round3Response.sessionId, sessionId, 'Session ID mismatch after round 3');
418
+ // Finalize: external signer verifies BitGo's final message against the derived common keychain
419
+ const { commonKeychain } = await callbacks.finalizeCallback({
420
+ sessionId,
421
+ bitgoMsg4: round3Response.bitgoMsg4,
422
+ bitgoCommonKeychain: round3Response.commonKeychain,
423
+ userState: userStateAfter3,
424
+ backupState: backupStateAfter3,
425
+ });
426
+ assert_1.default.strictEqual(commonKeychain, round3Response.commonKeychain, 'Common keychains do not match');
427
+ const keychains = this.baseCoin.keychains();
428
+ const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
429
+ keychains.add({ source: 'user', keyType: 'tss', commonKeychain, isMPCv2: true }),
430
+ keychains.add({ source: 'backup', keyType: 'tss', commonKeychain, isMPCv2: true }),
431
+ this.addBitgoKeychain(commonKeychain),
432
+ ]);
433
+ return { userKeychain, backupKeychain, bitgoKeychain };
434
+ }
412
435
  async sendKeyGenerationRound1(enterprise, userGpgPublicKey, backupGpgPublicKey, payload) {
413
436
  return this.sendKeyGenerationRound1BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), userGpgPublicKey, backupGpgPublicKey, payload);
414
437
  }
@@ -757,13 +780,13 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
757
780
  session.destroy();
758
781
  }
759
782
  }
760
- const encryptedRound1Session = await this.bitgo.encryptAsync({
783
+ const encryptedRound1Session = await this.bitgo.encrypt({
761
784
  input: sessionData,
762
785
  password: walletPassphrase,
763
786
  adata: `${EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE}:${adata}`,
764
787
  encryptionVersion: 1,
765
788
  });
766
- const encryptedUserGpgPrvKey = await this.bitgo.encryptAsync({
789
+ const encryptedUserGpgPrvKey = await this.bitgo.encrypt({
767
790
  input: userGpgKey.privateKey,
768
791
  password: walletPassphrase,
769
792
  adata: `${EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY}:${adata}`,
@@ -788,13 +811,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
788
811
  throw new Error('Unexpected signature share response. Unable to parse data.');
789
812
  }
790
813
  const serializedBitGoToUserMessagesRound1 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundOne)(parsedBitGoToUserSigShareRoundOne, userGpgKey, bitgoGpgKey);
791
- let round1Session;
792
- if (useV2) {
793
- round1Session = await this.bitgo.decryptAsync({ input: encryptedRound1Session, password: walletPassphrase });
794
- }
795
- else {
796
- round1Session = this.bitgo.decrypt({ input: encryptedRound1Session, password: walletPassphrase });
797
- }
814
+ const round1Session = await this.bitgo.decrypt({ input: encryptedRound1Session, password: walletPassphrase });
798
815
  this.validateAdata(adata, encryptedRound1Session, EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE);
799
816
  const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
800
817
  const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
@@ -820,7 +837,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
820
837
  encSession.destroy();
821
838
  }
822
839
  }
823
- const encryptedRound2Session = await this.bitgo.encryptAsync({
840
+ const encryptedRound2Session = await this.bitgo.encrypt({
824
841
  input: sessionData,
825
842
  password: walletPassphrase,
826
843
  adata: `${EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE}:${adata}`,
@@ -836,7 +853,6 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
836
853
  (0, assert_1.default)(txRequest.transactions && txRequest.transactions.length === 1, 'Unable to find transactions in txRequest');
837
854
  const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
838
855
  const adata = `${hashBuffer.toString('hex')}:${derivationPath}`;
839
- const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound2Session);
840
856
  const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY);
841
857
  const userGpgKey = {
842
858
  privateKey: userGpgPrvKey.armor(),
@@ -853,13 +869,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
853
869
  p2pMessages: serializedBitGoToUserMessagesRound3.p2pMessages,
854
870
  broadcastMessages: [],
855
871
  });
856
- let round2Session;
857
- if (useV2) {
858
- round2Session = await this.bitgo.decryptAsync({ input: encryptedRound2Session, password: walletPassphrase });
859
- }
860
- else {
861
- round2Session = this.bitgo.decrypt({ input: encryptedRound2Session, password: walletPassphrase });
862
- }
872
+ const round2Session = await this.bitgo.decrypt({ input: encryptedRound2Session, password: walletPassphrase });
863
873
  this.validateAdata(adata, encryptedRound2Session, EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE);
864
874
  const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
865
875
  const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
@@ -877,31 +887,16 @@ EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY = 'DKLS23_SIGNING_USER_GPG_KEY';
877
887
  EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE = 'DKLS23_SIGNING_ROUND1_STATE';
878
888
  EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE = 'DKLS23_SIGNING_ROUND2_STATE';
879
889
  /**
880
- * TODO: deprecate this function in favor of isGG18SigningMaterialAsync once v2 encryption is default
881
890
  * Checks if the given key share, when decrypted, contains valid GG18 signing material.
882
891
  *
883
892
  * @param {string} keyShare - The encrypted key share string.
884
893
  * @param {string|undefined} walletPassphrase - The passphrase used to decrypt the key share
885
- * @returns {boolean} - Returns `true` if the decrypted data contains valid signing material, otherwise `false`.
886
- */
887
- function isGG18SigningMaterial(keyShare, walletPassphrase) {
888
- const prv = sjcl.decrypt(walletPassphrase, keyShare);
889
- try {
890
- const signingMaterial = JSON.parse(prv);
891
- return (signingMaterial.pShare &&
892
- signingMaterial.bitgoNShare &&
893
- (signingMaterial.userNShare || signingMaterial.backupNShare));
894
- }
895
- catch (error) {
896
- return false;
897
- }
898
- }
899
- /**
900
- * Async version of {@link isGG18SigningMaterial} with v1/v2 auto-detect decrypt via `bitgo.decryptAsync`.
894
+ * @param {BitGoBase} bitgo - BitGo instance for v1/v2 auto-detect decrypt
895
+ * @returns {Promise<boolean>} - Resolves `true` if the decrypted data contains valid signing material, otherwise `false`.
901
896
  */
902
- async function isGG18SigningMaterialAsync(keyShare, walletPassphrase, bitgo) {
897
+ async function isGG18SigningMaterial(keyShare, walletPassphrase, bitgo) {
903
898
  try {
904
- const prv = await bitgo.decryptAsync({ password: walletPassphrase, input: keyShare });
899
+ const prv = await bitgo.decrypt({ password: walletPassphrase, input: keyShare });
905
900
  const signingMaterial = JSON.parse(prv);
906
901
  return (signingMaterial.pShare &&
907
902
  signingMaterial.bitgoNShare &&
@@ -920,16 +915,10 @@ async function isGG18SigningMaterialAsync(keyShare, walletPassphrase, bitgo) {
920
915
  * @returns MPC v2 recovery key shares
921
916
  */
922
917
  async function getMpcV2RecoveryKeyShares(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo) {
923
- if (bitgo) {
924
- if (await isGG18SigningMaterialAsync(encryptedUserKey, walletPassphrase, bitgo)) {
925
- return getMpcV2RecoveryKeySharesFromGG18(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo);
926
- }
927
- return getMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo);
918
+ if (await isGG18SigningMaterial(encryptedUserKey, walletPassphrase, bitgo)) {
919
+ return getMpcV2RecoveryKeySharesFromGG18(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo);
928
920
  }
929
- if (isGG18SigningMaterial(encryptedUserKey, walletPassphrase)) {
930
- return getMpcV2RecoveryKeySharesFromGG18(encryptedUserKey, encryptedBackupKey, walletPassphrase);
931
- }
932
- return getMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase);
921
+ return getMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo);
933
922
  }
934
923
  /**
935
924
  * Signs a message hash using MPC v2 recovery key shares.
@@ -990,16 +979,8 @@ async function getMpcV2RecoveryKeySharesFromGG18(encryptedGG18UserKey, encrypted
990
979
  * @async
991
980
  */
992
981
  async function getMpcV2RecoveryKeySharesFromReducedKey(encryptedMPCv2UserKey, encryptedMPCv2BackupKey, walletPassphrase, bitgo) {
993
- let userCompressedPrv;
994
- let bakcupCompressedPrv;
995
- if (bitgo) {
996
- userCompressedPrv = buffer_1.Buffer.from(await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedMPCv2UserKey }), 'base64');
997
- bakcupCompressedPrv = buffer_1.Buffer.from(await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedMPCv2BackupKey }), 'base64');
998
- }
999
- else {
1000
- userCompressedPrv = buffer_1.Buffer.from(sjcl.decrypt(walletPassphrase, encryptedMPCv2UserKey), 'base64');
1001
- bakcupCompressedPrv = buffer_1.Buffer.from(sjcl.decrypt(walletPassphrase, encryptedMPCv2BackupKey), 'base64');
1002
- }
982
+ const userCompressedPrv = buffer_1.Buffer.from(await bitgo.decrypt({ password: walletPassphrase, input: encryptedMPCv2UserKey }), 'base64');
983
+ const bakcupCompressedPrv = buffer_1.Buffer.from(await bitgo.decrypt({ password: walletPassphrase, input: encryptedMPCv2BackupKey }), 'base64');
1003
984
  const userPrvJSON = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(userCompressedPrv);
1004
985
  const backupPrvJSON = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(bakcupCompressedPrv);
1005
986
  const userKeyRetrofit = {
@@ -1035,14 +1016,8 @@ async function getKeyCombinedFromTssKeyShares(encryptedGG18UserKey, encryptedGG1
1035
1016
  let backupPrv;
1036
1017
  let userPrv;
1037
1018
  try {
1038
- if (bitgo) {
1039
- backupPrv = await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedGG18BackupKey });
1040
- userPrv = await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedGG18UserKey });
1041
- }
1042
- else {
1043
- backupPrv = sjcl.decrypt(walletPassphrase, encryptedGG18BackupKey);
1044
- userPrv = sjcl.decrypt(walletPassphrase, encryptedGG18UserKey);
1045
- }
1019
+ backupPrv = await bitgo.decrypt({ password: walletPassphrase, input: encryptedGG18BackupKey });
1020
+ userPrv = await bitgo.decrypt({ password: walletPassphrase, input: encryptedGG18UserKey });
1046
1021
  }
1047
1022
  catch (e) {
1048
1023
  throw new Error(`Error decrypting backup keychain: ${e.message}`);
@@ -1071,4 +1046,4 @@ async function getKeyCombinedFromTssKeyShares(encryptedGG18UserKey, encryptedGG1
1071
1046
  return [userKeyCombined, backupKeyCombined];
1072
1047
  }
1073
1048
  // #endregion
1074
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErNENBLHNEQVlDO0FBS0QsZ0VBZ0JDO0FBVUQsOERBb0JDO0FBYUQsOENBOEJDO0FBeC9DRCxvREFBeUc7QUFDekcsa0RBQW9DO0FBQ3BDLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFFaEMsNkNBQTZDO0FBQzdDLG9EQUFzQztBQUd0QyxzREFVNkI7QUFFN0IseURBQWdEO0FBR2hELHNDQUE4RDtBQUM5RCxnREFBMEU7QUFDMUUsNkNBQWdEO0FBQ2hELDhEQU11QztBQUV2QyxxREFBd0Q7QUFDeEQsNENBZXNCO0FBQ3RCLDREQUFrRTtBQUNsRSxpQ0FBd0M7QUFDeEMscUVBQTZGO0FBQzdGLDREQUE4RjtBQUM5Riw0Q0FBMEQ7QUFFMUQsc0RBQTZEO0FBRTdELE1BQWEsZUFBZ0IsU0FBUSxxQkFBYztJQUtqRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQU9yQjtRQUNDLE1BQU0sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0Qsa0VBQWtFO1FBQ2xFLG9FQUFvRTtRQUNwRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJ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U0FBUyxFQUN2RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxPQUFPLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbmNyeXB0aW9uVmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBiaWdJbnRUb0J1ZmZlckJFLCBEa2xzQ29tbXMsIERrbHNEa2csIERrbHNEc2csIERrbHNUeXBlcywgRGtsc1V0aWxzIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvL3NqY2wnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IEhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgY3JlYXRlS2VjY2FrSGFzaCBmcm9tICdrZWNjYWsnO1xuaW1wb3J0ICogYXMgcGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7XG4gIE1QQ3YyQnJvYWRjYXN0TWVzc2FnZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5TdGF0ZUVudW0sXG4gIE1QQ3YyUDJQTWVzc2FnZSxcbiAgTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmltcG9ydCB7IEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWInO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSwgV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCB7IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluL2lLZXljaGFpbnMnO1xuaW1wb3J0IHsgRUNEU0FNZXRob2RUeXBlcywgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzJztcbmltcG9ydCB7IHNlbmRTaWduYXR1cmVTaGFyZVYyLCBzZW5kVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi90eXBlc01QQ3YyJztcbmltcG9ydCB7XG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byxcbiAgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZE9uZSxcbiAgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byxcbn0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL2VjZHNhTVBDdjInO1xuaW1wb3J0IHsgS2V5Q29tYmluZWQgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvdHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7XG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHNzU2lnblR4UmVxdWVzdFBhcmFtc1dpdGhQcnYsXG4gIFRzc1R4UmVjaXBpZW50U291cmNlLFxuICBUeFJlcXVlc3QsXG4gIGlzVjJFbnZlbG9wZSxcbiAgU2lnbmFibGVUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IHNob3VsZFVzZVByZUhhc2hlZFNpZ25hYmxlIH0gZnJvbSAnLi4vcHJlSGFzaGVkU2lnbmFibGUnO1xuaW1wb3J0IHsgQmFzZUVjZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgRWNkc2FNUEN2MktleUdlblNlbmRGbiwgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSB9IGZyb20gJy4vZWNkc2FNUEN2MktleUdlblNlbmRlcic7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBpc0JpdGdvTXBjUHViS2V5IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2JpdGdvUHViS2V5cyc7XG5pbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gZnJvbSAnLi4vcmVjaXBpZW50VXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgRWNkc2FNUEN2MlV0aWxzIGV4dGVuZHMgQmFzZUVjZHNhVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVkgPSAnREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFID0gJ0RLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERLTFMyM19TSUdOSU5HX1JPVU5EMl9TVEFURSA9ICdES0xTMjNfU0lHTklOR19ST1VORDJfU1RBVEUnO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmc7XG4gICAgcmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQ7XG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbztcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgeyB1c2VyU2Vzc2lvbiwgYmFja3VwU2Vzc2lvbiB9ID0gdGhpcy5nZXRVc2VyQW5kQmFja3VwU2Vzc2lvbigyLCAzLCBwYXJhbXMucmV0cm9maXQpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBtcGN2MktleSA9IG1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQobXBjdjJLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBtcGN2MktleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIC8vIEVuc3VyZSB0aGUgcHVibGljIGtleSBpcyBvbmUgb2YgdGhlIGV4cGVjdGVkIEJpdEdvIHB1YmxpYyBrZXlzIHdoZW4gaW4gdGVzdCBvciBwcm9kLlxuICAgICAgYXNzZXJ0KGlzQml0Z29NcGNQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXksICdtcGN2MicpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGdwZ0tleTogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGdwZ0tleTogYmFja3VwR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGNvbnN0IHVzZXJSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCB1c2VyU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgYmFja3VwU2Vzc2lvbi5pbml0RGtnKCk7XG5cbiAgICBjb25zdCByb3VuZDFTZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxQnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxLCBiaXRnb1RvQmFja3VwTXNnMiwgYml0Z29Ub1VzZXJNc2cyIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBwYXJhbXMucmV0cm9maXQ/LndhbGxldElkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4ucm91bmQxTWVzc2FnZXMsXG4gICAgICAgICAgICB3YWxsZXRJZDogcGFyYW1zLnJldHJvZml0LndhbGxldElkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiByb3VuZDFNZXNzYWdlc1xuICAgICk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnMSldIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJQMlBNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnKSwgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdGdvTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CaXRnb01zZzIsICdVc2VyIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKHVzZXJUb0JpdGdvTXNnMik7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIERrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpXSxcbiAgICB9KTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoYmFja3VwUm91bmQyUDJQTWVzc2FnZXMpLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyLCAnQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiwgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBiaXRnb0NvbW1pdG1lbnQyLFxuICAgICAgYml0Z29Ub1VzZXJNc2czLFxuICAgICAgYml0Z29Ub0JhY2t1cE1zZzMsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHNlc3Npb25JZCwgcm91bmQyTWVzc2FnZXMpO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgM1xuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIDIgU2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kMk1zZ3MucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQyTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW2JhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMiwgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2cyID0gYmFja3VwUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzIsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kM01lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW2JpdGdvVG9Vc2VyUm91bmQyTXNnLCBiYWNrdXBUb1VzZXJNc2cyXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CYWNrdXBNc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CYWNrdXBNc2czLCAnVXNlciB0byBCYWNrdXAgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCB1c2VyVG9CaXRnb01zZzMgPSB1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Nc2czLCAnVXNlciB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZSh1c2VyVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQzTWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvQmFja3VwUm91bmQyTXNnLCB1c2VyVG9CYWNrdXBNc2cyXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck1zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwVG9Vc2VyTXNnMywgJ0JhY2t1cCB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwVG9CaXRnb01zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvQml0Z29Nc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UoYmFja3VwVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2csICdCaXRHbyB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub1VzZXJSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kNE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW2JhY2t1cFRvVXNlck1zZzMsIGJpdGdvVG9Vc2VyUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cgPSB1c2VyUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGFzc2VydCh1c2VyUm91bmQ0QnJvYWRjYXN0TXNnLCAnVXNlciBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UodXNlclJvdW5kNEJyb2FkY2FzdE1zZyk7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDRNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW3VzZXJUb0JhY2t1cE1zZzMsIGJpdGdvVG9CYWNrdXBSb3VuZDNNc2ddLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZyA9IGJhY2t1cFJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZywgJ0JhY2t1cCBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3Qgcm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAge1xuICAgICAgICBwMnBNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMsIHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnM10sXG4gICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJSb3VuZDRCcm9hZGNhc3RNc2csIHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgICAgfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMyxcbiAgICAgIGJpdGdvTXNnNCxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKHBhcmFtcy5lbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kM01lc3NhZ2VzKTtcblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDMsICdSb3VuZCAxIGFuZCAzIFNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhcbiAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2c0KV0gfSxcbiAgICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApLmJyb2FkY2FzdE1lc3NhZ2VzO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDRCcm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuXG4gICAgYXNzZXJ0KGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgdXNlclJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSB1c2VyU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyUHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBQcml2YXRlTWF0ZXJpYWwpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIHVzZXJDb21tb25LZXljaGFpbiwgJ1VzZXIgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIGJhY2t1cENvbW1vbktleWNoYWluLCAnQmFja3VwIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvblNlc3Npb24gPVxuICAgICAgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uID09PSAyID8gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXJhbXMucGFzc3BocmFzZSkgOiB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZFVzZXJLZXljaGFpbihcbiAgICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgICAgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBwYXJhbXMud2ViYXV0aG5JbmZvLFxuICAgICAgICBlbmNyeXB0aW9uU2Vzc2lvbixcbiAgICAgICAgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICBwYXJhbXMuZW50ZXJwcmlzZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICAgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb25cbiAgICAgICk7XG4gICAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbihiaXRnb0NvbW1vbktleWNoYWluKTtcblxuICAgICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgICBiYWNrdXBLZXljaGFpblByb21pc2UsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgXSk7XG4gICAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbmNyeXB0aW9uU2Vzc2lvbj8uZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vICNyZWdpb24ga2V5Y2hhaW4gdXRpbHNcbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICBwYXJ0aWNpcGFudEluZGV4OiBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uU2Vzc2lvbj86IHtcbiAgICAgIGVuY3J5cHQocGxhaW50ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZWNyeXB0KGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAgIGRlc3Ryb3koKTogdm9pZDtcbiAgICB9LFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgbGV0IHNvdXJjZTogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVkdWNlZEVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBwcml2YXRlTWF0ZXJpYWxCYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHBhcnRpY2lwYW50SW5kZXgpIHtcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5VU0VSOlxuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDpcbiAgICAgICAgc291cmNlID0gcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSID8gJ3VzZXInIDogJ2JhY2t1cCc7XG4gICAgICAgIGFzc2VydChwcml2YXRlTWF0ZXJpYWwsIGBQcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsIGBSZWR1Y2VkIHByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocGFzc3BocmFzZSwgYFBhc3NwaHJhc2UgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBwcml2YXRlTWF0ZXJpYWxCYXNlNjQgPSBwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICBpZiAoZW5jcnlwdGlvblNlc3Npb24pIHtcbiAgICAgICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCBlbmNyeXB0aW9uU2Vzc2lvbi5lbmNyeXB0KHByaXZhdGVNYXRlcmlhbEJhc2U2NCk7XG4gICAgICAgICAgcmVkdWNlZEVuY3J5cHRlZFBydiA9IGF3YWl0IGVuY3J5cHRpb25TZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgICBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRW5jcnlwdHMgdGhlIENCT1ItZW5jb2RlZCBSZWR1Y2VkS2V5U2hhcmUgKHdoaWNoIGNvbnRhaW5zIHRoZSBwYXJ0eSdzIHByaXZhdGVcbiAgICAgICAgICAvLyBzY2FsYXIgc19pKSB3aXRoIHRoZSB3YWxsZXQgcGFzc3BocmFzZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgYXMgcmVkdWNlZEVuY3J5cHRlZFBydlxuICAgICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2YgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICAgICAgICAvLyBiZXlvbmQgdGhlIHNlcnZlci1zdG9yZWQgZW5jcnlwdGVkUHJ2LlxuICAgICAgICAgIHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgICAvLyBCdWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpIGNhbiBub3QgYmUgdXNlZCBoZXJlIGFzIGl0IGRvZXMgbm90IHdvcmsgb24gdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGVyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICAgIGlucHV0OiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQklUR086XG4gICAgICAgIHNvdXJjZSA9ICdiaXRnbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgfTtcblxuICAgIGlmICh3ZWJhdXRobkluZm8gJiYgcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIHByaXZhdGVNYXRlcmlhbEJhc2U2NCkge1xuICAgICAgLy8gU2VuZCB0aGUgcGFzc2tleSBhcyBgd2ViYXV0aG5JbmZvYDsgdGhlIGRlcHJlY2F0ZWQgYHdlYmF1dGhuRGV2aWNlc2AgYXJyYXkgaXMgaWdub3JlZCBieSBQT1NUIC9rZXkuXG4gICAgICBhc3NlcnQoZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgdG8gYXR0YWNoIGEgd2ViYXV0aG4gZGV2aWNlIHRvIHRoZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICByZWNpcGllbnRLZXljaGFpblBhcmFtcy53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgIHByZlNhbHQ6IHdlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgIHBhc3N3b3JkOiB3ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSksXG4gICAgICAgIGVudGVycHJpc2VJZDogZW50ZXJwcmlzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICByZXR1cm4geyAuLi4oYXdhaXQga2V5Y2hhaW5zLmFkZChyZWNpcGllbnRLZXljaGFpblBhcmFtcykpLCByZWR1Y2VkRW5jcnlwdGVkUHJ2OiByZWR1Y2VkRW5jcnlwdGVkUHJ2IH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBVc2VyIG9yIEJhY2t1cCBNUEN2MSBTaWduaW5nTWF0ZXJpYWwgdG8gUmV0cm9maXREYXRhIG5lZWRlZCBieSBNUEN2MiBES0cuXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0ZWRLZXlzaGFyZSAtIE1QQ3YxIGRlY3J5cHRlZCBzaWduaW5nIG1hdGVyaWFsIGZvciB1c2VyIG9yIGJhY2t1cCBhcyBhIGpzb24uc3RyaW5naWZ5IHN0cmluZyBhbmQgYml0Z28ncyBCaWcgU2kuXG4gICAqIEBwYXJhbSBwYXJ0eUlkIC0gVGhlIHBhcnR5IElEIG9mIHRoZSBNUEN2MSBrZXlzaGFyZS5cbiAgICogQHJldHVybnMgVGhlIHJldHJvZml0IGRhdGEgbmVlZGVkIHRvIHN0YXJ0IGFuIE1QQ3YyIERLRyBzZXNzaW9uLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGdldEtleURhdGFGb3JSZXRyb2ZpdChcbiAgICBkZWNyeXB0ZWRLZXlzaGFyZTogc3RyaW5nLFxuICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQIHwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICk6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEge1xuICAgIGNvbnN0IG1wYyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IHhpTGlzdCA9IFtcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMSksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDIpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgzKSwgMzIpKSxcbiAgICBdO1xuICAgIHJldHVybiBFY2RzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgICAgbXBjdjFQYXJ0eUtleVNoYXJlOiBkZWNyeXB0ZWRLZXlzaGFyZSxcbiAgICAgIG1wY3YxUGFydHlJbmRleDogcGFydHlJZCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSID8gMSA6IDIsXG4gICAgICB4aUxpc3QsXG4gICAgICBtcGMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdXNlciBhbmQgYmFja3VwIE1QQ3YxIFNpZ25pbmdNYXRlcmlhbCB0byBSZXRyb2ZpdERhdGEgbmVlZGVkIGJ5IE1QQ3YyIERLRy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIE1QQ3YxIGRlY3J5cHRlZCBzaWduaW5nIG1hdGVyaWFsIGZvciB1c2VyIGFuZCBiYWNrdXAgYXMgYSBqc29uLnN0cmluZ2lmeSBzdHJpbmcgYW5kIGJpdGdvJ3MgQmlnIFNpLlxuICAgKiBAcmV0dXJucyB7eyBtcGN2MlVzZXJLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTsgbXBjdjJCYWtjdXBLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB9fSAtIHRoZSByZXRyb2ZpdCBkYXRhIG5lZWRlZCB0byBzdGFydCBhbiBNUEN2MiBES0cgc2Vzc2lvbi5cbiAgICovXG4gIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5cyhwYXJhbXM6IHsgbXBjdjFVc2VyS2V5U2hhcmU6IHN0cmluZzsgbXBjdjFCYWNrdXBLZXlTaGFyZTogc3RyaW5nIH0pOiB7XG4gICAgbXBjdjJVc2VyS2V5U2hhcmU6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGE7XG4gICAgbXBjdjJCYWNrdXBLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTtcbiAgfSB7XG4gICAgY29uc3QgbXBjID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgeGlMaXN0ID0gW1xuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgxKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMiksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDMpLCAzMikpLFxuICAgIF07XG4gICAgcmV0dXJuIHtcbiAgICAgIG1wY3YyVXNlcktleVNoYXJlOiBFY2RzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHBhcmFtcy5tcGN2MVVzZXJLZXlTaGFyZSxcbiAgICAgICAgbXBjdjFQYXJ0eUluZGV4OiAxLFxuICAgICAgICB4aUxpc3QsXG4gICAgICAgIG1wYyxcbiAgICAgIH0pLFxuICAgICAgbXBjdjJCYWNrdXBLZXlTaGFyZTogRWNkc2FNUEN2MlV0aWxzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KHtcbiAgICAgICAgbXBjdjFQYXJ0eUtleVNoYXJlOiBwYXJhbXMubXBjdjFCYWNrdXBLZXlTaGFyZSxcbiAgICAgICAgbXBjdjFQYXJ0eUluZGV4OiAyLFxuICAgICAgICB4aUxpc3QsXG4gICAgICAgIG1wYyxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldHJvZml0IGRhdGEgZnJvbSBNUEN2MSBrZXkgc2hhcmUuXG4gICAqIEBwYXJhbSBtcGN2MVBhcnR5S2V5U2hhcmVcbiAgICogQHBhcmFtIG1wY3YxUGFydHlJbmRleFxuICAgKiBAcGFyYW0geGlMaXN0XG4gICAqIEBwYXJhbSBtcGNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHN0YXRpYyBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgbXBjdjFQYXJ0eUtleVNoYXJlLFxuICAgIG1wY3YxUGFydHlJbmRleCxcbiAgICB4aUxpc3QsXG4gICAgbXBjLFxuICB9OiB7XG4gICAgbXBjdjFQYXJ0eUtleVNoYXJlOiBzdHJpbmc7XG4gICAgbXBjdjFQYXJ0eUluZGV4OiBudW1iZXI7XG4gICAgeGlMaXN0OiBudW1iZXJbXVtdO1xuICAgIG1wYzogRWNkc2E7XG4gIH0pOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhIHtcbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWw6IEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShtcGN2MVBhcnR5S2V5U2hhcmUpO1xuICAgIGxldCBrZXlDb21iaW5lZDogS2V5Q29tYmluZWQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChtcGN2MVBhcnR5SW5kZXgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsICdVc2VyIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSBiYWNrdXAgTlNoYXJlLicpO1xuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLCAnQml0R28gTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIHVzZXIgTlNoYXJlLicpO1xuICAgICAgICBrZXlDb21iaW5lZCA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLFxuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSxcbiAgICAgICAgXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsICdVc2VyIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSBiYWNrdXAgTlNoYXJlLicpO1xuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLCAnQml0R28gTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIHVzZXIgTlNoYXJlLicpO1xuICAgICAgICBrZXlDb21iaW5lZCA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsICdVc2VyIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSBiYWNrdXAgTlNoYXJlLicpO1xuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSwgJ0JhY2t1cCBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLFxuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gICAgICAgIF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudCBpbmRleCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgeFNoYXJlOiBrZXlDb21iaW5lZC54U2hhcmUsXG4gICAgICB4aUxpc3Q6IHhpTGlzdCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRVc2VyS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxuICAgIGVuY3J5cHRpb25TZXNzaW9uPzoge1xuICAgICAgZW5jcnlwdChwbGFpbnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAgIGRlY3J5cHQoY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgZGVzdHJveSgpOiB2b2lkO1xuICAgIH0sXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBlbnRlcnByaXNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uU2Vzc2lvbj86IHtcbiAgICAgIGVuY3J5cHQocGxhaW50ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZWNyeXB0KGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAgIGRlc3Ryb3koKTogdm9pZDtcbiAgICB9LFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb25cbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBlbmNyeXB0aW9uU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckFuZEJhY2t1cFNlc3Npb24obTogbnVtYmVyLCBuOiBudW1iZXIsIHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkKSB7XG4gICAgaWYgKHJldHJvZml0KSB7XG4gICAgICBjb25zdCByZXRyb2ZpdERhdGEgPSB0aGlzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5cyh7XG4gICAgICAgIG1wY3YxVXNlcktleVNoYXJlOiByZXRyb2ZpdC5kZWNyeXB0ZWRVc2VyS2V5LFxuICAgICAgICBtcGN2MUJhY2t1cEtleVNoYXJlOiByZXRyb2ZpdC5kZWNyeXB0ZWRCYWNrdXBLZXksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdXNlclNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCB1bmRlZmluZWQsIHJldHJvZml0RGF0YS5tcGN2MlVzZXJLZXlTaGFyZSk7XG4gICAgICBjb25zdCBiYWNrdXBTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCB1bmRlZmluZWQsIHJldHJvZml0RGF0YS5tcGN2MkJhY2t1cEtleVNoYXJlKTtcblxuICAgICAgcmV0dXJuIHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGNvbnN0IGJhY2t1cFNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuXG4gICAgcmV0dXJuIHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbjogc3RyaW5nKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgY29tbW9uS2V5Y2hhaW4pO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgdXNlckdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IERrbHNUeXBlcy5BdXRoRW5jTWVzc2FnZXMgJiB7IHdhbGxldElkPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihcbiAgICAgIEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgcGF5bG9hZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMihcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHNlc3Npb25JZCwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kM0J5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHNlc3Npb25JZCwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFY2RzYU1QQ3YyS2V5R2VuU2VuZEZuPE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+LFxuICAgIHVzZXJHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzICYgeyB3YWxsZXRJZD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUik/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KHVzZXJNc2cxLCAnVXNlciBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzEgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2cxLCAnQmFja3VwIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogeyBmcm9tOiAwLCAuLi51c2VyTXNnMSB9LFxuICAgICAgYmFja3VwTXNnMTogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2cxIH0sXG4gICAgICB3YWxsZXRJZDogcGF5bG9hZC53YWxsZXRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlck1zZzIsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLmNvbW1pdG1lbnQsICdVc2VyIHRvIEJpdGdvIGNvbW1pdG1lbnQgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyTXNnMi5jb21taXRtZW50KSwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzIgPSBwYXlsb2FkLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwTXNnMiwgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLmNvbW1pdG1lbnQsICdCYWNrdXAgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cE1zZzIuY29tbWl0bWVudCksICdCYWNrdXAgdG8gQml0Z28gY29tbWl0bWVudCBpcyByZXF1aXJlZCcpO1xuXG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMiddLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjoge1xuICAgICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAgIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgICBzaWduYXR1cmU6IHVzZXJNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiB1c2VyTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgdXNlckNvbW1pdG1lbnQyOiB1c2VyTXNnMi5jb21taXRtZW50LFxuICAgICAgYmFja3VwTXNnMjoge1xuICAgICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogYmFja3VwTXNnMi5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogYmFja3VwTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgYmFja3VwQ29tbWl0bWVudDI6IGJhY2t1cE1zZzIuY29tbWl0bWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQzQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzMsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlck1zZzQgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzQsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzQsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjMnXSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzM6IHsgZnJvbTogMCwgdG86IDIsIC4uLnVzZXJNc2czIH0sXG4gICAgICBiYWNrdXBNc2czOiB7IGZyb206IDEsIHRvOiAyLCAuLi5iYWNrdXBNc2czIH0sXG4gICAgICB1c2VyTXNnNDogeyBmcm9tOiAwLCAuLi51c2VyTXNnNCB9LFxuICAgICAgYmFja3VwTXNnNDogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2c0IH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5tcGN2MlBhcnR5SWQgLSBwYXJ0eSBpZCBmb3IgdGhlIHNpZ25lciBpbnZvbHZlZCBpbiB0aGlzIG1wY3YyIHJlcXVlc3QgKGVpdGhlciAwIGZvciB1c2VyIG9yIDEgZm9yIGJhY2t1cClcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnRTb3VyY2UgLSBvcHRpb25hbDsgdXNlIFRzc1R4UmVjaXBpZW50U291cmNlLkV4cGxpY2l0IHdpdGggYSBub24tZW1wdHkgdHhQYXJhbXMucmVjaXBpZW50c1xuICAgKiAgIGxpc3Qgd2hlbiB5b3Ugd2FudCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgcGFzc2luZyByZWNpcGllbnQgZGV0YWlscyBhdCBjb21waWxlIHRpbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUc3NTaWduVHhSZXF1ZXN0UGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIGxldCBzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyh0cnVlLCBwYXJhbXMucmVxSWQsIHR4UmVxdWVzdC5lbnRlcnByaXNlSWQpO1xuXG4gICAgaWYgKCFiaXRnb0dwZ1B1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuXG4gICAgICBpZiAoXG4gICAgICAgICdyZWNpcGllbnRTb3VyY2UnIGluIHBhcmFtcyAmJlxuICAgICAgICBwYXJhbXMucmVjaXBpZW50U291cmNlID09PSBUc3NUeFJlY2lwaWVudFNvdXJjZS5FeHBsaWNpdCAmJlxuICAgICAgICAhcGFyYW1zLnR4UGFyYW1zPy5yZWNpcGllbnRzPy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ3JlY2lwaWVudFNvdXJjZSBcImV4cGxpY2l0XCIgcmVxdWlyZXMgdHhQYXJhbXMucmVjaXBpZW50cyB3aXRoIGF0IGxlYXN0IG9uZSByZWNpcGllbnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgSUNQIGFuZCBBdmFsYW5jaGUgYXRvbWljIHRyYW5zYWN0aW9ucywgc2lnbmFibGVIZXggaXMgYSBkaWdlc3QgKG5vdFxuICAgICAgLy8gYSBwYXJzZWFibGUgdHJhbnNhY3Rpb24pLiAgUGFzcyBzZXJpYWxpemVkVHhIZXggc28gdmVyaWZ5VHJhbnNhY3Rpb24gY2FuXG4gICAgICAvLyBwYXJzZSB0aGUgZnVsbCB0cmFuc2FjdGlvbiBieXRlcy5cbiAgICAgIC8vIC0gSUNQOiBzaWduYWJsZUhleCBpcyBhIGhhc2g7IHNlcmlhbGl6ZWRUeEhleCBpcyB0aGUgQ0JPUi1lbmNvZGVkIHR4LlxuICAgICAgLy8gLSBBdmFsYW5jaGUgYXRvbWljIChGTFJQL0ZMUiBjcm9zcy1jaGFpbik6IHNpZ25hYmxlSGV4IGlzIFNIQS0yNTYodHhCb2R5KTtcbiAgICAgIC8vICAgc2VyaWFsaXplZFR4SGV4IGlzIHRoZSBQVk0vRVZNIGF0b21pYyB0eCAoY29kZWMgcHJlZml4IDB4MDAwMCkuXG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGNvaW5zLCBzaWduYWJsZUhleCBJUyB0aGUgdW5zaWduZWQgdHJhbnNhY3Rpb24gKGUuZy4gUkxQIGJ5dGVzKS5cbiAgICAgIGNvbnN0IGlzSWNwID0gdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mYW1pbHkgPT09ICdpY3AnO1xuICAgICAgY29uc3QgaXNQcmVIYXNoZWQgPSBzaG91bGRVc2VQcmVIYXNoZWRTaWduYWJsZSh0aGlzLmJhc2VDb2luLCB1bnNpZ25lZFR4KTtcbiAgICAgIGlmIChpc0ljcCB8fCBpc1ByZUhhc2hlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCwgdHhJbmZvOiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHBhcmFtcy50eFBhcmFtcyksXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHBhcmFtcy50eFBhcmFtcyksXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHVuc2lnbmVkVHguc2lnbmFibGVIZXg7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBzZXJpYWxpemVkVHhIZXggPSB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleDtcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5kZXJpdmF0aW9uUGF0aCB8fCAnbS8wJztcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIEF2YWxhbmNoZSBhdG9taWMgdHJhbnNhY3Rpb25zIChjcm9zcy1jaGFpbiBleHBvcnQvaW1wb3J0IGJldHdlZW5cbiAgICAvLyBDLWNoYWluIGFuZCBQLWNoYWluKSwgc2lnbmFibGVIZXggaXMgYWxyZWFkeSBTSEEtMjU2KHR4Qm9keSkg4oCUIGEgMzItYnl0ZVxuICAgIC8vIHByZS1oYXNoZWQgZGlnZXN0LiAgVXNlIGl0IGRpcmVjdGx5IGFzIHRoZSBES0xTIG1lc3NhZ2UgaGFzaCBpbnN0ZWFkIG9mXG4gICAgLy8gYXBwbHlpbmcgdGhlIGNvaW4ncyBoYXNoIGZ1bmN0aW9uIChrZWNjYWsyNTYgZm9yIEVWTSBjb2lucykuXG4gICAgLy8gU2FtZSBsb2dpYyBhcyBnZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGggKGV4dGVybmFsIHNpZ25lciBwYXRoKS5cbiAgICBjb25zdCBoYXNoQnVmZmVyID0gdGhpcy5nZXRNcGN2Mkhhc2hCdWZmZXIoc2VyaWFsaXplZFR4SGV4LCB0eE9yTWVzc2FnZVRvU2lnbiwgYnVmZmVyQ29udGVudCk7XG4gICAgY29uc3Qgb3RoZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2coXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkICE9PSB1bmRlZmluZWQgPyBwYXJhbXMubXBjdjJQYXJ0eUlkIDogMCxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgaGFzaEJ1ZmZlclxuICAgICk7XG4gICAgY29uc3QgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEgPSBhd2FpdCBvdGhlclNpZ25lci5pbml0KCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKFxuICAgICAgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG5cbiAgICBsZXQgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgbGV0IGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMjogYW55O1xuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMiA9IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyID0gbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IEpTT04ucGFyc2UoXG4gICAgICBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDJbYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMUFuZDIgPSBhd2FpdCB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lKFxuICAgICAgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG5cbiAgICAvKiogUm91bmQgMiAqKi9cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMik7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IGRlc2VyaWFsaXplZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMgPSBvdGhlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDIsXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXNbdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIC8qKiBSb3VuZCAzICoqL1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUoXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0LFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG4gICAgLy8gU3VibWl0IGZvciBmaW5hbCBzaWduYXR1cmUgc2hhcmUgY29tYmluZVxuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWVdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0LndhbGxldElkLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZm9ybWF0dGluZyB1dGlsc1xuICBmb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYnJvYWRjYXN0TWVzc2FnZTogTVBDdjJCcm9hZGNhc3RNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGJyb2FkY2FzdE1lc3NhZ2UuZnJvbSxcbiAgICAgIHBheWxvYWQ6IHsgbWVzc2FnZTogYnJvYWRjYXN0TWVzc2FnZS5tZXNzYWdlLCBzaWduYXR1cmU6IGJyb2FkY2FzdE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdFAyUE1lc3NhZ2UocDJwTWVzc2FnZTogTVBDdjJQMlBNZXNzYWdlLCBjb21taXRtZW50Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBheWxvYWQ6IHsgZW5jcnlwdGVkTWVzc2FnZTogcDJwTWVzc2FnZS5lbmNyeXB0ZWRNZXNzYWdlLCBzaWduYXR1cmU6IHAycE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgICBmcm9tOiBwMnBNZXNzYWdlLmZyb20sXG4gICAgICB0bzogcDJwTWVzc2FnZS50byxcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBwcml2YXRlIHV0aWxzXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhhc2ggc3RyaW5nIGFuZCBkZXJpdmF0aW9uIHBhdGggZnJvbSB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtUeFJlcXVlc3R9IHR4UmVxdWVzdCAtIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge1JlcXVlc3RUeXBlfSByZXF1ZXN0VHlwZSAtIHRoZSByZXF1ZXN0IHR5cGVcbiAgICogQHJldHVybnMge3sgaGFzaEJ1ZmZlcjogQnVmZmVyOyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIH19IC0gdGhlIGhhc2ggc3RyaW5nIGFuZCBkZXJpdmF0aW9uIHBhdGhcbiAgICovXG4gIHByaXZhdGUgZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKFxuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IHsgaGFzaEJ1ZmZlcjogQnVmZmVyOyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIH0ge1xuICAgIGxldCB0eFRvU2lnbjogc3RyaW5nO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICAgIGxldCBzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBjb25zdCBzaWduYWJsZVR4ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCwgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIHR4VG9TaWduID0gc2lnbmFibGVUeC5zaWduYWJsZUhleDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gc2lnbmFibGVUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICAgIHNlcmlhbGl6ZWRUeEhleCA9IHNpZ25hYmxlVHguc2VyaWFsaXplZFR4SGV4O1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICAgIHRocm93IG5ldyBFcnJvcignTVBDdjIgbWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzaEJ1ZmZlciA9IHRoaXMuZ2V0TXBjdjJIYXNoQnVmZmVyKHNlcmlhbGl6ZWRUeEhleCwgdHhUb1NpZ24sIEJ1ZmZlci5mcm9tKHR4VG9TaWduLCAnaGV4JykpO1xuICAgIHJldHVybiB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIERLTFMgbWVzc2FnZSBoYXNoIGZvciBNUEN2MiBzaWduaW5nLlxuICAgKiBGb3IgcHJlLWhhc2hlZCBzaWduYWJsZSBtYXRlcmlhbCAoQXZhbGFuY2hlIGF0b21pYyB0eHMpLCBzaWduYWJsZUhleCBpc1xuICAgKiBhbHJlYWR5IFNIQS0yNTYodHhCb2R5KSBhbmQgaXMgdXNlZCBkaXJlY3RseS4gT3RoZXJ3aXNlIHRoZSBjb2luIGhhc2hcbiAgICogZnVuY3Rpb24gaXMgYXBwbGllZCAoa2VjY2FrMjU2IGZvciBFVk0gY29pbnMgYnkgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIGdldE1wY3YySGFzaEJ1ZmZlcihzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2lnbmFibGVIZXg6IHN0cmluZywgYnVmZmVyQ29udGVudDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCB1bnNpZ25lZFR4OiBTaWduYWJsZVRyYW5zYWN0aW9uID0ge1xuICAgICAgc2VyaWFsaXplZFR4SGV4OiBzZXJpYWxpemVkVHhIZXggPz8gJycsXG4gICAgICBzaWduYWJsZUhleCxcbiAgICB9O1xuICAgIGlmIChzZXJpYWxpemVkVHhIZXggJiYgc2hvdWxkVXNlUHJlSGFzaGVkU2lnbmFibGUodGhpcy5iYXNlQ29pbiwgdW5zaWduZWRUeCkpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYnVmZmVyQ29udGVudC5sZW5ndGggPT09IDMyLFxuICAgICAgICBgQXZhbGFuY2hlIHByZS1oYXNoZWQgc2lnbmFibGVIZXggbXVzdCBiZSAzMiBieXRlcywgZ290ICR7YnVmZmVyQ29udGVudC5sZW5ndGh9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBidWZmZXJDb250ZW50O1xuICAgIH1cblxuICAgIGxldCBoYXNoOiBIYXNoO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKSBhcyBIYXNoO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaC51cGRhdGUoYnVmZmVyQ29udGVudCkuZGlnZXN0KCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBleHRlcm5hbCBzaWduZXJcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIHNpZ25FY2RzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCwgcmVxSWQgfSA9IHBhcmFtcztcbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcblxuICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICBhc3NlcnQoXG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgsXG4gICAgICAnT25seSB0cmFuc2FjdGlvbiBzaWduaW5nIGlzIHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZVxuICAgICk7XG5cbiAgICBpZiAodHlwZW9mIHR4UmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCwgcmVxSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IHR4UmVxdWVzdDtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhcbiAgICAgIHRydWUsXG4gICAgICBwYXJhbXMucmVxSWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC5lbnRlcnByaXNlSWRcbiAgICApO1xuXG4gICAgaWYgKCFiaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgLy8gcm91bmQgMVxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfSA9XG4gICAgICBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQgfSk7XG4gICAgY29uc3Qgcm91bmQxVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgLy8gcm91bmQgMlxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQxVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDJUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQyXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyAmJiByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcyxcbiAgICAgICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDNcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMlR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kM10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcmVxSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0LCBlbmNyeXB0ZWRQcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QpO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7aGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyl9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSA9IGF3YWl0IHVzZXJTaWduZXIuaW5pdCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB1c2VyU2lnbmVyLmdldFNlc3Npb24oKTtcbiAgICBjb25zdCB1c2VyR3BnUHViS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG5cbiAgICBjb25zdCB1c2VWMiA9IGVuY3J5cHRlZFBydiAhPT0gdW5kZWZpbmVkICYmIGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRQcnYpO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHNlc3Npb25EYXRhLFxuICAgICAgICAgIGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgICBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICBpbnB1dDogc2Vzc2lvbkRhdGEsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgaW5wdXQ6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDJTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDI6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPVxuICAgICAgcGFyYW1zO1xuXG4gICAgY29uc3QgeyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0KTtcbiAgICBjb25zdCBhZGF0YSA9IGAke2hhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VWMiA9IGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uKTtcblxuICAgIGNvbnN0IHsgYml0Z29HcGdLZXksIHVzZXJHcGdQcnZLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YSxcbiAgICAgIEVjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuICAgIGNvbnN0IHVzZXJHcGdLZXk6IHBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+ID0ge1xuICAgICAgcHJpdmF0ZUtleTogdXNlckdwZ1BydktleS5hcm1vcigpLFxuICAgICAgcHVibGljS2V5OiB1c2VyR3BnUHJ2S2V5LnRvUHVibGljKCkuYXJtb3IoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucz8uWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDEgdHhSZXF1ZXN0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gSlNPTi5wYXJzZShcbiAgICAgIHNpZ25hdHVyZVNoYXJlc1tzaWduYXR1cmVTaGFyZXMubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZE9uZShcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ0tleVxuICAgICk7XG5cbiAgICBsZXQgcm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgcm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHsgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3VuZDFTZXNzaW9uID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlQWRhdGEoYWRhdGEsIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIEVjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEUpO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBhd2FpdCB1c2VyU2lnbmVyLnNldFNlc3Npb24ocm91bmQxU2Vzc2lvbik7XG5cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxKTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyID0gdXNlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzID0gdXNlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMiA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28oXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyLFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ0tleVxuICAgICk7XG4gICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB1c2VyU2lnbmVyLmdldFNlc3Npb24oKTtcblxuICAgIGlmICh1c2VWMikge1xuICAgICAgY29uc3QgZW5jU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gYXdhaXQgZW5jU2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHNlc3Npb25EYXRhLFxuICAgICAgICAgIGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5jU2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgIGlucHV0OiBzZXNzaW9uRGF0YSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyLFxuICAgICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kM1NoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMzogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIGFzc2VydCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHR4UmVxdWVzdC50cmFuc2FjdGlvbnMubGVuZ3RoID09PSAxLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtoYXNoQnVmZmVyLnRvU3RyaW5nKCdoZXgnKX06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlVjIgPSBpc1YyRW52ZWxvcGUoZW5jcnlwdGVkUm91bmQyU2Vzc2lvbik7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZXG4gICAgKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5OiBwZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPiA9IHtcbiAgICAgIHByaXZhdGVLZXk6IHVzZXJHcGdQcnZLZXkuYXJtb3IoKSxcbiAgICAgIHB1YmxpY0tleTogdXNlckdwZ1BydktleS50b1B1YmxpYygpLmFybW9yKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/LlswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICBzaWduYXR1cmVTaGFyZXNbc2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGxldCByb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICByb3VuZDJTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0QXN5bmMoeyBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvdW5kMlNlc3Npb24gPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgRWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMl9TVEFURSk7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgZGVyaXZhdGlvblBhdGgsIGhhc2hCdWZmZXIpO1xuICAgIGF3YWl0IHVzZXJTaWduZXIuc2V0U2Vzc2lvbihyb3VuZDJTZXNzaW9uKTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQgPSB1c2VyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0LCB1c2VyR3BnS2V5LCBiaXRnb0dwZ0tleSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cblxuLyoqXG4gKiBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbiBpbiBmYXZvciBvZiBpc0dHMThTaWduaW5nTWF0ZXJpYWxBc3luYyBvbmNlIHYyIGVuY3J5cHRpb24gaXMgZGVmYXVsdFxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBrZXkgc2hhcmUsIHdoZW4gZGVjcnlwdGVkLCBjb250YWlucyB2YWxpZCBHRzE4IHNpZ25pbmcgbWF0ZXJpYWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVNoYXJlIC0gVGhlIGVuY3J5cHRlZCBrZXkgc2hhcmUgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXkgc2hhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFJldHVybnMgYHRydWVgIGlmIHRoZSBkZWNyeXB0ZWQgZGF0YSBjb250YWlucyB2YWxpZCBzaWduaW5nIG1hdGVyaWFsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR0cxOFNpZ25pbmdNYXRlcmlhbChrZXlTaGFyZTogc3RyaW5nLCB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgcHJ2ID0gc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGtleVNoYXJlKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBydik7XG4gICAgcmV0dXJuIChcbiAgICAgIHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUgJiZcbiAgICAgIHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSAmJlxuICAgICAgKHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlIHx8IHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBpc0dHMThTaWduaW5nTWF0ZXJpYWx9IHdpdGggdjEvdjIgYXV0by1kZXRlY3QgZGVjcnlwdCB2aWEgYGJpdGdvLmRlY3J5cHRBc3luY2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0dHMThTaWduaW5nTWF0ZXJpYWxBc3luYyhcbiAga2V5U2hhcmU6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBiaXRnbzogQml0R29CYXNlXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0QXN5bmMoeyBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleVNoYXJlIH0pO1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICByZXR1cm4gKFxuICAgICAgc2lnbmluZ01hdGVyaWFsLnBTaGFyZSAmJlxuICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlICYmXG4gICAgICAoc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUgfHwgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSlcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgTVBDIHYyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSB0aGUgcHJvdmlkZWQgdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXMuXG4gKiBAcGFyYW0gZW5jcnlwdGVkVXNlcktleSBlbmNyeXB0ZWQgZ2cxOCBvciBNUEN2MiB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEJhY2t1cEtleSBlbmNyeXB0ZWQgZ2cxOCBvciBNUEN2MiBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzd29yZCBmb3IgdXNlciBhbmQgYmFja3VwIGtleVxuICogQHBhcmFtIGJpdGdvIEJpdEdvIGluc3RhbmNlIGZvciB2MS92MiBhdXRvLWRldGVjdCBkZWNyeXB0XG4gKiBAcmV0dXJucyBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlcyhcbiAgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8e1xuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZztcbn0+IHtcbiAgaWYgKGJpdGdvKSB7XG4gICAgaWYgKGF3YWl0IGlzR0cxOFNpZ25pbmdNYXRlcmlhbEFzeW5jKGVuY3J5cHRlZFVzZXJLZXksIHdhbGxldFBhc3NwaHJhc2UsIGJpdGdvKSkge1xuICAgICAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tR0cxOChlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UsIGJpdGdvKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UsIGJpdGdvKTtcbiAgfVxuICBpZiAoaXNHRzE4U2lnbmluZ01hdGVyaWFsKGVuY3J5cHRlZFVzZXJLZXksIHdhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tR0cxOChlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UpO1xuICB9XG4gIHJldHVybiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoZW5jcnlwdGVkVXNlcktleSwgZW5jcnlwdGVkQmFja3VwS2V5LCB3YWxsZXRQYXNzcGhyYXNlKTtcbn1cblxuLyoqXG4gKiBTaWducyBhIG1lc3NhZ2UgaGFzaCB1c2luZyBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZUhhc2hcbiAqIEBwYXJhbSB7QnVmZmVyfSB1c2VyS2V5U2hhcmVcbiAqIEBwYXJhbSB7QnVmZmVyfSBiYWNrdXBLZXlTaGFyZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1vbktleUNoYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IHJlY2lkOiBudW1iZXIsIHI6IHN0cmluZywgczogc3RyaW5nLCB5OiBzdHJpbmcgfT59XG4gKlxuICogQGFzeW5jXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUmVjb3ZlcnlNcGNWMihcbiAgbWVzc2FnZUhhc2g6IEJ1ZmZlcixcbiAgdXNlcktleVNoYXJlOiBCdWZmZXIsXG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIsXG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmdcbik6IFByb21pc2U8e1xuICByZWNpZDogbnVtYmVyO1xuICByOiBzdHJpbmc7XG4gIHM6IHN0cmluZztcbiAgeTogc3RyaW5nO1xufT4ge1xuICBjb25zdCB1c2VyRHNnID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgJ20vMCcsIG1lc3NhZ2VIYXNoKTtcbiAgY29uc3QgYmFja3VwRHNnID0gbmV3IERrbHNEc2cuRHNnKGJhY2t1cEtleVNoYXJlLCAxLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuXG4gIGNvbnN0IHNpZ25hdHVyZVN0cmluZyA9IERrbHNVdGlscy52ZXJpZnlBbmRDb252ZXJ0RGtsc1NpZ25hdHVyZShcbiAgICBtZXNzYWdlSGFzaCxcbiAgICAoYXdhaXQgRGtsc1V0aWxzLmV4ZWN1dGVUaWxsUm91bmQoNSwgdXNlckRzZywgYmFja3VwRHNnKSkgYXMgRGtsc1R5cGVzLkRlc2VyaWFsaXplZERrbHNTaWduYXR1cmUsXG4gICAgY29tbW9uS2V5Q2hhaW4sXG4gICAgJ20vMCcsXG4gICAgdW5kZWZpbmVkLFxuICAgIGZhbHNlXG4gICk7XG4gIGNvbnN0IHNpZ1BhcnRzID0gc2lnbmF0dXJlU3RyaW5nLnNwbGl0KCc6Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICByZWNpZDogcGFyc2VJbnQoc2lnUGFydHNbMF0sIDEwKSxcbiAgICByOiBzaWdQYXJ0c1sxXSxcbiAgICBzOiBzaWdQYXJ0c1syXSxcbiAgICB5OiBzaWdQYXJ0c1szXSxcbiAgfTtcbn1cblxuLy8gI3JlZ2lvbiBwcml2YXRlIHV0aWxzXG5cbi8qKlxuICogR2V0IHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqIEBwYXJhbSBlbmNyeXB0ZWRHRzE4VXNlcktleSBlbmNyeXB0ZWQgZ2cxOCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThCYWNrdXBLZXkgZW5jcnlwdGVkIGdnMTggYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3dvcmQgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlcbiAqIEByZXR1cm5zIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tR0cxOChcbiAgZW5jcnlwdGVkR0cxOFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkR0cxOEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTx7XG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyO1xuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyO1xuICBjb21tb25LZXlDaGFpbjogc3RyaW5nO1xufT4ge1xuICBjb25zdCBbdXNlcktleUNvbWJpbmVkLCBiYWNrdXBLZXlDb21iaW5lZF0gPSBhd2FpdCBnZXRLZXlDb21iaW5lZEZyb21Uc3NLZXlTaGFyZXMoXG4gICAgZW5jcnlwdGVkR0cxOFVzZXJLZXksXG4gICAgZW5jcnlwdGVkR0cxOEJhY2t1cEtleSxcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIGJpdGdvXG4gICk7XG4gIGNvbnN0IHJldHJvZml0RGF0YUE6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiB1c2VyS2V5Q29tYmluZWQueFNoYXJlLFxuICB9O1xuICBjb25zdCByZXRyb2ZpdERhdGFCOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZTogYmFja3VwS2V5Q29tYmluZWQueFNoYXJlLFxuICB9O1xuICBjb25zdCBbdXNlciwgYmFja3VwXSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZTJvZjJLZXlTaGFyZXMocmV0cm9maXREYXRhQSwgcmV0cm9maXREYXRhQik7XG5cbiAgY29uc3QgdXNlcktleVNoYXJlID0gdXNlci5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IGJhY2t1cC5nZXRLZXlTaGFyZSgpO1xuICByZXR1cm4ge1xuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBjb21tb25LZXlDaGFpbjogRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKGJhY2t1cEtleVNoYXJlKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gdGhlIHByb3ZpZGVkIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNyeXB0ZWRNUEN2MlVzZXJLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNyeXB0ZWRNUEN2MkJhY2t1cEtleVxuICogQHBhcmFtIHtzdHJpbmd9IFt3YWxsZXRQYXNzcGhyYXNlXSAtIFRoZSBwYXNzcGhyYXNlIHVzZWQgdG8gZGVjcnlwdCB0aGUga2V5IHNoYXJlc1xuICogQHJldHVybnMge1Byb21pc2U8eyB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLCBiYWNrdXBLZXlTaGFyZTogS2V5U2hhcmUsIGNvbW1vbktleUNoYWluOiBzdHJpbmcgfT59XG4gKlxuICogQGFzeW5jXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShcbiAgZW5jcnlwdGVkTVBDdjJVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZE1QQ3YyQmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPHtcbiAgdXNlcktleVNoYXJlOiBCdWZmZXI7XG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXI7XG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmc7XG59PiB7XG4gIGxldCB1c2VyQ29tcHJlc3NlZFBydjogQnVmZmVyO1xuICBsZXQgYmFrY3VwQ29tcHJlc3NlZFBydjogQnVmZmVyO1xuICBpZiAoYml0Z28pIHtcbiAgICB1c2VyQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKFxuICAgICAgYXdhaXQgYml0Z28uZGVjcnlwdEFzeW5jKHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBlbmNyeXB0ZWRNUEN2MlVzZXJLZXkgfSksXG4gICAgICAnYmFzZTY0J1xuICAgICk7XG4gICAgYmFrY3VwQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKFxuICAgICAgYXdhaXQgYml0Z28uZGVjcnlwdEFzeW5jKHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBlbmNyeXB0ZWRNUEN2MkJhY2t1cEtleSB9KSxcbiAgICAgICdiYXNlNjQnXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB1c2VyQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRNUEN2MlVzZXJLZXkpLCAnYmFzZTY0Jyk7XG4gICAgYmFrY3VwQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRNUEN2MkJhY2t1cEtleSksICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJQcnZKU09OOiBEa2xzVHlwZXMuUmVkdWNlZEtleVNoYXJlID0gRGtsc1R5cGVzLmdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUodXNlckNvbXByZXNzZWRQcnYpO1xuICBjb25zdCBiYWNrdXBQcnZKU09OOiBEa2xzVHlwZXMuUmVkdWNlZEtleVNoYXJlID0gRGtsc1R5cGVzLmdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUoYmFrY3VwQ29tcHJlc3NlZFBydik7XG4gIGNvbnN0IHVzZXJLZXlSZXRyb2ZpdDogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9IHtcbiAgICB4U2hhcmU6IHtcbiAgICAgIHg6IEJ1ZmZlci5mcm9tKHVzZXJQcnZKU09OLnBydikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeTogQnVmZmVyLmZyb20odXNlclBydkpTT04ucHViKS50b1N0cmluZygnaGV4JyksXG4gICAgICBjaGFpbmNvZGU6IEJ1ZmZlci5mcm9tKHVzZXJQcnZKU09OLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9LFxuICAgIHhpTGlzdDogdXNlclBydkpTT04ueExpc3Quc2xpY2UoMCwgMiksXG4gIH07XG4gIGNvbnN0IGJhY2t1cEtleVJldHJvZml0OiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZToge1xuICAgICAgeDogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5wcnYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHk6IEJ1ZmZlci5mcm9tKGJhY2t1cFBydkpTT04ucHViKS50b1N0cmluZygnaGV4JyksXG4gICAgICBjaGFpbmNvZGU6IEJ1ZmZlci5mcm9tKGJhY2t1cFBydkpTT04ucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH0sXG4gICAgeGlMaXN0OiBiYWNrdXBQcnZKU09OLnhMaXN0LnNsaWNlKDAsIDIpLFxuICB9O1xuICBjb25zdCBbdXNlciwgYmFja3VwXSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZTJvZjJLZXlTaGFyZXModXNlcktleVJldHJvZml0LCBiYWNrdXBLZXlSZXRyb2ZpdCk7XG4gIGNvbnN0IHVzZXJLZXlTaGFyZSA9IHVzZXIuZ2V0S2V5U2hhcmUoKTtcbiAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBiYWNrdXAuZ2V0S2V5U2hhcmUoKTtcbiAgY29uc3QgY29tbW9uS2V5Q2hhaW4gPSBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4odXNlcktleVNoYXJlKTtcbiAgcmV0dXJuIHsgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4gfTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb21iaW5lZCBrZXkgZm9yIEdHMThcbiAqIEBwYXJhbSBlbmNyeXB0ZWRHRzE4VXNlcktleSBlbmNyeXB0ZWQgR0cxOCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThCYWNrdXBLZXkgZW5jcnlwdGVkIEdHMTggYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2Ugd2FsbGV0IHBhc3NwaHJhc2VcbiAqIEByZXR1cm5zIGtleSBzaGFyZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0S2V5Q29tYmluZWRGcm9tVHNzS2V5U2hhcmVzKFxuICBlbmNyeXB0ZWRHRzE4VXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPFtFQ0RTQU1ldGhvZFR5cGVzLktleUNvbWJpbmVkLCBFQ0RTQU1ldGhvZFR5cGVzLktleUNvbWJpbmVkXT4ge1xuICBsZXQgYmFja3VwUHJ2O1xuICBsZXQgdXNlclBydjtcbiAgdHJ5IHtcbiAgICBpZiAoYml0Z28pIHtcbiAgICAgIGJhY2t1cFBydiA9IGF3YWl0IGJpdGdvLmRlY3J5cHRBc3luYyh7IHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogZW5jcnlwdGVkR0cxOEJhY2t1cEtleSB9KTtcbiAgICAgIHVzZXJQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0QXN5bmMoeyBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGVuY3J5cHRlZEdHMThVc2VyS2V5IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWNrdXBQcnYgPSBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkR0cxOEJhY2t1cEtleSk7XG4gICAgICB1c2VyUHJ2ID0gc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZEdHMThVc2VyS2V5KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgYmFja3VwIGtleWNoYWluOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHVzZXJQcnYpIGFzIEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsO1xuICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWw7XG5cbiAgaWYgKCF1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gIH1cblxuICBpZiAoIWJhY2t1cFNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhY2t1cCBrZXkgLSBtaXNzaW5nIHVzZXJOU2hhcmUnKTtcbiAgfVxuXG4gIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuXG4gIGNvbnN0IHVzZXJLZXlDb21iaW5lZCA9IE1QQy5rZXlDb21iaW5lKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSxcbiAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgXSk7XG4gIGNvbnN0IGJhY2t1cEtleUNvbWJpbmVkID0gTVBDLmtleUNvbWJpbmUoYmFja3VwU2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLFxuICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSxcbiAgXSk7XG4gIGlmIChcbiAgICB1c2VyS2V5Q29tYmluZWQueFNoYXJlLnkgIT09IGJhY2t1cEtleUNvbWJpbmVkLnhTaGFyZS55IHx8XG4gICAgdXNlcktleUNvbWJpbmVkLnhTaGFyZS5jaGFpbmNvZGUgIT09IGJhY2t1cEtleUNvbWJpbmVkLnhTaGFyZS5jaGFpbmNvZGVcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuICB9XG4gIHJldHVybiBbdXNlcktleUNvbWJpbmVkLCBiYWNrdXBLZXlDb21iaW5lZF07XG59XG5cbi8vICNlbmRyZWdpb25cbiJdfQ==
1049
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF5OUNBLHNEQWdCQztBQVVELDhEQWNDO0FBYUQsOENBOEJDO0FBM2lERCxvREFBeUc7QUFDekcsb0RBQTRCO0FBQzVCLG1DQUFnQztBQUVoQyw2Q0FBNkM7QUFDN0Msb0RBQXNDO0FBR3RDLHNEQVU2QjtBQUU3Qix5REFBZ0Q7QUFHaEQsc0NBQThEO0FBQzlELGdEQUEwRTtBQUMxRSw2Q0FBZ0Q7QUFDaEQsOERBTXVDO0FBRXZDLHFEQUF3RDtBQUN4RCw0Q0Flc0I7QUFDdEIsNERBQWtFO0FBQ2xFLGlDQUF3QztBQUN4QyxxRUFBNkY7QUFDN0YsNERBQThGO0FBQzlGLDRDQUEwRDtBQUUxRCxzREFBNkQ7QUFHN0QsTUFBYSxlQUFnQixTQUFRLHFCQUFjO0lBS2pELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsZUFBZSxDQUFDLE1BT3JCO1FBQ0MsTUFBTSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUUzRCxrRUFBa0U7UUFDbEUsb0VBQW9FO1FBQ3BFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sUUFBUSxHQUFHLGNBQWMsSUFBSSxJQUFJLENBQUMsc0JBQXNC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b250ZW50IjpbImltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXBpJztcbmltcG9ydCB7IGJpZ0ludFRvQnVmZmVyQkUsIERrbHNDb21tcywgRGtsc0RrZywgRGtsc0RzZywgRGtsc1R5cGVzLCBEa2xzVXRpbHMgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IEhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgY3JlYXRlS2VjY2FrSGFzaCBmcm9tICdrZWNjYWsnO1xuaW1wb3J0ICogYXMgcGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7XG4gIE1QQ3YyQnJvYWRjYXN0TWVzc2FnZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5TdGF0ZUVudW0sXG4gIE1QQ3YyUDJQTWVzc2FnZSxcbiAgTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmltcG9ydCB7IEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWInO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSwgV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCB7IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluL2lLZXljaGFpbnMnO1xuaW1wb3J0IHsgRUNEU0FNZXRob2RUeXBlcywgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzJztcbmltcG9ydCB7IHNlbmRTaWduYXR1cmVTaGFyZVYyLCBzZW5kVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi90eXBlc01QQ3YyJztcbmltcG9ydCB7XG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byxcbiAgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZE9uZSxcbiAgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byxcbn0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL2VjZHNhTVBDdjInO1xuaW1wb3J0IHsgS2V5Q29tYmluZWQgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvdHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7XG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHNzU2lnblR4UmVxdWVzdFBhcmFtc1dpdGhQcnYsXG4gIFRzc1R4UmVjaXBpZW50U291cmNlLFxuICBUeFJlcXVlc3QsXG4gIGlzVjJFbnZlbG9wZSxcbiAgU2lnbmFibGVUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IHNob3VsZFVzZVByZUhhc2hlZFNpZ25hYmxlIH0gZnJvbSAnLi4vcHJlSGFzaGVkU2lnbmFibGUnO1xuaW1wb3J0IHsgQmFzZUVjZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgRWNkc2FNUEN2MktleUdlblNlbmRGbiwgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSB9IGZyb20gJy4vZWNkc2FNUEN2MktleUdlblNlbmRlcic7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBpc0JpdGdvTXBjUHViS2V5IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2JpdGdvUHViS2V5cyc7XG5pbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gZnJvbSAnLi4vcmVjaXBpZW50VXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBFY2RzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzIH0gZnJvbSAnLi4vLi4vLi4vd2FsbGV0L2lXYWxsZXRzJztcblxuZXhwb3J0IGNsYXNzIEVjZHNhTVBDdjJVdGlscyBleHRlbmRzIEJhc2VFY2RzYVV0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZID0gJ0RLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURSA9ICdES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBES0xTMjNfU0lHTklOR19ST1VORDJfU1RBVEUgPSAnREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFJztcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAgIHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkO1xuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm87XG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbjtcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfSA9IHRoaXMuZ2V0VXNlckFuZEJhY2t1cFNlc3Npb24oMiwgMywgcGFyYW1zLnJldHJvZml0KTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBwdWJsaWMga2V5IGJhc2VkIG9uIHVzZXIvZW50ZXJwcmlzZSBmZWF0dXJlIGZsYWdzXG4gICAgLy8gSWYgaXQgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgcHVibGljIGtleSBmcm9tIHRoZSBjb25zdGFudHNcbiAgICBjb25zdCB7IG1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhwYXJhbXMuZW50ZXJwcmlzZSwgdHJ1ZSk7XG4gICAgY29uc3QgbXBjdjJLZXkgPSBtcGN2MlB1YmxpY0tleSA/PyB0aGlzLmJpdGdvTVBDdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KG1wY3YyS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gbXBjdjJLZXkuYXJtb3IoKTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICAvLyBFbnN1cmUgdGhlIHB1YmxpYyBrZXkgaXMgb25lIG9mIHRoZSBleHBlY3RlZCBCaXRHbyBwdWJsaWMga2V5cyB3aGVuIGluIHRlc3Qgb3IgcHJvZC5cbiAgICAgIGFzc2VydChpc0JpdGdvTXBjUHViS2V5KGJpdGdvUHVibGljR3BnS2V5LCAnbXBjdjInKSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBncGdLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICB9O1xuICAgIGNvbnN0IGJhY2t1cEdwZ1BydktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBncGdLZXk6IGJhY2t1cEdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYml0Z29HcGdQdWJLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBncGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LFxuICAgIH07XG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDFcbiAgICBjb25zdCB1c2VyUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgdXNlclNlc3Npb24uaW5pdERrZygpO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZyA9IGF3YWl0IGJhY2t1cFNlc3Npb24uaW5pdERrZygpO1xuXG4gICAgY29uc3Qgcm91bmQxU2VyaWFsaXplZE1lc3NhZ2VzID0gRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMUJyb2FkY2FzdE1zZywgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDFNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICByb3VuZDFTZXJpYWxpemVkTWVzc2FnZXMsXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSwgYml0Z29Ub0JhY2t1cE1zZzIsIGJpdGdvVG9Vc2VyTXNnMiB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdLZXkucHVibGljS2V5LFxuICAgICAgcGFyYW1zLnJldHJvZml0Py53YWxsZXRJZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnJvdW5kMU1lc3NhZ2VzLFxuICAgICAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy5yZXRyb2ZpdC53YWxsZXRJZCxcbiAgICAgICAgICB9XG4gICAgICAgIDogcm91bmQxTWVzc2FnZXNcbiAgICApO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgMlxuICAgIGNvbnN0IGJpdGdvUm91bmQxQnJvYWRjYXN0TWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFt0aGlzLmZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzEpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyA9IGJpdGdvUm91bmQxQnJvYWRjYXN0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZywgJ0JpdEdvIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQyUDJQTWVzc2FnZXMgPSB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbRGtsc1R5cGVzLmRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyksIGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyVG9CaXRnb01zZzIgPSB1c2VyUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Nc2cyLCAnVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzIgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZSh1c2VyVG9CaXRnb01zZzIpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQyUDJQTWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxQnJvYWRjYXN0TXNnLCBEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnKV0sXG4gICAgfSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyID0gRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzKS5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMiwgJ0JhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3Qgcm91bmQyTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzIsIHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMl0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgYml0Z29Db21taXRtZW50MixcbiAgICAgIGJpdGdvVG9Vc2VyTXNnMyxcbiAgICAgIGJpdGdvVG9CYWNrdXBNc2czLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKHBhcmFtcy5lbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kMk1lc3NhZ2VzKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDNcbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDIsICdSb3VuZCAxIGFuZCAyIFNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQyTXNncyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kMk1zZywgJ0JpdEdvIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvVXNlclJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IHVzZXJUb0JhY2t1cE1zZzIgPSB1c2VyUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JhY2t1cE1zZzIsICdVc2VyIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTXNnMiA9IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb1VzZXJNc2cyLCAnQmFja3VwIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDNNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvVXNlclJvdW5kMk1zZywgYmFja3VwVG9Vc2VyTXNnMl0sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMyA9IHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMywgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kM01lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgdXNlclRvQmFja3VwTXNnMl0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzMsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29Nc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb0JpdGdvTXNnMywgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMyA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKGJhY2t1cFRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQzTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtiYWNrdXBUb1VzZXJNc2czLCBiaXRnb1RvVXNlclJvdW5kM01zZ10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gdXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQodXNlclJvdW5kNEJyb2FkY2FzdE1zZywgJ1VzZXIgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclJvdW5kNEJyb2FkY2FzdE1zZyA9IERrbHNUeXBlcy5zZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQ0TWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFt1c2VyVG9CYWNrdXBNc2czLCBiaXRnb1RvQmFja3VwUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2csICdCYWNrdXAgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnKTtcblxuICAgIGNvbnN0IHJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHtcbiAgICAgICAgcDJwTWVzc2FnZXM6IFtzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czLCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzNdLFxuICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnLCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnXSxcbiAgICAgIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDMsXG4gICAgICBiaXRnb01zZzQsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29Db21tb25LZXljaGFpbixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhwYXJhbXMuZW50ZXJwcmlzZSwgc2Vzc2lvbklkLCByb3VuZDNNZXNzYWdlcyk7XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIGtleWNoYWluIGNyZWF0aW9uXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQzLCAnUm91bmQgMSBhbmQgMyBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1lc3NhZ2VzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoXG4gICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnNCldIH0sXG4gICAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKS5icm9hZGNhc3RNZXNzYWdlcztcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZyA9IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcblxuICAgIGFzc2VydChiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgJ0JpdEdvIG1lc3NhZ2UgNCBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIHVzZXJSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cFNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG5cbiAgICBjb25zdCB1c2VyQ29tbW9uS2V5Y2hhaW4gPSBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4odXNlclByaXZhdGVNYXRlcmlhbCk7XG4gICAgY29uc3QgYmFja3VwQ29tbW9uS2V5Y2hhaW4gPSBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYmFja3VwUHJpdmF0ZU1hdGVyaWFsKTtcblxuICAgIGFzc2VydC5lcXVhbChiaXRnb0NvbW1vbktleWNoYWluLCB1c2VyQ29tbW9uS2V5Y2hhaW4sICdVc2VyIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuICAgIGFzc2VydC5lcXVhbChiaXRnb0NvbW1vbktleWNoYWluLCBiYWNrdXBDb21tb25LZXljaGFpbiwgJ0JhY2t1cCBhbmQgQml0Z28gQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25TZXNzaW9uID1cbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMiA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLnBhc3NwaHJhc2UpIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRVc2VyS2V5Y2hhaW4oXG4gICAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICAgIHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgcGFyYW1zLmVudGVycHJpc2VcbiAgICAgICk7XG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZEJhY2t1cEtleWNoYWluKFxuICAgICAgICBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgICBiYWNrdXBQcml2YXRlTWF0ZXJpYWwsXG4gICAgICAgIGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbmNyeXB0aW9uU2Vzc2lvbixcbiAgICAgICAgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uXG4gICAgICApO1xuICAgICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSB0aGlzLmFkZEJpdGdvS2V5Y2hhaW4oYml0Z29Db21tb25LZXljaGFpbik7XG5cbiAgICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdXNlcktleWNoYWluUHJvbWlzZSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgICBiaXRnb0tleWNoYWluUHJvbWlzZSxcbiAgICAgIF0pO1xuICAgICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5jcnlwdGlvblNlc3Npb24/LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvLyAjcmVnaW9uIGtleWNoYWluIHV0aWxzXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgcGFydGljaXBhbnRJbmRleDogTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG4gICAgZW5jcnlwdGlvblNlc3Npb24/OiB7XG4gICAgICBlbmNyeXB0KHBsYWludGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZXN0cm95KCk6IHZvaWQ7XG4gICAgfSxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChwYXJ0aWNpcGFudEluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIHNvdXJjZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/ICd1c2VyJyA6ICdiYWNrdXAnO1xuICAgICAgICBhc3NlcnQocHJpdmF0ZU1hdGVyaWFsLCBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLCBgUmVkdWNlZCBwcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0ID0gcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgaWYgKGVuY3J5cHRpb25TZXNzaW9uKSB7XG4gICAgICAgICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgZW5jcnlwdGlvblNlc3Npb24uZW5jcnlwdChwcml2YXRlTWF0ZXJpYWxCYXNlNjQpO1xuICAgICAgICAgIHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSBhd2FpdCBlbmNyeXB0aW9uU2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgICAgYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkocmVkdWNlZFByaXZhdGVNYXRlcmlhbCkpKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBFbmNyeXB0cyB0aGUgQ0JPUi1lbmNvZGVkIFJlZHVjZWRLZXlTaGFyZSAod2hpY2ggY29udGFpbnMgdGhlIHBhcnR5J3MgcHJpdmF0ZVxuICAgICAgICAgIC8vIHNjYWxhciBzX2kpIHdpdGggdGhlIHdhbGxldCBwYXNzcGhyYXNlLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyByZWR1Y2VkRW5jcnlwdGVkUHJ2XG4gICAgICAgICAgLy8gb24gdGhlIGtleSBjYXJkIFFSIGNvZGUgYW5kIHJlcHJlc2VudHMgYSBzZWNvbmQgY29weSBvZiBwcml2YXRlIGtleSBtYXRlcmlhbFxuICAgICAgICAgIC8vIGJleW9uZCB0aGUgc2VydmVyLXN0b3JlZCBlbmNyeXB0ZWRQcnYuXG4gICAgICAgICAgcmVkdWNlZEVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICAvLyBCdWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpIGNhbiBub3QgYmUgdXNlZCBoZXJlIGFzIGl0IGRvZXMgbm90IHdvcmsgb24gdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGVyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICAgIGlucHV0OiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQklUR086XG4gICAgICAgIHNvdXJjZSA9ICdiaXRnbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgfTtcblxuICAgIGlmICh3ZWJhdXRobkluZm8gJiYgcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIHByaXZhdGVNYXRlcmlhbEJhc2U2NCkge1xuICAgICAgLy8gU2VuZCB0aGUgcGFzc2tleSBhcyBgd2ViYXV0aG5JbmZvYDsgdGhlIGRlcHJlY2F0ZWQgYHdlYmF1dGhuRGV2aWNlc2AgYXJyYXkgaXMgaWdub3JlZCBieSBQT1NUIC9rZXkuXG4gICAgICBhc3NlcnQoZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgdG8gYXR0YWNoIGEgd2ViYXV0aG4gZGV2aWNlIHRvIHRoZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICByZWNpcGllbnRLZXljaGFpblBhcmFtcy53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgIHByZlNhbHQ6IHdlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICBlbnRlcnByaXNlSWQ6IGVudGVycHJpc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHsgLi4uKGF3YWl0IGtleWNoYWlucy5hZGQocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpKSwgcmVkdWNlZEVuY3J5cHRlZFBydjogcmVkdWNlZEVuY3J5cHRlZFBydiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVXNlciBvciBCYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIFJldHJvZml0RGF0YSBuZWVkZWQgYnkgTVBDdjIgREtHLlxuICAgKlxuICAgKiBAcGFyYW0gZGVjcnlwdGVkS2V5c2hhcmUgLSBNUEN2MSBkZWNyeXB0ZWQgc2lnbmluZyBtYXRlcmlhbCBmb3IgdXNlciBvciBiYWNrdXAgYXMgYSBqc29uLnN0cmluZ2lmeSBzdHJpbmcgYW5kIGJpdGdvJ3MgQmlnIFNpLlxuICAgKiBAcGFyYW0gcGFydHlJZCAtIFRoZSBwYXJ0eSBJRCBvZiB0aGUgTVBDdjEga2V5c2hhcmUuXG4gICAqIEByZXR1cm5zIFRoZSByZXRyb2ZpdCBkYXRhIG5lZWRlZCB0byBzdGFydCBhbiBNUEN2MiBES0cgc2Vzc2lvbi5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHN0YXRpYyBnZXRLZXlEYXRhRm9yUmV0cm9maXQoXG4gICAgZGVjcnlwdGVkS2V5c2hhcmU6IHN0cmluZyxcbiAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCB8IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICApOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhIHtcbiAgICBjb25zdCBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCB4aUxpc3QgPSBbXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDEpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgyKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMyksIDMyKSksXG4gICAgXTtcbiAgICByZXR1cm4gRWNkc2FNUEN2MlV0aWxzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KHtcbiAgICAgIG1wY3YxUGFydHlLZXlTaGFyZTogZGVjcnlwdGVkS2V5c2hhcmUsXG4gICAgICBtcGN2MVBhcnR5SW5kZXg6IHBhcnR5SWQgPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/IDEgOiAyLFxuICAgICAgeGlMaXN0LFxuICAgICAgbXBjLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHVzZXIgYW5kIGJhY2t1cCBNUEN2MSBTaWduaW5nTWF0ZXJpYWwgdG8gUmV0cm9maXREYXRhIG5lZWRlZCBieSBNUEN2MiBES0cuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBNUEN2MSBkZWNyeXB0ZWQgc2lnbmluZyBtYXRlcmlhbCBmb3IgdXNlciBhbmQgYmFja3VwIGFzIGEganNvbi5zdHJpbmdpZnkgc3RyaW5nIGFuZCBiaXRnbydzIEJpZyBTaS5cbiAgICogQHJldHVybnMge3sgbXBjdjJVc2VyS2V5U2hhcmU6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGE7IG1wY3YyQmFrY3VwS2V5U2hhcmU6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgfX0gLSB0aGUgcmV0cm9maXQgZGF0YSBuZWVkZWQgdG8gc3RhcnQgYW4gTVBDdjIgREtHIHNlc3Npb24uXG4gICAqL1xuICBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMocGFyYW1zOiB7IG1wY3YxVXNlcktleVNoYXJlOiBzdHJpbmc7IG1wY3YxQmFja3VwS2V5U2hhcmU6IHN0cmluZyB9KToge1xuICAgIG1wY3YyVXNlcktleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhO1xuICAgIG1wY3YyQmFja3VwS2V5U2hhcmU6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGE7XG4gIH0ge1xuICAgIGNvbnN0IG1wYyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IHhpTGlzdCA9IFtcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMSksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDIpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgzKSwgMzIpKSxcbiAgICBdO1xuICAgIHJldHVybiB7XG4gICAgICBtcGN2MlVzZXJLZXlTaGFyZTogRWNkc2FNUEN2MlV0aWxzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KHtcbiAgICAgICAgbXBjdjFQYXJ0eUtleVNoYXJlOiBwYXJhbXMubXBjdjFVc2VyS2V5U2hhcmUsXG4gICAgICAgIG1wY3YxUGFydHlJbmRleDogMSxcbiAgICAgICAgeGlMaXN0LFxuICAgICAgICBtcGMsXG4gICAgICB9KSxcbiAgICAgIG1wY3YyQmFja3VwS2V5U2hhcmU6IEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICAgIG1wY3YxUGFydHlLZXlTaGFyZTogcGFyYW1zLm1wY3YxQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIG1wY3YxUGFydHlJbmRleDogMixcbiAgICAgICAgeGlMaXN0LFxuICAgICAgICBtcGMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXRyb2ZpdCBkYXRhIGZyb20gTVBDdjEga2V5IHNoYXJlLlxuICAgKiBAcGFyYW0gbXBjdjFQYXJ0eUtleVNoYXJlXG4gICAqIEBwYXJhbSBtcGN2MVBhcnR5SW5kZXhcbiAgICogQHBhcmFtIHhpTGlzdFxuICAgKiBAcGFyYW0gbXBjXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgIG1wY3YxUGFydHlLZXlTaGFyZSxcbiAgICBtcGN2MVBhcnR5SW5kZXgsXG4gICAgeGlMaXN0LFxuICAgIG1wYyxcbiAgfToge1xuICAgIG1wY3YxUGFydHlLZXlTaGFyZTogc3RyaW5nO1xuICAgIG1wY3YxUGFydHlJbmRleDogbnVtYmVyO1xuICAgIHhpTGlzdDogbnVtYmVyW11bXTtcbiAgICBtcGM6IEVjZHNhO1xuICB9KTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB7XG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UobXBjdjFQYXJ0eUtleVNoYXJlKTtcbiAgICBsZXQga2V5Q29tYmluZWQ6IEtleUNvbWJpbmVkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAobXBjdjFQYXJ0eUluZGV4KSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLCAnVXNlciBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgYmFja3VwIE5TaGFyZS4nKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgJ0JpdEdvIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsXG4gICAgICAgIF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCAnVXNlciBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgYmFja3VwIE5TaGFyZS4nKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgJ0JpdEdvIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsIHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCAnVXNlciBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgYmFja3VwIE5TaGFyZS4nKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsICdCYWNrdXAgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIHVzZXIgTlNoYXJlLicpO1xuICAgICAgICBrZXlDb21iaW5lZCA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSxcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLFxuICAgICAgICBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHhTaGFyZToga2V5Q29tYmluZWQueFNoYXJlLFxuICAgICAgeGlMaXN0OiB4aUxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVXNlcktleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uU2Vzc2lvbj86IHtcbiAgICAgIGVuY3J5cHQocGxhaW50ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZWNyeXB0KGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAgIGRlc3Ryb3koKTogdm9pZDtcbiAgICB9LFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm8sXG4gICAgICBlbmNyeXB0aW9uU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgZW50ZXJwcmlzZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEJhY2t1cEtleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblNlc3Npb24/OiB7XG4gICAgICBlbmNyeXB0KHBsYWludGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZXN0cm95KCk6IHZvaWQ7XG4gICAgfSxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvblxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKG06IG51bWJlciwgbjogbnVtYmVyLCByZXRyb2ZpdD86IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCkge1xuICAgIGlmIChyZXRyb2ZpdCkge1xuICAgICAgY29uc3QgcmV0cm9maXREYXRhID0gdGhpcy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMoe1xuICAgICAgICBtcGN2MVVzZXJLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkVXNlcktleSxcbiAgICAgICAgbXBjdjFCYWNrdXBLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkQmFja3VwS2V5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVzZXJTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uVVNFUiwgdW5kZWZpbmVkLCByZXRyb2ZpdERhdGEubXBjdjJVc2VyS2V5U2hhcmUpO1xuICAgICAgY29uc3QgYmFja3VwU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCwgdW5kZWZpbmVkLCByZXRyb2ZpdERhdGEubXBjdjJCYWNrdXBLZXlTaGFyZSk7XG5cbiAgICAgIHJldHVybiB7IHVzZXJTZXNzaW9uLCBiYWNrdXBTZXNzaW9uIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBjb25zdCBiYWNrdXBTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICAgIHJldHVybiB7IHVzZXJTZXNzaW9uLCBiYWNrdXBTZXNzaW9uIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEJpdGdvS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW46IHN0cmluZyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKE1QQ3YyUGFydGllc0VudW0uQklUR08sIGNvbW1vbktleWNoYWluKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgRUNEU0EgTVBDdjIga2V5Y2hhaW5zIHVzaW5nIGV4dGVybmFsIHNpZ25lciBjYWxsYmFja3MgaW5zdGVhZCBvZiBhIHBhc3NwaHJhc2UuXG4gICAqIFRoZSBleHRlcm5hbCBzaWduZXIgaG9sZHMgYWxsIHByaXZhdGUga2V5IG1hdGVyaWFsOyB0aGUgU0RLIG9ubHkgY29vcmRpbmF0ZXMgdGhlIERLRyBwcm90b2NvbC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcihwYXJhbXM6IHtcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgY2FsbGJhY2tzOiBFY2RzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgeyBlbnRlcnByaXNlLCBjYWxsYmFja3MgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IG1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhlbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBtcGN2MktleSA9IG1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQobXBjdjJLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBtcGN2MktleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIGFzc2VydChpc0JpdGdvTXBjUHViS2V5KGJpdGdvUHVibGljR3BnS2V5LCAnbXBjdjInKSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICAvLyBSb3VuZCAxOiBleHRlcm5hbCBzaWduZXIgZ2VuZXJhdGVzIEdQRyBrZXlzIGFuZCBpbml0aWFsIERLRyBtZXNzYWdlc1xuICAgIGNvbnN0IHsgdXNlckdwZ1B1YmxpY0tleSwgYmFja3VwR3BnUHVibGljS2V5LCByb3VuZDFNZXNzYWdlcywgdXNlclN0YXRlLCBiYWNrdXBTdGF0ZSB9ID1cbiAgICAgIGF3YWl0IGNhbGxiYWNrcy5pbml0aWFsaXplQ2FsbGJhY2soe1xuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSwgYml0Z29Ub1VzZXJNc2cyLCBiaXRnb1RvQmFja3VwTXNnMiB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgcm91bmQxTWVzc2FnZXNcbiAgICApO1xuXG4gICAgLy8gUm91bmQgMjogZXh0ZXJuYWwgc2lnbmVyIHByb2Nlc3NlcyBCaXRHbydzIHJvdW5kIDEgcmVzcG9uc2VcbiAgICBjb25zdCB7XG4gICAgICByb3VuZDJNZXNzYWdlcyxcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIyLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIyLFxuICAgIH0gPSBhd2FpdCBjYWxsYmFja3Mucm91bmQyQ2FsbGJhY2soe1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgYml0Z29Nc2cxLFxuICAgICAgYml0Z29Ub1VzZXJNc2cyLFxuICAgICAgYml0Z29Ub0JhY2t1cE1zZzIsXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICBiYWNrdXBTdGF0ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvdW5kMlJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMihlbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kMk1lc3NhZ2VzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocm91bmQyUmVzcG9uc2Uuc2Vzc2lvbklkLCBzZXNzaW9uSWQsICdTZXNzaW9uIElEIG1pc21hdGNoIGFmdGVyIHJvdW5kIDInKTtcblxuICAgIC8vIFJvdW5kIDM6IGV4dGVybmFsIHNpZ25lciBwcm9jZXNzZXMgQml0R28ncyByb3VuZCAyIHJlc3BvbnNlXG4gICAgY29uc3Qge1xuICAgICAgcm91bmQzTWVzc2FnZXMsXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMyxcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMyxcbiAgICB9ID0gYXdhaXQgY2FsbGJhY2tzLnJvdW5kM0NhbGxiYWNrKHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGJpdGdvQ29tbWl0bWVudDI6IHJvdW5kMlJlc3BvbnNlLmJpdGdvQ29tbWl0bWVudDIsXG4gICAgICBiaXRnb1RvVXNlck1zZzM6IHJvdW5kMlJlc3BvbnNlLmJpdGdvVG9Vc2VyTXNnMyxcbiAgICAgIGJpdGdvVG9CYWNrdXBNc2czOiByb3VuZDJSZXNwb25zZS5iaXRnb1RvQmFja3VwTXNnMyxcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIyLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIyLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgcm91bmQzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKGVudGVycHJpc2UsIHNlc3Npb25JZCwgcm91bmQzTWVzc2FnZXMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyb3VuZDNSZXNwb25zZS5zZXNzaW9uSWQsIHNlc3Npb25JZCwgJ1Nlc3Npb24gSUQgbWlzbWF0Y2ggYWZ0ZXIgcm91bmQgMycpO1xuXG4gICAgLy8gRmluYWxpemU6IGV4dGVybmFsIHNpZ25lciB2ZXJpZmllcyBCaXRHbydzIGZpbmFsIG1lc3NhZ2UgYWdhaW5zdCB0aGUgZGVyaXZlZCBjb21tb24ga2V5Y2hhaW5cbiAgICBjb25zdCB7IGNvbW1vbktleWNoYWluIH0gPSBhd2FpdCBjYWxsYmFja3MuZmluYWxpemVDYWxsYmFjayh7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBiaXRnb01zZzQ6IHJvdW5kM1Jlc3BvbnNlLmJpdGdvTXNnNCxcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW46IHJvdW5kM1Jlc3BvbnNlLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjMsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjMsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbW1vbktleWNoYWluLCByb3VuZDNSZXNwb25zZS5jb21tb25LZXljaGFpbiwgJ0NvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGtleWNoYWlucy5hZGQoeyBzb3VyY2U6ICd1c2VyJywga2V5VHlwZTogJ3RzcycsIGNvbW1vbktleWNoYWluLCBpc01QQ3YyOiB0cnVlIH0pLFxuICAgICAga2V5Y2hhaW5zLmFkZCh7IHNvdXJjZTogJ2JhY2t1cCcsIGtleVR5cGU6ICd0c3MnLCBjb21tb25LZXljaGFpbiwgaXNNUEN2MjogdHJ1ZSB9KSxcbiAgICAgIHRoaXMuYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbiksXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH07XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgdXNlckdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IERrbHNUeXBlcy5BdXRoRW5jTWVzc2FnZXMgJiB7IHdhbGxldElkPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihcbiAgICAgIEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgcGF5bG9hZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMihcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHNlc3Npb25JZCwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kM0J5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHNlc3Npb25JZCwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFY2RzYU1QQ3YyS2V5R2VuU2VuZEZuPE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+LFxuICAgIHVzZXJHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzICYgeyB3YWxsZXRJZD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUik/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KHVzZXJNc2cxLCAnVXNlciBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzEgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2cxLCAnQmFja3VwIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogeyBmcm9tOiAwLCAuLi51c2VyTXNnMSB9LFxuICAgICAgYmFja3VwTXNnMTogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2cxIH0sXG4gICAgICB3YWxsZXRJZDogcGF5bG9hZC53YWxsZXRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlck1zZzIsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLmNvbW1pdG1lbnQsICdVc2VyIHRvIEJpdGdvIGNvbW1pdG1lbnQgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyTXNnMi5jb21taXRtZW50KSwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzIgPSBwYXlsb2FkLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwTXNnMiwgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLmNvbW1pdG1lbnQsICdCYWNrdXAgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cE1zZzIuY29tbWl0bWVudCksICdCYWNrdXAgdG8gQml0Z28gY29tbWl0bWVudCBpcyByZXF1aXJlZCcpO1xuXG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMiddLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjoge1xuICAgICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAgIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgICBzaWduYXR1cmU6IHVzZXJNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiB1c2VyTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgdXNlckNvbW1pdG1lbnQyOiB1c2VyTXNnMi5jb21taXRtZW50LFxuICAgICAgYmFja3VwTXNnMjoge1xuICAgICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogYmFja3VwTXNnMi5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogYmFja3VwTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgYmFja3VwQ29tbWl0bWVudDI6IGJhY2t1cE1zZzIuY29tbWl0bWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQzQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzMsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlck1zZzQgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzQsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzQsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjMnXSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzM6IHsgZnJvbTogMCwgdG86IDIsIC4uLnVzZXJNc2czIH0sXG4gICAgICBiYWNrdXBNc2czOiB7IGZyb206IDEsIHRvOiAyLCAuLi5iYWNrdXBNc2czIH0sXG4gICAgICB1c2VyTXNnNDogeyBmcm9tOiAwLCAuLi51c2VyTXNnNCB9LFxuICAgICAgYmFja3VwTXNnNDogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2c0IH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5tcGN2MlBhcnR5SWQgLSBwYXJ0eSBpZCBmb3IgdGhlIHNpZ25lciBpbnZvbHZlZCBpbiB0aGlzIG1wY3YyIHJlcXVlc3QgKGVpdGhlciAwIGZvciB1c2VyIG9yIDEgZm9yIGJhY2t1cClcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnRTb3VyY2UgLSBvcHRpb25hbDsgdXNlIFRzc1R4UmVjaXBpZW50U291cmNlLkV4cGxpY2l0IHdpdGggYSBub24tZW1wdHkgdHhQYXJhbXMucmVjaXBpZW50c1xuICAgKiAgIGxpc3Qgd2hlbiB5b3Ugd2FudCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgcGFzc2luZyByZWNpcGllbnQgZGV0YWlscyBhdCBjb21waWxlIHRpbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUc3NTaWduVHhSZXF1ZXN0UGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIGxldCBzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyh0cnVlLCBwYXJhbXMucmVxSWQsIHR4UmVxdWVzdC5lbnRlcnByaXNlSWQpO1xuXG4gICAgaWYgKCFiaXRnb0dwZ1B1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuXG4gICAgICBpZiAoXG4gICAgICAgICdyZWNpcGllbnRTb3VyY2UnIGluIHBhcmFtcyAmJlxuICAgICAgICBwYXJhbXMucmVjaXBpZW50U291cmNlID09PSBUc3NUeFJlY2lwaWVudFNvdXJjZS5FeHBsaWNpdCAmJlxuICAgICAgICAhcGFyYW1zLnR4UGFyYW1zPy5yZWNpcGllbnRzPy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ3JlY2lwaWVudFNvdXJjZSBcImV4cGxpY2l0XCIgcmVxdWlyZXMgdHhQYXJhbXMucmVjaXBpZW50cyB3aXRoIGF0IGxlYXN0IG9uZSByZWNpcGllbnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgSUNQIGFuZCBBdmFsYW5jaGUgYXRvbWljIHRyYW5zYWN0aW9ucywgc2lnbmFibGVIZXggaXMgYSBkaWdlc3QgKG5vdFxuICAgICAgLy8gYSBwYXJzZWFibGUgdHJhbnNhY3Rpb24pLiAgUGFzcyBzZXJpYWxpemVkVHhIZXggc28gdmVyaWZ5VHJhbnNhY3Rpb24gY2FuXG4gICAgICAvLyBwYXJzZSB0aGUgZnVsbCB0cmFuc2FjdGlvbiBieXRlcy5cbiAgICAgIC8vIC0gSUNQOiBzaWduYWJsZUhleCBpcyBhIGhhc2g7IHNlcmlhbGl6ZWRUeEhleCBpcyB0aGUgQ0JPUi1lbmNvZGVkIHR4LlxuICAgICAgLy8gLSBBdmFsYW5jaGUgYXRvbWljIChGTFJQL0ZMUiBjcm9zcy1jaGFpbik6IHNpZ25hYmxlSGV4IGlzIFNIQS0yNTYodHhCb2R5KTtcbiAgICAgIC8vICAgc2VyaWFsaXplZFR4SGV4IGlzIHRoZSBQVk0vRVZNIGF0b21pYyB0eCAoY29kZWMgcHJlZml4IDB4MDAwMCkuXG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGNvaW5zLCBzaWduYWJsZUhleCBJUyB0aGUgdW5zaWduZWQgdHJhbnNhY3Rpb24gKGUuZy4gUkxQIGJ5dGVzKS5cbiAgICAgIGNvbnN0IGlzSWNwID0gdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mYW1pbHkgPT09ICdpY3AnO1xuICAgICAgY29uc3QgaXNQcmVIYXNoZWQgPSBzaG91bGRVc2VQcmVIYXNoZWRTaWduYWJsZSh0aGlzLmJhc2VDb2luLCB1bnNpZ25lZFR4KTtcbiAgICAgIGlmIChpc0ljcCB8fCBpc1ByZUhhc2hlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCwgdHhJbmZvOiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHBhcmFtcy50eFBhcmFtcyksXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHBhcmFtcy50eFBhcmFtcyksXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHVuc2lnbmVkVHguc2lnbmFibGVIZXg7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBzZXJpYWxpemVkVHhIZXggPSB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleDtcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5kZXJpdmF0aW9uUGF0aCB8fCAnbS8wJztcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIEF2YWxhbmNoZSBhdG9taWMgdHJhbnNhY3Rpb25zIChjcm9zcy1jaGFpbiBleHBvcnQvaW1wb3J0IGJldHdlZW5cbiAgICAvLyBDLWNoYWluIGFuZCBQLWNoYWluKSwgc2lnbmFibGVIZXggaXMgYWxyZWFkeSBTSEEtMjU2KHR4Qm9keSkg4oCUIGEgMzItYnl0ZVxuICAgIC8vIHByZS1oYXNoZWQgZGlnZXN0LiAgVXNlIGl0IGRpcmVjdGx5IGFzIHRoZSBES0xTIG1lc3NhZ2UgaGFzaCBpbnN0ZWFkIG9mXG4gICAgLy8gYXBwbHlpbmcgdGhlIGNvaW4ncyBoYXNoIGZ1bmN0aW9uIChrZWNjYWsyNTYgZm9yIEVWTSBjb2lucykuXG4gICAgLy8gU2FtZSBsb2dpYyBhcyBnZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGggKGV4dGVybmFsIHNpZ25lciBwYXRoKS5cbiAgICBjb25zdCBoYXNoQnVmZmVyID0gdGhpcy5nZXRNcGN2Mkhhc2hCdWZmZXIoc2VyaWFsaXplZFR4SGV4LCB0eE9yTWVzc2FnZVRvU2lnbiwgYnVmZmVyQ29udGVudCk7XG4gICAgY29uc3Qgb3RoZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2coXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkICE9PSB1bmRlZmluZWQgPyBwYXJhbXMubXBjdjJQYXJ0eUlkIDogMCxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgaGFzaEJ1ZmZlclxuICAgICk7XG4gICAgY29uc3QgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEgPSBhd2FpdCBvdGhlclNpZ25lci5pbml0KCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKFxuICAgICAgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG5cbiAgICBsZXQgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgbGV0IGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMjogYW55O1xuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMiA9IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyID0gbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IEpTT04ucGFyc2UoXG4gICAgICBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDJbYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMUFuZDIgPSBhd2FpdCB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lKFxuICAgICAgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG5cbiAgICAvKiogUm91bmQgMiAqKi9cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMik7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IGRlc2VyaWFsaXplZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMgPSBvdGhlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDIsXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXNbdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIC8qKiBSb3VuZCAzICoqL1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUoXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0LFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5LFxuICAgICAgcGFyYW1zLm1wY3YyUGFydHlJZFxuICAgICk7XG4gICAgLy8gU3VibWl0IGZvciBmaW5hbCBzaWduYXR1cmUgc2hhcmUgY29tYmluZVxuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWVdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0LndhbGxldElkLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZm9ybWF0dGluZyB1dGlsc1xuICBmb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYnJvYWRjYXN0TWVzc2FnZTogTVBDdjJCcm9hZGNhc3RNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGJyb2FkY2FzdE1lc3NhZ2UuZnJvbSxcbiAgICAgIHBheWxvYWQ6IHsgbWVzc2FnZTogYnJvYWRjYXN0TWVzc2FnZS5tZXNzYWdlLCBzaWduYXR1cmU6IGJyb2FkY2FzdE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdFAyUE1lc3NhZ2UocDJwTWVzc2FnZTogTVBDdjJQMlBNZXNzYWdlLCBjb21taXRtZW50Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBheWxvYWQ6IHsgZW5jcnlwdGVkTWVzc2FnZTogcDJwTWVzc2FnZS5lbmNyeXB0ZWRNZXNzYWdlLCBzaWduYXR1cmU6IHAycE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgICBmcm9tOiBwMnBNZXNzYWdlLmZyb20sXG4gICAgICB0bzogcDJwTWVzc2FnZS50byxcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBwcml2YXRlIHV0aWxzXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhhc2ggc3RyaW5nIGFuZCBkZXJpdmF0aW9uIHBhdGggZnJvbSB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtUeFJlcXVlc3R9IHR4UmVxdWVzdCAtIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge1JlcXVlc3RUeXBlfSByZXF1ZXN0VHlwZSAtIHRoZSByZXF1ZXN0IHR5cGVcbiAgICogQHJldHVybnMge3sgaGFzaEJ1ZmZlcjogQnVmZmVyOyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIH19IC0gdGhlIGhhc2ggc3RyaW5nIGFuZCBkZXJpdmF0aW9uIHBhdGhcbiAgICovXG4gIHByaXZhdGUgZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKFxuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IHsgaGFzaEJ1ZmZlcjogQnVmZmVyOyBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIH0ge1xuICAgIGxldCB0eFRvU2lnbjogc3RyaW5nO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICAgIGxldCBzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBjb25zdCBzaWduYWJsZVR4ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCwgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIHR4VG9TaWduID0gc2lnbmFibGVUeC5zaWduYWJsZUhleDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gc2lnbmFibGVUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICAgIHNlcmlhbGl6ZWRUeEhleCA9IHNpZ25hYmxlVHguc2VyaWFsaXplZFR4SGV4O1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICAgIHRocm93IG5ldyBFcnJvcignTVBDdjIgbWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzaEJ1ZmZlciA9IHRoaXMuZ2V0TXBjdjJIYXNoQnVmZmVyKHNlcmlhbGl6ZWRUeEhleCwgdHhUb1NpZ24sIEJ1ZmZlci5mcm9tKHR4VG9TaWduLCAnaGV4JykpO1xuICAgIHJldHVybiB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIERLTFMgbWVzc2FnZSBoYXNoIGZvciBNUEN2MiBzaWduaW5nLlxuICAgKiBGb3IgcHJlLWhhc2hlZCBzaWduYWJsZSBtYXRlcmlhbCAoQXZhbGFuY2hlIGF0b21pYyB0eHMpLCBzaWduYWJsZUhleCBpc1xuICAgKiBhbHJlYWR5IFNIQS0yNTYodHhCb2R5KSBhbmQgaXMgdXNlZCBkaXJlY3RseS4gT3RoZXJ3aXNlIHRoZSBjb2luIGhhc2hcbiAgICogZnVuY3Rpb24gaXMgYXBwbGllZCAoa2VjY2FrMjU2IGZvciBFVk0gY29pbnMgYnkgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIGdldE1wY3YySGFzaEJ1ZmZlcihzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2lnbmFibGVIZXg6IHN0cmluZywgYnVmZmVyQ29udGVudDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCB1bnNpZ25lZFR4OiBTaWduYWJsZVRyYW5zYWN0aW9uID0ge1xuICAgICAgc2VyaWFsaXplZFR4SGV4OiBzZXJpYWxpemVkVHhIZXggPz8gJycsXG4gICAgICBzaWduYWJsZUhleCxcbiAgICB9O1xuICAgIGlmIChzZXJpYWxpemVkVHhIZXggJiYgc2hvdWxkVXNlUHJlSGFzaGVkU2lnbmFibGUodGhpcy5iYXNlQ29pbiwgdW5zaWduZWRUeCkpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYnVmZmVyQ29udGVudC5sZW5ndGggPT09IDMyLFxuICAgICAgICBgQXZhbGFuY2hlIHByZS1oYXNoZWQgc2lnbmFibGVIZXggbXVzdCBiZSAzMiBieXRlcywgZ290ICR7YnVmZmVyQ29udGVudC5sZW5ndGh9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBidWZmZXJDb250ZW50O1xuICAgIH1cblxuICAgIGxldCBoYXNoOiBIYXNoO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKSBhcyBIYXNoO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaC51cGRhdGUoYnVmZmVyQ29udGVudCkuZGlnZXN0KCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBleHRlcm5hbCBzaWduZXJcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIHNpZ25FY2RzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCwgcmVxSWQgfSA9IHBhcmFtcztcbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcblxuICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICBhc3NlcnQoXG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgsXG4gICAgICAnT25seSB0cmFuc2FjdGlvbiBzaWduaW5nIGlzIHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZVxuICAgICk7XG5cbiAgICBpZiAodHlwZW9mIHR4UmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCwgcmVxSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IHR4UmVxdWVzdDtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhcbiAgICAgIHRydWUsXG4gICAgICBwYXJhbXMucmVxSWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC5lbnRlcnByaXNlSWRcbiAgICApO1xuXG4gICAgaWYgKCFiaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgLy8gcm91bmQgMVxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfSA9XG4gICAgICBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQgfSk7XG4gICAgY29uc3Qgcm91bmQxVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgLy8gcm91bmQgMlxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQxVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDJUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQyXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyAmJiByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcyxcbiAgICAgICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDNcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMlR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kM10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcmVxSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0LCBlbmNyeXB0ZWRQcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QpO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7aGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyl9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSA9IGF3YWl0IHVzZXJTaWduZXIuaW5pdCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB1c2VyU2lnbmVyLmdldFNlc3Npb24oKTtcbiAgICBjb25zdCB1c2VyR3BnUHViS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG5cbiAgICBjb25zdCB1c2VWMiA9IGVuY3J5cHRlZFBydiAhPT0gdW5kZWZpbmVkICYmIGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRQcnYpO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHNlc3Npb25EYXRhLFxuICAgICAgICAgIGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgICBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25EYXRhLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMlNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMjogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyBwcnYsIHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9XG4gICAgICBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QpO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7aGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyl9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWVxuICAgICk7XG4gICAgY29uc3QgdXNlckdwZ0tleTogcGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gPSB7XG4gICAgICBwcml2YXRlS2V5OiB1c2VyR3BnUHJ2S2V5LmFybW9yKCksXG4gICAgICBwdWJsaWNLZXk6IHVzZXJHcGdQcnZLZXkudG9QdWJsaWMoKS5hcm1vcigpLFxuICAgIH07XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5bMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMSB0eFJlcXVlc3QnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBKU09OLnBhcnNlKFxuICAgICAgc2lnbmF0dXJlU2hhcmVzW3NpZ25hdHVyZVNoYXJlcy5sZW5ndGggLSAxXS5zaGFyZVxuICAgICkgYXMgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dDtcbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDEgPSBhd2FpdCB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lKFxuICAgICAgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFKTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgYXdhaXQgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDIgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMixcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IHNlc3Npb25EYXRhID0gdXNlclNpZ25lci5nZXRTZXNzaW9uKCk7XG5cbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGNvbnN0IGVuY1Nlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IGVuY1Nlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICBzZXNzaW9uRGF0YSxcbiAgICAgICAgICBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGVuY1Nlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25EYXRhLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMl9TVEFURX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmF0dXJlU2hhcmVSb3VuZDIsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQzU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQzOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPVxuICAgICAgcGFyYW1zO1xuXG4gICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgY29uc3QgeyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0KTtcbiAgICBjb25zdCBhZGF0YSA9IGAke2hhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZXG4gICAgKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5OiBwZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPiA9IHtcbiAgICAgIHByaXZhdGVLZXk6IHVzZXJHcGdQcnZLZXkuYXJtb3IoKSxcbiAgICAgIHB1YmxpY0tleTogdXNlckdwZ1BydktleS50b1B1YmxpYygpLmFybW9yKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/LlswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICBzaWduYXR1cmVTaGFyZXNbc2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFKTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgYXdhaXQgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMlNlc3Npb24pO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQsIHVzZXJHcGdLZXksIGJpdGdvR3BnS2V5KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4ga2V5IHNoYXJlLCB3aGVuIGRlY3J5cHRlZCwgY29udGFpbnMgdmFsaWQgR0cxOCBzaWduaW5nIG1hdGVyaWFsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlTaGFyZSAtIFRoZSBlbmNyeXB0ZWQga2V5IHNoYXJlIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHVzZWQgdG8gZGVjcnlwdCB0aGUga2V5IHNoYXJlXG4gKiBAcGFyYW0ge0JpdEdvQmFzZX0gYml0Z28gLSBCaXRHbyBpbnN0YW5jZSBmb3IgdjEvdjIgYXV0by1kZXRlY3QgZGVjcnlwdFxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgYHRydWVgIGlmIHRoZSBkZWNyeXB0ZWQgZGF0YSBjb250YWlucyB2YWxpZCBzaWduaW5nIG1hdGVyaWFsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzR0cxOFNpZ25pbmdNYXRlcmlhbChcbiAga2V5U2hhcmU6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBiaXRnbzogQml0R29CYXNlXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXlTaGFyZSB9KTtcbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBydik7XG4gICAgcmV0dXJuIChcbiAgICAgIHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUgJiZcbiAgICAgIHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSAmJlxuICAgICAgKHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlIHx8IHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gdGhlIHByb3ZpZGVkIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzLlxuICogQHBhcmFtIGVuY3J5cHRlZFVzZXJLZXkgZW5jcnlwdGVkIGdnMTggb3IgTVBDdjIgdXNlciBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRCYWNrdXBLZXkgZW5jcnlwdGVkIGdnMTggb3IgTVBDdjIgYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3dvcmQgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlcbiAqIEBwYXJhbSBiaXRnbyBCaXRHbyBpbnN0YW5jZSBmb3IgdjEvdjIgYXV0by1kZXRlY3QgZGVjcnlwdFxuICogQHJldHVybnMgTVBDIHYyIHJlY292ZXJ5IGtleSBzaGFyZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXMoXG4gIGVuY3J5cHRlZFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkQmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYml0Z286IEJpdEdvQmFzZVxuKTogUHJvbWlzZTx7XG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyO1xuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyO1xuICBjb21tb25LZXlDaGFpbjogc3RyaW5nO1xufT4ge1xuICBpZiAoYXdhaXQgaXNHRzE4U2lnbmluZ01hdGVyaWFsKGVuY3J5cHRlZFVzZXJLZXksIHdhbGxldFBhc3NwaHJhc2UsIGJpdGdvKSkge1xuICAgIHJldHVybiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbUdHMTgoZW5jcnlwdGVkVXNlcktleSwgZW5jcnlwdGVkQmFja3VwS2V5LCB3YWxsZXRQYXNzcGhyYXNlLCBiaXRnbyk7XG4gIH1cbiAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UsIGJpdGdvKTtcbn1cblxuLyoqXG4gKiBTaWducyBhIG1lc3NhZ2UgaGFzaCB1c2luZyBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZUhhc2hcbiAqIEBwYXJhbSB7QnVmZmVyfSB1c2VyS2V5U2hhcmVcbiAqIEBwYXJhbSB7QnVmZmVyfSBiYWNrdXBLZXlTaGFyZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1vbktleUNoYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IHJlY2lkOiBudW1iZXIsIHI6IHN0cmluZywgczogc3RyaW5nLCB5OiBzdHJpbmcgfT59XG4gKlxuICogQGFzeW5jXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUmVjb3ZlcnlNcGNWMihcbiAgbWVzc2FnZUhhc2g6IEJ1ZmZlcixcbiAgdXNlcktleVNoYXJlOiBCdWZmZXIsXG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIsXG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmdcbik6IFByb21pc2U8e1xuICByZWNpZDogbnVtYmVyO1xuICByOiBzdHJpbmc7XG4gIHM6IHN0cmluZztcbiAgeTogc3RyaW5nO1xufT4ge1xuICBjb25zdCB1c2VyRHNnID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgJ20vMCcsIG1lc3NhZ2VIYXNoKTtcbiAgY29uc3QgYmFja3VwRHNnID0gbmV3IERrbHNEc2cuRHNnKGJhY2t1cEtleVNoYXJlLCAxLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuXG4gIGNvbnN0IHNpZ25hdHVyZVN0cmluZyA9IERrbHNVdGlscy52ZXJpZnlBbmRDb252ZXJ0RGtsc1NpZ25hdHVyZShcbiAgICBtZXNzYWdlSGFzaCxcbiAgICAoYXdhaXQgRGtsc1V0aWxzLmV4ZWN1dGVUaWxsUm91bmQoNSwgdXNlckRzZywgYmFja3VwRHNnKSkgYXMgRGtsc1R5cGVzLkRlc2VyaWFsaXplZERrbHNTaWduYXR1cmUsXG4gICAgY29tbW9uS2V5Q2hhaW4sXG4gICAgJ20vMCcsXG4gICAgdW5kZWZpbmVkLFxuICAgIGZhbHNlXG4gICk7XG4gIGNvbnN0IHNpZ1BhcnRzID0gc2lnbmF0dXJlU3RyaW5nLnNwbGl0KCc6Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICByZWNpZDogcGFyc2VJbnQoc2lnUGFydHNbMF0sIDEwKSxcbiAgICByOiBzaWdQYXJ0c1sxXSxcbiAgICBzOiBzaWdQYXJ0c1syXSxcbiAgICB5OiBzaWdQYXJ0c1szXSxcbiAgfTtcbn1cblxuLy8gI3JlZ2lvbiBwcml2YXRlIHV0aWxzXG5cbi8qKlxuICogR2V0IHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqIEBwYXJhbSBlbmNyeXB0ZWRHRzE4VXNlcktleSBlbmNyeXB0ZWQgZ2cxOCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThCYWNrdXBLZXkgZW5jcnlwdGVkIGdnMTggYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3dvcmQgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlcbiAqIEByZXR1cm5zIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tR0cxOChcbiAgZW5jcnlwdGVkR0cxOFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkR0cxOEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGJpdGdvOiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8e1xuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZztcbn0+IHtcbiAgY29uc3QgW3VzZXJLZXlDb21iaW5lZCwgYmFja3VwS2V5Q29tYmluZWRdID0gYXdhaXQgZ2V0S2V5Q29tYmluZWRGcm9tVHNzS2V5U2hhcmVzKFxuICAgIGVuY3J5cHRlZEdHMThVc2VyS2V5LFxuICAgIGVuY3J5cHRlZEdHMThCYWNrdXBLZXksXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICBiaXRnb1xuICApO1xuICBjb25zdCByZXRyb2ZpdERhdGFBOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZTogdXNlcktleUNvbWJpbmVkLnhTaGFyZSxcbiAgfTtcbiAgY29uc3QgcmV0cm9maXREYXRhQjogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9IHtcbiAgICB4U2hhcmU6IGJhY2t1cEtleUNvbWJpbmVkLnhTaGFyZSxcbiAgfTtcbiAgY29uc3QgW3VzZXIsIGJhY2t1cF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGUyb2YyS2V5U2hhcmVzKHJldHJvZml0RGF0YUEsIHJldHJvZml0RGF0YUIpO1xuXG4gIGNvbnN0IHVzZXJLZXlTaGFyZSA9IHVzZXIuZ2V0S2V5U2hhcmUoKTtcbiAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBiYWNrdXAuZ2V0S2V5U2hhcmUoKTtcbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgY29tbW9uS2V5Q2hhaW46IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBLZXlTaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jcnlwdGVkTVBDdjJVc2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jcnlwdGVkTVBDdjJCYWNrdXBLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbd2FsbGV0UGFzc3BocmFzZV0gLSBUaGUgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGtleSBzaGFyZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgdXNlcktleVNoYXJlOiBLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmU6IEtleVNoYXJlLCBjb21tb25LZXlDaGFpbjogc3RyaW5nIH0+fVxuICpcbiAqIEBhc3luY1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gIGVuY3J5cHRlZE1QQ3YyVXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRNUEN2MkJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGJpdGdvOiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8e1xuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZztcbn0+IHtcbiAgY29uc3QgdXNlckNvbXByZXNzZWRQcnYgPSBCdWZmZXIuZnJvbShcbiAgICBhd2FpdCBiaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBlbmNyeXB0ZWRNUEN2MlVzZXJLZXkgfSksXG4gICAgJ2Jhc2U2NCdcbiAgKTtcbiAgY29uc3QgYmFrY3VwQ29tcHJlc3NlZFBydiA9IEJ1ZmZlci5mcm9tKFxuICAgIGF3YWl0IGJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGVuY3J5cHRlZE1QQ3YyQmFja3VwS2V5IH0pLFxuICAgICdiYXNlNjQnXG4gICk7XG5cbiAgY29uc3QgdXNlclBydkpTT046IERrbHNUeXBlcy5SZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZSh1c2VyQ29tcHJlc3NlZFBydik7XG4gIGNvbnN0IGJhY2t1cFBydkpTT046IERrbHNUeXBlcy5SZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShiYWtjdXBDb21wcmVzc2VkUHJ2KTtcbiAgY29uc3QgdXNlcktleVJldHJvZml0OiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZToge1xuICAgICAgeDogQnVmZmVyLmZyb20odXNlclBydkpTT04ucHJ2KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBCdWZmZXIuZnJvbSh1c2VyUHJ2SlNPTi5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20odXNlclBydkpTT04ucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH0sXG4gICAgeGlMaXN0OiB1c2VyUHJ2SlNPTi54TGlzdC5zbGljZSgwLCAyKSxcbiAgfTtcbiAgY29uc3QgYmFja3VwS2V5UmV0cm9maXQ6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiB7XG4gICAgICB4OiBCdWZmZXIuZnJvbShiYWNrdXBQcnZKU09OLnBydikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeTogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4JyksXG4gICAgfSxcbiAgICB4aUxpc3Q6IGJhY2t1cFBydkpTT04ueExpc3Quc2xpY2UoMCwgMiksXG4gIH07XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXBdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlMm9mMktleVNoYXJlcyh1c2VyS2V5UmV0cm9maXQsIGJhY2t1cEtleVJldHJvZml0KTtcbiAgY29uc3QgdXNlcktleVNoYXJlID0gdXNlci5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IGJhY2t1cC5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBjb21tb25LZXlDaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyS2V5U2hhcmUpO1xuICByZXR1cm4geyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbWJpbmVkIGtleSBmb3IgR0cxOFxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThVc2VyS2V5IGVuY3J5cHRlZCBHRzE4IHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkR0cxOEJhY2t1cEtleSBlbmNyeXB0ZWQgR0cxOCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSB3YWxsZXQgcGFzc3BocmFzZVxuICogQHJldHVybnMga2V5IHNoYXJlc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRLZXlDb21iaW5lZEZyb21Uc3NLZXlTaGFyZXMoXG4gIGVuY3J5cHRlZEdHMThVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZEdHMThCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBiaXRnbzogQml0R29CYXNlXG4pOiBQcm9taXNlPFtFQ0RTQU1ldGhvZFR5cGVzLktleUNvbWJpbmVkLCBFQ0RTQU1ldGhvZFR5cGVzLktleUNvbWJpbmVkXT4ge1xuICBsZXQgYmFja3VwUHJ2O1xuICBsZXQgdXNlclBydjtcbiAgdHJ5IHtcbiAgICBiYWNrdXBQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5IH0pO1xuICAgIHVzZXJQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBlbmNyeXB0ZWRHRzE4VXNlcktleSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICB9XG5cbiAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UodXNlclBydikgYXMgRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWw7XG4gIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UoYmFja3VwUHJ2KSBhcyBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbDtcblxuICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5IC0gbWlzc2luZyBiYWNrdXBOU2hhcmUnKTtcbiAgfVxuXG4gIGlmICghYmFja3VwU2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFja3VwIGtleSAtIG1pc3NpbmcgdXNlck5TaGFyZScpO1xuICB9XG5cbiAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG5cbiAgY29uc3QgdXNlcktleUNvbWJpbmVkID0gTVBDLmtleUNvbWJpbmUodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLFxuICBdKTtcbiAgY29uc3QgYmFja3VwS2V5Q29tYmluZWQgPSBNUEMua2V5Q29tYmluZShiYWNrdXBTaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsXG4gICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICBdKTtcbiAgaWYgKFxuICAgIHVzZXJLZXlDb21iaW5lZC54U2hhcmUueSAhPT0gYmFja3VwS2V5Q29tYmluZWQueFNoYXJlLnkgfHxcbiAgICB1c2VyS2V5Q29tYmluZWQueFNoYXJlLmNoYWluY29kZSAhPT0gYmFja3VwS2V5Q29tYmluZWQueFNoYXJlLmNoYWluY29kZVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gIH1cbiAgcmV0dXJuIFt1c2VyS2V5Q29tYmluZWQsIGJhY2t1cEtleUNvbWJpbmVkXTtcbn1cblxuLy8gI2VuZHJlZ2lvblxuIl19