@bitgo-beta/utxo-lib 8.0.3-beta.182 → 8.0.3-beta.1821

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 (222) hide show
  1. package/dist/src/address.d.ts +0 -1
  2. package/dist/src/address.d.ts.map +1 -1
  3. package/dist/src/address.js +10 -10
  4. package/dist/src/addressFormat.d.ts +1 -2
  5. package/dist/src/addressFormat.d.ts.map +1 -1
  6. package/dist/src/addressFormat.js +21 -26
  7. package/dist/src/bitgo/Musig2.d.ts +1 -2
  8. package/dist/src/bitgo/Musig2.d.ts.map +1 -1
  9. package/dist/src/bitgo/Musig2.js +54 -54
  10. package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts +27 -0
  11. package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts.map +1 -0
  12. package/dist/src/bitgo/ProprietaryKeyValUtils.js +74 -0
  13. package/dist/src/bitgo/PsbtUtil.d.ts +18 -23
  14. package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -1
  15. package/dist/src/bitgo/PsbtUtil.js +63 -24
  16. package/dist/src/bitgo/Unspent.d.ts +2 -3
  17. package/dist/src/bitgo/Unspent.d.ts.map +1 -1
  18. package/dist/src/bitgo/Unspent.js +14 -15
  19. package/dist/src/bitgo/UtxoPsbt.d.ts +22 -9
  20. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  21. package/dist/src/bitgo/UtxoPsbt.js +126 -120
  22. package/dist/src/bitgo/UtxoTransaction.d.ts +0 -1
  23. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
  24. package/dist/src/bitgo/UtxoTransaction.js +14 -14
  25. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -1
  26. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -1
  27. package/dist/src/bitgo/UtxoTransactionBuilder.js +1 -1
  28. package/dist/src/bitgo/bitcoincash/address.d.ts +0 -1
  29. package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -1
  30. package/dist/src/bitgo/bitcoincash/address.js +11 -12
  31. package/dist/src/bitgo/bitcoincash/index.js +6 -2
  32. package/dist/src/bitgo/dash/DashPsbt.d.ts +1 -1
  33. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -1
  34. package/dist/src/bitgo/dash/DashPsbt.js +4 -1
  35. package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -1
  36. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -1
  37. package/dist/src/bitgo/dash/DashTransaction.js +3 -3
  38. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -1
  39. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -1
  40. package/dist/src/bitgo/dash/DashTransactionBuilder.js +1 -1
  41. package/dist/src/bitgo/dash/index.js +6 -2
  42. package/dist/src/bitgo/index.d.ts +3 -1
  43. package/dist/src/bitgo/index.d.ts.map +1 -1
  44. package/dist/src/bitgo/index.js +8 -2
  45. package/dist/src/bitgo/keyutil.d.ts +10 -2
  46. package/dist/src/bitgo/keyutil.d.ts.map +1 -1
  47. package/dist/src/bitgo/keyutil.js +27 -6
  48. package/dist/src/bitgo/legacysafe/index.d.ts +0 -1
  49. package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -1
  50. package/dist/src/bitgo/legacysafe/index.js +11 -12
  51. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +1 -1
  52. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -1
  53. package/dist/src/bitgo/litecoin/LitecoinPsbt.js +4 -1
  54. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -2
  55. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
  56. package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
  57. package/dist/src/bitgo/litecoin/index.js +6 -2
  58. package/dist/src/bitgo/nonStandardHalfSigned.js +4 -5
  59. package/dist/src/bitgo/outputScripts.d.ts +11 -8
  60. package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
  61. package/dist/src/bitgo/outputScripts.js +47 -44
  62. package/dist/src/bitgo/parseInput.d.ts +7 -8
  63. package/dist/src/bitgo/parseInput.d.ts.map +1 -1
  64. package/dist/src/bitgo/parseInput.js +14 -15
  65. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -1
  66. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
  67. package/dist/src/bitgo/psbt/fromHalfSigned.js +7 -8
  68. package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -1
  69. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -1
  70. package/dist/src/bitgo/psbt/scriptTypes.js +7 -8
  71. package/dist/src/bitgo/signature.d.ts +3 -4
  72. package/dist/src/bitgo/signature.d.ts.map +1 -1
  73. package/dist/src/bitgo/signature.js +22 -23
  74. package/dist/src/bitgo/tnumber.js +2 -3
  75. package/dist/src/bitgo/transaction.d.ts +13 -1
  76. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  77. package/dist/src/bitgo/transaction.js +53 -23
  78. package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
  79. package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
  80. package/dist/src/bitgo/transactionAmounts.js +32 -0
  81. package/dist/src/bitgo/types.d.ts +8 -2
  82. package/dist/src/bitgo/types.d.ts.map +1 -1
  83. package/dist/src/bitgo/types.js +12 -4
  84. package/dist/src/bitgo/wallet/Psbt.d.ts +37 -21
  85. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  86. package/dist/src/bitgo/wallet/Psbt.js +88 -58
  87. package/dist/src/bitgo/wallet/ScriptId.d.ts +14 -0
  88. package/dist/src/bitgo/wallet/ScriptId.d.ts.map +1 -0
  89. package/dist/src/bitgo/wallet/ScriptId.js +28 -0
  90. package/dist/src/bitgo/wallet/Unspent.d.ts +0 -3
  91. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  92. package/dist/src/bitgo/wallet/Unspent.js +47 -44
  93. package/dist/src/bitgo/wallet/WalletKeys.d.ts +2 -3
  94. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
  95. package/dist/src/bitgo/wallet/WalletKeys.js +3 -3
  96. package/dist/src/bitgo/wallet/WalletOutput.d.ts +62 -8
  97. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
  98. package/dist/src/bitgo/wallet/WalletOutput.js +160 -63
  99. package/dist/src/bitgo/wallet/WalletScripts.js +4 -5
  100. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +1 -1
  101. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -1
  102. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
  103. package/dist/src/bitgo/wallet/chains.d.ts +2 -2
  104. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
  105. package/dist/src/bitgo/wallet/chains.js +10 -10
  106. package/dist/src/bitgo/wallet/index.d.ts +3 -0
  107. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  108. package/dist/src/bitgo/wallet/index.js +9 -2
  109. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
  110. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
  111. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +85 -0
  112. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
  113. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
  114. package/dist/src/bitgo/wallet/psbt/RootNodes.js +122 -0
  115. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +1 -2
  116. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -1
  117. package/dist/src/bitgo/zcash/ZcashBufferutils.js +15 -15
  118. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +4 -5
  119. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  120. package/dist/src/bitgo/zcash/ZcashPsbt.js +24 -15
  121. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +7 -2
  122. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
  123. package/dist/src/bitgo/zcash/ZcashTransaction.js +58 -21
  124. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -1
  125. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -1
  126. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +10 -4
  127. package/dist/src/bitgo/zcash/address.d.ts +0 -1
  128. package/dist/src/bitgo/zcash/address.d.ts.map +1 -1
  129. package/dist/src/bitgo/zcash/address.js +7 -8
  130. package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -2
  131. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
  132. package/dist/src/bitgo/zcash/hashZip0244.js +9 -10
  133. package/dist/src/bitgo/zcash/index.js +6 -2
  134. package/dist/src/classify.d.ts +0 -1
  135. package/dist/src/classify.d.ts.map +1 -1
  136. package/dist/src/classify.js +5 -5
  137. package/dist/src/index.d.ts +3 -1
  138. package/dist/src/index.d.ts.map +1 -1
  139. package/dist/src/index.js +12 -4
  140. package/dist/src/networks.d.ts +2 -2
  141. package/dist/src/networks.d.ts.map +1 -1
  142. package/dist/src/networks.js +67 -21
  143. package/dist/src/payments/p2tr.d.ts.map +1 -1
  144. package/dist/src/payments/p2tr.js +16 -28
  145. package/dist/src/payments/p2tr_ns.js +3 -5
  146. package/dist/src/taproot.d.ts +80 -6
  147. package/dist/src/taproot.d.ts.map +1 -1
  148. package/dist/src/taproot.js +132 -48
  149. package/dist/src/templates/multisig/input.d.ts +0 -1
  150. package/dist/src/templates/multisig/input.d.ts.map +1 -1
  151. package/dist/src/templates/multisig/input.js +2 -3
  152. package/dist/src/templates/multisig/output.d.ts +0 -1
  153. package/dist/src/templates/multisig/output.d.ts.map +1 -1
  154. package/dist/src/templates/multisig/output.js +2 -3
  155. package/dist/src/templates/nulldata.d.ts +0 -1
  156. package/dist/src/templates/nulldata.d.ts.map +1 -1
  157. package/dist/src/templates/nulldata.js +3 -3
  158. package/dist/src/templates/pubkey/input.d.ts +0 -1
  159. package/dist/src/templates/pubkey/input.d.ts.map +1 -1
  160. package/dist/src/templates/pubkey/input.js +2 -3
  161. package/dist/src/templates/pubkey/output.d.ts +0 -1
  162. package/dist/src/templates/pubkey/output.d.ts.map +1 -1
  163. package/dist/src/templates/pubkey/output.js +2 -3
  164. package/dist/src/templates/pubkeyhash/input.d.ts +0 -1
  165. package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -1
  166. package/dist/src/templates/pubkeyhash/input.js +2 -3
  167. package/dist/src/templates/pubkeyhash/output.d.ts +0 -1
  168. package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -1
  169. package/dist/src/templates/pubkeyhash/output.js +2 -3
  170. package/dist/src/templates/scripthash/input.d.ts +0 -1
  171. package/dist/src/templates/scripthash/input.d.ts.map +1 -1
  172. package/dist/src/templates/scripthash/input.js +2 -3
  173. package/dist/src/templates/scripthash/output.d.ts +0 -1
  174. package/dist/src/templates/scripthash/output.d.ts.map +1 -1
  175. package/dist/src/templates/scripthash/output.js +2 -3
  176. package/dist/src/templates/taproot/input.d.ts +0 -1
  177. package/dist/src/templates/taproot/input.d.ts.map +1 -1
  178. package/dist/src/templates/taproot/input.js +2 -3
  179. package/dist/src/templates/taproot/output.d.ts +0 -1
  180. package/dist/src/templates/taproot/output.d.ts.map +1 -1
  181. package/dist/src/templates/taproot/output.js +2 -3
  182. package/dist/src/templates/taprootnofn/input.d.ts +0 -1
  183. package/dist/src/templates/taprootnofn/input.d.ts.map +1 -1
  184. package/dist/src/templates/taprootnofn/input.js +2 -3
  185. package/dist/src/templates/taprootnofn/output.d.ts +0 -1
  186. package/dist/src/templates/taprootnofn/output.d.ts.map +1 -1
  187. package/dist/src/templates/taprootnofn/output.js +4 -5
  188. package/dist/src/templates/witnesscommitment/output.d.ts +0 -1
  189. package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -1
  190. package/dist/src/templates/witnesscommitment/output.js +4 -5
  191. package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -1
  192. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -1
  193. package/dist/src/templates/witnesspubkeyhash/input.js +2 -3
  194. package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -1
  195. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -1
  196. package/dist/src/templates/witnesspubkeyhash/output.js +2 -3
  197. package/dist/src/templates/witnessscripthash/input.d.ts +0 -1
  198. package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -1
  199. package/dist/src/templates/witnessscripthash/input.js +2 -3
  200. package/dist/src/templates/witnessscripthash/output.d.ts +0 -1
  201. package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -1
  202. package/dist/src/templates/witnessscripthash/output.js +2 -3
  203. package/dist/src/testutil/index.js +6 -2
  204. package/dist/src/testutil/keys.d.ts +6 -6
  205. package/dist/src/testutil/keys.d.ts.map +1 -1
  206. package/dist/src/testutil/keys.js +16 -14
  207. package/dist/src/testutil/mock.d.ts +3 -4
  208. package/dist/src/testutil/mock.d.ts.map +1 -1
  209. package/dist/src/testutil/mock.js +33 -31
  210. package/dist/src/testutil/psbt.d.ts +69 -15
  211. package/dist/src/testutil/psbt.d.ts.map +1 -1
  212. package/dist/src/testutil/psbt.js +140 -50
  213. package/dist/src/testutil/transaction.d.ts +2 -2
  214. package/dist/src/testutil/transaction.d.ts.map +1 -1
  215. package/dist/src/testutil/transaction.js +22 -21
  216. package/dist/src/transaction_builder.d.ts +0 -1
  217. package/dist/src/transaction_builder.d.ts.map +1 -1
  218. package/dist/src/transaction_builder.js +27 -32
  219. package/package.json +9 -16
  220. package/dist/src/noble_ecc.d.ts +0 -28
  221. package/dist/src/noble_ecc.d.ts.map +0 -1
  222. package/dist/src/noble_ecc.js +0 -172
@@ -1,13 +1,60 @@
1
1
  "use strict";
2
- // Taproot-specific key aggregation and taptree logic as defined in:
3
- // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
4
- // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki
2
+ /**
3
+ * This module provides taproot utilities including the legacy MuSig2 key aggregation
4
+ * algorithm used by BitGo's deprecated `p2tr` script type (chains 30, 31).
5
+ *
6
+ * ## Legacy p2tr vs Standard p2trMusig2
7
+ *
8
+ * BitGo supports two taproot address types:
9
+ *
10
+ * 1. **Legacy `p2tr` (chains 30, 31) - DEPRECATED**
11
+ * - Uses the `aggregateMuSigPubkeys()` function in this module
12
+ * - Based on an older MuSig2 variant that predates BIP327
13
+ * - Expects 32-byte x-only pubkeys with even Y coordinates
14
+ * - Sorts keys AFTER x-only conversion
15
+ * - Corresponds to MuSig2 before the 32-byte to 33-byte key change
16
+ * - See: https://github.com/jonasnick/bips/pull/37
17
+ *
18
+ * 2. **Standard `p2trMusig2` (chains 40, 41) - RECOMMENDED**
19
+ * - Uses the `@brandonblack/musig` library (standard BIP327 implementation)
20
+ * - Uses full 33-byte compressed pubkeys throughout aggregation
21
+ * - Key order affects the resulting aggregate key
22
+ * - Fully compatible with the BIP327 specification
23
+ *
24
+ * ## Key Difference
25
+ *
26
+ * The critical difference is **when x-only conversion happens**:
27
+ * - Legacy: Converts to x-only BEFORE sorting (produces order-independent keys)
28
+ * - Standard: Uses 33-byte keys throughout (key order matters)
29
+ *
30
+ * For the same two pubkeys, these methods produce DIFFERENT aggregate keys because
31
+ * the sort order differs between 33-byte and 32-byte representations.
32
+ *
33
+ * See `modules/utxo-lib/bip-0327/README.md` for detailed comparison and test cases.
34
+ */
5
35
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getTaprootOutputKey = exports.createTaprootOutputScript = exports.getTweakedOutputKey = exports.getTaptreeRoot = exports.getTapleafHash = exports.parseControlBlock = exports.parseTaprootWitness = exports.getControlBlock = exports.getHuffmanTaptree = exports.getDepthFirstTaptree = exports.tapTweakPubkey = exports.tapTweakPrivkey = exports.calculateTapTweak = exports.hashTapBranch = exports.hashTapLeaf = exports.serializeScriptSize = exports.aggregateMuSigPubkeys = exports.INITIAL_TAPSCRIPT_VERSION = exports.EVEN_Y_COORD_PREFIX = void 0;
36
+ exports.INITIAL_TAPSCRIPT_VERSION = exports.EVEN_Y_COORD_PREFIX = void 0;
37
+ exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
38
+ exports.serializeScriptSize = serializeScriptSize;
39
+ exports.hashTapLeaf = hashTapLeaf;
40
+ exports.hashTapBranch = hashTapBranch;
41
+ exports.calculateTapTweak = calculateTapTweak;
42
+ exports.tapTweakPrivkey = tapTweakPrivkey;
43
+ exports.tapTweakPubkey = tapTweakPubkey;
44
+ exports.getDepthFirstTaptree = getDepthFirstTaptree;
45
+ exports.getHuffmanTaptree = getHuffmanTaptree;
46
+ exports.getControlBlock = getControlBlock;
47
+ exports.parseTaprootWitness = parseTaprootWitness;
48
+ exports.parseControlBlock = parseControlBlock;
49
+ exports.getTapleafHash = getTapleafHash;
50
+ exports.getTaptreeRoot = getTaptreeRoot;
51
+ exports.getTweakedOutputKey = getTweakedOutputKey;
52
+ exports.createTaprootOutputScript = createTaprootOutputScript;
53
+ exports.getTaprootOutputKey = getTaprootOutputKey;
7
54
  const assert = require("assert");
8
55
  const FastPriorityQueue = require("fastpriorityqueue");
9
56
  const bitcoinjs_lib_1 = require("bitcoinjs-lib");
10
- const noble_ecc_1 = require("./noble_ecc");
57
+ const secp256k1_1 = require("@bitgo-beta/secp256k1");
11
58
  const varuint = require('varuint-bitcoin');
12
59
  /**
13
60
  * The 0x02 prefix indicating an even Y coordinate which is implicitly assumed
@@ -16,54 +63,108 @@ const varuint = require('varuint-bitcoin');
16
63
  exports.EVEN_Y_COORD_PREFIX = Buffer.of(0x02);
17
64
  exports.INITIAL_TAPSCRIPT_VERSION = 0xc0;
18
65
  /**
19
- * Aggregates a list of public keys into a single MuSig2* public key
20
- * according to the MuSig2 paper.
66
+ * Aggregates a list of public keys into a single public key using the legacy MuSig2 algorithm.
67
+ *
68
+ * This implements the deprecated key aggregation method used by BitGo's `p2tr` script type
69
+ * (chains 30, 31). It corresponds to an older variant of MuSig2 that predates the change
70
+ * from 32-byte to 33-byte keys in the BIP327 specification.
71
+ *
72
+ * ## Algorithm
73
+ *
74
+ * The implementation follows the MuSig2 key aggregation scheme:
75
+ *
76
+ * ```
77
+ * P = sum_i (μ_i * P_i)
78
+ * ```
79
+ *
80
+ * where:
81
+ * - `P_i` is the public key of the i-th signer
82
+ * - `μ_i` is the MuSig coefficient computed as:
83
+ * - `L = TaggedHash("KeyAgg list", P_1 || P_2 || ... || P_n)`
84
+ * - `μ_i = TaggedHash("KeyAgg coefficient", L || P_i)` for most keys
85
+ * - `μ_i = 1` for the second unique key (optimization to save an exponentiation)
86
+ *
87
+ * ## Key Characteristics (Legacy Variant)
88
+ *
89
+ * 1. **X-only pubkeys**: Expects 32-byte x-only pubkeys (assumes even Y coordinates)
90
+ * 2. **Pre-aggregation sorting**: Sorts keys in ascending order BEFORE aggregation
91
+ * 3. **Order-independent**: Due to sorting, key order doesn't affect the result
92
+ * 4. **33-byte internal representation**: Internally prepends 0x02 prefix for elliptic curve operations
93
+ *
94
+ * ## Differences from Standard MuSig2 (BIP327)
95
+ *
96
+ * The standard MuSig2 implementation (`@brandonblack/musig` library):
97
+ * - Uses 33-byte compressed pubkeys throughout
98
+ * - Does NOT sort keys before aggregation (key order matters)
99
+ * - Produces different aggregate keys even for the same set of pubkeys
100
+ *
101
+ * ## Reference Implementation
102
+ *
103
+ * This corresponds to `key_agg_bitgo_p2tr_legacy()` in the Python reference implementation
104
+ * at `modules/utxo-lib/bip-0327/reference.py`.
105
+ *
21
106
  * @param ecc Elliptic curve implementation
22
- * @param pubkeys The list of pub keys to aggregate
23
- * @returns a 32 byte Buffer representing the aggregate key
107
+ * @param pubkeys List of 32-byte x-only public keys to aggregate (must have even Y coordinates)
108
+ * @returns 32-byte Buffer representing the x-only aggregate public key
109
+ * @throws {Error} if fewer than 2 pubkeys provided or elliptic curve operations fail
110
+ *
111
+ * @see modules/utxo-lib/bip-0327/README.md for detailed comparison with standard MuSig2
112
+ * @see https://github.com/jonasnick/bips/pull/37 for the MuSig2 specification change
24
113
  */
25
114
  function aggregateMuSigPubkeys(ecc, pubkeys) {
26
115
  // TODO: Consider enforcing key uniqueness.
27
116
  assert(pubkeys.length > 1, 'at least two pubkeys are required for musig key aggregation');
28
- // Sort the keys in ascending order
117
+ // LEGACY BEHAVIOR: Sort the keys in ascending order BEFORE aggregation.
118
+ // This makes the aggregate key independent of input order.
119
+ // Standard MuSig2 (BIP327) does NOT sort, making key order significant.
29
120
  pubkeys.sort(Buffer.compare);
30
- // In MuSig all signers contribute key material to a single signing key,
31
- // using the equation
32
- //
33
- // P = sum_i µ_i * P_i
34
- //
35
- // where `P_i` is the public key of the `i`th signer and `µ_i` is a so-called
36
- // _MuSig coefficient_ computed according to the following equation
37
- //
38
- // L = H(P_1 || P_2 || ... || P_n)
39
- // µ_i = H(L || P_i)
121
+ // Compute the "KeyAgg list" hash L = TaggedHash("KeyAgg list", P_1 || P_2 || ... || P_n)
122
+ // This hash is used to derive the MuSig coefficients for each pubkey.
123
+ // In the reference implementation (reference.py), this is done in hash_keys().
40
124
  const L = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg list', Buffer.concat(pubkeys));
125
+ // Find the second unique pubkey in the sorted list.
126
+ // This key (and any keys identical to it) will use coefficient μ = 1 as an optimization.
127
+ // This saves an expensive point multiplication (see MuSig2* appendix in the MuSig2 paper).
128
+ // In the reference implementation, this is get_second_key().
41
129
  const secondUniquePubkey = pubkeys.find((pubkey) => !pubkeys[0].equals(pubkey));
130
+ // For each pubkey P_i, compute the tweaked pubkey μ_i * P_i
131
+ // where μ_i is the MuSig coefficient for that key.
42
132
  const tweakedPubkeys = pubkeys.map((pubkey) => {
133
+ // Convert 32-byte x-only pubkey to 33-byte compressed format by prepending 0x02.
134
+ // This assumes an even Y coordinate (standard for x-only pubkeys in taproot).
135
+ // In the reference implementation, this is done implicitly in key_agg() via lift_x().
43
136
  const xyPubkey = Buffer.concat([exports.EVEN_Y_COORD_PREFIX, pubkey]);
44
137
  if (secondUniquePubkey !== undefined && secondUniquePubkey.equals(pubkey)) {
45
- // The second unique key in the pubkey list given to ''KeyAgg'' (as well
46
- // as any keys identical to this key) gets the constant KeyAgg
47
- // coefficient 1 which saves an exponentiation (see the MuSig2* appendix
48
- // in the MuSig2 paper).
138
+ // Optimization: The second unique key gets coefficient μ = 1.
139
+ // This means μ_i * P_i = 1 * P_i = P_i (no multiplication needed).
140
+ // This saves an expensive elliptic curve point multiplication operation.
141
+ // See key_agg_coeff_internal() in reference.py where it returns 1 for pk_ == pk2.
49
142
  return xyPubkey;
50
143
  }
144
+ // Compute the MuSig coefficient: μ_i = TaggedHash("KeyAgg coefficient", L || P_i)
145
+ // In the reference implementation, this is key_agg_coeff_internal().
51
146
  const c = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg coefficient', Buffer.concat([L, pubkey]));
147
+ // Compute the tweaked pubkey: μ_i * P_i (elliptic curve point multiplication)
52
148
  const tweakedPubkey = ecc.pointMultiply(xyPubkey, c);
53
149
  if (!tweakedPubkey) {
54
150
  throw new Error('Failed to multiply pubkey by coefficient');
55
151
  }
56
152
  return tweakedPubkey;
57
153
  });
154
+ // Sum all the tweaked pubkeys to get the aggregate pubkey:
155
+ // P = sum_i (μ_i * P_i) = μ_1*P_1 + μ_2*P_2 + ... + μ_n*P_n
156
+ // This is elliptic curve point addition.
58
157
  const aggregatePubkey = tweakedPubkeys.reduce((prev, curr) => {
59
158
  const next = ecc.pointAdd(prev, curr);
60
159
  if (!next)
61
160
  throw new Error('Failed to sum pubkeys');
62
161
  return next;
63
162
  });
163
+ // Convert the aggregate pubkey from 33-byte compressed format back to 32-byte x-only format
164
+ // by removing the first byte (the Y coordinate prefix).
165
+ // In the reference implementation, this is done by get_xonly_pk() which calls xbytes().
64
166
  return aggregatePubkey.slice(1);
65
167
  }
66
- exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
67
168
  /**
68
169
  * Encodes the length of a script as a bitcoin variable length integer.
69
170
  * @param script
@@ -72,7 +173,6 @@ exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
72
173
  function serializeScriptSize(script) {
73
174
  return varuint.encode(script.length);
74
175
  }
75
- exports.serializeScriptSize = serializeScriptSize;
76
176
  /**
77
177
  * Gets a tapleaf tagged hash from a script.
78
178
  * @param script
@@ -82,7 +182,6 @@ function hashTapLeaf(script, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
82
182
  const size = serializeScriptSize(script);
83
183
  return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), size, script]));
84
184
  }
85
- exports.hashTapLeaf = hashTapLeaf;
86
185
  /**
87
186
  * Creates a lexicographically sorted tapbranch from two child taptree nodes
88
187
  * and returns its tagged hash.
@@ -95,7 +194,6 @@ function hashTapBranch(child1, child2) {
95
194
  const sortedChildren = [child1, child2].sort(Buffer.compare);
96
195
  return bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat(sortedChildren));
97
196
  }
98
- exports.hashTapBranch = hashTapBranch;
99
197
  function calculateTapTweak(pubkey, taptreeRoot) {
100
198
  if (pubkey.length !== 32) {
101
199
  throw new Error(`Invalid pubkey size ${pubkey.length}.`);
@@ -111,7 +209,6 @@ function calculateTapTweak(pubkey, taptreeRoot) {
111
209
  // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-22
112
210
  return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.from(pubkey));
113
211
  }
114
- exports.calculateTapTweak = calculateTapTweak;
115
212
  /**
116
213
  * Tweaks a privkey, using the tagged hash of its pubkey, and (optionally) a taptree root
117
214
  * @param ecc Elliptic curve implementation
@@ -132,7 +229,6 @@ function tapTweakPrivkey(ecc, pubkey, privkey, taptreeRoot) {
132
229
  throw new Error('Invalid private key');
133
230
  return result;
134
231
  }
135
- exports.tapTweakPrivkey = tapTweakPrivkey;
136
232
  /**
137
233
  * Tweaks an internal pubkey, using the tagged hash of itself, and (optionally) a taptree root
138
234
  * @param ecc Elliptic curve implementation
@@ -147,7 +243,6 @@ function tapTweakPubkey(ecc, pubkey, taptreeRoot) {
147
243
  throw new Error('Invalid pubkey');
148
244
  return result;
149
245
  }
150
- exports.tapTweakPubkey = tapTweakPubkey;
151
246
  function recurseTaptree(leaves, targetDepth = 0) {
152
247
  const { value, done } = leaves.next();
153
248
  assert(!done, 'insufficient leaves to reconstruct tap tree');
@@ -180,7 +275,6 @@ function getDepthFirstTaptree(tree) {
180
275
  assert(iter.next().done, 'invalid tap tree, no path to some leaves');
181
276
  return ret;
182
277
  }
183
- exports.getDepthFirstTaptree = getDepthFirstTaptree;
184
278
  /**
185
279
  * Gets the root hash of a taptree using a weighted Huffman construction from a
186
280
  * list of scripts and corresponding weights.
@@ -250,12 +344,10 @@ function getHuffmanTaptree(scripts, weights) {
250
344
  }, Array(scripts.length));
251
345
  return { root: rootNode.taggedHash, paths };
252
346
  }
253
- exports.getHuffmanTaptree = getHuffmanTaptree;
254
347
  function getControlBlock(parity, pubkey, path, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
255
348
  const parityVersion = leafVersion + parity;
256
349
  return Buffer.concat([Buffer.of(parityVersion), pubkey, ...path]);
257
350
  }
258
- exports.getControlBlock = getControlBlock;
259
351
  /**
260
352
  * Parses a taproot witness stack and extracts key data elements.
261
353
  * @param witnessStack
@@ -303,7 +395,6 @@ function parseTaprootWitness(witnessStack) {
303
395
  annex,
304
396
  };
305
397
  }
306
- exports.parseTaprootWitness = parseTaprootWitness;
307
398
  /**
308
399
  * Parses a taproot control block.
309
400
  * @param ecc Elliptic curve implementation
@@ -338,7 +429,6 @@ function parseControlBlock(ecc, controlBlock) {
338
429
  path,
339
430
  };
340
431
  }
341
- exports.parseControlBlock = parseControlBlock;
342
432
  /**
343
433
  * Calculates the tapleaf hash from a control block and script.
344
434
  * @param ecc Elliptic curve implementation
@@ -353,7 +443,6 @@ function getTapleafHash(ecc, controlBlock, tapscript) {
353
443
  const { leafVersion } = controlBlock;
354
444
  return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), serializeScriptSize(tapscript), tapscript]));
355
445
  }
356
- exports.getTapleafHash = getTapleafHash;
357
446
  /**
358
447
  * Calculates the taptree root hash from a control block and script.
359
448
  * @param ecc Elliptic curve implementation
@@ -379,16 +468,13 @@ function getTaptreeRoot(ecc, controlBlock, tapscript, tapleafHash) {
379
468
  }
380
469
  return taptreeMerkleHash;
381
470
  }
382
- exports.getTaptreeRoot = getTaptreeRoot;
383
471
  function getTweakedOutputKey(payment) {
384
- var _a;
385
472
  assert(payment.output);
386
473
  if (payment.output.length === 34) {
387
- return (_a = payment.output) === null || _a === void 0 ? void 0 : _a.subarray(2);
474
+ return payment.output?.subarray(2);
388
475
  }
389
476
  throw new Error(`invalid p2tr tweaked output key size ${payment.output.length}`);
390
477
  }
391
- exports.getTweakedOutputKey = getTweakedOutputKey;
392
478
  /**
393
479
  * @returns output script for either script path input controlBlock
394
480
  * & leafScript OR key path input internalPubKey & taptreeRoot
@@ -401,19 +487,18 @@ function createTaprootOutputScript(p2trArgs) {
401
487
  taptreeRoot = p2trArgs.taptreeRoot;
402
488
  }
403
489
  else {
404
- internalPubKey = parseControlBlock(noble_ecc_1.ecc, p2trArgs.controlBlock).internalPubkey;
405
- taptreeRoot = getTaptreeRoot(noble_ecc_1.ecc, p2trArgs.controlBlock, p2trArgs.leafScript);
490
+ internalPubKey = parseControlBlock(secp256k1_1.ecc, p2trArgs.controlBlock).internalPubkey;
491
+ taptreeRoot = getTaptreeRoot(secp256k1_1.ecc, p2trArgs.controlBlock, p2trArgs.leafScript);
406
492
  }
407
- const outputKey = tapTweakPubkey(noble_ecc_1.ecc, internalPubKey, taptreeRoot).xOnlyPubkey;
493
+ const outputKey = tapTweakPubkey(secp256k1_1.ecc, internalPubKey, taptreeRoot).xOnlyPubkey;
408
494
  return bitcoinjs_lib_1.script.compile([bitcoinjs_lib_1.script.OPS.OP_1, Buffer.from(outputKey)]);
409
495
  }
410
- exports.createTaprootOutputScript = createTaprootOutputScript;
411
496
  /**
412
497
  * @returns x-only taproot output key (tapOutputKey)
413
498
  */
414
499
  function getTaprootOutputKey(outputScript) {
415
500
  const outputDecompiled = bitcoinjs_lib_1.script.decompile(outputScript);
416
- if ((outputDecompiled === null || outputDecompiled === void 0 ? void 0 : outputDecompiled.length) !== 2) {
501
+ if (outputDecompiled?.length !== 2) {
417
502
  throw new Error('invalid taproot output script');
418
503
  }
419
504
  const [op1, outputKey] = outputDecompiled;
@@ -422,5 +507,4 @@ function getTaprootOutputKey(outputScript) {
422
507
  }
423
508
  return outputKey;
424
509
  }
425
- exports.getTaprootOutputKey = getTaprootOutputKey;
426
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvRUFBb0U7QUFDcEUsaUVBQWlFO0FBQ2pFLGlFQUFpRTs7O0FBR2pFLGlDQUFrQztBQUNsQyx1REFBd0Q7QUFDeEQsaURBQTRGO0FBQzVGLDJDQUE0QztBQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUUzQzs7O0dBR0c7QUFDVSxRQUFBLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFZOUM7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsR0FBMkIsRUFBRSxPQUFpQjtJQUNsRiwyQ0FBMkM7SUFDM0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLDZEQUE2RCxDQUFDLENBQUM7SUFFMUYsbUNBQW1DO0lBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTdCLHdFQUF3RTtJQUN4RSxxQkFBcUI7SUFDckIsRUFBRTtJQUNGLDBCQUEwQjtJQUMxQixFQUFFO0lBQ0YsNkVBQTZFO0lBQzdFLG1FQUFtRTtJQUNuRSxFQUFFO0lBQ0Ysa0NBQWtDO0lBQ2xDLG9CQUFvQjtJQUVwQixNQUFNLENBQUMsR0FBRyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFaEYsTUFBTSxjQUFjLEdBQWlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsMkJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUU5RCxJQUFJLGtCQUFrQixLQUFLLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekUsd0VBQXdFO1lBQ3hFLDhEQUE4RDtZQUM5RCx3RUFBd0U7WUFDeEUsd0JBQXdCO1lBQ3hCLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxDQUFDLEdBQUcsc0JBQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0UsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7U0FDN0Q7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDM0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBaERELHNEQWdEQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxNQUFjO0lBQ2hELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxNQUFjLEVBQUUsV0FBVyxHQUFHLGlDQUF5QjtJQUNqRixNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxPQUFPLHNCQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlGLENBQUM7QUFIRCxrQ0FHQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxNQUFjLEVBQUUsTUFBYztJQUMxRCxzQ0FBc0M7SUFDdEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU3RCxPQUFPLHNCQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUxELHNDQUtDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsTUFBa0IsRUFBRSxXQUF3QjtJQUM1RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxXQUFXLEVBQUU7UUFDZixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsT0FBTyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0U7SUFDRCw4RkFBOEY7SUFDOUYsNERBQTREO0lBQzVELDhFQUE4RTtJQUM5RSxPQUFPLHNCQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQWRELDhDQWNDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsR0FBMkIsRUFDM0IsTUFBa0IsRUFDbEIsT0FBbUIsRUFDbkIsV0FBd0I7SUFFeEIsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXhELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbkQsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUMsTUFBTTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNwRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBZEQsMENBY0M7QUFPRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQTJCLEVBQzNCLE1BQWtCLEVBQ2xCLFdBQW9CO0lBRXBCLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9DLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFURCx3Q0FTQztBQWdCRCxTQUFTLGNBQWMsQ0FBQyxNQUF1QyxFQUFFLFdBQVcsR0FBRyxDQUFDO0lBQzlFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzdELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzVCLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2hELEtBQUssRUFBRSxFQUFFO0tBQ1YsQ0FBQztJQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ3pELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsd0RBQXdEO1FBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxJQUFpQjtJQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25DLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUxELG9EQUtDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBaUIsRUFBRSxPQUFrQztJQUNyRixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUseURBQXlELENBQUMsQ0FBQztJQUV0Riw2RUFBNkU7SUFDN0UseUJBQXlCO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksaUJBQWlCLENBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBVyxFQUFFO1FBQ3ZFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFFN0QsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUNSLE1BQU07WUFDTixVQUFVLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUMvQixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRTtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsa0NBQWtDO0lBQ2xDLEVBQUU7SUFDRiwyRUFBMkU7SUFDM0UsMENBQTBDO0lBQzFDLHdDQUF3QztJQUN4Qyw0QkFBNEI7SUFDNUIsaUNBQWlDO0lBQ2pDLEVBQUU7SUFDRixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2Qix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1Qiw2QkFBNkI7SUFDN0IsRUFBRTtJQUNGLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLE9BQU8sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDckIseUVBQXlFO1FBQ3pFLG1FQUFtRTtRQUNuRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUF1QixDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQXVCLENBQUM7UUFFakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUU1RSxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ1IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDL0QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU07WUFDckMsS0FBSyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRTtTQUM1QyxDQUFDLENBQUM7S0FDSjtJQUVELDBFQUEwRTtJQUMxRSw2REFBNkQ7SUFDN0QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBdUIsQ0FBQztJQUVuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUN6RSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsMkNBQTJDO1FBQ3RFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDOUMsQ0FBQztBQXBFRCw4Q0FvRUM7QUFFRCxTQUFnQixlQUFlLENBQzdCLE1BQWEsRUFDYixNQUFrQixFQUNsQixJQUFjLEVBQ2QsV0FBVyxHQUFHLGlDQUF5QjtJQUV2QyxNQUFNLGFBQWEsR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDO0lBRTNDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBVEQsMENBU0M7QUF1QkQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsWUFBc0I7SUFDeEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqRix3RkFBd0Y7UUFDeEYsa0ZBQWtGO1FBQ2xGLEtBQUssR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxQztJQUVELElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0tBQ2pFO1NBQU0sSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNwQyxpQkFBaUI7UUFDakIsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxzQkFBTyxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0QztRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUMvQztJQUVELG9CQUFvQjtJQUNwQiwwQ0FBMEM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEQsTUFBTSxlQUFlLEdBQUcsc0JBQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFckQsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7S0FDcEQ7SUFFRCx1RkFBdUY7SUFDdkYsbUVBQW1FO0lBQ25FLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDckcsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0tBQ2pEO0lBRUQsT0FBTztRQUNMLFNBQVMsRUFBRSxRQUFRO1FBQ25CLFNBQVMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxTQUFTO1FBQ1QsWUFBWTtRQUNaLEtBQUs7S0FDTixDQUFDO0FBQ0osQ0FBQztBQTNDRCxrREEyQ0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxHQUEyQixFQUFFLFlBQW9CO0lBQ2pGLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDeEMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0tBQ3JEO0lBRUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUV0Qyw0RkFBNEY7SUFDNUYseUNBQXlDO0lBQ3pDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztLQUN2RDtJQUVELG9GQUFvRjtJQUNwRixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzNDLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7S0FDekM7SUFFRCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzFDO0lBRUQsT0FBTztRQUNMLE1BQU07UUFDTixjQUFjO1FBQ2QsV0FBVztRQUNYLElBQUk7S0FDTCxDQUFDO0FBQ0osQ0FBQztBQS9CRCw4Q0ErQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQTJCLEVBQzNCLFlBQW1DLEVBQ25DLFNBQWlCO0lBRWpCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUNqQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLFlBQVksQ0FBQztJQUVyQyxPQUFPLHNCQUFPLENBQUMsVUFBVSxDQUN2QixTQUFTLEVBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDbkYsQ0FBQztBQUNKLENBQUM7QUFkRCx3Q0FjQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQTJCLEVBQzNCLFlBQW1DLEVBQ25DLFNBQWlCLEVBQ2pCLFdBQW9CO0lBRXBCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUNqQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQztJQUU5QixXQUFXLEdBQUcsV0FBVyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTFFLGtGQUFrRjtJQUNsRixnRkFBZ0Y7SUFDaEYsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUM7SUFDcEMsS0FBSyxNQUFNLGtCQUFrQixJQUFJLElBQUksRUFBRTtRQUNyQyxpQkFBaUI7WUFDZixNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsc0JBQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLENBQUMsQ0FBQyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9GO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBeEJELHdDQXdCQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE9BQTBCOztJQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ2hDLE9BQU8sTUFBQSxPQUFPLENBQUMsTUFBTSwwQ0FBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQU5ELGtEQU1DO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQ3ZDLFFBQXdHO0lBRXhHLElBQUksY0FBa0MsQ0FBQztJQUN2QyxJQUFJLFdBQStCLENBQUM7SUFDcEMsSUFBSSxnQkFBZ0IsSUFBSSxRQUFRLEVBQUU7UUFDaEMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDekMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7S0FDcEM7U0FBTTtRQUNMLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxlQUFNLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUNqRixXQUFXLEdBQUcsY0FBYyxDQUFDLGVBQU0sRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNsRjtJQUNELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxlQUFNLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUNsRixPQUFPLHNCQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsc0JBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFkRCw4REFjQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsWUFBMEM7SUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUEsZ0JBQWdCLGFBQWhCLGdCQUFnQix1QkFBaEIsZ0JBQWdCLENBQUUsTUFBTSxNQUFLLENBQUMsRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7S0FDbEQ7SUFDRCxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0lBQzFDLElBQUksR0FBRyxLQUFLLHNCQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDdEYsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVZELGtEQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGFwcm9vdC1zcGVjaWZpYyBrZXkgYWdncmVnYXRpb24gYW5kIHRhcHRyZWUgbG9naWMgYXMgZGVmaW5lZCBpbjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraVxuXG5pbXBvcnQgeyBUYXBUcmVlIGFzIFBzYnRUYXBUcmVlLCBUYXBMZWFmIGFzIFBzYnRUYXBMZWFmIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5pbXBvcnQgRmFzdFByaW9yaXR5UXVldWUgPSByZXF1aXJlKCdmYXN0cHJpb3JpdHlxdWV1ZScpO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIGNyeXB0byBhcyBiY3J5cHRvLCBwYXltZW50cyBhcyBicGF5bWVudHMgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IGVjYyBhcyBlY2NMaWIgfSBmcm9tICcuL25vYmxlX2VjYyc7XG5jb25zdCB2YXJ1aW50ID0gcmVxdWlyZSgndmFydWludC1iaXRjb2luJyk7XG5cbi8qKlxuICogVGhlIDB4MDIgcHJlZml4IGluZGljYXRpbmcgYW4gZXZlbiBZIGNvb3JkaW5hdGUgd2hpY2ggaXMgaW1wbGljaXRseSBhc3N1bWVkXG4gKiBvbiBhbGwgMzIgYnl0ZSB4LW9ubHkgcHViIGtleXMgYXMgZGVmaW5lZCBpbiBCSVAzNDAuXG4gKi9cbmV4cG9ydCBjb25zdCBFVkVOX1lfQ09PUkRfUFJFRklYID0gQnVmZmVyLm9mKDB4MDIpO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT04gPSAweGMwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbnlTZWNwMjU2azFJbnRlcmZhY2Uge1xuICBpc1hPbmx5UG9pbnQocDogVWludDhBcnJheSk6IGJvb2xlYW47XG4gIHhPbmx5UG9pbnRBZGRUd2VhayhwOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSk6IFhPbmx5UG9pbnRBZGRUd2Vha1Jlc3VsdCB8IG51bGw7XG4gIHBvaW50RnJvbVNjYWxhcihzazogVWludDhBcnJheSwgY29tcHJlc3NlZD86IGJvb2xlYW4pOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRNdWx0aXBseShhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHBvaW50QWRkKGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcHJpdmF0ZUFkZChkOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlTmVnYXRlKGQ6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgYSBsaXN0IG9mIHB1YmxpYyBrZXlzIGludG8gYSBzaW5nbGUgTXVTaWcyKiBwdWJsaWMga2V5XG4gKiBhY2NvcmRpbmcgdG8gdGhlIE11U2lnMiBwYXBlci5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBwdWJrZXlzIFRoZSBsaXN0IG9mIHB1YiBrZXlzIHRvIGFnZ3JlZ2F0ZVxuICogQHJldHVybnMgYSAzMiBieXRlIEJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGFnZ3JlZ2F0ZSBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU11U2lnUHVia2V5cyhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIHB1YmtleXM6IEJ1ZmZlcltdKTogVWludDhBcnJheSB7XG4gIC8vIFRPRE86IENvbnNpZGVyIGVuZm9yY2luZyBrZXkgdW5pcXVlbmVzcy5cbiAgYXNzZXJ0KHB1YmtleXMubGVuZ3RoID4gMSwgJ2F0IGxlYXN0IHR3byBwdWJrZXlzIGFyZSByZXF1aXJlZCBmb3IgbXVzaWcga2V5IGFnZ3JlZ2F0aW9uJyk7XG5cbiAgLy8gU29ydCB0aGUga2V5cyBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgcHVia2V5cy5zb3J0KEJ1ZmZlci5jb21wYXJlKTtcblxuICAvLyBJbiBNdVNpZyBhbGwgc2lnbmVycyBjb250cmlidXRlIGtleSBtYXRlcmlhbCB0byBhIHNpbmdsZSBzaWduaW5nIGtleSxcbiAgLy8gdXNpbmcgdGhlIGVxdWF0aW9uXG4gIC8vXG4gIC8vICAgICBQID0gc3VtX2kgwrVfaSAqIFBfaVxuICAvL1xuICAvLyB3aGVyZSBgUF9pYCBpcyB0aGUgcHVibGljIGtleSBvZiB0aGUgYGlgdGggc2lnbmVyIGFuZCBgwrVfaWAgaXMgYSBzby1jYWxsZWRcbiAgLy8gX011U2lnIGNvZWZmaWNpZW50XyBjb21wdXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBlcXVhdGlvblxuICAvL1xuICAvLyBMID0gSChQXzEgfHwgUF8yIHx8IC4uLiB8fCBQX24pXG4gIC8vIMK1X2kgPSBIKEwgfHwgUF9pKVxuXG4gIGNvbnN0IEwgPSBiY3J5cHRvLnRhZ2dlZEhhc2goJ0tleUFnZyBsaXN0JywgQnVmZmVyLmNvbmNhdChwdWJrZXlzKSk7XG5cbiAgY29uc3Qgc2Vjb25kVW5pcXVlUHVia2V5ID0gcHVia2V5cy5maW5kKChwdWJrZXkpID0+ICFwdWJrZXlzWzBdLmVxdWFscyhwdWJrZXkpKTtcblxuICBjb25zdCB0d2Vha2VkUHVia2V5czogVWludDhBcnJheVtdID0gcHVia2V5cy5tYXAoKHB1YmtleSkgPT4ge1xuICAgIGNvbnN0IHh5UHVia2V5ID0gQnVmZmVyLmNvbmNhdChbRVZFTl9ZX0NPT1JEX1BSRUZJWCwgcHVia2V5XSk7XG5cbiAgICBpZiAoc2Vjb25kVW5pcXVlUHVia2V5ICE9PSB1bmRlZmluZWQgJiYgc2Vjb25kVW5pcXVlUHVia2V5LmVxdWFscyhwdWJrZXkpKSB7XG4gICAgICAvLyBUaGUgc2Vjb25kIHVuaXF1ZSBrZXkgaW4gdGhlIHB1YmtleSBsaXN0IGdpdmVuIHRvICcnS2V5QWdnJycgKGFzIHdlbGxcbiAgICAgIC8vIGFzIGFueSBrZXlzIGlkZW50aWNhbCB0byB0aGlzIGtleSkgZ2V0cyB0aGUgY29uc3RhbnQgS2V5QWdnXG4gICAgICAvLyBjb2VmZmljaWVudCAxIHdoaWNoIHNhdmVzIGFuIGV4cG9uZW50aWF0aW9uIChzZWUgdGhlIE11U2lnMiogYXBwZW5kaXhcbiAgICAgIC8vIGluIHRoZSBNdVNpZzIgcGFwZXIpLlxuICAgICAgcmV0dXJuIHh5UHVia2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGMgPSBiY3J5cHRvLnRhZ2dlZEhhc2goJ0tleUFnZyBjb2VmZmljaWVudCcsIEJ1ZmZlci5jb25jYXQoW0wsIHB1YmtleV0pKTtcblxuICAgIGNvbnN0IHR3ZWFrZWRQdWJrZXkgPSBlY2MucG9pbnRNdWx0aXBseSh4eVB1YmtleSwgYyk7XG4gICAgaWYgKCF0d2Vha2VkUHVia2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBtdWx0aXBseSBwdWJrZXkgYnkgY29lZmZpY2llbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR3ZWFrZWRQdWJrZXk7XG4gIH0pO1xuICBjb25zdCBhZ2dyZWdhdGVQdWJrZXkgPSB0d2Vha2VkUHVia2V5cy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gZWNjLnBvaW50QWRkKHByZXYsIGN1cnIpO1xuICAgIGlmICghbmV4dCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc3VtIHB1YmtleXMnKTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSk7XG5cbiAgcmV0dXJuIGFnZ3JlZ2F0ZVB1YmtleS5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBsZW5ndGggb2YgYSBzY3JpcHQgYXMgYSBiaXRjb2luIHZhcmlhYmxlIGxlbmd0aCBpbnRlZ2VyLlxuICogQHBhcmFtIHNjcmlwdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVNjcmlwdFNpemUoc2NyaXB0OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gdmFydWludC5lbmNvZGUoc2NyaXB0Lmxlbmd0aCk7XG59XG5cbi8qKlxuICogR2V0cyBhIHRhcGxlYWYgdGFnZ2VkIGhhc2ggZnJvbSBhIHNjcmlwdC5cbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoVGFwTGVhZihzY3JpcHQ6IEJ1ZmZlciwgbGVhZlZlcnNpb24gPSBJTklUSUFMX1RBUFNDUklQVF9WRVJTSU9OKTogQnVmZmVyIHtcbiAgY29uc3Qgc2l6ZSA9IHNlcmlhbGl6ZVNjcmlwdFNpemUoc2NyaXB0KTtcbiAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwTGVhZicsIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5vZihsZWFmVmVyc2lvbiksIHNpemUsIHNjcmlwdF0pKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIHRhcGJyYW5jaCBmcm9tIHR3byBjaGlsZCB0YXB0cmVlIG5vZGVzXG4gKiBhbmQgcmV0dXJucyBpdHMgdGFnZ2VkIGhhc2guXG4gKiBAcGFyYW0gY2hpbGQxXG4gKiBAcGFyYW0gY2hpbGQyXG4gKiBAcmV0dXJucyB0aGUgdGFnZ2VkIHRhcGJyYW5jaCBoYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoVGFwQnJhbmNoKGNoaWxkMTogQnVmZmVyLCBjaGlsZDI6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIC8vIHNvcnQgdGhlIGNoaWxkcmVuIGxleGljb2dyYXBoaWNhbGx5XG4gIGNvbnN0IHNvcnRlZENoaWxkcmVuID0gW2NoaWxkMSwgY2hpbGQyXS5zb3J0KEJ1ZmZlci5jb21wYXJlKTtcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBCcmFuY2gnLCBCdWZmZXIuY29uY2F0KHNvcnRlZENoaWxkcmVuKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXk6IFVpbnQ4QXJyYXksIHRhcHRyZWVSb290PzogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBpZiAocHVia2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHVia2V5IHNpemUgJHtwdWJrZXkubGVuZ3RofS5gKTtcbiAgfVxuICBpZiAodGFwdHJlZVJvb3QpIHtcbiAgICBpZiAodGFwdHJlZVJvb3QubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhcHRyZWVSb290IHNpemUgJHt0YXB0cmVlUm9vdC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5jb25jYXQoW3B1YmtleSwgdGFwdHJlZVJvb3RdKSk7XG4gIH1cbiAgLy8gSWYgdGhlIHNwZW5kaW5nIGNvbmRpdGlvbnMgZG8gbm90IHJlcXVpcmUgYSBzY3JpcHQgcGF0aCwgdGhlIG91dHB1dCBrZXkgc2hvdWxkIGNvbW1pdCB0byBhblxuICAvLyB1bnNwZW5kYWJsZSBzY3JpcHQgcGF0aCBpbnN0ZWFkIG9mIGhhdmluZyBubyBzY3JpcHQgcGF0aC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDM0MS5tZWRpYXdpa2kjY2l0ZV9ub3RlLTIyXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcFR3ZWFrJywgQnVmZmVyLmZyb20ocHVia2V5KSk7XG59XG5cbi8qKlxuICogVHdlYWtzIGEgcHJpdmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0cyBwdWJrZXksIGFuZCAob3B0aW9uYWxseSkgYSB0YXB0cmVlIHJvb3RcbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBwdWJrZXkgcHVibGljIGtleSwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHR3ZWFrXG4gKiBAcGFyYW0gcHJpdmtleSB0aGUgcHJpdmtleSB0byB0d2Vha1xuICogQHBhcmFtIHRhcHRyZWVSb290IHRoZSB0YXB0cmVlIHJvb3QgdGFnZ2VkIGhhc2hcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0d2Vha2VkIHByaXZrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhcFR3ZWFrUHJpdmtleShcbiAgZWNjOiBUaW55U2VjcDI1NmsxSW50ZXJmYWNlLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHByaXZrZXk6IFVpbnQ4QXJyYXksXG4gIHRhcHRyZWVSb290PzogVWludDhBcnJheVxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHRhcFR3ZWFrID0gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5LCB0YXB0cmVlUm9vdCk7XG5cbiAgY29uc3QgcG9pbnQgPSBlY2MucG9pbnRGcm9tU2NhbGFyKHByaXZrZXkpO1xuICBpZiAoIXBvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgaWYgKHBvaW50WzBdICUgMiA9PT0gMSkgcHJpdmtleSA9IGVjYy5wcml2YXRlTmVnYXRlKHByaXZrZXkpO1xuICBjb25zdCByZXN1bHQgPSBlY2MucHJpdmF0ZUFkZChwcml2a2V5LCB0YXBUd2Vhayk7XG4gIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBYT25seVBvaW50QWRkVHdlYWtSZXN1bHQge1xuICBwYXJpdHk6IDEgfCAwO1xuICB4T25seVB1YmtleTogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBUd2Vha3MgYW4gaW50ZXJuYWwgcHVia2V5LCB1c2luZyB0aGUgdGFnZ2VkIGhhc2ggb2YgaXRzZWxmLCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHRoZSBpbnRlcm5hbCBwdWJrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7VHdlYWtlZFB1YmtleX0gdGhlIHR3ZWFrZWQgcHVia2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1B1YmtleShcbiAgZWNjOiBUaW55U2VjcDI1NmsxSW50ZXJmYWNlLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHRhcHRyZWVSb290PzogQnVmZmVyXG4pOiBYT25seVBvaW50QWRkVHdlYWtSZXN1bHQge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuICBjb25zdCByZXN1bHQgPSBlY2MueE9ubHlQb2ludEFkZFR3ZWFrKHB1YmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHB1YmtleScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcHRyZWUge1xuICByb290OiBCdWZmZXI7XG4gIHBhdGhzOiBCdWZmZXJbXVtdO1xufVxuXG5pbnRlcmZhY2UgV2VpZ2h0ZWRUYXBTY3JpcHQge1xuICAvKiogQSBUYXBMZWFmIG9yIFRhcEJyYW5jaCB0YWdnZWQgaGFzaCAqL1xuICB0YWdnZWRIYXNoOiBCdWZmZXI7XG4gIHdlaWdodDogbnVtYmVyO1xuICBwYXRoczoge1xuICAgIFtpbmRleDogbnVtYmVyXTogQnVmZmVyW107XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2VUYXB0cmVlKGxlYXZlczogSXRlcmF0b3I8W251bWJlciwgUHNidFRhcExlYWZdPiwgdGFyZ2V0RGVwdGggPSAwKTogVGFwdHJlZSB7XG4gIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGxlYXZlcy5uZXh0KCk7XG4gIGFzc2VydCghZG9uZSwgJ2luc3VmZmljaWVudCBsZWF2ZXMgdG8gcmVjb25zdHJ1Y3QgdGFwIHRyZWUnKTtcbiAgY29uc3QgW2luZGV4LCBsZWFmXSA9IHZhbHVlO1xuICBjb25zdCB0cmVlOiBUYXB0cmVlID0ge1xuICAgIHJvb3Q6IGhhc2hUYXBMZWFmKGxlYWYuc2NyaXB0LCBsZWFmLmxlYWZWZXJzaW9uKSxcbiAgICBwYXRoczogW10sXG4gIH07XG4gIHRyZWUucGF0aHNbaW5kZXhdID0gW107XG4gIGZvciAobGV0IGRlcHRoID0gbGVhZi5kZXB0aDsgZGVwdGggPiB0YXJnZXREZXB0aDsgZGVwdGgtLSkge1xuICAgIGNvbnN0IHNpYmxpbmcgPSByZWN1cnNlVGFwdHJlZShsZWF2ZXMsIGRlcHRoKTtcbiAgICB0cmVlLnBhdGhzLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChzaWJsaW5nLnJvb3QpKTtcbiAgICBzaWJsaW5nLnBhdGhzLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaCh0cmVlLnJvb3QpKTtcbiAgICB0cmVlLnJvb3QgPSBoYXNoVGFwQnJhbmNoKHRyZWUucm9vdCwgc2libGluZy5yb290KTtcbiAgICAvLyBNZXJnZSBkaXNqb2ludCBzcGFyc2UgYXJyYXlzIG9mIHBhdGhzIGludG8gdHJlZS5wYXRoc1xuICAgIE9iamVjdC5hc3NpZ24odHJlZS5wYXRocywgc2libGluZy5wYXRocyk7XG4gIH1cbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIGFuZCBoYXNoLXBhdGhzIG9mIGEgdGFwdHJlZSBmcm9tIHRoZSBkZXB0aC1maXJzdFxuICogY29uc3RydWN0aW9uIHVzZWQgaW4gQklQLTAzNzEgUFNCVHNcbiAqIEBwYXJhbSB0cmVlXG4gKiBAcmV0dXJucyB7VGFwdHJlZX0gdGhlIHRyZWUsIHJlcHJlc2VudGVkIGJ5IGl0cyByb290IGhhc2gsIGFuZCB0aGUgcGF0aHMgdG9cbiAqIHRoYXQgcm9vdCBmcm9tIGVhY2ggb2YgdGhlIGlucHV0IHNjcmlwdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlcHRoRmlyc3RUYXB0cmVlKHRyZWU6IFBzYnRUYXBUcmVlKTogVGFwdHJlZSB7XG4gIGNvbnN0IGl0ZXIgPSB0cmVlLmxlYXZlcy5lbnRyaWVzKCk7XG4gIGNvbnN0IHJldCA9IHJlY3Vyc2VUYXB0cmVlKGl0ZXIpO1xuICBhc3NlcnQoaXRlci5uZXh0KCkuZG9uZSwgJ2ludmFsaWQgdGFwIHRyZWUsIG5vIHBhdGggdG8gc29tZSBsZWF2ZXMnKTtcbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSByb290IGhhc2ggb2YgYSB0YXB0cmVlIHVzaW5nIGEgd2VpZ2h0ZWQgSHVmZm1hbiBjb25zdHJ1Y3Rpb24gZnJvbSBhXG4gKiBsaXN0IG9mIHNjcmlwdHMgYW5kIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAqIEBwYXJhbSBzY3JpcHRzXG4gKiBAcGFyYW0gd2VpZ2h0c1xuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvIHRoYXQgcm9vdCBmcm9tIGVhY2ggb2YgdGhlIGlucHV0IHNjcmlwdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEh1ZmZtYW5UYXB0cmVlKHNjcmlwdHM6IEJ1ZmZlcltdLCB3ZWlnaHRzOiBBcnJheTxudW1iZXIgfCB1bmRlZmluZWQ+KTogVGFwdHJlZSB7XG4gIGFzc2VydChzY3JpcHRzLmxlbmd0aCA+IDAsICdhdCBsZWFzdCBvbmUgc2NyaXB0IGlzIHJlcXVpcmVkIHRvIGNvbnN0cnVjdCBhIHRhcCB0cmVlJyk7XG5cbiAgLy8gQ3JlYXRlIGEgcXVldWUvaGVhcCBvZiB0aGUgcHJvdmlkZWQgc2NyaXB0cyBwcmlvcml0aXplZCBhY2NvcmRpbmcgdG8gdGhlaXJcbiAgLy8gY29ycmVzcG9uZGluZyB3ZWlnaHRzLlxuICBjb25zdCBxdWV1ZSA9IG5ldyBGYXN0UHJpb3JpdHlRdWV1ZTxXZWlnaHRlZFRhcFNjcmlwdD4oKGEsIGIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gYS53ZWlnaHQgPCBiLndlaWdodDtcbiAgfSk7XG4gIHNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHdlaWdodCA9IHdlaWdodHNbaW5kZXhdIHx8IDE7XG4gICAgYXNzZXJ0KHdlaWdodCA+IDAsICdzY3JpcHQgd2VpZ2h0IG11c3QgYmUgYSBwb3NpdGl2ZSB2YWx1ZScpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHdlaWdodCxcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBMZWFmKHNjcmlwdCksXG4gICAgICBwYXRoczogeyBbaW5kZXhdOiBbXSB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcXVldWUgb2Ygd2VpZ2h0ZWQgc2NyaXB0cywgd2UgYmVnaW4gYSBsb29wIHdoZXJlYnkgd2VcbiAgLy8gcmVtb3ZlIHRoZSB0d28gbG93ZXN0IHdlaWdodGVkIGl0ZW1zIGZyb20gdGhlIHF1ZXVlLiBXZSBjcmVhdGUgYSB0YXAgYnJhbmNoXG4gIC8vIG5vZGUgZnJvbSB0aGUgdHdvIGl0ZW1zLCBhbmQgYWRkIHRoZSBicmFuY2ggYmFjayB0byB0aGUgcXVldWUgd2l0aCB0aGVcbiAgLy8gY29tYmluZWQgd2VpZ2h0IG9mIGJvdGggaXRzIGNoaWxkcmVuLiBFYWNoIGxvb3AgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGl0ZW1zXG4gIC8vIGluIHRoZSBxdWV1ZSBieSBvbmUsIGFuZCB3ZSByZXBlYXQgdW50aWwgd2UgYXJlIGxlZnQgd2l0aCBvbmx5IG9uZSBpdGVtIC1cbiAgLy8gdGhpcyBiZWNvbWVzIHRoZSB0YXAgdHJlZSByb290LlxuICAvL1xuICAvLyBGb3IgZXhhbXBsZSwgaWYgd2UgYmVnaW4gd2l0aCBzY3JpcHRzIEEsIEIsIEMsIEQgd2l0aCB3ZWlnaHRzIDYsIDMsIDEsIDFcbiAgLy8gQWZ0ZXIgZmlyc3QgbG9vcDogQSg2KSwgQigzKSwgQ0QoMSArIDEpXG4gIC8vIEFmdGVyIHNlY29uZCBsb29wOiBBKDYpLCBCW0NEXSgzICsgMilcbiAgLy8gRmluYWwgbG9vcDogQVtCW0NEXV0oNis1KVxuICAvLyBUaGUgZmluYWwgdHJlZSB3aWxsIGxvb2sgbGlrZTpcbiAgLy9cbiAgLy8gICAgICAgIEFbQltDRF1dXG4gIC8vICAgICAgIC8gICAgICAgIFxcXG4gIC8vICAgICAgQSAgICAgICAgIEJbQ0RdXG4gIC8vICAgICAgICAgICAgICAgLyAgICAgXFxcbiAgLy8gICAgICAgICAgICAgIEIgICAgICBbQ0RdXG4gIC8vICAgICAgICAgICAgICAgICAgICAvICAgIFxcXG4gIC8vICAgICAgICAgICAgICAgICAgIEMgICAgICBEXG4gIC8vXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzcGVuZGluZyBjb25kaXRpb25zIHdlIGJlbGlldmUgdG8gaGF2ZSB0aGUgaGlnaGVzdFxuICAvLyBwcm9iYWJpbGl0eSBvZiBiZWluZyB1c2VkIGFyZSBmdXJ0aGVyIHVwIHRoZSB0cmVlIHRoYW4gbGVzcyBsaWtlbHkgc2NyaXB0cyxcbiAgLy8gdGhlcmVieSByZWR1Y2luZyB0aGUgc2l6ZSBvZiB0aGUgbWVya2xlIHByb29mcyBmb3IgdGhlIG1vcmUgbGlrZWx5IHNjcmlwdHMuXG4gIHdoaWxlIChxdWV1ZS5zaXplID4gMSkge1xuICAgIC8vIFdlIGNhbiBzYWZlbHkgZXhwZWN0IHR3byBwb2xscyB0byByZXR1cm4gbm9uLW51bGwgZWxlbWVudHMgc2luY2Ugd2UndmVcbiAgICAvLyBjaGVja2VkIHRoYXQgdGhlIHF1ZXVlIGhhcyBhdCBsZWFzdCB0d28gZWxlbWVudHMgYmVmb3JlIGxvb3BpbmcuXG4gICAgY29uc3QgY2hpbGQxID0gcXVldWUucG9sbCgpIGFzIFdlaWdodGVkVGFwU2NyaXB0O1xuICAgIGNvbnN0IGNoaWxkMiA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICAgIE9iamVjdC52YWx1ZXMoY2hpbGQxLnBhdGhzKS5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goY2hpbGQyLnRhZ2dlZEhhc2gpKTtcbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMi5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMS50YWdnZWRIYXNoKSk7XG5cbiAgICBxdWV1ZS5hZGQoe1xuICAgICAgdGFnZ2VkSGFzaDogaGFzaFRhcEJyYW5jaChjaGlsZDEudGFnZ2VkSGFzaCwgY2hpbGQyLnRhZ2dlZEhhc2gpLFxuICAgICAgd2VpZ2h0OiBjaGlsZDEud2VpZ2h0ICsgY2hpbGQyLndlaWdodCxcbiAgICAgIHBhdGhzOiB7IC4uLmNoaWxkMS5wYXRocywgLi4uY2hpbGQyLnBhdGhzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBBZnRlciB0aGUgd2hpbGUgbG9vcCBhYm92ZSBjb21wbGV0ZXMgd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgZWxlbWVudFxuICAvLyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLCB3aGljaCB3ZSBjYW4gc2FmZWx5IGV4dHJhY3QgYmVsb3cuXG4gIGNvbnN0IHJvb3ROb2RlID0gcXVldWUucG9sbCgpIGFzIFdlaWdodGVkVGFwU2NyaXB0O1xuXG4gIGNvbnN0IHBhdGhzID0gT2JqZWN0LmVudHJpZXMocm9vdE5vZGUucGF0aHMpLnJlZHVjZSgoYWNjLCBbaW5kZXgsIHBhdGhdKSA9PiB7XG4gICAgYWNjW051bWJlcihpbmRleCldID0gcGF0aDsgLy8gVE9ETzogV2h5IGRvZXNuJ3QgVFMga25vdyBpdCdzIGEgbnVtYmVyP1xuICAgIHJldHVybiBhY2M7XG4gIH0sIEFycmF5KHNjcmlwdHMubGVuZ3RoKSk7XG4gIHJldHVybiB7IHJvb3Q6IHJvb3ROb2RlLnRhZ2dlZEhhc2gsIHBhdGhzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sQmxvY2soXG4gIHBhcml0eTogMCB8IDEsXG4gIHB1YmtleTogVWludDhBcnJheSxcbiAgcGF0aDogQnVmZmVyW10sXG4gIGxlYWZWZXJzaW9uID0gSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTlxuKTogQnVmZmVyIHtcbiAgY29uc3QgcGFyaXR5VmVyc2lvbiA9IGxlYWZWZXJzaW9uICsgcGFyaXR5O1xuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YocGFyaXR5VmVyc2lvbiksIHB1YmtleSwgLi4ucGF0aF0pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleVBhdGhXaXRuZXNzIHtcbiAgc3BlbmRUeXBlOiAnS2V5JztcbiAgc2lnbmF0dXJlOiBCdWZmZXI7XG4gIGFubmV4PzogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdFBhdGhXaXRuZXNzIHtcbiAgc3BlbmRUeXBlOiAnU2NyaXB0JztcbiAgc2NyaXB0U2lnOiBCdWZmZXJbXTtcbiAgdGFwc2NyaXB0OiBCdWZmZXI7XG4gIGNvbnRyb2xCbG9jazogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sQmxvY2sge1xuICBwYXJpdHk6IG51bWJlcjtcbiAgaW50ZXJuYWxQdWJrZXk6IEJ1ZmZlcjtcbiAgbGVhZlZlcnNpb246IG51bWJlcjtcbiAgcGF0aDogQnVmZmVyW107XG59XG5cbi8qKlxuICogUGFyc2VzIGEgdGFwcm9vdCB3aXRuZXNzIHN0YWNrIGFuZCBleHRyYWN0cyBrZXkgZGF0YSBlbGVtZW50cy5cbiAqIEBwYXJhbSB3aXRuZXNzU3RhY2tcbiAqIEByZXR1cm5zIHtTY3JpcHRQYXRoV2l0bmVzc3xLZXlQYXRoV2l0bmVzc30gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGVcbiAqIHBhcnNlZCB3aXRuZXNzIGZvciBhIHNjcmlwdCBwYXRoIG9yIGtleSBwYXRoIHNwZW5kLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSB3aXRuZXNzIHN0YWNrIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIEJJUCAzNDEgc2NyaXB0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFwcm9vdFdpdG5lc3Mod2l0bmVzc1N0YWNrOiBCdWZmZXJbXSk6IFNjcmlwdFBhdGhXaXRuZXNzIHwgS2V5UGF0aFdpdG5lc3Mge1xuICBsZXQgYW5uZXg7XG4gIGlmICh3aXRuZXNzU3RhY2subGVuZ3RoID49IDIgJiYgd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXVswXSA9PT0gMHg1MCkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gd2l0bmVzcyBlbGVtZW50cywgYW5kIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBsYXN0IGVsZW1lbnQgaXNcbiAgICAvLyAweDUwLCB0aGlzIGxhc3QgZWxlbWVudCBpcyBjYWxsZWQgYW5uZXggYSBhbmQgaXMgcmVtb3ZlZCBmcm9tIHRoZSB3aXRuZXNzIHN0YWNrXG4gICAgYW5uZXggPSB3aXRuZXNzU3RhY2tbd2l0bmVzc1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIHdpdG5lc3NTdGFjayA9IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMSk7XG4gIH1cblxuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpdG5lc3Mgc3RhY2sgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50Jyk7XG4gIH0gZWxzZSBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGtleSBwYXRoIHNwZW5kXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gd2l0bmVzc1N0YWNrWzBdO1xuICAgIGlmICghYnNjcmlwdC5pc0Nhbm9uaWNhbFNjaG5vcnJTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICByZXR1cm4geyBzcGVuZFR5cGU6ICdLZXknLCBzaWduYXR1cmUsIGFubmV4IH07XG4gIH1cblxuICAvLyBzY3JpcHQgcGF0aCBzcGVuZFxuICAvLyBzZWNvbmQgdG8gbGFzdCBlbGVtZW50IGlzIHRoZSB0YXBzY3JpcHRcbiAgY29uc3QgdGFwc2NyaXB0ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAyXTtcbiAgY29uc3QgdGFwc2NyaXB0Q2h1bmtzID0gYnNjcmlwdC5kZWNvbXBpbGUodGFwc2NyaXB0KTtcblxuICBpZiAoIXRhcHNjcmlwdENodW5rcyB8fCB0YXBzY3JpcHRDaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBzY3JpcHQgaXMgbm90IGEgdmFsaWQgc2NyaXB0Jyk7XG4gIH1cblxuICAvLyBUaGUgbGFzdCBzdGFjayBlbGVtZW50IGlzIGNhbGxlZCB0aGUgY29udHJvbCBibG9jayBjLCBhbmQgbXVzdCBoYXZlIGxlbmd0aCAzMyArIDMybSxcbiAgLy8gZm9yIGEgdmFsdWUgb2YgbSB0aGF0IGlzIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMjgsIGluY2x1c2l2ZVxuICBjb25zdCBjb250cm9sQmxvY2sgPSB3aXRuZXNzU3RhY2tbd2l0bmVzc1N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoY29udHJvbEJsb2NrLmxlbmd0aCA8IDMzIHx8IGNvbnRyb2xCbG9jay5sZW5ndGggPiAzMyArIDMyICogMTI4IHx8IGNvbnRyb2xCbG9jay5sZW5ndGggJSAzMiAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjb250cm9sIGJsb2NrIGxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzcGVuZFR5cGU6ICdTY3JpcHQnLFxuICAgIHNjcmlwdFNpZzogd2l0bmVzc1N0YWNrLnNsaWNlKDAsIC0yKSxcbiAgICB0YXBzY3JpcHQsXG4gICAgY29udHJvbEJsb2NrLFxuICAgIGFubmV4LFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3QgY29udHJvbCBibG9jay5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2sgdG8gcGFyc2VcbiAqIEByZXR1cm5zIHtDb250cm9sQmxvY2t9IHRoZSBwYXJzZWQgY29udHJvbCBibG9ja1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSB3aXRuZXNzIHN0YWNrIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIEJJUCAzNDEgc2NyaXB0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29udHJvbEJsb2NrKGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSwgY29udHJvbEJsb2NrOiBCdWZmZXIpOiBDb250cm9sQmxvY2sge1xuICBpZiAoKGNvbnRyb2xCbG9jay5sZW5ndGggLSAxKSAlIDMyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjb250cm9sIGJsb2NrIGxlbmd0aCcpO1xuICB9XG5cbiAgY29uc3QgcGFyaXR5ID0gY29udHJvbEJsb2NrWzBdICYgMHgwMTtcblxuICAvLyBMZXQgcCA9IGNbMTozM10gYW5kIGxldCBQID0gbGlmdF94KGludChwKSkgd2hlcmUgbGlmdF94IGFuZCBbOl0gYXJlIGRlZmluZWQgYXMgaW4gQklQMzQwLlxuICAvLyBGYWlsIGlmIHRoaXMgcG9pbnQgaXMgbm90IG9uIHRoZSBjdXJ2ZVxuICBjb25zdCBpbnRlcm5hbFB1YmtleSA9IGNvbnRyb2xCbG9jay5zbGljZSgxLCAzMyk7XG4gIGlmICghZWNjLmlzWE9ubHlQb2ludChpbnRlcm5hbFB1YmtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIHB1YmtleSBpcyBub3QgYW4gRUMgcG9pbnQnKTtcbiAgfVxuXG4gIC8vIFRoZSBsZWFmIHZlcnNpb24gY2Fubm90IGJlIDB4NTAgYXMgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW1iaWd1aXR5IHdpdGggdGhlIGFubmV4LlxuICBjb25zdCBsZWFmVmVyc2lvbiA9IGNvbnRyb2xCbG9ja1swXSAmIDB4ZmU7XG4gIGlmIChsZWFmVmVyc2lvbiA9PT0gMHg1MCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsZWFmIHZlcnNpb24nKTtcbiAgfVxuXG4gIGNvbnN0IHBhdGg6IEJ1ZmZlcltdID0gW107XG4gIGZvciAobGV0IGogPSAzMzsgaiA8IGNvbnRyb2xCbG9jay5sZW5ndGg7IGogKz0gMzIpIHtcbiAgICBwYXRoLnB1c2goY29udHJvbEJsb2NrLnNsaWNlKGosIGogKyAzMikpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJpdHksXG4gICAgaW50ZXJuYWxQdWJrZXksXG4gICAgbGVhZlZlcnNpb24sXG4gICAgcGF0aCxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSB0YXBsZWFmIGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHJldHVybnMge0J1ZmZlcn0gdGhlIHRhcGxlYWYgaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFwbGVhZkhhc2goXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgY29udHJvbEJsb2NrOiBCdWZmZXIgfCBDb250cm9sQmxvY2ssXG4gIHRhcHNjcmlwdDogQnVmZmVyXG4pOiBCdWZmZXIge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRyb2xCbG9jaykpIHtcbiAgICBjb250cm9sQmxvY2sgPSBwYXJzZUNvbnRyb2xCbG9jayhlY2MsIGNvbnRyb2xCbG9jayk7XG4gIH1cbiAgY29uc3QgeyBsZWFmVmVyc2lvbiB9ID0gY29udHJvbEJsb2NrO1xuXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goXG4gICAgJ1RhcExlYWYnLFxuICAgIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5vZihsZWFmVmVyc2lvbiksIHNlcmlhbGl6ZVNjcmlwdFNpemUodGFwc2NyaXB0KSwgdGFwc2NyaXB0XSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSB0YXB0cmVlIHJvb3QgaGFzaCBmcm9tIGEgY29udHJvbCBibG9jayBhbmQgc2NyaXB0LlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIGNvbnRyb2xCbG9jayB0aGUgY29udHJvbCBibG9jaywgZWl0aGVyIHJhdyBvciBwYXJzZWRcbiAqIEBwYXJhbSB0YXBzY3JpcHQgdGhlIGxlYWYgc2NyaXB0IGNvcnJlc2Rwb25kaW5nIHRvIHRoZSBjb250cm9sIGJsb2NrXG4gKiBAcGFyYW0gdGFwbGVhZkhhc2ggdGhlIGxlYWYgaGFzaCBpZiBhbHJlYWR5IGNhbGN1bGF0ZWRcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXB0cmVlIHJvb3QgaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFwdHJlZVJvb3QoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgY29udHJvbEJsb2NrOiBCdWZmZXIgfCBDb250cm9sQmxvY2ssXG4gIHRhcHNjcmlwdDogQnVmZmVyLFxuICB0YXBsZWFmSGFzaD86IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgcGF0aCB9ID0gY29udHJvbEJsb2NrO1xuXG4gIHRhcGxlYWZIYXNoID0gdGFwbGVhZkhhc2ggfHwgZ2V0VGFwbGVhZkhhc2goZWNjLCBjb250cm9sQmxvY2ssIHRhcHNjcmlwdCk7XG5cbiAgLy8gYHRhcHRyZWVNZXJrbGVIYXNoYCBiZWdpbnMgYXMgb3VyIHRhcHNjcmlwdCB0YXBsZWFmIGhhc2ggYW5kIGl0cyB2YWx1ZSBpdGVyYXRlc1xuICAvLyB0aHJvdWdoIGl0cyBwYXJlbnQgdGFwYnJhbmNoIGhhc2hlcyB1bnRpbCBpdCBlbmRzIHVwIGFzIHRoZSB0YXB0cmVlIHJvb3QgaGFzaFxuICBsZXQgdGFwdHJlZU1lcmtsZUhhc2ggPSB0YXBsZWFmSGFzaDtcbiAgZm9yIChjb25zdCB0YXB0cmVlU2libGluZ0hhc2ggb2YgcGF0aCkge1xuICAgIHRhcHRyZWVNZXJrbGVIYXNoID1cbiAgICAgIEJ1ZmZlci5jb21wYXJlKHRhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2gpID09PSAtMVxuICAgICAgICA/IGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwQnJhbmNoJywgQnVmZmVyLmNvbmNhdChbdGFwdHJlZU1lcmtsZUhhc2gsIHRhcHRyZWVTaWJsaW5nSGFzaF0pKVxuICAgICAgICA6IGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwQnJhbmNoJywgQnVmZmVyLmNvbmNhdChbdGFwdHJlZVNpYmxpbmdIYXNoLCB0YXB0cmVlTWVya2xlSGFzaF0pKTtcbiAgfVxuXG4gIHJldHVybiB0YXB0cmVlTWVya2xlSGFzaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR3ZWFrZWRPdXRwdXRLZXkocGF5bWVudDogYnBheW1lbnRzLlBheW1lbnQpOiBCdWZmZXIge1xuICBhc3NlcnQocGF5bWVudC5vdXRwdXQpO1xuICBpZiAocGF5bWVudC5vdXRwdXQubGVuZ3RoID09PSAzNCkge1xuICAgIHJldHVybiBwYXltZW50Lm91dHB1dD8uc3ViYXJyYXkoMik7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHAydHIgdHdlYWtlZCBvdXRwdXQga2V5IHNpemUgJHtwYXltZW50Lm91dHB1dC5sZW5ndGh9YCk7XG59XG5cbi8qKlxuICogQHJldHVybnMgb3V0cHV0IHNjcmlwdCBmb3IgZWl0aGVyIHNjcmlwdCBwYXRoIGlucHV0IGNvbnRyb2xCbG9ja1xuICogJiBsZWFmU2NyaXB0IE9SIGtleSBwYXRoIGlucHV0IGludGVybmFsUHViS2V5ICYgdGFwdHJlZVJvb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQoXG4gIHAydHJBcmdzOiB7IGludGVybmFsUHViS2V5OiBCdWZmZXI7IHRhcHRyZWVSb290OiBCdWZmZXIgfSB8IHsgY29udHJvbEJsb2NrOiBCdWZmZXI7IGxlYWZTY3JpcHQ6IEJ1ZmZlciB9XG4pOiBCdWZmZXIge1xuICBsZXQgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcHRyZWVSb290OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIGlmICgnaW50ZXJuYWxQdWJLZXknIGluIHAydHJBcmdzKSB7XG4gICAgaW50ZXJuYWxQdWJLZXkgPSBwMnRyQXJncy5pbnRlcm5hbFB1YktleTtcbiAgICB0YXB0cmVlUm9vdCA9IHAydHJBcmdzLnRhcHRyZWVSb290O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsUHViS2V5ID0gcGFyc2VDb250cm9sQmxvY2soZWNjTGliLCBwMnRyQXJncy5jb250cm9sQmxvY2spLmludGVybmFsUHVia2V5O1xuICAgIHRhcHRyZWVSb290ID0gZ2V0VGFwdHJlZVJvb3QoZWNjTGliLCBwMnRyQXJncy5jb250cm9sQmxvY2ssIHAydHJBcmdzLmxlYWZTY3JpcHQpO1xuICB9XG4gIGNvbnN0IG91dHB1dEtleSA9IHRhcFR3ZWFrUHVia2V5KGVjY0xpYiwgaW50ZXJuYWxQdWJLZXksIHRhcHRyZWVSb290KS54T25seVB1YmtleTtcbiAgcmV0dXJuIGJzY3JpcHQuY29tcGlsZShbYnNjcmlwdC5PUFMuT1BfMSwgQnVmZmVyLmZyb20ob3V0cHV0S2V5KV0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHgtb25seSB0YXByb290IG91dHB1dCBrZXkgKHRhcE91dHB1dEtleSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHJvb3RPdXRwdXRLZXkob3V0cHV0U2NyaXB0OiBCdWZmZXIgfCAobnVtYmVyIHwgQnVmZmVyKVtdKTogQnVmZmVyIHtcbiAgY29uc3Qgb3V0cHV0RGVjb21waWxlZCA9IGJzY3JpcHQuZGVjb21waWxlKG91dHB1dFNjcmlwdCk7XG4gIGlmIChvdXRwdXREZWNvbXBpbGVkPy5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFwcm9vdCBvdXRwdXQgc2NyaXB0Jyk7XG4gIH1cbiAgY29uc3QgW29wMSwgb3V0cHV0S2V5XSA9IG91dHB1dERlY29tcGlsZWQ7XG4gIGlmIChvcDEgIT09IGJzY3JpcHQuT1BTLk9QXzEgfHwgIUJ1ZmZlci5pc0J1ZmZlcihvdXRwdXRLZXkpIHx8IG91dHB1dEtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcHJvb3Qgb3V0cHV0IHNjcmlwdCcpO1xuICB9XG4gIHJldHVybiBvdXRwdXRLZXk7XG59XG4iXX0=
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7OztBQTJFSCxzREE2REM7QUFPRCxrREFFQztBQU9ELGtDQUdDO0FBU0Qsc0NBS0M7QUFFRCw4Q0FjQztBQVVELDBDQWNDO0FBY0Qsd0NBU0M7QUEyQ0Qsb0RBS0M7QUFTRCw4Q0FvRUM7QUFFRCwwQ0FTQztBQThCRCxrREEyQ0M7QUFTRCw4Q0ErQkM7QUFTRCx3Q0FjQztBQVVELHdDQXdCQztBQUVELGtEQU1DO0FBTUQsOERBY0M7QUFLRCxrREFVQztBQWxrQkQsaUNBQWtDO0FBQ2xDLHVEQUF3RDtBQUN4RCxpREFBNEY7QUFDNUYscURBQXNEO0FBQ3RELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFBLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQVk5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsR0FBMkIsRUFBRSxPQUFpQjtJQUNsRiwyQ0FBMkM7SUFDM0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLDZEQUE2RCxDQUFDLENBQUM7SUFFMUYsd0VBQXdFO0lBQ3hFLDJEQUEyRDtJQUMzRCx3RUFBd0U7SUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0IseUZBQXlGO0lBQ3pGLHNFQUFzRTtJQUN0RSwrRUFBK0U7SUFDL0UsTUFBTSxDQUFDLEdBQUcsc0JBQU8sQ0FBQyxVQUFVLENBQUMsYUFB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TUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGVBQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ2xGLE9BQU8sc0JBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxzQkFBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsWUFBMEM7SUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxJQUFJLGdCQUFnQixFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7SUFDMUMsSUFBSSxHQUFHLEtBQUssc0JBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGFwcm9vdCB1dGlsaXRpZXMgaW5jbHVkaW5nIHRoZSBsZWdhY3kgTXVTaWcyIGtleSBhZ2dyZWdhdGlvblxuICogYWxnb3JpdGhtIHVzZWQgYnkgQml0R28ncyBkZXByZWNhdGVkIGBwMnRyYCBzY3JpcHQgdHlwZSAoY2hhaW5zIDMwLCAzMSkuXG4gKlxuICogIyMgTGVnYWN5IHAydHIgdnMgU3RhbmRhcmQgcDJ0ck11c2lnMlxuICpcbiAqIEJpdEdvIHN1cHBvcnRzIHR3byB0YXByb290IGFkZHJlc3MgdHlwZXM6XG4gKlxuICogMS4gKipMZWdhY3kgYHAydHJgIChjaGFpbnMgMzAsIDMxKSAtIERFUFJFQ0FURUQqKlxuICogICAgLSBVc2VzIHRoZSBgYWdncmVnYXRlTXVTaWdQdWJrZXlzKClgIGZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlXG4gKiAgICAtIEJhc2VkIG9uIGFuIG9sZGVyIE11U2lnMiB2YXJpYW50IHRoYXQgcHJlZGF0ZXMgQklQMzI3XG4gKiAgICAtIEV4cGVjdHMgMzItYnl0ZSB4LW9ubHkgcHVia2V5cyB3aXRoIGV2ZW4gWSBjb29yZGluYXRlc1xuICogICAgLSBTb3J0cyBrZXlzIEFGVEVSIHgtb25seSBjb252ZXJzaW9uXG4gKiAgICAtIENvcnJlc3BvbmRzIHRvIE11U2lnMiBiZWZvcmUgdGhlIDMyLWJ5dGUgdG8gMzMtYnl0ZSBrZXkgY2hhbmdlXG4gKiAgICAtIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pvbmFzbmljay9iaXBzL3B1bGwvMzdcbiAqXG4gKiAyLiAqKlN0YW5kYXJkIGBwMnRyTXVzaWcyYCAoY2hhaW5zIDQwLCA0MSkgLSBSRUNPTU1FTkRFRCoqXG4gKiAgICAtIFVzZXMgdGhlIGBAYnJhbmRvbmJsYWNrL211c2lnYCBsaWJyYXJ5IChzdGFuZGFyZCBCSVAzMjcgaW1wbGVtZW50YXRpb24pXG4gKiAgICAtIFVzZXMgZnVsbCAzMy1ieXRlIGNvbXByZXNzZWQgcHVia2V5cyB0aHJvdWdob3V0IGFnZ3JlZ2F0aW9uXG4gKiAgICAtIEtleSBvcmRlciBhZmZlY3RzIHRoZSByZXN1bHRpbmcgYWdncmVnYXRlIGtleVxuICogICAgLSBGdWxseSBjb21wYXRpYmxlIHdpdGggdGhlIEJJUDMyNyBzcGVjaWZpY2F0aW9uXG4gKlxuICogIyMgS2V5IERpZmZlcmVuY2VcbiAqXG4gKiBUaGUgY3JpdGljYWwgZGlmZmVyZW5jZSBpcyAqKndoZW4geC1vbmx5IGNvbnZlcnNpb24gaGFwcGVucyoqOlxuICogLSBMZWdhY3k6IENvbnZlcnRzIHRvIHgtb25seSBCRUZPUkUgc29ydGluZyAocHJvZHVjZXMgb3JkZXItaW5kZXBlbmRlbnQga2V5cylcbiAqIC0gU3RhbmRhcmQ6IFVzZXMgMzMtYnl0ZSBrZXlzIHRocm91Z2hvdXQgKGtleSBvcmRlciBtYXR0ZXJzKVxuICpcbiAqIEZvciB0aGUgc2FtZSB0d28gcHVia2V5cywgdGhlc2UgbWV0aG9kcyBwcm9kdWNlIERJRkZFUkVOVCBhZ2dyZWdhdGUga2V5cyBiZWNhdXNlXG4gKiB0aGUgc29ydCBvcmRlciBkaWZmZXJzIGJldHdlZW4gMzMtYnl0ZSBhbmQgMzItYnl0ZSByZXByZXNlbnRhdGlvbnMuXG4gKlxuICogU2VlIGBtb2R1bGVzL3V0eG8tbGliL2JpcC0wMzI3L1JFQURNRS5tZGAgZm9yIGRldGFpbGVkIGNvbXBhcmlzb24gYW5kIHRlc3QgY2FzZXMuXG4gKi9cblxuaW1wb3J0IHsgVGFwVHJlZSBhcyBQc2J0VGFwVHJlZSwgVGFwTGVhZiBhcyBQc2J0VGFwTGVhZiB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuaW1wb3J0IEZhc3RQcmlvcml0eVF1ZXVlID0gcmVxdWlyZSgnZmFzdHByaW9yaXR5cXVldWUnKTtcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0LCBjcnlwdG8gYXMgYmNyeXB0bywgcGF5bWVudHMgYXMgYnBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBlY2MgYXMgZWNjTGliIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmNvbnN0IHZhcnVpbnQgPSByZXF1aXJlKCd2YXJ1aW50LWJpdGNvaW4nKTtcblxuLyoqXG4gKiBUaGUgMHgwMiBwcmVmaXggaW5kaWNhdGluZyBhbiBldmVuIFkgY29vcmRpbmF0ZSB3aGljaCBpcyBpbXBsaWNpdGx5IGFzc3VtZWRcbiAqIG9uIGFsbCAzMiBieXRlIHgtb25seSBwdWIga2V5cyBhcyBkZWZpbmVkIGluIEJJUDM0MC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVWRU5fWV9DT09SRF9QUkVGSVggPSBCdWZmZXIub2YoMHgwMik7XG5leHBvcnQgY29uc3QgSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTiA9IDB4YzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlueVNlY3AyNTZrMUludGVyZmFjZSB7XG4gIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcbiAgeE9ubHlQb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHwgbnVsbDtcbiAgcG9pbnRGcm9tU2NhbGFyKHNrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwb2ludE11bHRpcGx5KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlQWRkKGQ6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHByaXZhdGVOZWdhdGUoZDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBhIGxpc3Qgb2YgcHVibGljIGtleXMgaW50byBhIHNpbmdsZSBwdWJsaWMga2V5IHVzaW5nIHRoZSBsZWdhY3kgTXVTaWcyIGFsZ29yaXRobS5cbiAqXG4gKiBUaGlzIGltcGxlbWVudHMgdGhlIGRlcHJlY2F0ZWQga2V5IGFnZ3JlZ2F0aW9uIG1ldGhvZCB1c2VkIGJ5IEJpdEdvJ3MgYHAydHJgIHNjcmlwdCB0eXBlXG4gKiAoY2hhaW5zIDMwLCAzMSkuIEl0IGNvcnJlc3BvbmRzIHRvIGFuIG9sZGVyIHZhcmlhbnQgb2YgTXVTaWcyIHRoYXQgcHJlZGF0ZXMgdGhlIGNoYW5nZVxuICogZnJvbSAzMi1ieXRlIHRvIDMzLWJ5dGUga2V5cyBpbiB0aGUgQklQMzI3IHNwZWNpZmljYXRpb24uXG4gKlxuICogIyMgQWxnb3JpdGhtXG4gKlxuICogVGhlIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIE11U2lnMiBrZXkgYWdncmVnYXRpb24gc2NoZW1lOlxuICpcbiAqIGBgYFxuICogUCA9IHN1bV9pICjOvF9pICogUF9pKVxuICogYGBgXG4gKlxuICogd2hlcmU6XG4gKiAtIGBQX2lgIGlzIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBpLXRoIHNpZ25lclxuICogLSBgzrxfaWAgaXMgdGhlIE11U2lnIGNvZWZmaWNpZW50IGNvbXB1dGVkIGFzOlxuICogICAtIGBMID0gVGFnZ2VkSGFzaChcIktleUFnZyBsaXN0XCIsIFBfMSB8fCBQXzIgfHwgLi4uIHx8IFBfbilgXG4gKiAgIC0gYM68X2kgPSBUYWdnZWRIYXNoKFwiS2V5QWdnIGNvZWZmaWNpZW50XCIsIEwgfHwgUF9pKWAgZm9yIG1vc3Qga2V5c1xuICogICAtIGDOvF9pID0gMWAgZm9yIHRoZSBzZWNvbmQgdW5pcXVlIGtleSAob3B0aW1pemF0aW9uIHRvIHNhdmUgYW4gZXhwb25lbnRpYXRpb24pXG4gKlxuICogIyMgS2V5IENoYXJhY3RlcmlzdGljcyAoTGVnYWN5IFZhcmlhbnQpXG4gKlxuICogMS4gKipYLW9ubHkgcHVia2V5cyoqOiBFeHBlY3RzIDMyLWJ5dGUgeC1vbmx5IHB1YmtleXMgKGFzc3VtZXMgZXZlbiBZIGNvb3JkaW5hdGVzKVxuICogMi4gKipQcmUtYWdncmVnYXRpb24gc29ydGluZyoqOiBTb3J0cyBrZXlzIGluIGFzY2VuZGluZyBvcmRlciBCRUZPUkUgYWdncmVnYXRpb25cbiAqIDMuICoqT3JkZXItaW5kZXBlbmRlbnQqKjogRHVlIHRvIHNvcnRpbmcsIGtleSBvcmRlciBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0XG4gKiA0LiAqKjMzLWJ5dGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24qKjogSW50ZXJuYWxseSBwcmVwZW5kcyAweDAyIHByZWZpeCBmb3IgZWxsaXB0aWMgY3VydmUgb3BlcmF0aW9uc1xuICpcbiAqICMjIERpZmZlcmVuY2VzIGZyb20gU3RhbmRhcmQgTXVTaWcyIChCSVAzMjcpXG4gKlxuICogVGhlIHN0YW5kYXJkIE11U2lnMiBpbXBsZW1lbnRhdGlvbiAoYEBicmFuZG9uYmxhY2svbXVzaWdgIGxpYnJhcnkpOlxuICogLSBVc2VzIDMzLWJ5dGUgY29tcHJlc3NlZCBwdWJrZXlzIHRocm91Z2hvdXRcbiAqIC0gRG9lcyBOT1Qgc29ydCBrZXlzIGJlZm9yZSBhZ2dyZWdhdGlvbiAoa2V5IG9yZGVyIG1hdHRlcnMpXG4gKiAtIFByb2R1Y2VzIGRpZmZlcmVudCBhZ2dyZWdhdGUga2V5cyBldmVuIGZvciB0aGUgc2FtZSBzZXQgb2YgcHVia2V5c1xuICpcbiAqICMjIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgY29ycmVzcG9uZHMgdG8gYGtleV9hZ2dfYml0Z29fcDJ0cl9sZWdhY3koKWAgaW4gdGhlIFB5dGhvbiByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAqIGF0IGBtb2R1bGVzL3V0eG8tbGliL2JpcC0wMzI3L3JlZmVyZW5jZS5weWAuXG4gKlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleXMgTGlzdCBvZiAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5cyB0byBhZ2dyZWdhdGUgKG11c3QgaGF2ZSBldmVuIFkgY29vcmRpbmF0ZXMpXG4gKiBAcmV0dXJucyAzMi1ieXRlIEJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIHgtb25seSBhZ2dyZWdhdGUgcHVibGljIGtleVxuICogQHRocm93cyB7RXJyb3J9IGlmIGZld2VyIHRoYW4gMiBwdWJrZXlzIHByb3ZpZGVkIG9yIGVsbGlwdGljIGN1cnZlIG9wZXJhdGlvbnMgZmFpbFxuICpcbiAqIEBzZWUgbW9kdWxlcy91dHhvLWxpYi9iaXAtMDMyNy9SRUFETUUubWQgZm9yIGRldGFpbGVkIGNvbXBhcmlzb24gd2l0aCBzdGFuZGFyZCBNdVNpZzJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pvbmFzbmljay9iaXBzL3B1bGwvMzcgZm9yIHRoZSBNdVNpZzIgc3BlY2lmaWNhdGlvbiBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU11U2lnUHVia2V5cyhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIHB1YmtleXM6IEJ1ZmZlcltdKTogVWludDhBcnJheSB7XG4gIC8vIFRPRE86IENvbnNpZGVyIGVuZm9yY2luZyBrZXkgdW5pcXVlbmVzcy5cbiAgYXNzZXJ0KHB1YmtleXMubGVuZ3RoID4gMSwgJ2F0IGxlYXN0IHR3byBwdWJrZXlzIGFyZSByZXF1aXJlZCBmb3IgbXVzaWcga2V5IGFnZ3JlZ2F0aW9uJyk7XG5cbiAgLy8gTEVHQUNZIEJFSEFWSU9SOiBTb3J0IHRoZSBrZXlzIGluIGFzY2VuZGluZyBvcmRlciBCRUZPUkUgYWdncmVnYXRpb24uXG4gIC8vIFRoaXMgbWFrZXMgdGhlIGFnZ3JlZ2F0ZSBrZXkgaW5kZXBlbmRlbnQgb2YgaW5wdXQgb3JkZXIuXG4gIC8vIFN0YW5kYXJkIE11U2lnMiAoQklQMzI3KSBkb2VzIE5PVCBzb3J0LCBtYWtpbmcga2V5IG9yZGVyIHNpZ25pZmljYW50LlxuICBwdWJrZXlzLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIC8vIENvbXB1dGUgdGhlIFwiS2V5QWdnIGxpc3RcIiBoYXNoIEwgPSBUYWdnZWRIYXNoKFwiS2V5QWdnIGxpc3RcIiwgUF8xIHx8IFBfMiB8fCAuLi4gfHwgUF9uKVxuICAvLyBUaGlzIGhhc2ggaXMgdXNlZCB0byBkZXJpdmUgdGhlIE11U2lnIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBwdWJrZXkuXG4gIC8vIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKHJlZmVyZW5jZS5weSksIHRoaXMgaXMgZG9uZSBpbiBoYXNoX2tleXMoKS5cbiAgY29uc3QgTCA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGxpc3QnLCBCdWZmZXIuY29uY2F0KHB1YmtleXMpKTtcblxuICAvLyBGaW5kIHRoZSBzZWNvbmQgdW5pcXVlIHB1YmtleSBpbiB0aGUgc29ydGVkIGxpc3QuXG4gIC8vIFRoaXMga2V5IChhbmQgYW55IGtleXMgaWRlbnRpY2FsIHRvIGl0KSB3aWxsIHVzZSBjb2VmZmljaWVudCDOvCA9IDEgYXMgYW4gb3B0aW1pemF0aW9uLlxuICAvLyBUaGlzIHNhdmVzIGFuIGV4cGVuc2l2ZSBwb2ludCBtdWx0aXBsaWNhdGlvbiAoc2VlIE11U2lnMiogYXBwZW5kaXggaW4gdGhlIE11U2lnMiBwYXBlcikuXG4gIC8vIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgZ2V0X3NlY29uZF9rZXkoKS5cbiAgY29uc3Qgc2Vjb25kVW5pcXVlUHVia2V5ID0gcHVia2V5cy5maW5kKChwdWJrZXkpID0+ICFwdWJrZXlzWzBdLmVxdWFscyhwdWJrZXkpKTtcblxuICAvLyBGb3IgZWFjaCBwdWJrZXkgUF9pLCBjb21wdXRlIHRoZSB0d2Vha2VkIHB1YmtleSDOvF9pICogUF9pXG4gIC8vIHdoZXJlIM68X2kgaXMgdGhlIE11U2lnIGNvZWZmaWNpZW50IGZvciB0aGF0IGtleS5cbiAgY29uc3QgdHdlYWtlZFB1YmtleXM6IFVpbnQ4QXJyYXlbXSA9IHB1YmtleXMubWFwKChwdWJrZXkpID0+IHtcbiAgICAvLyBDb252ZXJ0IDMyLWJ5dGUgeC1vbmx5IHB1YmtleSB0byAzMy1ieXRlIGNvbXByZXNzZWQgZm9ybWF0IGJ5IHByZXBlbmRpbmcgMHgwMi5cbiAgICAvLyBUaGlzIGFzc3VtZXMgYW4gZXZlbiBZIGNvb3JkaW5hdGUgKHN0YW5kYXJkIGZvciB4LW9ubHkgcHVia2V5cyBpbiB0YXByb290KS5cbiAgICAvLyBJbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB0aGlzIGlzIGRvbmUgaW1wbGljaXRseSBpbiBrZXlfYWdnKCkgdmlhIGxpZnRfeCgpLlxuICAgIGNvbnN0IHh5UHVia2V5ID0gQnVmZmVyLmNvbmNhdChbRVZFTl9ZX0NPT1JEX1BSRUZJWCwgcHVia2V5XSk7XG5cbiAgICBpZiAoc2Vjb25kVW5pcXVlUHVia2V5ICE9PSB1bmRlZmluZWQgJiYgc2Vjb25kVW5pcXVlUHVia2V5LmVxdWFscyhwdWJrZXkpKSB7XG4gICAgICAvLyBPcHRpbWl6YXRpb246IFRoZSBzZWNvbmQgdW5pcXVlIGtleSBnZXRzIGNvZWZmaWNpZW50IM68ID0gMS5cbiAgICAgIC8vIFRoaXMgbWVhbnMgzrxfaSAqIFBfaSA9IDEgKiBQX2kgPSBQX2kgKG5vIG11bHRpcGxpY2F0aW9uIG5lZWRlZCkuXG4gICAgICAvLyBUaGlzIHNhdmVzIGFuIGV4cGVuc2l2ZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCBtdWx0aXBsaWNhdGlvbiBvcGVyYXRpb24uXG4gICAgICAvLyBTZWUga2V5X2FnZ19jb2VmZl9pbnRlcm5hbCgpIGluIHJlZmVyZW5jZS5weSB3aGVyZSBpdCByZXR1cm5zIDEgZm9yIHBrXyA9PSBwazIuXG4gICAgICByZXR1cm4geHlQdWJrZXk7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSB0aGUgTXVTaWcgY29lZmZpY2llbnQ6IM68X2kgPSBUYWdnZWRIYXNoKFwiS2V5QWdnIGNvZWZmaWNpZW50XCIsIEwgfHwgUF9pKVxuICAgIC8vIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMga2V5X2FnZ19jb2VmZl9pbnRlcm5hbCgpLlxuICAgIGNvbnN0IGMgPSBiY3J5cHRvLnRhZ2dlZEhhc2goJ0tleUFnZyBjb2VmZmljaWVudCcsIEJ1ZmZlci5jb25jYXQoW0wsIHB1YmtleV0pKTtcblxuICAgIC8vIENvbXB1dGUgdGhlIHR3ZWFrZWQgcHVia2V5OiDOvF9pICogUF9pIChlbGxpcHRpYyBjdXJ2ZSBwb2ludCBtdWx0aXBsaWNhdGlvbilcbiAgICBjb25zdCB0d2Vha2VkUHVia2V5ID0gZWNjLnBvaW50TXVsdGlwbHkoeHlQdWJrZXksIGMpO1xuICAgIGlmICghdHdlYWtlZFB1YmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbXVsdGlwbHkgcHVia2V5IGJ5IGNvZWZmaWNpZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB0d2Vha2VkUHVia2V5O1xuICB9KTtcblxuICAvLyBTdW0gYWxsIHRoZSB0d2Vha2VkIHB1YmtleXMgdG8gZ2V0IHRoZSBhZ2dyZWdhdGUgcHVia2V5OlxuICAvLyBQID0gc3VtX2kgKM68X2kgKiBQX2kpID0gzrxfMSpQXzEgKyDOvF8yKlBfMiArIC4uLiArIM68X24qUF9uXG4gIC8vIFRoaXMgaXMgZWxsaXB0aWMgY3VydmUgcG9pbnQgYWRkaXRpb24uXG4gIGNvbnN0IGFnZ3JlZ2F0ZVB1YmtleSA9IHR3ZWFrZWRQdWJrZXlzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBlY2MucG9pbnRBZGQocHJldiwgY3Vycik7XG4gICAgaWYgKCFuZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdW0gcHVia2V5cycpO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcblxuICAvLyBDb252ZXJ0IHRoZSBhZ2dyZWdhdGUgcHVia2V5IGZyb20gMzMtYnl0ZSBjb21wcmVzc2VkIGZvcm1hdCBiYWNrIHRvIDMyLWJ5dGUgeC1vbmx5IGZvcm1hdFxuICAvLyBieSByZW1vdmluZyB0aGUgZmlyc3QgYnl0ZSAodGhlIFkgY29vcmRpbmF0ZSBwcmVmaXgpLlxuICAvLyBJbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB0aGlzIGlzIGRvbmUgYnkgZ2V0X3hvbmx5X3BrKCkgd2hpY2ggY2FsbHMgeGJ5dGVzKCkuXG4gIHJldHVybiBhZ2dyZWdhdGVQdWJrZXkuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyB0aGUgbGVuZ3RoIG9mIGEgc2NyaXB0IGFzIGEgYml0Y29pbiB2YXJpYWJsZSBsZW5ndGggaW50ZWdlci5cbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVTY3JpcHRTaXplKHNjcmlwdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIHZhcnVpbnQuZW5jb2RlKHNjcmlwdC5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEdldHMgYSB0YXBsZWFmIHRhZ2dlZCBoYXNoIGZyb20gYSBzY3JpcHQuXG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRhcExlYWYoc2NyaXB0OiBCdWZmZXIsIGxlYWZWZXJzaW9uID0gSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTik6IEJ1ZmZlciB7XG4gIGNvbnN0IHNpemUgPSBzZXJpYWxpemVTY3JpcHRTaXplKHNjcmlwdCk7XG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcExlYWYnLCBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzaXplLCBzY3JpcHRdKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCB0YXBicmFuY2ggZnJvbSB0d28gY2hpbGQgdGFwdHJlZSBub2Rlc1xuICogYW5kIHJldHVybnMgaXRzIHRhZ2dlZCBoYXNoLlxuICogQHBhcmFtIGNoaWxkMVxuICogQHBhcmFtIGNoaWxkMlxuICogQHJldHVybnMgdGhlIHRhZ2dlZCB0YXBicmFuY2ggaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRhcEJyYW5jaChjaGlsZDE6IEJ1ZmZlciwgY2hpbGQyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAvLyBzb3J0IHRoZSBjaGlsZHJlbiBsZXhpY29ncmFwaGljYWxseVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFtjaGlsZDEsIGNoaWxkMl0uc29ydChCdWZmZXIuY29tcGFyZSk7XG5cbiAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwQnJhbmNoJywgQnVmZmVyLmNvbmNhdChzb3J0ZWRDaGlsZHJlbikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5OiBVaW50OEFycmF5LCB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHB1YmtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1YmtleSBzaXplICR7cHVia2V5Lmxlbmd0aH0uYCk7XG4gIH1cbiAgaWYgKHRhcHRyZWVSb290KSB7XG4gICAgaWYgKHRhcHRyZWVSb290Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXB0cmVlUm9vdCBzaXplICR7dGFwdHJlZVJvb3QubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwVHdlYWsnLCBCdWZmZXIuY29uY2F0KFtwdWJrZXksIHRhcHRyZWVSb290XSkpO1xuICB9XG4gIC8vIElmIHRoZSBzcGVuZGluZyBjb25kaXRpb25zIGRvIG5vdCByZXF1aXJlIGEgc2NyaXB0IHBhdGgsIHRoZSBvdXRwdXQga2V5IHNob3VsZCBjb21taXQgdG8gYW5cbiAgLy8gdW5zcGVuZGFibGUgc2NyaXB0IHBhdGggaW5zdGVhZCBvZiBoYXZpbmcgbm8gc2NyaXB0IHBhdGguXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDEubWVkaWF3aWtpI2NpdGVfbm90ZS0yMlxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5mcm9tKHB1YmtleSkpO1xufVxuXG4vKipcbiAqIFR3ZWFrcyBhIHByaXZrZXksIHVzaW5nIHRoZSB0YWdnZWQgaGFzaCBvZiBpdHMgcHVia2V5LCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHB1YmxpYyBrZXksIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0d2Vha1xuICogQHBhcmFtIHByaXZrZXkgdGhlIHByaXZrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdHdlYWtlZCBwcml2a2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1ByaXZrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICBwcml2a2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuXG4gIGNvbnN0IHBvaW50ID0gZWNjLnBvaW50RnJvbVNjYWxhcihwcml2a2V5KTtcbiAgaWYgKCFwb2ludCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIGlmIChwb2ludFswXSAlIDIgPT09IDEpIHByaXZrZXkgPSBlY2MucHJpdmF0ZU5lZ2F0ZShwcml2a2V5KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnByaXZhdGVBZGQocHJpdmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgcGFyaXR5OiAxIHwgMDtcbiAgeE9ubHlQdWJrZXk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogVHdlYWtzIGFuIGludGVybmFsIHB1YmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0c2VsZiwgYW5kIChvcHRpb25hbGx5KSBhIHRhcHRyZWUgcm9vdFxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleSB0aGUgaW50ZXJuYWwgcHVia2V5IHRvIHR3ZWFrXG4gKiBAcGFyYW0gdGFwdHJlZVJvb3QgdGhlIHRhcHRyZWUgcm9vdCB0YWdnZWQgaGFzaFxuICogQHJldHVybnMge1R3ZWFrZWRQdWJrZXl9IHRoZSB0d2Vha2VkIHB1YmtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFwVHdlYWtQdWJrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IEJ1ZmZlclxuKTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgY29uc3QgdGFwVHdlYWsgPSBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXksIHRhcHRyZWVSb290KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnhPbmx5UG9pbnRBZGRUd2VhayhwdWJrZXksIHRhcFR3ZWFrKTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXB0cmVlIHtcbiAgcm9vdDogQnVmZmVyO1xuICBwYXRoczogQnVmZmVyW11bXTtcbn1cblxuaW50ZXJmYWNlIFdlaWdodGVkVGFwU2NyaXB0IHtcbiAgLyoqIEEgVGFwTGVhZiBvciBUYXBCcmFuY2ggdGFnZ2VkIGhhc2ggKi9cbiAgdGFnZ2VkSGFzaDogQnVmZmVyO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgcGF0aHM6IHtcbiAgICBbaW5kZXg6IG51bWJlcl06IEJ1ZmZlcltdO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN1cnNlVGFwdHJlZShsZWF2ZXM6IEl0ZXJhdG9yPFtudW1iZXIsIFBzYnRUYXBMZWFmXT4sIHRhcmdldERlcHRoID0gMCk6IFRhcHRyZWUge1xuICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBsZWF2ZXMubmV4dCgpO1xuICBhc3NlcnQoIWRvbmUsICdpbnN1ZmZpY2llbnQgbGVhdmVzIHRvIHJlY29uc3RydWN0IHRhcCB0cmVlJyk7XG4gIGNvbnN0IFtpbmRleCwgbGVhZl0gPSB2YWx1ZTtcbiAgY29uc3QgdHJlZTogVGFwdHJlZSA9IHtcbiAgICByb290OiBoYXNoVGFwTGVhZihsZWFmLnNjcmlwdCwgbGVhZi5sZWFmVmVyc2lvbiksXG4gICAgcGF0aHM6IFtdLFxuICB9O1xuICB0cmVlLnBhdGhzW2luZGV4XSA9IFtdO1xuICBmb3IgKGxldCBkZXB0aCA9IGxlYWYuZGVwdGg7IGRlcHRoID4gdGFyZ2V0RGVwdGg7IGRlcHRoLS0pIHtcbiAgICBjb25zdCBzaWJsaW5nID0gcmVjdXJzZVRhcHRyZWUobGVhdmVzLCBkZXB0aCk7XG4gICAgdHJlZS5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goc2libGluZy5yb290KSk7XG4gICAgc2libGluZy5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2godHJlZS5yb290KSk7XG4gICAgdHJlZS5yb290ID0gaGFzaFRhcEJyYW5jaCh0cmVlLnJvb3QsIHNpYmxpbmcucm9vdCk7XG4gICAgLy8gTWVyZ2UgZGlzam9pbnQgc3BhcnNlIGFycmF5cyBvZiBwYXRocyBpbnRvIHRyZWUucGF0aHNcbiAgICBPYmplY3QuYXNzaWduKHRyZWUucGF0aHMsIHNpYmxpbmcucGF0aHMpO1xuICB9XG4gIHJldHVybiB0cmVlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3QgaGFzaCBhbmQgaGFzaC1wYXRocyBvZiBhIHRhcHRyZWUgZnJvbSB0aGUgZGVwdGgtZmlyc3RcbiAqIGNvbnN0cnVjdGlvbiB1c2VkIGluIEJJUC0wMzcxIFBTQlRzXG4gKiBAcGFyYW0gdHJlZVxuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvXG4gKiB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXB0aEZpcnN0VGFwdHJlZSh0cmVlOiBQc2J0VGFwVHJlZSk6IFRhcHRyZWUge1xuICBjb25zdCBpdGVyID0gdHJlZS5sZWF2ZXMuZW50cmllcygpO1xuICBjb25zdCByZXQgPSByZWN1cnNlVGFwdHJlZShpdGVyKTtcbiAgYXNzZXJ0KGl0ZXIubmV4dCgpLmRvbmUsICdpbnZhbGlkIHRhcCB0cmVlLCBubyBwYXRoIHRvIHNvbWUgbGVhdmVzJyk7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIG9mIGEgdGFwdHJlZSB1c2luZyBhIHdlaWdodGVkIEh1ZmZtYW4gY29uc3RydWN0aW9uIGZyb20gYVxuICogbGlzdCBvZiBzY3JpcHRzIGFuZCBjb3JyZXNwb25kaW5nIHdlaWdodHMuXG4gKiBAcGFyYW0gc2NyaXB0c1xuICogQHBhcmFtIHdlaWdodHNcbiAqIEByZXR1cm5zIHtUYXB0cmVlfSB0aGUgdHJlZSwgcmVwcmVzZW50ZWQgYnkgaXRzIHJvb3QgaGFzaCwgYW5kIHRoZSBwYXRocyB0byB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWZmbWFuVGFwdHJlZShzY3JpcHRzOiBCdWZmZXJbXSwgd2VpZ2h0czogQXJyYXk8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFRhcHRyZWUge1xuICBhc3NlcnQoc2NyaXB0cy5sZW5ndGggPiAwLCAnYXQgbGVhc3Qgb25lIHNjcmlwdCBpcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYSB0YXAgdHJlZScpO1xuXG4gIC8vIENyZWF0ZSBhIHF1ZXVlL2hlYXAgb2YgdGhlIHByb3ZpZGVkIHNjcmlwdHMgcHJpb3JpdGl6ZWQgYWNjb3JkaW5nIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAgY29uc3QgcXVldWUgPSBuZXcgRmFzdFByaW9yaXR5UXVldWU8V2VpZ2h0ZWRUYXBTY3JpcHQ+KChhLCBiKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGEud2VpZ2h0IDwgYi53ZWlnaHQ7XG4gIH0pO1xuICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB3ZWlnaHQgPSB3ZWlnaHRzW2luZGV4XSB8fCAxO1xuICAgIGFzc2VydCh3ZWlnaHQgPiAwLCAnc2NyaXB0IHdlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUnKTtcblxuICAgIHF1ZXVlLmFkZCh7XG4gICAgICB3ZWlnaHQsXG4gICAgICB0YWdnZWRIYXNoOiBoYXNoVGFwTGVhZihzY3JpcHQpLFxuICAgICAgcGF0aHM6IHsgW2luZGV4XTogW10gfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHF1ZXVlIG9mIHdlaWdodGVkIHNjcmlwdHMsIHdlIGJlZ2luIGEgbG9vcCB3aGVyZWJ5IHdlXG4gIC8vIHJlbW92ZSB0aGUgdHdvIGxvd2VzdCB3ZWlnaHRlZCBpdGVtcyBmcm9tIHRoZSBxdWV1ZS4gV2UgY3JlYXRlIGEgdGFwIGJyYW5jaFxuICAvLyBub2RlIGZyb20gdGhlIHR3byBpdGVtcywgYW5kIGFkZCB0aGUgYnJhbmNoIGJhY2sgdG8gdGhlIHF1ZXVlIHdpdGggdGhlXG4gIC8vIGNvbWJpbmVkIHdlaWdodCBvZiBib3RoIGl0cyBjaGlsZHJlbi4gRWFjaCBsb29wIHJlZHVjZXMgdGhlIG51bWJlciBvZiBpdGVtc1xuICAvLyBpbiB0aGUgcXVldWUgYnkgb25lLCBhbmQgd2UgcmVwZWF0IHVudGlsIHdlIGFyZSBsZWZ0IHdpdGggb25seSBvbmUgaXRlbSAtXG4gIC8vIHRoaXMgYmVjb21lcyB0aGUgdGFwIHRyZWUgcm9vdC5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIGlmIHdlIGJlZ2luIHdpdGggc2NyaXB0cyBBLCBCLCBDLCBEIHdpdGggd2VpZ2h0cyA2LCAzLCAxLCAxXG4gIC8vIEFmdGVyIGZpcnN0IGxvb3A6IEEoNiksIEIoMyksIENEKDEgKyAxKVxuICAvLyBBZnRlciBzZWNvbmQgbG9vcDogQSg2KSwgQltDRF0oMyArIDIpXG4gIC8vIEZpbmFsIGxvb3A6IEFbQltDRF1dKDYrNSlcbiAgLy8gVGhlIGZpbmFsIHRyZWUgd2lsbCBsb29rIGxpa2U6XG4gIC8vXG4gIC8vICAgICAgICBBW0JbQ0RdXVxuICAvLyAgICAgICAvICAgICAgICBcXFxuICAvLyAgICAgIEEgICAgICAgICBCW0NEXVxuICAvLyAgICAgICAgICAgICAgIC8gICAgIFxcXG4gIC8vICAgICAgICAgICAgICBCICAgICAgW0NEXVxuICAvLyAgICAgICAgICAgICAgICAgICAgLyAgICBcXFxuICAvLyAgICAgICAgICAgICAgICAgICBDICAgICAgRFxuICAvL1xuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BlbmRpbmcgY29uZGl0aW9ucyB3ZSBiZWxpZXZlIHRvIGhhdmUgdGhlIGhpZ2hlc3RcbiAgLy8gcHJvYmFiaWxpdHkgb2YgYmVpbmcgdXNlZCBhcmUgZnVydGhlciB1cCB0aGUgdHJlZSB0aGFuIGxlc3MgbGlrZWx5IHNjcmlwdHMsXG4gIC8vIHRoZXJlYnkgcmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIG1lcmtsZSBwcm9vZnMgZm9yIHRoZSBtb3JlIGxpa2VseSBzY3JpcHRzLlxuICB3aGlsZSAocXVldWUuc2l6ZSA+IDEpIHtcbiAgICAvLyBXZSBjYW4gc2FmZWx5IGV4cGVjdCB0d28gcG9sbHMgdG8gcmV0dXJuIG5vbi1udWxsIGVsZW1lbnRzIHNpbmNlIHdlJ3ZlXG4gICAgLy8gY2hlY2tlZCB0aGF0IHRoZSBxdWV1ZSBoYXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIGJlZm9yZSBsb29waW5nLlxuICAgIGNvbnN0IGNoaWxkMSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcbiAgICBjb25zdCBjaGlsZDIgPSBxdWV1ZS5wb2xsKCkgYXMgV2VpZ2h0ZWRUYXBTY3JpcHQ7XG5cbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMS5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMi50YWdnZWRIYXNoKSk7XG4gICAgT2JqZWN0LnZhbHVlcyhjaGlsZDIucGF0aHMpLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChjaGlsZDEudGFnZ2VkSGFzaCkpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBCcmFuY2goY2hpbGQxLnRhZ2dlZEhhc2gsIGNoaWxkMi50YWdnZWRIYXNoKSxcbiAgICAgIHdlaWdodDogY2hpbGQxLndlaWdodCArIGNoaWxkMi53ZWlnaHQsXG4gICAgICBwYXRoczogeyAuLi5jaGlsZDEucGF0aHMsIC4uLmNoaWxkMi5wYXRocyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWZ0ZXIgdGhlIHdoaWxlIGxvb3AgYWJvdmUgY29tcGxldGVzIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGVsZW1lbnRcbiAgLy8gcmVtYWluaW5nIGluIHRoZSBxdWV1ZSwgd2hpY2ggd2UgY2FuIHNhZmVseSBleHRyYWN0IGJlbG93LlxuICBjb25zdCByb290Tm9kZSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICBjb25zdCBwYXRocyA9IE9iamVjdC5lbnRyaWVzKHJvb3ROb2RlLnBhdGhzKS5yZWR1Y2UoKGFjYywgW2luZGV4LCBwYXRoXSkgPT4ge1xuICAgIGFjY1tOdW1iZXIoaW5kZXgpXSA9IHBhdGg7IC8vIFRPRE86IFdoeSBkb2Vzbid0IFRTIGtub3cgaXQncyBhIG51bWJlcj9cbiAgICByZXR1cm4gYWNjO1xuICB9LCBBcnJheShzY3JpcHRzLmxlbmd0aCkpO1xuICByZXR1cm4geyByb290OiByb290Tm9kZS50YWdnZWRIYXNoLCBwYXRocyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbEJsb2NrKFxuICBwYXJpdHk6IDAgfCAxLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHBhdGg6IEJ1ZmZlcltdLFxuICBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT05cbik6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcml0eVZlcnNpb24gPSBsZWFmVmVyc2lvbiArIHBhcml0eTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKHBhcml0eVZlcnNpb24pLCBwdWJrZXksIC4uLnBhdGhdKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ0tleSc7XG4gIHNpZ25hdHVyZTogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ1NjcmlwdCc7XG4gIHNjcmlwdFNpZzogQnVmZmVyW107XG4gIHRhcHNjcmlwdDogQnVmZmVyO1xuICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgYW5uZXg/OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbEJsb2NrIHtcbiAgcGFyaXR5OiBudW1iZXI7XG4gIGludGVybmFsUHVia2V5OiBCdWZmZXI7XG4gIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gIHBhdGg6IEJ1ZmZlcltdO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3Qgd2l0bmVzcyBzdGFjayBhbmQgZXh0cmFjdHMga2V5IGRhdGEgZWxlbWVudHMuXG4gKiBAcGFyYW0gd2l0bmVzc1N0YWNrXG4gKiBAcmV0dXJucyB7U2NyaXB0UGF0aFdpdG5lc3N8S2V5UGF0aFdpdG5lc3N9IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlXG4gKiBwYXJzZWQgd2l0bmVzcyBmb3IgYSBzY3JpcHQgcGF0aCBvciBrZXkgcGF0aCBzcGVuZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcHJvb3RXaXRuZXNzKHdpdG5lc3NTdGFjazogQnVmZmVyW10pOiBTY3JpcHRQYXRoV2l0bmVzcyB8IEtleVBhdGhXaXRuZXNzIHtcbiAgbGV0IGFubmV4O1xuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA+PSAyICYmIHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMV1bMF0gPT09IDB4NTApIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHdpdG5lc3MgZWxlbWVudHMsIGFuZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbGFzdCBlbGVtZW50IGlzXG4gICAgLy8gMHg1MCwgdGhpcyBsYXN0IGVsZW1lbnQgaXMgY2FsbGVkIGFubmV4IGEgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgd2l0bmVzcyBzdGFja1xuICAgIGFubmV4ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgICB3aXRuZXNzU3RhY2sgPSB3aXRuZXNzU3RhY2suc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3aXRuZXNzIHN0YWNrIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCcpO1xuICB9IGVsc2UgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHdpdG5lc3NTdGFja1swXTtcbiAgICBpZiAoIWJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3BlbmRUeXBlOiAnS2V5Jywgc2lnbmF0dXJlLCBhbm5leCB9O1xuICB9XG5cbiAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgLy8gc2Vjb25kIHRvIGxhc3QgZWxlbWVudCBpcyB0aGUgdGFwc2NyaXB0XG4gIGNvbnN0IHRhcHNjcmlwdCA9IHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMl07XG4gIGNvbnN0IHRhcHNjcmlwdENodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHRhcHNjcmlwdCk7XG5cbiAgaWYgKCF0YXBzY3JpcHRDaHVua3MgfHwgdGFwc2NyaXB0Q2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwc2NyaXB0IGlzIG5vdCBhIHZhbGlkIHNjcmlwdCcpO1xuICB9XG5cbiAgLy8gVGhlIGxhc3Qgc3RhY2sgZWxlbWVudCBpcyBjYWxsZWQgdGhlIGNvbnRyb2wgYmxvY2sgYywgYW5kIG11c3QgaGF2ZSBsZW5ndGggMzMgKyAzMm0sXG4gIC8vIGZvciBhIHZhbHVlIG9mIG0gdGhhdCBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTI4LCBpbmNsdXNpdmVcbiAgY29uc3QgY29udHJvbEJsb2NrID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKGNvbnRyb2xCbG9jay5sZW5ndGggPCAzMyB8fCBjb250cm9sQmxvY2subGVuZ3RoID4gMzMgKyAzMiAqIDEyOCB8fCBjb250cm9sQmxvY2subGVuZ3RoICUgMzIgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BlbmRUeXBlOiAnU2NyaXB0JyxcbiAgICBzY3JpcHRTaWc6IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMiksXG4gICAgdGFwc2NyaXB0LFxuICAgIGNvbnRyb2xCbG9jayxcbiAgICBhbm5leCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSB0YXByb290IGNvbnRyb2wgYmxvY2suXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrIHRvIHBhcnNlXG4gKiBAcmV0dXJucyB7Q29udHJvbEJsb2NrfSB0aGUgcGFyc2VkIGNvbnRyb2wgYmxvY2tcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbnRyb2xCbG9jayhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIGNvbnRyb2xCbG9jazogQnVmZmVyKTogQ29udHJvbEJsb2NrIHtcbiAgaWYgKChjb250cm9sQmxvY2subGVuZ3RoIC0gMSkgJSAzMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcml0eSA9IGNvbnRyb2xCbG9ja1swXSAmIDB4MDE7XG5cbiAgLy8gTGV0IHAgPSBjWzE6MzNdIGFuZCBsZXQgUCA9IGxpZnRfeChpbnQocCkpIHdoZXJlIGxpZnRfeCBhbmQgWzpdIGFyZSBkZWZpbmVkIGFzIGluIEJJUDM0MC5cbiAgLy8gRmFpbCBpZiB0aGlzIHBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmVcbiAgY29uc3QgaW50ZXJuYWxQdWJrZXkgPSBjb250cm9sQmxvY2suc2xpY2UoMSwgMzMpO1xuICBpZiAoIWVjYy5pc1hPbmx5UG9pbnQoaW50ZXJuYWxQdWJrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBwdWJrZXkgaXMgbm90IGFuIEVDIHBvaW50Jyk7XG4gIH1cblxuICAvLyBUaGUgbGVhZiB2ZXJzaW9uIGNhbm5vdCBiZSAweDUwIGFzIHRoYXQgd291bGQgcmVzdWx0IGluIGFtYmlndWl0eSB3aXRoIHRoZSBhbm5leC5cbiAgY29uc3QgbGVhZlZlcnNpb24gPSBjb250cm9sQmxvY2tbMF0gJiAweGZlO1xuICBpZiAobGVhZlZlcnNpb24gPT09IDB4NTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGVhZiB2ZXJzaW9uJyk7XG4gIH1cblxuICBjb25zdCBwYXRoOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgKGxldCBqID0gMzM7IGogPCBjb250cm9sQmxvY2subGVuZ3RoOyBqICs9IDMyKSB7XG4gICAgcGF0aC5wdXNoKGNvbnRyb2xCbG9jay5zbGljZShqLCBqICsgMzIpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyaXR5LFxuICAgIGludGVybmFsUHVia2V5LFxuICAgIGxlYWZWZXJzaW9uLFxuICAgIHBhdGgsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwbGVhZiBoYXNoIGZyb20gYSBjb250cm9sIGJsb2NrIGFuZCBzY3JpcHQuXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrLCBlaXRoZXIgcmF3IG9yIHBhcnNlZFxuICogQHBhcmFtIHRhcHNjcmlwdCB0aGUgbGVhZiBzY3JpcHQgY29ycmVzZHBvbmRpbmcgdG8gdGhlIGNvbnRyb2wgYmxvY2tcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXBsZWFmIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcGxlYWZIYXNoKFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IGNvbnRyb2xCbG9jaztcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKFxuICAgICdUYXBMZWFmJyxcbiAgICBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzZXJpYWxpemVTY3JpcHRTaXplKHRhcHNjcmlwdCksIHRhcHNjcmlwdF0pXG4gICk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwdHJlZSByb290IGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHBhcmFtIHRhcGxlYWZIYXNoIHRoZSBsZWFmIGhhc2ggaWYgYWxyZWFkeSBjYWxjdWxhdGVkXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHRyZWVSb290KFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlcixcbiAgdGFwbGVhZkhhc2g/OiBCdWZmZXJcbik6IEJ1ZmZlciB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udHJvbEJsb2NrKSkge1xuICAgIGNvbnRyb2xCbG9jayA9IHBhcnNlQ29udHJvbEJsb2NrKGVjYywgY29udHJvbEJsb2NrKTtcbiAgfVxuICBjb25zdCB7IHBhdGggfSA9IGNvbnRyb2xCbG9jaztcblxuICB0YXBsZWFmSGFzaCA9IHRhcGxlYWZIYXNoIHx8IGdldFRhcGxlYWZIYXNoKGVjYywgY29udHJvbEJsb2NrLCB0YXBzY3JpcHQpO1xuXG4gIC8vIGB0YXB0cmVlTWVya2xlSGFzaGAgYmVnaW5zIGFzIG91ciB0YXBzY3JpcHQgdGFwbGVhZiBoYXNoIGFuZCBpdHMgdmFsdWUgaXRlcmF0ZXNcbiAgLy8gdGhyb3VnaCBpdHMgcGFyZW50IHRhcGJyYW5jaCBoYXNoZXMgdW50aWwgaXQgZW5kcyB1cCBhcyB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAgbGV0IHRhcHRyZWVNZXJrbGVIYXNoID0gdGFwbGVhZkhhc2g7XG4gIGZvciAoY29uc3QgdGFwdHJlZVNpYmxpbmdIYXNoIG9mIHBhdGgpIHtcbiAgICB0YXB0cmVlTWVya2xlSGFzaCA9XG4gICAgICBCdWZmZXIuY29tcGFyZSh0YXB0cmVlTWVya2xlSGFzaCwgdGFwdHJlZVNpYmxpbmdIYXNoKSA9PT0gLTFcbiAgICAgICAgPyBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2hdKSlcbiAgICAgICAgOiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVTaWJsaW5nSGFzaCwgdGFwdHJlZU1lcmtsZUhhc2hdKSk7XG4gIH1cblxuICByZXR1cm4gdGFwdHJlZU1lcmtsZUhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd2Vha2VkT3V0cHV0S2V5KHBheW1lbnQ6IGJwYXltZW50cy5QYXltZW50KTogQnVmZmVyIHtcbiAgYXNzZXJ0KHBheW1lbnQub3V0cHV0KTtcbiAgaWYgKHBheW1lbnQub3V0cHV0Lmxlbmd0aCA9PT0gMzQpIHtcbiAgICByZXR1cm4gcGF5bWVudC5vdXRwdXQ/LnN1YmFycmF5KDIpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBwMnRyIHR3ZWFrZWQgb3V0cHV0IGtleSBzaXplICR7cGF5bWVudC5vdXRwdXQubGVuZ3RofWApO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIG91dHB1dCBzY3JpcHQgZm9yIGVpdGhlciBzY3JpcHQgcGF0aCBpbnB1dCBjb250cm9sQmxvY2tcbiAqICYgbGVhZlNjcmlwdCBPUiBrZXkgcGF0aCBpbnB1dCBpbnRlcm5hbFB1YktleSAmIHRhcHRyZWVSb290XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KFxuICBwMnRyQXJnczogeyBpbnRlcm5hbFB1YktleTogQnVmZmVyOyB0YXB0cmVlUm9vdDogQnVmZmVyIH0gfCB7IGNvbnRyb2xCbG9jazogQnVmZmVyOyBsZWFmU2NyaXB0OiBCdWZmZXIgfVxuKTogQnVmZmVyIHtcbiAgbGV0IGludGVybmFsUHViS2V5OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIGxldCB0YXB0cmVlUm9vdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoJ2ludGVybmFsUHViS2V5JyBpbiBwMnRyQXJncykge1xuICAgIGludGVybmFsUHViS2V5ID0gcDJ0ckFyZ3MuaW50ZXJuYWxQdWJLZXk7XG4gICAgdGFwdHJlZVJvb3QgPSBwMnRyQXJncy50YXB0cmVlUm9vdDtcbiAgfSBlbHNlIHtcbiAgICBpbnRlcm5hbFB1YktleSA9IHBhcnNlQ29udHJvbEJsb2NrKGVjY0xpYiwgcDJ0ckFyZ3MuY29udHJvbEJsb2NrKS5pbnRlcm5hbFB1YmtleTtcbiAgICB0YXB0cmVlUm9vdCA9IGdldFRhcHRyZWVSb290KGVjY0xpYiwgcDJ0ckFyZ3MuY29udHJvbEJsb2NrLCBwMnRyQXJncy5sZWFmU2NyaXB0KTtcbiAgfVxuICBjb25zdCBvdXRwdXRLZXkgPSB0YXBUd2Vha1B1YmtleShlY2NMaWIsIGludGVybmFsUHViS2V5LCB0YXB0cmVlUm9vdCkueE9ubHlQdWJrZXk7XG4gIHJldHVybiBic2NyaXB0LmNvbXBpbGUoW2JzY3JpcHQuT1BTLk9QXzEsIEJ1ZmZlci5mcm9tKG91dHB1dEtleSldKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB4LW9ubHkgdGFwcm9vdCBvdXRwdXQga2V5ICh0YXBPdXRwdXRLZXkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXByb290T3V0cHV0S2V5KG91dHB1dFNjcmlwdDogQnVmZmVyIHwgKG51bWJlciB8IEJ1ZmZlcilbXSk6IEJ1ZmZlciB7XG4gIGNvbnN0IG91dHB1dERlY29tcGlsZWQgPSBic2NyaXB0LmRlY29tcGlsZShvdXRwdXRTY3JpcHQpO1xuICBpZiAob3V0cHV0RGVjb21waWxlZD8ubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcHJvb3Qgb3V0cHV0IHNjcmlwdCcpO1xuICB9XG4gIGNvbnN0IFtvcDEsIG91dHB1dEtleV0gPSBvdXRwdXREZWNvbXBpbGVkO1xuICBpZiAob3AxICE9PSBic2NyaXB0Lk9QUy5PUF8xIHx8ICFCdWZmZXIuaXNCdWZmZXIob3V0cHV0S2V5KSB8fCBvdXRwdXRLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXByb290IG91dHB1dCBzY3JpcHQnKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0S2V5O1xufVxuIl19
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { Stack } from '../../';
3
2
  export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
3
  export declare namespace check {
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/input.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQ/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAUhF;yBAVe,KAAK"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/input.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQ/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAUhF;yBAVe,KAAK;sBAWF,MAAM"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // OP_0 [signatures ...]
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.check = void 0;
4
+ exports.check = check;
5
5
  const __1 = require("../../");
6
6
  const __2 = require("../../");
7
7
  function partialSignature(value) {
@@ -18,8 +18,7 @@ function check(script, allowIncomplete) {
18
18
  }
19
19
  return chunks.slice(1).every(__1.script.isCanonicalScriptSignature);
20
20
  }
21
- exports.check = check;
22
21
  check.toJSON = () => {
23
22
  return 'multisig input';
24
23
  };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3QkFBd0I7OztBQUd4Qiw4QkFBMkM7QUFDM0MsOEJBQWlDO0FBRWpDLFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsT0FBTyxLQUFLLEtBQUssV0FBTyxDQUFDLElBQUksSUFBSSxVQUFPLENBQUMsMEJBQTBCLENBQUMsS0FBZSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFPLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTdDLElBQUksZUFBZSxFQUFFO1FBQ25CLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNoRDtJQUVELE9BQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWMsQ0FBQyxLQUFLLENBQUMsVUFBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDakYsQ0FBQztBQVZELHNCQVVDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBPUF8wIFtzaWduYXR1cmVzIC4uLl1cblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLy4uLyc7XG5cbmZ1bmN0aW9uIHBhcnRpYWxTaWduYXR1cmUodmFsdWU6IG51bWJlciB8IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09IG9wY29kZXMuT1BfMCB8fCBic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKHZhbHVlIGFzIEJ1ZmZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IFN0YWNrLCBhbGxvd0luY29tcGxldGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCkgYXMgU3RhY2s7XG4gIGlmIChjaHVua3MubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzWzBdICE9PSBvcGNvZGVzLk9QXzApIHJldHVybiBmYWxzZTtcblxuICBpZiAoYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgcmV0dXJuIGNodW5rcy5zbGljZSgxKS5ldmVyeShwYXJ0aWFsU2lnbmF0dXJlKTtcbiAgfVxuXG4gIHJldHVybiAoY2h1bmtzLnNsaWNlKDEpIGFzIEJ1ZmZlcltdKS5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpc2lnIGlucHV0Jztcbn07XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3QkFBd0I7O0FBVXhCLHNCQVVDO0FBakJELDhCQUEyQztBQUMzQyw4QkFBaUM7QUFFakMsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFzQjtJQUM5QyxPQUFPLEtBQUssS0FBSyxXQUFPLENBQUMsSUFBSSxJQUFJLFVBQU8sQ0FBQywwQkFBMEIsQ0FBQyxLQUFlLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsU0FBZ0IsS0FBSyxDQUFDLE1BQXNCLEVBQUUsZUFBeUI7SUFDckUsTUFBTSxNQUFNLEdBQUcsVUFBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQVUsQ0FBQztJQUNsRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3BDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFN0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE9BQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWMsQ0FBQyxLQUFLLENBQUMsVUFBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDakYsQ0FBQztBQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBVyxFQUFFO0lBQzFCLE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gT1BfMCBbc2lnbmF0dXJlcyAuLi5dXG5cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0IH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi8nO1xuXG5mdW5jdGlvbiBwYXJ0aWFsU2lnbmF0dXJlKHZhbHVlOiBudW1iZXIgfCBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvcGNvZGVzLk9QXzAgfHwgYnNjcmlwdC5pc0Nhbm9uaWNhbFNjcmlwdFNpZ25hdHVyZSh2YWx1ZSBhcyBCdWZmZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soc2NyaXB0OiBCdWZmZXIgfCBTdGFjaywgYWxsb3dJbmNvbXBsZXRlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpIGFzIFN0YWNrO1xuICBpZiAoY2h1bmtzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGNodW5rc1swXSAhPT0gb3Bjb2Rlcy5PUF8wKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGFsbG93SW5jb21wbGV0ZSkge1xuICAgIHJldHVybiBjaHVua3Muc2xpY2UoMSkuZXZlcnkocGFydGlhbFNpZ25hdHVyZSk7XG4gIH1cblxuICByZXR1cm4gKGNodW5rcy5zbGljZSgxKSBhcyBCdWZmZXJbXSkuZXZlcnkoYnNjcmlwdC5pc0Nhbm9uaWNhbFNjcmlwdFNpZ25hdHVyZSk7XG59XG5jaGVjay50b0pTT04gPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuICdtdWx0aXNpZyBpbnB1dCc7XG59O1xuIl19
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { Stack } from '../../';
3
2
  export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
3
  export declare namespace check {
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/output.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAM/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAkBhF;yBAlBe,KAAK"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAM/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAkBhF;yBAlBe,KAAK;sBAmBF,MAAM"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // m [pubKeys ...] n OP_CHECKMULTISIG
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.check = void 0;
4
+ exports.check = check;
5
5
  const __1 = require("../../");
6
6
  const __2 = require("../../");
7
7
  const types = require("bitcoinjs-lib/src/types");
@@ -31,8 +31,7 @@ function check(script, allowIncomplete) {
31
31
  const keys = chunks.slice(1, -2);
32
32
  return keys.every(__1.script.isCanonicalPubKey);
33
33
  }
34
- exports.check = check;
35
34
  check.toJSON = () => {
36
35
  return 'multi-sig output';
37
36
  };
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RlbXBsYXRlcy9tdWx0aXNpZy9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQzs7O0FBR3JDLDhCQUEyQztBQUMzQyw4QkFBaUM7QUFDakMsaURBQWlEO0FBQ2pELE1BQU0sV0FBVyxHQUFHLFdBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXO0FBRXBELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFFbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFZLEdBQUcsV0FBVyxDQUFDO0lBRTlELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFsQkQsc0JBa0JDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBtIFtwdWJLZXlzIC4uLl0gbiBPUF9DSEVDS01VTFRJU0lHXG5cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0IH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvdHlwZXMnO1xuY29uc3QgT1BfSU5UX0JBU0UgPSBvcGNvZGVzLk9QX1JFU0VSVkVEOyAvLyBPUF8xIC0gMVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soc2NyaXB0OiBCdWZmZXIgfCBTdGFjaywgYWxsb3dJbmNvbXBsZXRlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpIGFzIFN0YWNrO1xuXG4gIGlmIChjaHVua3MubGVuZ3RoIDwgNCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXSAhPT0gb3Bjb2Rlcy5PUF9DSEVDS01VTFRJU0lHKSByZXR1cm4gZmFsc2U7XG4gIGlmICghdHlwZXMuTnVtYmVyKGNodW5rc1swXSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0eXBlcy5OdW1iZXIoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAyXSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbSA9IChjaHVua3NbMF0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuICBjb25zdCBuID0gKGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMl0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuXG4gIGlmIChtIDw9IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gPiAxNikgcmV0dXJuIGZhbHNlO1xuICBpZiAobSA+IG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gIT09IGNodW5rcy5sZW5ndGggLSAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhbGxvd0luY29tcGxldGUpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGtleXMgPSBjaHVua3Muc2xpY2UoMSwgLTIpIGFzIEJ1ZmZlcltdO1xuICByZXR1cm4ga2V5cy5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsUHViS2V5KTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpLXNpZyBvdXRwdXQnO1xufTtcbiJdfQ==
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RlbXBsYXRlcy9tdWx0aXNpZy9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQzs7QUFRckMsc0JBa0JDO0FBdkJELDhCQUEyQztBQUMzQyw4QkFBaUM7QUFDakMsaURBQWlEO0FBQ2pELE1BQU0sV0FBVyxHQUFHLFdBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXO0FBRXBELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFFbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFZLEdBQUcsV0FBVyxDQUFDO0lBRTlELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFDRCxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQVcsRUFBRTtJQUMxQixPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG0gW3B1YktleXMgLi4uXSBuIE9QX0NIRUNLTVVMVElTSUdcblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLy4uLyc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICdiaXRjb2luanMtbGliL3NyYy90eXBlcyc7XG5jb25zdCBPUF9JTlRfQkFTRSA9IG9wY29kZXMuT1BfUkVTRVJWRUQ7IC8vIE9QXzEgLSAxXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IFN0YWNrLCBhbGxvd0luY29tcGxldGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCkgYXMgU3RhY2s7XG5cbiAgaWYgKGNodW5rcy5sZW5ndGggPCA0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBvcGNvZGVzLk9QX0NIRUNLTVVMVElTSUcpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0eXBlcy5OdW1iZXIoY2h1bmtzWzBdKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXR5cGVzLk51bWJlcihjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDJdKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtID0gKGNodW5rc1swXSBhcyBudW1iZXIpIC0gT1BfSU5UX0JBU0U7XG4gIGNvbnN0IG4gPSAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAyXSBhcyBudW1iZXIpIC0gT1BfSU5UX0JBU0U7XG5cbiAgaWYgKG0gPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAobiA+IDE2KSByZXR1cm4gZmFsc2U7XG4gIGlmIChtID4gbikgcmV0dXJuIGZhbHNlO1xuICBpZiAobiAhPT0gY2h1bmtzLmxlbmd0aCAtIDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFsbG93SW5jb21wbGV0ZSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3Qga2V5cyA9IGNodW5rcy5zbGljZSgxLCAtMikgYXMgQnVmZmVyW107XG4gIHJldHVybiBrZXlzLmV2ZXJ5KGJzY3JpcHQuaXNDYW5vbmljYWxQdWJLZXkpO1xufVxuY2hlY2sudG9KU09OID0gKCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiAnbXVsdGktc2lnIG91dHB1dCc7XG59O1xuIl19
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  export declare function check(script: Buffer | Array<number | Buffer>): boolean;
3
2
  export declare namespace check {
4
3
  var toJSON: () => string;