@bitgo-beta/utxo-lib 8.0.3-beta.9 → 8.0.3-beta.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +19 -16
  2. package/dist/src/bitgo/Musig2.d.ts +5 -10
  3. package/dist/src/bitgo/Musig2.d.ts.map +1 -1
  4. package/dist/src/bitgo/Musig2.js +26 -51
  5. package/dist/src/bitgo/PsbtUtil.d.ts +54 -0
  6. package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
  7. package/dist/src/bitgo/PsbtUtil.js +79 -0
  8. package/dist/src/bitgo/UtxoPsbt.d.ts +21 -37
  9. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  10. package/dist/src/bitgo/UtxoPsbt.js +138 -125
  11. package/dist/src/bitgo/index.d.ts +8 -0
  12. package/dist/src/bitgo/index.d.ts.map +1 -1
  13. package/dist/src/bitgo/index.js +2 -1
  14. package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
  15. package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
  16. package/dist/src/bitgo/legacysafe/index.js +57 -0
  17. package/dist/src/bitgo/parseInput.js +2 -2
  18. package/dist/src/bitgo/signature.d.ts +2 -2
  19. package/dist/src/bitgo/signature.d.ts.map +1 -1
  20. package/dist/src/bitgo/signature.js +8 -2
  21. package/dist/src/bitgo/transaction.d.ts +18 -3
  22. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  23. package/dist/src/bitgo/transaction.js +9 -7
  24. package/dist/src/bitgo/wallet/Psbt.d.ts +49 -10
  25. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  26. package/dist/src/bitgo/wallet/Psbt.js +159 -83
  27. package/dist/src/bitgo/wallet/Unspent.d.ts +26 -0
  28. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  29. package/dist/src/bitgo/wallet/Unspent.js +149 -60
  30. package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
  31. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
  32. package/dist/src/bitgo/wallet/WalletOutput.js +64 -23
  33. package/dist/src/bitgo/wallet/chains.d.ts +1 -1
  34. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  35. package/dist/src/bitgo/zcash/ZcashPsbt.js +4 -3
  36. package/dist/src/testutil/index.d.ts +1 -0
  37. package/dist/src/testutil/index.d.ts.map +1 -1
  38. package/dist/src/testutil/index.js +2 -1
  39. package/dist/src/testutil/mock.d.ts +1 -1
  40. package/dist/src/testutil/mock.d.ts.map +1 -1
  41. package/dist/src/testutil/mock.js +12 -4
  42. package/dist/src/testutil/psbt.d.ts +13 -4
  43. package/dist/src/testutil/psbt.d.ts.map +1 -1
  44. package/dist/src/testutil/psbt.js +10 -9
  45. package/dist/src/testutil/transaction.d.ts +17 -6
  46. package/dist/src/testutil/transaction.d.ts.map +1 -1
  47. package/dist/src/testutil/transaction.js +17 -10
  48. package/package.json +6 -6
@@ -1,20 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isPsbt = exports.getSignatureCount = exports.parsePsbtInput = exports.signWalletPsbt = exports.toWalletPsbt = void 0;
3
+ exports.extractP2msOnlyHalfSignedTx = exports.getSignatureValidationArrayPsbt = exports.addXpubsToPsbt = exports.isTransactionWithKeyPathSpendInput = exports.isTxInputArray = exports.isPsbtInputArray = exports.getStrictSignatureCounts = exports.getStrictSignatureCount = exports.parsePsbtInput = exports.getPsbtInputScriptType = exports.signWalletPsbt = exports.toWalletPsbt = void 0;
4
4
  const assert = require("assert");
5
+ const utils_1 = require("bip174/src/lib/utils");
6
+ const bs58check = require("bs58check");
5
7
  const UtxoPsbt_1 = require("../UtxoPsbt");
6
8
  const UtxoTransaction_1 = require("../UtxoTransaction");
7
9
  const outputScripts_1 = require("../outputScripts");
10
+ const WalletKeys_1 = require("./WalletKeys");
8
11
  const Unspent_1 = require("../Unspent");
9
12
  const transaction_1 = require("../transaction");
10
13
  const Unspent_2 = require("./Unspent");
11
- const utils_1 = require("bip174/src/lib/utils");
12
14
  const parseInput_1 = require("../parseInput");
13
15
  const Musig2_1 = require("../Musig2");
14
16
  const types_1 = require("../types");
15
17
  const taproot_1 = require("../../taproot");
16
18
  const bitcoinjs_lib_1 = require("bitcoinjs-lib");
17
19
  const index_1 = require("../../index");
20
+ const PsbtUtil_1 = require("../PsbtUtil");
18
21
  function getTaprootSigners(script, walletKeys) {
19
22
  const parsedPublicKeys = parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend').publicKeys;
20
23
  const walletSigners = parsedPublicKeys.map((publicKey) => {
@@ -27,14 +30,14 @@ function getTaprootSigners(script, walletKeys) {
27
30
  return [walletSigners[0], walletSigners[1]];
28
31
  }
29
32
  function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
30
- const signatureCount = psbt.getSignatureCount(inputIndex);
33
+ const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
34
+ const signatureCount = PsbtUtil_1.getPsbtInputSignatureCount(input);
31
35
  const scriptType = outputScripts_1.scriptTypeForChain(unspent.chain);
32
36
  if (signatureCount === 0 && scriptType === 'p2tr') {
33
37
  return;
34
38
  }
35
39
  const walletKeys = rootWalletKeys.deriveForChainAndIndex(unspent.chain, unspent.index);
36
40
  if (scriptType === 'p2tr') {
37
- const input = psbt.data.inputs[inputIndex];
38
41
  if (!Array.isArray(input.tapLeafScript) || input.tapLeafScript.length === 0) {
39
42
  throw new Error('Invalid PSBT state. Missing required fields.');
40
43
  }
@@ -113,7 +116,10 @@ function signWalletPsbt(psbt, inputIndex, signer, unspent) {
113
116
  }
114
117
  }
115
118
  exports.signWalletPsbt = signWalletPsbt;
116
- function getScriptType(input) {
119
+ /**
120
+ * @returns script type of the input
121
+ */
122
+ function getPsbtInputScriptType(input) {
117
123
  const isP2pk = (script) => {
118
124
  try {
119
125
  const chunks = bitcoinjs_lib_1.script.decompile(script);
@@ -151,10 +157,14 @@ function getScriptType(input) {
151
157
  }
152
158
  scriptType = 'taprootKeyPathSpend';
153
159
  }
154
- return scriptType;
160
+ if (scriptType) {
161
+ return scriptType;
162
+ }
163
+ throw new Error('could not parse input');
155
164
  }
156
- function parseTaprootKeyPathSignatures(psbt, inputIndex) {
157
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(psbt, inputIndex);
165
+ exports.getPsbtInputScriptType = getPsbtInputScriptType;
166
+ function parseTaprootKeyPathSignatures(input) {
167
+ const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(input);
158
168
  if (!partialSigs) {
159
169
  return { signatures: undefined, participantPublicKeys: undefined };
160
170
  }
@@ -174,10 +184,9 @@ function parsePartialOrTapScriptSignatures(sig) {
174
184
  const signatures = sig.map((tSig) => tSig.signature);
175
185
  return types_1.isTuple(signatures) ? { signatures } : { signatures: [signatures[0]] };
176
186
  }
177
- function parseSignatures(psbt, inputIndex, scriptType) {
178
- const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
187
+ function parseSignatures(input, scriptType) {
179
188
  return scriptType === 'taprootKeyPathSpend'
180
- ? parseTaprootKeyPathSignatures(psbt, inputIndex)
189
+ ? parseTaprootKeyPathSignatures(input)
181
190
  : scriptType === 'taprootScriptPathSpend'
182
191
  ? parsePartialOrTapScriptSignatures(input.tapScriptSig)
183
192
  : parsePartialOrTapScriptSignatures(input.partialSig);
@@ -207,10 +216,26 @@ function parseScript(input, scriptType) {
207
216
  }
208
217
  return parseInput_1.parsePubScript(pubScript, scriptType);
209
218
  }
210
- function parseInputMetadata(psbt, inputIndex, scriptType) {
211
- const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
219
+ /**
220
+ * @return psbt metadata are parsed as per below conditions.
221
+ * redeemScript/witnessScript/tapLeafScript matches BitGo.
222
+ * signature and public key count matches BitGo.
223
+ * P2SH-P2PK => scriptType, redeemScript, public key, signature.
224
+ * P2SH => scriptType, redeemScript, public keys, signatures.
225
+ * PW2SH => scriptType, witnessScript, public keys, signatures.
226
+ * P2SH-PW2SH => scriptType, redeemScript, witnessScript, public keys, signatures.
227
+ * P2TR and P2TR MUSIG2 script path => scriptType (taprootScriptPathSpend), pubScript (leaf script), controlBlock,
228
+ * scriptPathLevel, leafVersion, public keys, signatures.
229
+ * P2TR MUSIG2 kep path => scriptType (taprootKeyPathSpend), pubScript (scriptPubKey), participant pub keys (signer),
230
+ * public key (tapOutputkey), signatures (partial signer sigs).
231
+ */
232
+ function parsePsbtInput(input) {
233
+ if (PsbtUtil_1.isPsbtInputFinalized(input)) {
234
+ throw new Error('Finalized PSBT parsing is not supported');
235
+ }
236
+ const scriptType = getPsbtInputScriptType(input);
212
237
  const parsedPubScript = parseScript(input, scriptType);
213
- const signatures = parseSignatures(psbt, inputIndex, scriptType);
238
+ const signatures = parseSignatures(input, scriptType);
214
239
  if (parsedPubScript.scriptType === 'taprootKeyPathSpend' && 'participantPublicKeys' in signatures) {
215
240
  return {
216
241
  ...parsedPubScript,
@@ -254,89 +279,140 @@ function parseInputMetadata(psbt, inputIndex, scriptType) {
254
279
  }
255
280
  throw new Error('invalid pub script');
256
281
  }
282
+ exports.parsePsbtInput = parsePsbtInput;
257
283
  /**
258
- * @return psbt metadata are parsed as per below conditions.
259
- * redeemScript/witnessScript/tapLeafScript matches BitGo.
260
- * signature and public key count matches BitGo.
261
- * P2SH-P2PK => scriptType, redeemScript, public key, signature.
262
- * P2SH => scriptType, redeemScript, public keys, signatures.
263
- * PW2SH => scriptType, witnessScript, public keys, signatures.
264
- * P2SH-PW2SH => scriptType, redeemScript, witnessScript, public keys, signatures.
265
- * P2TR and P2TR MUSIG2 script path => scriptType (taprootScriptPathSpend), pubScript (leaf script), controlBlock,
266
- * scriptPathLevel, leafVersion, public keys, signatures.
267
- * P2TR MUSIG2 kep path => scriptType (taprootKeyPathSpend), pubScript (scriptPubKey), participant pub keys (signer),
268
- * public key (tapOutputkey), signatures (partial signer sigs).
269
- * Any unsigned PSBT and without required metadata is returned with undefined.
284
+ * @returns strictly parse the input and get signature count.
285
+ * unsigned(0), half-signed(1) or fully-signed(2)
270
286
  */
271
- function parsePsbtInput(psbt, inputIndex) {
272
- const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
273
- if (psbt.isInputFinalized(inputIndex)) {
274
- throw new Error('Finalized PSBT parsing is not supported');
275
- }
276
- const scriptType = getScriptType(input);
277
- if (!scriptType) {
278
- if (psbt.getSignatureCount(inputIndex) > 0) {
279
- throw new Error('Invalid PSBT state. Signatures found without scripts.');
280
- }
281
- return undefined;
282
- }
283
- return parseInputMetadata(psbt, inputIndex, scriptType);
284
- }
285
- exports.parsePsbtInput = parsePsbtInput;
286
- function parseSignatureCount(signatures) {
287
- const count = signatures ? signatures.filter((s) => !parseInput_1.isPlaceholderSignature(s)).length : 0;
288
- if (count === 0 || count === 1 || count === 2) {
289
- return count;
290
- }
291
- throw new Error('invalid signature count');
292
- }
293
- function getInputSignatureCount(param) {
287
+ function getStrictSignatureCount(input) {
294
288
  var _a, _b;
295
- if ('psbt' in param) {
296
- const parsedInput = parsePsbtInput(param.psbt, param.inputIndex);
297
- assert(parsedInput, 'invalid psbt input');
298
- return parseSignatureCount(parsedInput.signatures);
299
- }
300
- else {
301
- if (((_a = param.script) === null || _a === void 0 ? void 0 : _a.length) || ((_b = param.witness) === null || _b === void 0 ? void 0 : _b.length)) {
302
- const parsedInput = parseInput_1.parseSignatureScript(param);
303
- return parsedInput.scriptType === 'taprootKeyPathSpend' ? 2 : parseSignatureCount(parsedInput.signatures);
289
+ const calculateSignatureCount = (signatures) => {
290
+ const count = signatures ? signatures.filter((s) => !parseInput_1.isPlaceholderSignature(s)).length : 0;
291
+ if (count === 0 || count === 1 || count === 2) {
292
+ return count;
293
+ }
294
+ throw new Error('invalid signature count');
295
+ };
296
+ if ('hash' in input) {
297
+ if (((_a = input.script) === null || _a === void 0 ? void 0 : _a.length) || ((_b = input.witness) === null || _b === void 0 ? void 0 : _b.length)) {
298
+ const parsedInput = parseInput_1.parseSignatureScript(input);
299
+ return parsedInput.scriptType === 'taprootKeyPathSpend' ? 2 : calculateSignatureCount(parsedInput.signatures);
304
300
  }
305
301
  return 0;
306
302
  }
303
+ else {
304
+ return calculateSignatureCount(parsePsbtInput(input).signatures);
305
+ }
307
306
  }
307
+ exports.getStrictSignatureCount = getStrictSignatureCount;
308
308
  /**
309
- * @returns maximum number of signatures across all inputs - 0, 1 and 2.
310
- * It can be used to check given psbt/transaction/array of TxInputs is unsigned(0), half-signed(1) or fully-signed(2).
309
+ * @returns strictly parse input and get signature count for all inputs.
310
+ * 0=unsigned, 1=half-signed or 2=fully-signed
311
311
  */
312
- function getSignatureCount(tx, inputIndex) {
313
- const constructParam = (tx, inputIndex) => {
314
- return tx instanceof UtxoPsbt_1.UtxoPsbt
315
- ? { psbt: tx, inputIndex }
316
- : (tx instanceof UtxoTransaction_1.UtxoTransaction ? tx.ins : tx)[inputIndex];
317
- };
312
+ function getStrictSignatureCounts(tx) {
318
313
  const inputs = tx instanceof UtxoPsbt_1.UtxoPsbt ? tx.data.inputs : tx instanceof UtxoTransaction_1.UtxoTransaction ? tx.ins : tx;
319
- assert(inputIndex === undefined || (inputIndex >= 0 && inputIndex < inputs.length), 'invalid inputIndex range');
320
- const indices = inputIndex === undefined ? inputs.map((_, index) => index) : [inputIndex];
321
- return indices
322
- .map((index, _) => getInputSignatureCount(constructParam(tx, index)))
323
- .reduce((prev, curr) => (curr > prev ? curr : prev), 0);
314
+ return inputs.map((input, _) => getStrictSignatureCount(input));
324
315
  }
325
- exports.getSignatureCount = getSignatureCount;
316
+ exports.getStrictSignatureCounts = getStrictSignatureCounts;
326
317
  /**
327
- * @return true iff data starts with magic PSBT byte sequence
328
- * @param data byte array or hex string
318
+ * @return true iff inputs array is of PsbtInputType type
329
319
  * */
330
- function isPsbt(data) {
331
- // https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#specification
332
- // 0x70736274 - ASCII for 'psbt'. 0xff - separator
333
- if (typeof data === 'string') {
334
- if (data.length < 10) {
320
+ function isPsbtInputArray(inputs) {
321
+ return !isTxInputArray(inputs);
322
+ }
323
+ exports.isPsbtInputArray = isPsbtInputArray;
324
+ /**
325
+ * @return true iff inputs array is of TxInput type
326
+ * */
327
+ function isTxInputArray(inputs) {
328
+ assert(!!inputs.length, 'empty inputs array');
329
+ return 'hash' in inputs[0];
330
+ }
331
+ exports.isTxInputArray = isTxInputArray;
332
+ /**
333
+ * @returns true iff given psbt/transaction/tx-input-array/psbt-input-array contains at least one taproot key path spend input
334
+ */
335
+ function isTransactionWithKeyPathSpendInput(data) {
336
+ const inputs = data instanceof UtxoPsbt_1.UtxoPsbt ? data.data.inputs : data instanceof UtxoTransaction_1.UtxoTransaction ? data.ins : data;
337
+ if (!inputs.length) {
338
+ return false;
339
+ }
340
+ if (isPsbtInputArray(inputs)) {
341
+ return inputs.some((input, _) => getPsbtInputScriptType(input) === 'taprootKeyPathSpend');
342
+ }
343
+ return inputs.some((input, _) => {
344
+ // If the input is not signed, it cannot be a taprootKeyPathSpend input because you can only
345
+ // extract a fully signed psbt into a transaction with taprootKeyPathSpend inputs.
346
+ if (getStrictSignatureCount(input) === 0) {
335
347
  return false;
336
348
  }
337
- data = Buffer.from(data.slice(0, 10), 'hex');
349
+ return parseInput_1.parseSignatureScript(input).scriptType === 'taprootKeyPathSpend';
350
+ });
351
+ }
352
+ exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
353
+ /**
354
+ * Set the RootWalletKeys as the globalXpubs on the psbt
355
+ *
356
+ * We do all the matching of the (tap)bip32Derivations masterFingerprint to the fingerprint of the
357
+ * extendedPubkey.
358
+ */
359
+ function addXpubsToPsbt(psbt, rootWalletKeys) {
360
+ const safeRootWalletKeys = new WalletKeys_1.RootWalletKeys(rootWalletKeys.triple.map((bip32) => bip32.neutered()), rootWalletKeys.derivationPrefixes);
361
+ const xPubs = safeRootWalletKeys.triple.map((bip32) => ({
362
+ extendedPubkey: bs58check.decode(bip32.toBase58()),
363
+ masterFingerprint: bip32.fingerprint,
364
+ // TODO: BG-73797 - bip174 currently requires m prefix for this to be a valid globalXpub
365
+ path: 'm',
366
+ }));
367
+ psbt.updateGlobal({ globalXpub: xPubs });
368
+ }
369
+ exports.addXpubsToPsbt = addXpubsToPsbt;
370
+ /**
371
+ * validates signatures for each 2 of 3 input against user, backup, bitgo keys derived from rootWalletKeys.
372
+ * @returns array of input index and its [is valid user sig exist, is valid backup sig exist, is valid user bitgo exist]
373
+ * For p2shP2pk input, [false, false, false] is returned since it is not a 2 of 3 sig input.
374
+ */
375
+ function getSignatureValidationArrayPsbt(psbt, rootWalletKeys) {
376
+ return psbt.data.inputs.map((input, i) => {
377
+ const sigValArrayForInput = getPsbtInputScriptType(input) === 'p2shP2pk'
378
+ ? [false, false, false]
379
+ : psbt.getSignatureValidationArray(i, { rootNodes: rootWalletKeys.triple });
380
+ return [i, sigValArrayForInput];
381
+ });
382
+ }
383
+ exports.getSignatureValidationArrayPsbt = getSignatureValidationArrayPsbt;
384
+ /**
385
+ * Extracts the half signed transaction from the psbt for p2ms based script types - p2sh, p2wsh, and p2shP2wsh.
386
+ * The purpose is to provide backward compatibility to keyternal (KRS) that only supports network transaction and p2ms script types.
387
+ */
388
+ function extractP2msOnlyHalfSignedTx(psbt) {
389
+ assert(!!(psbt.data.inputs.length && psbt.data.outputs.length), 'empty inputs or outputs');
390
+ const tx = psbt.getUnsignedTx();
391
+ function isP2msParsedPsbtInput(parsed) {
392
+ return ['p2sh', 'p2shP2wsh', 'p2wsh'].includes(parsed.scriptType);
338
393
  }
339
- return 5 <= data.length && data.readUInt32BE(0) === 0x70736274 && data.readUInt8(4) === 0xff;
394
+ psbt.data.inputs.forEach((input, i) => {
395
+ var _a, _b;
396
+ const parsed = parsePsbtInput(input);
397
+ assert(isP2msParsedPsbtInput(parsed), `unsupported script type ${parsed.scriptType}`);
398
+ assert(((_a = input.partialSig) === null || _a === void 0 ? void 0 : _a.length) === 1, `unexpected signature count ${(_b = input.partialSig) === null || _b === void 0 ? void 0 : _b.length}`);
399
+ const [partialSig] = input.partialSig;
400
+ assert(input.sighashType !== undefined && input.sighashType === bitcoinjs_lib_1.script.signature.decode(partialSig.signature).hashType, 'signature sighash does not match input sighash type');
401
+ // type casting is to address the invalid type checking in payments.p2ms
402
+ const signatures = parsed.publicKeys.map((pk) => partialSig.pubkey.equals(pk) ? partialSig.signature : bitcoinjs_lib_1.opcodes.OP_0);
403
+ const isP2SH = !!parsed.redeemScript;
404
+ const isP2WSH = !!parsed.witnessScript;
405
+ const payment = index_1.payments.p2ms({ output: parsed.pubScript, signatures }, { validate: false, allowIncomplete: true });
406
+ const p2wsh = isP2WSH ? index_1.payments.p2wsh({ redeem: payment }) : undefined;
407
+ const p2sh = isP2SH ? index_1.payments.p2sh({ redeem: p2wsh || payment }) : undefined;
408
+ if (p2sh === null || p2sh === void 0 ? void 0 : p2sh.input) {
409
+ tx.setInputScript(i, p2sh.input);
410
+ }
411
+ if (p2wsh === null || p2wsh === void 0 ? void 0 : p2wsh.witness) {
412
+ tx.setWitness(i, p2wsh.witness);
413
+ }
414
+ });
415
+ return tx;
340
416
  }
341
- exports.isPsbt = isPsbt;
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFDakMsMENBQXVDO0FBQ3ZDLHdEQUFxRDtBQUNyRCxvREFBNkc7QUFFN0csd0NBQW9EO0FBQ3BELGdEQUEyRDtBQUUzRCx1Q0FBMkQ7QUFDM0QsZ0RBQXFEO0FBRXJELDhDQWN1QjtBQUN2QixzQ0FBdUQ7QUFDdkQsb0NBQW1DO0FBQ25DLDJDQUEwRDtBQUMxRCxpREFBMkQ7QUFDM0QsdUNBQXNDO0FBZ0V0QyxTQUFTLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxVQUE2QjtJQUN0RSxNQUFNLGdCQUFnQixHQUFHLCtCQUFrQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN6RixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQ2hFLGdDQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDcEQsQ0FBQztRQUNGLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMxRjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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c3NlcnQnO1xuaW1wb3J0IHsgVXR4b1BzYnQgfSBmcm9tICcuLi9VdHhvUHNidCc7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMywgZ2V0TGVhZkhhc2gsIHNjcmlwdFR5cGVGb3JDaGFpbiwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4uL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgRGVyaXZlZFdhbGxldEtleXMsIFJvb3RXYWxsZXRLZXlzIH0gZnJvbSAnLi9XYWxsZXRLZXlzJztcbmltcG9ydCB7IHRvUHJldk91dHB1dFdpdGhQcmV2VHggfSBmcm9tICcuLi9VbnNwZW50JztcbmltcG9ydCB7IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCB7IGlzV2FsbGV0VW5zcGVudCwgV2FsbGV0VW5zcGVudCB9IGZyb20gJy4vVW5zcGVudCc7XG5pbXBvcnQgeyBjaGVja0ZvcklucHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgUGFydGlhbFNpZywgUHNidElucHV0LCBUYXBTY3JpcHRTaWcgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGdldExlYWZWZXJzaW9uLFxuICBjYWxjdWxhdGVTY3JpcHRQYXRoTGV2ZWwsXG4gIGlzVmFsaWRDb250cm9sQm9jayxcbiAgUGFyc2VkUHViU2NyaXB0UDJtcyxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdFNjcmlwdFBhdGgsXG4gIHBhcnNlUHViU2NyaXB0Mk9mMyxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdCxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdEtleVBhdGgsXG4gIHBhcnNlUHViU2NyaXB0LFxuICBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayxcbiAgUGFyc2VkU2NyaXB0VHlwZSxcbiAgaXNQbGFjZWhvbGRlclNpZ25hdHVyZSxcbiAgcGFyc2VTaWduYXR1cmVTY3JpcHQsXG59IGZyb20gJy4uL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHsgcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MgfSBmcm9tICcuLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUdXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi90YXByb290JztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0LCBUeElucHV0IH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBvcGNvZGVzIH0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuXG4vLyBvbmx5IHVzZWQgZm9yIGJ1aWxkaW5nIGBTaWduYXR1cmVDb250YWluZXJgXG50eXBlIEJhc2VTaWduYXR1cmVDb250YWluZXI8VD4gPSB7XG4gIHNpZ25hdHVyZXM6IFQ7XG59O1xuXG50eXBlIFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjx1bmRlZmluZWQ+O1xudHlwZSBIYWxmU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyXT47XG50eXBlIEZ1bGxTaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXIsIEJ1ZmZlcl0+O1xuXG50eXBlIFNpZ25hdHVyZUNvbnRhaW5lciA9IFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgSGFsZlNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEZ1bGxTaWduZWRTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYSBwcmUtZmluYWxpemVkIFBTQlQgSW5wdXQgZm9yIHAydHJNdXNpZzIga2V5IHBhdGggaW4gdGhlIG5vbi1maW5hbGl6ZWQgc3RhdGUuXG4gKiBUIGlzIFtCdWZmZXJdIGZvciBmaXJzdCBzaWduYXR1cmUsIFtCdWZmZXIsIEJ1ZmZlcl0gZm9yIGJvdGggc2lnbmF0dXJlcyBhbmQgYHVuZGVmaW5lZGAgZm9yIG5vIHNpZ25hdHVyZXMuXG4gKi9cbnR5cGUgQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPFQ+ID0ge1xuICBzaWduYXR1cmVzOiBUO1xuICAvKiogT25seSBjb250YWlucyBwYXJ0aWNpcGFudHMgdGhhdCBoYXZlIGFkZGVkIGEgc2lnbmF0dXJlICovXG4gIHBhcnRpY2lwYW50UHVibGljS2V5czogVDtcbn07XG5cbnR5cGUgVW5zaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjx1bmRlZmluZWQ+O1xudHlwZSBIYWxmU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlcl0+O1xudHlwZSBGdWxsU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlciwgQnVmZmVyXT47XG5cbnR5cGUgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPVxuICB8IFVuc2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXJcbiAgfCBIYWxmU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXJcbiAgfCBGdWxsU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBwMm1zIGJhc2VkIHNjcmlwdCB0eXBlcyAtIHAyc2gsIHAyd3NoLCBhbmQgcDJzaFAyd3NoXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRQMm1zID0gUGFyc2VkUHViU2NyaXB0UDJtcyAmIFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIFRhcHJvb3RLZXlQYXRoU3BlbmQgc2NyaXB0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRUYXByb290S2V5UGF0aCA9IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RLZXlQYXRoICYgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBUYXByb290U2NyaXB0UGF0aFNwZW5kIHNjcmlwdCBwYXRoIHNjcmlwdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0VGFwcm9vdFNjcmlwdFBhdGggPSBQYXJzZWRQdWJTY3JpcHRUYXByb290U2NyaXB0UGF0aCAmXG4gIFNpZ25hdHVyZUNvbnRhaW5lciAmIHtcbiAgICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgICBsZWFmVmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKiBJbmRpY2F0ZXMgdGhlIGxldmVsIGluc2lkZSB0aGUgdGFwdHJlZS4gKi9cbiAgICBzY3JpcHRQYXRoTGV2ZWw6IG51bWJlcjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFRhcHJvb3QgPSBQYXJzZWRQc2J0VGFwcm9vdEtleVBhdGggfCBQYXJzZWRQc2J0VGFwcm9vdFNjcmlwdFBhdGg7XG5cbnR5cGUgUDJzaFAycGtTaWduYXR1cmVDb250YWluZXIgPSBVbnNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEhhbGZTaWduZWRTaWduYXR1cmVDb250YWluZXI7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRQMnNoUDJwayA9IFBhcnNlZFB1YlNjcmlwdFAyc2hQMnBrICYgUDJzaFAycGtTaWduYXR1cmVDb250YWluZXI7XG5cbmludGVyZmFjZSBXYWxsZXRTaWduZXIge1xuICB3YWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlO1xuICByb290S2V5OiBCSVAzMkludGVyZmFjZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFwcm9vdFNpZ25lcnMoc2NyaXB0OiBCdWZmZXIsIHdhbGxldEtleXM6IERlcml2ZWRXYWxsZXRLZXlzKTogW1dhbGxldFNpZ25lciwgV2FsbGV0U2lnbmVyXSB7XG4gIGNvbnN0IHBhcnNlZFB1YmxpY0tleXMgPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gIGNvbnN0IHdhbGxldFNpZ25lcnMgPSBwYXJzZWRQdWJsaWNLZXlzLm1hcCgocHVibGljS2V5KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSB3YWxsZXRLZXlzLnB1YmxpY0tleXMuZmluZEluZGV4KCh3YWxsZXRQdWJsaWNLZXkpID0+XG4gICAgICB0b1hPbmx5UHVibGljS2V5KHdhbGxldFB1YmxpY0tleSkuZXF1YWxzKHB1YmxpY0tleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4geyB3YWxsZXRLZXk6IHdhbGxldEtleXMudHJpcGxlW2luZGV4XSwgcm9vdEtleTogd2FsbGV0S2V5cy5wYXJlbnQudHJpcGxlW2luZGV4XSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcHJvb3QgcHVibGljIGtleSBpcyBub3QgYSB3YWxsZXQgcHVibGljIGtleScpO1xuICB9KTtcbiAgcmV0dXJuIFt3YWxsZXRTaWduZXJzWzBdLCB3YWxsZXRTaWduZXJzWzFdXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHNidElucHV0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD4sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5c1xuKTogdm9pZCB7XG4gIGNvbnN0IHNpZ25hdHVyZUNvdW50ID0gcHNidC5nZXRTaWduYXR1cmVDb3VudChpbnB1dEluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50LmNoYWluKTtcbiAgaWYgKHNpZ25hdHVyZUNvdW50ID09PSAwICYmIHNjcmlwdFR5cGUgPT09ICdwMnRyJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcblxuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpIHx8IGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCBzdGF0ZS4gTWlzc2luZyByZXF1aXJlZCBmaWVsZHMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbc2lnbmVyLCBjb3NpZ25lcl0gPSBnZXRUYXByb290U2lnbmVycyhpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCwgd2FsbGV0S2V5cyk7XG5cbiAgICBjb25zdCBsZWFmSGFzaCA9IGdldExlYWZIYXNoKHtcbiAgICAgIHB1YmxpY0tleXM6IHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICAgIHNpZ25lcjogc2lnbmVyLndhbGxldEtleS5wdWJsaWNLZXksXG4gICAgICBjb3NpZ25lcjogY29zaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKCh3YWxsZXRTaWduZXIpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtsZWFmSGFzaF0sXG4gICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRTaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHdhbGxldFNpZ25lci5yb290S2V5LCB1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHdhbGxldFNpZ25lci5yb290S2V5LmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChzaWduYXR1cmVDb3VudCA9PT0gMCkge1xuICAgICAgY29uc3QgeyB3aXRuZXNzU2NyaXB0LCByZWRlZW1TY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKTtcbiAgICAgIGlmICh3aXRuZXNzU2NyaXB0ICYmIHBzYnQuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0ud2l0bmVzc1NjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzU2NyaXB0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZGVlbVNjcmlwdCAmJiBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnJlZGVlbVNjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBiaXAzMkRlcml2YXRpb246IFswLCAxLCAyXS5tYXAoKGlkeCkgPT4gKHtcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXlzLnRyaXBsZVtpZHhdLnB1YmxpY0tleSxcbiAgICAgICAgcGF0aDogd2FsbGV0S2V5cy5wYXRoc1tpZHhdLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXMudHJpcGxlW2lkeF0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJuIFBTQlQgZmlsbGVkIHdpdGggbWV0YXRkYXRhIGFzIHBlciBpbnB1dCBwYXJhbXMgdHgsIHVuc3BlbnRzIGFuZCByb290V2FsbGV0S2V5cy5cbiAqIFVuc2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4b1xuICogVW5zaWduZWQgUFNCVCBmb3Igb3RoZXIgaW5wdXQgd2l0aCB3aXRuZXNzVXR4by9ub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQsIGJpcDMyRGVyaXZhdGlvblxuICogU2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4bywgdGFwTGVhZlNjcmlwdCwgdGFwQmlwMzJEZXJpdmF0aW9uLCB0YXBTY3JpcHRTaWdcbiAqIFNpZ25lZCBQU0JUIGZvciBvdGhlciBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvL25vbldpdG5lc3NVdHhvLCByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdCwgYmlwMzJEZXJpdmF0aW9uLCBwYXJ0aWFsU2lnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dhbGxldFBzYnQoXG4gIHR4OiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IFV0eG9Qc2J0IHtcbiAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoKHUpID0+IHtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoc2NyaXB0VHlwZUZvckNoYWluKHUuY2hhaW4pLCAncDJ0ck11c2lnMicpO1xuICAgIHJldHVybiB0b1ByZXZPdXRwdXRXaXRoUHJldlR4KHUsIHR4Lm5ldHdvcmspO1xuICB9KTtcbiAgY29uc3QgcHNidCA9IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24odHgsIHByZXZPdXRwdXRzKTtcbiAgdW5zcGVudHMuZm9yRWFjaCgodSwgaSkgPT4ge1xuICAgIGlmIChpc1dhbGxldFVuc3BlbnQodSkgJiYgdS5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVQc2J0SW5wdXQocHNidCwgaSwgdSwgcm9vdFdhbGxldEtleXMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHNpZ25lclxuICogQHBhcmFtIHVuc3BlbnRcbiAqIEByZXR1cm4gc2lnbmVkIFBTQlQgd2l0aCBzaWduZXIncyBrZXkgZm9yIHVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25XYWxsZXRQc2J0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD5cbik6IHZvaWQge1xuICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnQuY2hhaW4pO1xuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInIHx8IHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIHBzYnQuc2lnblRhcHJvb3RJbnB1dEhEKGlucHV0SW5kZXgsIHNpZ25lcik7XG4gIH0gZWxzZSB7XG4gICAgcHNidC5zaWduSW5wdXRIRChpbnB1dEluZGV4LCBzaWduZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFR5cGUoaW5wdXQ6IFBzYnRJbnB1dCk6IFBhcnNlZFNjcmlwdFR5cGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBpc1AycGsgPSAoc2NyaXB0OiBCdWZmZXIpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2h1bmtzID0gYnNjcmlwdC5kZWNvbXBpbGUoc2NyaXB0KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNodW5rcz8ubGVuZ3RoID09PSAyICYmXG4gICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihjaHVua3NbMF0pICYmXG4gICAgICAgIGJzY3JpcHQuaXNDYW5vbmljYWxQdWJLZXkoY2h1bmtzWzBdKSAmJlxuICAgICAgICBjaHVua3NbMV0gPT09IG9wY29kZXMuT1BfQ0hFQ0tTSUdcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgbGV0IHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGUgfCB1bmRlZmluZWQ7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQucmVkZWVtU2NyaXB0KSAmJiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQud2l0bmVzc1NjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gJ3Ayc2hQMndzaCc7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gaXNQMnBrKGlucHV0LnJlZGVlbVNjcmlwdCkgPyAncDJzaFAycGsnIDogJ3Ayc2gnO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC53aXRuZXNzU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSAncDJ3c2gnO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpICYmIGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMCkge1xuICAgIGlmIChzY3JpcHRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGJvdGggJHtzY3JpcHRUeXBlfSBhbmQgdGFwcm9vdFNjcmlwdFBhdGggUFNCVCBtZXRhZGF0YS5gKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQuJyk7XG4gICAgfVxuICAgIHNjcmlwdFR5cGUgPSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCc7XG4gIH1cbiAgaWYgKGlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgYm90aCAke3NjcmlwdFR5cGV9IGFuZCB0YXByb290S2V5UGF0aCBQU0JUIG1ldGFkYXRhLmApO1xuICAgIH1cbiAgICBzY3JpcHRUeXBlID0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuICB9XG4gIHJldHVybiBzY3JpcHRUeXBlO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhwc2J0OiBVdHhvUHNidCwgaW5wdXRJbmRleDogbnVtYmVyKTogVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIge1xuICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKHBzYnQsIGlucHV0SW5kZXgpO1xuICBpZiAoIXBhcnRpYWxTaWdzKSB7XG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlczogdW5kZWZpbmVkLCBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IHVuZGVmaW5lZCB9O1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBwYXJ0aWFsU2lncy5tYXAoKHBTaWcpID0+IHBTaWcucGFydGlhbFNpZyk7XG4gIGNvbnN0IHBhcnRpY2lwYW50UHVibGljS2V5cyA9IHBhcnRpYWxTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWNpcGFudFB1YktleSk7XG4gIHJldHVybiBpc1R1cGxlPEJ1ZmZlcj4oc2lnbmF0dXJlcykgJiYgaXNUdXBsZTxCdWZmZXI+KHBhcnRpY2lwYW50UHVibGljS2V5cylcbiAgICA/IHsgc2lnbmF0dXJlcywgcGFydGljaXBhbnRQdWJsaWNLZXlzIH1cbiAgICA6IHsgc2lnbmF0dXJlczogW3NpZ25hdHVyZXNbMF1dLCBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IFtwYXJ0aWNpcGFudFB1YmxpY0tleXNbMF1dIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFydGlhbE9yVGFwU2NyaXB0U2lnbmF0dXJlcyhzaWc6IFBhcnRpYWxTaWdbXSB8IFRhcFNjcmlwdFNpZ1tdIHwgdW5kZWZpbmVkKTogU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgaWYgKCFzaWc/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7IHNpZ25hdHVyZXM6IHVuZGVmaW5lZCB9O1xuICB9XG4gIGlmIChzaWcubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBzaWduYXR1cmUgY291bnQnKTtcbiAgfVxuICBjb25zdCBzaWduYXR1cmVzID0gc2lnLm1hcCgodFNpZykgPT4gdFNpZy5zaWduYXR1cmUpO1xuICByZXR1cm4gaXNUdXBsZTxCdWZmZXI+KHNpZ25hdHVyZXMpID8geyBzaWduYXR1cmVzIH0gOiB7IHNpZ25hdHVyZXM6IFtzaWduYXR1cmVzWzBdXSB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNpZ25hdHVyZXMoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFNpZ25hdHVyZUNvbnRhaW5lciB8IFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICByZXR1cm4gc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXG4gICAgPyBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhwc2J0LCBpbnB1dEluZGV4KVxuICAgIDogc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnXG4gICAgPyBwYXJzZVBhcnRpYWxPclRhcFNjcmlwdFNpZ25hdHVyZXMoaW5wdXQudGFwU2NyaXB0U2lnKVxuICAgIDogcGFyc2VQYXJ0aWFsT3JUYXBTY3JpcHRTaWduYXR1cmVzKGlucHV0LnBhcnRpYWxTaWcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNjcmlwdChcbiAgaW5wdXQ6IFBzYnRJbnB1dCxcbiAgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZVxuKTogUGFyc2VkUHViU2NyaXB0UDJtcyB8IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3QgfCBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayB7XG4gIGxldCBwdWJTY3JpcHQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fCBzY3JpcHRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgcHViU2NyaXB0ID0gaW5wdXQucmVkZWVtU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICdwMndzaCcgfHwgc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICBwdWJTY3JpcHQgPSBpbnB1dC53aXRuZXNzU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIHB1YlNjcmlwdCA9IGlucHV0LnRhcExlYWZTY3JpcHQgPyBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBpZiAoaW5wdXQud2l0bmVzc1V0eG8/LnNjcmlwdCkge1xuICAgICAgcHViU2NyaXB0ID0gaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0O1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkgJiYgaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcHViU2NyaXB0ID0gY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7IGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSwgdGFwdHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QgfSk7XG4gICAgfVxuICB9XG4gIGlmICghcHViU2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTQlQgc3RhdGUgZm9yICR7c2NyaXB0VHlwZX0uIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLmApO1xuICB9XG4gIHJldHVybiBwYXJzZVB1YlNjcmlwdChwdWJTY3JpcHQsIHNjcmlwdFR5cGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUlucHV0TWV0YWRhdGEoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFBhcnNlZFBzYnRQMm1zIHwgUGFyc2VkUHNidFRhcHJvb3QgfCBQYXJzZWRQc2J0UDJzaFAycGsge1xuICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQocHNidC5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gIGNvbnN0IHBhcnNlZFB1YlNjcmlwdCA9IHBhcnNlU2NyaXB0KGlucHV0LCBzY3JpcHRUeXBlKTtcbiAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnNlU2lnbmF0dXJlcyhwc2J0LCBpbnB1dEluZGV4LCBzY3JpcHRUeXBlKTtcblxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyAmJiAncGFydGljaXBhbnRQdWJsaWNLZXlzJyBpbiBzaWduYXR1cmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIC4uLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIGlmICghaW5wdXQudGFwTGVhZlNjcmlwdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgc3RhdGUgZm9yIHRhcHJvb3RTY3JpcHRQYXRoU3BlbmQuIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLicpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sQmxvY2sgPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLmNvbnRyb2xCbG9jaztcbiAgICBpZiAoIWlzVmFsaWRDb250cm9sQm9jayhjb250cm9sQmxvY2spKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCB0YXByb290U2NyaXB0UGF0aFNwZW5kIGNvbnRyb2xCbG9jay4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2NyaXB0UGF0aExldmVsID0gY2FsY3VsYXRlU2NyaXB0UGF0aExldmVsKGNvbnRyb2xCbG9jayk7XG4gICAgY29uc3QgbGVhZlZlcnNpb24gPSBnZXRMZWFmVmVyc2lvbihjb250cm9sQmxvY2spO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgc2NyaXB0UGF0aExldmVsLFxuICAgICAgbGVhZlZlcnNpb24sXG4gICAgfTtcbiAgfVxuICBpZiAoXG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fFxuICAgIHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJ3c2gnIHx8XG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3c2gnXG4gICkge1xuICAgIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIHBhcnNlZFB1YlNjcmlwdC5yZWRlZW1TY3JpcHQgPSBpbnB1dC5yZWRlZW1TY3JpcHQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgIH07XG4gIH1cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaFAycGsnICYmICghc2lnbmF0dXJlcy5zaWduYXR1cmVzIHx8ICFpc1R1cGxlKHNpZ25hdHVyZXMuc2lnbmF0dXJlcykpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIHNpZ25hdHVyZXM6IHNpZ25hdHVyZXMuc2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwdWIgc2NyaXB0Jyk7XG59XG5cbi8qKlxuICogQHJldHVybiBwc2J0IG1ldGFkYXRhIGFyZSBwYXJzZWQgYXMgcGVyIGJlbG93IGNvbmRpdGlvbnMuXG4gKiByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdC90YXBMZWFmU2NyaXB0IG1hdGNoZXMgQml0R28uXG4gKiBzaWduYXR1cmUgYW5kIHB1YmxpYyBrZXkgY291bnQgbWF0Y2hlcyBCaXRHby5cbiAqIFAyU0gtUDJQSyA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHB1YmxpYyBrZXksIHNpZ25hdHVyZS5cbiAqIFAyU0ggPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFBXMlNIID0+IHNjcmlwdFR5cGUsIHdpdG5lc3NTY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJTSC1QVzJTSCA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHdpdG5lc3NTY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJUUiBhbmQgUDJUUiBNVVNJRzIgc2NyaXB0IHBhdGggPT4gc2NyaXB0VHlwZSAodGFwcm9vdFNjcmlwdFBhdGhTcGVuZCksIHB1YlNjcmlwdCAobGVhZiBzY3JpcHQpLCBjb250cm9sQmxvY2ssXG4gKiBzY3JpcHRQYXRoTGV2ZWwsIGxlYWZWZXJzaW9uLCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyVFIgTVVTSUcyIGtlcCBwYXRoID0+IHNjcmlwdFR5cGUgKHRhcHJvb3RLZXlQYXRoU3BlbmQpLCBwdWJTY3JpcHQgKHNjcmlwdFB1YktleSksIHBhcnRpY2lwYW50IHB1YiBrZXlzIChzaWduZXIpLFxuICogcHVibGljIGtleSAodGFwT3V0cHV0a2V5KSwgc2lnbmF0dXJlcyAocGFydGlhbCBzaWduZXIgc2lncykuXG4gKiBBbnkgdW5zaWduZWQgUFNCVCBhbmQgd2l0aG91dCByZXF1aXJlZCBtZXRhZGF0YSBpcyByZXR1cm5lZCB3aXRoIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidElucHV0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyXG4pOiBQYXJzZWRQc2J0UDJtcyB8IFBhcnNlZFBzYnRUYXByb290IHwgUGFyc2VkUHNidFAyc2hQMnBrIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBpZiAocHNidC5pc0lucHV0RmluYWxpemVkKGlucHV0SW5kZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5hbGl6ZWQgUFNCVCBwYXJzaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBjb25zdCBzY3JpcHRUeXBlID0gZ2V0U2NyaXB0VHlwZShpbnB1dCk7XG4gIGlmICghc2NyaXB0VHlwZSkge1xuICAgIGlmIChwc2J0LmdldFNpZ25hdHVyZUNvdW50KGlucHV0SW5kZXgpID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgc3RhdGUuIFNpZ25hdHVyZXMgZm91bmQgd2l0aG91dCBzY3JpcHRzLicpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYXJzZUlucHV0TWV0YWRhdGEocHNidCwgaW5wdXRJbmRleCwgc2NyaXB0VHlwZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2lnbmF0dXJlQ291bnQoXG4gIHNpZ25hdHVyZXM6IFtCdWZmZXIgfCAwLCBCdWZmZXIgfCAwLCBCdWZmZXIgfCAwXSB8IFtCdWZmZXIsIEJ1ZmZlcl0gfCBbQnVmZmVyXSB8IHVuZGVmaW5lZFxuKTogMCB8IDEgfCAyIHtcbiAgY29uc3QgY291bnQgPSBzaWduYXR1cmVzID8gc2lnbmF0dXJlcy5maWx0ZXIoKHMpID0+ICFpc1BsYWNlaG9sZGVyU2lnbmF0dXJlKHMpKS5sZW5ndGggOiAwO1xuICBpZiAoY291bnQgPT09IDAgfHwgY291bnQgPT09IDEgfHwgY291bnQgPT09IDIpIHtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZSBjb3VudCcpO1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dFNpZ25hdHVyZUNvdW50KHBhcmFtOiBUeElucHV0IHwgeyBwc2J0OiBVdHhvUHNidDsgaW5wdXRJbmRleDogbnVtYmVyIH0pOiAwIHwgMSB8IDIge1xuICBpZiAoJ3BzYnQnIGluIHBhcmFtKSB7XG4gICAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVBzYnRJbnB1dChwYXJhbS5wc2J0LCBwYXJhbS5pbnB1dEluZGV4KTtcbiAgICBhc3NlcnQocGFyc2VkSW5wdXQsICdpbnZhbGlkIHBzYnQgaW5wdXQnKTtcbiAgICByZXR1cm4gcGFyc2VTaWduYXR1cmVDb3VudChwYXJzZWRJbnB1dC5zaWduYXR1cmVzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW0uc2NyaXB0Py5sZW5ndGggfHwgcGFyYW0ud2l0bmVzcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KHBhcmFtKTtcbiAgICAgIHJldHVybiBwYXJzZWRJbnB1dC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAyIDogcGFyc2VTaWduYXR1cmVDb3VudChwYXJzZWRJbnB1dC5zaWduYXR1cmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyBtYXhpbXVtIG51bWJlciBvZiBzaWduYXR1cmVzIGFjcm9zcyBhbGwgaW5wdXRzIC0gMCwgMSBhbmQgMi5cbiAqIEl0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGdpdmVuIHBzYnQvdHJhbnNhY3Rpb24vYXJyYXkgb2YgVHhJbnB1dHMgaXMgdW5zaWduZWQoMCksIGhhbGYtc2lnbmVkKDEpIG9yIGZ1bGx5LXNpZ25lZCgyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25hdHVyZUNvdW50KFxuICB0eDogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248bnVtYmVyIHwgYmlnaW50PiB8IFR4SW5wdXRbXSxcbiAgaW5wdXRJbmRleD86IG51bWJlclxuKTogMCB8IDEgfCAyIHtcbiAgY29uc3QgY29uc3RydWN0UGFyYW0gPSAodHg6IFV0eG9Qc2J0IHwgVXR4b1RyYW5zYWN0aW9uPG51bWJlciB8IGJpZ2ludD4gfCBUeElucHV0W10sIGlucHV0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiB0eCBpbnN0YW5jZW9mIFV0eG9Qc2J0XG4gICAgICA/IHsgcHNidDogdHgsIGlucHV0SW5kZXggfVxuICAgICAgOiAodHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyB0eC5pbnMgOiB0eClbaW5wdXRJbmRleF07XG4gIH07XG5cbiAgY29uc3QgaW5wdXRzID0gdHggaW5zdGFuY2VvZiBVdHhvUHNidCA/IHR4LmRhdGEuaW5wdXRzIDogdHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyB0eC5pbnMgOiB0eDtcbiAgYXNzZXJ0KGlucHV0SW5kZXggPT09IHVuZGVmaW5lZCB8fCAoaW5wdXRJbmRleCA+PSAwICYmIGlucHV0SW5kZXggPCBpbnB1dHMubGVuZ3RoKSwgJ2ludmFsaWQgaW5wdXRJbmRleCByYW5nZScpO1xuICBjb25zdCBpbmRpY2VzID0gaW5wdXRJbmRleCA9PT0gdW5kZWZpbmVkID8gaW5wdXRzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4KSA6IFtpbnB1dEluZGV4XTtcbiAgcmV0dXJuIGluZGljZXNcbiAgICAubWFwKChpbmRleCwgXykgPT4gZ2V0SW5wdXRTaWduYXR1cmVDb3VudChjb25zdHJ1Y3RQYXJhbSh0eCwgaW5kZXgpKSlcbiAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoY3VyciA+IHByZXYgPyBjdXJyIDogcHJldiksIDApO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgZGF0YSBzdGFydHMgd2l0aCBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2VcbiAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgb3IgaGV4IHN0cmluZ1xuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnQoZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNzQubWVkaWF3aWtpI3NwZWNpZmljYXRpb25cbiAgLy8gMHg3MDczNjI3NCAtIEFTQ0lJIGZvciAncHNidCcuIDB4ZmYgLSBzZXBhcmF0b3JcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDAsIDEwKSwgJ2hleCcpO1xuICB9XG4gIHJldHVybiA1IDw9IGRhdGEubGVuZ3RoICYmIGRhdGEucmVhZFVJbnQzMkJFKDApID09PSAweDcwNzM2Mjc0ICYmIGRhdGEucmVhZFVJbnQ4KDQpID09PSAweGZmO1xufVxuIl19
417
+ exports.extractP2msOnlyHalfSignedTx = extractP2msOnlyHalfSignedTx;
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFHakMsZ0RBQXFEO0FBRXJELHVDQUF1QztBQUN2QywwQ0FBdUM7QUFDdkMsd0RBQXFEO0FBQ3JELG9EQUE2RztBQUM3Ryw2Q0FBaUU7QUFDakUsd0NBQW9EO0FBQ3BELGdEQUEyRDtBQUMzRCx1Q0FBMkQ7QUFFM0QsOENBY3VCO0FBQ3ZCLHNDQUF1RDtBQUN2RCxvQ0FBMkM7QUFDM0MsMkNBQTBEO0FBQzFELGlEQUEyRTtBQUMzRSx1Q0FBZ0Q7QUFDaEQsMENBQStFO0FBcUUvRSxTQUFTLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxVQUE2QjtJQUN0RSxNQUFNLGdCQUFnQixHQUFHLCtCQUFrQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN6RixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQ2hFLGdDQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDcEQsQ0FBQztRQUNGLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMxRjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FB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LElBQUksSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLEtBQUssRUFBRTtZQUNmLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE9BQU8sRUFBRTtZQUNsQixFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQXpDRCxrRUF5Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgR2xvYmFsWHB1YiwgUGFydGlhbFNpZywgUHNidElucHV0LCBUYXBTY3JpcHRTaWcgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCAqIGFzIGJzNThjaGVjayBmcm9tICdiczU4Y2hlY2snO1xuaW1wb3J0IHsgVXR4b1BzYnQgfSBmcm9tICcuLi9VdHhvUHNidCc7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMywgZ2V0TGVhZkhhc2gsIHNjcmlwdFR5cGVGb3JDaGFpbiwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4uL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgRGVyaXZlZFdhbGxldEtleXMsIFJvb3RXYWxsZXRLZXlzIH0gZnJvbSAnLi9XYWxsZXRLZXlzJztcbmltcG9ydCB7IHRvUHJldk91dHB1dFdpdGhQcmV2VHggfSBmcm9tICcuLi9VbnNwZW50JztcbmltcG9ydCB7IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBpc1dhbGxldFVuc3BlbnQsIFdhbGxldFVuc3BlbnQgfSBmcm9tICcuL1Vuc3BlbnQnO1xuXG5pbXBvcnQge1xuICBnZXRMZWFmVmVyc2lvbixcbiAgY2FsY3VsYXRlU2NyaXB0UGF0aExldmVsLFxuICBpc1ZhbGlkQ29udHJvbEJvY2ssXG4gIFBhcnNlZFB1YlNjcmlwdFAybXMsXG4gIFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RTY3JpcHRQYXRoLFxuICBwYXJzZVB1YlNjcmlwdDJPZjMsXG4gIFBhcnNlZFB1YlNjcmlwdFRhcHJvb3QsXG4gIFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RLZXlQYXRoLFxuICBwYXJzZVB1YlNjcmlwdCxcbiAgUGFyc2VkUHViU2NyaXB0UDJzaFAycGssXG4gIFBhcnNlZFNjcmlwdFR5cGUsXG4gIGlzUGxhY2Vob2xkZXJTaWduYXR1cmUsXG4gIHBhcnNlU2lnbmF0dXJlU2NyaXB0LFxufSBmcm9tICcuLi9wYXJzZUlucHV0JztcbmltcG9ydCB7IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzIH0gZnJvbSAnLi4vTXVzaWcyJztcbmltcG9ydCB7IGlzVHVwbGUsIFRyaXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi90YXByb290JztcbmltcG9ydCB7IG9wY29kZXMgYXMgb3BzLCBzY3JpcHQgYXMgYnNjcmlwdCwgVHhJbnB1dCB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgb3Bjb2RlcywgcGF5bWVudHMgfSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBnZXRQc2J0SW5wdXRTaWduYXR1cmVDb3VudCwgaXNQc2J0SW5wdXRGaW5hbGl6ZWQgfSBmcm9tICcuLi9Qc2J0VXRpbCc7XG5cbi8vIG9ubHkgdXNlZCBmb3IgYnVpbGRpbmcgYFNpZ25hdHVyZUNvbnRhaW5lcmBcbnR5cGUgQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjxUPiA9IHtcbiAgc2lnbmF0dXJlczogVDtcbn07XG5cbnR5cGUgVW5zaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPHVuZGVmaW5lZD47XG50eXBlIEhhbGZTaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXJdPjtcbnR5cGUgRnVsbFNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlciwgQnVmZmVyXT47XG5cbnR5cGUgU2lnbmF0dXJlQ29udGFpbmVyID0gVW5zaWduZWRTaWduYXR1cmVDb250YWluZXIgfCBIYWxmU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgRnVsbFNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBhIHByZS1maW5hbGl6ZWQgUFNCVCBJbnB1dCBmb3IgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbiB0aGUgbm9uLWZpbmFsaXplZCBzdGF0ZS5cbiAqIFQgaXMgW0J1ZmZlcl0gZm9yIGZpcnN0IHNpZ25hdHVyZSwgW0J1ZmZlciwgQnVmZmVyXSBmb3IgYm90aCBzaWduYXR1cmVzIGFuZCBgdW5kZWZpbmVkYCBmb3Igbm8gc2lnbmF0dXJlcy5cbiAqL1xudHlwZSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8VD4gPSB7XG4gIHNpZ25hdHVyZXM6IFQ7XG4gIC8qKiBPbmx5IGNvbnRhaW5zIHBhcnRpY2lwYW50cyB0aGF0IGhhdmUgYWRkZWQgYSBzaWduYXR1cmUgKi9cbiAgcGFydGljaXBhbnRQdWJsaWNLZXlzOiBUO1xufTtcblxudHlwZSBVbnNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPHVuZGVmaW5lZD47XG50eXBlIEhhbGZTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyXT47XG50eXBlIEZ1bGxTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyLCBCdWZmZXJdPjtcblxudHlwZSBUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9XG4gIHwgVW5zaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lclxuICB8IEhhbGZTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lclxuICB8IEZ1bGxTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIHAybXMgYmFzZWQgc2NyaXB0IHR5cGVzIC0gcDJzaCwgcDJ3c2gsIGFuZCBwMnNoUDJ3c2hcbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFAybXMgPSBQYXJzZWRQdWJTY3JpcHRQMm1zICYgU2lnbmF0dXJlQ29udGFpbmVyO1xuXG4vKipcbiAqIFRvIGhvbGQgcGFyc2VkIHBzYnQgZGF0YSBmb3IgVGFwcm9vdEtleVBhdGhTcGVuZCBzY3JpcHQgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFRhcHJvb3RLZXlQYXRoID0gUGFyc2VkUHViU2NyaXB0VGFwcm9vdEtleVBhdGggJiBUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIFRhcHJvb3RTY3JpcHRQYXRoU3BlbmQgc2NyaXB0IHBhdGggc2NyaXB0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRUYXByb290U2NyaXB0UGF0aCA9IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RTY3JpcHRQYXRoICZcbiAgU2lnbmF0dXJlQ29udGFpbmVyICYge1xuICAgIGNvbnRyb2xCbG9jazogQnVmZmVyO1xuICAgIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqIEluZGljYXRlcyB0aGUgbGV2ZWwgaW5zaWRlIHRoZSB0YXB0cmVlLiAqL1xuICAgIHNjcmlwdFBhdGhMZXZlbDogbnVtYmVyO1xuICB9O1xuXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0VGFwcm9vdCA9IFBhcnNlZFBzYnRUYXByb290S2V5UGF0aCB8IFBhcnNlZFBzYnRUYXByb290U2NyaXB0UGF0aDtcblxudHlwZSBQMnNoUDJwa1NpZ25hdHVyZUNvbnRhaW5lciA9IFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgSGFsZlNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFAyc2hQMnBrID0gUGFyc2VkUHViU2NyaXB0UDJzaFAycGsgJiBQMnNoUDJwa1NpZ25hdHVyZUNvbnRhaW5lcjtcblxuaW50ZXJmYWNlIFdhbGxldFNpZ25lciB7XG4gIHdhbGxldEtleTogQklQMzJJbnRlcmZhY2U7XG4gIHJvb3RLZXk6IEJJUDMySW50ZXJmYWNlO1xufVxuXG4vKipcbiAqIHBzYnQgaW5wdXQgaW5kZXggYW5kIGl0cyB1c2VyLCBiYWNrdXAsIGJpdGdvIHNpZ25hdHVyZXMgc3RhdHVzXG4gKi9cbmV4cG9ydCB0eXBlIFNpZ25hdHVyZVZhbGlkYXRpb24gPSBbaW5kZXg6IG51bWJlciwgc2lnVHJpcGxlOiBUcmlwbGU8Ym9vbGVhbj5dO1xuXG5mdW5jdGlvbiBnZXRUYXByb290U2lnbmVycyhzY3JpcHQ6IEJ1ZmZlciwgd2FsbGV0S2V5czogRGVyaXZlZFdhbGxldEtleXMpOiBbV2FsbGV0U2lnbmVyLCBXYWxsZXRTaWduZXJdIHtcbiAgY29uc3QgcGFyc2VkUHVibGljS2V5cyA9IHBhcnNlUHViU2NyaXB0Mk9mMyhzY3JpcHQsICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykucHVibGljS2V5cztcbiAgY29uc3Qgd2FsbGV0U2lnbmVycyA9IHBhcnNlZFB1YmxpY0tleXMubWFwKChwdWJsaWNLZXkpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHdhbGxldEtleXMucHVibGljS2V5cy5maW5kSW5kZXgoKHdhbGxldFB1YmxpY0tleSkgPT5cbiAgICAgIHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0UHVibGljS2V5KS5lcXVhbHMocHVibGljS2V5KVxuICAgICk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB7IHdhbGxldEtleTogd2FsbGV0S2V5cy50cmlwbGVbaW5kZXhdLCByb290S2V5OiB3YWxsZXRLZXlzLnBhcmVudC50cmlwbGVbaW5kZXhdIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignVGFwcm9vdCBwdWJsaWMga2V5IGlzIG5vdCBhIHdhbGxldCBwdWJsaWMga2V5Jyk7XG4gIH0pO1xuICByZXR1cm4gW3dhbGxldFNpZ25lcnNbMF0sIHdhbGxldFNpZ25lcnNbMV1dO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQc2J0SW5wdXQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQ8YmlnaW50PixcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiB2b2lkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBjb25zdCBzaWduYXR1cmVDb3VudCA9IGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50LmNoYWluKTtcbiAgaWYgKHNpZ25hdHVyZUNvdW50ID09PSAwICYmIHNjcmlwdFR5cGUgPT09ICdwMnRyJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcblxuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpIHx8IGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCBzdGF0ZS4gTWlzc2luZyByZXF1aXJlZCBmaWVsZHMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbc2lnbmVyLCBjb3NpZ25lcl0gPSBnZXRUYXByb290U2lnbmVycyhpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCwgd2FsbGV0S2V5cyk7XG5cbiAgICBjb25zdCBsZWFmSGFzaCA9IGdldExlYWZIYXNoKHtcbiAgICAgIHB1YmxpY0tleXM6IHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICAgIHNpZ25lcjogc2lnbmVyLndhbGxldEtleS5wdWJsaWNLZXksXG4gICAgICBjb3NpZ25lcjogY29zaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKCh3YWxsZXRTaWduZXIpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtsZWFmSGFzaF0sXG4gICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRTaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHdhbGxldFNpZ25lci5yb290S2V5LCB1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHdhbGxldFNpZ25lci5yb290S2V5LmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChzaWduYXR1cmVDb3VudCA9PT0gMCkge1xuICAgICAgY29uc3QgeyB3aXRuZXNzU2NyaXB0LCByZWRlZW1TY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKTtcbiAgICAgIGlmICh3aXRuZXNzU2NyaXB0ICYmIHBzYnQuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0ud2l0bmVzc1NjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzU2NyaXB0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZGVlbVNjcmlwdCAmJiBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnJlZGVlbVNjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBiaXAzMkRlcml2YXRpb246IFswLCAxLCAyXS5tYXAoKGlkeCkgPT4gKHtcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXlzLnRyaXBsZVtpZHhdLnB1YmxpY0tleSxcbiAgICAgICAgcGF0aDogd2FsbGV0S2V5cy5wYXRoc1tpZHhdLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXMudHJpcGxlW2lkeF0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJuIFBTQlQgZmlsbGVkIHdpdGggbWV0YXRkYXRhIGFzIHBlciBpbnB1dCBwYXJhbXMgdHgsIHVuc3BlbnRzIGFuZCByb290V2FsbGV0S2V5cy5cbiAqIFVuc2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4b1xuICogVW5zaWduZWQgUFNCVCBmb3Igb3RoZXIgaW5wdXQgd2l0aCB3aXRuZXNzVXR4by9ub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQsIGJpcDMyRGVyaXZhdGlvblxuICogU2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4bywgdGFwTGVhZlNjcmlwdCwgdGFwQmlwMzJEZXJpdmF0aW9uLCB0YXBTY3JpcHRTaWdcbiAqIFNpZ25lZCBQU0JUIGZvciBvdGhlciBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvL25vbldpdG5lc3NVdHhvLCByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdCwgYmlwMzJEZXJpdmF0aW9uLCBwYXJ0aWFsU2lnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dhbGxldFBzYnQoXG4gIHR4OiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IFV0eG9Qc2J0IHtcbiAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoKHUpID0+IHtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoc2NyaXB0VHlwZUZvckNoYWluKHUuY2hhaW4pLCAncDJ0ck11c2lnMicpO1xuICAgIHJldHVybiB0b1ByZXZPdXRwdXRXaXRoUHJldlR4KHUsIHR4Lm5ldHdvcmspO1xuICB9KTtcbiAgY29uc3QgcHNidCA9IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24odHgsIHByZXZPdXRwdXRzKTtcbiAgdW5zcGVudHMuZm9yRWFjaCgodSwgaSkgPT4ge1xuICAgIGlmIChpc1dhbGxldFVuc3BlbnQodSkgJiYgdS5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVQc2J0SW5wdXQocHNidCwgaSwgdSwgcm9vdFdhbGxldEtleXMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHNpZ25lclxuICogQHBhcmFtIHVuc3BlbnRcbiAqIEByZXR1cm4gc2lnbmVkIFBTQlQgd2l0aCBzaWduZXIncyBrZXkgZm9yIHVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25XYWxsZXRQc2J0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD5cbik6IHZvaWQge1xuICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnQuY2hhaW4pO1xuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInIHx8IHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIHBzYnQuc2lnblRhcHJvb3RJbnB1dEhEKGlucHV0SW5kZXgsIHNpZ25lcik7XG4gIH0gZWxzZSB7XG4gICAgcHNidC5zaWduSW5wdXRIRChpbnB1dEluZGV4LCBzaWduZXIpO1xuICB9XG59XG5cbi8qKlxuICogQHJldHVybnMgc2NyaXB0IHR5cGUgb2YgdGhlIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0OiBQc2J0SW5wdXQpOiBQYXJzZWRTY3JpcHRUeXBlIHtcbiAgY29uc3QgaXNQMnBrID0gKHNjcmlwdDogQnVmZmVyKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaHVua3M/Lmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBCdWZmZXIuaXNCdWZmZXIoY2h1bmtzWzBdKSAmJlxuICAgICAgICBic2NyaXB0LmlzQ2Fub25pY2FsUHViS2V5KGNodW5rc1swXSkgJiZcbiAgICAgICAgY2h1bmtzWzFdID09PSBvcGNvZGVzLk9QX0NIRUNLU0lHXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGxldCBzY3JpcHRUeXBlOiBQYXJzZWRTY3JpcHRUeXBlIHwgdW5kZWZpbmVkO1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0LnJlZGVlbVNjcmlwdCkgJiYgQnVmZmVyLmlzQnVmZmVyKGlucHV0LndpdG5lc3NTY3JpcHQpKSB7XG4gICAgc2NyaXB0VHlwZSA9ICdwMnNoUDJ3c2gnO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC5yZWRlZW1TY3JpcHQpKSB7XG4gICAgc2NyaXB0VHlwZSA9IGlzUDJwayhpbnB1dC5yZWRlZW1TY3JpcHQpID8gJ3Ayc2hQMnBrJyA6ICdwMnNoJztcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQud2l0bmVzc1NjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gJ3Ayd3NoJztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dC50YXBMZWFmU2NyaXB0KSAmJiBpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2NyaXB0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBib3RoICR7c2NyaXB0VHlwZX0gYW5kIHRhcHJvb3RTY3JpcHRQYXRoIFBTQlQgbWV0YWRhdGEuYCk7XG4gICAgfVxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0Z28gb25seSBzdXBwb3J0cyBhIHNpbmdsZSB0YXAgbGVhZiBzY3JpcHQgcGVyIGlucHV0LicpO1xuICAgIH1cbiAgICBzY3JpcHRUeXBlID0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnO1xuICB9XG4gIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleSkge1xuICAgIGlmIChzY3JpcHRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGJvdGggJHtzY3JpcHRUeXBlfSBhbmQgdGFwcm9vdEtleVBhdGggUFNCVCBtZXRhZGF0YS5gKTtcbiAgICB9XG4gICAgc2NyaXB0VHlwZSA9ICd0YXByb290S2V5UGF0aFNwZW5kJztcbiAgfVxuICBpZiAoc2NyaXB0VHlwZSkge1xuICAgIHJldHVybiBzY3JpcHRUeXBlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHBhcnNlIGlucHV0Jyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVzKGlucHV0OiBQc2J0SW5wdXQpOiBUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciB7XG4gIGNvbnN0IHBhcnRpYWxTaWdzID0gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MoaW5wdXQpO1xuICBpZiAoIXBhcnRpYWxTaWdzKSB7XG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlczogdW5kZWZpbmVkLCBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IHVuZGVmaW5lZCB9O1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBwYXJ0aWFsU2lncy5tYXAoKHBTaWcpID0+IHBTaWcucGFydGlhbFNpZyk7XG4gIGNvbnN0IHBhcnRpY2lwYW50UHVibGljS2V5cyA9IHBhcnRpYWxTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWNpcGFudFB1YktleSk7XG4gIHJldHVybiBpc1R1cGxlPEJ1ZmZlcj4oc2lnbmF0dXJlcykgJiYgaXNUdXBsZTxCdWZmZXI+KHBhcnRpY2lwYW50UHVibGljS2V5cylcbiAgICA/IHsgc2lnbmF0dXJlcywgcGFydGljaXBhbnRQdWJsaWNLZXlzIH1cbiAgICA6IHsgc2lnbmF0dXJlczogW3NpZ25hdHVyZXNbMF1dLCBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IFtwYXJ0aWNpcGFudFB1YmxpY0tleXNbMF1dIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFydGlhbE9yVGFwU2NyaXB0U2lnbmF0dXJlcyhzaWc6IFBhcnRpYWxTaWdbXSB8IFRhcFNjcmlwdFNpZ1tdIHwgdW5kZWZpbmVkKTogU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgaWYgKCFzaWc/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7IHNpZ25hdHVyZXM6IHVuZGVmaW5lZCB9O1xuICB9XG4gIGlmIChzaWcubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBzaWduYXR1cmUgY291bnQnKTtcbiAgfVxuICBjb25zdCBzaWduYXR1cmVzID0gc2lnLm1hcCgodFNpZykgPT4gdFNpZy5zaWduYXR1cmUpO1xuICByZXR1cm4gaXNUdXBsZTxCdWZmZXI+KHNpZ25hdHVyZXMpID8geyBzaWduYXR1cmVzIH0gOiB7IHNpZ25hdHVyZXM6IFtzaWduYXR1cmVzWzBdXSB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNpZ25hdHVyZXMoXG4gIGlucHV0OiBQc2J0SW5wdXQsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFNpZ25hdHVyZUNvbnRhaW5lciB8IFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgcmV0dXJuIHNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJ1xuICAgID8gcGFyc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZXMoaW5wdXQpXG4gICAgOiBzY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCdcbiAgICA/IHBhcnNlUGFydGlhbE9yVGFwU2NyaXB0U2lnbmF0dXJlcyhpbnB1dC50YXBTY3JpcHRTaWcpXG4gICAgOiBwYXJzZVBhcnRpYWxPclRhcFNjcmlwdFNpZ25hdHVyZXMoaW5wdXQucGFydGlhbFNpZyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2NyaXB0KFxuICBpbnB1dDogUHNidElucHV0LFxuICBzY3JpcHRUeXBlOiBQYXJzZWRTY3JpcHRUeXBlXG4pOiBQYXJzZWRQdWJTY3JpcHRQMm1zIHwgUGFyc2VkUHViU2NyaXB0VGFwcm9vdCB8IFBhcnNlZFB1YlNjcmlwdFAyc2hQMnBrIHtcbiAgbGV0IHB1YlNjcmlwdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayc2gnIHx8IHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICBwdWJTY3JpcHQgPSBpbnB1dC5yZWRlZW1TY3JpcHQ7XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayd3NoJyB8fCBzY3JpcHRUeXBlID09PSAncDJzaFAyd3NoJykge1xuICAgIHB1YlNjcmlwdCA9IGlucHV0LndpdG5lc3NTY3JpcHQ7XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKSB7XG4gICAgcHViU2NyaXB0ID0gaW5wdXQudGFwTGVhZlNjcmlwdCA/IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0IDogdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJykge1xuICAgIGlmIChpbnB1dC53aXRuZXNzVXR4bz8uc2NyaXB0KSB7XG4gICAgICBwdWJTY3JpcHQgPSBpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQ7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleSAmJiBpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICBwdWJTY3JpcHQgPSBjcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KHsgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LCB0YXB0cmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFwdWJTY3JpcHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgUFNCVCBzdGF0ZSBmb3IgJHtzY3JpcHRUeXBlfS4gTWlzc2luZyByZXF1aXJlZCBmaWVsZHMuYCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlUHViU2NyaXB0KHB1YlNjcmlwdCwgc2NyaXB0VHlwZSk7XG59XG5cbi8qKlxuICogQHJldHVybiBwc2J0IG1ldGFkYXRhIGFyZSBwYXJzZWQgYXMgcGVyIGJlbG93IGNvbmRpdGlvbnMuXG4gKiByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdC90YXBMZWFmU2NyaXB0IG1hdGNoZXMgQml0R28uXG4gKiBzaWduYXR1cmUgYW5kIHB1YmxpYyBrZXkgY291bnQgbWF0Y2hlcyBCaXRHby5cbiAqIFAyU0gtUDJQSyA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHB1YmxpYyBrZXksIHNpZ25hdHVyZS5cbiAqIFAyU0ggPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFBXMlNIID0+IHNjcmlwdFR5cGUsIHdpdG5lc3NTY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJTSC1QVzJTSCA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHdpdG5lc3NTY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJUUiBhbmQgUDJUUiBNVVNJRzIgc2NyaXB0IHBhdGggPT4gc2NyaXB0VHlwZSAodGFwcm9vdFNjcmlwdFBhdGhTcGVuZCksIHB1YlNjcmlwdCAobGVhZiBzY3JpcHQpLCBjb250cm9sQmxvY2ssXG4gKiBzY3JpcHRQYXRoTGV2ZWwsIGxlYWZWZXJzaW9uLCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyVFIgTVVTSUcyIGtlcCBwYXRoID0+IHNjcmlwdFR5cGUgKHRhcHJvb3RLZXlQYXRoU3BlbmQpLCBwdWJTY3JpcHQgKHNjcmlwdFB1YktleSksIHBhcnRpY2lwYW50IHB1YiBrZXlzIChzaWduZXIpLFxuICogcHVibGljIGtleSAodGFwT3V0cHV0a2V5KSwgc2lnbmF0dXJlcyAocGFydGlhbCBzaWduZXIgc2lncykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRJbnB1dChpbnB1dDogUHNidElucHV0KTogUGFyc2VkUHNidFAybXMgfCBQYXJzZWRQc2J0VGFwcm9vdCB8IFBhcnNlZFBzYnRQMnNoUDJwayB7XG4gIGlmIChpc1BzYnRJbnB1dEZpbmFsaXplZChpbnB1dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbmFsaXplZCBQU0JUIHBhcnNpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xuICB9XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KTtcbiAgY29uc3QgcGFyc2VkUHViU2NyaXB0ID0gcGFyc2VTY3JpcHQoaW5wdXQsIHNjcmlwdFR5cGUpO1xuICBjb25zdCBzaWduYXR1cmVzID0gcGFyc2VTaWduYXR1cmVzKGlucHV0LCBzY3JpcHRUeXBlKTtcblxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyAmJiAncGFydGljaXBhbnRQdWJsaWNLZXlzJyBpbiBzaWduYXR1cmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIC4uLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIGlmICghaW5wdXQudGFwTGVhZlNjcmlwdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgc3RhdGUgZm9yIHRhcHJvb3RTY3JpcHRQYXRoU3BlbmQuIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLicpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sQmxvY2sgPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLmNvbnRyb2xCbG9jaztcbiAgICBpZiAoIWlzVmFsaWRDb250cm9sQm9jayhjb250cm9sQmxvY2spKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCB0YXByb290U2NyaXB0UGF0aFNwZW5kIGNvbnRyb2xCbG9jay4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2NyaXB0UGF0aExldmVsID0gY2FsY3VsYXRlU2NyaXB0UGF0aExldmVsKGNvbnRyb2xCbG9jayk7XG4gICAgY29uc3QgbGVhZlZlcnNpb24gPSBnZXRMZWFmVmVyc2lvbihjb250cm9sQmxvY2spO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgc2NyaXB0UGF0aExldmVsLFxuICAgICAgbGVhZlZlcnNpb24sXG4gICAgfTtcbiAgfVxuICBpZiAoXG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fFxuICAgIHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJ3c2gnIHx8XG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3c2gnXG4gICkge1xuICAgIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIHBhcnNlZFB1YlNjcmlwdC5yZWRlZW1TY3JpcHQgPSBpbnB1dC5yZWRlZW1TY3JpcHQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgIH07XG4gIH1cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaFAycGsnICYmICghc2lnbmF0dXJlcy5zaWduYXR1cmVzIHx8ICFpc1R1cGxlKHNpZ25hdHVyZXMuc2lnbmF0dXJlcykpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIHNpZ25hdHVyZXM6IHNpZ25hdHVyZXMuc2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwdWIgc2NyaXB0Jyk7XG59XG5cbi8qKlxuICogQHJldHVybnMgc3RyaWN0bHkgcGFyc2UgdGhlIGlucHV0IGFuZCBnZXQgc2lnbmF0dXJlIGNvdW50LlxuICogdW5zaWduZWQoMCksIGhhbGYtc2lnbmVkKDEpIG9yIGZ1bGx5LXNpZ25lZCgyKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnQoaW5wdXQ6IFR4SW5wdXQgfCBQc2J0SW5wdXQpOiAwIHwgMSB8IDIge1xuICBjb25zdCBjYWxjdWxhdGVTaWduYXR1cmVDb3VudCA9IChcbiAgICBzaWduYXR1cmVzOiBbQnVmZmVyIHwgMCwgQnVmZmVyIHwgMCwgQnVmZmVyIHwgMF0gfCBbQnVmZmVyLCBCdWZmZXJdIHwgW0J1ZmZlcl0gfCB1bmRlZmluZWRcbiAgKTogMCB8IDEgfCAyID0+IHtcbiAgICBjb25zdCBjb3VudCA9IHNpZ25hdHVyZXMgPyBzaWduYXR1cmVzLmZpbHRlcigocykgPT4gIWlzUGxhY2Vob2xkZXJTaWduYXR1cmUocykpLmxlbmd0aCA6IDA7XG4gICAgaWYgKGNvdW50ID09PSAwIHx8IGNvdW50ID09PSAxIHx8IGNvdW50ID09PSAyKSB7XG4gICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUgY291bnQnKTtcbiAgfTtcblxuICBpZiAoJ2hhc2gnIGluIGlucHV0KSB7XG4gICAgaWYgKGlucHV0LnNjcmlwdD8ubGVuZ3RoIHx8IGlucHV0LndpdG5lc3M/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gICAgICByZXR1cm4gcGFyc2VkSW5wdXQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnID8gMiA6IGNhbGN1bGF0ZVNpZ25hdHVyZUNvdW50KHBhcnNlZElucHV0LnNpZ25hdHVyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlU2lnbmF0dXJlQ291bnQocGFyc2VQc2J0SW5wdXQoaW5wdXQpLnNpZ25hdHVyZXMpO1xuICB9XG59XG5cbi8qKlxuICogQHJldHVybnMgc3RyaWN0bHkgcGFyc2UgaW5wdXQgYW5kIGdldCBzaWduYXR1cmUgY291bnQgZm9yIGFsbCBpbnB1dHMuXG4gKiAwPXVuc2lnbmVkLCAxPWhhbGYtc2lnbmVkIG9yIDI9ZnVsbHktc2lnbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpY3RTaWduYXR1cmVDb3VudHMoXG4gIHR4OiBVdHhvUHNidCB8IFV0eG9UcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+IHwgUHNidElucHV0W10gfCBUeElucHV0W11cbik6ICgwIHwgMSB8IDIpW10ge1xuICBjb25zdCBpbnB1dHMgPSB0eCBpbnN0YW5jZW9mIFV0eG9Qc2J0ID8gdHguZGF0YS5pbnB1dHMgOiB0eCBpbnN0YW5jZW9mIFV0eG9UcmFuc2FjdGlvbiA/IHR4LmlucyA6IHR4O1xuICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQsIF8pID0+IGdldFN0cmljdFNpZ25hdHVyZUNvdW50KGlucHV0KSk7XG59XG5cbi8qKlxuICogQHJldHVybiB0cnVlIGlmZiBpbnB1dHMgYXJyYXkgaXMgb2YgUHNidElucHV0VHlwZSB0eXBlXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHNidElucHV0QXJyYXkoaW5wdXRzOiBQc2J0SW5wdXRbXSB8IFR4SW5wdXRbXSk6IGlucHV0cyBpcyBQc2J0SW5wdXRbXSB7XG4gIHJldHVybiAhaXNUeElucHV0QXJyYXkoaW5wdXRzKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIGlucHV0cyBhcnJheSBpcyBvZiBUeElucHV0IHR5cGVcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gaXNUeElucHV0QXJyYXkoaW5wdXRzOiBQc2J0SW5wdXRbXSB8IFR4SW5wdXRbXSk6IGlucHV0cyBpcyBUeElucHV0W10ge1xuICBhc3NlcnQoISFpbnB1dHMubGVuZ3RoLCAnZW1wdHkgaW5wdXRzIGFycmF5Jyk7XG4gIHJldHVybiAnaGFzaCcgaW4gaW5wdXRzWzBdO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWZmIGdpdmVuIHBzYnQvdHJhbnNhY3Rpb24vdHgtaW5wdXQtYXJyYXkvcHNidC1pbnB1dC1hcnJheSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dChcbiAgZGF0YTogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248YmlnaW50IHwgbnVtYmVyPiB8IFBzYnRJbnB1dFtdIHwgVHhJbnB1dFtdXG4pOiBib29sZWFuIHtcbiAgY29uc3QgaW5wdXRzID0gZGF0YSBpbnN0YW5jZW9mIFV0eG9Qc2J0ID8gZGF0YS5kYXRhLmlucHV0cyA6IGRhdGEgaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyBkYXRhLmlucyA6IGRhdGE7XG4gIGlmICghaW5wdXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaXNQc2J0SW5wdXRBcnJheShpbnB1dHMpKSB7XG4gICAgcmV0dXJuIGlucHV0cy5zb21lKChpbnB1dCwgXykgPT4gZ2V0UHNidElucHV0U2NyaXB0VHlwZShpbnB1dCkgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0cy5zb21lKChpbnB1dCwgXykgPT4ge1xuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBub3Qgc2lnbmVkLCBpdCBjYW5ub3QgYmUgYSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0IGJlY2F1c2UgeW91IGNhbiBvbmx5XG4gICAgLy8gZXh0cmFjdCBhIGZ1bGx5IHNpZ25lZCBwc2J0IGludG8gYSB0cmFuc2FjdGlvbiB3aXRoIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzLlxuICAgIGlmIChnZXRTdHJpY3RTaWduYXR1cmVDb3VudChpbnB1dCkgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU2lnbmF0dXJlU2NyaXB0KGlucHV0KS5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgUm9vdFdhbGxldEtleXMgYXMgdGhlIGdsb2JhbFhwdWJzIG9uIHRoZSBwc2J0XG4gKlxuICogV2UgZG8gYWxsIHRoZSBtYXRjaGluZyBvZiB0aGUgKHRhcCliaXAzMkRlcml2YXRpb25zIG1hc3RlckZpbmdlcnByaW50IHRvIHRoZSBmaW5nZXJwcmludCBvZiB0aGVcbiAqIGV4dGVuZGVkUHVia2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkWHB1YnNUb1BzYnQocHNidDogVXR4b1BzYnQsIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyk6IHZvaWQge1xuICBjb25zdCBzYWZlUm9vdFdhbGxldEtleXMgPSBuZXcgUm9vdFdhbGxldEtleXMoXG4gICAgcm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoYmlwMzIpID0+IGJpcDMyLm5ldXRlcmVkKCkpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4sXG4gICAgcm9vdFdhbGxldEtleXMuZGVyaXZhdGlvblByZWZpeGVzXG4gICk7XG4gIGNvbnN0IHhQdWJzID0gc2FmZVJvb3RXYWxsZXRLZXlzLnRyaXBsZS5tYXAoXG4gICAgKGJpcDMyKTogR2xvYmFsWHB1YiA9PiAoe1xuICAgICAgZXh0ZW5kZWRQdWJrZXk6IGJzNThjaGVjay5kZWNvZGUoYmlwMzIudG9CYXNlNTgoKSksXG4gICAgICBtYXN0ZXJGaW5nZXJwcmludDogYmlwMzIuZmluZ2VycHJpbnQsXG4gICAgICAvLyBUT0RPOiBCRy03Mzc5NyAtIGJpcDE3NCBjdXJyZW50bHkgcmVxdWlyZXMgbSBwcmVmaXggZm9yIHRoaXMgdG8gYmUgYSB2YWxpZCBnbG9iYWxYcHViXG4gICAgICBwYXRoOiAnbScsXG4gICAgfSlcbiAgKTtcbiAgcHNidC51cGRhdGVHbG9iYWwoeyBnbG9iYWxYcHViOiB4UHVicyB9KTtcbn1cblxuLyoqXG4gKiB2YWxpZGF0ZXMgc2lnbmF0dXJlcyBmb3IgZWFjaCAyIG9mIDMgaW5wdXQgYWdhaW5zdCB1c2VyLCBiYWNrdXAsIGJpdGdvIGtleXMgZGVyaXZlZCBmcm9tIHJvb3RXYWxsZXRLZXlzLlxuICogQHJldHVybnMgYXJyYXkgb2YgaW5wdXQgaW5kZXggYW5kIGl0cyBbaXMgdmFsaWQgdXNlciBzaWcgZXhpc3QsIGlzIHZhbGlkIGJhY2t1cCBzaWcgZXhpc3QsIGlzIHZhbGlkIHVzZXIgYml0Z28gZXhpc3RdXG4gKiBGb3IgcDJzaFAycGsgaW5wdXQsIFtmYWxzZSwgZmFsc2UsIGZhbHNlXSBpcyByZXR1cm5lZCBzaW5jZSBpdCBpcyBub3QgYSAyIG9mIDMgc2lnIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5UHNidChwc2J0OiBVdHhvUHNidCwgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzKTogU2lnbmF0dXJlVmFsaWRhdGlvbltdIHtcbiAgcmV0dXJuIHBzYnQuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHNpZ1ZhbEFycmF5Rm9ySW5wdXQ6IFRyaXBsZTxib29sZWFuPiA9XG4gICAgICBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSA9PT0gJ3Ayc2hQMnBrJ1xuICAgICAgICA/IFtmYWxzZSwgZmFsc2UsIGZhbHNlXVxuICAgICAgICA6IHBzYnQuZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KGksIHsgcm9vdE5vZGVzOiByb290V2FsbGV0S2V5cy50cmlwbGUgfSk7XG4gICAgcmV0dXJuIFtpLCBzaWdWYWxBcnJheUZvcklucHV0XTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGhhbGYgc2lnbmVkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHBzYnQgZm9yIHAybXMgYmFzZWQgc2NyaXB0IHR5cGVzIC0gcDJzaCwgcDJ3c2gsIGFuZCBwMnNoUDJ3c2guXG4gKiBUaGUgcHVycG9zZSBpcyB0byBwcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8ga2V5dGVybmFsIChLUlMpIHRoYXQgb25seSBzdXBwb3J0cyBuZXR3b3JrIHRyYW5zYWN0aW9uIGFuZCBwMm1zIHNjcmlwdCB0eXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQMm1zT25seUhhbGZTaWduZWRUeChwc2J0OiBVdHhvUHNidCk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgYXNzZXJ0KCEhKHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoICYmIHBzYnQuZGF0YS5vdXRwdXRzLmxlbmd0aCksICdlbXB0eSBpbnB1dHMgb3Igb3V0cHV0cycpO1xuICBjb25zdCB0eCA9IHBzYnQuZ2V0VW5zaWduZWRUeCgpO1xuXG4gIGZ1bmN0aW9uIGlzUDJtc1BhcnNlZFBzYnRJbnB1dChcbiAgICBwYXJzZWQ6IFBhcnNlZFBzYnRQMm1zIHwgUGFyc2VkUHNidFRhcHJvb3QgfCBQYXJzZWRQc2J0UDJzaFAycGtcbiAgKTogcGFyc2VkIGlzIFBhcnNlZFBzYnRQMm1zIHtcbiAgICByZXR1cm4gWydwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCddLmluY2x1ZGVzKHBhcnNlZC5zY3JpcHRUeXBlKTtcbiAgfVxuXG4gIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBzYnRJbnB1dChpbnB1dCk7XG4gICAgYXNzZXJ0KGlzUDJtc1BhcnNlZFBzYnRJbnB1dChwYXJzZWQpLCBgdW5zdXBwb3J0ZWQgc2NyaXB0IHR5cGUgJHtwYXJzZWQuc2NyaXB0VHlwZX1gKTtcbiAgICBhc3NlcnQoaW5wdXQucGFydGlhbFNpZz8ubGVuZ3RoID09PSAxLCBgdW5leHBlY3RlZCBzaWduYXR1cmUgY291bnQgJHtpbnB1dC5wYXJ0aWFsU2lnPy5sZW5ndGh9YCk7XG4gICAgY29uc3QgW3BhcnRpYWxTaWddID0gaW5wdXQucGFydGlhbFNpZztcbiAgICBhc3NlcnQoXG4gICAgICBpbnB1dC5zaWdoYXNoVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlucHV0LnNpZ2hhc2hUeXBlID09PSBic2NyaXB0LnNpZ25hdHVyZS5kZWNvZGUocGFydGlhbFNpZy5zaWduYXR1cmUpLmhhc2hUeXBlLFxuICAgICAgJ3NpZ25hdHVyZSBzaWdoYXNoIGRvZXMgbm90IG1hdGNoIGlucHV0IHNpZ2hhc2ggdHlwZSdcbiAgICApO1xuXG4gICAgLy8gdHlwZSBjYXN0aW5nIGlzIHRvIGFkZHJlc3MgdGhlIGludmFsaWQgdHlwZSBjaGVja2luZyBpbiBwYXltZW50cy5wMm1zXG4gICAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnNlZC5wdWJsaWNLZXlzLm1hcCgocGspID0+XG4gICAgICBwYXJ0aWFsU2lnLnB1YmtleS5lcXVhbHMocGspID8gcGFydGlhbFNpZy5zaWduYXR1cmUgOiAob3BzLk9QXzAgYXMgdW5rbm93biBhcyBCdWZmZXIpXG4gICAgKTtcblxuICAgIGNvbnN0IGlzUDJTSCA9ICEhcGFyc2VkLnJlZGVlbVNjcmlwdDtcbiAgICBjb25zdCBpc1AyV1NIID0gISFwYXJzZWQud2l0bmVzc1NjcmlwdDtcblxuICAgIGNvbnN0IHBheW1lbnQgPSBwYXltZW50cy5wMm1zKHsgb3V0cHV0OiBwYXJzZWQucHViU2NyaXB0LCBzaWduYXR1cmVzIH0sIHsgdmFsaWRhdGU6IGZhbHNlLCBhbGxvd0luY29tcGxldGU6IHRydWUgfSk7XG4gICAgY29uc3QgcDJ3c2ggPSBpc1AyV1NIID8gcGF5bWVudHMucDJ3c2goeyByZWRlZW06IHBheW1lbnQgfSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcDJzaCA9IGlzUDJTSCA/IHBheW1lbnRzLnAyc2goeyByZWRlZW06IHAyd3NoIHx8IHBheW1lbnQgfSkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAocDJzaD8uaW5wdXQpIHtcbiAgICAgIHR4LnNldElucHV0U2NyaXB0KGksIHAyc2guaW5wdXQpO1xuICAgIH1cbiAgICBpZiAocDJ3c2g/LndpdG5lc3MpIHtcbiAgICAgIHR4LnNldFdpdG5lc3MoaSwgcDJ3c2gud2l0bmVzcyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdHg7XG59XG4iXX0=
@@ -36,11 +36,37 @@ export interface WalletUnspentLegacy<TNumber extends number | bigint = number> e
36
36
  /** @deprecated - obviated by verifyWithUnspent */
37
37
  witnessScript?: string;
38
38
  }
39
+ /**
40
+ * @param psbt
41
+ * @param inputIndex
42
+ * @param id Unspent ID
43
+ * @returns true iff the unspent ID on the unspent and psbt input match
44
+ */
45
+ export declare function psbtIncludesUnspentAtIndex(psbt: UtxoPsbt, inputIndex: number, id: string): boolean;
46
+ /**
47
+ * Update the psbt input at the given index
48
+ * @param psbt
49
+ * @param inputIndex
50
+ * @param u
51
+ * @param redeemScript Only overrides if there is no redeemScript in the input currently
52
+ */
53
+ export declare function updateReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, inputIndex: number, u: Unspent<bigint>, redeemScript?: Buffer): void;
39
54
  export declare function addReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, u: Unspent<bigint>, redeemScript: Buffer,
40
55
  /**
41
56
  * @deprecated
42
57
  */
43
58
  network?: Network): void;
59
+ /**
60
+ * Update the PSBT with the unspent data for the input at the given index if the data is not there already.
61
+ *
62
+ * @param psbt
63
+ * @param inputIndex
64
+ * @param u
65
+ * @param rootWalletKeys
66
+ * @param signer
67
+ * @param cosigner
68
+ */
69
+ export declare function updateWalletUnspentForPsbt(psbt: UtxoPsbt, inputIndex: number, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName): void;
44
70
  export declare function addWalletUnspentToPsbt(psbt: UtxoPsbt, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName,
45
71
  /**
46
72
  * @deprecated
@@ -1 +1 @@
1
- {"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Unspent.ts"],"names":[],"mappings":";AAAA,OAAO,EAAc,OAAO,EAAY,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAWnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAY,iBAAiB,EAAE,OAAO,EAAqC,MAAM,YAAY,CAAC;AACrG,OAAO,EAAE,SAAS,EAAY,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKvC,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,OAAO,CAAC,OAAO,CAAC;IAC/F,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAC/E,SAAQ,iBAAiB,CAAC,OAAO,CAAC,EAChC,aAAa,CAAC,OAAO,CAAC;CAAG;AAE7B,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAEjH;AAED,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAClE,SAAS,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,aAAa,EAAE,mBAAmB,CAAC,cAAc,CAAC,GACjD,IAAI,CAmBN;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACxE,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC,EAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAC5B,UAAU,EAAE,cAAc,GACzB,MAAM,CAAC,OAAO,CAAC,CAiCjB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC3G,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,QAAQ,EACd,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,YAAY,EAAE,MAAM;AACpB;;GAEG;AACH,OAAO,GAAE,OAAsB,GAC9B,IAAI,CAqBN;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EACxB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO;AACjB;;GAEG;AACH,OAAO,GAAE,OAAsB,GAC9B,IAAI,CAkFN"}
1
+ {"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Unspent.ts"],"names":[],"mappings":"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"}