utxo-lib 1.1.3 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. package/dist/src/address.d.ts.map +1 -1
  2. package/dist/src/address.js +1 -11
  3. package/dist/src/addressFormat.d.ts +1 -1
  4. package/dist/src/addressFormat.d.ts.map +1 -1
  5. package/dist/src/addressFormat.js +1 -1
  6. package/dist/src/bitgo/Musig2.d.ts +17 -115
  7. package/dist/src/bitgo/Musig2.d.ts.map +1 -1
  8. package/dist/src/bitgo/Musig2.js +101 -283
  9. package/dist/src/bitgo/UtxoPsbt.d.ts +49 -173
  10. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  11. package/dist/src/bitgo/UtxoPsbt.js +112 -634
  12. package/dist/src/bitgo/bbc/DashPsbt.d.ts +12 -0
  13. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +1 -0
  14. package/dist/src/bitgo/bbc/DashPsbt.js +27 -0
  15. package/dist/src/bitgo/bbc/DashTransaction.d.ts +39 -0
  16. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +1 -0
  17. package/dist/src/bitgo/bbc/DashTransaction.js +109 -0
  18. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +14 -0
  19. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +1 -0
  20. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +28 -0
  21. package/dist/src/bitgo/bbc/index.d.ts +4 -0
  22. package/dist/src/bitgo/bbc/index.d.ts.map +1 -0
  23. package/dist/src/bitgo/{litecoin → bbc}/index.js +4 -4
  24. package/dist/src/bitgo/bitcoincash/address.js +2 -2
  25. package/dist/src/bitgo/index.d.ts +0 -10
  26. package/dist/src/bitgo/index.d.ts.map +1 -1
  27. package/dist/src/bitgo/index.js +2 -5
  28. package/dist/src/bitgo/outputScripts.d.ts +1 -3
  29. package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
  30. package/dist/src/bitgo/outputScripts.js +10 -18
  31. package/dist/src/bitgo/parseInput.d.ts +20 -49
  32. package/dist/src/bitgo/parseInput.d.ts.map +1 -1
  33. package/dist/src/bitgo/parseInput.js +24 -108
  34. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
  35. package/dist/src/bitgo/psbt/fromHalfSigned.js +6 -9
  36. package/dist/src/bitgo/signature.d.ts +3 -3
  37. package/dist/src/bitgo/signature.d.ts.map +1 -1
  38. package/dist/src/bitgo/signature.js +16 -48
  39. package/dist/src/bitgo/transaction.d.ts +3 -18
  40. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  41. package/dist/src/bitgo/transaction.js +15 -28
  42. package/dist/src/bitgo/types.d.ts +0 -2
  43. package/dist/src/bitgo/types.d.ts.map +1 -1
  44. package/dist/src/bitgo/types.js +1 -1
  45. package/dist/src/bitgo/wallet/Psbt.d.ts +12 -90
  46. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  47. package/dist/src/bitgo/wallet/Psbt.js +71 -221
  48. package/dist/src/bitgo/wallet/Unspent.d.ts +0 -28
  49. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/Unspent.js +68 -173
  51. package/dist/src/bitgo/wallet/chains.d.ts +2 -2
  52. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/chains.js +1 -1
  54. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  55. package/dist/src/bitgo/zcash/ZcashPsbt.js +3 -4
  56. package/dist/src/networks.d.ts +2 -1
  57. package/dist/src/networks.d.ts.map +1 -1
  58. package/dist/src/networks.js +29 -22
  59. package/dist/src/noble_ecc.d.ts.map +1 -1
  60. package/dist/src/noble_ecc.js +2 -6
  61. package/dist/src/payments/p2tr.d.ts.map +1 -1
  62. package/dist/src/payments/p2tr.js +9 -15
  63. package/dist/src/taproot.d.ts +0 -16
  64. package/dist/src/taproot.d.ts.map +1 -1
  65. package/dist/src/taproot.js +2 -44
  66. package/dist/src/testutil/index.d.ts +0 -2
  67. package/dist/src/testutil/index.d.ts.map +1 -1
  68. package/dist/src/testutil/index.js +1 -3
  69. package/dist/src/testutil/mock.d.ts +1 -1
  70. package/dist/src/testutil/mock.d.ts.map +1 -1
  71. package/dist/src/testutil/mock.js +4 -12
  72. package/package.json +3 -5
  73. package/dist/src/bitgo/PsbtUtil.d.ts +0 -54
  74. package/dist/src/bitgo/PsbtUtil.d.ts.map +0 -1
  75. package/dist/src/bitgo/PsbtUtil.js +0 -79
  76. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +0 -10
  77. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +0 -1
  78. package/dist/src/bitgo/litecoin/LitecoinPsbt.js +0 -17
  79. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +0 -16
  80. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +0 -1
  81. package/dist/src/bitgo/litecoin/LitecoinTransaction.js +0 -46
  82. package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.d.ts +0 -10
  83. package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.d.ts.map +0 -1
  84. package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.js +0 -15
  85. package/dist/src/bitgo/litecoin/index.d.ts +0 -4
  86. package/dist/src/bitgo/litecoin/index.d.ts.map +0 -1
  87. package/dist/src/testutil/psbt.d.ts +0 -71
  88. package/dist/src/testutil/psbt.d.ts.map +0 -1
  89. package/dist/src/testutil/psbt.js +0 -147
  90. package/dist/src/testutil/transaction.d.ts +0 -61
  91. package/dist/src/testutil/transaction.d.ts.map +0 -1
  92. package/dist/src/testutil/transaction.js +0 -107
@@ -1,12 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UtxoPsbt = void 0;
3
+ exports.UtxoPsbt = exports.ProprietaryKeySubtype = exports.PSBT_PROPRIETARY_IDENTIFIER = void 0;
4
4
  const bip174_1 = require("bip174");
5
5
  const utils_1 = require("bip174/src/lib/utils");
6
6
  const bufferutils_1 = require("bitcoinjs-lib/src/bufferutils");
7
- const bip32_1 = require("bip32");
8
- const bs58check = require("bs58check");
9
- const proprietaryKeyVal_1 = require("bip174/src/lib/proprietaryKeyVal");
10
7
  const __1 = require("..");
11
8
  const UtxoTransaction_1 = require("./UtxoTransaction");
12
9
  const Unspent_1 = require("./Unspent");
@@ -14,43 +11,20 @@ const scriptTypes_1 = require("./psbt/scriptTypes");
14
11
  const fromHalfSigned_1 = require("./psbt/fromHalfSigned");
15
12
  const outputScripts_1 = require("./outputScripts");
16
13
  const parseInput_1 = require("./parseInput");
17
- const Musig2_1 = require("./Musig2");
18
- const types_1 = require("./types");
19
- const taproot_1 = require("../taproot");
20
- const PsbtUtil_1 = require("./PsbtUtil");
21
- function defaultSighashTypes(network) {
22
- const sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL];
23
- switch (__1.getMainnet(network)) {
24
- case __1.networks.bitcoincash:
25
- case __1.networks.bitcoinsv:
26
- case __1.networks.bitcoingold:
27
- case __1.networks.ecash:
28
- return [...sighashTypes, ...sighashTypes.map((s) => s | UtxoTransaction_1.UtxoTransaction.SIGHASH_FORKID)];
29
- default:
30
- return sighashTypes;
31
- }
32
- }
33
- function toSignatureParams(network, v) {
34
- if (Array.isArray(v))
35
- return toSignatureParams(network, { sighashTypes: v });
36
- return { deterministic: false, sighashTypes: defaultSighashTypes(network), ...v };
37
- }
38
- /**
39
- * @param a
40
- * @param b
41
- * @returns true if the two public keys are equal ignoring the y coordinate.
42
- */
43
- function equalPublicKeyIgnoreY(a, b) {
44
- return outputScripts_1.toXOnlyPublicKey(a).equals(outputScripts_1.toXOnlyPublicKey(b));
45
- }
14
+ const bip32_1 = require("bip32");
15
+ const bs58check = require("bs58check");
16
+ const proprietaryKeyVal_1 = require("bip174/src/lib/proprietaryKeyVal");
17
+ exports.PSBT_PROPRIETARY_IDENTIFIER = 'BITGO';
18
+ var ProprietaryKeySubtype;
19
+ (function (ProprietaryKeySubtype) {
20
+ ProprietaryKeySubtype[ProprietaryKeySubtype["ZEC_CONSENSUS_BRANCH_ID"] = 0] = "ZEC_CONSENSUS_BRANCH_ID";
21
+ ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTICIPANT_PUB_KEYS"] = 1] = "MUSIG2_PARTICIPANT_PUB_KEYS";
22
+ ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PUB_NONCE"] = 2] = "MUSIG2_PUB_NONCE";
23
+ })(ProprietaryKeySubtype = exports.ProprietaryKeySubtype || (exports.ProprietaryKeySubtype = {}));
46
24
  // TODO: upstream does `checkInputsForPartialSigs` before doing things like
47
25
  // `setVersion`. Our inputs could have tapscriptsigs (or in future tapkeysigs)
48
26
  // and not fail that check. Do we want to do anything about that?
49
27
  class UtxoPsbt extends __1.Psbt {
50
- constructor() {
51
- super(...arguments);
52
- this.nonceStore = new Musig2_1.Musig2NonceStore();
53
- }
54
28
  static transactionFromBuffer(buffer, network) {
55
29
  return UtxoTransaction_1.UtxoTransaction.fromBuffer(buffer, false, 'bigint', network);
56
30
  }
@@ -72,47 +46,29 @@ class UtxoPsbt extends __1.Psbt {
72
46
  static fromHex(data, opts) {
73
47
  return this.fromBuffer(Buffer.from(data, 'hex'), opts);
74
48
  }
75
- /**
76
- * @param parent - Parent key. Matched with `bip32Derivations` using `fingerprint` property.
77
- * @param bip32Derivations - possible derivations for input or output
78
- * @param ignoreY - when true, ignore the y coordinate when matching public keys
79
- * @return derived bip32 node if matching derivation is found, undefined if none is found
80
- * @throws Error if more than one match is found
81
- */
82
- static deriveKeyPair(parent, bip32Derivations, { ignoreY }) {
83
- const matchingDerivations = bip32Derivations.filter((bipDv) => {
84
- return bipDv.masterFingerprint.equals(parent.fingerprint);
85
- });
86
- if (!matchingDerivations.length) {
87
- // No fingerprint match
88
- return undefined;
89
- }
90
- if (matchingDerivations.length !== 1) {
91
- throw new Error(`more than one matching derivation for fingerprint ${parent.fingerprint.toString('hex')}: ${matchingDerivations.length}`);
92
- }
93
- const [derivation] = matchingDerivations;
94
- const node = parent.derivePath(derivation.path);
95
- if (!node.publicKey.equals(derivation.pubkey)) {
96
- if (!ignoreY || !equalPublicKeyIgnoreY(node.publicKey, derivation.pubkey)) {
97
- throw new Error('pubkey did not match bip32Derivation');
98
- }
99
- }
100
- return node;
101
- }
102
- static deriveKeyPairForInput(bip32, input) {
103
- var _a, _b, _c, _d;
104
- return ((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)
105
- ? (_b = UtxoPsbt.deriveKeyPair(bip32, input.tapBip32Derivation, { ignoreY: true })) === null || _b === void 0 ? void 0 : _b.publicKey
106
- : ((_c = input.bip32Derivation) === null || _c === void 0 ? void 0 : _c.length)
107
- ? (_d = UtxoPsbt.deriveKeyPair(bip32, input.bip32Derivation, { ignoreY: false })) === null || _d === void 0 ? void 0 : _d.publicKey
108
- : bip32 === null || bip32 === void 0 ? void 0 : bip32.publicKey;
109
- }
110
49
  get network() {
111
50
  return this.tx.network;
112
51
  }
113
52
  toHex() {
114
53
  return this.toBuffer().toString('hex');
115
54
  }
55
+ /**
56
+ * @return true iff PSBT input is finalized
57
+ */
58
+ isInputFinalized(inputIndex) {
59
+ const input = utils_1.checkForInput(this.data.inputs, inputIndex);
60
+ return Buffer.isBuffer(input.finalScriptSig) || Buffer.isBuffer(input.finalScriptWitness);
61
+ }
62
+ /**
63
+ * @return partialSig/tapScriptSig count iff input is not finalized
64
+ */
65
+ getSignatureCount(inputIndex) {
66
+ if (this.isInputFinalized(inputIndex)) {
67
+ throw new Error('Input is already finalized');
68
+ }
69
+ const input = utils_1.checkForInput(this.data.inputs, inputIndex);
70
+ return Math.max(Array.isArray(input.partialSig) ? input.partialSig.length : 0, Array.isArray(input.tapScriptSig) ? input.tapScriptSig.length : 0);
71
+ }
116
72
  getNonWitnessPreviousTxids() {
117
73
  const txInputs = this.txInputs; // These are somewhat costly to extract
118
74
  const txidSet = new Set();
@@ -175,99 +131,14 @@ class UtxoPsbt extends __1.Psbt {
175
131
  }
176
132
  });
177
133
  }
178
- /**
179
- * @returns true if the input at inputIndex is a taproot key path.
180
- * Checks for presence of minimum required key path input fields and absence of any script path only input fields.
181
- */
182
- isTaprootKeyPathInput(inputIndex) {
183
- var _a, _b, _c;
184
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
185
- return (!!input.tapInternalKey &&
186
- !!input.tapMerkleRoot &&
187
- !(((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) ||
188
- ((_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.length) ||
189
- ((_c = input.tapBip32Derivation) === null || _c === void 0 ? void 0 : _c.some((v) => v.leafHashes.length))));
190
- }
191
- /**
192
- * @returns true if the input at inputIndex is a taproot script path.
193
- * Checks for presence of minimum required script path input fields and absence of any key path only input fields.
194
- */
195
- isTaprootScriptPathInput(inputIndex) {
196
- var _a;
197
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
198
- return (!!((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) &&
199
- !(this.getProprietaryKeyVals(inputIndex, {
200
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
201
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
202
- }).length ||
203
- this.getProprietaryKeyVals(inputIndex, {
204
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
205
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
206
- }).length ||
207
- this.getProprietaryKeyVals(inputIndex, {
208
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
209
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
210
- }).length));
211
- }
212
- /**
213
- * @returns true if the input at inputIndex is a taproot
214
- */
215
- isTaprootInput(inputIndex) {
216
- var _a, _b, _c;
217
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
218
- const isP2TR = (script) => {
219
- try {
220
- taproot_1.getTaprootOutputKey(script);
221
- return true;
222
- }
223
- catch (e) {
224
- return false;
225
- }
226
- };
227
- return !!(input.tapInternalKey ||
228
- input.tapMerkleRoot ||
229
- ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) ||
230
- ((_b = input.tapBip32Derivation) === null || _b === void 0 ? void 0 : _b.length) ||
231
- ((_c = input.tapScriptSig) === null || _c === void 0 ? void 0 : _c.length) ||
232
- this.getProprietaryKeyVals(inputIndex, {
233
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
234
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
235
- }).length ||
236
- this.getProprietaryKeyVals(inputIndex, {
237
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
238
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
239
- }).length ||
240
- this.getProprietaryKeyVals(inputIndex, {
241
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
242
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
243
- }).length ||
244
- (input.witnessUtxo && isP2TR(input.witnessUtxo.script)));
245
- }
246
134
  /**
247
135
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts
248
136
  */
249
137
  finalizeAllInputs() {
250
- const isMultisigTaprootScript = (script) => {
251
- try {
252
- parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend');
253
- return true;
254
- }
255
- catch (e) {
256
- return false;
257
- }
258
- };
259
138
  utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one
260
139
  this.data.inputs.map((input, idx) => {
261
140
  var _a;
262
- if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
263
- return isMultisigTaprootScript(input.tapLeafScript[0].script)
264
- ? this.finalizeTaprootInput(idx)
265
- : this.finalizeTapInputWithSingleLeafScriptAndSignature(idx);
266
- }
267
- else if (this.isTaprootKeyPathInput(idx)) {
268
- return this.finalizeTaprootMusig2Input(idx);
269
- }
270
- return this.finalizeInput(idx);
141
+ return ((_a = input.tapScriptSig) === null || _a === void 0 ? void 0 : _a.length) ? this.finalizeTaprootInput(idx) : this.finalizeInput(idx);
271
142
  });
272
143
  return this;
273
144
  }
@@ -280,9 +151,9 @@ class UtxoPsbt extends __1.Psbt {
280
151
  }
281
152
  const { controlBlock, script } = input.tapLeafScript[0];
282
153
  const witness = [script, controlBlock];
283
- const [pubkey1, pubkey2] = parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend').publicKeys;
154
+ const [pubkey1, pubkey2] = parseInput_1.parsePubScript(script, 'p2tr').publicKeys;
284
155
  for (const pk of [pubkey1, pubkey2]) {
285
- const sig = (_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.find(({ pubkey }) => equalPublicKeyIgnoreY(pk, pubkey));
156
+ const sig = (_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.find(({ pubkey }) => pubkey.equals(pk));
286
157
  if (!sig) {
287
158
  throw new Error('Could not find signatures in Script Sig.');
288
159
  }
@@ -296,30 +167,6 @@ class UtxoPsbt extends __1.Psbt {
296
167
  this.data.clearFinalizedInput(inputIndex);
297
168
  return this;
298
169
  }
299
- /**
300
- * Finalizes a taproot musig2 input by aggregating all partial sigs.
301
- * IMPORTANT: Always call validate* function before finalizing.
302
- */
303
- finalizeTaprootMusig2Input(inputIndex) {
304
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
305
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(input);
306
- if ((partialSigs === null || partialSigs === void 0 ? void 0 : partialSigs.length) !== 2) {
307
- throw new Error(`invalid number of partial signatures ${partialSigs ? partialSigs.length : 0} to finalize`);
308
- }
309
- const { partialSigs: pSigs, sigHashType } = Musig2_1.getSigHashTypeFromSigs(partialSigs);
310
- const { sessionKey } = this.getMusig2SessionKey(inputIndex, sigHashType);
311
- const aggSig = Musig2_1.musig2AggregateSigs(pSigs.map((pSig) => pSig.partialSig), sessionKey);
312
- const sig = sigHashType === __1.Transaction.SIGHASH_DEFAULT ? aggSig : Buffer.concat([aggSig, Buffer.of(sigHashType)]);
313
- // single signature with 64/65 bytes size is script witness for key path spend
314
- const bufferWriter = bufferutils_1.BufferWriter.withCapacity(1 + bufferutils_1.varuint.encodingLength(sig.length) + sig.length);
315
- bufferWriter.writeVector([sig]);
316
- const finalScriptWitness = bufferWriter.end();
317
- this.data.updateInput(inputIndex, { finalScriptWitness });
318
- this.data.clearFinalizedInput(inputIndex);
319
- // deleting only BitGo proprietary key values.
320
- this.deleteProprietaryKeyVals(inputIndex, { identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER });
321
- return this;
322
- }
323
170
  finalizeTapInputWithSingleLeafScriptAndSignature(inputIndex) {
324
171
  var _a, _b;
325
172
  const input = utils_1.checkForInput(this.data.inputs, inputIndex);
@@ -349,97 +196,13 @@ class UtxoPsbt extends __1.Psbt {
349
196
  validateSignaturesOfAllInputs() {
350
197
  utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one
351
198
  const results = this.data.inputs.map((input, idx) => {
352
- return this.validateSignaturesOfInputCommon(idx);
199
+ var _a;
200
+ return ((_a = input.tapScriptSig) === null || _a === void 0 ? void 0 : _a.length)
201
+ ? this.validateTaprootSignaturesOfInput(idx)
202
+ : this.validateSignaturesOfInput(idx, (p, m, s) => __1.ecc.verify(m, p, s));
353
203
  });
354
204
  return results.reduce((final, res) => res && final, true);
355
205
  }
356
- /**
357
- * @returns true iff any matching valid signature is found for a derived pub key from given HD key pair.
358
- */
359
- validateSignaturesOfInputHD(inputIndex, hdKeyPair) {
360
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
361
- const pubKey = UtxoPsbt.deriveKeyPairForInput(hdKeyPair, input);
362
- if (!pubKey) {
363
- throw new Error('can not derive from HD key pair');
364
- }
365
- return this.validateSignaturesOfInputCommon(inputIndex, pubKey);
366
- }
367
- /**
368
- * @returns true iff any valid signature(s) are found from bip32 data of PSBT or for given pub key.
369
- */
370
- validateSignaturesOfInputCommon(inputIndex, pubkey) {
371
- try {
372
- if (this.isTaprootScriptPathInput(inputIndex)) {
373
- return this.validateTaprootSignaturesOfInput(inputIndex, pubkey);
374
- }
375
- else if (this.isTaprootKeyPathInput(inputIndex)) {
376
- return this.validateTaprootMusig2SignaturesOfInput(inputIndex, pubkey);
377
- }
378
- return this.validateSignaturesOfInput(inputIndex, (p, m, s) => __1.ecc.verify(m, p, s, true), pubkey);
379
- }
380
- catch (err) {
381
- // Not an elegant solution. Might need upstream changes like custom error types.
382
- if (err.message === 'No signatures for this pubkey') {
383
- return false;
384
- }
385
- throw err;
386
- }
387
- }
388
- getMusig2SessionKey(inputIndex, sigHashType) {
389
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
390
- if (!input.tapInternalKey || !input.tapMerkleRoot) {
391
- throw new Error('both tapInternalKey and tapMerkleRoot are required');
392
- }
393
- const participants = this.getMusig2Participants(inputIndex, input.tapInternalKey, input.tapMerkleRoot);
394
- const nonces = this.getMusig2Nonces(inputIndex, participants);
395
- const { hash } = this.getTaprootHashForSig(inputIndex, [sigHashType]);
396
- const sessionKey = Musig2_1.createMusig2SigningSession({
397
- pubNonces: [nonces[0].pubNonce, nonces[1].pubNonce],
398
- pubKeys: participants.participantPubKeys,
399
- txHash: hash,
400
- internalPubKey: input.tapInternalKey,
401
- tapTreeRoot: input.tapMerkleRoot,
402
- });
403
- return { participants, nonces, hash, sessionKey };
404
- }
405
- /**
406
- * @returns true for following cases.
407
- * If valid musig2 partial signatures exists for both 2 keys, it will also verify aggregated sig
408
- * for aggregated tweaked key (output key), otherwise only verifies partial sig.
409
- * If pubkey is passed in input, it will check sig only for that pubkey,
410
- * if no sig exits for such key, throws error.
411
- * For invalid state of input data, it will throw errors.
412
- */
413
- validateTaprootMusig2SignaturesOfInput(inputIndex, pubkey) {
414
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
415
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(input);
416
- if (!partialSigs) {
417
- throw new Error(`No signatures to validate`);
418
- }
419
- let myPartialSigs = partialSigs;
420
- if (pubkey) {
421
- myPartialSigs = partialSigs.filter((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, pubkey));
422
- if ((myPartialSigs === null || myPartialSigs === void 0 ? void 0 : myPartialSigs.length) < 1) {
423
- throw new Error('No signatures for this pubkey');
424
- }
425
- }
426
- const { partialSigs: mySigs, sigHashType } = Musig2_1.getSigHashTypeFromSigs(myPartialSigs);
427
- const { participants, nonces, hash, sessionKey } = this.getMusig2SessionKey(inputIndex, sigHashType);
428
- const results = mySigs.map((mySig) => {
429
- const myNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, mySig.participantPubKey));
430
- if (!myNonce) {
431
- throw new Error('Found no pub nonce for pubkey');
432
- }
433
- return Musig2_1.musig2PartialSigVerify(mySig.partialSig, mySig.participantPubKey, myNonce.pubNonce, sessionKey);
434
- });
435
- // For valid single sig or 1 or 2 failure sigs, no need to validate aggregated sig. So skip.
436
- const result = results.every((res) => res);
437
- if (!result || mySigs.length < 2) {
438
- return result;
439
- }
440
- const aggSig = Musig2_1.musig2AggregateSigs(mySigs.map((mySig) => mySig.partialSig), sessionKey);
441
- return __1.ecc.verifySchnorr(hash, participants.tapOutputKey, aggSig);
442
- }
443
206
  validateTaprootSignaturesOfInput(inputIndex, pubkey) {
444
207
  const input = this.data.inputs[inputIndex];
445
208
  const tapSigs = (input || {}).tapScriptSig;
@@ -448,7 +211,8 @@ class UtxoPsbt extends __1.Psbt {
448
211
  }
449
212
  let mySigs;
450
213
  if (pubkey) {
451
- mySigs = tapSigs.filter((sig) => equalPublicKeyIgnoreY(sig.pubkey, pubkey));
214
+ const xOnlyPubkey = outputScripts_1.toXOnlyPublicKey(pubkey);
215
+ mySigs = tapSigs.filter((sig) => sig.pubkey.equals(xOnlyPubkey));
452
216
  if (mySigs.length < 1) {
453
217
  throw new Error('No signatures for this pubkey');
454
218
  }
@@ -472,40 +236,34 @@ class UtxoPsbt extends __1.Psbt {
472
236
  const { hash } = this.getTaprootHashForSig(inputIndex, [sigHashType], leafHash);
473
237
  results.push(__1.ecc.verifySchnorr(hash, pubkey, sig));
474
238
  }
475
- return results.every((res) => res);
239
+ return results.every((res) => res === true);
476
240
  }
477
241
  /**
478
- * @param inputIndex
479
- * @param rootNodes optional input root bip32 nodes to verify with. If it is not provided, globalXpub will be used.
480
242
  * @return array of boolean values. True when corresponding index in `publicKeys` has signed the transaction.
481
243
  * If no signature in the tx or no public key matching signature, the validation is considered as false.
482
244
  */
483
- getSignatureValidationArray(inputIndex, { rootNodes } = {}) {
484
- var _a, _b;
485
- if (!rootNodes && (!((_a = this.data.globalMap.globalXpub) === null || _a === void 0 ? void 0 : _a.length) || !types_1.isTriple(this.data.globalMap.globalXpub))) {
486
- throw new Error('Cannot get signature validation array without 3 global xpubs');
487
- }
488
- const bip32s = rootNodes
489
- ? rootNodes
490
- : (_b = this.data.globalMap.globalXpub) === null || _b === void 0 ? void 0 : _b.map((xpub) => bip32_1.BIP32Factory(__1.ecc).fromBase58(bs58check.encode(xpub.extendedPubkey)));
491
- if (!bip32s) {
492
- throw new Error('either globalMap or rootNodes is required');
493
- }
245
+ getSignatureValidationArray(inputIndex) {
246
+ var _a;
247
+ const noSigErrorMessages = ['No signatures to validate', 'No signatures for this pubkey'];
494
248
  const input = utils_1.checkForInput(this.data.inputs, inputIndex);
495
- if (!PsbtUtil_1.getPsbtInputSignatureCount(input)) {
496
- return [false, false, false];
249
+ const isP2tr = (_a = input.tapScriptSig) === null || _a === void 0 ? void 0 : _a.length;
250
+ if (!this.data.globalMap.globalXpub) {
251
+ throw new Error('Cannot get signature validation array without global xpubs');
497
252
  }
498
- return bip32s.map((bip32) => {
499
- const pubKey = UtxoPsbt.deriveKeyPairForInput(bip32, input);
500
- if (!pubKey) {
501
- return false;
502
- }
253
+ if (this.data.globalMap.globalXpub.length !== 3) {
254
+ throw new Error(`There must be 3 global xpubs and there are ${this.data.globalMap.globalXpub.length}`);
255
+ }
256
+ return this.data.globalMap.globalXpub.map((xpub) => {
257
+ // const bip32 = ECPair.fromPublicKey(xpub.extendedPubkey, { network: (this as any).opts.network });
258
+ const bip32 = bip32_1.BIP32Factory(__1.ecc).fromBase58(bs58check.encode(xpub.extendedPubkey));
503
259
  try {
504
- return this.validateSignaturesOfInputCommon(inputIndex, pubKey);
260
+ return isP2tr
261
+ ? this.validateTaprootSignaturesOfInput(inputIndex, bip32.publicKey)
262
+ : this.validateSignaturesOfInput(inputIndex, (p, m, s) => __1.ecc.verify(m, p, s), bip32.publicKey);
505
263
  }
506
264
  catch (err) {
507
265
  // Not an elegant solution. Might need upstream changes like custom error types.
508
- if (err.message === 'No signatures for this pubkey') {
266
+ if (noSigErrorMessages.includes(err.message)) {
509
267
  return false;
510
268
  }
511
269
  throw err;
@@ -515,22 +273,27 @@ class UtxoPsbt extends __1.Psbt {
515
273
  /**
516
274
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts
517
275
  */
518
- signAllInputsHD(hdKeyPair, params) {
276
+ signAllInputsHD(hdKeyPair, sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL]) {
277
+ var _a;
519
278
  if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) {
520
279
  throw new Error('Need HDSigner to sign input');
521
280
  }
522
- const { sighashTypes, deterministic } = toSignatureParams(this.network, params);
523
281
  const results = [];
524
282
  for (let i = 0; i < this.data.inputs.length; i++) {
525
283
  try {
526
- this.signInputHD(i, hdKeyPair, { sighashTypes, deterministic });
284
+ if ((_a = this.data.inputs[i].tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length) {
285
+ this.signTaprootInputHD(i, hdKeyPair, sighashTypes);
286
+ }
287
+ else {
288
+ this.signInputHD(i, hdKeyPair, sighashTypes);
289
+ }
527
290
  results.push(true);
528
291
  }
529
292
  catch (err) {
530
293
  results.push(false);
531
294
  }
532
295
  }
533
- if (results.every((v) => !v)) {
296
+ if (results.every((v) => v === false)) {
534
297
  throw new Error('No inputs were signed');
535
298
  }
536
299
  return this;
@@ -538,11 +301,7 @@ class UtxoPsbt extends __1.Psbt {
538
301
  /**
539
302
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts:signInputHD
540
303
  */
541
- signTaprootInputHD(inputIndex, hdKeyPair, { sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL], deterministic = false } = {}) {
542
- var _a, _b;
543
- if (!this.isTaprootInput(inputIndex)) {
544
- throw new Error('not a taproot input');
545
- }
304
+ signTaprootInputHD(inputIndex, hdKeyPair, sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL]) {
546
305
  if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) {
547
306
  throw new Error('Need HDSigner to sign input');
548
307
  }
@@ -560,137 +319,25 @@ class UtxoPsbt extends __1.Psbt {
560
319
  if (myDerivations.length === 0) {
561
320
  throw new Error('Need one tapBip32Derivation masterFingerprint to match the HDSigner fingerprint');
562
321
  }
563
- function getDerivedNode(bipDv) {
322
+ const signers = myDerivations.map((bipDv) => {
564
323
  const node = hdKeyPair.derivePath(bipDv.path);
565
- if (!equalPublicKeyIgnoreY(bipDv.pubkey, node.publicKey)) {
324
+ if (!bipDv.pubkey.equals(node.publicKey.slice(1))) {
566
325
  throw new Error('pubkey did not match tapBip32Derivation');
567
326
  }
568
- return node;
569
- }
570
- if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
571
- const signers = myDerivations.map((bipDv) => {
572
- const signer = getDerivedNode(bipDv);
573
- if (!('signSchnorr' in signer)) {
574
- throw new Error('signSchnorr function is required to sign p2tr');
575
- }
576
- return { signer, leafHashes: bipDv.leafHashes };
577
- });
578
- signers.forEach(({ signer, leafHashes }) => this.signTaprootInput(inputIndex, signer, leafHashes, sighashTypes));
579
- }
580
- else if ((_b = input.tapInternalKey) === null || _b === void 0 ? void 0 : _b.length) {
581
- const signers = myDerivations.map((bipDv) => {
582
- const signer = getDerivedNode(bipDv);
583
- if (!('privateKey' in signer) || !signer.privateKey) {
584
- throw new Error('privateKey is required to sign p2tr musig2');
585
- }
586
- return signer;
587
- });
588
- signers.forEach((signer) => this.signTaprootMusig2Input(inputIndex, signer, { sighashTypes, deterministic }));
589
- }
590
- return this;
591
- }
592
- signInputHD(inputIndex, hdKeyPair, params) {
593
- const { sighashTypes, deterministic } = toSignatureParams(this.network, params);
594
- if (this.isTaprootInput(inputIndex)) {
595
- return this.signTaprootInputHD(inputIndex, hdKeyPair, { sighashTypes, deterministic });
596
- }
597
- else {
598
- return super.signInputHD(inputIndex, hdKeyPair, sighashTypes);
599
- }
600
- }
601
- getMusig2Participants(inputIndex, tapInternalKey, tapMerkleRoot) {
602
- const participantsKeyValData = Musig2_1.parsePsbtMusig2Participants(this.data.inputs[inputIndex]);
603
- if (!participantsKeyValData) {
604
- throw new Error(`Found 0 matching participant key value instead of 1`);
605
- }
606
- Musig2_1.assertPsbtMusig2Participants(participantsKeyValData, tapInternalKey, tapMerkleRoot);
607
- return participantsKeyValData;
608
- }
609
- getMusig2Nonces(inputIndex, participantsKeyValData) {
610
- const noncesKeyValsData = Musig2_1.parsePsbtMusig2Nonces(this.data.inputs[inputIndex]);
611
- if (!noncesKeyValsData || !types_1.isTuple(noncesKeyValsData)) {
612
- throw new Error(`Found ${(noncesKeyValsData === null || noncesKeyValsData === void 0 ? void 0 : noncesKeyValsData.length) ? noncesKeyValsData.length : 0} matching nonce key value instead of 2`);
613
- }
614
- Musig2_1.assertPsbtMusig2Nonces(noncesKeyValsData, participantsKeyValData);
615
- return noncesKeyValsData;
616
- }
617
- /**
618
- * Signs p2tr musig2 key path input with 2 aggregated keys.
619
- *
620
- * Note: Only can sign deterministically as the cosigner
621
- * @param inputIndex
622
- * @param signer - XY public key and private key are required
623
- * @param sighashTypes
624
- * @param deterministic If true, sign the musig input deterministically
625
- */
626
- signTaprootMusig2Input(inputIndex, signer, { sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL], deterministic = false } = {}) {
627
- if (!this.isTaprootKeyPathInput(inputIndex)) {
628
- throw new Error('not a taproot musig2 input');
629
- }
630
- const input = this.data.inputs[inputIndex];
631
- if (!input.tapInternalKey || !input.tapMerkleRoot) {
632
- throw new Error('missing required input data');
633
- }
634
- // Retrieve and check that we have two participant nonces
635
- const participants = this.getMusig2Participants(inputIndex, input.tapInternalKey, input.tapMerkleRoot);
636
- const { tapOutputKey, participantPubKeys } = participants;
637
- const signerPubKey = participantPubKeys.find((pubKey) => equalPublicKeyIgnoreY(pubKey, signer.publicKey));
638
- if (!signerPubKey) {
639
- throw new Error('signer pub key should match one of participant pub keys');
640
- }
641
- const nonces = this.getMusig2Nonces(inputIndex, participants);
642
- const { hash, sighashType } = this.getTaprootHashForSig(inputIndex, sighashTypes);
643
- let partialSig;
644
- if (deterministic) {
645
- if (!equalPublicKeyIgnoreY(signerPubKey, participantPubKeys[1])) {
646
- throw new Error('can only add a deterministic signature on the cosigner');
647
- }
648
- const firstSignerNonce = nonces.find((n) => equalPublicKeyIgnoreY(n.participantPubKey, participantPubKeys[0]));
649
- if (!firstSignerNonce) {
650
- throw new Error('could not find the user nonce');
651
- }
652
- partialSig = Musig2_1.musig2DeterministicSign({
653
- privateKey: signer.privateKey,
654
- otherNonce: firstSignerNonce.pubNonce,
655
- publicKeys: participantPubKeys,
656
- internalPubKey: input.tapInternalKey,
657
- tapTreeRoot: input.tapMerkleRoot,
658
- hash,
659
- }).sig;
660
- }
661
- else {
662
- const sessionKey = Musig2_1.createMusig2SigningSession({
663
- pubNonces: [nonces[0].pubNonce, nonces[1].pubNonce],
664
- pubKeys: participantPubKeys,
665
- txHash: hash,
666
- internalPubKey: input.tapInternalKey,
667
- tapTreeRoot: input.tapMerkleRoot,
668
- });
669
- const signerNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, signerPubKey));
670
- if (!signerNonce) {
671
- throw new Error('pubNonce is missing. retry signing process');
672
- }
673
- partialSig = Musig2_1.musig2PartialSign(signer.privateKey, signerNonce.pubNonce, sessionKey, this.nonceStore);
674
- }
675
- if (sighashType !== __1.Transaction.SIGHASH_DEFAULT) {
676
- partialSig = Buffer.concat([partialSig, Buffer.of(sighashType)]);
677
- }
678
- const sig = Musig2_1.encodePsbtMusig2PartialSig({
679
- participantPubKey: signerPubKey,
680
- tapOutputKey,
681
- partialSig: partialSig,
327
+ return { signer: node, leafHashes: bipDv.leafHashes };
682
328
  });
683
- this.addProprietaryKeyValToInput(inputIndex, sig);
329
+ signers.forEach(({ signer, leafHashes }) => this.signTaprootInput(inputIndex, signer, leafHashes, sighashTypes));
684
330
  return this;
685
331
  }
686
332
  signTaprootInput(inputIndex, signer, leafHashes, sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL]) {
687
333
  var _a;
334
+ const pubkey = outputScripts_1.toXOnlyPublicKey(signer.publicKey);
688
335
  const input = utils_1.checkForInput(this.data.inputs, inputIndex);
689
336
  // Figure out if this is script path or not, if not, tweak the private key
690
337
  if (!((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length)) {
691
- throw new Error('tapLeafScript is required for p2tr script path');
338
+ // See BitGo/BitGoJS/modules/utxo_lib/src/transaction_builder.ts:trySign for how to support it.
339
+ throw new Error('Taproot key path signing is not supported.');
692
340
  }
693
- const pubkey = outputScripts_1.toXOnlyPublicKey(signer.publicKey);
694
341
  if (input.tapLeafScript.length !== 1) {
695
342
  throw new Error('Only one leaf script supported for signing');
696
343
  }
@@ -720,27 +367,7 @@ class UtxoPsbt extends __1.Psbt {
720
367
  });
721
368
  return this;
722
369
  }
723
- getTaprootOutputScript(inputIndex) {
724
- var _a;
725
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
726
- if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
727
- return __1.taproot.createTaprootOutputScript({
728
- controlBlock: input.tapLeafScript[0].controlBlock,
729
- leafScript: input.tapLeafScript[0].script,
730
- });
731
- }
732
- else if (input.tapInternalKey && input.tapMerkleRoot) {
733
- return __1.taproot.createTaprootOutputScript({
734
- internalPubKey: input.tapInternalKey,
735
- taptreeRoot: input.tapMerkleRoot,
736
- });
737
- }
738
- throw new Error('not a taproot input');
739
- }
740
370
  getTaprootHashForSig(inputIndex, sighashTypes, leafHash) {
741
- if (!this.isTaprootInput(inputIndex)) {
742
- throw new Error('not a taproot input');
743
- }
744
371
  const sighashType = this.data.inputs[inputIndex].sighashType || __1.Transaction.SIGHASH_DEFAULT;
745
372
  if (sighashTypes && sighashTypes.indexOf(sighashType) < 0) {
746
373
  throw new Error(`Sighash type is not allowed. Retry the sign method passing the ` +
@@ -772,220 +399,71 @@ class UtxoPsbt extends __1.Psbt {
772
399
  prevoutScripts.push(prevout.script);
773
400
  prevoutValues.push(prevout.value);
774
401
  });
775
- const outputScript = this.getTaprootOutputScript(inputIndex);
776
- if (!outputScript.equals(prevoutScripts[inputIndex])) {
777
- throw new Error(`Witness script for input #${inputIndex} doesn't match the scriptPubKey in the prevout`);
778
- }
779
402
  const hash = this.tx.hashForWitnessV1(inputIndex, prevoutScripts, prevoutValues, sighashType, leafHash);
780
403
  return { hash, sighashType };
781
404
  }
782
405
  /**
783
- * Adds proprietary key value pair to PSBT input.
784
- * Default identifierEncoding is utf-8 for identifier.
406
+ * @retuns true iff the input is taproot.
785
407
  */
786
- addProprietaryKeyValToInput(inputIndex, keyValueData) {
787
- return this.addUnknownKeyValToInput(inputIndex, {
788
- key: proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key),
789
- value: keyValueData.value,
790
- });
408
+ isTaprootInput(inputIndex) {
409
+ const input = utils_1.checkForInput(this.data.inputs, inputIndex);
410
+ function isP2tr(output) {
411
+ try {
412
+ __1.p2trPayments.p2tr({ output }, { eccLib: __1.ecc });
413
+ return true;
414
+ }
415
+ catch (err) {
416
+ return false;
417
+ }
418
+ }
419
+ return !!(input.tapInternalKey ||
420
+ input.tapMerkleRoot ||
421
+ (input.tapLeafScript && input.tapLeafScript.length) ||
422
+ (input.tapBip32Derivation && input.tapBip32Derivation.length) ||
423
+ (input.witnessUtxo && isP2tr(input.witnessUtxo.script)));
791
424
  }
792
425
  /**
793
- * Adds or updates (if exists) proprietary key value pair to PSBT input.
794
- * Default identifierEncoding is utf-8 for identifier.
426
+ * @returns hash and hashType for taproot input at inputIndex
427
+ * @throws error if input at inputIndex is not a taproot input
795
428
  */
796
- addOrUpdateProprietaryKeyValToInput(inputIndex, keyValueData) {
797
- var _a;
798
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
799
- const key = proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key);
800
- const { value } = keyValueData;
801
- if ((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length) {
802
- const ukvIndex = input.unknownKeyVals.findIndex((ukv) => ukv.key.equals(key));
803
- if (ukvIndex > -1) {
804
- input.unknownKeyVals[ukvIndex] = { key, value };
805
- return this;
806
- }
429
+ getTaprootHashForSigChecked(inputIndex, sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL], leafHash) {
430
+ if (!this.isTaprootInput(inputIndex)) {
431
+ throw new Error(`${inputIndex} input is not a taproot type to take taproot tx hash`);
807
432
  }
808
- this.addUnknownKeyValToInput(inputIndex, {
809
- key,
810
- value,
811
- });
812
- return this;
433
+ return this.getTaprootHashForSig(inputIndex, sighashTypes, leafHash);
813
434
  }
814
435
  /**
815
- * To search any data from proprietary key value against keydata.
436
+ * Adds proprietary key value pair to PSBT input.
816
437
  * Default identifierEncoding is utf-8 for identifier.
817
438
  */
818
- getProprietaryKeyVals(inputIndex, keySearch) {
819
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
820
- return PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, keySearch);
439
+ addProprietaryKeyValToInput(inputIndex, keyValueData) {
440
+ return this.addUnknownKeyValToInput(inputIndex, {
441
+ key: proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key),
442
+ value: keyValueData.value,
443
+ });
821
444
  }
822
445
  /**
823
- * To delete any data from proprietary key value.
446
+ * To search any data from proprietary key value againts keydata.
824
447
  * Default identifierEncoding is utf-8 for identifier.
825
448
  */
826
- deleteProprietaryKeyVals(inputIndex, keysToDelete) {
827
- var _a;
449
+ getProprietaryKeyVals(inputIndex, keySearch) {
828
450
  const input = utils_1.checkForInput(this.data.inputs, inputIndex);
829
- if (!((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length)) {
830
- return this;
831
- }
832
- if (keysToDelete && keysToDelete.subtype === undefined && Buffer.isBuffer(keysToDelete.keydata)) {
833
- throw new Error('invalid proprietary key search filter combination. subtype is required');
451
+ if (!input.unknownKeyVals || input.unknownKeyVals.length === 0) {
452
+ return [];
834
453
  }
835
- input.unknownKeyVals = input.unknownKeyVals.filter((keyValue, i) => {
836
- const key = proprietaryKeyVal_1.decodeProprietaryKey(keyValue.key);
837
- return !(keysToDelete === undefined ||
838
- (keysToDelete.identifier === key.identifier &&
839
- (keysToDelete.subtype === undefined ||
840
- (keysToDelete.subtype === key.subtype &&
841
- (!Buffer.isBuffer(keysToDelete.keydata) || keysToDelete.keydata.equals(key.keydata))))));
454
+ const keyVals = input.unknownKeyVals.map(({ key, value }, i) => {
455
+ return { key: proprietaryKeyVal_1.decodeProprietaryKey(key), value };
842
456
  });
843
- return this;
844
- }
845
- createMusig2NonceForInput(inputIndex, keyPair, keyType, params = { deterministic: false }) {
846
- const input = this.data.inputs[inputIndex];
847
- if (!input.tapInternalKey) {
848
- throw new Error('tapInternalKey is required to create nonce');
849
- }
850
- if (!input.tapMerkleRoot) {
851
- throw new Error('tapMerkleRoot is required to create nonce');
852
- }
853
- const getDerivedKeyPair = () => {
854
- var _a;
855
- if (!((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)) {
856
- throw new Error('tapBip32Derivation is required to create nonce');
857
- }
858
- const derived = UtxoPsbt.deriveKeyPair(keyPair, input.tapBip32Derivation, { ignoreY: true });
859
- if (!derived) {
860
- throw new Error('No bip32Derivation masterFingerprint matched the HD keyPair fingerprint');
861
- }
862
- return derived;
863
- };
864
- const derivedKeyPair = keyType === 'root' ? getDerivedKeyPair() : keyPair;
865
- if (!derivedKeyPair.privateKey) {
866
- throw new Error('privateKey is required to create nonce');
867
- }
868
- const participants = Musig2_1.parsePsbtMusig2Participants(input);
869
- if (!participants) {
870
- throw new Error(`Found 0 matching participant key value instead of 1`);
871
- }
872
- Musig2_1.assertPsbtMusig2Participants(participants, input.tapInternalKey, input.tapMerkleRoot);
873
- const { tapOutputKey, participantPubKeys } = participants;
874
- const participantPubKey = participantPubKeys.find((pubKey) => equalPublicKeyIgnoreY(pubKey, derivedKeyPair.publicKey));
875
- if (!Buffer.isBuffer(participantPubKey)) {
876
- throw new Error('participant plain pub key should match one bip32Derivation plain pub key');
877
- }
878
- const { hash } = this.getTaprootHashForSig(inputIndex);
879
- let pubNonce;
880
- if (params.deterministic) {
881
- if (params.sessionId) {
882
- throw new Error('Cannot add extra entropy when generating a deterministic nonce');
883
- }
884
- // There must be only 2 participant pubKeys if it got to this point
885
- if (!equalPublicKeyIgnoreY(participantPubKey, participantPubKeys[1])) {
886
- throw new Error(`Only the cosigner's nonce can be set deterministically`);
887
- }
888
- const nonces = Musig2_1.parsePsbtMusig2Nonces(input);
889
- if (!nonces) {
890
- throw new Error(`No nonces found on input #${inputIndex}`);
891
- }
892
- if (nonces.length > 2) {
893
- throw new Error(`Cannot have more than 2 nonces`);
894
- }
895
- const firstSignerNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, participantPubKeys[0]));
896
- if (!firstSignerNonce) {
897
- throw new Error('signer nonce must be set if cosigner nonce is to be derived deterministically');
898
- }
899
- pubNonce = Musig2_1.createMusig2DeterministicNonce({
900
- privateKey: derivedKeyPair.privateKey,
901
- otherNonce: firstSignerNonce.pubNonce,
902
- publicKeys: participantPubKeys,
903
- internalPubKey: input.tapInternalKey,
904
- tapTreeRoot: input.tapMerkleRoot,
905
- hash,
906
- });
907
- }
908
- else {
909
- pubNonce = Buffer.from(this.nonceStore.createMusig2Nonce(derivedKeyPair.privateKey, participantPubKey, tapOutputKey, hash, params.sessionId));
910
- }
911
- return { tapOutputKey, participantPubKey, pubNonce };
912
- }
913
- setMusig2NoncesInner(keyPair, keyType, inputIndex, params = { deterministic: false }) {
914
- if (keyPair.isNeutered()) {
915
- throw new Error('private key is required to generate nonce');
916
- }
917
- if (Buffer.isBuffer(params.sessionId) && params.sessionId.length !== 32) {
918
- throw new Error(`Invalid sessionId size ${params.sessionId.length}`);
919
- }
920
- const inputIndexes = inputIndex === undefined ? [...Array(this.inputCount).keys()] : [inputIndex];
921
- inputIndexes.forEach((index) => {
922
- if (!this.isTaprootKeyPathInput(index)) {
923
- return;
924
- }
925
- const nonce = this.createMusig2NonceForInput(index, keyPair, keyType, params);
926
- this.addOrUpdateProprietaryKeyValToInput(index, Musig2_1.encodePsbtMusig2PubNonce(nonce));
457
+ return keyVals.filter((keyVal) => {
458
+ return (keySearch === undefined ||
459
+ (keySearch.identifier === keyVal.key.identifier &&
460
+ keySearch.subtype === keyVal.key.subtype &&
461
+ (!Buffer.isBuffer(keySearch.keydata) || keySearch.keydata.equals(keyVal.key.keydata))));
927
462
  });
928
- return this;
929
- }
930
- /**
931
- * Generates and sets MuSig2 nonce to taproot key path input at inputIndex.
932
- * If input is not a taproot key path, no action.
933
- *
934
- * @param inputIndex input index
935
- * @param keyPair derived key pair
936
- * @param sessionId Optional extra entropy. If provided it must either be a counter unique to this secret key,
937
- * (converted to an array of 32 bytes), or 32 uniformly random bytes.
938
- * @param deterministic If true, set the cosigner nonce deterministically
939
- */
940
- setInputMusig2Nonce(inputIndex, derivedKeyPair, params = { deterministic: false }) {
941
- return this.setMusig2NoncesInner(derivedKeyPair, 'derived', inputIndex, params);
942
- }
943
- /**
944
- * Generates and sets MuSig2 nonce to taproot key path input at inputIndex.
945
- * If input is not a taproot key path, no action.
946
- *
947
- * @param inputIndex input index
948
- * @param keyPair HD root key pair
949
- * @param sessionId Optional extra entropy. If provided it must either be a counter unique to this secret key,
950
- * (converted to an array of 32 bytes), or 32 uniformly random bytes.
951
- * @param deterministic If true, set the cosigner nonce deterministically
952
- */
953
- setInputMusig2NonceHD(inputIndex, keyPair, params = { deterministic: false }) {
954
- utils_1.checkForInput(this.data.inputs, inputIndex);
955
- return this.setMusig2NoncesInner(keyPair, 'root', inputIndex, params);
956
- }
957
- /**
958
- * Generates and sets MuSig2 nonce to all taproot key path inputs. Other inputs will be skipped.
959
- *
960
- * @param inputIndex input index
961
- * @param keyPair derived key pair
962
- * @param sessionId Optional extra entropy. If provided it must either be a counter unique to this secret key,
963
- * (converted to an array of 32 bytes), or 32 uniformly random bytes.
964
- */
965
- setAllInputsMusig2Nonce(keyPair, params = { deterministic: false }) {
966
- return this.setMusig2NoncesInner(keyPair, 'derived', undefined, params);
967
- }
968
- /**
969
- * Generates and sets MuSig2 nonce to all taproot key path inputs. Other inputs will be skipped.
970
- *
971
- * @param inputIndex input index
972
- * @param keyPair HD root key pair
973
- * @param sessionId Optional extra entropy. If provided it must either be a counter unique to this secret key,
974
- * (converted to an array of 32 bytes), or 32 uniformly random bytes.
975
- */
976
- setAllInputsMusig2NonceHD(keyPair, params = { deterministic: false }) {
977
- return this.setMusig2NoncesInner(keyPair, 'root', undefined, params);
978
463
  }
979
464
  clone() {
980
465
  return super.clone();
981
466
  }
982
- extractTransaction(disableFeeCheck) {
983
- const tx = super.extractTransaction(disableFeeCheck);
984
- if (tx instanceof UtxoTransaction_1.UtxoTransaction) {
985
- return tx;
986
- }
987
- throw new Error('extractTransaction did not return instace of UtxoTransaction');
988
- }
989
467
  }
990
468
  exports.UtxoPsbt = UtxoPsbt;
991
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBUTFDLGdEQUFxRDtBQUNyRCwrREFBc0U7QUFFdEUsaUNBQXFEO0FBQ3JELHVDQUF1QztBQUN2Qyx3RUFBOEY7QUFFOUYsMEJBV1k7QUFDWix1REFBb0Q7QUFDcEQsdUNBQWdEO0FBQ2hELG9EQUE4QztBQUM5QywwREFBK0M7QUFDL0MsbURBQW1EO0FBQ25ELDZDQUFrRDtBQUNsRCxxQ0FrQmtCO0FBQ2xCLG1DQUEyRDtBQUMzRCx3Q0FBaUQ7QUFDakQseUNBT29CO0FBWXBCLFNBQVMsbUJBQW1CLENBQUMsT0FBZ0I7SUFDM0MsTUFBTSxZQUFZLEdBQUcsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RSxRQUFRLGNBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMzQixLQUFLLFlBQVEsQ0FBQyxXQUFXLENBQUM7UUFDMUIsS0FBSyxZQUFRLENBQUMsU0FBUyxDQUFDO1FBQ3hCLEtBQUssWUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQixLQUFLLFlBQVEsQ0FBQyxLQUFLO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLFlBQVksRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDM0Y7WUFDRSxPQUFPLFlBQVksQ0FBQztLQUN2QjtBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQWdCLEVBQUUsQ0FBdUM7SUFDbEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8saUJBQWlCLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFD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RUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHVCQUF1QixDQUNyQixPQUF1QixFQUN2QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCx5QkFBeUIsQ0FDdkIsT0FBdUIsRUFDdkIsU0FBMEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFO1FBRWxGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELGtCQUFrQixDQUFDLGVBQXlCO1FBQzFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxJQUFJLEVBQUUsWUFBWSxpQ0FBZSxFQUFFO1lBQ2pDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztDQUNGO0FBcm1DRCw0QkFxbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidCBhcyBQc2J0QmFzZSB9IGZyb20gJ2JpcDE3NCc7XG5pbXBvcnQge1xuICBCaXAzMkRlcml2YXRpb24sXG4gIFBzYnRJbnB1dCxcbiAgVGFwQmlwMzJEZXJpdmF0aW9uLFxuICBUcmFuc2FjdGlvbiBhcyBJVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uRnJvbUJ1ZmZlcixcbn0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBjaGVja0ZvcklucHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgQnVmZmVyV3JpdGVyLCB2YXJ1aW50IH0gZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvYnVmZmVydXRpbHMnO1xuaW1wb3J0IHsgU2Vzc2lvbktleSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuaW1wb3J0IHsgQklQMzJGYWN0b3J5LCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCAqIGFzIGJzNThjaGVjayBmcm9tICdiczU4Y2hlY2snO1xuaW1wb3J0IHsgZGVjb2RlUHJvcHJpZXRhcnlLZXksIGVuY29kZVByb3ByaWV0YXJ5S2V5IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvcHJvcHJpZXRhcnlLZXlWYWwnO1xuXG5pbXBvcnQge1xuICB0YXByb290LFxuICBIRFNpZ25lcixcbiAgUHNidCxcbiAgUHNidFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbixcbiAgVHhPdXRwdXQsXG4gIE5ldHdvcmssXG4gIGVjYyBhcyBlY2NMaWIsXG4gIGdldE1haW5uZXQsXG4gIG5ldHdvcmtzLFxufSBmcm9tICcuLic7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuL1V0eG9UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBnZXRPdXRwdXRJZEZvcklucHV0IH0gZnJvbSAnLi9VbnNwZW50JztcbmltcG9ydCB7IGlzU2Vnd2l0IH0gZnJvbSAnLi9wc2J0L3NjcmlwdFR5cGVzJztcbmltcG9ydCB7IHVuc2lnbiB9IGZyb20gJy4vcHNidC9mcm9tSGFsZlNpZ25lZCc7XG5pbXBvcnQgeyB0b1hPbmx5UHVibGljS2V5IH0gZnJvbSAnLi9vdXRwdXRTY3JpcHRzJztcbmltcG9ydCB7IHBhcnNlUHViU2NyaXB0Mk9mMyB9IGZyb20gJy4vcGFyc2VJbnB1dCc7XG5pbXBvcnQge1xuICBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbixcbiAgZW5jb2RlUHNidE11c2lnMlBhcnRpYWxTaWcsXG4gIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZSxcbiAgbXVzaWcyUGFydGlhbFNpZ24sXG4gIHBhcnNlUHNidE11c2lnMk5vbmNlcyxcbiAgcGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzLFxuICBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICBNdXNpZzJOb25jZVN0b3JlLFxuICBQc2J0TXVzaWcyUHViTm9uY2UsXG4gIHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzLFxuICBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5LFxuICBtdXNpZzJBZ2dyZWdhdGVTaWdzLFxuICBnZXRTaWdIYXNoVHlwZUZyb21TaWdzLFxuICBtdXNpZzJEZXRlcm1pbmlzdGljU2lnbixcbiAgY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlLFxufSBmcm9tICcuL011c2lnMic7XG5pbXBvcnQgeyBpc1RyaXBsZSwgaXNUdXBsZSwgVHJpcGxlLCBUdXBsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VGFwcm9vdE91dHB1dEtleSB9IGZyb20gJy4uL3RhcHJvb3QnO1xuaW1wb3J0IHtcbiAgZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzLFxuICBnZXRQc2J0SW5wdXRTaWduYXR1cmVDb3VudCxcbiAgUHJvcHJpZXRhcnlLZXlTZWFyY2gsXG4gIFByb3ByaWV0YXJ5S2V5U3VidHlwZSxcbiAgUHJvcHJpZXRhcnlLZXlWYWx1ZSxcbiAgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxufSBmcm9tICcuL1BzYnRVdGlsJztcblxudHlwZSBTaWduYXR1cmVQYXJhbXMgPSB7XG4gIC8qKiBXaGVuIHRydWUsIGFuZCBhZGQgdGhlIHNlY29uZCAobGFzdCkgbm9uY2UgYW5kIHNpZ25hdHVyZSBmb3IgYSB0YXByb290IGtleVxuICAgKiBwYXRoIHNwZW5kIGRldGVybWluaXN0aWNhbGx5LiBUaHJvd3MgYW4gZXJyb3IgaWYgZG9uZSBmb3IgdGhlIGZpcnN0IG5vbmNlL3NpZ25hdHVyZVxuICAgKiBvZiBhIHRhcHJvb3Qga2V5cGF0aCBzcGVuZC4gSWdub3JlIGZvciBhbGwgb3RoZXIgaW5wdXQgdHlwZXMuXG4gICAqL1xuICBkZXRlcm1pbmlzdGljOiBib29sZWFuO1xuICAvKiogQWxsb3dlZCBzaWdoYXNoIHR5cGVzICovXG4gIHNpZ2hhc2hUeXBlczogbnVtYmVyW107XG59O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2lnaGFzaFR5cGVzKG5ldHdvcms6IE5ldHdvcmspOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ2hhc2hUeXBlcyA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXTtcbiAgc3dpdGNoIChnZXRNYWlubmV0KG5ldHdvcmspKSB7XG4gICAgY2FzZSBuZXR3b3Jrcy5iaXRjb2luY2FzaDpcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5zdjpcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5nb2xkOlxuICAgIGNhc2UgbmV0d29ya3MuZWNhc2g6XG4gICAgICByZXR1cm4gWy4uLnNpZ2hhc2hUeXBlcywgLi4uc2lnaGFzaFR5cGVzLm1hcCgocykgPT4gcyB8IFV0eG9UcmFuc2FjdGlvbi5TSUdIQVNIX0ZPUktJRCldO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc2lnaGFzaFR5cGVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU2lnbmF0dXJlUGFyYW1zKG5ldHdvcms6IE5ldHdvcmssIHY/OiBQYXJ0aWFsPFNpZ25hdHVyZVBhcmFtcz4gfCBudW1iZXJbXSk6IFNpZ25hdHVyZVBhcmFtcyB7XG4gIGlmIChBcnJheS5pc0FycmF5KHYpKSByZXR1cm4gdG9TaWduYXR1cmVQYXJhbXMobmV0d29yaywgeyBzaWdoYXNoVHlwZXM6IHYgfSk7XG4gIHJldHVybiB7IGRldGVybWluaXN0aWM6IGZhbHNlLCBzaWdoYXNoVHlwZXM6IGRlZmF1bHRTaWdoYXNoVHlwZXMobmV0d29yayksIC4uLnYgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBwdWJsaWMga2V5cyBhcmUgZXF1YWwgaWdub3JpbmcgdGhlIHkgY29vcmRpbmF0ZS5cbiAqL1xuZnVuY3Rpb24gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKGE6IEJ1ZmZlciwgYjogQnVmZmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b1hPbmx5UHVibGljS2V5KGEpLmVxdWFscyh0b1hPbmx5UHVibGljS2V5KGIpKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIRFRhcHJvb3RTaWduZXIgZXh0ZW5kcyBIRFNpZ25lciB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBzdHJpbmcgbXVzdCBtYXRjaCAvXm0oXFwvXFxkKyc/KSskL1xuICAgKiBleC4gbS80NCcvMCcvMCcvMS8yMyBsZXZlbHMgd2l0aCAnIG11c3QgYmUgaGFyZCBkZXJpdmF0aW9uc1xuICAgKi9cbiAgZGVyaXZlUGF0aChwYXRoOiBzdHJpbmcpOiBIRFRhcHJvb3RTaWduZXI7XG4gIC8qKlxuICAgKiBJbnB1dCBoYXNoICh0aGUgXCJtZXNzYWdlIGRpZ2VzdFwiKSBmb3IgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG1cbiAgICogUmV0dXJuIGEgNjQgYnl0ZSBzaWduYXR1cmUgKDMyIGJ5dGUgciBhbmQgMzIgYnl0ZSBzIGluIHRoYXQgb3JkZXIpXG4gICAqL1xuICBzaWduU2Nobm9ycihoYXNoOiBCdWZmZXIpOiBCdWZmZXI7XG59XG5cbi8qKlxuICogSEQgc2lnbmVyIG9iamVjdCBmb3IgdGFwcm9vdCBwMnRyIG11c2lnMiBrZXkgcGF0aCBzaWduXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSERUYXByb290TXVzaWcyU2lnbmVyIGV4dGVuZHMgSERTaWduZXIge1xuICAvKipcbiAgICogTXVzaWcyIHJlcXVpcmVzIHNpZ25lcidzIDMyLWJ5dGVzIHByaXZhdGUga2V5IHRvIGJlIHBhc3NlZCB0byBpdC5cbiAgICovXG4gIHByaXZhdGVLZXk6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggc3RyaW5nIG11c3QgbWF0Y2ggL15tKFxcL1xcZCsnPykrJC9cbiAgICogZXguIG0vNDQnLzAnLzAnLzEvMjMgbGV2ZWxzIHdpdGggJyBtdXN0IGJlIGhhcmQgZGVyaXZhdGlvbnNcbiAgICovXG4gIGRlcml2ZVBhdGgocGF0aDogc3RyaW5nKTogSERUYXByb290TXVzaWcyU2lnbmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaG5vcnJTaWduZXIge1xuICBwdWJsaWNLZXk6IEJ1ZmZlcjtcbiAgc2lnblNjaG5vcnIoaGFzaDogQnVmZmVyKTogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11c2lnMlNpZ25lciB7XG4gIHB1YmxpY0tleTogQnVmZmVyO1xuICBwcml2YXRlS2V5OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFwcm9vdFNpZ25lciB7XG4gIGxlYWZIYXNoZXM6IEJ1ZmZlcltdO1xuICBzaWduZXI6IFNjaG5vcnJTaWduZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE9wdHMge1xuICBuZXR3b3JrOiBOZXR3b3JrO1xuICBtYXhpbXVtRmVlUmF0ZT86IG51bWJlcjsgLy8gW3NhdC9ieXRlXVxuICBiaXAzMlBhdGhzQWJzb2x1dGU/OiBib29sZWFuO1xufVxuXG4vLyBUT0RPOiB1cHN0cmVhbSBkb2VzIGBjaGVja0lucHV0c0ZvclBhcnRpYWxTaWdzYCBiZWZvcmUgZG9pbmcgdGhpbmdzIGxpa2Vcbi8vIGBzZXRWZXJzaW9uYC4gT3VyIGlucHV0cyBjb3VsZCBoYXZlIHRhcHNjcmlwdHNpZ3MgKG9yIGluIGZ1dHVyZSB0YXBrZXlzaWdzKVxuLy8gYW5kIG5vdCBmYWlsIHRoYXQgY2hlY2suIERvIHdlIHdhbnQgdG8gZG8gYW55dGhpbmcgYWJvdXQgdGhhdD9cbmV4cG9ydCBjbGFzcyBVdHhvUHNidDxUeCBleHRlbmRzIFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+ID0gVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4+IGV4dGVuZHMgUHNidCB7XG4gIHByaXZhdGUgbm9uY2VTdG9yZSA9IG5ldyBNdXNpZzJOb25jZVN0b3JlKCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyB0cmFuc2FjdGlvbkZyb21CdWZmZXIoYnVmZmVyOiBCdWZmZXIsIG5ldHdvcms6IE5ldHdvcmspOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgcmV0dXJuIFV0eG9UcmFuc2FjdGlvbi5mcm9tQnVmZmVyPGJpZ2ludD4oYnVmZmVyLCBmYWxzZSwgJ2JpZ2ludCcsIG5ldHdvcmspO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBzYnQob3B0czogUHNidE9wdHMsIGRhdGE/OiBQc2J0QmFzZSk6IFV0eG9Qc2J0IHtcbiAgICByZXR1cm4gbmV3IFV0eG9Qc2J0KFxuICAgICAgb3B0cyxcbiAgICAgIGRhdGEgfHwgbmV3IFBzYnRCYXNlKG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eDogbmV3IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KG9wdHMubmV0d29yaykgfSkpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBvcHRzOiBQc2J0T3B0cyk6IFV0eG9Qc2J0IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkZyb21CdWZmZXI6IFRyYW5zYWN0aW9uRnJvbUJ1ZmZlciA9IChidWZmZXI6IEJ1ZmZlcik6IElUcmFuc2FjdGlvbiA9PiB7XG4gICAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlciwgb3B0cy5uZXR3b3JrKTtcbiAgICAgIHJldHVybiBuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHggfSk7XG4gICAgfTtcbiAgICBjb25zdCBwc2J0QmFzZSA9IFBzYnRCYXNlLmZyb21CdWZmZXIoYnVmZmVyLCB0cmFuc2FjdGlvbkZyb21CdWZmZXIsIHtcbiAgICAgIGJpcDMyUGF0aHNBYnNvbHV0ZTogb3B0cy5iaXAzMlBhdGhzQWJzb2x1dGUsXG4gICAgfSk7XG4gICAgY29uc3QgcHNidCA9IHRoaXMuY3JlYXRlUHNidChvcHRzLCBwc2J0QmFzZSk7XG4gICAgLy8gVXBzdHJlYW0gY2hlY2tzIGZvciBkdXBsaWNhdGUgaW5wdXRzIGhlcmUsIGJ1dCBpdCBzZWVtcyB0byBiZSBvZiBkdWJpb3VzIHZhbHVlLlxuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgc3RhdGljIGZyb21IZXgoZGF0YTogc3RyaW5nLCBvcHRzOiBQc2J0T3B0cyk6IFV0eG9Qc2J0IHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKGRhdGEsICdoZXgnKSwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcmVudCAtIFBhcmVudCBrZXkuIE1hdGNoZWQgd2l0aCBgYmlwMzJEZXJpdmF0aW9uc2AgdXNpbmcgYGZpbmdlcnByaW50YCBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIGJpcDMyRGVyaXZhdGlvbnMgLSBwb3NzaWJsZSBkZXJpdmF0aW9ucyBmb3IgaW5wdXQgb3Igb3V0cHV0XG4gICAqIEBwYXJhbSBpZ25vcmVZIC0gd2hlbiB0cnVlLCBpZ25vcmUgdGhlIHkgY29vcmRpbmF0ZSB3aGVuIG1hdGNoaW5nIHB1YmxpYyBrZXlzXG4gICAqIEByZXR1cm4gZGVyaXZlZCBiaXAzMiBub2RlIGlmIG1hdGNoaW5nIGRlcml2YXRpb24gaXMgZm91bmQsIHVuZGVmaW5lZCBpZiBub25lIGlzIGZvdW5kXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbW9yZSB0aGFuIG9uZSBtYXRjaCBpcyBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGRlcml2ZUtleVBhaXIoXG4gICAgcGFyZW50OiBCSVAzMkludGVyZmFjZSxcbiAgICBiaXAzMkRlcml2YXRpb25zOiBCaXAzMkRlcml2YXRpb25bXSxcbiAgICB7IGlnbm9yZVkgfTogeyBpZ25vcmVZOiBib29sZWFuIH1cbiAgKTogQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1hdGNoaW5nRGVyaXZhdGlvbnMgPSBiaXAzMkRlcml2YXRpb25zLmZpbHRlcigoYmlwRHYpID0+IHtcbiAgICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocGFyZW50LmZpbmdlcnByaW50KTtcbiAgICB9KTtcblxuICAgIGlmICghbWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIE5vIGZpbmdlcnByaW50IG1hdGNoXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbW9yZSB0aGFuIG9uZSBtYXRjaGluZyBkZXJpdmF0aW9uIGZvciBmaW5nZXJwcmludCAke3BhcmVudC5maW5nZXJwcmludC50b1N0cmluZygnaGV4Jyl9OiAke1xuICAgICAgICAgIG1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IFtkZXJpdmF0aW9uXSA9IG1hdGNoaW5nRGVyaXZhdGlvbnM7XG4gICAgY29uc3Qgbm9kZSA9IHBhcmVudC5kZXJpdmVQYXRoKGRlcml2YXRpb24ucGF0aCk7XG5cbiAgICBpZiAoIW5vZGUucHVibGljS2V5LmVxdWFscyhkZXJpdmF0aW9uLnB1YmtleSkpIHtcbiAgICAgIGlmICghaWdub3JlWSB8fCAhZXF1YWxQdWJsaWNLZXlJZ25vcmVZKG5vZGUucHVibGljS2V5LCBkZXJpdmF0aW9uLnB1YmtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJrZXkgZGlkIG5vdCBtYXRjaCBiaXAzMkRlcml2YXRpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHN0YXRpYyBkZXJpdmVLZXlQYWlyRm9ySW5wdXQoYmlwMzI6IEJJUDMySW50ZXJmYWNlLCBpbnB1dDogUHNidElucHV0KTogQnVmZmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihiaXAzMiwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uLCB7IGlnbm9yZVk6IHRydWUgfSk/LnB1YmxpY0tleVxuICAgICAgOiBpbnB1dC5iaXAzMkRlcml2YXRpb24/Lmxlbmd0aFxuICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGJpcDMyLCBpbnB1dC5iaXAzMkRlcml2YXRpb24sIHsgaWdub3JlWTogZmFsc2UgfSk/LnB1YmxpY0tleVxuICAgICAgOiBiaXAzMj8ucHVibGljS2V5O1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKTogTmV0d29yayB7XG4gICAgcmV0dXJuIHRoaXMudHgubmV0d29yaztcbiAgfVxuXG4gIHRvSGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICBnZXROb25XaXRuZXNzUHJldmlvdXNUeGlkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICBjb25zdCB0eGlkU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICB0eGlkU2V0LmFkZChnZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2luZGV4XSkudHhpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFsuLi50eGlkU2V0XTtcbiAgfVxuXG4gIGFkZE5vbldpdG5lc3NVdHhvcyh0eEJ1ZnM6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4pOiB0aGlzIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIHdpdG5lc3MgVVRYTyBmb3IgYWxsIGlucHV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1NlZ3dpdChpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQsIGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgeyB0eGlkIH0gPSBnZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2luZGV4XSk7XG4gICAgICAgIGlmICh0eEJ1ZnNbdHhpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGFsbCByZXF1aXJlZCBwcmV2aW91cyB0cmFuc2FjdGlvbnMgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0KGluZGV4LCB7IG5vbldpdG5lc3NVdHhvOiB0eEJ1ZnNbdHhpZF0gfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiwgcHJldk91dHB1dHM6IFR4T3V0cHV0PGJpZ2ludD5bXSk6IFV0eG9Qc2J0IHtcbiAgICBpZiAocHJldk91dHB1dHMubGVuZ3RoICE9PSB0cmFuc2FjdGlvbi5pbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiBoYXMgJHt0cmFuc2FjdGlvbi5pbnMubGVuZ3RofSBpbnB1dHMsIGJ1dCAke3ByZXZPdXRwdXRzLmxlbmd0aH0gcHJldmlvdXMgb3V0cHV0cyBwcm92aWRlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNsb25lZFRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24uY2xvbmUoKTtcbiAgICBjb25zdCB1cGRhdGVzID0gdW5zaWduKGNsb25lZFRyYW5zYWN0aW9uLCBwcmV2T3V0cHV0cyk7XG5cbiAgICBjb25zdCBwc2J0QmFzZSA9IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IGNsb25lZFRyYW5zYWN0aW9uIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoKSA9PiBwc2J0QmFzZS5pbnB1dHMucHVzaCh7IHVua25vd25LZXlWYWxzOiBbXSB9KSk7XG4gICAgY2xvbmVkVHJhbnNhY3Rpb24ub3V0cy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLm91dHB1dHMucHVzaCh7IHVua25vd25LZXlWYWxzOiBbXSB9KSk7XG4gICAgY29uc3QgcHNidCA9IHRoaXMuY3JlYXRlUHNidCh7IG5ldHdvcms6IHRyYW5zYWN0aW9uLm5ldHdvcmsgfSwgcHNidEJhc2UpO1xuXG4gICAgdXBkYXRlcy5mb3JFYWNoKCh1cGRhdGUsIGluZGV4KSA9PiB7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB1cGRhdGUpO1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQ6IHByZXZPdXRwdXRzW2luZGV4XS5zY3JpcHQsIHZhbHVlOiBwcmV2T3V0cHV0c1tpbmRleF0udmFsdWUgfSB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgZ2V0VW5zaWduZWRUeCgpOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgcmV0dXJuIHRoaXMudHguY2xvbmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV3VHJhbnNhY3Rpb24obmV0d29yazogTmV0d29yayk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gbmV3IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KG5ldHdvcmspO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0eCgpOiBUeCB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEuZ2xvYmFsTWFwLnVuc2lnbmVkVHggYXMgUHNidFRyYW5zYWN0aW9uKS50eCBhcyBUeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0ZvclNpZ25hdHVyZXMocHJvcE5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggfHwgaW5wdXQudGFwS2V5U2lnIHx8IGlucHV0LnBhcnRpYWxTaWc/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb2RpZnkgJHtwcm9wTmFtZSA/PyAndHJhbnNhY3Rpb24nfSAtIHNpZ25hdHVyZXMgZXhpc3QuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYXQgaW5wdXRJbmRleCBpcyBhIHRhcHJvb3Qga2V5IHBhdGguXG4gICAqIENoZWNrcyBmb3IgcHJlc2VuY2Ugb2YgbWluaW11bSByZXF1aXJlZCBrZXkgcGF0aCBpbnB1dCBmaWVsZHMgYW5kIGFic2VuY2Ugb2YgYW55IHNjcmlwdCBwYXRoIG9ubHkgaW5wdXQgZmllbGRzLlxuICAgKi9cbiAgaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gKFxuICAgICAgISFpbnB1dC50YXBJbnRlcm5hbEtleSAmJlxuICAgICAgISFpbnB1dC50YXBNZXJrbGVSb290ICYmXG4gICAgICAhKFxuICAgICAgICBpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggfHxcbiAgICAgICAgaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggfHxcbiAgICAgICAgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5zb21lKCh2KSA9PiB2LmxlYWZIYXNoZXMubGVuZ3RoKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYXQgaW5wdXRJbmRleCBpcyBhIHRhcHJvb3Qgc2NyaXB0IHBhdGguXG4gICAqIENoZWNrcyBmb3IgcHJlc2VuY2Ugb2YgbWluaW11bSByZXF1aXJlZCBzY3JpcHQgcGF0aCBpbnB1dCBmaWVsZHMgYW5kIGFic2VuY2Ugb2YgYW55IGtleSBwYXRoIG9ubHkgaW5wdXQgZmllbGRzLlxuICAgKi9cbiAgaXNUYXByb290U2NyaXB0UGF0aElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gKFxuICAgICAgISFpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggJiZcbiAgICAgICEoXG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAgICAgIH0pLmxlbmd0aFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYXQgaW5wdXRJbmRleCBpcyBhIHRhcHJvb3RcbiAgICovXG4gIGlzVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBpc1AyVFIgPSAoc2NyaXB0OiBCdWZmZXIpOiBib29sZWFuID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGdldFRhcHJvb3RPdXRwdXRLZXkoc2NyaXB0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiAhIShcbiAgICAgIGlucHV0LnRhcEludGVybmFsS2V5IHx8XG4gICAgICBpbnB1dC50YXBNZXJrbGVSb290IHx8XG4gICAgICBpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggfHxcbiAgICAgIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoIHx8XG4gICAgICBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAgICB9KS5sZW5ndGggfHxcbiAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAgICB9KS5sZW5ndGggfHxcbiAgICAgIChpbnB1dC53aXRuZXNzVXR4byAmJiBpc1AyVFIoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqL1xuICBmaW5hbGl6ZUFsbElucHV0cygpOiB0aGlzIHtcbiAgICBjb25zdCBpc011bHRpc2lnVGFwcm9vdFNjcmlwdCA9IChzY3JpcHQ6IEJ1ZmZlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VQdWJTY3JpcHQyT2YzKHNjcmlwdCwgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgdGhpcy5kYXRhLmlucHV0cy5tYXAoKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGlzTXVsdGlzaWdUYXByb290U2NyaXB0KGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0KVxuICAgICAgICAgID8gdGhpcy5maW5hbGl6ZVRhcHJvb3RJbnB1dChpZHgpXG4gICAgICAgICAgOiB0aGlzLmZpbmFsaXplVGFwSW5wdXRXaXRoU2luZ2xlTGVhZlNjcmlwdEFuZFNpZ25hdHVyZShpZHgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpZHgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplVGFwcm9vdE11c2lnMklucHV0KGlkeCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZUlucHV0KGlkeCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmaW5hbGl6ZVRhcHJvb3RJbnB1dChpbnB1dEluZGV4OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gd2l0bmVzcyA9IGNvbnRyb2wtYmxvY2sgc2NyaXB0IGZpcnN0LXNpZyBzZWNvbmQtc2lnXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIGZpbmFsaXppbmcnKTtcbiAgICB9XG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHNjcmlwdCB9ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCB3aXRuZXNzOiBCdWZmZXJbXSA9IFtzY3JpcHQsIGNvbnRyb2xCbG9ja107XG4gICAgY29uc3QgW3B1YmtleTEsIHB1YmtleTJdID0gcGFyc2VQdWJTY3JpcHQyT2YzKHNjcmlwdCwgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKS5wdWJsaWNLZXlzO1xuICAgIGZvciAoY29uc3QgcGsgb2YgW3B1YmtleTEsIHB1YmtleTJdKSB7XG4gICAgICBjb25zdCBzaWcgPSBpbnB1dC50YXBTY3JpcHRTaWc/LmZpbmQoKHsgcHVia2V5IH0pID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShwaywgcHVia2V5KSk7XG4gICAgICBpZiAoIXNpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHNpZ25hdHVyZXMgaW4gU2NyaXB0IFNpZy4nKTtcbiAgICAgIH1cbiAgICAgIHdpdG5lc3MudW5zaGlmdChzaWcuc2lnbmF0dXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aXRuZXNzTGVuZ3RoID0gd2l0bmVzcy5yZWR1Y2UoKHMsIGIpID0+IHMgKyBiLmxlbmd0aCArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoYi5sZW5ndGgpLCAxKTtcblxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkod2l0bmVzc0xlbmd0aCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmVjdG9yKHdpdG5lc3MpO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplcyBhIHRhcHJvb3QgbXVzaWcyIGlucHV0IGJ5IGFnZ3JlZ2F0aW5nIGFsbCBwYXJ0aWFsIHNpZ3MuXG4gICAqIElNUE9SVEFOVDogQWx3YXlzIGNhbGwgdmFsaWRhdGUqIGZ1bmN0aW9uIGJlZm9yZSBmaW5hbGl6aW5nLlxuICAgKi9cbiAgZmluYWxpemVUYXByb290TXVzaWcySW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IHBhcnRpYWxTaWdzID0gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MoaW5wdXQpO1xuICAgIGlmIChwYXJ0aWFsU2lncz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnVtYmVyIG9mIHBhcnRpYWwgc2lnbmF0dXJlcyAke3BhcnRpYWxTaWdzID8gcGFydGlhbFNpZ3MubGVuZ3RoIDogMH0gdG8gZmluYWxpemVgKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYXJ0aWFsU2lnczogcFNpZ3MsIHNpZ0hhc2hUeXBlIH0gPSBnZXRTaWdIYXNoVHlwZUZyb21TaWdzKHBhcnRpYWxTaWdzKTtcbiAgICBjb25zdCB7IHNlc3Npb25LZXkgfSA9IHRoaXMuZ2V0TXVzaWcyU2Vzc2lvbktleShpbnB1dEluZGV4LCBzaWdIYXNoVHlwZSk7XG5cbiAgICBjb25zdCBhZ2dTaWcgPSBtdXNpZzJBZ2dyZWdhdGVTaWdzKFxuICAgICAgcFNpZ3MubWFwKChwU2lnKSA9PiBwU2lnLnBhcnRpYWxTaWcpLFxuICAgICAgc2Vzc2lvbktleVxuICAgICk7XG5cbiAgICBjb25zdCBzaWcgPSBzaWdIYXNoVHlwZSA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUID8gYWdnU2lnIDogQnVmZmVyLmNvbmNhdChbYWdnU2lnLCBCdWZmZXIub2Yoc2lnSGFzaFR5cGUpXSk7XG5cbiAgICAvLyBzaW5nbGUgc2lnbmF0dXJlIHdpdGggNjQvNjUgYnl0ZXMgc2l6ZSBpcyBzY3JpcHQgd2l0bmVzcyBmb3Iga2V5IHBhdGggc3BlbmRcbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KDEgKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKHNpZy5sZW5ndGgpICsgc2lnLmxlbmd0aCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmVjdG9yKFtzaWddKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG4gICAgLy8gZGVsZXRpbmcgb25seSBCaXRHbyBwcm9wcmlldGFyeSBrZXkgdmFsdWVzLlxuICAgIHRoaXMuZGVsZXRlUHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHsgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZmluYWxpemVUYXBJbnB1dFdpdGhTaW5nbGVMZWFmU2NyaXB0QW5kU2lnbmF0dXJlKGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3IgZmluYWxpemluZycpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgc2lnbmF0dXJlcyBpbiBTY3JpcHQgU2lnLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29udHJvbEJsb2NrLCBzY3JpcHQgfSA9IGlucHV0LnRhcExlYWZTY3JpcHRbMF07XG4gICAgY29uc3Qgd2l0bmVzczogQnVmZmVyW10gPSBbaW5wdXQudGFwU2NyaXB0U2lnWzBdLnNpZ25hdHVyZSwgc2NyaXB0LCBjb250cm9sQmxvY2tdO1xuICAgIGNvbnN0IHdpdG5lc3NMZW5ndGggPSB3aXRuZXNzLnJlZHVjZSgocywgYikgPT4gcyArIGIubGVuZ3RoICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChiLmxlbmd0aCksIDEpO1xuXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSh3aXRuZXNzTGVuZ3RoKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWZWN0b3Iod2l0bmVzcyk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICpcbiAgICogVW5saWtlIHRoZSBmdW5jdGlvbiBpdCBvdmVycmlkZXMsIHRoaXMgZG9lcyBub3QgdGFrZSBhIHZhbGlkYXRvci4gSW4gQml0R29cbiAgICogY29udGV4dCwgd2Uga25vdyBob3cgd2Ugd2FudCB0byB2YWxpZGF0ZSBzbyB3ZSBqdXN0IGhhcmQgY29kZSB0aGUgcmlnaHRcbiAgICogdmFsaWRhdG9yLlxuICAgKi9cbiAgdmFsaWRhdGVTaWduYXR1cmVzT2ZBbGxJbnB1dHMoKTogYm9vbGVhbiB7XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCAwKTsgLy8gbWFraW5nIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmVcbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5kYXRhLmlucHV0cy5tYXAoKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRDb21tb24oaWR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cy5yZWR1Y2UoKGZpbmFsLCByZXMpID0+IHJlcyAmJiBmaW5hbCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgYW55IG1hdGNoaW5nIHZhbGlkIHNpZ25hdHVyZSBpcyBmb3VuZCBmb3IgYSBkZXJpdmVkIHB1YiBrZXkgZnJvbSBnaXZlbiBIRCBrZXkgcGFpci5cbiAgICovXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRIRChpbnB1dEluZGV4OiBudW1iZXIsIGhkS2V5UGFpcjogQklQMzJJbnRlcmZhY2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgcHViS2V5ID0gVXR4b1BzYnQuZGVyaXZlS2V5UGFpckZvcklucHV0KGhkS2V5UGFpciwgaW5wdXQpO1xuICAgIGlmICghcHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgZGVyaXZlIGZyb20gSEQga2V5IHBhaXInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4LCBwdWJLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGFueSB2YWxpZCBzaWduYXR1cmUocykgYXJlIGZvdW5kIGZyb20gYmlwMzIgZGF0YSBvZiBQU0JUIG9yIGZvciBnaXZlbiBwdWIga2V5LlxuICAgKi9cbiAgdmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5pc1RhcHJvb3RTY3JpcHRQYXRoSW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUYXByb290U2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgcHVia2V5KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUYXByb290TXVzaWcyU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgcHVia2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgKHAsIG0sIHMpID0+IGVjY0xpYi52ZXJpZnkobSwgcCwgcywgdHJ1ZSksIHB1YmtleSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBOb3QgYW4gZWxlZ2FudCBzb2x1dGlvbi4gTWlnaHQgbmVlZCB1cHN0cmVhbSBjaGFuZ2VzIGxpa2UgY3VzdG9tIGVycm9yIHR5cGVzLlxuICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE11c2lnMlNlc3Npb25LZXkoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ0hhc2hUeXBlOiBudW1iZXJcbiAgKToge1xuICAgIHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cztcbiAgICBub25jZXM6IFR1cGxlPFBzYnRNdXNpZzJQdWJOb25jZT47XG4gICAgaGFzaDogQnVmZmVyO1xuICAgIHNlc3Npb25LZXk6IFNlc3Npb25LZXk7XG4gIH0ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5IHx8ICFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JvdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGljaXBhbnRzID0gdGhpcy5nZXRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXRJbmRleCwgaW5wdXQudGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICAgIGNvbnN0IG5vbmNlcyA9IHRoaXMuZ2V0TXVzaWcyTm9uY2VzKGlucHV0SW5kZXgsIHBhcnRpY2lwYW50cyk7XG5cbiAgICBjb25zdCB7IGhhc2ggfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgW3NpZ0hhc2hUeXBlXSk7XG5cbiAgICBjb25zdCBzZXNzaW9uS2V5ID0gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oe1xuICAgICAgcHViTm9uY2VzOiBbbm9uY2VzWzBdLnB1Yk5vbmNlLCBub25jZXNbMV0ucHViTm9uY2VdLFxuICAgICAgcHViS2V5czogcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgIHR4SGFzaDogaGFzaCxcbiAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgIH0pO1xuICAgIHJldHVybiB7IHBhcnRpY2lwYW50cywgbm9uY2VzLCBoYXNoLCBzZXNzaW9uS2V5IH07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBmb3IgZm9sbG93aW5nIGNhc2VzLlxuICAgKiBJZiB2YWxpZCBtdXNpZzIgcGFydGlhbCBzaWduYXR1cmVzIGV4aXN0cyBmb3IgYm90aCAyIGtleXMsIGl0IHdpbGwgYWxzbyB2ZXJpZnkgYWdncmVnYXRlZCBzaWdcbiAgICogZm9yIGFnZ3JlZ2F0ZWQgdHdlYWtlZCBrZXkgKG91dHB1dCBrZXkpLCBvdGhlcndpc2Ugb25seSB2ZXJpZmllcyBwYXJ0aWFsIHNpZy5cbiAgICogSWYgcHVia2V5IGlzIHBhc3NlZCBpbiBpbnB1dCwgaXQgd2lsbCBjaGVjayBzaWcgb25seSBmb3IgdGhhdCBwdWJrZXksXG4gICAqIGlmIG5vIHNpZyBleGl0cyBmb3Igc3VjaCBrZXksIHRocm93cyBlcnJvci5cbiAgICogRm9yIGludmFsaWQgc3RhdGUgb2YgaW5wdXQgZGF0YSwgaXQgd2lsbCB0aHJvdyBlcnJvcnMuXG4gICAqL1xuICB2YWxpZGF0ZVRhcHJvb3RNdXNpZzJTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0KTtcbiAgICBpZiAoIXBhcnRpYWxTaWdzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNpZ25hdHVyZXMgdG8gdmFsaWRhdGVgKTtcbiAgICB9XG5cbiAgICBsZXQgbXlQYXJ0aWFsU2lncyA9IHBhcnRpYWxTaWdzO1xuICAgIGlmIChwdWJrZXkpIHtcbiAgICAgIG15UGFydGlhbFNpZ3MgPSBwYXJ0aWFsU2lncy5maWx0ZXIoKGt2KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoa3YucGFydGljaXBhbnRQdWJLZXksIHB1YmtleSkpO1xuICAgICAgaWYgKG15UGFydGlhbFNpZ3M/Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IG15U2lncywgc2lnSGFzaFR5cGUgfSA9IGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MobXlQYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBwYXJ0aWNpcGFudHMsIG5vbmNlcywgaGFzaCwgc2Vzc2lvbktleSB9ID0gdGhpcy5nZXRNdXNpZzJTZXNzaW9uS2V5KGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBteVNpZ3MubWFwKChteVNpZykgPT4ge1xuICAgICAgY29uc3QgbXlOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKGt2LnBhcnRpY2lwYW50UHViS2V5LCBteVNpZy5wYXJ0aWNpcGFudFB1YktleSkpO1xuICAgICAgaWYgKCFteU5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgbm8gcHViIG5vbmNlIGZvciBwdWJrZXknKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5KG15U2lnLnBhcnRpYWxTaWcsIG15U2lnLnBhcnRpY2lwYW50UHViS2V5LCBteU5vbmNlLnB1Yk5vbmNlLCBzZXNzaW9uS2V5KTtcbiAgICB9KTtcblxuICAgIC8vIEZvciB2YWxpZCBzaW5nbGUgc2lnIG9yIDEgb3IgMiBmYWlsdXJlIHNpZ3MsIG5vIG5lZWQgdG8gdmFsaWRhdGUgYWdncmVnYXRlZCBzaWcuIFNvIHNraXAuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0cy5ldmVyeSgocmVzKSA9PiByZXMpO1xuICAgIGlmICghcmVzdWx0IHx8IG15U2lncy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGFnZ1NpZyA9IG11c2lnMkFnZ3JlZ2F0ZVNpZ3MoXG4gICAgICBteVNpZ3MubWFwKChteVNpZykgPT4gbXlTaWcucGFydGlhbFNpZyksXG4gICAgICBzZXNzaW9uS2V5XG4gICAgKTtcblxuICAgIHJldHVybiBlY2NMaWIudmVyaWZ5U2Nobm9ycihoYXNoLCBwYXJ0aWNpcGFudHMudGFwT3V0cHV0S2V5LCBhZ2dTaWcpO1xuICB9XG5cbiAgdmFsaWRhdGVUYXByb290U2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBwdWJrZXk/OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF07XG4gICAgY29uc3QgdGFwU2lncyA9IChpbnB1dCB8fCB7fSkudGFwU2NyaXB0U2lnO1xuICAgIGlmICghaW5wdXQgfHwgIXRhcFNpZ3MgfHwgdGFwU2lncy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgdG8gdmFsaWRhdGUnKTtcbiAgICB9XG4gICAgbGV0IG15U2lncztcbiAgICBpZiAocHVia2V5KSB7XG4gICAgICBteVNpZ3MgPSB0YXBTaWdzLmZpbHRlcigoc2lnKSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoc2lnLnB1YmtleSwgcHVia2V5KSk7XG4gICAgICBpZiAobXlTaWdzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBteVNpZ3MgPSB0YXBTaWdzO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcFNpZyBvZiBteVNpZ3MpIHtcbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlLCBsZWFmSGFzaCwgcHVia2V5IH0gPSBwU2lnO1xuICAgICAgbGV0IHNpZ0hhc2hUeXBlOiBudW1iZXI7XG4gICAgICBsZXQgc2lnOiBCdWZmZXI7XG4gICAgICBpZiAoc2lnbmF0dXJlLmxlbmd0aCA9PT0gNjUpIHtcbiAgICAgICAgc2lnSGFzaFR5cGUgPSBzaWduYXR1cmVbNjRdO1xuICAgICAgICBzaWcgPSBzaWduYXR1cmUuc2xpY2UoMCwgNjQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2lnSGFzaFR5cGUgPSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQ7XG4gICAgICAgIHNpZyA9IHNpZ25hdHVyZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBbc2lnSGFzaFR5cGVdLCBsZWFmSGFzaCk7XG4gICAgICByZXN1bHRzLnB1c2goZWNjTGliLnZlcmlmeVNjaG5vcnIoaGFzaCwgcHVia2V5LCBzaWcpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHJlcykgPT4gcmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleFxuICAgKiBAcGFyYW0gcm9vdE5vZGVzIG9wdGlvbmFsIGlucHV0IHJvb3QgYmlwMzIgbm9kZXMgdG8gdmVyaWZ5IHdpdGguIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgZ2xvYmFsWHB1YiB3aWxsIGJlIHVzZWQuXG4gICAqIEByZXR1cm4gYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMuIFRydWUgd2hlbiBjb3JyZXNwb25kaW5nIGluZGV4IGluIGBwdWJsaWNLZXlzYCBoYXMgc2lnbmVkIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogSWYgbm8gc2lnbmF0dXJlIGluIHRoZSB0eCBvciBubyBwdWJsaWMga2V5IG1hdGNoaW5nIHNpZ25hdHVyZSwgdGhlIHZhbGlkYXRpb24gaXMgY29uc2lkZXJlZCBhcyBmYWxzZS5cbiAgICovXG4gIGdldFNpZ25hdHVyZVZhbGlkYXRpb25BcnJheShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgeyByb290Tm9kZXMgfTogeyByb290Tm9kZXM/OiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+IH0gPSB7fVxuICApOiBUcmlwbGU8Ym9vbGVhbj4ge1xuICAgIGlmICghcm9vdE5vZGVzICYmICghdGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViPy5sZW5ndGggfHwgIWlzVHJpcGxlKHRoaXMuZGF0YS5nbG9iYWxNYXAuZ2xvYmFsWHB1YikpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgc2lnbmF0dXJlIHZhbGlkYXRpb24gYXJyYXkgd2l0aG91dCAzIGdsb2JhbCB4cHVicycpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpcDMycyA9IHJvb3ROb2Rlc1xuICAgICAgPyByb290Tm9kZXNcbiAgICAgIDogdGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViPy5tYXAoKHhwdWIpID0+XG4gICAgICAgICAgQklQMzJGYWN0b3J5KGVjY0xpYikuZnJvbUJhc2U1OChiczU4Y2hlY2suZW5jb2RlKHhwdWIuZXh0ZW5kZWRQdWJrZXkpKVxuICAgICAgICApO1xuXG4gICAgaWYgKCFiaXAzMnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZWl0aGVyIGdsb2JhbE1hcCBvciByb290Tm9kZXMgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKCFnZXRQc2J0SW5wdXRTaWduYXR1cmVDb3VudChpbnB1dCkpIHtcbiAgICAgIHJldHVybiBbZmFsc2UsIGZhbHNlLCBmYWxzZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpcDMycy5tYXAoKGJpcDMyKSA9PiB7XG4gICAgICBjb25zdCBwdWJLZXkgPSBVdHhvUHNidC5kZXJpdmVLZXlQYWlyRm9ySW5wdXQoYmlwMzIsIGlucHV0KTtcbiAgICAgIGlmICghcHViS2V5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRDb21tb24oaW5wdXRJbmRleCwgcHViS2V5KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBOb3QgYW4gZWxlZ2FudCBzb2x1dGlvbi4gTWlnaHQgbmVlZCB1cHN0cmVhbSBjaGFuZ2VzIGxpa2UgY3VzdG9tIGVycm9yIHR5cGVzLlxuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pIGFzIFRyaXBsZTxib29sZWFuPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50c1xuICAgKi9cbiAgc2lnbkFsbElucHV0c0hEKFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyIHwgSERUYXByb290TXVzaWcyU2lnbmVyLFxuICAgIHBhcmFtcz86IG51bWJlcltdIHwgUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+XG4gICk6IHRoaXMge1xuICAgIGlmICghaGRLZXlQYWlyIHx8ICFoZEtleVBhaXIucHVibGljS2V5IHx8ICFoZEtleVBhaXIuZmluZ2VycHJpbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBIRFNpZ25lciB0byBzaWduIGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0gPSB0b1NpZ25hdHVyZVBhcmFtcyh0aGlzLm5ldHdvcmssIHBhcmFtcyk7XG5cbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc2lnbklucHV0SEQoaSwgaGRLZXlQYWlyLCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRydWUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmV2ZXJ5KCh2KSA9PiAhdikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaW5wdXRzIHdlcmUgc2lnbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzOnNpZ25JbnB1dEhEXG4gICAqL1xuICBzaWduVGFwcm9vdElucHV0SEQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyIHwgSERUYXByb290TXVzaWcyU2lnbmVyLFxuICAgIHsgc2lnaGFzaFR5cGVzID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLCBkZXRlcm1pbmlzdGljID0gZmFsc2UgfSA9IHt9XG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gICAgfVxuICAgIGlmICghaGRLZXlQYWlyIHx8ICFoZEtleVBhaXIucHVibGljS2V5IHx8ICFoZEtleVBhaXIuZmluZ2VycHJpbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBIRFNpZ25lciB0byBzaWduIGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiB8fCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgdGFwQmlwMzJEZXJpdmF0aW9uIHRvIHNpZ24gVGFwcm9vdCB3aXRoIEhEJyk7XG4gICAgfVxuICAgIGNvbnN0IG15RGVyaXZhdGlvbnMgPSBpbnB1dC50YXBCaXAzMkRlcml2YXRpb25cbiAgICAgIC5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGlmIChiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMoaGRLZXlQYWlyLmZpbmdlcnByaW50KSkge1xuICAgICAgICAgIHJldHVybiBiaXBEdjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYpID0+ICEhdikgYXMgVGFwQmlwMzJEZXJpdmF0aW9uW107XG4gICAgaWYgKG15RGVyaXZhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgSERTaWduZXIgZmluZ2VycHJpbnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREZXJpdmVkTm9kZShiaXBEdjogVGFwQmlwMzJEZXJpdmF0aW9uKTogSERUYXByb290TXVzaWcyU2lnbmVyIHwgSERUYXByb290U2lnbmVyIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBoZEtleVBhaXIuZGVyaXZlUGF0aChiaXBEdi5wYXRoKTtcbiAgICAgIGlmICghZXF1YWxQdWJsaWNLZXlJZ25vcmVZKGJpcER2LnB1YmtleSwgbm9kZS5wdWJsaWNLZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggdGFwQmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzaWduZXJzOiBUYXByb290U2lnbmVyW10gPSBteURlcml2YXRpb25zLm1hcCgoYmlwRHYpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmVyID0gZ2V0RGVyaXZlZE5vZGUoYmlwRHYpO1xuICAgICAgICBpZiAoISgnc2lnblNjaG5vcnInIGluIHNpZ25lcikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25TY2hub3JyIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIHNpZ24gcDJ0cicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNpZ25lciwgbGVhZkhhc2hlczogYmlwRHYubGVhZkhhc2hlcyB9O1xuICAgICAgfSk7XG4gICAgICBzaWduZXJzLmZvckVhY2goKHsgc2lnbmVyLCBsZWFmSGFzaGVzIH0pID0+IHRoaXMuc2lnblRhcHJvb3RJbnB1dChpbnB1dEluZGV4LCBzaWduZXIsIGxlYWZIYXNoZXMsIHNpZ2hhc2hUeXBlcykpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXk/Lmxlbmd0aCkge1xuICAgICAgY29uc3Qgc2lnbmVyczogTXVzaWcyU2lnbmVyW10gPSBteURlcml2YXRpb25zLm1hcCgoYmlwRHYpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmVyID0gZ2V0RGVyaXZlZE5vZGUoYmlwRHYpO1xuICAgICAgICBpZiAoISgncHJpdmF0ZUtleScgaW4gc2lnbmVyKSB8fCAhc2lnbmVyLnByaXZhdGVLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGVLZXkgaXMgcmVxdWlyZWQgdG8gc2lnbiBwMnRyIG11c2lnMicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWduZXI7XG4gICAgICB9KTtcbiAgICAgIHNpZ25lcnMuZm9yRWFjaCgoc2lnbmVyKSA9PiB0aGlzLnNpZ25UYXByb290TXVzaWcySW5wdXQoaW5wdXRJbmRleCwgc2lnbmVyLCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9KSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2lnbklucHV0SEQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyIHwgSERUYXByb290TXVzaWcyU2lnbmVyLFxuICAgIHBhcmFtcz86IG51bWJlcltdIHwgUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+XG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0gPSB0b1NpZ25hdHVyZVBhcmFtcyh0aGlzLm5ldHdvcmssIHBhcmFtcyk7XG4gICAgaWYgKHRoaXMuaXNUYXByb290SW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UYXByb290SW5wdXRIRChpbnB1dEluZGV4LCBoZEtleVBhaXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIuc2lnbklucHV0SEQoaW5wdXRJbmRleCwgaGRLZXlQYWlyLCBzaWdoYXNoVHlwZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXg6IG51bWJlciwgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlciwgdGFwTWVya2xlUm9vdDogQnVmZmVyKSB7XG4gICAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFsRGF0YSA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyh0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdKTtcbiAgICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgMCBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzS2V5VmFsRGF0YSwgdGFwSW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICAgIHJldHVybiBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleDogbnVtYmVyLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzKSB7XG4gICAgY29uc3Qgbm9uY2VzS2V5VmFsc0RhdGEgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXModGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSk7XG4gICAgaWYgKCFub25jZXNLZXlWYWxzRGF0YSB8fCAhaXNUdXBsZShub25jZXNLZXlWYWxzRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kICR7bm9uY2VzS2V5VmFsc0RhdGE/Lmxlbmd0aCA/IG5vbmNlc0tleVZhbHNEYXRhLmxlbmd0aCA6IDB9IG1hdGNoaW5nIG5vbmNlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDJgXG4gICAgICApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKG5vbmNlc0tleVZhbHNEYXRhLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcbiAgICByZXR1cm4gbm9uY2VzS2V5VmFsc0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgcDJ0ciBtdXNpZzIga2V5IHBhdGggaW5wdXQgd2l0aCAyIGFnZ3JlZ2F0ZWQga2V5cy5cbiAgICpcbiAgICogTm90ZTogT25seSBjYW4gc2lnbiBkZXRlcm1pbmlzdGljYWxseSBhcyB0aGUgY29zaWduZXJcbiAgICogQHBhcmFtIGlucHV0SW5kZXhcbiAgICogQHBhcmFtIHNpZ25lciAtIFhZIHB1YmxpYyBrZXkgYW5kIHByaXZhdGUga2V5IGFyZSByZXF1aXJlZFxuICAgKiBAcGFyYW0gc2lnaGFzaFR5cGVzXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNpZ24gdGhlIG11c2lnIGlucHV0IGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzaWduVGFwcm9vdE11c2lnMklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IE11c2lnMlNpZ25lcixcbiAgICB7IHNpZ2hhc2hUeXBlcyA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSwgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlIH0gPSB7fVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgbXVzaWcyIGlucHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuXG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSB8fCAhaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGlucHV0IGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhbmQgY2hlY2sgdGhhdCB3ZSBoYXZlIHR3byBwYXJ0aWNpcGFudCBub25jZXNcbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3QgeyB0YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50UHViS2V5cyB9ID0gcGFydGljaXBhbnRzO1xuICAgIGNvbnN0IHNpZ25lclB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShwdWJLZXksIHNpZ25lci5wdWJsaWNLZXkpKTtcbiAgICBpZiAoIXNpZ25lclB1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZXIgcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIG9mIHBhcnRpY2lwYW50IHB1YiBrZXlzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uY2VzID0gdGhpcy5nZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleCwgcGFydGljaXBhbnRzKTtcbiAgICBjb25zdCB7IGhhc2gsIHNpZ2hhc2hUeXBlIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIHNpZ2hhc2hUeXBlcyk7XG5cbiAgICBsZXQgcGFydGlhbFNpZzogQnVmZmVyO1xuICAgIGlmIChkZXRlcm1pbmlzdGljKSB7XG4gICAgICBpZiAoIWVxdWFsUHVibGljS2V5SWdub3JlWShzaWduZXJQdWJLZXksIHBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gb25seSBhZGQgYSBkZXRlcm1pbmlzdGljIHNpZ25hdHVyZSBvbiB0aGUgY29zaWduZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RTaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChuKSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkobi5wYXJ0aWNpcGFudFB1YktleSwgcGFydGljaXBhbnRQdWJLZXlzWzBdKSk7XG4gICAgICBpZiAoIWZpcnN0U2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCB0aGUgdXNlciBub25jZScpO1xuICAgICAgfVxuXG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgICAgICBwcml2YXRlS2V5OiBzaWduZXIucHJpdmF0ZUtleSxcbiAgICAgICAgb3RoZXJOb25jZTogZmlyc3RTaWduZXJOb25jZS5wdWJOb25jZSxcbiAgICAgICAgcHVibGljS2V5czogcGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgICBoYXNoLFxuICAgICAgfSkuc2lnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXNzaW9uS2V5ID0gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oe1xuICAgICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICAgIHB1YktleXM6IHBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoa3YucGFydGljaXBhbnRQdWJLZXksIHNpZ25lclB1YktleSkpO1xuICAgICAgaWYgKCFzaWduZXJOb25jZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1Yk5vbmNlIGlzIG1pc3NpbmcuIHJldHJ5IHNpZ25pbmcgcHJvY2VzcycpO1xuICAgICAgfVxuICAgICAgcGFydGlhbFNpZyA9IG11c2lnMlBhcnRpYWxTaWduKHNpZ25lci5wcml2YXRlS2V5LCBzaWduZXJOb25jZS5wdWJOb25jZSwgc2Vzc2lvbktleSwgdGhpcy5ub25jZVN0b3JlKTtcbiAgICB9XG5cbiAgICBpZiAoc2lnaGFzaFR5cGUgIT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCkge1xuICAgICAgcGFydGlhbFNpZyA9IEJ1ZmZlci5jb25jYXQoW3BhcnRpYWxTaWcsIEJ1ZmZlci5vZihzaWdoYXNoVHlwZSldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWcgPSBlbmNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyh7XG4gICAgICBwYXJ0aWNpcGFudFB1YktleTogc2lnbmVyUHViS2V5LFxuICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgcGFydGlhbFNpZzogcGFydGlhbFNpZyxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCBzaWcpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2lnblRhcHJvb3RJbnB1dChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnbmVyOiBTY2hub3JyU2lnbmVyLFxuICAgIGxlYWZIYXNoZXM6IEJ1ZmZlcltdLFxuICAgIHNpZ2hhc2hUeXBlczogbnVtYmVyW10gPSBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF1cbiAgKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIC8vIEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBzY3JpcHQgcGF0aCBvciBub3QsIGlmIG5vdCwgdHdlYWsgdGhlIHByaXZhdGUga2V5XG4gICAgaWYgKCFpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFwTGVhZlNjcmlwdCBpcyByZXF1aXJlZCBmb3IgcDJ0ciBzY3JpcHQgcGF0aCcpO1xuICAgIH1cbiAgICBjb25zdCBwdWJrZXkgPSB0b1hPbmx5UHVibGljS2V5KHNpZ25lci5wdWJsaWNLZXkpO1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIHNpZ25pbmcnKTtcbiAgICB9XG4gICAgY29uc3QgdGFwTGVhZlNjcmlwdCA9IGlucHV0LnRhcExlYWZTY3JpcHRbMF07XG4gICAgY29uc3QgcGFyc2VkQ29udHJvbEJsb2NrID0gdGFwcm9vdC5wYXJzZUNvbnRyb2xCbG9jayhlY2NMaWIsIHRhcExlYWZTY3JpcHQuY29udHJvbEJsb2NrKTtcbiAgICBjb25zdCB7IGxlYWZWZXJzaW9uIH0gPSBwYXJzZWRDb250cm9sQmxvY2s7XG4gICAgaWYgKGxlYWZWZXJzaW9uICE9PSB0YXBMZWFmU2NyaXB0LmxlYWZWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcCBzY3JpcHQgbGVhZiB2ZXJzaW9uIG1pc21hdGNoIHdpdGggY29udHJvbCBibG9jaycpO1xuICAgIH1cbiAgICBjb25zdCBsZWFmSGFzaCA9IHRhcHJvb3QuZ2V0VGFwbGVhZkhhc2goZWNjTGliLCBwYXJzZWRDb250cm9sQmxvY2ssIHRhcExlYWZTY3JpcHQuc2NyaXB0KTtcbiAgICBpZiAoIWxlYWZIYXNoZXMuZmluZCgobCkgPT4gbC5lcXVhbHMobGVhZkhhc2gpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduZXIgY2Fubm90IHNpZ24gZm9yIGxlYWYgaGFzaCAke2xlYWZIYXNoLnRvU3RyaW5nKCdoZXgnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgeyBoYXNoLCBzaWdoYXNoVHlwZSB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBzaWdoYXNoVHlwZXMsIGxlYWZIYXNoKTtcbiAgICBsZXQgc2lnbmF0dXJlID0gc2lnbmVyLnNpZ25TY2hub3JyKGhhc2gpO1xuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBzaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzaWduYXR1cmUsIEJ1ZmZlci5vZihzaWdoYXNoVHlwZSldKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcFNjcmlwdFNpZzogW1xuICAgICAgICB7XG4gICAgICAgICAgcHVia2V5LFxuICAgICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgICBsZWFmSGFzaCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGdldFRhcHJvb3RPdXRwdXRTY3JpcHQoaW5wdXRJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0YXByb290LmNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQoe1xuICAgICAgICBjb250cm9sQmxvY2s6IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uY29udHJvbEJsb2NrLFxuICAgICAgICBsZWFmU2NyaXB0OiBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkgJiYgaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcmV0dXJuIHRhcHJvb3QuY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7XG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwdHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhcHJvb3RIYXNoRm9yU2lnKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWdoYXNoVHlwZXM/OiBudW1iZXJbXSxcbiAgICBsZWFmSGFzaD86IEJ1ZmZlclxuICApOiB7XG4gICAgaGFzaDogQnVmZmVyO1xuICAgIHNpZ2hhc2hUeXBlOiBudW1iZXI7XG4gIH0ge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ2hhc2hUeXBlID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XS5zaWdoYXNoVHlwZSB8fCBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQ7XG4gICAgaWYgKHNpZ2hhc2hUeXBlcyAmJiBzaWdoYXNoVHlwZXMuaW5kZXhPZihzaWdoYXNoVHlwZSkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTaWdoYXNoIHR5cGUgaXMgbm90IGFsbG93ZWQuIFJldHJ5IHRoZSBzaWduIG1ldGhvZCBwYXNzaW5nIHRoZSBgICtcbiAgICAgICAgICBgc2lnaGFzaFR5cGVzIGFycmF5IG9mIHdoaXRlbGlzdGVkIHR5cGVzLiBTaWdoYXNoIHR5cGU6ICR7c2lnaGFzaFR5cGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICBjb25zdCBwcmV2b3V0U2NyaXB0czogQnVmZmVyW10gPSBbXTtcbiAgICBjb25zdCBwcmV2b3V0VmFsdWVzOiBiaWdpbnRbXSA9IFtdO1xuXG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgbGV0IHByZXZvdXQ7XG4gICAgICBpZiAoaW5wdXQubm9uV2l0bmVzc1V0eG8pIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBjb3N0bHksIGVpdGhlciBjYWNoZSBpdCBoZXJlLCBvciBmaW5kIGEgd2F5IHRvIHNoYXJlIHdpdGggc3VwZXJcbiAgICAgICAgY29uc3Qgbm9uV2l0bmVzc1V0eG9UeCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVdHhvUHNidCkudHJhbnNhY3Rpb25Gcm9tQnVmZmVyKFxuICAgICAgICAgIGlucHV0Lm5vbldpdG5lc3NVdHhvLFxuICAgICAgICAgIHRoaXMudHgubmV0d29ya1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByZXZvdXRIYXNoID0gdHhJbnB1dHNbaV0uaGFzaDtcbiAgICAgICAgY29uc3QgdXR4b0hhc2ggPSBub25XaXRuZXNzVXR4b1R4LmdldEhhc2goKTtcblxuICAgICAgICAvLyBJZiBhIG5vbi13aXRuZXNzIFVUWE8gaXMgcHJvdmlkZWQsIGl0cyBoYXNoIG11c3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0XG4gICAgICAgIGlmICghcHJldm91dEhhc2guZXF1YWxzKHV0eG9IYXNoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9uLXdpdG5lc3MgVVRYTyBoYXNoIGZvciBpbnB1dCAjJHtpfSBkb2Vzbid0IG1hdGNoIHRoZSBoYXNoIHNwZWNpZmllZCBpbiB0aGUgcHJldm91dGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldm91dEluZGV4ID0gdHhJbnB1dHNbaV0uaW5kZXg7XG4gICAgICAgIHByZXZvdXQgPSBub25XaXRuZXNzVXR4b1R4Lm91dHNbcHJldm91dEluZGV4XTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgcHJldm91dCA9IGlucHV0LndpdG5lc3NVdHhvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGEgVXR4byBpbnB1dCBpdGVtIGZvciBzaWduaW5nJyk7XG4gICAgICB9XG4gICAgICBwcmV2b3V0U2NyaXB0cy5wdXNoKHByZXZvdXQuc2NyaXB0KTtcbiAgICAgIHByZXZvdXRWYWx1ZXMucHVzaChwcmV2b3V0LnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXRTY3JpcHQgPSB0aGlzLmdldFRhcHJvb3RPdXRwdXRTY3JpcHQoaW5wdXRJbmRleCk7XG4gICAgaWYgKCFvdXRwdXRTY3JpcHQuZXF1YWxzKHByZXZvdXRTY3JpcHRzW2lucHV0SW5kZXhdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaXRuZXNzIHNjcmlwdCBmb3IgaW5wdXQgIyR7aW5wdXRJbmRleH0gZG9lc24ndCBtYXRjaCB0aGUgc2NyaXB0UHViS2V5IGluIHRoZSBwcmV2b3V0YCk7XG4gICAgfVxuICAgIGNvbnN0IGhhc2ggPSB0aGlzLnR4Lmhhc2hGb3JXaXRuZXNzVjEoaW5wdXRJbmRleCwgcHJldm91dFNjcmlwdHMsIHByZXZvdXRWYWx1ZXMsIHNpZ2hhc2hUeXBlLCBsZWFmSGFzaCk7XG4gICAgcmV0dXJuIHsgaGFzaCwgc2lnaGFzaFR5cGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBwYWlyIHRvIFBTQlQgaW5wdXQuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXg6IG51bWJlciwga2V5VmFsdWVEYXRhOiBQcm9wcmlldGFyeUtleVZhbHVlKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVW5rbm93bktleVZhbFRvSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAga2V5OiBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KSxcbiAgICAgIHZhbHVlOiBrZXlWYWx1ZURhdGEudmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBvciB1cGRhdGVzIChpZiBleGlzdHMpIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBwYWlyIHRvIFBTQlQgaW5wdXQuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgYWRkT3JVcGRhdGVQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3Qga2V5ID0gZW5jb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWVEYXRhLmtleSk7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0ga2V5VmFsdWVEYXRhO1xuICAgIGlmIChpbnB1dC51bmtub3duS2V5VmFscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1a3ZJbmRleCA9IGlucHV0LnVua25vd25LZXlWYWxzLmZpbmRJbmRleCgodWt2KSA9PiB1a3Yua2V5LmVxdWFscyhrZXkpKTtcbiAgICAgIGlmICh1a3ZJbmRleCA+IC0xKSB7XG4gICAgICAgIGlucHV0LnVua25vd25LZXlWYWxzW3VrdkluZGV4XSA9IHsga2V5LCB2YWx1ZSB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRVbmtub3duS2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBzZWFyY2ggYW55IGRhdGEgZnJvbSBwcm9wcmlldGFyeSBrZXkgdmFsdWUgYWdhaW5zdCBrZXlkYXRhLlxuICAgKiBEZWZhdWx0IGlkZW50aWZpZXJFbmNvZGluZyBpcyB1dGYtOCBmb3IgaWRlbnRpZmllci5cbiAgICovXG4gIGdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4OiBudW1iZXIsIGtleVNlYXJjaD86IFByb3ByaWV0YXJ5S2V5U2VhcmNoKTogUHJvcHJpZXRhcnlLZXlWYWx1ZVtdIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgcmV0dXJuIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwga2V5U2VhcmNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBkZWxldGUgYW55IGRhdGEgZnJvbSBwcm9wcmlldGFyeSBrZXkgdmFsdWUuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZGVsZXRlUHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5c1RvRGVsZXRlPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKCFpbnB1dC51bmtub3duS2V5VmFscz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKGtleXNUb0RlbGV0ZSAmJiBrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0gdW5kZWZpbmVkICYmIEJ1ZmZlci5pc0J1ZmZlcihrZXlzVG9EZWxldGUua2V5ZGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcm9wcmlldGFyeSBrZXkgc2VhcmNoIGZpbHRlciBjb21iaW5hdGlvbi4gc3VidHlwZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpbnB1dC51bmtub3duS2V5VmFscyA9IGlucHV0LnVua25vd25LZXlWYWxzLmZpbHRlcigoa2V5VmFsdWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlLmtleSk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAga2V5c1RvRGVsZXRlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKGtleXNUb0RlbGV0ZS5pZGVudGlmaWVyID09PSBrZXkuaWRlbnRpZmllciAmJlxuICAgICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoa2V5c1RvRGVsZXRlLnN1YnR5cGUgPT09IGtleS5zdWJ0eXBlICYmXG4gICAgICAgICAgICAgICghQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSB8fCBrZXlzVG9EZWxldGUua2V5ZGF0YS5lcXVhbHMoa2V5LmtleWRhdGEpKSkpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTXVzaWcyTm9uY2VGb3JJbnB1dChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAga2V5VHlwZTogJ3Jvb3QnIHwgJ2Rlcml2ZWQnLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogUHNidE11c2lnMlB1Yk5vbmNlIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF07XG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBJbnRlcm5hbEtleSBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgaWYgKCFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcE1lcmtsZVJvb3QgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IGdldERlcml2ZWRLZXlQYWlyID0gKCk6IEJJUDMySW50ZXJmYWNlID0+IHtcbiAgICAgIGlmICghaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBCaXAzMkRlcml2YXRpb24gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXJpdmVkID0gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihrZXlQYWlyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24sIHsgaWdub3JlWTogdHJ1ZSB9KTtcbiAgICAgIGlmICghZGVyaXZlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCBtYXRjaGVkIHRoZSBIRCBrZXlQYWlyIGZpbmdlcnByaW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVyaXZlZDtcbiAgICB9O1xuICAgIGNvbnN0IGRlcml2ZWRLZXlQYWlyID0ga2V5VHlwZSA9PT0gJ3Jvb3QnID8gZ2V0RGVyaXZlZEtleVBhaXIoKSA6IGtleVBhaXI7XG4gICAgaWYgKCFkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGVLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dCk7XG4gICAgaWYgKCFwYXJ0aWNpcGFudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgMCBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzLCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3QgeyB0YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50UHViS2V5cyB9ID0gcGFydGljaXBhbnRzO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRQdWJLZXkgPSBwYXJ0aWNpcGFudFB1YktleXMuZmluZCgocHViS2V5KSA9PlxuICAgICAgZXF1YWxQdWJsaWNLZXlJZ25vcmVZKHB1YktleSwgZGVyaXZlZEtleVBhaXIucHVibGljS2V5KVxuICAgICk7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocGFydGljaXBhbnRQdWJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpY2lwYW50IHBsYWluIHB1YiBrZXkgc2hvdWxkIG1hdGNoIG9uZSBiaXAzMkRlcml2YXRpb24gcGxhaW4gcHViIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4KTtcblxuICAgIGxldCBwdWJOb25jZTogQnVmZmVyO1xuICAgIGlmIChwYXJhbXMuZGV0ZXJtaW5pc3RpYykge1xuICAgICAgaWYgKHBhcmFtcy5zZXNzaW9uSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGV4dHJhIGVudHJvcHkgd2hlbiBnZW5lcmF0aW5nIGEgZGV0ZXJtaW5pc3RpYyBub25jZScpO1xuICAgICAgfVxuICAgICAgLy8gVGhlcmUgbXVzdCBiZSBvbmx5IDIgcGFydGljaXBhbnQgcHViS2V5cyBpZiBpdCBnb3QgdG8gdGhpcyBwb2ludFxuICAgICAgaWYgKCFlcXVhbFB1YmxpY0tleUlnbm9yZVkocGFydGljaXBhbnRQdWJLZXksIHBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHRoZSBjb3NpZ25lcidzIG5vbmNlIGNhbiBiZSBzZXQgZGV0ZXJtaW5pc3RpY2FsbHlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vbmNlcyA9IHBhcnNlUHNidE11c2lnMk5vbmNlcyhpbnB1dCk7XG4gICAgICBpZiAoIW5vbmNlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG5vbmNlcyBmb3VuZCBvbiBpbnB1dCAjJHtpbnB1dEluZGV4fWApO1xuICAgICAgfVxuICAgICAgaWYgKG5vbmNlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGhhdmUgbW9yZSB0aGFuIDIgbm9uY2VzYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdFNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoa3YucGFydGljaXBhbnRQdWJLZXksIHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIG5vbmNlIG11c3QgYmUgc2V0IGlmIGNvc2lnbmVyIG5vbmNlIGlzIHRvIGJlIGRlcml2ZWQgZGV0ZXJtaW5pc3RpY2FsbHknKTtcbiAgICAgIH1cblxuICAgICAgcHViTm9uY2UgPSBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2Uoe1xuICAgICAgICBwcml2YXRlS2V5OiBkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHViTm9uY2UgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5ub25jZVN0b3JlLmNyZWF0ZU11c2lnMk5vbmNlKFxuICAgICAgICAgIGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgcGFyYW1zLnNlc3Npb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXksIHB1Yk5vbmNlIH07XG4gIH1cblxuICBwcml2YXRlIHNldE11c2lnMk5vbmNlc0lubmVyKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBpbnB1dEluZGV4PzogbnVtYmVyLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgaWYgKGtleVBhaXIuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocGFyYW1zLnNlc3Npb25JZCkgJiYgcGFyYW1zLnNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dEluZGV4ZXMgPSBpbnB1dEluZGV4ID09PSB1bmRlZmluZWQgPyBbLi4uQXJyYXkodGhpcy5pbnB1dENvdW50KS5rZXlzKCldIDogW2lucHV0SW5kZXhdO1xuICAgIGlucHV0SW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9uY2UgPSB0aGlzLmNyZWF0ZU11c2lnMk5vbmNlRm9ySW5wdXQoaW5kZXgsIGtleVBhaXIsIGtleVR5cGUsIHBhcmFtcyk7XG4gICAgICB0aGlzLmFkZE9yVXBkYXRlUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGluZGV4LCBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2Uobm9uY2UpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIHRhcHJvb3Qga2V5IHBhdGggaW5wdXQgYXQgaW5wdXRJbmRleC5cbiAgICogSWYgaW5wdXQgaXMgbm90IGEgdGFwcm9vdCBrZXkgcGF0aCwgbm8gYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBkZXJpdmVkIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKiBAcGFyYW0gZGV0ZXJtaW5pc3RpYyBJZiB0cnVlLCBzZXQgdGhlIGNvc2lnbmVyIG5vbmNlIGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzZXRJbnB1dE11c2lnMk5vbmNlKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmVkS2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihkZXJpdmVkS2V5UGFpciwgJ2Rlcml2ZWQnLCBpbnB1dEluZGV4LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gdGFwcm9vdCBrZXkgcGF0aCBpbnB1dCBhdCBpbnB1dEluZGV4LlxuICAgKiBJZiBpbnB1dCBpcyBub3QgYSB0YXByb290IGtleSBwYXRoLCBubyBhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNldCB0aGUgY29zaWduZXIgbm9uY2UgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNldElucHV0TXVzaWcyTm9uY2VIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGtleVBhaXIsICdyb290JywgaW5wdXRJbmRleCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIGFsbCB0YXByb290IGtleSBwYXRoIGlucHV0cy4gT3RoZXIgaW5wdXRzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgZGVyaXZlZCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIHNldEFsbElucHV0c011c2lnMk5vbmNlKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ2Rlcml2ZWQnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byBhbGwgdGFwcm9vdCBrZXkgcGF0aCBpbnB1dHMuIE90aGVyIGlucHV0cyB3aWxsIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBzZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ3Jvb3QnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICBjbG9uZSgpOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyB0aGlzO1xuICB9XG5cbiAgZXh0cmFjdFRyYW5zYWN0aW9uKGRpc2FibGVGZWVDaGVjaz86IGJvb2xlYW4pOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgY29uc3QgdHggPSBzdXBlci5leHRyYWN0VHJhbnNhY3Rpb24oZGlzYWJsZUZlZUNoZWNrKTtcbiAgICBpZiAodHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybiB0eDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHRyYWN0VHJhbnNhY3Rpb24gZGlkIG5vdCByZXR1cm4gaW5zdGFjZSBvZiBVdHhvVHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuIl19
469
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBRTFDLGdEQUFxRDtBQUNyRCwrREFBc0U7QUFFdEUsMEJBVVk7QUFDWix1REFBb0Q7QUFDcEQsdUNBQWdEO0FBQ2hELG9EQUE4QztBQUM5QywwREFBK0M7QUFDL0MsbURBQW1EO0FBQ25ELDZDQUE4QztBQUM5QyxpQ0FBcUM7QUFDckMsdUNBQXVDO0FBQ3ZDLHdFQUE4RztBQUVqRyxRQUFBLDJCQUEyQixHQUFHLE9BQU8sQ0FBQztBQUVuRCxJQUFZLHFCQUlYO0FBSkQsV0FBWSxxQkFBcUI7SUFDL0IsdUdBQThCLENBQUE7SUFDOUIsK0dBQWtDLENBQUE7SUFDbEMseUZBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpXLHFCQUFxQixHQUFyQiw2QkFBcUIsS0FBckIsNkJBQXFCLFFBSWhDO0FBb0RELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLE1BQWEsUUFBdUUsU0FBUSxRQUFJO0lBQ3BGLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFjLEVBQUUsT0FBZ0I7UUFDckUsT0FBTyxpQ0FBZSxDQUFDLFVBQVUsQ0FBUyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFjLEVBQUUsSUFBZTtRQUMvQyxPQUFPLElBQUksUUFBUSxDQUNqQixJQUFJLEVBQ0osSUFBSSxJQUFJLElBQUksYUFBUSxDQUFDLElBQUksbUJBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLGlDQUFlLENBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYyxFQUFF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RCxPQUFPLEVBQUUsR0FBRyxFQUFFLHdDQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsT0FBTyxDQUNMLFNBQVMsS0FBSyxTQUFTO2dCQUN2QixDQUFDLFNBQVMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVO29CQUM3QyxTQUFTLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTztvQkFDeEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUN6RixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBVSxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQWpnQkQsNEJBaWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQgYXMgUHNidEJhc2UgfSBmcm9tICdiaXAxNzQnO1xuaW1wb3J0IHsgVGFwQmlwMzJEZXJpdmF0aW9uLCBUcmFuc2FjdGlvbiBhcyBJVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uRnJvbUJ1ZmZlciB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJ1ZmZlcldyaXRlciwgdmFydWludCB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL2J1ZmZlcnV0aWxzJztcblxuaW1wb3J0IHtcbiAgdGFwcm9vdCxcbiAgSERTaWduZXIsXG4gIFBzYnQsXG4gIFBzYnRUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG4gIFR4T3V0cHV0LFxuICBOZXR3b3JrLFxuICBlY2MgYXMgZWNjTGliLFxuICBwMnRyUGF5bWVudHMsXG59IGZyb20gJy4uJztcbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiB9IGZyb20gJy4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGdldE91dHB1dElkRm9ySW5wdXQgfSBmcm9tICcuL1Vuc3BlbnQnO1xuaW1wb3J0IHsgaXNTZWd3aXQgfSBmcm9tICcuL3BzYnQvc2NyaXB0VHlwZXMnO1xuaW1wb3J0IHsgdW5zaWduIH0gZnJvbSAnLi9wc2J0L2Zyb21IYWxmU2lnbmVkJztcbmltcG9ydCB7IHRvWE9ubHlQdWJsaWNLZXkgfSBmcm9tICcuL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgcGFyc2VQdWJTY3JpcHQgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHsgQklQMzJGYWN0b3J5IH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBkZWNvZGVQcm9wcmlldGFyeUtleSwgZW5jb2RlUHJvcHJpZXRhcnlLZXksIFByb3ByaWV0YXJ5S2V5IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvcHJvcHJpZXRhcnlLZXlWYWwnO1xuXG5leHBvcnQgY29uc3QgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSID0gJ0JJVEdPJztcblxuZXhwb3J0IGVudW0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlIHtcbiAgWkVDX0NPTlNFTlNVU19CUkFOQ0hfSUQgPSAweDAwLFxuICBNVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMgPSAweDAxLFxuICBNVVNJRzJfUFVCX05PTkNFID0gMHgwMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIRFRhcHJvb3RTaWduZXIgZXh0ZW5kcyBIRFNpZ25lciB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBzdHJpbmcgbXVzdCBtYXRjaCAvXm0oXFwvXFxkKyc/KSskL1xuICAgKiBleC4gbS80NCcvMCcvMCcvMS8yMyBsZXZlbHMgd2l0aCAnIG11c3QgYmUgaGFyZCBkZXJpdmF0aW9uc1xuICAgKi9cbiAgZGVyaXZlUGF0aChwYXRoOiBzdHJpbmcpOiBIRFRhcHJvb3RTaWduZXI7XG4gIC8qKlxuICAgKiBJbnB1dCBoYXNoICh0aGUgXCJtZXNzYWdlIGRpZ2VzdFwiKSBmb3IgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG1cbiAgICogUmV0dXJuIGEgNjQgYnl0ZSBzaWduYXR1cmUgKDMyIGJ5dGUgciBhbmQgMzIgYnl0ZSBzIGluIHRoYXQgb3JkZXIpXG4gICAqL1xuICBzaWduU2Nobm9ycihoYXNoOiBCdWZmZXIpOiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nobm9yclNpZ25lciB7XG4gIHB1YmxpY0tleTogQnVmZmVyO1xuICBzaWduU2Nobm9ycihoYXNoOiBCdWZmZXIpOiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFwcm9vdFNpZ25lciB7XG4gIGxlYWZIYXNoZXM6IEJ1ZmZlcltdO1xuICBzaWduZXI6IFNjaG5vcnJTaWduZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE9wdHMge1xuICBuZXR3b3JrOiBOZXR3b3JrO1xuICBtYXhpbXVtRmVlUmF0ZT86IG51bWJlcjsgLy8gW3NhdC9ieXRlXVxuICBiaXAzMlBhdGhzQWJzb2x1dGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5ZGF0YSBvYmplY3QuXG4gKiA8Y29tcGFjdCBzaXplIHVpbnQgaWRlbnRpZmllciBsZW5ndGg+IDxieXRlcyBpZGVudGlmaWVyPiA8Y29tcGFjdCBzaXplIHVpbnQgc3VidHlwZT4gPGJ5dGVzIHN1YmtleWRhdGE+XG4gKiA9PiA8Ynl0ZXMgdmFsdWVkYXRhPlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ByaWV0YXJ5S2V5VmFsdWVEYXRhIHtcbiAga2V5OiBQcm9wcmlldGFyeUtleTtcbiAgdmFsdWU6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleWRhdGEgb2JqZWN0IHNlYXJjaCBmaWVsZHMuXG4gKiA8Y29tcGFjdCBzaXplIHVpbnQgaWRlbnRpZmllciBsZW5ndGg+IDxieXRlcyBpZGVudGlmaWVyPiA8Y29tcGFjdCBzaXplIHVpbnQgc3VidHlwZT4gPGJ5dGVzIHN1YmtleWRhdGE+XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcHJpZXRhcnlLZXlTZWFyY2gge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHN1YnR5cGU6IG51bWJlcjtcbiAga2V5ZGF0YT86IEJ1ZmZlcjtcbiAgaWRlbnRpZmllckVuY29kaW5nPzogQnVmZmVyRW5jb2Rpbmc7XG59XG5cbi8vIFRPRE86IHVwc3RyZWFtIGRvZXMgYGNoZWNrSW5wdXRzRm9yUGFydGlhbFNpZ3NgIGJlZm9yZSBkb2luZyB0aGluZ3MgbGlrZVxuLy8gYHNldFZlcnNpb25gLiBPdXIgaW5wdXRzIGNvdWxkIGhhdmUgdGFwc2NyaXB0c2lncyAob3IgaW4gZnV0dXJlIHRhcGtleXNpZ3MpXG4vLyBhbmQgbm90IGZhaWwgdGhhdCBjaGVjay4gRG8gd2Ugd2FudCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGF0P1xuZXhwb3J0IGNsYXNzIFV0eG9Qc2J0PFR4IGV4dGVuZHMgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4gPSBVdHhvVHJhbnNhY3Rpb248YmlnaW50Pj4gZXh0ZW5kcyBQc2J0IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyB0cmFuc2FjdGlvbkZyb21CdWZmZXIoYnVmZmVyOiBCdWZmZXIsIG5ldHdvcms6IE5ldHdvcmspOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgcmV0dXJuIFV0eG9UcmFuc2FjdGlvbi5mcm9tQnVmZmVyPGJpZ2ludD4oYnVmZmVyLCBmYWxzZSwgJ2JpZ2ludCcsIG5ldHdvcmspO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBzYnQob3B0czogUHNidE9wdHMsIGRhdGE/OiBQc2J0QmFzZSk6IFV0eG9Qc2J0IHtcbiAgICByZXR1cm4gbmV3IFV0eG9Qc2J0KFxuICAgICAgb3B0cyxcbiAgICAgIGRhdGEgfHwgbmV3IFBzYnRCYXNlKG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eDogbmV3IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KG9wdHMubmV0d29yaykgfSkpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBvcHRzOiBQc2J0T3B0cyk6IFV0eG9Qc2J0IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkZyb21CdWZmZXI6IFRyYW5zYWN0aW9uRnJvbUJ1ZmZlciA9IChidWZmZXI6IEJ1ZmZlcik6IElUcmFuc2FjdGlvbiA9PiB7XG4gICAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlciwgb3B0cy5uZXR3b3JrKTtcbiAgICAgIHJldHVybiBuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHggfSk7XG4gICAgfTtcbiAgICBjb25zdCBwc2J0QmFzZSA9IFBzYnRCYXNlLmZyb21CdWZmZXIoYnVmZmVyLCB0cmFuc2FjdGlvbkZyb21CdWZmZXIsIHtcbiAgICAgIGJpcDMyUGF0aHNBYnNvbHV0ZTogb3B0cy5iaXAzMlBhdGhzQWJzb2x1dGUsXG4gICAgfSk7XG4gICAgY29uc3QgcHNidCA9IHRoaXMuY3JlYXRlUHNidChvcHRzLCBwc2J0QmFzZSk7XG4gICAgLy8gVXBzdHJlYW0gY2hlY2tzIGZvciBkdXBsaWNhdGUgaW5wdXRzIGhlcmUsIGJ1dCBpdCBzZWVtcyB0byBiZSBvZiBkdWJpb3VzIHZhbHVlLlxuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgc3RhdGljIGZyb21IZXgoZGF0YTogc3RyaW5nLCBvcHRzOiBQc2J0T3B0cyk6IFV0eG9Qc2J0IHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKGRhdGEsICdoZXgnKSwgb3B0cyk7XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcbiAgICByZXR1cm4gdGhpcy50eC5uZXR3b3JrO1xuICB9XG5cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHRydWUgaWZmIFBTQlQgaW5wdXQgaXMgZmluYWxpemVkXG4gICAqL1xuICBpc0lucHV0RmluYWxpemVkKGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGlucHV0LmZpbmFsU2NyaXB0U2lnKSB8fCBCdWZmZXIuaXNCdWZmZXIoaW5wdXQuZmluYWxTY3JpcHRXaXRuZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHBhcnRpYWxTaWcvdGFwU2NyaXB0U2lnIGNvdW50IGlmZiBpbnB1dCBpcyBub3QgZmluYWxpemVkXG4gICAqL1xuICBnZXRTaWduYXR1cmVDb3VudChpbnB1dEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmlzSW5wdXRGaW5hbGl6ZWQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgaXMgYWxyZWFkeSBmaW5hbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIEFycmF5LmlzQXJyYXkoaW5wdXQucGFydGlhbFNpZykgPyBpbnB1dC5wYXJ0aWFsU2lnLmxlbmd0aCA6IDAsXG4gICAgICBBcnJheS5pc0FycmF5KGlucHV0LnRhcFNjcmlwdFNpZykgPyBpbnB1dC50YXBTY3JpcHRTaWcubGVuZ3RoIDogMFxuICAgICk7XG4gIH1cblxuICBnZXROb25XaXRuZXNzUHJldmlvdXNUeGlkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICBjb25zdCB0eGlkU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICB0eGlkU2V0LmFkZChnZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2luZGV4XSkudHhpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFsuLi50eGlkU2V0XTtcbiAgfVxuXG4gIGFkZE5vbldpdG5lc3NVdHhvcyh0eEJ1ZnM6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4pOiB0aGlzIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIHdpdG5lc3MgVVRYTyBmb3IgYWxsIGlucHV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1NlZ3dpdChpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQsIGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgeyB0eGlkIH0gPSBnZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2luZGV4XSk7XG4gICAgICAgIGlmICh0eEJ1ZnNbdHhpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGFsbCByZXF1aXJlZCBwcmV2aW91cyB0cmFuc2FjdGlvbnMgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0KGluZGV4LCB7IG5vbldpdG5lc3NVdHhvOiB0eEJ1ZnNbdHhpZF0gfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiwgcHJldk91dHB1dHM6IFR4T3V0cHV0PGJpZ2ludD5bXSk6IFV0eG9Qc2J0IHtcbiAgICBpZiAocHJldk91dHB1dHMubGVuZ3RoICE9PSB0cmFuc2FjdGlvbi5pbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiBoYXMgJHt0cmFuc2FjdGlvbi5pbnMubGVuZ3RofSBpbnB1dHMsIGJ1dCAke3ByZXZPdXRwdXRzLmxlbmd0aH0gcHJldmlvdXMgb3V0cHV0cyBwcm92aWRlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNsb25lZFRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24uY2xvbmUoKTtcbiAgICBjb25zdCB1cGRhdGVzID0gdW5zaWduKGNsb25lZFRyYW5zYWN0aW9uLCBwcmV2T3V0cHV0cyk7XG5cbiAgICBjb25zdCBwc2J0QmFzZSA9IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IGNsb25lZFRyYW5zYWN0aW9uIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoKSA9PiBwc2J0QmFzZS5pbnB1dHMucHVzaCh7IHVua25vd25LZXlWYWxzOiBbXSB9KSk7XG4gICAgY2xvbmVkVHJhbnNhY3Rpb24ub3V0cy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLm91dHB1dHMucHVzaCh7IHVua25vd25LZXlWYWxzOiBbXSB9KSk7XG4gICAgY29uc3QgcHNidCA9IHRoaXMuY3JlYXRlUHNidCh7IG5ldHdvcms6IHRyYW5zYWN0aW9uLm5ldHdvcmsgfSwgcHNidEJhc2UpO1xuXG4gICAgdXBkYXRlcy5mb3JFYWNoKCh1cGRhdGUsIGluZGV4KSA9PiB7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB1cGRhdGUpO1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQ6IHByZXZPdXRwdXRzW2luZGV4XS5zY3JpcHQsIHZhbHVlOiBwcmV2T3V0cHV0c1tpbmRleF0udmFsdWUgfSB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgZ2V0VW5zaWduZWRUeCgpOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgcmV0dXJuIHRoaXMudHguY2xvbmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV3VHJhbnNhY3Rpb24obmV0d29yazogTmV0d29yayk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gbmV3IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KG5ldHdvcmspO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0eCgpOiBUeCB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEuZ2xvYmFsTWFwLnVuc2lnbmVkVHggYXMgUHNidFRyYW5zYWN0aW9uKS50eCBhcyBUeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0ZvclNpZ25hdHVyZXMocHJvcE5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggfHwgaW5wdXQudGFwS2V5U2lnIHx8IGlucHV0LnBhcnRpYWxTaWc/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb2RpZnkgJHtwcm9wTmFtZSA/PyAndHJhbnNhY3Rpb24nfSAtIHNpZ25hdHVyZXMgZXhpc3QuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIGZpbmFsaXplQWxsSW5wdXRzKCk6IHRoaXMge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgdGhpcy5kYXRhLmlucHV0cy5tYXAoKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIHJldHVybiBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCA/IHRoaXMuZmluYWxpemVUYXByb290SW5wdXQoaWR4KSA6IHRoaXMuZmluYWxpemVJbnB1dChpZHgpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZmluYWxpemVUYXByb290SW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIC8vIHdpdG5lc3MgPSBjb250cm9sLWJsb2NrIHNjcmlwdCBmaXJzdC1zaWcgc2Vjb25kLXNpZ1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBmaW5hbGl6aW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY29udHJvbEJsb2NrLCBzY3JpcHQgfSA9IGlucHV0LnRhcExlYWZTY3JpcHRbMF07XG4gICAgY29uc3Qgd2l0bmVzczogQnVmZmVyW10gPSBbc2NyaXB0LCBjb250cm9sQmxvY2tdO1xuICAgIGNvbnN0IFtwdWJrZXkxLCBwdWJrZXkyXSA9IHBhcnNlUHViU2NyaXB0KHNjcmlwdCwgJ3AydHInKS5wdWJsaWNLZXlzO1xuICAgIGZvciAoY29uc3QgcGsgb2YgW3B1YmtleTEsIHB1YmtleTJdKSB7XG4gICAgICBjb25zdCBzaWcgPSBpbnB1dC50YXBTY3JpcHRTaWc/LmZpbmQoKHsgcHVia2V5IH0pID0+IHB1YmtleS5lcXVhbHMocGspKTtcbiAgICAgIGlmICghc2lnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgc2lnbmF0dXJlcyBpbiBTY3JpcHQgU2lnLicpO1xuICAgICAgfVxuICAgICAgd2l0bmVzcy51bnNoaWZ0KHNpZy5zaWduYXR1cmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpdG5lc3NMZW5ndGggPSB3aXRuZXNzLnJlZHVjZSgocywgYikgPT4gcyArIGIubGVuZ3RoICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChiLmxlbmd0aCksIDEpO1xuXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSh3aXRuZXNzTGVuZ3RoKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWZWN0b3Iod2l0bmVzcyk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmaW5hbGl6ZVRhcElucHV0V2l0aFNpbmdsZUxlYWZTY3JpcHRBbmRTaWduYXR1cmUoaW5wdXRJbmRleDogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBmaW5hbGl6aW5nJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHNjcmlwdCB9ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCB3aXRuZXNzOiBCdWZmZXJbXSA9IFtpbnB1dC50YXBTY3JpcHRTaWdbMF0uc2lnbmF0dXJlLCBzY3JpcHQsIGNvbnRyb2xCbG9ja107XG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50c1xuICAgKlxuICAgKiBVbmxpa2UgdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlcywgdGhpcyBkb2VzIG5vdCB0YWtlIGEgdmFsaWRhdG9yLiBJbiBCaXRHb1xuICAgKiBjb250ZXh0LCB3ZSBrbm93IGhvdyB3ZSB3YW50IHRvIHZhbGlkYXRlIHNvIHdlIGp1c3QgaGFyZCBjb2RlIHRoZSByaWdodFxuICAgKiB2YWxpZGF0b3IuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpOiBib29sZWFuIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIDApOyAvLyBtYWtpbmcgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgcmV0dXJuIGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoXG4gICAgICAgID8gdGhpcy52YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpZHgpXG4gICAgICAgIDogdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0KGlkeCwgKHAsIG0sIHMpID0+IGVjY0xpYi52ZXJpZnkobSwgcCwgcykpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzLnJlZHVjZSgoZmluYWwsIHJlcykgPT4gcmVzICYmIGZpbmFsLCB0cnVlKTtcbiAgfVxuXG4gIHZhbGlkYXRlVGFwcm9vdFNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICAgIGNvbnN0IHRhcFNpZ3MgPSAoaW5wdXQgfHwge30pLnRhcFNjcmlwdFNpZztcbiAgICBpZiAoIWlucHV0IHx8ICF0YXBTaWdzIHx8IHRhcFNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlJyk7XG4gICAgfVxuICAgIGxldCBteVNpZ3M7XG4gICAgaWYgKHB1YmtleSkge1xuICAgICAgY29uc3QgeE9ubHlQdWJrZXkgPSB0b1hPbmx5UHVibGljS2V5KHB1YmtleSk7XG4gICAgICBteVNpZ3MgPSB0YXBTaWdzLmZpbHRlcigoc2lnKSA9PiBzaWcucHVia2V5LmVxdWFscyh4T25seVB1YmtleSkpO1xuICAgICAgaWYgKG15U2lncy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbXlTaWdzID0gdGFwU2lncztcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYm9vbGVhbltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHBTaWcgb2YgbXlTaWdzKSB7XG4gICAgICBjb25zdCB7IHNpZ25hdHVyZSwgbGVhZkhhc2gsIHB1YmtleSB9ID0gcFNpZztcbiAgICAgIGxldCBzaWdIYXNoVHlwZTogbnVtYmVyO1xuICAgICAgbGV0IHNpZzogQnVmZmVyO1xuICAgICAgaWYgKHNpZ25hdHVyZS5sZW5ndGggPT09IDY1KSB7XG4gICAgICAgIHNpZ0hhc2hUeXBlID0gc2lnbmF0dXJlWzY0XTtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlLnNsaWNlKDAsIDY0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ0hhc2hUeXBlID0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUO1xuICAgICAgICBzaWcgPSBzaWduYXR1cmU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGhhc2ggfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgW3NpZ0hhc2hUeXBlXSwgbGVhZkhhc2gpO1xuICAgICAgcmVzdWx0cy5wdXNoKGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHB1YmtleSwgc2lnKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyA9PT0gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4gVHJ1ZSB3aGVuIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYHB1YmxpY0tleXNgIGhhcyBzaWduZWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBJZiBubyBzaWduYXR1cmUgaW4gdGhlIHR4IG9yIG5vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2lnbmF0dXJlLCB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGZhbHNlLlxuICAgKi9cbiAgZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW5bXSB7XG4gICAgY29uc3Qgbm9TaWdFcnJvck1lc3NhZ2VzID0gWydObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlJywgJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5J107XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IGlzUDJ0ciA9IGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoO1xuICAgIGlmICghdGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgc2lnbmF0dXJlIHZhbGlkYXRpb24gYXJyYXkgd2l0aG91dCBnbG9iYWwgeHB1YnMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YS5nbG9iYWxNYXAuZ2xvYmFsWHB1Yi5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgbXVzdCBiZSAzIGdsb2JhbCB4cHVicyBhbmQgdGhlcmUgYXJlICR7dGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nbG9iYWxNYXAuZ2xvYmFsWHB1Yi5tYXAoKHhwdWIpID0+IHtcbiAgICAgIC8vIGNvbnN0IGJpcDMyID0gRUNQYWlyLmZyb21QdWJsaWNLZXkoeHB1Yi5leHRlbmRlZFB1YmtleSwgeyBuZXR3b3JrOiAodGhpcyBhcyBhbnkpLm9wdHMubmV0d29yayB9KTtcbiAgICAgIGNvbnN0IGJpcDMyID0gQklQMzJGYWN0b3J5KGVjY0xpYikuZnJvbUJhc2U1OChiczU4Y2hlY2suZW5jb2RlKHhwdWIuZXh0ZW5kZWRQdWJrZXkpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBpc1AydHJcbiAgICAgICAgICA/IHRoaXMudmFsaWRhdGVUYXByb290U2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgYmlwMzIucHVibGljS2V5KVxuICAgICAgICAgIDogdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXgsIChwLCBtLCBzKSA9PiBlY2NMaWIudmVyaWZ5KG0sIHAsIHMpLCBiaXAzMi5wdWJsaWNLZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICAgIGlmIChub1NpZ0Vycm9yTWVzc2FnZXMuaW5jbHVkZXMoZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50c1xuICAgKi9cbiAgc2lnbkFsbElucHV0c0hEKFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyLFxuICAgIHNpZ2hhc2hUeXBlczogbnVtYmVyW10gPSBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF1cbiAgKTogdGhpcyB7XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaW5wdXRzW2ldLnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zaWduVGFwcm9vdElucHV0SEQoaSwgaGRLZXlQYWlyLCBzaWdoYXNoVHlwZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2lnbklucHV0SEQoaSwgaGRLZXlQYWlyLCBzaWdoYXNoVHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdHMucHVzaCh0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXN1bHRzLnB1c2goZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdWx0cy5ldmVyeSgodikgPT4gdiA9PT0gZmFsc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0cyB3ZXJlIHNpZ25lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50czpzaWduSW5wdXRIRFxuICAgKi9cbiAgc2lnblRhcHJvb3RJbnB1dEhEKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBoZEtleVBhaXI6IEhEVGFwcm9vdFNpZ25lcixcbiAgICBzaWdoYXNoVHlwZXM6IG51bWJlcltdID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdXG4gICk6IHRoaXMge1xuICAgIGlmICghaGRLZXlQYWlyIHx8ICFoZEtleVBhaXIucHVibGljS2V5IHx8ICFoZEtleVBhaXIuZmluZ2VycHJpbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBIRFNpZ25lciB0byBzaWduIGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiB8fCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgdGFwQmlwMzJEZXJpdmF0aW9uIHRvIHNpZ24gVGFwcm9vdCB3aXRoIEhEJyk7XG4gICAgfVxuICAgIGNvbnN0IG15RGVyaXZhdGlvbnMgPSBpbnB1dC50YXBCaXAzMkRlcml2YXRpb25cbiAgICAgIC5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGlmIChiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMoaGRLZXlQYWlyLmZpbmdlcnByaW50KSkge1xuICAgICAgICAgIHJldHVybiBiaXBEdjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYpID0+ICEhdikgYXMgVGFwQmlwMzJEZXJpdmF0aW9uW107XG4gICAgaWYgKG15RGVyaXZhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgSERTaWduZXIgZmluZ2VycHJpbnQnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVyczogVGFwcm9vdFNpZ25lcltdID0gbXlEZXJpdmF0aW9ucy5tYXAoKGJpcER2KSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gaGRLZXlQYWlyLmRlcml2ZVBhdGgoYmlwRHYucGF0aCk7XG4gICAgICBpZiAoIWJpcER2LnB1YmtleS5lcXVhbHMobm9kZS5wdWJsaWNLZXkuc2xpY2UoMSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggdGFwQmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzaWduZXI6IG5vZGUsIGxlYWZIYXNoZXM6IGJpcER2LmxlYWZIYXNoZXMgfTtcbiAgICB9KTtcbiAgICBzaWduZXJzLmZvckVhY2goKHsgc2lnbmVyLCBsZWFmSGFzaGVzIH0pID0+IHRoaXMuc2lnblRhcHJvb3RJbnB1dChpbnB1dEluZGV4LCBzaWduZXIsIGxlYWZIYXNoZXMsIHNpZ2hhc2hUeXBlcykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2lnblRhcHJvb3RJbnB1dChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnbmVyOiBTY2hub3JyU2lnbmVyLFxuICAgIGxlYWZIYXNoZXM6IEJ1ZmZlcltdLFxuICAgIHNpZ2hhc2hUeXBlczogbnVtYmVyW10gPSBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF1cbiAgKTogdGhpcyB7XG4gICAgY29uc3QgcHVia2V5ID0gdG9YT25seVB1YmxpY0tleShzaWduZXIucHVibGljS2V5KTtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gRmlndXJlIG91dCBpZiB0aGlzIGlzIHNjcmlwdCBwYXRoIG9yIG5vdCwgaWYgbm90LCB0d2VhayB0aGUgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgLy8gU2VlIEJpdEdvL0JpdEdvSlMvbW9kdWxlcy91dHhvX2xpYi9zcmMvdHJhbnNhY3Rpb25fYnVpbGRlci50czp0cnlTaWduIGZvciBob3cgdG8gc3VwcG9ydCBpdC5cbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFwcm9vdCBrZXkgcGF0aCBzaWduaW5nIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIHNpZ25pbmcnKTtcbiAgICB9XG4gICAgY29uc3QgdGFwTGVhZlNjcmlwdCA9IGlucHV0LnRhcExlYWZTY3JpcHRbMF07XG4gICAgY29uc3QgcGFyc2VkQ29udHJvbEJsb2NrID0gdGFwcm9vdC5wYXJzZUNvbnRyb2xCbG9jayhlY2NMaWIsIHRhcExlYWZTY3JpcHQuY29udHJvbEJsb2NrKTtcbiAgICBjb25zdCB7IGxlYWZWZXJzaW9uIH0gPSBwYXJzZWRDb250cm9sQmxvY2s7XG4gICAgaWYgKGxlYWZWZXJzaW9uICE9PSB0YXBMZWFmU2NyaXB0LmxlYWZWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcCBzY3JpcHQgbGVhZiB2ZXJzaW9uIG1pc21hdGNoIHdpdGggY29udHJvbCBibG9jaycpO1xuICAgIH1cbiAgICBjb25zdCBsZWFmSGFzaCA9IHRhcHJvb3QuZ2V0VGFwbGVhZkhhc2goZWNjTGliLCBwYXJzZWRDb250cm9sQmxvY2ssIHRhcExlYWZTY3JpcHQuc2NyaXB0KTtcbiAgICBpZiAoIWxlYWZIYXNoZXMuZmluZCgobCkgPT4gbC5lcXVhbHMobGVhZkhhc2gpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduZXIgY2Fubm90IHNpZ24gZm9yIGxlYWYgaGFzaCAke2xlYWZIYXNoLnRvU3RyaW5nKCdoZXgnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgeyBoYXNoLCBzaWdoYXNoVHlwZSB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBzaWdoYXNoVHlwZXMsIGxlYWZIYXNoKTtcbiAgICBsZXQgc2lnbmF0dXJlID0gc2lnbmVyLnNpZ25TY2hub3JyKGhhc2gpO1xuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBzaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzaWduYXR1cmUsIEJ1ZmZlci5vZihzaWdoYXNoVHlwZSldKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcFNjcmlwdFNpZzogW1xuICAgICAgICB7XG4gICAgICAgICAgcHVia2V5LFxuICAgICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgICBsZWFmSGFzaCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGdldFRhcHJvb3RIYXNoRm9yU2lnKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWdoYXNoVHlwZXM/OiBudW1iZXJbXSxcbiAgICBsZWFmSGFzaD86IEJ1ZmZlclxuICApOiB7XG4gICAgaGFzaDogQnVmZmVyO1xuICAgIHNpZ2hhc2hUeXBlOiBudW1iZXI7XG4gIH0ge1xuICAgIGNvbnN0IHNpZ2hhc2hUeXBlID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XS5zaWdoYXNoVHlwZSB8fCBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQ7XG4gICAgaWYgKHNpZ2hhc2hUeXBlcyAmJiBzaWdoYXNoVHlwZXMuaW5kZXhPZihzaWdoYXNoVHlwZSkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTaWdoYXNoIHR5cGUgaXMgbm90IGFsbG93ZWQuIFJldHJ5IHRoZSBzaWduIG1ldGhvZCBwYXNzaW5nIHRoZSBgICtcbiAgICAgICAgICBgc2lnaGFzaFR5cGVzIGFycmF5IG9mIHdoaXRlbGlzdGVkIHR5cGVzLiBTaWdoYXNoIHR5cGU6ICR7c2lnaGFzaFR5cGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICBjb25zdCBwcmV2b3V0U2NyaXB0czogQnVmZmVyW10gPSBbXTtcbiAgICBjb25zdCBwcmV2b3V0VmFsdWVzOiBiaWdpbnRbXSA9IFtdO1xuXG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgbGV0IHByZXZvdXQ7XG4gICAgICBpZiAoaW5wdXQubm9uV2l0bmVzc1V0eG8pIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBjb3N0bHksIGVpdGhlciBjYWNoZSBpdCBoZXJlLCBvciBmaW5kIGEgd2F5IHRvIHNoYXJlIHdpdGggc3VwZXJcbiAgICAgICAgY29uc3Qgbm9uV2l0bmVzc1V0eG9UeCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVdHhvUHNidCkudHJhbnNhY3Rpb25Gcm9tQnVmZmVyKFxuICAgICAgICAgIGlucHV0Lm5vbldpdG5lc3NVdHhvLFxuICAgICAgICAgIHRoaXMudHgubmV0d29ya1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByZXZvdXRIYXNoID0gdHhJbnB1dHNbaV0uaGFzaDtcbiAgICAgICAgY29uc3QgdXR4b0hhc2ggPSBub25XaXRuZXNzVXR4b1R4LmdldEhhc2goKTtcblxuICAgICAgICAvLyBJZiBhIG5vbi13aXRuZXNzIFVUWE8gaXMgcHJvdmlkZWQsIGl0cyBoYXNoIG11c3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0XG4gICAgICAgIGlmICghcHJldm91dEhhc2guZXF1YWxzKHV0eG9IYXNoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9uLXdpdG5lc3MgVVRYTyBoYXNoIGZvciBpbnB1dCAjJHtpfSBkb2Vzbid0IG1hdGNoIHRoZSBoYXNoIHNwZWNpZmllZCBpbiB0aGUgcHJldm91dGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldm91dEluZGV4ID0gdHhJbnB1dHNbaV0uaW5kZXg7XG4gICAgICAgIHByZXZvdXQgPSBub25XaXRuZXNzVXR4b1R4Lm91dHNbcHJldm91dEluZGV4XTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgcHJldm91dCA9IGlucHV0LndpdG5lc3NVdHhvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGEgVXR4byBpbnB1dCBpdGVtIGZvciBzaWduaW5nJyk7XG4gICAgICB9XG4gICAgICBwcmV2b3V0U2NyaXB0cy5wdXNoKHByZXZvdXQuc2NyaXB0KTtcbiAgICAgIHByZXZvdXRWYWx1ZXMucHVzaChwcmV2b3V0LnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBoYXNoID0gdGhpcy50eC5oYXNoRm9yV2l0bmVzc1YxKGlucHV0SW5kZXgsIHByZXZvdXRTY3JpcHRzLCBwcmV2b3V0VmFsdWVzLCBzaWdoYXNoVHlwZSwgbGVhZkhhc2gpO1xuICAgIHJldHVybiB7IGhhc2gsIHNpZ2hhc2hUeXBlIH07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVucyB0cnVlIGlmZiB0aGUgaW5wdXQgaXMgdGFwcm9vdC5cbiAgICovXG4gIGlzVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBmdW5jdGlvbiBpc1AydHIob3V0cHV0OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHAydHJQYXltZW50cy5wMnRyKHsgb3V0cHV0IH0sIHsgZWNjTGliIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIShcbiAgICAgIGlucHV0LnRhcEludGVybmFsS2V5IHx8XG4gICAgICBpbnB1dC50YXBNZXJrbGVSb290IHx8XG4gICAgICAoaW5wdXQudGFwTGVhZlNjcmlwdCAmJiBpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCkgfHxcbiAgICAgIChpbnB1dC50YXBCaXAzMkRlcml2YXRpb24gJiYgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uLmxlbmd0aCkgfHxcbiAgICAgIChpbnB1dC53aXRuZXNzVXR4byAmJiBpc1AydHIoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGhhc2ggYW5kIGhhc2hUeXBlIGZvciB0YXByb290IGlucHV0IGF0IGlucHV0SW5kZXhcbiAgICogQHRocm93cyBlcnJvciBpZiBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIG5vdCBhIHRhcHJvb3QgaW5wdXRcbiAgICovXG4gIGdldFRhcHJvb3RIYXNoRm9yU2lnQ2hlY2tlZChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXSA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSxcbiAgICBsZWFmSGFzaD86IEJ1ZmZlclxuICApOiB7XG4gICAgaGFzaDogQnVmZmVyO1xuICAgIHNpZ2hhc2hUeXBlOiBudW1iZXI7XG4gIH0ge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2lucHV0SW5kZXh9IGlucHV0IGlzIG5vdCBhIHRhcHJvb3QgdHlwZSB0byB0YWtlIHRhcHJvb3QgdHggaGFzaGApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBzaWdoYXNoVHlwZXMsIGxlYWZIYXNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBwYWlyIHRvIFBTQlQgaW5wdXQuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXg6IG51bWJlciwga2V5VmFsdWVEYXRhOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZFVua25vd25LZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGtleTogZW5jb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWVEYXRhLmtleSksXG4gICAgICB2YWx1ZToga2V5VmFsdWVEYXRhLnZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNlYXJjaCBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBhZ2FpbnRzIGtleWRhdGEuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5U2VhcmNoPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YVtdIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKCFpbnB1dC51bmtub3duS2V5VmFscyB8fCBpbnB1dC51bmtub3duS2V5VmFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qga2V5VmFscyA9IGlucHV0LnVua25vd25LZXlWYWxzLm1hcCgoeyBrZXksIHZhbHVlIH0sIGkpID0+IHtcbiAgICAgIHJldHVybiB7IGtleTogZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5KSwgdmFsdWUgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ga2V5VmFscy5maWx0ZXIoKGtleVZhbCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAga2V5U2VhcmNoID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKGtleVNlYXJjaC5pZGVudGlmaWVyID09PSBrZXlWYWwua2V5LmlkZW50aWZpZXIgJiZcbiAgICAgICAgICBrZXlTZWFyY2guc3VidHlwZSA9PT0ga2V5VmFsLmtleS5zdWJ0eXBlICYmXG4gICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5U2VhcmNoLmtleWRhdGEpIHx8IGtleVNlYXJjaC5rZXlkYXRhLmVxdWFscyhrZXlWYWwua2V5LmtleWRhdGEpKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9uZSgpOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyB0aGlzO1xuICB9XG59XG4iXX0=