@bitgo-beta/utxo-lib 8.0.3-beta.5 → 8.0.3-beta.500

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 (116) hide show
  1. package/README.md +19 -16
  2. package/dist/src/address.js +5 -5
  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 +9 -9
  6. package/dist/src/bitgo/Musig2.d.ts +5 -10
  7. package/dist/src/bitgo/Musig2.d.ts.map +1 -1
  8. package/dist/src/bitgo/Musig2.js +41 -66
  9. package/dist/src/bitgo/PsbtUtil.d.ts +71 -0
  10. package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
  11. package/dist/src/bitgo/PsbtUtil.js +133 -0
  12. package/dist/src/bitgo/Unspent.d.ts +2 -2
  13. package/dist/src/bitgo/Unspent.d.ts.map +1 -1
  14. package/dist/src/bitgo/Unspent.js +3 -3
  15. package/dist/src/bitgo/UtxoPsbt.d.ts +26 -39
  16. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  17. package/dist/src/bitgo/UtxoPsbt.js +200 -169
  18. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
  19. package/dist/src/bitgo/UtxoTransaction.js +9 -9
  20. package/dist/src/bitgo/bitcoincash/address.js +6 -6
  21. package/dist/src/bitgo/bitcoincash/index.js +6 -2
  22. package/dist/src/bitgo/dash/DashTransaction.js +3 -3
  23. package/dist/src/bitgo/dash/index.js +6 -2
  24. package/dist/src/bitgo/index.d.ts +10 -0
  25. package/dist/src/bitgo/index.d.ts.map +1 -1
  26. package/dist/src/bitgo/index.js +10 -3
  27. package/dist/src/bitgo/keyutil.d.ts +9 -0
  28. package/dist/src/bitgo/keyutil.d.ts.map +1 -1
  29. package/dist/src/bitgo/keyutil.js +24 -2
  30. package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
  31. package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
  32. package/dist/src/bitgo/legacysafe/index.js +61 -0
  33. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -1
  34. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
  35. package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
  36. package/dist/src/bitgo/litecoin/index.js +6 -2
  37. package/dist/src/bitgo/outputScripts.d.ts +7 -6
  38. package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
  39. package/dist/src/bitgo/outputScripts.js +29 -14
  40. package/dist/src/bitgo/parseInput.d.ts +11 -7
  41. package/dist/src/bitgo/parseInput.d.ts.map +1 -1
  42. package/dist/src/bitgo/parseInput.js +23 -7
  43. package/dist/src/bitgo/psbt/fromHalfSigned.js +5 -5
  44. package/dist/src/bitgo/signature.d.ts +4 -4
  45. package/dist/src/bitgo/signature.d.ts.map +1 -1
  46. package/dist/src/bitgo/signature.js +24 -9
  47. package/dist/src/bitgo/transaction.d.ts +31 -3
  48. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  49. package/dist/src/bitgo/transaction.js +38 -16
  50. package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
  51. package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
  52. package/dist/src/bitgo/transactionAmounts.js +33 -0
  53. package/dist/src/bitgo/types.d.ts +9 -2
  54. package/dist/src/bitgo/types.d.ts.map +1 -1
  55. package/dist/src/bitgo/types.js +11 -2
  56. package/dist/src/bitgo/wallet/Psbt.d.ts +90 -26
  57. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  58. package/dist/src/bitgo/wallet/Psbt.js +241 -101
  59. package/dist/src/bitgo/wallet/Unspent.d.ts +43 -9
  60. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  61. package/dist/src/bitgo/wallet/Unspent.js +168 -74
  62. package/dist/src/bitgo/wallet/WalletKeys.d.ts +1 -1
  63. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
  64. package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
  65. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
  66. package/dist/src/bitgo/wallet/WalletOutput.js +68 -27
  67. package/dist/src/bitgo/wallet/WalletScripts.js +2 -2
  68. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
  69. package/dist/src/bitgo/wallet/chains.d.ts +2 -2
  70. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
  71. package/dist/src/bitgo/wallet/index.d.ts +2 -0
  72. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  73. package/dist/src/bitgo/wallet/index.js +8 -2
  74. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
  75. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
  76. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +87 -0
  77. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
  78. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
  79. package/dist/src/bitgo/wallet/psbt/RootNodes.js +125 -0
  80. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -1
  81. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  82. package/dist/src/bitgo/zcash/ZcashPsbt.js +8 -16
  83. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +1 -1
  84. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
  85. package/dist/src/bitgo/zcash/ZcashTransaction.js +15 -15
  86. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +4 -4
  87. package/dist/src/bitgo/zcash/address.js +3 -3
  88. package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -1
  89. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
  90. package/dist/src/bitgo/zcash/hashZip0244.js +3 -3
  91. package/dist/src/bitgo/zcash/index.js +6 -2
  92. package/dist/src/index.js +6 -2
  93. package/dist/src/networks.d.ts +2 -2
  94. package/dist/src/networks.d.ts.map +1 -1
  95. package/dist/src/networks.js +47 -1
  96. package/dist/src/noble_ecc.d.ts +7 -7
  97. package/dist/src/noble_ecc.d.ts.map +1 -1
  98. package/dist/src/noble_ecc.js +4 -4
  99. package/dist/src/testutil/index.d.ts +1 -0
  100. package/dist/src/testutil/index.d.ts.map +1 -1
  101. package/dist/src/testutil/index.js +7 -2
  102. package/dist/src/testutil/keys.d.ts +4 -1
  103. package/dist/src/testutil/keys.d.ts.map +1 -1
  104. package/dist/src/testutil/keys.js +18 -3
  105. package/dist/src/testutil/mock.d.ts +2 -2
  106. package/dist/src/testutil/mock.d.ts.map +1 -1
  107. package/dist/src/testutil/mock.js +25 -17
  108. package/dist/src/testutil/psbt.d.ts +38 -16
  109. package/dist/src/testutil/psbt.d.ts.map +1 -1
  110. package/dist/src/testutil/psbt.js +42 -31
  111. package/dist/src/testutil/transaction.d.ts +18 -7
  112. package/dist/src/testutil/transaction.d.ts.map +1 -1
  113. package/dist/src/testutil/transaction.js +27 -20
  114. package/dist/src/transaction_builder.d.ts.map +1 -1
  115. package/dist/src/transaction_builder.js +12 -17
  116. package/package.json +8 -8
@@ -1,14 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isTransactionWithKeyPathSpendInput = exports.musig2DeterministicSign = exports.createMusig2DeterministicNonce = exports.getSigHashTypeFromSigs = exports.assertPsbtMusig2Nonces = exports.assertPsbtMusig2Participants = exports.parsePsbtMusig2PartialSigs = exports.parsePsbtMusig2Nonces = exports.parsePsbtMusig2Participants = exports.createMusig2SigningSession = exports.musig2AggregateSigs = exports.musig2PartialSigVerify = exports.musig2PartialSign = exports.createTapTweak = exports.createAggregateNonce = exports.createTapOutputKey = exports.createTapInternalKey = exports.decodePsbtMusig2PartialSig = exports.decodePsbtMusig2Nonce = exports.decodePsbtMusig2Participants = exports.encodePsbtMusig2PartialSig = exports.encodePsbtMusig2PubNonce = exports.encodePsbtMusig2Participants = exports.Musig2NonceStore = void 0;
4
- const UtxoPsbt_1 = require("./UtxoPsbt");
3
+ exports.musig2DeterministicSign = exports.createMusig2DeterministicNonce = exports.getSigHashTypeFromSigs = exports.assertPsbtMusig2Nonces = exports.assertPsbtMusig2Participants = exports.parsePsbtMusig2PartialSigs = exports.parsePsbtMusig2Nonces = exports.parsePsbtMusig2Participants = exports.createMusig2SigningSession = exports.musig2AggregateSigs = exports.musig2PartialSigVerify = exports.musig2PartialSign = exports.createTapTweak = exports.createAggregateNonce = exports.createTapOutputKey = exports.createTapInternalKey = exports.decodePsbtMusig2PartialSig = exports.decodePsbtMusig2Nonce = exports.decodePsbtMusig2Participants = exports.encodePsbtMusig2PartialSig = exports.encodePsbtMusig2PubNonce = exports.encodePsbtMusig2Participants = exports.Musig2NonceStore = void 0;
5
4
  const outputScripts_1 = require("./outputScripts");
6
5
  const noble_ecc_1 = require("../noble_ecc");
7
6
  const taproot_1 = require("../taproot");
8
7
  const index_1 = require("../index");
9
- const UtxoTransaction_1 = require("./UtxoTransaction");
10
- const wallet_1 = require("./wallet");
11
- const parseInput_1 = require("./parseInput");
8
+ const PsbtUtil_1 = require("./PsbtUtil");
12
9
  /**
13
10
  * Because musig uses reference-equal buffers to cache nonces, we wrap it here to allow using
14
11
  * nonces that are byte-equal but not reference-equal.
@@ -56,11 +53,11 @@ exports.Musig2NonceStore = Musig2NonceStore;
56
53
  * @return x-only tapOutputKey||tapInternalKey as sub keydata, plain sigining participant keys as valuedata
57
54
  */
58
55
  function encodePsbtMusig2Participants(participants) {
59
- const keydata = [participants.tapOutputKey, participants.tapInternalKey].map((pubkey) => outputScripts_1.checkXOnlyPublicKey(pubkey));
60
- const value = participants.participantPubKeys.map((pubkey) => outputScripts_1.checkPlainPublicKey(pubkey));
56
+ const keydata = [participants.tapOutputKey, participants.tapInternalKey].map((pubkey) => (0, outputScripts_1.checkXOnlyPublicKey)(pubkey));
57
+ const value = participants.participantPubKeys.map((pubkey) => (0, outputScripts_1.checkPlainPublicKey)(pubkey));
61
58
  const key = {
62
- identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
63
- subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
59
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
60
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
64
61
  keydata: Buffer.concat(keydata),
65
62
  };
66
63
  return { key, value: Buffer.concat(value) };
@@ -76,12 +73,12 @@ function encodePsbtMusig2PubNonce(nonce) {
76
73
  throw new Error(`Invalid pubNonces length ${nonce.pubNonce.length}`);
77
74
  }
78
75
  const keydata = Buffer.concat([
79
- outputScripts_1.checkPlainPublicKey(nonce.participantPubKey),
80
- outputScripts_1.checkXOnlyPublicKey(nonce.tapOutputKey),
76
+ (0, outputScripts_1.checkPlainPublicKey)(nonce.participantPubKey),
77
+ (0, outputScripts_1.checkXOnlyPublicKey)(nonce.tapOutputKey),
81
78
  ]);
82
79
  const key = {
83
- identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
84
- subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
80
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
81
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
85
82
  keydata,
86
83
  };
87
84
  return { key, value: nonce.pubNonce };
@@ -92,12 +89,12 @@ function encodePsbtMusig2PartialSig(partialSig) {
92
89
  throw new Error(`Invalid partialSig length ${partialSig.partialSig.length}`);
93
90
  }
94
91
  const keydata = Buffer.concat([
95
- outputScripts_1.checkPlainPublicKey(partialSig.participantPubKey),
96
- outputScripts_1.checkXOnlyPublicKey(partialSig.tapOutputKey),
92
+ (0, outputScripts_1.checkPlainPublicKey)(partialSig.participantPubKey),
93
+ (0, outputScripts_1.checkXOnlyPublicKey)(partialSig.tapOutputKey),
97
94
  ]);
98
95
  const key = {
99
- identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
100
- subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
96
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
97
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
101
98
  keydata,
102
99
  };
103
100
  return { key, value: partialSig.partialSig };
@@ -108,8 +105,8 @@ exports.encodePsbtMusig2PartialSig = encodePsbtMusig2PartialSig;
108
105
  * @param kv
109
106
  */
110
107
  function decodePsbtMusig2Participants(kv) {
111
- if (kv.key.identifier !== UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER ||
112
- kv.key.subtype !== UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
108
+ if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
109
+ kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
113
110
  throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for participants pub keys`);
114
111
  }
115
112
  const key = kv.key.keydata;
@@ -132,7 +129,7 @@ exports.decodePsbtMusig2Participants = decodePsbtMusig2Participants;
132
129
  * @param kv
133
130
  */
134
131
  function decodePsbtMusig2Nonce(kv) {
135
- if (kv.key.identifier !== UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER || kv.key.subtype !== UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE) {
132
+ if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER || kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE) {
136
133
  throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for nonce`);
137
134
  }
138
135
  const key = kv.key.keydata;
@@ -151,8 +148,8 @@ exports.decodePsbtMusig2Nonce = decodePsbtMusig2Nonce;
151
148
  * @param kv
152
149
  */
153
150
  function decodePsbtMusig2PartialSig(kv) {
154
- if (kv.key.identifier !== UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER ||
155
- kv.key.subtype !== UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG) {
151
+ if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
152
+ kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG) {
156
153
  throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for partial sig`);
157
154
  }
158
155
  const key = kv.key.keydata;
@@ -171,7 +168,7 @@ function createTapInternalKey(plainPubKeys) {
171
168
  }
172
169
  exports.createTapInternalKey = createTapInternalKey;
173
170
  function createTapOutputKey(internalPubKey, tapTreeRoot) {
174
- return Buffer.from(taproot_1.tapTweakPubkey(noble_ecc_1.ecc, outputScripts_1.toXOnlyPublicKey(internalPubKey), outputScripts_1.checkTapMerkleRoot(tapTreeRoot)).xOnlyPubkey);
171
+ return Buffer.from((0, taproot_1.tapTweakPubkey)(noble_ecc_1.ecc, (0, outputScripts_1.toXOnlyPublicKey)(internalPubKey), (0, outputScripts_1.checkTapMerkleRoot)(tapTreeRoot)).xOnlyPubkey);
175
172
  }
176
173
  exports.createTapOutputKey = createTapOutputKey;
177
174
  function createAggregateNonce(pubNonces) {
@@ -179,14 +176,14 @@ function createAggregateNonce(pubNonces) {
179
176
  }
180
177
  exports.createAggregateNonce = createAggregateNonce;
181
178
  function createTapTweak(tapInternalKey, tapMerkleRoot) {
182
- return Buffer.from(taproot_1.calculateTapTweak(outputScripts_1.checkXOnlyPublicKey(tapInternalKey), outputScripts_1.checkTapMerkleRoot(tapMerkleRoot)));
179
+ return Buffer.from((0, taproot_1.calculateTapTweak)((0, outputScripts_1.checkXOnlyPublicKey)(tapInternalKey), (0, outputScripts_1.checkTapMerkleRoot)(tapMerkleRoot)));
183
180
  }
184
181
  exports.createTapTweak = createTapTweak;
185
182
  function startMusig2SigningSession(aggNonce, hash, publicKeys, tweak) {
186
183
  return noble_ecc_1.musig.startSigningSession(aggNonce, hash, publicKeys, { tweak, xOnly: true });
187
184
  }
188
185
  function musig2PartialSign(privateKey, publicNonce, sessionKey, nonceStore) {
189
- outputScripts_1.checkTxHash(Buffer.from(sessionKey.msg));
186
+ (0, outputScripts_1.checkTxHash)(Buffer.from(sessionKey.msg));
190
187
  return Buffer.from(noble_ecc_1.musig.partialSign({
191
188
  secretKey: privateKey,
192
189
  publicNonce: nonceStore.getRef(publicNonce),
@@ -195,7 +192,7 @@ function musig2PartialSign(privateKey, publicNonce, sessionKey, nonceStore) {
195
192
  }
196
193
  exports.musig2PartialSign = musig2PartialSign;
197
194
  function musig2PartialSigVerify(sig, publicKey, publicNonce, sessionKey) {
198
- outputScripts_1.checkTxHash(Buffer.from(sessionKey.msg));
195
+ (0, outputScripts_1.checkTxHash)(Buffer.from(sessionKey.msg));
199
196
  return noble_ecc_1.musig.partialVerify({ sig, publicKey, publicNonce, sessionKey });
200
197
  }
201
198
  exports.musig2PartialSigVerify = musig2PartialSigVerify;
@@ -205,7 +202,7 @@ function musig2AggregateSigs(sigs, sessionKey) {
205
202
  exports.musig2AggregateSigs = musig2AggregateSigs;
206
203
  /** @return session key that can be used to reference the session later */
207
204
  function createMusig2SigningSession(sessionArgs) {
208
- outputScripts_1.checkTxHash(sessionArgs.txHash);
205
+ (0, outputScripts_1.checkTxHash)(sessionArgs.txHash);
209
206
  const aggNonce = createAggregateNonce(sessionArgs.pubNonces);
210
207
  const tweak = createTapTweak(sessionArgs.internalPubKey, sessionArgs.tapTreeRoot);
211
208
  return startMusig2SigningSession(aggNonce, sessionArgs.txHash, sessionArgs.pubKeys, tweak);
@@ -215,10 +212,10 @@ exports.createMusig2SigningSession = createMusig2SigningSession;
215
212
  * @returns psbt proprietary key for musig2 participant key value data
216
213
  * If no key value exists, undefined is returned.
217
214
  */
218
- function parsePsbtMusig2Participants(psbt, inputIndex) {
219
- const participantsKeyVals = psbt.getProprietaryKeyVals(inputIndex, {
220
- identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
221
- subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
215
+ function parsePsbtMusig2Participants(input) {
216
+ const participantsKeyVals = (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, {
217
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
218
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
222
219
  });
223
220
  if (!participantsKeyVals.length) {
224
221
  return undefined;
@@ -233,10 +230,10 @@ exports.parsePsbtMusig2Participants = parsePsbtMusig2Participants;
233
230
  * @returns psbt proprietary key for musig2 public nonce key value data
234
231
  * If no key value exists, undefined is returned.
235
232
  */
236
- function parsePsbtMusig2Nonces(psbt, inputIndex) {
237
- const nonceKeyVals = psbt.getProprietaryKeyVals(inputIndex, {
238
- identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
239
- subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
233
+ function parsePsbtMusig2Nonces(input) {
234
+ const nonceKeyVals = (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, {
235
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
236
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
240
237
  });
241
238
  if (!nonceKeyVals.length) {
242
239
  return undefined;
@@ -251,10 +248,10 @@ exports.parsePsbtMusig2Nonces = parsePsbtMusig2Nonces;
251
248
  * @returns psbt proprietary key for musig2 partial sig key value data
252
249
  * If no key value exists, undefined is returned.
253
250
  */
254
- function parsePsbtMusig2PartialSigs(psbt, inputIndex) {
255
- const sigKeyVals = psbt.getProprietaryKeyVals(inputIndex, {
256
- identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
257
- subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
251
+ function parsePsbtMusig2PartialSigs(input) {
252
+ const sigKeyVals = (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, {
253
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
254
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
258
255
  });
259
256
  if (!sigKeyVals.length) {
260
257
  return undefined;
@@ -272,8 +269,8 @@ exports.parsePsbtMusig2PartialSigs = parsePsbtMusig2PartialSigs;
272
269
  * the tapOutputKey is validated.
273
270
  */
274
271
  function assertPsbtMusig2Participants(participantKeyValData, tapInternalKey, tapMerkleRoot) {
275
- outputScripts_1.checkXOnlyPublicKey(tapInternalKey);
276
- outputScripts_1.checkTapMerkleRoot(tapMerkleRoot);
272
+ (0, outputScripts_1.checkXOnlyPublicKey)(tapInternalKey);
273
+ (0, outputScripts_1.checkTapMerkleRoot)(tapMerkleRoot);
277
274
  const participantPubKeys = participantKeyValData.participantPubKeys;
278
275
  const internalKey = createTapInternalKey(participantPubKeys);
279
276
  if (!internalKey.equals(participantKeyValData.tapInternalKey)) {
@@ -296,8 +293,8 @@ exports.assertPsbtMusig2Participants = assertPsbtMusig2Participants;
296
293
  * Checks against participant keys and tapOutputKey
297
294
  */
298
295
  function assertPsbtMusig2Nonces(noncesKeyValData, participantKeyValData) {
299
- outputScripts_1.checkXOnlyPublicKey(participantKeyValData.tapOutputKey);
300
- participantKeyValData.participantPubKeys.forEach((kv) => outputScripts_1.checkPlainPublicKey(kv));
296
+ (0, outputScripts_1.checkXOnlyPublicKey)(participantKeyValData.tapOutputKey);
297
+ participantKeyValData.participantPubKeys.forEach((kv) => (0, outputScripts_1.checkPlainPublicKey)(kv));
301
298
  if (participantKeyValData.participantPubKeys[0].equals(participantKeyValData.participantPubKeys[1])) {
302
299
  throw new Error(`Duplicate participant pub keys found`);
303
300
  }
@@ -357,26 +354,4 @@ function musig2DeterministicSign(params) {
357
354
  return { sig: Buffer.from(sig), sessionKey, publicNonce: Buffer.from(publicNonce) };
358
355
  }
359
356
  exports.musig2DeterministicSign = musig2DeterministicSign;
360
- /**
361
- * @returns true iff given psbt/transaction/tx-input-array contains at least one taproot key path spend input
362
- */
363
- function isTransactionWithKeyPathSpendInput(data) {
364
- if (data instanceof UtxoPsbt_1.UtxoPsbt) {
365
- return data.data.inputs.some((_, inputIndex) => {
366
- const parsedInput = wallet_1.parsePsbtInput(data, inputIndex);
367
- return (parsedInput === null || parsedInput === void 0 ? void 0 : parsedInput.scriptType) === 'taprootKeyPathSpend';
368
- });
369
- }
370
- const inputs = data instanceof UtxoTransaction_1.UtxoTransaction ? data.ins : data;
371
- return inputs.some((input, inputIndex) => {
372
- // If the input is not signed, it cannot be a taprootKeyPathSpend input because you can only
373
- // extract a fully signed psbt into a transaction with taprootKeyPathSpend inputs.
374
- if (wallet_1.getSignatureCount(data, inputIndex) === 0) {
375
- return false;
376
- }
377
- const parsedInput = parseInput_1.parseSignatureScript(input);
378
- return (parsedInput === null || parsedInput === void 0 ? void 0 : parsedInput.scriptType) === 'taprootKeyPathSpend';
379
- });
380
- }
381
- exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx5Q0FBK0c7QUFDL0csbURBTXlCO0FBQ3pCLDRDQUEwQztBQUUxQyx3Q0FBK0Q7QUFDL0Qsb0NBQXVDO0FBQ3ZDLHVEQUFvRDtBQUNwRCxxQ0FBNkQ7QUFDN0QsNkNBQW9EO0FBc0NwRDs7O0dBR0c7QUFDSCxNQUFhLGdCQUFnQjtJQUE3QjtRQUNVLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBd0NwQyxDQUFDO0lBdENDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDVjtTQUNGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0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QUFDLENBQUM7WUFDckQsT0FBTyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLE1BQUsscUJBQXFCLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxpQ0FBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQ3ZDLDRGQUE0RjtRQUM1RixrRkFBa0Y7UUFDbEYsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLFdBQVcsR0FBRyxpQ0FBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFVBQVUsTUFBSyxxQkFBcUIsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFuQkQsZ0ZBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHhJbnB1dCB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgU2Vzc2lvbktleSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuXG5pbXBvcnQgeyBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsIFByb3ByaWV0YXJ5S2V5VmFsdWUsIFV0eG9Qc2J0LCBQcm9wcmlldGFyeUtleVN1YnR5cGUgfSBmcm9tICcuL1V0eG9Qc2J0JztcbmltcG9ydCB7XG4gIGNoZWNrUGxhaW5QdWJsaWNLZXksXG4gIGNoZWNrVGFwTWVya2xlUm9vdCxcbiAgY2hlY2tUeEhhc2gsXG4gIGNoZWNrWE9ubHlQdWJsaWNLZXksXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBlY2MsIG11c2lnIH0gZnJvbSAnLi4vbm9ibGVfZWNjJztcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVUYXBUd2VhaywgdGFwVHdlYWtQdWJrZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0U2lnbmF0dXJlQ291bnQsIHBhcnNlUHNidElucHV0IH0gZnJvbSAnLi93YWxsZXQnO1xuaW1wb3J0IHsgcGFyc2VTaWduYXR1cmVTY3JpcHQgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuXG4vKipcbiAqICBQYXJ0aWNpcGFudCBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcjtcbiAgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zIHtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuICBvdGhlck5vbmNlOiBCdWZmZXI7XG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj47XG4gIGludGVybmFsUHViS2V5OiBCdWZmZXI7XG4gIHRhcFRyZWVSb290OiBCdWZmZXI7XG4gIGhhc2g6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgTm9uY2Uga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcHViTm9uY2U6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgUGFydGlhbCBzaWduYXR1cmUga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUGFydGlhbFNpZyB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwYXJ0aWFsU2lnOiBCdWZmZXI7XG59XG5cbi8qKlxuICogQmVjYXVzZSBtdXNpZyB1c2VzIHJlZmVyZW5jZS1lcXVhbCBidWZmZXJzIHRvIGNhY2hlIG5vbmNlcywgd2Ugd3JhcCBpdCBoZXJlIHRvIGFsbG93IHVzaW5nXG4gKiBub25jZXMgdGhhdCBhcmUgYnl0ZS1lcXVhbCBidXQgbm90IHJlZmVyZW5jZS1lcXVhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11c2lnMk5vbmNlU3RvcmUge1xuICBwcml2YXRlIG5vbmNlczogVWludDhBcnJheVtdID0gW107XG5cbiAgLyoqXG4gICAqIEdldCBvcmlnaW5hbCBCdWZmZXIgaW5zdGFuY2UgZm9yIG5vbmNlICh3aGljaCBtYXkgYmUgYSBjb3B5KS5cbiAgICogQHJldHVybiBieXRlLWVxdWFsIGJ1ZmZlciB0aGF0IGlzIHJlZmVyZW5jZS1lcXVhbCB0byB3aGF0IHdhcyBzdG9yZWQgZWFybGllciBpbiBjcmVhdGVNdXNpZzJOb25jZVxuICAgKi9cbiAgZ2V0UmVmKG5vbmNlOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMubm9uY2VzKSB7XG4gICAgICBpZiAoQnVmZmVyLmZyb20oYikuZXF1YWxzKG5vbmNlKSkge1xuICAgICAgICByZXR1cm4gYjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG5vbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBtdXNpZzIgbm9uY2UgYW5kIHN0b3JlcyBidWZmZXIgcmVmZXJlbmNlLlxuICAgKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAgICogQWxzbyBwYXJ0aWNpcGFudCBrZXlzIGFyZSByZXF1aXJlZCBmcm9tIHBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IC0gc2lnbmVyIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBzaWduZXIgeHkgcHVibGljIGtleVxuICAgKiBAcGFyYW0geE9ubHlQdWJsaWNLZXkgLSB0d2Vha2VkIGFnZ3JlZ2F0ZWQga2V5ICh0YXBPdXRwdXRLZXkpXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQWRkaXRpb25hbCBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBjcmVhdGVNdXNpZzJOb25jZShcbiAgICBwcml2YXRlS2V5OiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB4T25seVB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB0eEhhc2g6IFVpbnQ4QXJyYXksXG4gICAgc2Vzc2lvbklkPzogQnVmZmVyXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICh0eEhhc2gubGVuZ3RoICE9IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHhIYXNoIHNpemUgJHt0eEhhc2h9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZiA9IG11c2lnLm5vbmNlR2VuKHsgc2VjcmV0S2V5OiBwcml2YXRlS2V5LCBwdWJsaWNLZXksIHhPbmx5UHVibGljS2V5LCBtc2c6IHR4SGFzaCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMubm9uY2VzLnB1c2goYnVmKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5cy4gU3ViVHlwZSBpcyAweDAxXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4geC1vbmx5IHRhcE91dHB1dEtleXx8dGFwSW50ZXJuYWxLZXkgYXMgc3ViIGtleWRhdGEsIHBsYWluIHNpZ2luaW5nIHBhcnRpY2lwYW50IGtleXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cyk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBjb25zdCBrZXlkYXRhID0gW3BhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50cy50YXBJbnRlcm5hbEtleV0ubWFwKChwdWJrZXkpID0+IGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KSk7XG4gIGNvbnN0IHZhbHVlID0gcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cy5tYXAoKHB1YmtleSkgPT4gY2hlY2tQbGFpblB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgIGtleWRhdGE6IEJ1ZmZlci5jb25jYXQoa2V5ZGF0YSksXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IEJ1ZmZlci5jb25jYXQodmFsdWUpIH07XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHB1YiBub25jZS4gU3ViVHlwZSBpcyAweDAyXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4gcGxhaW4tcGFydGljaXBhbnRQdWJLZXl8fHgtb25seS10YXBPdXRwdXRLZXkgYXMgc3ViIGtleWRhdGEsIDY2IGJ5dGVzIG9mIDIgcHViIG5vbmNlcyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZShub25jZTogUHNidE11c2lnMlB1Yk5vbmNlKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChub25jZS5wdWJOb25jZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1Yk5vbmNlcyBsZW5ndGggJHtub25jZS5wdWJOb25jZS5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkobm9uY2UucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkobm9uY2UudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2UucHViTm9uY2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHBhcnRpYWxTaWc6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMiAmJiBwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJ0aWFsU2lnIGxlbmd0aCAke3BhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkocGFydGlhbFNpZy5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWFsU2lnLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcGFydGlhbFNpZy5wYXJ0aWFsU2lnIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBub25jZVxuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyTm9uY2Uoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBpZiAoa3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fCBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBub25jZWApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpY2lwYW50UHViS2V5OiBrZXkuc3ViYXJyYXkoMCwgMzMpLCB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgzMyksIHB1Yk5vbmNlOiB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZ1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJR1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDMyICYmIHZhbHVlLmxlbmd0aCAhPT0gMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGljaXBhbnRQdWJLZXk6IGtleS5zdWJhcnJheSgwLCAzMyksIHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDMzKSwgcGFydGlhbFNpZzogdmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcEludGVybmFsS2V5KHBsYWluUHViS2V5czogQnVmZmVyW10pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuZ2V0WE9ubHlQdWJrZXkobXVzaWcua2V5QWdnKHBsYWluUHViS2V5cykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbFB1YktleTogQnVmZmVyLCB0YXBUcmVlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIHRhcFR3ZWFrUHVia2V5KGVjYywgdG9YT25seVB1YmxpY0tleShpbnRlcm5hbFB1YktleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBUcmVlUm9vdCkpLnhPbmx5UHVia2V5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGVOb25jZShwdWJOb25jZXM6IFR1cGxlPEJ1ZmZlcj4pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcubm9uY2VBZ2cocHViTm9uY2VzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBUd2Vhayh0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2FsY3VsYXRlVGFwVHdlYWsoY2hlY2tYT25seVB1YmxpY0tleSh0YXBJbnRlcm5hbEtleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBNZXJrbGVSb290KSkpO1xufVxuXG5mdW5jdGlvbiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKFxuICBhZ2dOb25jZTogQnVmZmVyLFxuICBoYXNoOiBCdWZmZXIsXG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj4sXG4gIHR3ZWFrOiBCdWZmZXJcbik6IFNlc3Npb25LZXkge1xuICByZXR1cm4gbXVzaWcuc3RhcnRTaWduaW5nU2Vzc2lvbihhZ2dOb25jZSwgaGFzaCwgcHVibGljS2V5cywgeyB0d2VhaywgeE9ubHk6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnbihcbiAgcHJpdmF0ZUtleTogQnVmZmVyLFxuICBwdWJsaWNOb25jZTogVWludDhBcnJheSxcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleSxcbiAgbm9uY2VTdG9yZTogTXVzaWcyTm9uY2VTdG9yZVxuKTogQnVmZmVyIHtcbiAgY2hlY2tUeEhhc2goQnVmZmVyLmZyb20oc2Vzc2lvbktleS5tc2cpKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIG11c2lnLnBhcnRpYWxTaWduKHtcbiAgICAgIHNlY3JldEtleTogcHJpdmF0ZUtleSxcbiAgICAgIHB1YmxpY05vbmNlOiBub25jZVN0b3JlLmdldFJlZihwdWJsaWNOb25jZSksXG4gICAgICBzZXNzaW9uS2V5LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5KFxuICBzaWc6IEJ1ZmZlcixcbiAgcHVibGljS2V5OiBCdWZmZXIsXG4gIHB1YmxpY05vbmNlOiBCdWZmZXIsXG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXlcbik6IGJvb2xlYW4ge1xuICBjaGVja1R4SGFzaChCdWZmZXIuZnJvbShzZXNzaW9uS2V5Lm1zZykpO1xuICByZXR1cm4gbXVzaWcucGFydGlhbFZlcmlmeSh7IHNpZywgcHVibGljS2V5LCBwdWJsaWNOb25jZSwgc2Vzc2lvbktleSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkFnZ3JlZ2F0ZVNpZ3Moc2lnczogQnVmZmVyW10sIHNlc3Npb25LZXk6IFNlc3Npb25LZXkpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuc2lnbkFnZyhzaWdzLCBzZXNzaW9uS2V5KSk7XG59XG5cbi8qKiBAcmV0dXJuIHNlc3Npb24ga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzZXNzaW9uIGxhdGVyICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oc2Vzc2lvbkFyZ3M6IHtcbiAgcHViTm9uY2VzOiBUdXBsZTxCdWZmZXI+O1xuICB0eEhhc2g6IEJ1ZmZlcjtcbiAgcHViS2V5czogVHVwbGU8QnVmZmVyPjtcbiAgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwVHJlZVJvb3Q6IEJ1ZmZlcjtcbn0pOiBTZXNzaW9uS2V5IHtcbiAgY2hlY2tUeEhhc2goc2Vzc2lvbkFyZ3MudHhIYXNoKTtcbiAgY29uc3QgYWdnTm9uY2UgPSBjcmVhdGVBZ2dyZWdhdGVOb25jZShzZXNzaW9uQXJncy5wdWJOb25jZXMpO1xuICBjb25zdCB0d2VhayA9IGNyZWF0ZVRhcFR3ZWFrKHNlc3Npb25BcmdzLmludGVybmFsUHViS2V5LCBzZXNzaW9uQXJncy50YXBUcmVlUm9vdCk7XG4gIHJldHVybiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKGFnZ05vbmNlLCBzZXNzaW9uQXJncy50eEhhc2gsIHNlc3Npb25BcmdzLnB1YktleXMsIHR3ZWFrKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICB9KTtcblxuICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7cGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50c0tleVZhbHNbMF0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcHVibGljIG5vbmNlIGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJOb25jZXMocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQdWJOb25jZVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9uY2VLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgfSk7XG5cbiAgaWYgKCFub25jZUtleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChub25jZUtleVZhbHMubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtub25jZUtleVZhbHMubGVuZ3RofSBtYXRjaGluZyBub25jZSBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxIG9yIDJgKTtcbiAgfVxuXG4gIHJldHVybiBub25jZUtleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMk5vbmNlKGt2KSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZyBrZXkgdmFsdWUgZGF0YVxuICogSWYgbm8ga2V5IHZhbHVlIGV4aXN0cywgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBzaWdLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICB9KTtcblxuICBpZiAoIXNpZ0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzaWdLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7c2lnS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpYWwgc2lnbmF0dXJlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDEgb3IgMmApO1xuICB9XG5cbiAgcmV0dXJuIHNpZ0tleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoa3YpKTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhIHdpdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QuXG4gKiA8dGFwT3V0cHV0S2V5Pjx0YXBJbnB1dEtleT4gPT4gPHBhcnRpY2lwYW50S2V5MT48cGFydGljaXBhbnRLZXkyPlxuICogVXNpbmcgdGFwTWVya2xlUm9vdCBhbmQgMiBwYXJ0aWNpcGFudCBrZXlzLCB0aGUgdGFwSW5wdXRLZXkgaXMgdmFsaWRhdGVkIGFuZCB1c2luZyB0YXBNZXJrbGVSb290IGFuZCB0YXBJbnB1dEtleSxcbiAqIHRoZSB0YXBPdXRwdXRLZXkgaXMgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyLFxuICB0YXBNZXJrbGVSb290OiBCdWZmZXJcbik6IHZvaWQge1xuICBjaGVja1hPbmx5UHVibGljS2V5KHRhcEludGVybmFsS2V5KTtcbiAgY2hlY2tUYXBNZXJrbGVSb290KHRhcE1lcmtsZVJvb3QpO1xuXG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgaW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlkYXRhIHRhcEludGVybmFsS2V5Jyk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRLZXkgPSBjcmVhdGVUYXBPdXRwdXRLZXkoaW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICBpZiAoIW91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gIH1cblxuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyh0YXBJbnRlcm5hbEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGFuZCBhZ2dyZWdhdGVkIHBhcnRpY2lwYW50IHB1YiBrZXlzIGRvZXMgbm90IG1hdGNoJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHB1YmxpYyBub25jZSBrZXkgdmFsdWUgZGF0YSB3aXRoIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiAocmVmZXIgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEpLlxuICogPHBhcnRpY2lwYW50S2V5MT48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UxPlxuICogPHBhcnRpY2lwYW50S2V5Mj48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UyPlxuICogQ2hlY2tzIGFnYWluc3QgcGFydGljaXBhbnQga2V5cyBhbmQgdGFwT3V0cHV0S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKFxuICBub25jZXNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUHViTm9uY2VbXSxcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzXG4pOiB2b2lkIHtcbiAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KTtcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5mb3JFYWNoKChrdikgPT4gY2hlY2tQbGFpblB1YmxpY0tleShrdikpO1xuICBpZiAocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBwYXJ0aWNpcGFudCBwdWIga2V5cyBmb3VuZGApO1xuICB9XG5cbiAgaWYgKG5vbmNlc0tleVZhbERhdGEubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub25jZSBrZXkgdmFsdWUgY291bnQgJHtub25jZXNLZXlWYWxEYXRhLmxlbmd0aH1gKTtcbiAgfVxuXG4gIG5vbmNlc0tleVZhbERhdGEuZm9yRWFjaCgobm9uY2VLdikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5maW5kSW5kZXgoKHB1YktleSkgPT5cbiAgICAgIG5vbmNlS3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YktleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBub25jZSBrZXlkYXRhIHBhcnRpY2lwYW50IHB1YiBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vbmNlS3YudGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5vbmNlIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBJbnB1dCBvYmplY3QgYnV0IHNpZyBoYXNoIHR5cGUgZGF0YSBpcyB0YWtlbiBvdXQgZnJvbSBwYXJ0aWFsU2lnIGZpZWxkLlxuICogSWYgc2lnIGhhc2ggdHlwZSBpcyBub3QgY29tbW9uIGZvciBhbGwgc2lncywgZXJyb3Igb3V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCBzaW5nbGUgaGFzaCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lnczogUHNidE11c2lnMlBhcnRpYWxTaWdbXSk6IHtcbiAgcGFydGlhbFNpZ3M6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW107XG4gIHNpZ0hhc2hUeXBlOiBudW1iZXI7XG59IHtcbiAgaWYgKCFwYXJ0aWFsU2lncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpYWxTaWdzIGFycmF5IGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBjb25zdCBwU2lnc1dpdGhIYXNoVHlwZSA9IHBhcnRpYWxTaWdzLm1hcCgoa3YpID0+IHtcbiAgICBjb25zdCB7IHBhcnRpYWxTaWcsIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSA9IGt2O1xuICAgIHJldHVybiBwYXJ0aWFsU2lnLmxlbmd0aCA9PT0gMzNcbiAgICAgID8geyBwU2lnOiB7IHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcuc2xpY2UoMCwgMzIpLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBwYXJ0aWFsU2lnWzMyXSB9XG4gICAgICA6IHsgcFNpZzogeyBwYXJ0aWFsU2lnLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgfTtcbiAgfSk7XG5cbiAgY29uc3Qgc2lnSGFzaFR5cGUgPSBwU2lnc1dpdGhIYXNoVHlwZVswXS5zaWdIYXNoVHlwZTtcbiAgaWYgKCFwU2lnc1dpdGhIYXNoVHlwZS5ldmVyeSgocFNpZykgPT4gcFNpZy5zaWdIYXNoVHlwZSA9PT0gc2lnSGFzaFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG11c3QgdXNlIHNhbWUgc2lnIGhhc2ggdHlwZScpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGlhbFNpZ3M6IHBTaWdzV2l0aEhhc2hUeXBlLm1hcCgoeyBwU2lnIH0pID0+IHBTaWcpLCBzaWdIYXNoVHlwZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgbXVzaWcuZGV0ZXJtaW5pc3RpY05vbmNlR2VuKHtcbiAgICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgICBhZ2dPdGhlck5vbmNlOiBtdXNpZy5ub25jZUFnZyhbcGFyYW1zLm90aGVyTm9uY2VdKSxcbiAgICAgIHB1YmxpY0tleXM6IHBhcmFtcy5wdWJsaWNLZXlzLFxuICAgICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICAgIG1zZzogcGFyYW1zLmhhc2gsXG4gICAgfSkucHVibGljTm9uY2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkRldGVybWluaXN0aWNTaWduKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiB7XG4gIHNpZzogQnVmZmVyO1xuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5O1xuICBwdWJsaWNOb25jZTogQnVmZmVyO1xufSB7XG4gIGNvbnN0IHsgc2lnLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZSB9ID0gbXVzaWcuZGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgYWdnT3RoZXJOb25jZTogbXVzaWcubm9uY2VBZ2coW3BhcmFtcy5vdGhlck5vbmNlXSksXG4gICAgcHVibGljS2V5czogcGFyYW1zLnB1YmxpY0tleXMsXG4gICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICBtc2c6IHBhcmFtcy5oYXNoLFxuICB9KTtcbiAgcmV0dXJuIHsgc2lnOiBCdWZmZXIuZnJvbShzaWcpLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZTogQnVmZmVyLmZyb20ocHVibGljTm9uY2UpIH07XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZmYgZ2l2ZW4gcHNidC90cmFuc2FjdGlvbi90eC1pbnB1dC1hcnJheSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dChcbiAgZGF0YTogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248YmlnaW50IHwgbnVtYmVyPiB8IFR4SW5wdXRbXVxuKTogYm9vbGVhbiB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVXR4b1BzYnQpIHtcbiAgICByZXR1cm4gZGF0YS5kYXRhLmlucHV0cy5zb21lKChfLCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlUHNidElucHV0KGRhdGEsIGlucHV0SW5kZXgpO1xuICAgICAgcmV0dXJuIHBhcnNlZElucHV0Py5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgaW5wdXRzID0gZGF0YSBpbnN0YW5jZW9mIFV0eG9UcmFuc2FjdGlvbiA/IGRhdGEuaW5zIDogZGF0YTtcbiAgcmV0dXJuIGlucHV0cy5zb21lKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBub3Qgc2lnbmVkLCBpdCBjYW5ub3QgYmUgYSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0IGJlY2F1c2UgeW91IGNhbiBvbmx5XG4gICAgLy8gZXh0cmFjdCBhIGZ1bGx5IHNpZ25lZCBwc2J0IGludG8gYSB0cmFuc2FjdGlvbiB3aXRoIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzLlxuICAgIGlmIChnZXRTaWduYXR1cmVDb3VudChkYXRhLCBpbnB1dEluZGV4KSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KGlucHV0KTtcbiAgICByZXR1cm4gcGFyc2VkSW5wdXQ/LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJztcbiAgfSk7XG59XG4iXX0=
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxtREFNeUI7QUFDekIsNENBQTBDO0FBRTFDLHdDQUErRDtBQUMvRCxvQ0FBdUM7QUFFdkMseUNBS29CO0FBc0NwQjs7O0dBR0c7QUFDSCxNQUFhLGdCQUFnQjtJQUE3QjtRQUNVLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBd0NwQyxDQUFDO0lBdENDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDVjtTQUNGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQXpDRCw0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QUFLLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzRixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDakIsQ0FBQyxDQUFDLFdBQVcsQ0FDZixDQUFDO0FBQ0osQ0FBQztBQVZELHdFQVVDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMsTUFBcUM7SUFLM0UsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsaUJBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUMvRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDNUIsYUFBYSxFQUFFLGlCQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtRQUM3QixNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNGLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNqQixDQUFDLENBQUM7SUFDSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7QUFDdEYsQ0FBQztBQWJELDBEQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2Vzc2lvbktleSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuXG5pbXBvcnQge1xuICBjaGVja1BsYWluUHVibGljS2V5LFxuICBjaGVja1RhcE1lcmtsZVJvb3QsXG4gIGNoZWNrVHhIYXNoLFxuICBjaGVja1hPbmx5UHVibGljS2V5LFxuICB0b1hPbmx5UHVibGljS2V5LFxufSBmcm9tICcuL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgZWNjLCBtdXNpZyB9IGZyb20gJy4uL25vYmxlX2VjYyc7XG5pbXBvcnQgeyBUdXBsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY2FsY3VsYXRlVGFwVHdlYWssIHRhcFR3ZWFrUHVia2V5IH0gZnJvbSAnLi4vdGFwcm9vdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IFBzYnRJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzLFxuICBQcm9wcmlldGFyeUtleVN1YnR5cGUsXG4gIFByb3ByaWV0YXJ5S2V5VmFsdWUsXG4gIFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbn0gZnJvbSAnLi9Qc2J0VXRpbCc7XG5cbi8qKlxuICogIFBhcnRpY2lwYW50IGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMlBhcnRpY2lwYW50cyB7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyO1xuICBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMge1xuICBwcml2YXRlS2V5OiBCdWZmZXI7XG4gIG90aGVyTm9uY2U6IEJ1ZmZlcjtcbiAgcHVibGljS2V5czogVHVwbGU8QnVmZmVyPjtcbiAgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwVHJlZVJvb3Q6IEJ1ZmZlcjtcbiAgaGFzaDogQnVmZmVyO1xufVxuXG4vKipcbiAqICBOb25jZSBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQdWJOb25jZSB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwdWJOb25jZTogQnVmZmVyO1xufVxuXG4vKipcbiAqICBQYXJ0aWFsIHNpZ25hdHVyZSBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWFsU2lnIHtcbiAgcGFydGljaXBhbnRQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwT3V0cHV0S2V5OiBCdWZmZXI7XG4gIHBhcnRpYWxTaWc6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBCZWNhdXNlIG11c2lnIHVzZXMgcmVmZXJlbmNlLWVxdWFsIGJ1ZmZlcnMgdG8gY2FjaGUgbm9uY2VzLCB3ZSB3cmFwIGl0IGhlcmUgdG8gYWxsb3cgdXNpbmdcbiAqIG5vbmNlcyB0aGF0IGFyZSBieXRlLWVxdWFsIGJ1dCBub3QgcmVmZXJlbmNlLWVxdWFsLlxuICovXG5leHBvcnQgY2xhc3MgTXVzaWcyTm9uY2VTdG9yZSB7XG4gIHByaXZhdGUgbm9uY2VzOiBVaW50OEFycmF5W10gPSBbXTtcblxuICAvKipcbiAgICogR2V0IG9yaWdpbmFsIEJ1ZmZlciBpbnN0YW5jZSBmb3Igbm9uY2UgKHdoaWNoIG1heSBiZSBhIGNvcHkpLlxuICAgKiBAcmV0dXJuIGJ5dGUtZXF1YWwgYnVmZmVyIHRoYXQgaXMgcmVmZXJlbmNlLWVxdWFsIHRvIHdoYXQgd2FzIHN0b3JlZCBlYXJsaWVyIGluIGNyZWF0ZU11c2lnMk5vbmNlXG4gICAqL1xuICBnZXRSZWYobm9uY2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5ub25jZXMpIHtcbiAgICAgIGlmIChCdWZmZXIuZnJvbShiKS5lcXVhbHMobm9uY2UpKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbm9uY2VgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG11c2lnMiBub25jZSBhbmQgc3RvcmVzIGJ1ZmZlciByZWZlcmVuY2UuXG4gICAqIHRhcEludGVybmFsa2V5LCB0YXBNZXJrbGVSb290LCB0YXBCaXAzMkRlcml2YXRpb24gZm9yIHJvb3RXYWxsZXRLZXkgYXJlIHJlcXVpcmVkIHBlciBwMnRyTXVzaWcyIGtleSBwYXRoIGlucHV0LlxuICAgKiBBbHNvIHBhcnRpY2lwYW50IGtleXMgYXJlIHJlcXVpcmVkIGZyb20gcHNidCBwcm9wcmlldGFyeSBrZXkgdmFsdWVzLlxuICAgKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAgICogQHBhcmFtIHByaXZhdGVLZXkgLSBzaWduZXIgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHB1YmxpY0tleSAtIHNpZ25lciB4eSBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB4T25seVB1YmxpY0tleSAtIHR3ZWFrZWQgYWdncmVnYXRlZCBrZXkgKHRhcE91dHB1dEtleSlcbiAgICogQHBhcmFtIHNlc3Npb25JZCBBZGRpdGlvbmFsIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIGNyZWF0ZU11c2lnMk5vbmNlKFxuICAgIHByaXZhdGVLZXk6IFVpbnQ4QXJyYXksXG4gICAgcHVibGljS2V5OiBVaW50OEFycmF5LFxuICAgIHhPbmx5UHVibGljS2V5OiBVaW50OEFycmF5LFxuICAgIHR4SGFzaDogVWludDhBcnJheSxcbiAgICBzZXNzaW9uSWQ/OiBCdWZmZXJcbiAgKTogVWludDhBcnJheSB7XG4gICAgaWYgKHR4SGFzaC5sZW5ndGggIT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eEhhc2ggc2l6ZSAke3R4SGFzaH1gKTtcbiAgICB9XG4gICAgY29uc3QgYnVmID0gbXVzaWcubm9uY2VHZW4oeyBzZWNyZXRLZXk6IHByaXZhdGVLZXksIHB1YmxpY0tleSwgeE9ubHlQdWJsaWNLZXksIG1zZzogdHhIYXNoLCBzZXNzaW9uSWQgfSk7XG4gICAgdGhpcy5ub25jZXMucHVzaChidWYpO1xuICAgIHJldHVybiBidWY7XG4gIH1cbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcGFydGljaXBhbnRzIHB1YiBrZXlzLiBTdWJUeXBlIGlzIDB4MDFcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiB4LW9ubHkgdGFwT3V0cHV0S2V5fHx0YXBJbnRlcm5hbEtleSBhcyBzdWIga2V5ZGF0YSwgcGxhaW4gc2lnaW5pbmcgcGFydGljaXBhbnQga2V5cyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGNvbnN0IGtleWRhdGEgPSBbcGFydGljaXBhbnRzLnRhcE91dHB1dEtleSwgcGFydGljaXBhbnRzLnRhcEludGVybmFsS2V5XS5tYXAoKHB1YmtleSkgPT4gY2hlY2tYT25seVB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3QgdmFsdWUgPSBwYXJ0aWNpcGFudHMucGFydGljaXBhbnRQdWJLZXlzLm1hcCgocHVia2V5KSA9PiBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSkpO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAga2V5ZGF0YTogQnVmZmVyLmNvbmNhdChrZXlkYXRhKSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogQnVmZmVyLmNvbmNhdCh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcHViIG5vbmNlLiBTdWJUeXBlIGlzIDB4MDJcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiBwbGFpbi1wYXJ0aWNpcGFudFB1YktleXx8eC1vbmx5LXRhcE91dHB1dEtleSBhcyBzdWIga2V5ZGF0YSwgNjYgYnl0ZXMgb2YgMiBwdWIgbm9uY2VzIGFzIHZhbHVlZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlKG5vbmNlOiBQc2J0TXVzaWcyUHViTm9uY2UpOiBQcm9wcmlldGFyeUtleVZhbHVlIHtcbiAgaWYgKG5vbmNlLnB1Yk5vbmNlLmxlbmd0aCAhPT0gNjYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHViTm9uY2VzIGxlbmd0aCAke25vbmNlLnB1Yk5vbmNlLmxlbmd0aH1gKTtcbiAgfVxuICBjb25zdCBrZXlkYXRhID0gQnVmZmVyLmNvbmNhdChbXG4gICAgY2hlY2tQbGFpblB1YmxpY0tleShub25jZS5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShub25jZS50YXBPdXRwdXRLZXkpLFxuICBdKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICBrZXlkYXRhLFxuICB9O1xuICByZXR1cm4geyBrZXksIHZhbHVlOiBub25jZS5wdWJOb25jZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUHNidE11c2lnMlBhcnRpYWxTaWcocGFydGlhbFNpZzogUHNidE11c2lnMlBhcnRpYWxTaWcpOiBQcm9wcmlldGFyeUtleVZhbHVlIHtcbiAgaWYgKHBhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGggIT09IDMyICYmIHBhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGggIT09IDMzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcnRpYWxTaWcgbGVuZ3RoICR7cGFydGlhbFNpZy5wYXJ0aWFsU2lnLmxlbmd0aH1gKTtcbiAgfVxuICBjb25zdCBrZXlkYXRhID0gQnVmZmVyLmNvbmNhdChbXG4gICAgY2hlY2tQbGFpblB1YmxpY0tleShwYXJ0aWFsU2lnLnBhcnRpY2lwYW50UHViS2V5KSxcbiAgICBjaGVja1hPbmx5UHVibGljS2V5KHBhcnRpYWxTaWcudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICBrZXlkYXRhLFxuICB9O1xuICByZXR1cm4geyBrZXksIHZhbHVlOiBwYXJ0aWFsU2lnLnBhcnRpYWxTaWcgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBkYXRhIGZvciBwYXJ0aWNpcGFudCBwdWIga2V5c1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKGt2OiBQcm9wcmlldGFyeUtleVZhbHVlKTogUHNidE11c2lnMlBhcnRpY2lwYW50cyB7XG4gIGlmIChcbiAgICBrdi5rZXkuaWRlbnRpZmllciAhPT0gUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSIHx8XG4gICAga3Yua2V5LnN1YnR5cGUgIT09IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVNcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkZW50aWZpZXIgJHtrdi5rZXkuaWRlbnRpZmllcn0gb3Igc3VidHlwZSAke2t2LmtleS5zdWJ0eXBlfSBmb3IgcGFydGljaXBhbnRzIHB1YiBrZXlzYCk7XG4gIH1cblxuICBjb25zdCBrZXkgPSBrdi5rZXkua2V5ZGF0YTtcbiAgaWYgKGtleS5sZW5ndGggIT09IDY0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleWRhdGEgc2l6ZSAke2tleS5sZW5ndGh9IGZvciBwYXJ0aWNpcGFudCBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBrdi52YWx1ZTtcbiAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gNjYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBwYXJ0aWNpcGFudCBwdWIga2V5c2ApO1xuICB9XG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5czogVHVwbGU8QnVmZmVyPiA9IFt2YWx1ZS5zdWJhcnJheSgwLCAzMyksIHZhbHVlLnN1YmFycmF5KDMzKV07XG4gIGlmIChwYXJ0aWNpcGFudFB1YktleXNbMF0uZXF1YWxzKHBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBwYXJ0aWNpcGFudCBwdWIga2V5cyBmb3VuZGApO1xuICB9XG5cbiAgcmV0dXJuIHsgdGFwT3V0cHV0S2V5OiBrZXkuc3ViYXJyYXkoMCwgMzIpLCB0YXBJbnRlcm5hbEtleToga2V5LnN1YmFycmF5KDMyKSwgcGFydGljaXBhbnRQdWJLZXlzIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgbXVzaWcyIG5vbmNlXG4gKiBAcGFyYW0ga3ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBzYnRNdXNpZzJOb25jZShrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQdWJOb25jZSB7XG4gIGlmIChrdi5rZXkuaWRlbnRpZmllciAhPT0gUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSIHx8IGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIG5vbmNlYCk7XG4gIH1cblxuICBjb25zdCBrZXkgPSBrdi5rZXkua2V5ZGF0YTtcbiAgaWYgKGtleS5sZW5ndGggIT09IDY1KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleWRhdGEgc2l6ZSAke2tleS5sZW5ndGh9IGZvciBub25jZWApO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBrdi52YWx1ZTtcbiAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gNjYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBub25jZWApO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGljaXBhbnRQdWJLZXk6IGtleS5zdWJhcnJheSgwLCAzMyksIHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDMzKSwgcHViTm9uY2U6IHZhbHVlIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgbXVzaWcyIHBhcnRpYWwgc2lnXG4gKiBAcGFyYW0ga3ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKGt2OiBQcm9wcmlldGFyeUtleVZhbHVlKTogUHNidE11c2lnMlBhcnRpYWxTaWcge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpYWwgc2lnYCk7XG4gIH1cblxuICBjb25zdCBrZXkgPSBrdi5rZXkua2V5ZGF0YTtcbiAgaWYgKGtleS5sZW5ndGggIT09IDY1KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleWRhdGEgc2l6ZSAke2tleS5sZW5ndGh9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBrdi52YWx1ZTtcbiAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMzIgJiYgdmFsdWUubGVuZ3RoICE9PSAzMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZWRhdGEgc2l6ZSAke3ZhbHVlLmxlbmd0aH0gZm9yIHBhcnRpYWwgc2lnYCk7XG4gIH1cblxuICByZXR1cm4geyBwYXJ0aWNpcGFudFB1YktleToga2V5LnN1YmFycmF5KDAsIDMzKSwgdGFwT3V0cHV0S2V5OiBrZXkuc3ViYXJyYXkoMzMpLCBwYXJ0aWFsU2lnOiB2YWx1ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwSW50ZXJuYWxLZXkocGxhaW5QdWJLZXlzOiBCdWZmZXJbXSk6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtdXNpZy5nZXRYT25seVB1YmtleShtdXNpZy5rZXlBZ2cocGxhaW5QdWJLZXlzKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwT3V0cHV0S2V5KGludGVybmFsUHViS2V5OiBCdWZmZXIsIHRhcFRyZWVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgdGFwVHdlYWtQdWJrZXkoZWNjLCB0b1hPbmx5UHVibGljS2V5KGludGVybmFsUHViS2V5KSwgY2hlY2tUYXBNZXJrbGVSb290KHRhcFRyZWVSb290KSkueE9ubHlQdWJrZXlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0ZU5vbmNlKHB1Yk5vbmNlczogVHVwbGU8QnVmZmVyPik6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtdXNpZy5ub25jZUFnZyhwdWJOb25jZXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcFR3ZWFrKHRhcEludGVybmFsS2V5OiBCdWZmZXIsIHRhcE1lcmtsZVJvb3Q6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjYWxjdWxhdGVUYXBUd2VhayhjaGVja1hPbmx5UHVibGljS2V5KHRhcEludGVybmFsS2V5KSwgY2hlY2tUYXBNZXJrbGVSb290KHRhcE1lcmtsZVJvb3QpKSk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0TXVzaWcyU2lnbmluZ1Nlc3Npb24oXG4gIGFnZ05vbmNlOiBCdWZmZXIsXG4gIGhhc2g6IEJ1ZmZlcixcbiAgcHVibGljS2V5czogVHVwbGU8QnVmZmVyPixcbiAgdHdlYWs6IEJ1ZmZlclxuKTogU2Vzc2lvbktleSB7XG4gIHJldHVybiBtdXNpZy5zdGFydFNpZ25pbmdTZXNzaW9uKGFnZ05vbmNlLCBoYXNoLCBwdWJsaWNLZXlzLCB7IHR3ZWFrLCB4T25seTogdHJ1ZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMlBhcnRpYWxTaWduKFxuICBwcml2YXRlS2V5OiBCdWZmZXIsXG4gIHB1YmxpY05vbmNlOiBVaW50OEFycmF5LFxuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5LFxuICBub25jZVN0b3JlOiBNdXNpZzJOb25jZVN0b3JlXG4pOiBCdWZmZXIge1xuICBjaGVja1R4SGFzaChCdWZmZXIuZnJvbShzZXNzaW9uS2V5Lm1zZykpO1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgbXVzaWcucGFydGlhbFNpZ24oe1xuICAgICAgc2VjcmV0S2V5OiBwcml2YXRlS2V5LFxuICAgICAgcHVibGljTm9uY2U6IG5vbmNlU3RvcmUuZ2V0UmVmKHB1YmxpY05vbmNlKSxcbiAgICAgIHNlc3Npb25LZXksXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMlBhcnRpYWxTaWdWZXJpZnkoXG4gIHNpZzogQnVmZmVyLFxuICBwdWJsaWNLZXk6IEJ1ZmZlcixcbiAgcHVibGljTm9uY2U6IEJ1ZmZlcixcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleVxuKTogYm9vbGVhbiB7XG4gIGNoZWNrVHhIYXNoKEJ1ZmZlci5mcm9tKHNlc3Npb25LZXkubXNnKSk7XG4gIHJldHVybiBtdXNpZy5wYXJ0aWFsVmVyaWZ5KHsgc2lnLCBwdWJsaWNLZXksIHB1YmxpY05vbmNlLCBzZXNzaW9uS2V5IH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXVzaWcyQWdncmVnYXRlU2lncyhzaWdzOiBCdWZmZXJbXSwgc2Vzc2lvbktleTogU2Vzc2lvbktleSk6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtdXNpZy5zaWduQWdnKHNpZ3MsIHNlc3Npb25LZXkpKTtcbn1cblxuLyoqIEByZXR1cm4gc2Vzc2lvbiBrZXkgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhlIHNlc3Npb24gbGF0ZXIgKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbihzZXNzaW9uQXJnczoge1xuICBwdWJOb25jZXM6IFR1cGxlPEJ1ZmZlcj47XG4gIHR4SGFzaDogQnVmZmVyO1xuICBwdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xuICBpbnRlcm5hbFB1YktleTogQnVmZmVyO1xuICB0YXBUcmVlUm9vdDogQnVmZmVyO1xufSk6IFNlc3Npb25LZXkge1xuICBjaGVja1R4SGFzaChzZXNzaW9uQXJncy50eEhhc2gpO1xuICBjb25zdCBhZ2dOb25jZSA9IGNyZWF0ZUFnZ3JlZ2F0ZU5vbmNlKHNlc3Npb25BcmdzLnB1Yk5vbmNlcyk7XG4gIGNvbnN0IHR3ZWFrID0gY3JlYXRlVGFwVHdlYWsoc2Vzc2lvbkFyZ3MuaW50ZXJuYWxQdWJLZXksIHNlc3Npb25BcmdzLnRhcFRyZWVSb290KTtcbiAgcmV0dXJuIHN0YXJ0TXVzaWcyU2lnbmluZ1Nlc3Npb24oYWdnTm9uY2UsIHNlc3Npb25BcmdzLnR4SGFzaCwgc2Vzc2lvbkFyZ3MucHViS2V5cywgdHdlYWspO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcGFydGljaXBhbnQga2V5IHZhbHVlIGRhdGFcbiAqIElmIG5vIGtleSB2YWx1ZSBleGlzdHMsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dDogUHNidElucHV0KTogUHNidE11c2lnMlBhcnRpY2lwYW50cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRpY2lwYW50c0tleVZhbHMgPSBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXQsIHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgfSk7XG5cbiAgaWYgKCFwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAocGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAke3BhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RofSBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHNLZXlWYWxzWzBdKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHB1YmxpYyBub25jZSBrZXkgdmFsdWUgZGF0YVxuICogSWYgbm8ga2V5IHZhbHVlIGV4aXN0cywgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0TXVzaWcyTm9uY2VzKGlucHV0OiBQc2J0SW5wdXQpOiBQc2J0TXVzaWcyUHViTm9uY2VbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vbmNlS2V5VmFscyA9IGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgfSk7XG5cbiAgaWYgKCFub25jZUtleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChub25jZUtleVZhbHMubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtub25jZUtleVZhbHMubGVuZ3RofSBtYXRjaGluZyBub25jZSBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxIG9yIDJgKTtcbiAgfVxuXG4gIHJldHVybiBub25jZUtleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMk5vbmNlKGt2KSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZyBrZXkgdmFsdWUgZGF0YVxuICogSWYgbm8ga2V5IHZhbHVlIGV4aXN0cywgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MoaW5wdXQ6IFBzYnRJbnB1dCk6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBzaWdLZXlWYWxzID0gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gIH0pO1xuXG4gIGlmICghc2lnS2V5VmFscy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHNpZ0tleVZhbHMubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtzaWdLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgcGFydGlhbCBzaWduYXR1cmUga2V5IHZhbHVlIGluc3RlYWQgb2YgMSBvciAyYCk7XG4gIH1cblxuICByZXR1cm4gc2lnS2V5VmFscy5tYXAoKGt2KSA9PiBkZWNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhrdikpO1xufVxuXG4vKipcbiAqIEFzc2VydCBtdXNpZzIgcGFydGljaXBhbnQga2V5IHZhbHVlIGRhdGEgd2l0aCB0YXBJbnRlcm5hbEtleSBhbmQgdGFwTWVya2xlUm9vdC5cbiAqIDx0YXBPdXRwdXRLZXk+PHRhcElucHV0S2V5PiA9PiA8cGFydGljaXBhbnRLZXkxPjxwYXJ0aWNpcGFudEtleTI+XG4gKiBVc2luZyB0YXBNZXJrbGVSb290IGFuZCAyIHBhcnRpY2lwYW50IGtleXMsIHRoZSB0YXBJbnB1dEtleSBpcyB2YWxpZGF0ZWQgYW5kIHVzaW5nIHRhcE1lcmtsZVJvb3QgYW5kIHRhcElucHV0S2V5LFxuICogdGhlIHRhcE91dHB1dEtleSBpcyB2YWxpZGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzKFxuICBwYXJ0aWNpcGFudEtleVZhbERhdGE6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMsXG4gIHRhcEludGVybmFsS2V5OiBCdWZmZXIsXG4gIHRhcE1lcmtsZVJvb3Q6IEJ1ZmZlclxuKTogdm9pZCB7XG4gIGNoZWNrWE9ubHlQdWJsaWNLZXkodGFwSW50ZXJuYWxLZXkpO1xuICBjaGVja1RhcE1lcmtsZVJvb3QodGFwTWVya2xlUm9vdCk7XG5cbiAgY29uc3QgcGFydGljaXBhbnRQdWJLZXlzID0gcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cztcblxuICBjb25zdCBpbnRlcm5hbEtleSA9IGNyZWF0ZVRhcEludGVybmFsS2V5KHBhcnRpY2lwYW50UHViS2V5cyk7XG4gIGlmICghaW50ZXJuYWxLZXkuZXF1YWxzKHBhcnRpY2lwYW50S2V5VmFsRGF0YS50YXBJbnRlcm5hbEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWRhdGEgdGFwSW50ZXJuYWxLZXknKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dEtleSA9IGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbEtleSwgdGFwTWVya2xlUm9vdCk7XG4gIGlmICghb3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudHMga2V5ZGF0YSB0YXBPdXRwdXRLZXknKTtcbiAgfVxuXG4gIGlmICghaW50ZXJuYWxLZXkuZXF1YWxzKHRhcEludGVybmFsS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwSW50ZXJuYWxLZXkgYW5kIGFnZ3JlZ2F0ZWQgcGFydGljaXBhbnQgcHViIGtleXMgZG9lcyBub3QgbWF0Y2gnKTtcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydCBtdXNpZzIgcHVibGljIG5vbmNlIGtleSB2YWx1ZSBkYXRhIHdpdGggcGFydGljaXBhbnQga2V5IHZhbHVlIGRhdGFcbiAqIChyZWZlciBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsRGF0YSkuXG4gKiA8cGFydGljaXBhbnRLZXkxPjx0YXBPdXRwdXRLZXk+ID0+IDxwdWJOb25jZTE+XG4gKiA8cGFydGljaXBhbnRLZXkyPjx0YXBPdXRwdXRLZXk+ID0+IDxwdWJOb25jZTI+XG4gKiBDaGVja3MgYWdhaW5zdCBwYXJ0aWNpcGFudCBrZXlzIGFuZCB0YXBPdXRwdXRLZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBzYnRNdXNpZzJOb25jZXMoXG4gIG5vbmNlc0tleVZhbERhdGE6IFBzYnRNdXNpZzJQdWJOb25jZVtdLFxuICBwYXJ0aWNpcGFudEtleVZhbERhdGE6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHNcbik6IHZvaWQge1xuICBjaGVja1hPbmx5UHVibGljS2V5KHBhcnRpY2lwYW50S2V5VmFsRGF0YS50YXBPdXRwdXRLZXkpO1xuICBwYXJ0aWNpcGFudEtleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzLmZvckVhY2goKGt2KSA9PiBjaGVja1BsYWluUHVibGljS2V5KGt2KSk7XG4gIGlmIChwYXJ0aWNpcGFudEtleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzWzFdKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHBhcnRpY2lwYW50IHB1YiBrZXlzIGZvdW5kYCk7XG4gIH1cblxuICBpZiAobm9uY2VzS2V5VmFsRGF0YS5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5vbmNlIGtleSB2YWx1ZSBjb3VudCAke25vbmNlc0tleVZhbERhdGEubGVuZ3RofWApO1xuICB9XG5cbiAgbm9uY2VzS2V5VmFsRGF0YS5mb3JFYWNoKChub25jZUt2KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBwYXJ0aWNpcGFudEtleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzLmZpbmRJbmRleCgocHViS2V5KSA9PlxuICAgICAgbm9uY2VLdi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMocHViS2V5KVxuICAgICk7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5vbmNlIGtleWRhdGEgcGFydGljaXBhbnQgcHViIGtleScpO1xuICAgIH1cblxuICAgIGlmICghbm9uY2VLdi50YXBPdXRwdXRLZXkuZXF1YWxzKHBhcnRpY2lwYW50S2V5VmFsRGF0YS50YXBPdXRwdXRLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbm9uY2Uga2V5ZGF0YSB0YXBPdXRwdXRLZXknKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIElucHV0IG9iamVjdCBidXQgc2lnIGhhc2ggdHlwZSBkYXRhIGlzIHRha2VuIG91dCBmcm9tIHBhcnRpYWxTaWcgZmllbGQuXG4gKiBJZiBzaWcgaGFzaCB0eXBlIGlzIG5vdCBjb21tb24gZm9yIGFsbCBzaWdzLCBlcnJvciBvdXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBtb2RpZmllZCBvYmplY3QgYW5kIHNpbmdsZSBoYXNoIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaWdIYXNoVHlwZUZyb21TaWdzKHBhcnRpYWxTaWdzOiBQc2J0TXVzaWcyUGFydGlhbFNpZ1tdKToge1xuICBwYXJ0aWFsU2lnczogUHNidE11c2lnMlBhcnRpYWxTaWdbXTtcbiAgc2lnSGFzaFR5cGU6IG51bWJlcjtcbn0ge1xuICBpZiAoIXBhcnRpYWxTaWdzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFydGlhbFNpZ3MgYXJyYXkgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGNvbnN0IHBTaWdzV2l0aEhhc2hUeXBlID0gcGFydGlhbFNpZ3MubWFwKChrdikgPT4ge1xuICAgIGNvbnN0IHsgcGFydGlhbFNpZywgcGFydGljaXBhbnRQdWJLZXksIHRhcE91dHB1dEtleSB9ID0ga3Y7XG4gICAgcmV0dXJuIHBhcnRpYWxTaWcubGVuZ3RoID09PSAzM1xuICAgICAgPyB7IHBTaWc6IHsgcGFydGlhbFNpZzogcGFydGlhbFNpZy5zbGljZSgwLCAzMiksIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSwgc2lnSGFzaFR5cGU6IHBhcnRpYWxTaWdbMzJdIH1cbiAgICAgIDogeyBwU2lnOiB7IHBhcnRpYWxTaWcsIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSwgc2lnSGFzaFR5cGU6IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCB9O1xuICB9KTtcblxuICBjb25zdCBzaWdIYXNoVHlwZSA9IHBTaWdzV2l0aEhhc2hUeXBlWzBdLnNpZ0hhc2hUeXBlO1xuICBpZiAoIXBTaWdzV2l0aEhhc2hUeXBlLmV2ZXJ5KChwU2lnKSA9PiBwU2lnLnNpZ0hhc2hUeXBlID09PSBzaWdIYXNoVHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25hdHVyZXMgbXVzdCB1c2Ugc2FtZSBzaWcgaGFzaCB0eXBlJyk7XG4gIH1cblxuICByZXR1cm4geyBwYXJ0aWFsU2lnczogcFNpZ3NXaXRoSGFzaFR5cGUubWFwKCh7IHBTaWcgfSkgPT4gcFNpZyksIHNpZ0hhc2hUeXBlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2UocGFyYW1zOiBQc2J0TXVzaWcyRGV0ZXJtaW5pc3RpY1BhcmFtcyk6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICBtdXNpZy5kZXRlcm1pbmlzdGljTm9uY2VHZW4oe1xuICAgICAgc2VjcmV0S2V5OiBwYXJhbXMucHJpdmF0ZUtleSxcbiAgICAgIGFnZ090aGVyTm9uY2U6IG11c2lnLm5vbmNlQWdnKFtwYXJhbXMub3RoZXJOb25jZV0pLFxuICAgICAgcHVibGljS2V5czogcGFyYW1zLnB1YmxpY0tleXMsXG4gICAgICB0d2Vha3M6IFt7IHR3ZWFrOiBjcmVhdGVUYXBUd2VhayhwYXJhbXMuaW50ZXJuYWxQdWJLZXksIHBhcmFtcy50YXBUcmVlUm9vdCksIHhPbmx5OiB0cnVlIH1dLFxuICAgICAgbXNnOiBwYXJhbXMuaGFzaCxcbiAgICB9KS5wdWJsaWNOb25jZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24ocGFyYW1zOiBQc2J0TXVzaWcyRGV0ZXJtaW5pc3RpY1BhcmFtcyk6IHtcbiAgc2lnOiBCdWZmZXI7XG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXk7XG4gIHB1YmxpY05vbmNlOiBCdWZmZXI7XG59IHtcbiAgY29uc3QgeyBzaWcsIHNlc3Npb25LZXksIHB1YmxpY05vbmNlIH0gPSBtdXNpZy5kZXRlcm1pbmlzdGljU2lnbih7XG4gICAgc2VjcmV0S2V5OiBwYXJhbXMucHJpdmF0ZUtleSxcbiAgICBhZ2dPdGhlck5vbmNlOiBtdXNpZy5ub25jZUFnZyhbcGFyYW1zLm90aGVyTm9uY2VdKSxcbiAgICBwdWJsaWNLZXlzOiBwYXJhbXMucHVibGljS2V5cyxcbiAgICB0d2Vha3M6IFt7IHR3ZWFrOiBjcmVhdGVUYXBUd2VhayhwYXJhbXMuaW50ZXJuYWxQdWJLZXksIHBhcmFtcy50YXBUcmVlUm9vdCksIHhPbmx5OiB0cnVlIH1dLFxuICAgIG1zZzogcGFyYW1zLmhhc2gsXG4gIH0pO1xuICByZXR1cm4geyBzaWc6IEJ1ZmZlci5mcm9tKHNpZyksIHNlc3Npb25LZXksIHB1YmxpY05vbmNlOiBCdWZmZXIuZnJvbShwdWJsaWNOb25jZSkgfTtcbn1cbiJdfQ==
@@ -0,0 +1,71 @@
1
+ /// <reference types="node" />
2
+ import { ProprietaryKey } from 'bip174/src/lib/proprietaryKeyVal';
3
+ import { PsbtInput } from 'bip174/src/lib/interfaces';
4
+ import { Psbt } from 'bitcoinjs-lib/src/psbt';
5
+ /**
6
+ * bitgo proprietary key identifier
7
+ */
8
+ export declare const PSBT_PROPRIETARY_IDENTIFIER = "BITGO";
9
+ /**
10
+ * subtype for proprietary keys that bitgo uses
11
+ */
12
+ export declare enum ProprietaryKeySubtype {
13
+ ZEC_CONSENSUS_BRANCH_ID = 0,
14
+ MUSIG2_PARTICIPANT_PUB_KEYS = 1,
15
+ MUSIG2_PUB_NONCE = 2,
16
+ MUSIG2_PARTIAL_SIG = 3
17
+ }
18
+ /**
19
+ * Psbt proprietary keydata object.
20
+ * <compact size uint identifier length> <bytes identifier> <compact size uint subtype> <bytes subkeydata>
21
+ * => <bytes valuedata>
22
+ */
23
+ export interface ProprietaryKeyValue {
24
+ key: ProprietaryKey;
25
+ value: Buffer;
26
+ }
27
+ /**
28
+ * Psbt proprietary keydata object search fields.
29
+ * <compact size uint identifier length> <bytes identifier> <compact size uint subtype> <bytes subkeydata>
30
+ */
31
+ export interface ProprietaryKeySearch {
32
+ identifier: string;
33
+ subtype?: number;
34
+ keydata?: Buffer;
35
+ identifierEncoding?: BufferEncoding;
36
+ }
37
+ /**
38
+ * Search any data from psbt proprietary key value against keydata.
39
+ * Default identifierEncoding is utf-8 for identifier.
40
+ */
41
+ export declare function getPsbtInputProprietaryKeyVals(input: PsbtInput, keySearch?: ProprietaryKeySearch): ProprietaryKeyValue[];
42
+ /**
43
+ * @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
44
+ */
45
+ export declare function getPsbtInputSignatureCount(input: PsbtInput): number;
46
+ /**
47
+ * @return true iff PSBT input is finalized
48
+ */
49
+ export declare function isPsbtInputFinalized(input: PsbtInput): boolean;
50
+ /**
51
+ * @return true iff data starts with magic PSBT byte sequence
52
+ * @param data byte array or hex string
53
+ * */
54
+ export declare function isPsbt(data: Buffer | string): boolean;
55
+ /**
56
+ * First checks if the input is already a buffer that starts with the magic PSBT byte sequence.
57
+ * If not, it checks if the input is a base64- or hex-encoded string that starts with PSBT header.
58
+ *
59
+ * This function is useful when reading a file that could be in any of the above formats or when
60
+ * dealing with a request that could contain a hex or base64 encoded PSBT.
61
+ *
62
+ * @param data
63
+ * @return buffer that starts with the magic PSBT byte sequence
64
+ * @throws Error when conversion is not possible
65
+ */
66
+ export declare function toPsbtBuffer(data: Buffer | string): Buffer;
67
+ /**
68
+ * This function allows signing or validating a psbt with non-segwit inputs those do not contain nonWitnessUtxo.
69
+ */
70
+ export declare function withUnsafeNonSegwit<T>(psbt: Psbt, fn: () => T, unsafe?: boolean): T;
71
+ //# sourceMappingURL=PsbtUtil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PsbtUtil.d.ts","sourceRoot":"","sources":["../../../src/bitgo/PsbtUtil.ts"],"names":[],"mappings":";AAAA,OAAO,EAAwB,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,2BAA2B,UAAU,CAAC;AAEnD;;GAEG;AACH,oBAAY,qBAAqB;IAC/B,uBAAuB,IAAO;IAC9B,2BAA2B,IAAO;IAClC,gBAAgB,IAAO;IACvB,kBAAkB,IAAO;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,cAAc,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,SAAS,CAAC,EAAE,oBAAoB,GAC/B,mBAAmB,EAAE,CAmBvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE9D;AAED;;;KAGK;AACL,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAUrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA6B1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,UAAO,GAAG,CAAC,CAShF"}