@bitgo-beta/abstract-utxo 1.1.1-beta.192 → 1.1.1-beta.1921

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 (829) hide show
  1. package/README.md +76 -0
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts +461 -0
  3. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  4. package/dist/cjs/src/abstractUtxoCoin.js +705 -0
  5. package/dist/cjs/src/address/fixedScript.d.ts +44 -0
  6. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  7. package/dist/cjs/src/address/fixedScript.js +105 -0
  8. package/dist/cjs/src/address/index.d.ts +2 -0
  9. package/dist/cjs/src/address/index.d.ts.map +1 -0
  10. package/dist/cjs/src/address/index.js +8 -0
  11. package/dist/cjs/src/config.d.ts.map +1 -0
  12. package/dist/cjs/src/config.js +14 -0
  13. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +19 -0
  14. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  15. package/dist/cjs/src/descriptor/NamedDescriptor.js +77 -0
  16. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  17. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  18. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +33 -0
  19. package/dist/cjs/src/descriptor/builder/builder.d.ts +12 -0
  20. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  21. package/dist/cjs/src/descriptor/builder/builder.js +37 -0
  22. package/dist/cjs/src/descriptor/builder/index.d.ts +3 -0
  23. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  24. package/dist/cjs/src/descriptor/builder/index.js +8 -0
  25. package/dist/cjs/src/descriptor/builder/parse.d.ts +5 -0
  26. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  27. package/dist/cjs/src/descriptor/builder/parse.js +116 -0
  28. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  29. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  30. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  31. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  32. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  33. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  34. package/dist/cjs/src/descriptor/createWallet/index.d.ts +3 -0
  35. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  36. package/dist/cjs/src/descriptor/createWallet/index.js +19 -0
  37. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +19 -0
  38. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  39. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  40. package/dist/cjs/src/descriptor/index.d.ts +8 -0
  41. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  42. package/dist/cjs/src/descriptor/index.js +53 -0
  43. package/dist/cjs/src/descriptor/validatePolicy.d.ts +22 -0
  44. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  45. package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
  46. package/dist/cjs/src/impl/bch/bch.d.ts +22 -0
  47. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  48. package/dist/cjs/src/impl/bch/bch.js +43 -0
  49. package/dist/cjs/src/impl/bch/index.d.ts +3 -0
  50. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  51. package/dist/cjs/src/impl/bch/index.js +19 -0
  52. package/dist/cjs/src/impl/bch/tbch.d.ts +12 -0
  53. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  54. package/dist/cjs/src/impl/bch/tbch.js +15 -0
  55. package/dist/cjs/src/impl/bcha/bcha.d.ts +9 -0
  56. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  57. package/dist/cjs/src/impl/bcha/bcha.js +15 -0
  58. package/dist/cjs/src/impl/bcha/index.d.ts +3 -0
  59. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  60. package/dist/cjs/src/impl/bcha/index.js +19 -0
  61. package/dist/cjs/src/impl/bcha/tbcha.d.ts +12 -0
  62. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  63. package/dist/cjs/src/impl/bcha/tbcha.js +15 -0
  64. package/dist/cjs/src/impl/bsv/bsv.d.ts +9 -0
  65. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  66. package/dist/cjs/src/impl/bsv/bsv.js +15 -0
  67. package/dist/cjs/src/impl/bsv/index.d.ts +3 -0
  68. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  69. package/dist/cjs/src/impl/bsv/index.js +19 -0
  70. package/dist/cjs/src/impl/bsv/tbsv.d.ts +12 -0
  71. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  72. package/dist/cjs/src/impl/bsv/tbsv.js +15 -0
  73. package/dist/cjs/src/impl/btc/btc.d.ts +15 -0
  74. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  75. package/dist/cjs/src/impl/btc/btc.js +22 -0
  76. package/dist/cjs/src/impl/btc/index.d.ts +7 -0
  77. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  78. package/dist/cjs/src/impl/btc/index.js +23 -0
  79. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts +61 -0
  80. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  81. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +171 -0
  82. package/dist/cjs/src/impl/btc/tbtc.d.ts +12 -0
  83. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  84. package/dist/cjs/src/impl/btc/tbtc.js +15 -0
  85. package/dist/cjs/src/impl/btc/tbtc4.d.ts +12 -0
  86. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  87. package/dist/cjs/src/impl/btc/tbtc4.js +15 -0
  88. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +12 -0
  89. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  90. package/dist/cjs/src/impl/btc/tbtcbgsig.js +15 -0
  91. package/dist/cjs/src/impl/btc/tbtcsig.d.ts +12 -0
  92. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  93. package/dist/cjs/src/impl/btc/tbtcsig.js +15 -0
  94. package/dist/cjs/src/impl/btg/btg.d.ts +9 -0
  95. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  96. package/dist/cjs/src/impl/btg/btg.js +15 -0
  97. package/dist/cjs/src/impl/btg/index.d.ts +2 -0
  98. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  99. package/dist/cjs/src/impl/btg/index.js +18 -0
  100. package/dist/cjs/src/impl/dash/dash.d.ts +9 -0
  101. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  102. package/dist/cjs/src/impl/dash/dash.js +15 -0
  103. package/dist/cjs/src/impl/dash/index.d.ts +3 -0
  104. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  105. package/dist/cjs/src/impl/dash/index.js +19 -0
  106. package/dist/cjs/src/impl/dash/tdash.d.ts +12 -0
  107. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  108. package/dist/cjs/src/impl/dash/tdash.js +15 -0
  109. package/dist/cjs/src/impl/doge/doge.d.ts +35 -0
  110. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  111. package/dist/cjs/src/impl/doge/doge.js +79 -0
  112. package/dist/cjs/src/impl/doge/index.d.ts +3 -0
  113. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  114. package/dist/cjs/src/impl/doge/index.js +19 -0
  115. package/dist/cjs/src/impl/doge/tdoge.d.ts +12 -0
  116. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  117. package/dist/cjs/src/impl/doge/tdoge.js +15 -0
  118. package/dist/cjs/src/impl/index.d.ts +10 -0
  119. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  120. package/dist/cjs/src/impl/index.js +46 -0
  121. package/dist/cjs/src/impl/ltc/index.d.ts +3 -0
  122. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  123. package/dist/cjs/src/impl/ltc/index.js +19 -0
  124. package/dist/cjs/src/impl/ltc/ltc.d.ts +8 -0
  125. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  126. package/dist/cjs/src/impl/ltc/ltc.js +15 -0
  127. package/dist/cjs/src/impl/ltc/tltc.d.ts +8 -0
  128. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  129. package/dist/cjs/src/impl/ltc/tltc.js +15 -0
  130. package/dist/cjs/src/impl/zec/index.d.ts +3 -0
  131. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  132. package/dist/cjs/src/impl/zec/index.js +19 -0
  133. package/dist/cjs/src/impl/zec/tzec.d.ts +9 -0
  134. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  135. package/dist/cjs/src/impl/zec/tzec.js +15 -0
  136. package/dist/cjs/src/impl/zec/zec.d.ts +12 -0
  137. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  138. package/dist/cjs/src/impl/zec/zec.js +15 -0
  139. package/dist/cjs/src/index.d.ts +23 -0
  140. package/dist/cjs/src/index.d.ts.map +1 -0
  141. package/dist/cjs/src/index.js +62 -0
  142. package/dist/cjs/src/keychains.d.ts +56 -0
  143. package/dist/cjs/src/keychains.d.ts.map +1 -0
  144. package/dist/cjs/src/keychains.js +144 -0
  145. package/dist/cjs/src/names.d.ts +36 -0
  146. package/dist/cjs/src/names.d.ts.map +1 -0
  147. package/dist/cjs/src/names.js +231 -0
  148. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  149. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  150. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +23 -0
  151. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
  152. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  153. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  154. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts +16 -0
  155. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  156. package/dist/cjs/src/offlineVault/TransactionExplanation.js +15 -0
  157. package/dist/cjs/src/offlineVault/descriptor/index.d.ts +2 -0
  158. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  159. package/dist/cjs/src/offlineVault/descriptor/index.js +18 -0
  160. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +39 -0
  161. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  162. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  163. package/dist/cjs/src/offlineVault/index.d.ts +6 -0
  164. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  165. package/dist/cjs/src/offlineVault/index.js +44 -0
  166. package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +1 -3
  167. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  168. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  169. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +158 -0
  170. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  171. package/dist/cjs/src/recovery/backupKeyRecovery.js +411 -0
  172. package/dist/{src → cjs/src}/recovery/baseApi.d.ts +3 -6
  173. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  174. package/dist/cjs/src/recovery/baseApi.js +73 -0
  175. package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -3
  176. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  177. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  178. package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +21 -9
  179. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  180. package/dist/cjs/src/recovery/crossChainRecovery.js +299 -0
  181. package/dist/{src → cjs/src}/recovery/index.d.ts +0 -1
  182. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  183. package/dist/{src → cjs/src}/recovery/index.js +6 -3
  184. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  185. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  186. package/dist/cjs/src/recovery/psbt.d.ts +62 -0
  187. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -0
  188. package/dist/cjs/src/recovery/psbt.js +153 -0
  189. package/dist/cjs/src/tnumber.d.ts +4 -0
  190. package/dist/cjs/src/tnumber.d.ts.map +1 -0
  191. package/dist/cjs/src/tnumber.js +12 -0
  192. package/dist/cjs/src/transaction/bip322.d.ts +27 -0
  193. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  194. package/dist/cjs/src/transaction/bip322.js +139 -0
  195. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
  196. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  197. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  198. package/dist/cjs/src/transaction/decode.d.ts +13 -0
  199. package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
  200. package/dist/cjs/src/transaction/decode.js +88 -0
  201. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +5 -0
  202. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  203. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +45 -0
  204. package/dist/cjs/src/transaction/descriptor/index.d.ts +7 -0
  205. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  206. package/dist/cjs/src/transaction/descriptor/index.js +14 -0
  207. package/dist/cjs/src/transaction/descriptor/parse.d.ts +19 -0
  208. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  209. package/dist/cjs/src/transaction/descriptor/parse.js +90 -0
  210. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +14 -0
  211. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  212. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  213. package/dist/cjs/src/transaction/descriptor/recipient.d.ts +5 -0
  214. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  215. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  216. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +24 -0
  217. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  218. package/dist/cjs/src/transaction/descriptor/signPsbt.js +44 -0
  219. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +37 -0
  220. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  221. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +81 -0
  222. package/dist/cjs/src/transaction/explainTransaction.d.ts +21 -0
  223. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  224. package/dist/cjs/src/transaction/explainTransaction.js +90 -0
  225. package/dist/cjs/src/transaction/fetchInputs.d.ts +27 -0
  226. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
  227. package/dist/cjs/src/transaction/fetchInputs.js +111 -0
  228. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +24 -0
  229. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
  230. package/dist/cjs/src/transaction/fixedScript/SigningError.js +32 -0
  231. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +41 -0
  232. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  233. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +120 -0
  234. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +80 -0
  235. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  236. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +346 -0
  237. package/dist/cjs/src/transaction/fixedScript/index.d.ts +10 -0
  238. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  239. package/dist/cjs/src/transaction/fixedScript/index.js +34 -0
  240. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts +4 -0
  241. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts.map +1 -0
  242. package/dist/cjs/src/transaction/fixedScript/musig2.js +3 -0
  243. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +28 -0
  244. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  245. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +216 -0
  246. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +8 -0
  247. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  248. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +227 -0
  249. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +10 -0
  250. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  251. package/dist/cjs/src/transaction/fixedScript/replayProtection.js +44 -0
  252. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +32 -0
  253. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -0
  254. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +156 -0
  255. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +20 -0
  256. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
  257. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +157 -0
  258. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  259. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  260. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +116 -0
  261. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +34 -0
  262. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  263. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +78 -0
  264. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  265. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  266. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +199 -0
  267. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  268. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  269. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.js +20 -0
  270. package/dist/cjs/src/transaction/index.d.ts +10 -0
  271. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  272. package/dist/cjs/src/transaction/index.js +54 -0
  273. package/dist/cjs/src/transaction/outputDifference.d.ts +44 -0
  274. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  275. package/dist/cjs/src/transaction/outputDifference.js +51 -0
  276. package/dist/cjs/src/transaction/parseTransaction.d.ts +4 -0
  277. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  278. package/dist/cjs/src/transaction/parseTransaction.js +48 -0
  279. package/dist/cjs/src/transaction/recipient.d.ts +34 -0
  280. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  281. package/dist/cjs/src/transaction/recipient.js +69 -0
  282. package/dist/cjs/src/transaction/signTransaction.d.ts +6 -0
  283. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  284. package/dist/cjs/src/transaction/signTransaction.js +115 -0
  285. package/dist/cjs/src/transaction/types.d.ts +50 -0
  286. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  287. package/dist/cjs/src/transaction/types.js +7 -0
  288. package/dist/cjs/src/transaction/verifyTransaction.d.ts +4 -0
  289. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  290. package/dist/cjs/src/transaction/verifyTransaction.js +50 -0
  291. package/dist/cjs/src/unspent.d.ts +55 -0
  292. package/dist/cjs/src/unspent.d.ts.map +1 -0
  293. package/dist/cjs/src/unspent.js +12 -0
  294. package/dist/cjs/src/verifyKey.d.ts +21 -0
  295. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  296. package/dist/cjs/src/verifyKey.js +108 -0
  297. package/dist/cjs/src/wallet.d.ts +15 -0
  298. package/dist/cjs/src/wallet.d.ts.map +1 -0
  299. package/dist/cjs/src/wallet.js +8 -0
  300. package/dist/cjs/src/wasmUtil.d.ts +34 -0
  301. package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
  302. package/dist/cjs/src/wasmUtil.js +95 -0
  303. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  304. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  305. package/dist/cjs/test/integration/impl/bch/bch.js +76 -0
  306. package/dist/cjs/test/unit/address.d.ts +2 -0
  307. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  308. package/dist/cjs/test/unit/address.js +152 -0
  309. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  310. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  311. package/dist/cjs/test/unit/bip322.js +410 -0
  312. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts +2 -0
  313. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts.map +1 -0
  314. package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +99 -0
  315. package/dist/cjs/test/unit/coins.d.ts +2 -0
  316. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  317. package/dist/cjs/test/unit/coins.js +161 -0
  318. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  319. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  320. package/dist/cjs/test/unit/customChangeWallet.js +215 -0
  321. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts +2 -0
  322. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts.map +1 -0
  323. package/dist/cjs/test/unit/customChangeWalletFixtures.js +53 -0
  324. package/dist/cjs/test/unit/customSigner.d.ts +2 -0
  325. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  326. package/dist/cjs/test/unit/customSigner.js +99 -0
  327. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  328. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  329. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +51 -0
  330. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  331. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  332. package/dist/cjs/test/unit/descriptor/builder.js +78 -0
  333. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  334. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  335. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +53 -0
  336. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  337. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  338. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +62 -0
  339. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  340. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  341. package/dist/cjs/test/unit/descriptorAddress.js +103 -0
  342. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  343. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  344. package/dist/cjs/test/unit/explainTransaction.js +97 -0
  345. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
  346. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
  347. package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
  348. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  349. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  350. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  351. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  352. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  353. package/dist/cjs/test/unit/impl/bch/unit/bch.js +71 -0
  354. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  355. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  356. package/dist/cjs/test/unit/impl/bcha/unit/index.js +41 -0
  357. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  358. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  359. package/dist/cjs/test/unit/impl/bsv/unit/index.js +34 -0
  360. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  361. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  362. package/dist/cjs/test/unit/impl/btg/unit/index.js +33 -0
  363. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  364. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  365. package/dist/cjs/test/unit/impl/dash/unit/index.js +34 -0
  366. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  367. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  368. package/dist/cjs/test/unit/impl/doge/unit/index.js +34 -0
  369. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  370. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  371. package/dist/cjs/test/unit/impl/zec/unit/index.js +30 -0
  372. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  373. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  374. package/dist/cjs/test/unit/keySignatures.js +54 -0
  375. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  376. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  377. package/dist/cjs/test/unit/keychains.js +87 -0
  378. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  379. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  380. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  381. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  382. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  383. package/dist/cjs/test/unit/parseTransaction.js +125 -0
  384. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  385. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  386. package/dist/cjs/test/unit/postProcessPrebuild.js +65 -0
  387. package/dist/cjs/test/unit/prebuildAndSign.d.ts +2 -0
  388. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  389. package/dist/cjs/test/unit/prebuildAndSign.js +249 -0
  390. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  391. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  392. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +136 -0
  393. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  394. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  395. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
  396. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  397. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  398. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +297 -0
  399. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  400. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  401. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +189 -0
  402. package/dist/cjs/test/unit/recovery/mock.d.ts +37 -0
  403. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  404. package/dist/cjs/test/unit/recovery/mock.js +111 -0
  405. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  406. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  407. package/dist/cjs/test/unit/signTransaction.js +245 -0
  408. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  409. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  410. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  411. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  412. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  413. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +64 -0
  414. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  415. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  416. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +51 -0
  417. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  418. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  419. package/dist/cjs/test/unit/transaction/descriptor/parse.js +138 -0
  420. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  421. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  422. package/dist/cjs/test/unit/transaction/descriptor/sign.js +76 -0
  423. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  424. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  425. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +81 -0
  426. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  427. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  428. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +193 -0
  429. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  430. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  431. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +287 -0
  432. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts +2 -0
  433. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  434. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.js +60 -0
  435. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts +2 -0
  436. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts.map +1 -0
  437. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +154 -0
  438. package/dist/cjs/test/unit/transaction/outputDifference.d.ts +2 -0
  439. package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
  440. package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
  441. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  442. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  443. package/dist/cjs/test/unit/transaction.js +308 -0
  444. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  445. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  446. package/dist/cjs/test/unit/txFormat.js +161 -0
  447. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  448. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  449. package/dist/cjs/test/unit/util/address.js +15 -0
  450. package/dist/cjs/test/unit/util/assert.d.ts +3 -0
  451. package/dist/cjs/test/unit/util/assert.d.ts.map +1 -0
  452. package/dist/cjs/test/unit/util/assert.js +24 -0
  453. package/dist/cjs/test/unit/util/fixtures.d.ts +13 -0
  454. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  455. package/dist/cjs/test/unit/util/fixtures.js +105 -0
  456. package/dist/cjs/test/unit/util/index.d.ts +11 -0
  457. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  458. package/dist/cjs/test/unit/util/index.js +27 -0
  459. package/dist/cjs/test/unit/util/keychains.d.ts +55 -0
  460. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  461. package/dist/cjs/test/unit/util/keychains.js +122 -0
  462. package/dist/cjs/test/unit/util/nockBitGo.d.ts +10 -0
  463. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  464. package/dist/cjs/test/unit/util/nockBitGo.js +27 -0
  465. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  466. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  467. package/dist/cjs/test/unit/util/nockIndexerAPI.js +23 -0
  468. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  469. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  470. package/dist/cjs/test/unit/util/psbt.js +21 -0
  471. package/dist/cjs/test/unit/util/transaction.d.ts +28 -0
  472. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  473. package/dist/cjs/test/unit/util/transaction.js +131 -0
  474. package/dist/cjs/test/unit/util/unspents.d.ts +71 -0
  475. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  476. package/dist/cjs/test/unit/util/unspents.js +224 -0
  477. package/dist/cjs/test/unit/util/utxoCoins.d.ts +30 -0
  478. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  479. package/dist/cjs/test/unit/util/utxoCoins.js +175 -0
  480. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  481. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  482. package/dist/cjs/test/unit/util/wallet.js +9 -0
  483. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  484. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  485. package/dist/cjs/test/unit/verifyTransaction.js +327 -0
  486. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  487. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  488. package/dist/cjs/test/unit/wallet.js +251 -0
  489. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  490. package/dist/esm/abstractUtxoCoin.d.ts +461 -0
  491. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  492. package/dist/esm/abstractUtxoCoin.js +664 -0
  493. package/dist/esm/address/fixedScript.d.ts +44 -0
  494. package/dist/esm/address/fixedScript.d.ts.map +1 -0
  495. package/dist/esm/address/fixedScript.js +97 -0
  496. package/dist/esm/address/index.d.ts +2 -0
  497. package/dist/esm/address/index.d.ts.map +1 -0
  498. package/dist/esm/address/index.js +2 -0
  499. package/dist/esm/config.d.ts +9 -0
  500. package/dist/esm/config.js +11 -0
  501. package/dist/esm/descriptor/NamedDescriptor.d.ts +19 -0
  502. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
  503. package/dist/esm/descriptor/NamedDescriptor.js +37 -0
  504. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  505. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  506. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  507. package/dist/esm/descriptor/builder/builder.d.ts +12 -0
  508. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
  509. package/dist/esm/descriptor/builder/builder.js +34 -0
  510. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  511. package/dist/esm/descriptor/builder/index.d.ts.map +1 -0
  512. package/dist/esm/descriptor/builder/index.js +3 -0
  513. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  514. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -0
  515. package/dist/esm/descriptor/builder/parse.js +112 -0
  516. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  517. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  518. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  519. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  520. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  521. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  522. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  523. package/dist/esm/descriptor/createWallet/index.d.ts.map +1 -0
  524. package/dist/esm/descriptor/createWallet/index.js +3 -0
  525. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  526. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -0
  527. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  528. package/dist/esm/descriptor/index.d.ts +8 -0
  529. package/dist/esm/descriptor/index.d.ts.map +1 -0
  530. package/dist/esm/descriptor/index.js +7 -0
  531. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  532. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -0
  533. package/dist/esm/descriptor/validatePolicy.js +80 -0
  534. package/dist/esm/impl/bch/bch.d.ts +22 -0
  535. package/dist/esm/impl/bch/bch.d.ts.map +1 -0
  536. package/dist/esm/impl/bch/bch.js +39 -0
  537. package/dist/esm/impl/bch/index.d.ts +3 -0
  538. package/dist/esm/impl/bch/index.d.ts.map +1 -0
  539. package/dist/esm/impl/bch/index.js +3 -0
  540. package/dist/esm/impl/bch/tbch.d.ts +12 -0
  541. package/dist/esm/impl/bch/tbch.d.ts.map +1 -0
  542. package/dist/esm/impl/bch/tbch.js +11 -0
  543. package/dist/esm/impl/bcha/bcha.d.ts +9 -0
  544. package/dist/esm/impl/bcha/bcha.d.ts.map +1 -0
  545. package/dist/esm/impl/bcha/bcha.js +11 -0
  546. package/dist/esm/impl/bcha/index.d.ts +3 -0
  547. package/dist/esm/impl/bcha/index.d.ts.map +1 -0
  548. package/dist/esm/impl/bcha/index.js +3 -0
  549. package/dist/esm/impl/bcha/tbcha.d.ts +12 -0
  550. package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -0
  551. package/dist/esm/impl/bcha/tbcha.js +11 -0
  552. package/dist/esm/impl/bsv/bsv.d.ts +9 -0
  553. package/dist/esm/impl/bsv/bsv.d.ts.map +1 -0
  554. package/dist/esm/impl/bsv/bsv.js +11 -0
  555. package/dist/esm/impl/bsv/index.d.ts +3 -0
  556. package/dist/esm/impl/bsv/index.d.ts.map +1 -0
  557. package/dist/esm/impl/bsv/index.js +3 -0
  558. package/dist/esm/impl/bsv/tbsv.d.ts +12 -0
  559. package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -0
  560. package/dist/esm/impl/bsv/tbsv.js +11 -0
  561. package/dist/esm/impl/btc/btc.d.ts +15 -0
  562. package/dist/esm/impl/btc/btc.d.ts.map +1 -0
  563. package/dist/esm/impl/btc/btc.js +18 -0
  564. package/dist/esm/impl/btc/index.d.ts +7 -0
  565. package/dist/esm/impl/btc/index.d.ts.map +1 -0
  566. package/dist/esm/impl/btc/index.js +7 -0
  567. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +61 -0
  568. package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  569. package/dist/esm/impl/btc/inscriptionBuilder.js +164 -0
  570. package/dist/esm/impl/btc/tbtc.d.ts +12 -0
  571. package/dist/esm/impl/btc/tbtc.d.ts.map +1 -0
  572. package/dist/esm/impl/btc/tbtc.js +11 -0
  573. package/dist/esm/impl/btc/tbtc4.d.ts +12 -0
  574. package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -0
  575. package/dist/esm/impl/btc/tbtc4.js +11 -0
  576. package/dist/esm/impl/btc/tbtcbgsig.d.ts +12 -0
  577. package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -0
  578. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  579. package/dist/esm/impl/btc/tbtcsig.d.ts +12 -0
  580. package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -0
  581. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  582. package/dist/esm/impl/btg/btg.d.ts +9 -0
  583. package/dist/esm/impl/btg/btg.d.ts.map +1 -0
  584. package/dist/esm/impl/btg/btg.js +11 -0
  585. package/dist/esm/impl/btg/index.d.ts +2 -0
  586. package/dist/esm/impl/btg/index.d.ts.map +1 -0
  587. package/dist/esm/impl/btg/index.js +2 -0
  588. package/dist/esm/impl/dash/dash.d.ts +9 -0
  589. package/dist/esm/impl/dash/dash.d.ts.map +1 -0
  590. package/dist/esm/impl/dash/dash.js +11 -0
  591. package/dist/esm/impl/dash/index.d.ts +3 -0
  592. package/dist/esm/impl/dash/index.d.ts.map +1 -0
  593. package/dist/esm/impl/dash/index.js +3 -0
  594. package/dist/esm/impl/dash/tdash.d.ts +12 -0
  595. package/dist/esm/impl/dash/tdash.d.ts.map +1 -0
  596. package/dist/esm/impl/dash/tdash.js +11 -0
  597. package/dist/esm/impl/doge/doge.d.ts +35 -0
  598. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  599. package/dist/esm/impl/doge/doge.js +75 -0
  600. package/dist/esm/impl/doge/index.d.ts +3 -0
  601. package/dist/esm/impl/doge/index.d.ts.map +1 -0
  602. package/dist/esm/impl/doge/index.js +3 -0
  603. package/dist/esm/impl/doge/tdoge.d.ts +12 -0
  604. package/dist/esm/impl/doge/tdoge.d.ts.map +1 -0
  605. package/dist/esm/impl/doge/tdoge.js +11 -0
  606. package/dist/esm/impl/index.d.ts +10 -0
  607. package/dist/esm/impl/index.d.ts.map +1 -0
  608. package/dist/esm/impl/index.js +10 -0
  609. package/dist/esm/impl/ltc/index.d.ts +3 -0
  610. package/dist/esm/impl/ltc/index.d.ts.map +1 -0
  611. package/dist/esm/impl/ltc/index.js +3 -0
  612. package/dist/esm/impl/ltc/ltc.d.ts +8 -0
  613. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
  614. package/dist/esm/impl/ltc/ltc.js +11 -0
  615. package/dist/esm/impl/ltc/tltc.d.ts +8 -0
  616. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
  617. package/dist/esm/impl/ltc/tltc.js +11 -0
  618. package/dist/esm/impl/zec/index.d.ts +3 -0
  619. package/dist/esm/impl/zec/index.d.ts.map +1 -0
  620. package/dist/esm/impl/zec/index.js +3 -0
  621. package/dist/esm/impl/zec/tzec.d.ts +9 -0
  622. package/dist/esm/impl/zec/tzec.d.ts.map +1 -0
  623. package/dist/esm/impl/zec/tzec.js +11 -0
  624. package/dist/esm/impl/zec/zec.d.ts +12 -0
  625. package/dist/esm/impl/zec/zec.d.ts.map +1 -0
  626. package/dist/esm/impl/zec/zec.js +11 -0
  627. package/dist/esm/index.d.ts +23 -0
  628. package/dist/esm/index.d.ts.map +1 -0
  629. package/dist/esm/index.js +23 -0
  630. package/dist/esm/keychains.d.ts +56 -0
  631. package/dist/esm/keychains.d.ts.map +1 -0
  632. package/dist/esm/keychains.js +99 -0
  633. package/dist/esm/names.d.ts +36 -0
  634. package/dist/esm/names.d.ts.map +1 -0
  635. package/dist/esm/names.js +184 -0
  636. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  637. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  638. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +20 -0
  639. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  640. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  641. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  642. package/dist/esm/offlineVault/TransactionExplanation.d.ts +16 -0
  643. package/dist/esm/offlineVault/TransactionExplanation.d.ts.map +1 -0
  644. package/dist/esm/offlineVault/TransactionExplanation.js +12 -0
  645. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  646. package/dist/esm/offlineVault/descriptor/index.d.ts.map +1 -0
  647. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  648. package/dist/esm/offlineVault/descriptor/transaction.d.ts +39 -0
  649. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -0
  650. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  651. package/dist/esm/offlineVault/index.d.ts +6 -0
  652. package/dist/esm/offlineVault/index.d.ts.map +1 -0
  653. package/dist/esm/offlineVault/index.js +4 -0
  654. package/dist/esm/recovery/RecoveryProvider.d.ts +20 -0
  655. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -0
  656. package/dist/esm/recovery/RecoveryProvider.js +19 -0
  657. package/dist/esm/recovery/backupKeyRecovery.d.ts +158 -0
  658. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
  659. package/dist/esm/recovery/backupKeyRecovery.js +400 -0
  660. package/dist/esm/recovery/baseApi.d.ts +24 -0
  661. package/dist/esm/recovery/baseApi.d.ts.map +1 -0
  662. package/dist/esm/recovery/baseApi.js +64 -0
  663. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  664. package/dist/esm/recovery/coingeckoApi.d.ts.map +1 -0
  665. package/dist/esm/recovery/coingeckoApi.js +40 -0
  666. package/dist/esm/recovery/crossChainRecovery.d.ts +97 -0
  667. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -0
  668. package/dist/esm/recovery/crossChainRecovery.js +292 -0
  669. package/dist/esm/recovery/index.d.ts +7 -0
  670. package/dist/{src → esm}/recovery/index.d.ts.map +1 -1
  671. package/dist/esm/recovery/index.js +7 -0
  672. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  673. package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +1 -1
  674. package/dist/esm/recovery/mempoolApi.js +29 -0
  675. package/dist/esm/recovery/psbt.d.ts +62 -0
  676. package/dist/esm/recovery/psbt.d.ts.map +1 -0
  677. package/dist/esm/recovery/psbt.js +145 -0
  678. package/dist/esm/tnumber.d.ts +4 -0
  679. package/dist/esm/tnumber.d.ts.map +1 -0
  680. package/dist/esm/tnumber.js +9 -0
  681. package/dist/esm/transaction/bip322.d.ts +27 -0
  682. package/dist/esm/transaction/bip322.d.ts.map +1 -0
  683. package/dist/esm/transaction/bip322.js +100 -0
  684. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  685. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  686. package/dist/esm/transaction/common/verifyPayGoAmount.js +1 -0
  687. package/dist/esm/transaction/decode.d.ts +13 -0
  688. package/dist/esm/transaction/decode.d.ts.map +1 -0
  689. package/dist/esm/transaction/decode.js +49 -0
  690. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  691. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  692. package/dist/esm/transaction/descriptor/explainPsbt.js +42 -0
  693. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  694. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -0
  695. package/dist/esm/transaction/descriptor/index.js +6 -0
  696. package/dist/esm/transaction/descriptor/parse.d.ts +19 -0
  697. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  698. package/dist/esm/transaction/descriptor/parse.js +86 -0
  699. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  700. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  701. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  702. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  703. package/dist/esm/transaction/descriptor/recipient.d.ts.map +1 -0
  704. package/dist/esm/transaction/descriptor/recipient.js +2 -0
  705. package/dist/esm/transaction/descriptor/signPsbt.d.ts +24 -0
  706. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -0
  707. package/dist/esm/transaction/descriptor/signPsbt.js +39 -0
  708. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +37 -0
  709. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  710. package/dist/esm/transaction/descriptor/verifyTransaction.js +71 -0
  711. package/dist/esm/transaction/explainTransaction.d.ts +21 -0
  712. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  713. package/dist/esm/transaction/explainTransaction.js +54 -0
  714. package/dist/esm/transaction/fetchInputs.d.ts +27 -0
  715. package/dist/esm/transaction/fetchInputs.d.ts.map +1 -0
  716. package/dist/esm/transaction/fetchInputs.js +74 -0
  717. package/dist/esm/transaction/fixedScript/SigningError.d.ts +24 -0
  718. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
  719. package/dist/esm/transaction/fixedScript/SigningError.js +26 -0
  720. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +41 -0
  721. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  722. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +115 -0
  723. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +80 -0
  724. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  725. package/dist/esm/transaction/fixedScript/explainTransaction.js +309 -0
  726. package/dist/esm/transaction/fixedScript/index.d.ts +10 -0
  727. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  728. package/dist/esm/transaction/fixedScript/index.js +9 -0
  729. package/dist/esm/transaction/fixedScript/musig2.d.ts +4 -0
  730. package/dist/esm/transaction/fixedScript/musig2.d.ts.map +1 -0
  731. package/dist/esm/transaction/fixedScript/musig2.js +2 -0
  732. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  733. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  734. package/dist/esm/transaction/fixedScript/parseOutput.js +209 -0
  735. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  736. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  737. package/dist/esm/transaction/fixedScript/parseTransaction.js +221 -0
  738. package/dist/esm/transaction/fixedScript/replayProtection.d.ts +10 -0
  739. package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  740. package/dist/esm/transaction/fixedScript/replayProtection.js +38 -0
  741. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +32 -0
  742. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -0
  743. package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +116 -0
  744. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +20 -0
  745. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
  746. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +117 -0
  747. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  748. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  749. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +109 -0
  750. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +34 -0
  751. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  752. package/dist/esm/transaction/fixedScript/signTransaction.js +71 -0
  753. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  754. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  755. package/dist/esm/transaction/fixedScript/verifyTransaction.js +160 -0
  756. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  757. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  758. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  759. package/dist/esm/transaction/index.d.ts +10 -0
  760. package/dist/esm/transaction/index.d.ts.map +1 -0
  761. package/dist/esm/transaction/index.js +10 -0
  762. package/dist/esm/transaction/outputDifference.d.ts +44 -0
  763. package/dist/esm/transaction/outputDifference.d.ts.map +1 -0
  764. package/dist/esm/transaction/outputDifference.js +45 -0
  765. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  766. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  767. package/dist/esm/transaction/parseTransaction.js +12 -0
  768. package/dist/esm/transaction/recipient.d.ts +34 -0
  769. package/dist/esm/transaction/recipient.d.ts.map +1 -0
  770. package/dist/esm/transaction/recipient.js +61 -0
  771. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  772. package/dist/esm/transaction/signTransaction.d.ts.map +1 -0
  773. package/dist/esm/transaction/signTransaction.js +76 -0
  774. package/dist/esm/transaction/types.d.ts +50 -0
  775. package/dist/esm/transaction/types.d.ts.map +1 -0
  776. package/dist/esm/transaction/types.js +4 -0
  777. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  778. package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -0
  779. package/dist/esm/transaction/verifyTransaction.js +14 -0
  780. package/dist/esm/unspent.d.ts +55 -0
  781. package/dist/esm/unspent.d.ts.map +1 -0
  782. package/dist/esm/unspent.js +8 -0
  783. package/dist/esm/verifyKey.d.ts +21 -0
  784. package/dist/esm/verifyKey.d.ts.map +1 -0
  785. package/dist/esm/verifyKey.js +100 -0
  786. package/dist/esm/wallet.d.ts +15 -0
  787. package/dist/esm/wallet.d.ts.map +1 -0
  788. package/dist/esm/wallet.js +5 -0
  789. package/dist/esm/wasmUtil.d.ts +34 -0
  790. package/dist/esm/wasmUtil.d.ts.map +1 -0
  791. package/dist/esm/wasmUtil.js +54 -0
  792. package/package.json +47 -20
  793. package/.eslintignore +0 -5
  794. package/CHANGELOG.md +0 -235
  795. package/dist/src/abstractUtxoCoin.d.ts +0 -392
  796. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  797. package/dist/src/abstractUtxoCoin.js +0 -931
  798. package/dist/src/config.js +0 -14
  799. package/dist/src/index.d.ts +0 -6
  800. package/dist/src/index.d.ts.map +0 -1
  801. package/dist/src/index.js +0 -18
  802. package/dist/src/parseOutput.d.ts +0 -22
  803. package/dist/src/parseOutput.d.ts.map +0 -1
  804. package/dist/src/parseOutput.js +0 -170
  805. package/dist/src/recovery/RecoveryProvider.d.ts.map +0 -1
  806. package/dist/src/recovery/RecoveryProvider.js +0 -24
  807. package/dist/src/recovery/backupKeyRecovery.d.ts +0 -62
  808. package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
  809. package/dist/src/recovery/backupKeyRecovery.js +0 -293
  810. package/dist/src/recovery/baseApi.d.ts.map +0 -1
  811. package/dist/src/recovery/baseApi.js +0 -73
  812. package/dist/src/recovery/coingeckoApi.d.ts.map +0 -1
  813. package/dist/src/recovery/coingeckoApi.js +0 -47
  814. package/dist/src/recovery/crossChainRecovery.d.ts.map +0 -1
  815. package/dist/src/recovery/crossChainRecovery.js +0 -294
  816. package/dist/src/recovery/mempoolApi.js +0 -33
  817. package/dist/src/recovery/smartbitApi.d.ts +0 -11
  818. package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
  819. package/dist/src/recovery/smartbitApi.js +0 -36
  820. package/dist/src/replayProtection.d.ts +0 -4
  821. package/dist/src/replayProtection.d.ts.map +0 -1
  822. package/dist/src/replayProtection.js +0 -21
  823. package/dist/src/sign.d.ts +0 -31
  824. package/dist/src/sign.d.ts.map +0 -1
  825. package/dist/src/sign.js +0 -104
  826. package/dist/tsconfig.tsbuildinfo +0 -8017
  827. /package/dist/{src → cjs/src}/config.d.ts +0 -0
  828. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
  829. /package/dist/{src → esm}/config.d.ts.map +0 -0
@@ -0,0 +1,705 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.AbstractUtxoCoin = exports.ErrorDeprecatedTxFormat = void 0;
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const crypto_1 = require("crypto");
42
+ const lodash_1 = __importDefault(require("lodash"));
43
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
44
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
45
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
46
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
47
+ const recovery_1 = require("./recovery");
48
+ const replayProtection_1 = require("./transaction/fixedScript/replayProtection");
49
+ const config_1 = require("./config");
50
+ const transaction_1 = require("./transaction");
51
+ const verifyTransaction_1 = require("./transaction/descriptor/verifyTransaction");
52
+ const descriptor_1 = require("./descriptor");
53
+ const names_1 = require("./names");
54
+ const fixedScript_1 = require("./address/fixedScript");
55
+ const types_1 = require("./transaction/types");
56
+ const decode_1 = require("./transaction/decode");
57
+ const keychains_1 = require("./keychains");
58
+ const verifyKey_1 = require("./verifyKey");
59
+ const validatePolicy_1 = require("./descriptor/validatePolicy");
60
+ const signTransaction_1 = require("./transaction/signTransaction");
61
+ const wallet_1 = require("./wallet");
62
+ const descriptorWallet_1 = require("./descriptor/descriptorWallet");
63
+ class ErrorDeprecatedTxFormat extends Error {
64
+ constructor(txFormat) {
65
+ super(`SDK support for txFormat=${txFormat} is deprecated on this environment. Please use psbt instead.`);
66
+ }
67
+ }
68
+ exports.ErrorDeprecatedTxFormat = ErrorDeprecatedTxFormat;
69
+ const { isChainCode, scriptTypeForChain, outputScripts } = utxo_lib_1.bitgo;
70
+ /**
71
+ * Check if a decoded transaction has at least one taproot key path spend (MuSig2) input.
72
+ * Works for both utxolib UtxoPsbt and wasm-utxo BitGoPsbt.
73
+ */
74
+ function hasKeyPathSpendInput(tx, pubs, coinName) {
75
+ if (tx instanceof utxo_lib_1.bitgo.UtxoPsbt) {
76
+ return utxo_lib_1.bitgo.isTransactionWithKeyPathSpendInput(tx);
77
+ }
78
+ if (tx instanceof wasm_utxo_1.fixedScriptWallet.BitGoPsbt) {
79
+ (0, assert_1.default)(pubs && (0, sdk_core_1.isTriple)(pubs), 'pub triple is required to check for key path spend inputs in wasm-utxo PSBT');
80
+ const rootWalletKeys = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.fromXpubs(pubs);
81
+ const replayProtection = { publicKeys: (0, replayProtection_1.getReplayProtectionPubkeys)(coinName) };
82
+ const parsed = tx.parseTransactionWithWalletKeys(rootWalletKeys, { replayProtection });
83
+ return parsed.inputs.some((input) => input.scriptType === 'p2trMusig2KeyPath');
84
+ }
85
+ return false;
86
+ }
87
+ /**
88
+ * Convert ValidationError to TxIntentMismatchRecipientError with structured data
89
+ *
90
+ * This preserves the structured error information from the original ValidationError
91
+ * by extracting the mismatched outputs and converting them to the standardized format.
92
+ * The original error is preserved as the `cause` for debugging purposes.
93
+ */
94
+ function convertValidationErrorToTxIntentMismatch(error, reqId, txParams, txHex, txExplanation) {
95
+ const mismatchedRecipients = [];
96
+ for (const err of error.errors) {
97
+ if (err instanceof verifyTransaction_1.ErrorMissingOutputs) {
98
+ mismatchedRecipients.push(...err.missingOutputs.map((output) => ({
99
+ address: output.address,
100
+ amount: output.amount.toString(),
101
+ })));
102
+ }
103
+ else if (err instanceof verifyTransaction_1.ErrorImplicitExternalOutputs) {
104
+ mismatchedRecipients.push(...err.implicitExternalOutputs.map((output) => ({
105
+ address: output.address,
106
+ amount: output.amount.toString(),
107
+ })));
108
+ }
109
+ }
110
+ const txIntentError = new sdk_core_1.TxIntentMismatchRecipientError(error.message, reqId, [txParams], txHex, mismatchedRecipients, txExplanation);
111
+ // Preserve the original structured error as the cause for debugging
112
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
113
+ txIntentError.cause = error;
114
+ return txIntentError;
115
+ }
116
+ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
117
+ /**
118
+ * Returns whether this coin is a mainnet coin.
119
+ * Default implementation uses the name property.
120
+ * Can be overridden by subclasses.
121
+ */
122
+ isMainnet() {
123
+ return (0, names_1.isMainnetCoin)(this.name);
124
+ }
125
+ constructor(bitgo, amountType = 'number') {
126
+ super(bitgo);
127
+ this.supportedTxFormats = {
128
+ psbt: true,
129
+ legacy: this.isMainnet(),
130
+ };
131
+ this.amountType = amountType;
132
+ }
133
+ get defaultSdkBackend() {
134
+ return (0, names_1.isUtxoCoinNameMainnet)(this.name) ? 'utxolib' : 'wasm-utxo';
135
+ }
136
+ /**
137
+ * @deprecated - will be removed when we drop support for utxolib
138
+ * Use `name` property instead.
139
+ */
140
+ get network() {
141
+ return (0, names_1.getNetworkFromCoinName)(this.name);
142
+ }
143
+ getChain() {
144
+ return this.name;
145
+ }
146
+ getFamily() {
147
+ return (0, names_1.getMainnetCoinName)(this.name);
148
+ }
149
+ getFullName() {
150
+ return (0, names_1.getFullNameFromCoinName)(this.name);
151
+ }
152
+ /** Indicates whether the coin supports a block target */
153
+ supportsBlockTarget() {
154
+ // FIXME: the SDK does not seem to use this anywhere so it is unclear what the purpose of this method is
155
+ switch ((0, utxo_lib_1.getMainnet)(this.network)) {
156
+ case utxolib.networks.bitcoin:
157
+ case utxolib.networks.dogecoin:
158
+ return true;
159
+ default:
160
+ return false;
161
+ }
162
+ }
163
+ sweepWithSendMany() {
164
+ return true;
165
+ }
166
+ /** @deprecated */
167
+ static get validAddressTypes() {
168
+ return [...outputScripts.scriptTypes2Of3];
169
+ }
170
+ /**
171
+ * Returns the factor between the base unit and its smallest subdivison
172
+ * @return {number}
173
+ */
174
+ getBaseFactor() {
175
+ return 1e8;
176
+ }
177
+ /**
178
+ * Check if an address is valid
179
+ * @param address
180
+ * @param param
181
+ */
182
+ isValidAddress(address, param) {
183
+ if (typeof param === 'boolean' && param) {
184
+ throw new Error('deprecated');
185
+ }
186
+ const allowLightning = param?.allowLightning ?? false;
187
+ if (allowLightning) {
188
+ if (/^(02|03)[0-9a-fA-F]{64}$/.test(address)) {
189
+ return true;
190
+ }
191
+ if ((0, sdk_core_1.isBolt11Invoice)(address)) {
192
+ return true;
193
+ }
194
+ }
195
+ // By default, allow all address formats.
196
+ // At the time of writing, the only additional address format is bch cashaddr.
197
+ const anyFormat = param?.anyFormat ?? true;
198
+ try {
199
+ // Find out if the address is valid for any format. Tries all supported formats by default.
200
+ // Throws if address cannot be decoded with any format.
201
+ const [format, script] = utxolib.addressFormat.toOutputScriptAndFormat(address, this.network);
202
+ // unless anyFormat is set, only 'default' is allowed.
203
+ if (!anyFormat && format !== 'default') {
204
+ return false;
205
+ }
206
+ // make sure that address is in normal representation for given format.
207
+ return address === utxolib.addressFormat.fromOutputScriptWithFormat(script, format, this.network);
208
+ }
209
+ catch (e) {
210
+ return false;
211
+ }
212
+ }
213
+ /**
214
+ * Return boolean indicating whether input is valid public key for the coin.
215
+ *
216
+ * @param {String} pub the pub to be checked
217
+ * @returns {Boolean} is it valid?
218
+ */
219
+ isValidPub(pub) {
220
+ try {
221
+ return wasm_utxo_1.BIP32.fromBase58(pub).isNeutered();
222
+ }
223
+ catch (e) {
224
+ return false;
225
+ }
226
+ }
227
+ /**
228
+ * This is called before crafting the HTTP request to the BitGo API.
229
+ * It converts the recipient address `scriptPubKey:...` to { script: string } | { address: string }.
230
+ */
231
+ preprocessBuildParams(params) {
232
+ if (params.recipients !== undefined) {
233
+ params.recipients =
234
+ params.recipients instanceof Array
235
+ ? params?.recipients?.map((recipient) => {
236
+ const { address, ...rest } = recipient;
237
+ return { ...rest, ...(0, transaction_1.fromExtendedAddressFormat)(address) };
238
+ })
239
+ : params.recipients;
240
+ }
241
+ return params;
242
+ }
243
+ /**
244
+ * Get the latest block height
245
+ * @param reqId
246
+ */
247
+ async getLatestBlockHeight(reqId) {
248
+ if (reqId) {
249
+ this.bitgo.setRequestTracer(reqId);
250
+ }
251
+ const chainhead = await this.bitgo.get(this.url('/public/block/latest')).result();
252
+ return chainhead.height;
253
+ }
254
+ checkRecipient(recipient) {
255
+ (0, transaction_1.assertValidTransactionRecipient)(recipient);
256
+ if (!(0, transaction_1.isScriptRecipient)(recipient.address)) {
257
+ super.checkRecipient(recipient);
258
+ }
259
+ }
260
+ /**
261
+ * Run custom coin logic after a transaction prebuild has been received from BitGo
262
+ * @param prebuild
263
+ */
264
+ async postProcessPrebuild(prebuild) {
265
+ const tx = this.decodeTransactionFromPrebuild(prebuild);
266
+ if (lodash_1.default.isUndefined(prebuild.blockHeight)) {
267
+ prebuild.blockHeight = (await this.getLatestBlockHeight());
268
+ }
269
+ return lodash_1.default.extend({}, prebuild, { txHex: (0, decode_1.encodeTransaction)(tx).toString('hex') });
270
+ }
271
+ /**
272
+ * @deprecated - will be removed when we drop support for utxolib
273
+ * Determine an address' type based on its witness and redeem script presence
274
+ * @param addressDetails
275
+ */
276
+ static inferAddressType(addressDetails) {
277
+ return isChainCode(addressDetails.chain) ? scriptTypeForChain(addressDetails.chain) : null;
278
+ }
279
+ createTransactionFromHex(hex) {
280
+ return utxolib.bitgo.createTransactionFromHex(hex, this.network, this.amountType);
281
+ }
282
+ decodeTransaction(input, decodeWith = this.defaultSdkBackend) {
283
+ if (typeof input === 'string') {
284
+ const buffer = (0, decode_1.stringToBufferTryFormats)(input, ['hex', 'base64']);
285
+ return this.decodeTransaction(buffer, decodeWith);
286
+ }
287
+ if (utxolib.bitgo.isPsbt(input)) {
288
+ if (!this.supportedTxFormats.psbt) {
289
+ throw new ErrorDeprecatedTxFormat('psbt');
290
+ }
291
+ return (0, decode_1.decodePsbtWith)(input, this.name, decodeWith);
292
+ }
293
+ else {
294
+ // Legacy format transactions are deprecated. This will be an unconditional error in the future.
295
+ if (!this.supportedTxFormats.legacy) {
296
+ throw new ErrorDeprecatedTxFormat('legacy');
297
+ }
298
+ if (decodeWith !== 'utxolib') {
299
+ console.error('received decodeWith hint %s, ignoring for legacy transaction', decodeWith);
300
+ }
301
+ return utxolib.bitgo.createTransactionFromBuffer(input, this.network, {
302
+ amountType: this.amountType,
303
+ });
304
+ }
305
+ }
306
+ decodeTransactionAsPsbt(input) {
307
+ const decoded = this.decodeTransaction(input);
308
+ if (decoded instanceof wasm_utxo_1.fixedScriptWallet.BitGoPsbt || decoded instanceof utxolib.bitgo.UtxoPsbt) {
309
+ return decoded;
310
+ }
311
+ throw new Error('expected psbt but got transaction');
312
+ }
313
+ decodeTransactionFromPrebuild(prebuild) {
314
+ const string = prebuild.txHex ?? prebuild.txBase64;
315
+ if (!string) {
316
+ throw new Error('missing required txHex or txBase64 property');
317
+ }
318
+ let { decodeWith } = prebuild;
319
+ if (decodeWith !== undefined) {
320
+ if (typeof decodeWith !== 'string' || !(0, types_1.isSdkBackend)(decodeWith)) {
321
+ console.error('decodeWith %s is not a valid value, using default', decodeWith);
322
+ decodeWith = undefined;
323
+ }
324
+ }
325
+ return this.decodeTransaction(string, decodeWith);
326
+ }
327
+ /**
328
+ * Extract and fill transaction details such as internal/change spend, external spend (explicit vs. implicit), etc.
329
+ * @param params
330
+ * @returns {*}
331
+ */
332
+ async parseTransaction(params) {
333
+ return (0, transaction_1.parseTransaction)(this, params);
334
+ }
335
+ /**
336
+ * @deprecated - use function verifyUserPublicKey instead
337
+ */
338
+ verifyUserPublicKey(params) {
339
+ return (0, verifyKey_1.verifyUserPublicKey)(this.bitgo, params);
340
+ }
341
+ /**
342
+ * @deprecated - use function verifyKeySignature instead
343
+ */
344
+ verifyKeySignature(params) {
345
+ return (0, verifyKey_1.verifyKeySignature)(params);
346
+ }
347
+ /**
348
+ * Verify that a transaction prebuild complies with the original intention
349
+ *
350
+ * @param params
351
+ * @param params.txParams params object passed to send
352
+ * @param params.txPrebuild prebuild object returned by server
353
+ * @param params.txPrebuild.txHex prebuilt transaction's txHex form
354
+ * @param params.wallet Wallet object to obtain keys to verify against
355
+ * @param params.verification Object specifying some verification parameters
356
+ * @param params.verification.disableNetworking Disallow fetching any data from the internet for verification purposes
357
+ * @param params.verification.keychains Pass keychains manually rather than fetching them by id
358
+ * @param params.verification.addresses Address details to pass in for out-of-band verification
359
+ * @returns {boolean} True if verification passes
360
+ * @throws {TxIntentMismatchError} if transaction validation fails
361
+ * @throws {TxIntentMismatchRecipientError} if transaction recipients don't match user intent
362
+ */
363
+ async verifyTransaction(params) {
364
+ try {
365
+ return await (0, transaction_1.verifyTransaction)(this, this.bitgo, params);
366
+ }
367
+ catch (error) {
368
+ if (error instanceof verifyTransaction_1.AggregateValidationError) {
369
+ const txExplanation = await sdk_core_1.TxIntentMismatchError.tryGetTxExplanation(this, params.txPrebuild);
370
+ throw convertValidationErrorToTxIntentMismatch(error, params.reqId, params.txParams, params.txPrebuild.txHex, txExplanation);
371
+ }
372
+ throw error;
373
+ }
374
+ }
375
+ /**
376
+ * Make sure an address is valid and throw an error if it's not.
377
+ * @param params.address The address string on the network
378
+ * @param params.addressType
379
+ * @param params.keychains Keychain objects with xpubs
380
+ * @param params.coinSpecific Coin-specific details for the address such as a witness script
381
+ * @param params.chain Derivation chain
382
+ * @param params.index Derivation index
383
+ * @throws {InvalidAddressError}
384
+ * @throws {InvalidAddressDerivationPropertyError}
385
+ * @throws {UnexpectedAddressError}
386
+ */
387
+ async isWalletAddress(params, wallet) {
388
+ const { address, keychains, chain, index } = params;
389
+ if (!this.isValidAddress(address)) {
390
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
391
+ }
392
+ if (wallet && (0, descriptor_1.isDescriptorWallet)(wallet)) {
393
+ if (!keychains) {
394
+ throw new Error('missing required param keychains');
395
+ }
396
+ if (!(0, sdk_core_1.isTriple)(keychains)) {
397
+ throw new Error('keychains must be a triple');
398
+ }
399
+ (0, descriptor_1.assertDescriptorWalletAddress)(this.name, params, (0, descriptor_1.getDescriptorMapFromWallet)(wallet, (0, keychains_1.toBip32Triple)(keychains), (0, validatePolicy_1.getPolicyForEnv)(this.bitgo.env)));
400
+ return true;
401
+ }
402
+ if ((lodash_1.default.isUndefined(chain) && lodash_1.default.isUndefined(index)) || !(lodash_1.default.isFinite(chain) && lodash_1.default.isFinite(index))) {
403
+ throw new sdk_core_1.InvalidAddressDerivationPropertyError(`address validation failure: invalid chain (${chain}) or index (${index})`);
404
+ }
405
+ if (!keychains) {
406
+ throw new Error('missing required param keychains');
407
+ }
408
+ (0, fixedScript_1.assertFixedScriptWalletAddress)(this.name, {
409
+ address,
410
+ keychains,
411
+ format: params.format ?? 'base58',
412
+ chain,
413
+ index,
414
+ });
415
+ return true;
416
+ }
417
+ /**
418
+ * @param addressType
419
+ * @returns true iff coin supports spending from unspentType
420
+ */
421
+ supportsAddressType(addressType) {
422
+ return utxolib.bitgo.outputScripts.isSupportedScriptType(this.network, addressType);
423
+ }
424
+ /** inherited doc */
425
+ getDefaultMultisigType() {
426
+ return sdk_core_1.multisigTypes.onchain;
427
+ }
428
+ /**
429
+ * @param chain
430
+ * @return true iff coin supports spending from chain
431
+ */
432
+ supportsAddressChain(chain) {
433
+ return isChainCode(chain) && this.supportsAddressType(utxolib.bitgo.scriptTypeForChain(chain));
434
+ }
435
+ keyIdsForSigning() {
436
+ return [sdk_core_1.KeyIndices.USER, sdk_core_1.KeyIndices.BACKUP, sdk_core_1.KeyIndices.BITGO];
437
+ }
438
+ async getMusig2Nonces(psbt, walletId) {
439
+ const buffer = (0, decode_1.encodeTransaction)(psbt);
440
+ const response = await this.bitgo
441
+ .post(this.url('/wallet/' + walletId + '/tx/signpsbt'))
442
+ .send({ psbt: buffer.toString('hex') })
443
+ .result();
444
+ if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
445
+ return (0, decode_1.decodePsbtWith)(response.psbt, this.name, 'utxolib');
446
+ }
447
+ else {
448
+ return (0, decode_1.decodePsbtWith)(response.psbt, this.name, 'wasm-utxo');
449
+ }
450
+ }
451
+ /**
452
+ * @deprecated Use getMusig2Nonces instead
453
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
454
+ * @param psbtHex all MuSig2 inputs should contain user MuSig2 nonce
455
+ * @param walletId
456
+ */
457
+ async signPsbt(psbtHex, walletId) {
458
+ const psbt = await this.getMusig2Nonces(this.decodeTransactionAsPsbt(psbtHex), walletId);
459
+ return { psbt: (0, decode_1.encodeTransaction)(psbt).toString('hex') };
460
+ }
461
+ /**
462
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs from OVC.
463
+ * @param ovcJson JSON object provided by OVC with fields psbtHex and walletId
464
+ */
465
+ async signPsbtFromOVC(ovcJson) {
466
+ (0, assert_1.default)(ovcJson['psbtHex'], 'ovcJson must contain psbtHex');
467
+ (0, assert_1.default)(ovcJson['walletId'], 'ovcJson must contain walletId');
468
+ const hex = ovcJson['psbtHex'];
469
+ const walletId = ovcJson['walletId'];
470
+ const psbt = await this.getMusig2Nonces(this.decodeTransactionAsPsbt(hex), walletId);
471
+ return lodash_1.default.extend(ovcJson, { txHex: (0, decode_1.encodeTransaction)(psbt).toString('hex') });
472
+ }
473
+ /**
474
+ * Assemble keychain and half-sign prebuilt transaction
475
+ * @param params - {@see SignTransactionOptions}
476
+ * @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
477
+ */
478
+ async signTransaction(params) {
479
+ return (0, signTransaction_1.signTransaction)(this, this.bitgo, params);
480
+ }
481
+ /**
482
+ * Sign a transaction with a custom signing function. Example use case is express external signer
483
+ * @param customSigningFunction custom signing function that returns a single signed transaction
484
+ * @param signTransactionParams parameters for custom signing function. Includes txPrebuild and pubs
485
+ *
486
+ * @returns signed transaction as hex string
487
+ */
488
+ async signWithCustomSigningFunction(customSigningFunction, signTransactionParams) {
489
+ const txHex = signTransactionParams.txPrebuild.txHex;
490
+ (0, assert_1.default)(txHex, 'missing txHex parameter');
491
+ const tx = this.decodeTransaction(txHex);
492
+ const isTxWithKeyPathSpendInput = hasKeyPathSpendInput(tx, signTransactionParams.pubs, this.name);
493
+ if (!isTxWithKeyPathSpendInput) {
494
+ return await customSigningFunction({ ...signTransactionParams, coin: this });
495
+ }
496
+ const getTxHex = (v) => {
497
+ if ('txHex' in v) {
498
+ return v.txHex;
499
+ }
500
+ throw new Error('txHex not found in signTransaction result');
501
+ };
502
+ const signerNonceTx = await customSigningFunction({
503
+ ...signTransactionParams,
504
+ signingStep: 'signerNonce',
505
+ coin: this,
506
+ });
507
+ const { pubs } = signTransactionParams;
508
+ (0, assert_1.default)(pubs === undefined || (0, sdk_core_1.isTriple)(pubs));
509
+ const cosignerNonceTx = await this.signTransaction({
510
+ ...signTransactionParams,
511
+ pubs,
512
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(signerNonceTx) },
513
+ signingStep: 'cosignerNonce',
514
+ });
515
+ return await customSigningFunction({
516
+ ...signTransactionParams,
517
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(cosignerNonceTx) },
518
+ signingStep: 'signerSignature',
519
+ coin: this,
520
+ });
521
+ }
522
+ /**
523
+ * @param unspent
524
+ * @returns {boolean}
525
+ */
526
+ isBitGoTaintedUnspent(unspent) {
527
+ return (0, replayProtection_1.isReplayProtectionUnspent)(unspent, this.name);
528
+ }
529
+ /**
530
+ * Decompose a raw psbt/transaction into useful information, such as the total amounts,
531
+ * change amounts, and transaction outputs.
532
+ * @param params
533
+ */
534
+ async explainTransaction(params, wallet) {
535
+ if (!params.pubs) {
536
+ // if no pubs are provided, opportunistically fetch the keychains from the wallet
537
+ if (wallet) {
538
+ const keychains = await (0, keychains_1.fetchKeychains)(this, wallet);
539
+ params.pubs = (0, keychains_1.toBip32Triple)(keychains).map((k) => k.neutered().toBase58());
540
+ }
541
+ }
542
+ return (0, transaction_1.explainTx)(this.decodeTransactionFromPrebuild(params), params, this.name);
543
+ }
544
+ /**
545
+ * @deprecated - use {@see backupKeyRecovery}
546
+ * Builds a funds recovery transaction without BitGo
547
+ * @param params - {@see backupKeyRecovery}
548
+ */
549
+ async recover(params) {
550
+ return (0, recovery_1.backupKeyRecovery)(this, this.bitgo, params);
551
+ }
552
+ async recoverV1(params) {
553
+ return (0, recovery_1.v1BackupKeyRecovery)(this, this.bitgo, params);
554
+ }
555
+ async sweepV1(params) {
556
+ return (0, recovery_1.v1Sweep)(this, this.bitgo, params);
557
+ }
558
+ /**
559
+ * Recover coin that was sent to wrong chain
560
+ * @param params
561
+ * @param params.txid The txid of the faulty transaction
562
+ * @param params.recoveryAddress address to send recovered funds to
563
+ * @param params.wallet the wallet that received the funds
564
+ * @param params.recoveryCoin the coin type of the wallet that received the funds
565
+ * @param params.signed return a half-signed transaction (default=true)
566
+ * @param params.walletPassphrase the wallet passphrase
567
+ * @param params.xprv the unencrypted xprv (used instead of wallet passphrase)
568
+ * @param params.apiKey for utxo coins other than [BTC,TBTC] this is a Block Chair api key
569
+ * @returns {*}
570
+ */
571
+ async recoverFromWrongChain(params) {
572
+ const { txid, recoveryAddress, wallet, walletPassphrase, xprv, apiKey } = params;
573
+ // params.recoveryCoin used to be params.coin, backwards compatibility
574
+ const recoveryCoin = params.coin || params.recoveryCoin;
575
+ if (!recoveryCoin) {
576
+ throw new Error('missing required object recoveryCoin');
577
+ }
578
+ // signed should default to true, and only be disabled if explicitly set to false (not undefined)
579
+ const signed = params.signed !== false;
580
+ const sourceCoinFamily = this.getFamily();
581
+ const recoveryCoinFamily = recoveryCoin.getFamily();
582
+ const supportedRecoveryCoins = config_1.supportedCrossChainRecoveries[sourceCoinFamily];
583
+ if (lodash_1.default.isUndefined(supportedRecoveryCoins) || !supportedRecoveryCoins.includes(recoveryCoinFamily)) {
584
+ throw new Error(`Recovery of ${sourceCoinFamily} balances from ${recoveryCoinFamily} wallets is not supported.`);
585
+ }
586
+ return await (0, recovery_1.recoverCrossChain)(this.bitgo, {
587
+ sourceCoin: this,
588
+ recoveryCoin,
589
+ walletId: wallet,
590
+ txid,
591
+ recoveryAddress,
592
+ walletPassphrase: signed ? walletPassphrase : undefined,
593
+ xprv: signed ? xprv : undefined,
594
+ apiKey,
595
+ });
596
+ }
597
+ /**
598
+ * Generate bip32 key pair
599
+ *
600
+ * @param seed
601
+ * @returns {Object} object with generated pub and prv
602
+ */
603
+ generateKeyPair(seed) {
604
+ if (!seed) {
605
+ // An extended private key has both a normal 256 bit private key and a 256
606
+ // bit chain code, both of which must be random. 512 bits is therefore the
607
+ // maximum entropy and gives us maximum security against cracking.
608
+ seed = (0, crypto_1.randomBytes)(512 / 8);
609
+ }
610
+ const extendedKey = wasm_utxo_1.BIP32.fromSeed(seed);
611
+ return {
612
+ pub: extendedKey.neutered().toBase58(),
613
+ prv: extendedKey.toBase58(),
614
+ };
615
+ }
616
+ /**
617
+ * Determines the default transaction format based on wallet properties and network
618
+ * @param wallet - The wallet to check
619
+ * @param requestedFormat - Optional explicitly requested format
620
+ * @returns The transaction format to use, or undefined if no default applies
621
+ */
622
+ getDefaultTxFormat(wallet, requestedFormat) {
623
+ if (requestedFormat === 'legacy') {
624
+ return 'psbt-lite';
625
+ }
626
+ return requestedFormat ?? 'psbt-lite';
627
+ }
628
+ async getExtraPrebuildParams(buildParams) {
629
+ const requestedFormat = buildParams.txFormat;
630
+ const txFormat = this.getDefaultTxFormat(buildParams.wallet, requestedFormat);
631
+ let changeAddressType = buildParams.changeAddressType;
632
+ // if the addressType is not specified, we need to default to p2trMusig2 for testnet hot wallets for staged rollout of p2trMusig2
633
+ if (buildParams.addressType === undefined && // addressType is deprecated and replaced by `changeAddress`
634
+ buildParams.changeAddressType === undefined &&
635
+ buildParams.changeAddress === undefined &&
636
+ buildParams.wallet.type() === 'hot') {
637
+ changeAddressType = ['p2trMusig2', 'p2wsh', 'p2shP2wsh', 'p2sh', 'p2tr'];
638
+ }
639
+ // getHalfSignedLegacyFormat() only supports p2ms-based types (p2sh, p2shP2wsh, p2wsh).
640
+ // Filter change outputs and restrict input selection to these types.
641
+ const legacyCompatibleTypes = ['p2sh', 'p2shP2wsh', 'p2wsh'];
642
+ let allowedInputScriptTypes;
643
+ if (requestedFormat === 'legacy') {
644
+ allowedInputScriptTypes = legacyCompatibleTypes;
645
+ if (Array.isArray(changeAddressType)) {
646
+ changeAddressType = changeAddressType.filter((t) => legacyCompatibleTypes.includes(t));
647
+ }
648
+ else if (changeAddressType !== undefined && !legacyCompatibleTypes.includes(changeAddressType)) {
649
+ changeAddressType = legacyCompatibleTypes;
650
+ }
651
+ }
652
+ return {
653
+ txFormat,
654
+ changeAddressType,
655
+ allowedInputScriptTypes,
656
+ };
657
+ }
658
+ preCreateBitGo(params) {
659
+ return;
660
+ }
661
+ async presignTransaction(params) {
662
+ if (params.walletData && (0, wallet_1.isUtxoWalletData)(params.walletData) && (0, descriptorWallet_1.isDescriptorWalletData)(params.walletData)) {
663
+ return params;
664
+ }
665
+ const returnLegacyFormat = params.txFormat === 'legacy';
666
+ // In the case that we have a 'psbt-lite' transaction format, we want to indicate in signing to not fail
667
+ const txHex = (params.txHex ?? params.txPrebuild?.txHex);
668
+ if (txHex &&
669
+ utxolib.bitgo.isPsbt(txHex) &&
670
+ utxolib.bitgo.isPsbtLite(utxolib.bitgo.createPsbtFromHex(txHex, this.network)) &&
671
+ params.allowNonSegwitSigningWithoutPrevTx === undefined) {
672
+ return { ...params, allowNonSegwitSigningWithoutPrevTx: true, returnLegacyFormat };
673
+ }
674
+ return { ...params, returnLegacyFormat };
675
+ }
676
+ async supplementGenerateWallet(walletParams, keychains) {
677
+ return walletParams;
678
+ }
679
+ transactionDataAllowed() {
680
+ return false;
681
+ }
682
+ valuelessTransferAllowed() {
683
+ return false;
684
+ }
685
+ getRecoveryProvider(apiToken) {
686
+ return (0, recovery_1.forCoin)(this.getChain(), apiToken);
687
+ }
688
+ /** @inheritDoc */
689
+ auditDecryptedKey({ multiSigType, publicKey, prv, }) {
690
+ if (multiSigType === 'tss') {
691
+ throw new Error('tss auditing is not supported for this coin');
692
+ }
693
+ if (!(0, sdk_core_1.isValidPrv)(prv) && !(0, sdk_core_1.isValidXprv)(prv)) {
694
+ throw new Error('invalid private key');
695
+ }
696
+ if (publicKey) {
697
+ const genPubKey = wasm_utxo_1.BIP32.fromBase58(prv).neutered().toBase58();
698
+ if (genPubKey !== publicKey) {
699
+ throw new Error('public key does not match private key');
700
+ }
701
+ }
702
+ }
703
+ }
704
+ exports.AbstractUtxoCoin = AbstractUtxoCoin;
705
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBcUM7QUFFckMsb0RBQXVCO0FBQ3ZCLDhEQUFnRDtBQUNoRCxnREFBNEQ7QUFDNUQsbURBQXlEO0FBQ3pELG1EQXFDOEI7QUFFOUIseUNBWW9CO0FBQ3BCLGlGQUFtSDtBQUNuSCxxQ0FBeUQ7QUFDekQsK0NBUXVCO0FBR3ZCLGtGQUlvRDtBQUNwRCw2Q0FBNkc7QUFDN0csbUNBUWlCO0FBQ2pCLHVEQUF1RTtBQUN2RSwrQ0FBa0Y7QUFDbEYsaURBQW1HO0FBQ25HLDJDQUEwRTtBQUMxRSwyQ0FBc0U7QUFDdEUsZ0VBQThEO0FBQzlELG1FQUFnRTtBQUNoRSxxQ0FBd0Q7QUFDeEQsb0VBQXVFO0FBa0J2RSxNQUFhLHVCQUF3QixTQUFRLEtBQUs7SUFDaEQsWUFBWSxRQUFrQjtRQUM1QixLQUFLLENBQUMsNEJBQTRCLFFBQVEsOERBQThELENBQUMsQ0FBQztJQUM1RyxDQUFDO0NBQ0Y7QUFKRCwwREFJQztBQTJCRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxHQUFHLGdCQUFLLENBQUM7QUFFakU7OztHQUdHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsRUFBK0IsRUFDL0IsSUFBMEIsRUFDMUIsUUFBc0I7SUFFdEIsSUFBSSxFQUFFLFlBQVksZ0JBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxPQUFPLGdCQUFLLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksRUFBRSxZQUFZLDZCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlDLElBQUEsZ0JBQU0sRUFBQyxJQUFJLElBQUks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QjtRQUN0QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFpQjtRQUNuQyxPQUFPLElBQUEsa0JBQU8sRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxFQUNoQixZQUFZLEVBQ1osU0FBUyxFQUNULEdBQUcsR0FLSjtRQUNDLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUEscUJBQVUsRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsc0JBQVcsRUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sU0FBUyxHQUFHLGlCQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUExdUJELDRDQTB1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IEJJUDMyLCBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgYml0Z28sIGdldE1haW5uZXQgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQge1xuICBBZGRyZXNzQ29pblNwZWNpZmljLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBDcmVhdGVBZGRyZXNzRm9ybWF0LFxuICBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyxcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgSUJhc2VDb2luLFxuICBpc0JvbHQxMUludm9pY2UsXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBpc1RyaXBsZSxcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW5zVHJpcGxldCxcbiAgS2V5SW5kaWNlcyxcbiAgTWlzbWF0Y2hlZFJlY2lwaWVudCxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWNyZWF0ZUJpdEdvT3B0aW9ucyxcbiAgUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUmVxdWVzdFRyYWNlcixcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFR4SW50ZW50TWlzbWF0Y2hFcnJvcixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25QYXJhbXMgYXMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zLFxuICBUcmFuc2FjdGlvblByZWJ1aWxkIGFzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBUcmlwbGUsXG4gIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcixcbiAgVmVyaWZpY2F0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMgYXMgQmFzZVZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0LFxuICBpc1ZhbGlkUHJ2LFxuICBpc1ZhbGlkWHBydixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkLFxuICBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZCxcbiAgZm9yQ29pbixcbiAgcmVjb3ZlckNyb3NzQ2hhaW4sXG4gIFJlY292ZXJQYXJhbXMsXG4gIFJlY292ZXJ5UHJvdmlkZXIsXG4gIHYxQmFja3VwS2V5UmVjb3ZlcnksXG4gIFYxUmVjb3ZlclBhcmFtcyxcbiAgdjFTd2VlcCxcbiAgVjFTd2VlcFBhcmFtcyxcbn0gZnJvbSAnLi9yZWNvdmVyeSc7XG5pbXBvcnQgeyBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cywgaXNSZXBsYXlQcm90ZWN0aW9uVW5zcGVudCB9IGZyb20gJy4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcmVwbGF5UHJvdGVjdGlvbic7XG5pbXBvcnQgeyBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7XG4gIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIERlY29kZWRUcmFuc2FjdGlvbixcbiAgZXhwbGFpblR4LFxuICBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0LFxuICBpc1NjcmlwdFJlY2lwaWVudCxcbiAgcGFyc2VUcmFuc2FjdGlvbixcbiAgdmVyaWZ5VHJhbnNhY3Rpb24sXG59IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9leHBsYWluVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgTXVzaWcyUGFydGljaXBhbnQgfSBmcm9tICcuL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L211c2lnMic7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIEVycm9yTWlzc2luZ091dHB1dHMsXG4gIEVycm9ySW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG59IGZyb20gJy4vdHJhbnNhY3Rpb24vZGVzY3JpcHRvci92ZXJpZnlUcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBhc3NlcnREZXNjcmlwdG9yV2FsbGV0QWRkcmVzcywgZ2V0RGVzY3JpcHRvck1hcEZyb21XYWxsZXQsIGlzRGVzY3JpcHRvcldhbGxldCB9IGZyb20gJy4vZGVzY3JpcHRvcic7XG5pbXBvcnQge1xuICBnZXRGdWxsTmFtZUZyb21Db2luTmFtZSxcbiAgZ2V0TWFpbm5ldENvaW5OYW1lLFxuICBnZXROZXR3b3JrRnJvbUNvaW5OYW1lLFxuICBpc01haW5uZXRDb2luLFxuICBpc1V0eG9Db2luTmFtZU1haW5uZXQsXG4gIFV0eG9Db2luTmFtZSxcbiAgVXR4b0NvaW5OYW1lTWFpbm5ldCxcbn0gZnJvbSAnLi9uYW1lcyc7XG5pbXBvcnQgeyBhc3NlcnRGaXhlZFNjcmlwdFdhbGxldEFkZHJlc3MgfSBmcm9tICcuL2FkZHJlc3MvZml4ZWRTY3JpcHQnO1xuaW1wb3J0IHsgaXNTZGtCYWNrZW5kLCBQYXJzZWRUcmFuc2FjdGlvbiwgU2RrQmFja2VuZCB9IGZyb20gJy4vdHJhbnNhY3Rpb24vdHlwZXMnO1xuaW1wb3J0IHsgZGVjb2RlUHNidFdpdGgsIGVuY29kZVRyYW5zYWN0aW9uLCBzdHJpbmdUb0J1ZmZlclRyeUZvcm1hdHMgfSBmcm9tICcuL3RyYW5zYWN0aW9uL2RlY29kZSc7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgdG9CaXAzMlRyaXBsZSwgVXR4b0tleWNoYWluIH0gZnJvbSAnLi9rZXljaGFpbnMnO1xuaW1wb3J0IHsgdmVyaWZ5S2V5U2lnbmF0dXJlLCB2ZXJpZnlVc2VyUHVibGljS2V5IH0gZnJvbSAnLi92ZXJpZnlLZXknO1xuaW1wb3J0IHsgZ2V0UG9saWN5Rm9yRW52IH0gZnJvbSAnLi9kZXNjcmlwdG9yL3ZhbGlkYXRlUG9saWN5JztcbmltcG9ydCB7IHNpZ25UcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vc2lnblRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGlzVXR4b1dhbGxldERhdGEsIFV0eG9XYWxsZXQgfSBmcm9tICcuL3dhbGxldCc7XG5pbXBvcnQgeyBpc0Rlc2NyaXB0b3JXYWxsZXREYXRhIH0gZnJvbSAnLi9kZXNjcmlwdG9yL2Rlc2NyaXB0b3JXYWxsZXQnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi91bnNwZW50JztcblxuaW1wb3J0IFNjcmlwdFR5cGUyT2YzID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGUyT2YzO1xuXG5leHBvcnQgdHlwZSBUeEZvcm1hdCA9XG4gIC8vIFRoaXMgaXMgYSBsZWdhY3kgdHJhbnNhY3Rpb24gZm9ybWF0IGJhc2VkIGFyb3VuZCB0aGUgYml0Y29pbmpzLWxpYiBzZXJpYWxpemF0aW9uIG9mIHVuc2lnbmVkIHRyYW5zYWN0aW9uc1xuICAvLyBkb2VzIG5vdCBpbmNsdWRlIHByZXZPdXQgZGF0YSBhbmQgaXMgYSBiaXQgcGFpbmZ1bCB0byB3b3JrIHdpdGhcbiAgLy8gZ29pbmcgdG8gYmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBwc2J0XG4gIC8vIEBkZXByZWNhdGVkXG4gIHwgJ2xlZ2FjeSdcbiAgLy8gVGhpcyBpcyB0aGUgc3RhbmRhcmQgcHNidCBmb3JtYXQsIGluY2x1ZGluZyB0aGUgZnVsbCBwcmV2VHggZGF0YSBmb3IgbGVnYWN5IHRyYW5zYWN0aW9ucy5cbiAgLy8gVGhpcyB3aWxsIHJlbWFpbiBzdXBwb3J0ZWQgYnV0IGlzIG5vdCB0aGUgZGVmYXVsdCwgc2luY2UgdGhlIGRhdGEgc2l6ZXMgY2FuIGJlY29tZSBwcm9oaWJpdGl2ZWx5IGxhcmdlLlxuICB8ICdwc2J0J1xuICAvLyBUaGlzIGlzIGEgbm9uc3RhbmRhcmQgcHNidCB2ZXJzaW9uIHdoZXJlIGxlZ2FjeSBpbnB1dHMgYXJlIHNlcmlhbGl6ZWQgYXMgaWYgdGhleSB3ZXJlIHNlZ3dpdCBpbnB1dHMuXG4gIC8vIFdoaWxlIHRoaXMgcHJldmVudHMgdXMgdG8gZnVsbHkgdmVyaWZ5IHRoZSB0cmFuc2FjdGlvbiBmZWUsIHdlIGhhdmUgb3RoZXIgY2hlY2tzIGluIHBsYWNlIHRvIGVuc3VyZSB0aGUgZmVlIGlzIHdpdGhpbiBib3VuZHMuXG4gIHwgJ3BzYnQtbGl0ZSc7XG5cbmV4cG9ydCBjbGFzcyBFcnJvckRlcHJlY2F0ZWRUeEZvcm1hdCBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IodHhGb3JtYXQ6IFR4Rm9ybWF0KSB7XG4gICAgc3VwZXIoYFNESyBzdXBwb3J0IGZvciB0eEZvcm1hdD0ke3R4Rm9ybWF0fSBpcyBkZXByZWNhdGVkIG9uIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSB1c2UgcHNidCBpbnN0ZWFkLmApO1xuICB9XG59XG5cbnR5cGUgVXR4b0N1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHtcbiAgKHBhcmFtczoge1xuICAgIGNvaW46IElCYXNlQ29pbjtcbiAgICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICAgIHB1YnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBzaWduaW5nU3RlcCBmbGFnIGJlY29tZXMgYXBwbGljYWJsZSB3aGVuIGJvdGggb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gICAgICogMSkgV2hlbiB0aGUgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgaXMgYWN0aXZhdGVkXG4gICAgICogMikgV2hlbiB0aGUgUFNCVCBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dC5cbiAgICAgKlxuICAgICAqIFRoZSBzaWduaW5nIHByb2Nlc3Mgb2YgYSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0IGlzIGEgNC1zdGVwIHNlcXVlbmNlOlxuICAgICAqIGkpIHVzZXIgbm9uY2UgZ2VuZXJhdGlvbiAtIHNpZ25lck5vbmNlIC0gdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBleHRlcm5hbCBleHByZXNzIHNpZ25lciBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpaSkgYml0Z28gbm9uY2UgZ2VuZXJhdGlvbiAtIGNvc2lnbmVyTm9uY2UgLSB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgb25seSBjYWxsIHRvIGxvY2FsIHNpZ25UcmFuc2FjdGlvblxuICAgICAqIGlpaSkgdXNlciBzaWduYXR1cmUgLSBzaWduZXJTaWduYXR1cmUgLSB0aGlzIGlzIHRoZSBzZWNvbmQgY2FsbCB0byBleHRlcm5hbCBleHByZXNzIHNpZ25lciBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpdikgYml0Z28gc2lnbmF0dXJlIC0gbm90IGluIHNpZ25UcmFuc2FjdGlvbiBtZXRob2TigJlzIHNjb3BlXG4gICAgICpcbiAgICAgKiBJbiB0aGUgYWJzZW5jZSBvZiB0aGlzIGZsYWcsIHRoZSBhZm9yZW1lbnRpb25lZCBmaXJzdCB0aHJlZSBzZXF1ZW5jZSBpcyBleGVjdXRlZCBpbiBhIHNpbmdsZSBzaWduVHJhbnNhY3Rpb24gY2FsbC5cbiAgICAgKlxuICAgICAqIE5PVEU6IFdlIG1ha2UgYSBzdHJvbmcgYXNzdW1wdGlvbiB0aGF0IHRoZSBleHRlcm5hbCBleHByZXNzIHNpZ25lciBhbmQgaXRzIGNhbGxlciB1c2VzIHN0aWNreSBzZXNzaW9ucyxcbiAgICAgKiBzaW5jZSBQU0JUcyBhcmUgY2FjaGVkIGluIHN0ZXAgMSB0byBiZSB1c2VkIGluIHN0ZXAgMyBmb3IgTXVTaWcyIHVzZXIgc2VjdXJlIG5vbmNlIGFjY2Vzcy5cbiAgICAgKi9cbiAgICBzaWduaW5nU3RlcD86ICdzaWduZXJOb25jZScgfCAnc2lnbmVyU2lnbmF0dXJlJyB8ICdjb3NpZ25lck5vbmNlJztcbiAgfSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+O1xufTtcblxuY29uc3QgeyBpc0NoYWluQ29kZSwgc2NyaXB0VHlwZUZvckNoYWluLCBvdXRwdXRTY3JpcHRzIH0gPSBiaXRnbztcblxuLyoqXG4gKiBDaGVjayBpZiBhIGRlY29kZWQgdHJhbnNhY3Rpb24gaGFzIGF0IGxlYXN0IG9uZSB0YXByb290IGtleSBwYXRoIHNwZW5kIChNdVNpZzIpIGlucHV0LlxuICogV29ya3MgZm9yIGJvdGggdXR4b2xpYiBVdHhvUHNidCBhbmQgd2FzbS11dHhvIEJpdEdvUHNidC5cbiAqL1xuZnVuY3Rpb24gaGFzS2V5UGF0aFNwZW5kSW5wdXQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIHR4OiBEZWNvZGVkVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIHB1YnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICBjb2luTmFtZTogVXR4b0NvaW5OYW1lXG4pOiBib29sZWFuIHtcbiAgaWYgKHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQpIHtcbiAgICByZXR1cm4gYml0Z28uaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCh0eCk7XG4gIH1cbiAgaWYgKHR4IGluc3RhbmNlb2YgZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0KSB7XG4gICAgYXNzZXJ0KHB1YnMgJiYgaXNUcmlwbGUocHVicyksICdwdWIgdHJpcGxlIGlzIHJlcXVpcmVkIHRvIGNoZWNrIGZvciBrZXkgcGF0aCBzcGVuZCBpbnB1dHMgaW4gd2FzbS11dHhvIFBTQlQnKTtcbiAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLmZyb21YcHVicyhwdWJzKTtcbiAgICBjb25zdCByZXBsYXlQcm90ZWN0aW9uID0geyBwdWJsaWNLZXlzOiBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyhjb2luTmFtZSkgfTtcbiAgICBjb25zdCBwYXJzZWQgPSB0eC5wYXJzZVRyYW5zYWN0aW9uV2l0aFdhbGxldEtleXMocm9vdFdhbGxldEtleXMsIHsgcmVwbGF5UHJvdGVjdGlvbiB9KTtcbiAgICByZXR1cm4gcGFyc2VkLmlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzJLZXlQYXRoJyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvbnZlcnQgVmFsaWRhdGlvbkVycm9yIHRvIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciB3aXRoIHN0cnVjdHVyZWQgZGF0YVxuICpcbiAqIFRoaXMgcHJlc2VydmVzIHRoZSBzdHJ1Y3R1cmVkIGVycm9yIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIFZhbGlkYXRpb25FcnJvclxuICogYnkgZXh0cmFjdGluZyB0aGUgbWlzbWF0Y2hlZCBvdXRwdXRzIGFuZCBjb252ZXJ0aW5nIHRoZW0gdG8gdGhlIHN0YW5kYXJkaXplZCBmb3JtYXQuXG4gKiBUaGUgb3JpZ2luYWwgZXJyb3IgaXMgcHJlc2VydmVkIGFzIHRoZSBgY2F1c2VgIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRWYWxpZGF0aW9uRXJyb3JUb1R4SW50ZW50TWlzbWF0Y2goXG4gIGVycm9yOiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIHJlcUlkOiBzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZCxcbiAgdHhQYXJhbXM6IEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHhFeHBsYW5hdGlvbj86IHVua25vd25cbik6IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciB7XG4gIGNvbnN0IG1pc21hdGNoZWRSZWNpcGllbnRzOiBNaXNtYXRjaGVkUmVjaXBpZW50W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvci5lcnJvcnMpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3JNaXNzaW5nT3V0cHV0cykge1xuICAgICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMucHVzaChcbiAgICAgICAgLi4uZXJyLm1pc3NpbmdPdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSB7XG4gICAgICBtaXNtYXRjaGVkUmVjaXBpZW50cy5wdXNoKFxuICAgICAgICAuLi5lcnIuaW1wbGljaXRFeHRlcm5hbE91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIH0pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0eEludGVudEVycm9yID0gbmV3IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcihcbiAgICBlcnJvci5tZXNzYWdlLFxuICAgIHJlcUlkLFxuICAgIFt0eFBhcmFtc10sXG4gICAgdHhIZXgsXG4gICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMsXG4gICAgdHhFeHBsYW5hdGlvblxuICApO1xuICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc3RydWN0dXJlZCBlcnJvciBhcyB0aGUgY2F1c2UgZm9yIGRlYnVnZ2luZ1xuICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yL2NhdXNlXG4gICh0eEludGVudEVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IEVycm9yIH0pLmNhdXNlID0gZXJyb3I7XG4gIHJldHVybiB0eEludGVudEVycm9yO1xufVxuXG5leHBvcnQgdHlwZSB7IERlY29kZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBSb290V2FsbGV0S2V5cyA9IGJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuXG5leHBvcnQgdHlwZSBVdHhvQ29pblNwZWNpZmljID0gQWRkcmVzc0NvaW5TcGVjaWZpYyB8IERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFkZHJlc3NPcHRpb25zPFRDb2luU3BlY2lmaWMgZXh0ZW5kcyBVdHhvQ29pblNwZWNpZmljPiBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluPzogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luU3BlY2lmaWM/OiBUQ29pblNwZWNpZmljO1xufVxuXG5leHBvcnQgdHlwZSBCaXAzMjJNZXNzYWdlID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqIE1hcHMgdHhpZCB0byB0eGhleC4gUmVxdWlyZWQgZm9yIG9mZmxpbmUgc2lnbmluZy4gKi9cbiAgdHhIZXhlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNoYW5nZUFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuICAvKiogcHNidCBkb2VzIG5vdCByZXF1aXJlIHVuc3BlbnRzLiAqL1xuICB1bnNwZW50cz86IFVuc3BlbnQ8VE51bWJlcj5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBmZWVJbmZvPzogc3RyaW5nO1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gIGN1c3RvbUNoYW5nZVhwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gIGRlY29kZVdpdGg/OiBTZGtCYWNrZW5kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlY29yYXRlZEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj5cbiAgZXh0ZW5kcyBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+IHtcbiAgY2hhbmdlSW5mbz86IHsgYWRkcmVzczogc3RyaW5nOyBjaGFpbjogbnVtYmVyOyBpbmRleDogbnVtYmVyIH1bXTtcbn1cblxuZXhwb3J0IHR5cGUgVXR4b05ldHdvcmsgPSB1dHhvbGliLk5ldHdvcms7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbiAgZGVjb2RlV2l0aD86IFNka0JhY2tlbmQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QYXJhbXMgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25QYXJhbXMge1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICBhbGxvd0V4dGVybmFsQ2hhbmdlQWRkcmVzcz86IGJvb2xlYW47XG4gIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIHJiZlR4SWRzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogVXR4b1dhbGxldDtcbiAgdmVyaWZpY2F0aW9uPzogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVGaXhlZFNjcmlwdEFkZHJlc3NPcHRpb25zIGV4dGVuZHMgR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyB7XG4gIGZvcm1hdD86IENyZWF0ZUFkZHJlc3NGb3JtYXQ7XG4gIGtleWNoYWluczoge1xuICAgIHB1Yjogc3RyaW5nO1xuICAgIGFzcEtleUlkPzogc3RyaW5nO1xuICB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljIHwgRGVzY3JpcHRvckFkZHJlc3NDb2luU3BlY2lmaWM7XG4gIGFkZHJlc3NUeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljIGV4dGVuZHMgQWRkcmVzc0NvaW5TcGVjaWZpYyB7XG4gIGRlc2NyaXB0b3JOYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0b3JDaGVja3N1bTogc3RyaW5nO1xufVxuXG50eXBlIFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zICYge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIC8qKlxuICAgICAqIHdhbGxldElkIGlzIHJlcXVpcmVkIGluIGZvbGxvd2luZyAyIHNjZW5hcmlvcy5cbiAgICAgKiAxLiBFeHRlcm5hbCBzaWduZXIgZXhwcmVzcyBtb2RlIGlzIHVzZWQuXG4gICAgICogMi4gYml0Z28gTXVTaWcyIG5vbmNlIGlzIHJlcXVlc3RlZFxuICAgICAqL1xuICAgIHdhbGxldElkPzogc3RyaW5nO1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gICAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICAgIGRlY29kZVdpdGg/OiBTZGtCYWNrZW5kO1xuICB9O1xuICAvKiogeHB1YnMgdHJpcGxlIGZvciB3YWxsZXQgKHVzZXIsIGJhY2t1cCwgYml0Z28pLiBSZXF1aXJlZCBvbmx5IHdoZW4gdHhQcmVidWlsZC50eEhleCBpcyBub3QgYSBQU0JUICovXG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbiAgLyoqIHhwdWIgZm9yIGNvc2lnbmVyIChkZWZhdWx0cyB0byBiaXRnbykgKi9cbiAgY29zaWduZXJQdWI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKiBXaGVuIGZhbHNlLCBjcmVhdGVzIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICovXG4gIGlzTGFzdFNpZ25hdHVyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhbGxvd3Mgc2lnbmluZyBhIG5vbi1zZWd3aXQgaW5wdXQgd2l0aCBhIHdpdG5lc3NVdHhvIGluc3RlYWQgcmVxdWlyaW5nIGEgcHJldmlvdXNcbiAgICogdHJhbnNhY3Rpb24gKG5vbldpdG5lc3NVdHhvKVxuICAgKi9cbiAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSBzaWduZWQgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBQU0JUIHRvIGxlZ2FjeSBmb3JtYXQgYmVmb3JlIHJldHVybmluZy5cbiAgICogU2V0IGF1dG9tYXRpY2FsbHkgYnkgcHJlc2lnblRyYW5zYWN0aW9uKCkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHR4Rm9ybWF0OiAnbGVnYWN5Jy5cbiAgICovXG4gIHJldHVybkxlZ2FjeUZvcm1hdD86IGJvb2xlYW47XG4gIHdhbGxldD86IFV0eG9XYWxsZXQ7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCBleHRyYWN0IGZpbmFsaXplZCBQU0JUIHRvIGxlZ2FjeSB0cmFuc2FjdGlvbiBmb3JtYXQuXG4gICAqIFdoZW4gZmFsc2UsIHJldHVybiBmaW5hbGl6ZWQgUFNCVC4gVXNlZnVsIGZvciB0ZXN0aW5nIHRvIGtlZXAgdHJhbnNhY3Rpb25zIGluIFBTQlQgZm9ybWF0LlxuICAgKi9cbiAgZXh0cmFjdFRyYW5zYWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZW1iZWRzIFdBU00tVVRYTyB2ZXJzaW9uIG1ldGFkYXRhIGludG8gdGhlIHNpZ25lZCBQU0JULiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgd3JpdGVTaWduZWRXaXRoPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBVdHhvQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4gJlxuICAoXG4gICAgfCB7XG4gICAgICAgIHBydjogc3RyaW5nO1xuICAgICAgICBzaWduaW5nU3RlcD86ICdzaWduZXJOb25jZScgfCAnc2lnbmVyU2lnbmF0dXJlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgc2lnbmluZ1N0ZXA6ICdjb3NpZ25lck5vbmNlJztcbiAgICAgIH1cbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNpZ0FkZHJlc3Mge1xuICBvdXRwdXRTY3JpcHQ6IEJ1ZmZlcjtcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyO1xuICB3aXRuZXNzU2NyaXB0PzogQnVmZmVyO1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9ucyB7XG4gIHR4aWQ6IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB4cHJ2Pzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBjb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgcmVjb3ZlcnlDb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgc2lnbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbjogeyBwdWI/OiBzdHJpbmcgfTtcbiAga2V5Y2hhaW5Ub1ZlcmlmeTogeyBwdWI/OiBzdHJpbmcgfTtcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW4/OiBVdHhvS2V5Y2hhaW47XG4gIGRpc2FibGVOZXR3b3JraW5nOiBib29sZWFuO1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+XG4gIGV4dGVuZHMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbiAgd2FsbGV0OiBVdHhvV2FsbGV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25Qc2J0UmVxdWVzdCB7XG4gIHBzYnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduUHNidFJlc3BvbnNlIHtcbiAgcHNidDogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVdHhvQ29pblxuICBleHRlbmRzIEJhc2VDb2luXG4gIGltcGxlbWVudHMgTXVzaWcyUGFydGljaXBhbnQ8dXR4b2xpYi5iaXRnby5VdHhvUHNidD4sIE11c2lnMlBhcnRpY2lwYW50PGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidD5cbntcbiAgYWJzdHJhY3QgbmFtZTogVXR4b0NvaW5OYW1lO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb2luIGlzIGEgbWFpbm5ldCBjb2luLlxuICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5hbWUgcHJvcGVydHkuXG4gICAqIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNNYWlubmV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc01haW5uZXRDb2luKHRoaXMubmFtZSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JztcblxuICBwcm90ZWN0ZWQgc3VwcG9ydGVkVHhGb3JtYXRzOiB7IHBzYnQ6IGJvb2xlYW47IGxlZ2FjeTogYm9vbGVhbiB9ID0ge1xuICAgIHBzYnQ6IHRydWUsXG4gICAgbGVnYWN5OiB0aGlzLmlzTWFpbm5ldCgpLFxuICB9O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcicpIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gICAgdGhpcy5hbW91bnRUeXBlID0gYW1vdW50VHlwZTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0U2RrQmFja2VuZCgpOiBTZGtCYWNrZW5kIHtcbiAgICByZXR1cm4gaXNVdHhvQ29pbk5hbWVNYWlubmV0KHRoaXMubmFtZSkgPyAndXR4b2xpYicgOiAnd2FzbS11dHhvJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHdlIGRyb3Agc3VwcG9ydCBmb3IgdXR4b2xpYlxuICAgKiBVc2UgYG5hbWVgIHByb3BlcnR5IGluc3RlYWQuXG4gICAqL1xuICBnZXQgbmV0d29yaygpOiB1dHhvbGliLk5ldHdvcmsge1xuICAgIHJldHVybiBnZXROZXR3b3JrRnJvbUNvaW5OYW1lKHRoaXMubmFtZSk7XG4gIH1cblxuICBnZXRDaGFpbigpOiBVdHhvQ29pbk5hbWUge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogVXR4b0NvaW5OYW1lTWFpbm5ldCB7XG4gICAgcmV0dXJuIGdldE1haW5uZXRDb2luTmFtZSh0aGlzLm5hbWUpO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0RnVsbE5hbWVGcm9tQ29pbk5hbWUodGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29pbiBzdXBwb3J0cyBhIGJsb2NrIHRhcmdldCAqL1xuICBzdXBwb3J0c0Jsb2NrVGFyZ2V0KCk6IGJvb2xlYW4ge1xuICAgIC8vIEZJWE1FOiB0aGUgU0RLIGRvZXMgbm90IHNlZW0gdG8gdXNlIHRoaXMgYW55d2hlcmUgc28gaXQgaXMgdW5jbGVhciB3aGF0IHRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzXG4gICAgc3dpdGNoIChnZXRNYWlubmV0KHRoaXMubmV0d29yaykpIHtcbiAgICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luOlxuICAgICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmRvZ2Vjb2luOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzd2VlcFdpdGhTZW5kTWFueSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBzdGF0aWMgZ2V0IHZhbGlkQWRkcmVzc1R5cGVzKCk6IFNjcmlwdFR5cGUyT2YzW10ge1xuICAgIHJldHVybiBbLi4ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZhY3RvciBiZXR3ZWVuIHRoZSBiYXNlIHVuaXQgYW5kIGl0cyBzbWFsbGVzdCBzdWJkaXZpc29uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMWU4O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgaXMgdmFsaWRcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgcGFyYW0/OiB7IGFueUZvcm1hdD86IGJvb2xlYW47IGFsbG93TGlnaHRuaW5nPzogYm9vbGVhbiB9IHwgLyogbGVnYWN5IHBhcmFtZXRlciAqLyBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdib29sZWFuJyAmJiBwYXJhbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dMaWdodG5pbmcgPSAocGFyYW0gYXMgeyBhbGxvd0xpZ2h0bmluZz86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCk/LmFsbG93TGlnaHRuaW5nID8/IGZhbHNlO1xuICAgIGlmIChhbGxvd0xpZ2h0bmluZykge1xuICAgICAgaWYgKC9eKDAyfDAzKVswLTlhLWZBLUZdezY0fSQvLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNCb2x0MTFJbnZvaWNlKGFkZHJlc3MpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGFsbG93IGFsbCBhZGRyZXNzIGZvcm1hdHMuXG4gICAgLy8gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGhlIG9ubHkgYWRkaXRpb25hbCBhZGRyZXNzIGZvcm1hdCBpcyBiY2ggY2FzaGFkZHIuXG4gICAgY29uc3QgYW55Rm9ybWF0ID0gKHBhcmFtIGFzIHsgYW55Rm9ybWF0OiBib29sZWFuIH0gfCB1bmRlZmluZWQpPy5hbnlGb3JtYXQgPz8gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgLy8gRmluZCBvdXQgaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQgZm9yIGFueSBmb3JtYXQuIFRyaWVzIGFsbCBzdXBwb3J0ZWQgZm9ybWF0cyBieSBkZWZhdWx0LlxuICAgICAgLy8gVGhyb3dzIGlmIGFkZHJlc3MgY2Fubm90IGJlIGRlY29kZWQgd2l0aCBhbnkgZm9ybWF0LlxuICAgICAgY29uc3QgW2Zvcm1hdCwgc2NyaXB0XSA9IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdEFuZEZvcm1hdChhZGRyZXNzLCB0aGlzLm5ldHdvcmspO1xuICAgICAgLy8gdW5sZXNzIGFueUZvcm1hdCBpcyBzZXQsIG9ubHkgJ2RlZmF1bHQnIGlzIGFsbG93ZWQuXG4gICAgICBpZiAoIWFueUZvcm1hdCAmJiBmb3JtYXQgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhZGRyZXNzIGlzIGluIG5vcm1hbCByZXByZXNlbnRhdGlvbiBmb3IgZ2l2ZW4gZm9ybWF0LlxuICAgICAgcmV0dXJuIGFkZHJlc3MgPT09IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC5mcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChzY3JpcHQsIGZvcm1hdCwgdGhpcy5uZXR3b3JrKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gQklQMzIuZnJvbUJhc2U1OChwdWIpLmlzTmV1dGVyZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBjcmFmdGluZyB0aGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBCaXRHbyBBUEkuXG4gICAqIEl0IGNvbnZlcnRzIHRoZSByZWNpcGllbnQgYWRkcmVzcyBgc2NyaXB0UHViS2V5Oi4uLmAgdG8geyBzY3JpcHQ6IHN0cmluZyB9IHwgeyBhZGRyZXNzOiBzdHJpbmcgfS5cbiAgICovXG4gIG92ZXJyaWRlIHByZXByb2Nlc3NCdWlsZFBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMgPVxuICAgICAgICBwYXJhbXMucmVjaXBpZW50cyBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgPyBwYXJhbXM/LnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgYWRkcmVzcywgLi4ucmVzdCB9ID0gcmVjaXBpZW50O1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5yZXN0LCAuLi5mcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KGFkZHJlc3MpIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogcGFyYW1zLnJlY2lwaWVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhdGVzdCBibG9jayBoZWlnaHRcbiAgICogQHBhcmFtIHJlcUlkXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RCbG9ja0hlaWdodChyZXFJZD86IFJlcXVlc3RUcmFjZXIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChyZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICB9XG4gICAgY29uc3QgY2hhaW5oZWFkID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wdWJsaWMvYmxvY2svbGF0ZXN0JykpLnJlc3VsdCgpO1xuICAgIHJldHVybiAoY2hhaW5oZWFkIGFzIGFueSkuaGVpZ2h0O1xuICB9XG5cbiAgY2hlY2tSZWNpcGllbnQocmVjaXBpZW50OiB7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBudW1iZXIgfCBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQocmVjaXBpZW50KTtcbiAgICBpZiAoIWlzU2NyaXB0UmVjaXBpZW50KHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgc3VwZXIuY2hlY2tSZWNpcGllbnQocmVjaXBpZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGN1c3RvbSBjb2luIGxvZ2ljIGFmdGVyIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBCaXRHb1xuICAgKiBAcGFyYW0gcHJlYnVpbGRcbiAgICovXG4gIGFzeW5jIHBvc3RQcm9jZXNzUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+PiB7XG4gICAgY29uc3QgdHggPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uRnJvbVByZWJ1aWxkKHByZWJ1aWxkKTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcmVidWlsZC5ibG9ja0hlaWdodCkpIHtcbiAgICAgIHByZWJ1aWxkLmJsb2NrSGVpZ2h0ID0gKGF3YWl0IHRoaXMuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQoKSkgYXMgbnVtYmVyO1xuICAgIH1cbiAgICByZXR1cm4gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHR4SGV4OiBlbmNvZGVUcmFuc2FjdGlvbih0eCkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gd2lsbCBiZSByZW1vdmVkIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciB1dHhvbGliXG4gICAqIERldGVybWluZSBhbiBhZGRyZXNzJyB0eXBlIGJhc2VkIG9uIGl0cyB3aXRuZXNzIGFuZCByZWRlZW0gc2NyaXB0IHByZXNlbmNlXG4gICAqIEBwYXJhbSBhZGRyZXNzRGV0YWlsc1xuICAgKi9cbiAgc3RhdGljIGluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHM6IHsgY2hhaW46IG51bWJlciB9KTogU2NyaXB0VHlwZTJPZjMgfCBudWxsIHtcbiAgICByZXR1cm4gaXNDaGFpbkNvZGUoYWRkcmVzc0RldGFpbHMuY2hhaW4pID8gc2NyaXB0VHlwZUZvckNoYWluKGFkZHJlc3NEZXRhaWxzLmNoYWluKSA6IG51bGw7XG4gIH1cblxuICBjcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgaGV4OiBzdHJpbmdcbiAgKTogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyPihoZXgsIHRoaXMubmV0d29yaywgdGhpcy5hbW91bnRUeXBlKTtcbiAgfVxuXG4gIGRlY29kZVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIGlucHV0OiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGVjb2RlV2l0aDogU2RrQmFja2VuZCA9IHRoaXMuZGVmYXVsdFNka0JhY2tlbmRcbiAgKTogRGVjb2RlZFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgYnVmZmVyID0gc3RyaW5nVG9CdWZmZXJUcnlGb3JtYXRzKGlucHV0LCBbJ2hleCcsICdiYXNlNjQnXSk7XG4gICAgICByZXR1cm4gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbihidWZmZXIsIGRlY29kZVdpdGgpO1xuICAgIH1cblxuICAgIGlmICh1dHhvbGliLmJpdGdvLmlzUHNidChpbnB1dCkpIHtcbiAgICAgIGlmICghdGhpcy5zdXBwb3J0ZWRUeEZvcm1hdHMucHNidCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3JEZXByZWNhdGVkVHhGb3JtYXQoJ3BzYnQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNvZGVQc2J0V2l0aChpbnB1dCwgdGhpcy5uYW1lLCBkZWNvZGVXaXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IGZvcm1hdCB0cmFuc2FjdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIFRoaXMgd2lsbCBiZSBhbiB1bmNvbmRpdGlvbmFsIGVycm9yIGluIHRoZSBmdXR1cmUuXG4gICAgICBpZiAoIXRoaXMuc3VwcG9ydGVkVHhGb3JtYXRzLmxlZ2FjeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3JEZXByZWNhdGVkVHhGb3JtYXQoJ2xlZ2FjeScpO1xuICAgICAgfVxuICAgICAgaWYgKGRlY29kZVdpdGggIT09ICd1dHhvbGliJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdyZWNlaXZlZCBkZWNvZGVXaXRoIGhpbnQgJXMsIGlnbm9yaW5nIGZvciBsZWdhY3kgdHJhbnNhY3Rpb24nLCBkZWNvZGVXaXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihpbnB1dCwgdGhpcy5uZXR3b3JrLCB7XG4gICAgICAgIGFtb3VudFR5cGU6IHRoaXMuYW1vdW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGRlY29kZVRyYW5zYWN0aW9uQXNQc2J0KGlucHV0OiBCdWZmZXIgfCBzdHJpbmcpOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHwgZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbihpbnB1dCk7XG4gICAgaWYgKGRlY29kZWQgaW5zdGFuY2VvZiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQgfHwgZGVjb2RlZCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpIHtcbiAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHBzYnQgYnV0IGdvdCB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4ocHJlYnVpbGQ6IHtcbiAgICB0eEhleD86IHN0cmluZztcbiAgICB0eEJhc2U2ND86IHN0cmluZztcbiAgICBkZWNvZGVXaXRoPzogc3RyaW5nO1xuICB9KTogRGVjb2RlZFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICBjb25zdCBzdHJpbmcgPSBwcmVidWlsZC50eEhleCA/PyBwcmVidWlsZC50eEJhc2U2NDtcbiAgICBpZiAoIXN0cmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4SGV4IG9yIHR4QmFzZTY0IHByb3BlcnR5Jyk7XG4gICAgfVxuICAgIGxldCB7IGRlY29kZVdpdGggfSA9IHByZWJ1aWxkO1xuICAgIGlmIChkZWNvZGVXaXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgZGVjb2RlV2l0aCAhPT0gJ3N0cmluZycgfHwgIWlzU2RrQmFja2VuZChkZWNvZGVXaXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdkZWNvZGVXaXRoICVzIGlzIG5vdCBhIHZhbGlkIHZhbHVlLCB1c2luZyBkZWZhdWx0JywgZGVjb2RlV2l0aCk7XG4gICAgICAgIGRlY29kZVdpdGggPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKHN0cmluZywgZGVjb2RlV2l0aCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhbmQgZmlsbCB0cmFuc2FjdGlvbiBkZXRhaWxzIHN1Y2ggYXMgaW50ZXJuYWwvY2hhbmdlIHNwZW5kLCBleHRlcm5hbCBzcGVuZCAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSwgZXRjLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4+IHtcbiAgICByZXR1cm4gcGFyc2VUcmFuc2FjdGlvbih0aGlzLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGZ1bmN0aW9uIHZlcmlmeVVzZXJQdWJsaWNLZXkgaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeVVzZXJQdWJsaWNLZXkocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2ZXJpZnlVc2VyUHVibGljS2V5KHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgZnVuY3Rpb24gdmVyaWZ5S2V5U2lnbmF0dXJlIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyB2ZXJpZnlLZXlTaWduYXR1cmUocGFyYW1zOiBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2ZXJpZnlLZXlTaWduYXR1cmUocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsIGludGVudGlvblxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQYXJhbXMgcGFyYW1zIG9iamVjdCBwYXNzZWQgdG8gc2VuZFxuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQgcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQudHhIZXggcHJlYnVpbHQgdHJhbnNhY3Rpb24ncyB0eEhleCBmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0IFdhbGxldCBvYmplY3QgdG8gb2J0YWluIGtleXMgdG8gdmVyaWZ5IGFnYWluc3RcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24gT2JqZWN0IHNwZWNpZnlpbmcgc29tZSB2ZXJpZmljYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBEaXNhbGxvdyBmZXRjaGluZyBhbnkgZGF0YSBmcm9tIHRoZSBpbnRlcm5ldCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmtleWNoYWlucyBQYXNzIGtleWNoYWlucyBtYW51YWxseSByYXRoZXIgdGhhbiBmZXRjaGluZyB0aGVtIGJ5IGlkXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmFkZHJlc3NlcyBBZGRyZXNzIGRldGFpbHMgdG8gcGFzcyBpbiBmb3Igb3V0LW9mLWJhbmQgdmVyaWZpY2F0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZlcmlmaWNhdGlvbiBwYXNzZXNcbiAgICogQHRocm93cyB7VHhJbnRlbnRNaXNtYXRjaEVycm9yfSBpZiB0cmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3Mge1R4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcn0gaWYgdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBkb24ndCBtYXRjaCB1c2VyIGludGVudFxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB2ZXJpZnlUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgY29uc3QgdHhFeHBsYW5hdGlvbiA9IGF3YWl0IFR4SW50ZW50TWlzbWF0Y2hFcnJvci50cnlHZXRUeEV4cGxhbmF0aW9uKFxuICAgICAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBJQmFzZUNvaW4sXG4gICAgICAgICAgcGFyYW1zLnR4UHJlYnVpbGRcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgY29udmVydFZhbGlkYXRpb25FcnJvclRvVHhJbnRlbnRNaXNtYXRjaChcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgcGFyYW1zLnR4UGFyYW1zLFxuICAgICAgICAgIHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgICAgIHR4RXhwbGFuYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgYW4gYWRkcmVzcyBpcyB2YWxpZCBhbmQgdGhyb3cgYW4gZXJyb3IgaWYgaXQncyBub3QuXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyBUaGUgYWRkcmVzcyBzdHJpbmcgb24gdGhlIG5ldHdvcmtcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzVHlwZVxuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWlucyBLZXljaGFpbiBvYmplY3RzIHdpdGggeHB1YnNcbiAgICogQHBhcmFtIHBhcmFtcy5jb2luU3BlY2lmaWMgQ29pbi1zcGVjaWZpYyBkZXRhaWxzIGZvciB0aGUgYWRkcmVzcyBzdWNoIGFzIGEgd2l0bmVzcyBzY3JpcHRcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFpbiBEZXJpdmF0aW9uIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXMuaW5kZXggRGVyaXZhdGlvbiBpbmRleFxuICAgKiBAdGhyb3dzIHtJbnZhbGlkQWRkcmVzc0Vycm9yfVxuICAgKiBAdGhyb3dzIHtJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yfVxuICAgKiBAdGhyb3dzIHtVbmV4cGVjdGVkQWRkcmVzc0Vycm9yfVxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnM8VXR4b0NvaW5TcGVjaWZpYz4sIHdhbGxldD86IElXYWxsZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGtleWNoYWlucywgY2hhaW4sIGluZGV4IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0ICYmIGlzRGVzY3JpcHRvcldhbGxldCh3YWxsZXQpKSB7XG4gICAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzVHJpcGxlKGtleWNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbnMgbXVzdCBiZSBhIHRyaXBsZScpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0RGVzY3JpcHRvcldhbGxldEFkZHJlc3MoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBnZXREZXNjcmlwdG9yTWFwRnJvbVdhbGxldCh3YWxsZXQsIHRvQmlwMzJUcmlwbGUoa2V5Y2hhaW5zKSwgZ2V0UG9saWN5Rm9yRW52KHRoaXMuYml0Z28uZW52KSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoKF8uaXNVbmRlZmluZWQoY2hhaW4pICYmIF8uaXNVbmRlZmluZWQoaW5kZXgpKSB8fCAhKF8uaXNGaW5pdGUoY2hhaW4pICYmIF8uaXNGaW5pdGUoaW5kZXgpKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogaW52YWxpZCBjaGFpbiAoJHtjaGFpbn0pIG9yIGluZGV4ICgke2luZGV4fSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0Rml4ZWRTY3JpcHRXYWxsZXRBZGRyZXNzKHRoaXMubmFtZSwge1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGtleWNoYWlucyxcbiAgICAgIGZvcm1hdDogcGFyYW1zLmZvcm1hdCA/PyAnYmFzZTU4JyxcbiAgICAgIGNoYWluLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIHVuc3BlbnRUeXBlXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuaXNTdXBwb3J0ZWRTY3JpcHRUeXBlKHRoaXMubmV0d29yaywgYWRkcmVzc1R5cGUpO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLm9uY2hhaW47XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEByZXR1cm4gdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIGNoYWluXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NDaGFpbihjaGFpbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQ2hhaW5Db2RlKGNoYWluKSAmJiB0aGlzLnN1cHBvcnRzQWRkcmVzc1R5cGUodXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pKTtcbiAgfVxuXG4gIGtleUlkc0ZvclNpZ25pbmcoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT107XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cy5cbiAgICogQHBhcmFtIHBzYnQgYWxsIE11U2lnMiBpbnB1dHMgc2hvdWxkIGNvbnRhaW4gdXNlciBNdVNpZzIgbm9uY2VcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBnZXRNdXNpZzJOb25jZXMocHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgd2FsbGV0SWQ6IHN0cmluZyk6IFByb21pc2U8dXR4b2xpYi5iaXRnby5VdHhvUHNidD47XG4gIGFzeW5jIGdldE11c2lnMk5vbmNlcyhwc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidD47XG4gIGFzeW5jIGdldE11c2lnMk5vbmNlczxUIGV4dGVuZHMgdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidD4oXG4gICAgcHNidDogVCxcbiAgICB3YWxsZXRJZDogc3RyaW5nXG4gICk6IFByb21pc2U8VD47XG4gIGFzeW5jIGdldE11c2lnMk5vbmNlczxUIGV4dGVuZHMgdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidD4oXG4gICAgcHNidDogVCxcbiAgICB3YWxsZXRJZDogc3RyaW5nXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy93YWxsZXQvJyArIHdhbGxldElkICsgJy90eC9zaWducHNidCcpKVxuICAgICAgLnNlbmQoeyBwc2J0OiBidWZmZXIudG9TdHJpbmcoJ2hleCcpIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgaWYgKHBzYnQgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KSB7XG4gICAgICByZXR1cm4gZGVjb2RlUHNidFdpdGgocmVzcG9uc2UucHNidCwgdGhpcy5uYW1lLCAndXR4b2xpYicpIGFzIFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkZWNvZGVQc2J0V2l0aChyZXNwb25zZS5wc2J0LCB0aGlzLm5hbWUsICd3YXNtLXV0eG8nKSBhcyBUO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0TXVzaWcyTm9uY2VzIGluc3RlYWRcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cy5cbiAgICogQHBhcmFtIHBzYnRIZXggYWxsIE11U2lnMiBpbnB1dHMgc2hvdWxkIGNvbnRhaW4gdXNlciBNdVNpZzIgbm9uY2VcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidChwc2J0SGV4OiBzdHJpbmcsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25Qc2J0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwc2J0ID0gYXdhaXQgdGhpcy5nZXRNdXNpZzJOb25jZXModGhpcy5kZWNvZGVUcmFuc2FjdGlvbkFzUHNidChwc2J0SGV4KSwgd2FsbGV0SWQpO1xuICAgIHJldHVybiB7IHBzYnQ6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGlucHV0IHBzYnQgYWRkZWQgd2l0aCBkZXRlcm1pbmlzdGljIE11U2lnMiBub25jZSBmb3IgYml0Z28ga2V5IGZvciBlYWNoIE11U2lnMiBpbnB1dHMgZnJvbSBPVkMuXG4gICAqIEBwYXJhbSBvdmNKc29uIEpTT04gb2JqZWN0IHByb3ZpZGVkIGJ5IE9WQyB3aXRoIGZpZWxkcyBwc2J0SGV4IGFuZCB3YWxsZXRJZFxuICAgKi9cbiAgYXN5bmMgc2lnblBzYnRGcm9tT1ZDKG92Y0pzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGFzc2VydChvdmNKc29uWydwc2J0SGV4J10sICdvdmNKc29uIG11c3QgY29udGFpbiBwc2J0SGV4Jyk7XG4gICAgYXNzZXJ0KG92Y0pzb25bJ3dhbGxldElkJ10sICdvdmNKc29uIG11c3QgY29udGFpbiB3YWxsZXRJZCcpO1xuICAgIGNvbnN0IGhleCA9IG92Y0pzb25bJ3BzYnRIZXgnXSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgd2FsbGV0SWQgPSBvdmNKc29uWyd3YWxsZXRJZCddIGFzIHN0cmluZztcbiAgICBjb25zdCBwc2J0ID0gYXdhaXQgdGhpcy5nZXRNdXNpZzJOb25jZXModGhpcy5kZWNvZGVUcmFuc2FjdGlvbkFzUHNidChoZXgpLCB3YWxsZXRJZCk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKG92Y0pzb24sIHsgdHhIZXg6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+fVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiBzaWduVHJhbnNhY3Rpb248VE51bWJlcj4odGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb24gd2l0aCBhIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uLiBFeGFtcGxlIHVzZSBjYXNlIGlzIGV4cHJlc3MgZXh0ZXJuYWwgc2lnbmVyXG4gICAqIEBwYXJhbSBjdXN0b21TaWduaW5nRnVuY3Rpb24gY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2luZ2xlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gc2lnblRyYW5zYWN0aW9uUGFyYW1zIHBhcmFtZXRlcnMgZm9yIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uLiBJbmNsdWRlcyB0eFByZWJ1aWxkIGFuZCBwdWJzXG4gICAqXG4gICAqIEByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbiBhcyBoZXggc3RyaW5nXG4gICAqL1xuICBhc3luYyBzaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlcj4sXG4gICAgc2lnblRyYW5zYWN0aW9uUGFyYW1zOiB7IHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47IHB1YnM6IHN0cmluZ1tdIH1cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG4gICAgYXNzZXJ0KHR4SGV4LCAnbWlzc2luZyB0eEhleCBwYXJhbWV0ZXInKTtcblxuICAgIGNvbnN0IHR4ID0gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbih0eEhleCk7XG5cbiAgICBjb25zdCBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0ID0gaGFzS2V5UGF0aFNwZW5kSW5wdXQodHgsIHNpZ25UcmFuc2FjdGlvblBhcmFtcy5wdWJzLCB0aGlzLm5hbWUpO1xuXG4gICAgaWYgKCFpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0KSB7XG4gICAgICByZXR1cm4gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLCBjb2luOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFR4SGV4ID0gKHY6IFNpZ25lZFRyYW5zYWN0aW9uKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICgndHhIZXgnIGluIHYpIHtcbiAgICAgICAgcmV0dXJuIHYudHhIZXg7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5vdCBmb3VuZCBpbiBzaWduVHJhbnNhY3Rpb24gcmVzdWx0Jyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25lck5vbmNlVHggPSBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJOb25jZScsXG4gICAgICBjb2luOiB0aGlzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJzIH0gPSBzaWduVHJhbnNhY3Rpb25QYXJhbXM7XG4gICAgYXNzZXJ0KHB1YnMgPT09IHVuZGVmaW5lZCB8fCBpc1RyaXBsZShwdWJzKSk7XG5cbiAgICBjb25zdCBjb3NpZ25lck5vbmNlVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwdWJzLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZCwgdHhIZXg6IGdldFR4SGV4KHNpZ25lck5vbmNlVHgpIH0sXG4gICAgICBzaWduaW5nU3RlcDogJ2Nvc2lnbmVyTm9uY2UnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcy50eFByZWJ1aWxkLCB0eEhleDogZ2V0VHhIZXgoY29zaWduZXJOb25jZVR4KSB9LFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJTaWduYXR1cmUnLFxuICAgICAgY29pbjogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdW5zcGVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQml0R29UYWludGVkVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50Pih1bnNwZW50OiBVbnNwZW50PFROdW1iZXI+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQodW5zcGVudCwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXBvc2UgYSByYXcgcHNidC90cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAgICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleHBsYWluVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+LFxuICAgIHdhbGxldD86IElXYWxsZXRcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMucHVicykge1xuICAgICAgLy8gaWYgbm8gcHVicyBhcmUgcHJvdmlkZWQsIG9wcG9ydHVuaXN0aWNhbGx5IGZldGNoIHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgd2FsbGV0XG4gICAgICBpZiAod2FsbGV0KSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKHRoaXMsIHdhbGxldCk7XG4gICAgICAgIHBhcmFtcy5wdWJzID0gdG9CaXAzMlRyaXBsZShrZXljaGFpbnMpLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXhwbGFpblR4KHRoaXMuZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQocGFyYW1zKSwgcGFyYW1zLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBiYWNrdXBLZXlSZWNvdmVyeX1cbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyUGFyYW1zKTogUmV0dXJuVHlwZTx0eXBlb2YgYmFja3VwS2V5UmVjb3Zlcnk+IHtcbiAgICByZXR1cm4gYmFja3VwS2V5UmVjb3ZlcnkodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJWMShwYXJhbXM6IFYxUmVjb3ZlclBhcmFtcyk6IFJldHVyblR5cGU8dHlwZW9mIHYxQmFja3VwS2V5UmVjb3Zlcnk+IHtcbiAgICByZXR1cm4gdjFCYWNrdXBLZXlSZWNvdmVyeSh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgc3dlZXBWMShwYXJhbXM6IFYxU3dlZXBQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiB2MVN3ZWVwPiB7XG4gICAgcmV0dXJuIHYxU3dlZXAodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGNvaW4gdGhhdCB3YXMgc2VudCB0byB3cm9uZyBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhpZCBUaGUgdHhpZCBvZiB0aGUgZmF1bHR5IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzIGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnJlY292ZXJ5Q29pbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQgdGhhdCByZWNlaXZlZCB0aGUgZnVuZHNcbiAgICogQHBhcmFtIHBhcmFtcy5zaWduZWQgcmV0dXJuIGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gKGRlZmF1bHQ9dHJ1ZSlcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0gcGFyYW1zLnhwcnYgdGhlIHVuZW5jcnlwdGVkIHhwcnYgKHVzZWQgaW5zdGVhZCBvZiB3YWxsZXQgcGFzc3BocmFzZSlcbiAgICogQHBhcmFtIHBhcmFtcy5hcGlLZXkgZm9yIHV0eG8gY29pbnMgb3RoZXIgdGhhbiBbQlRDLFRCVENdIHRoaXMgaXMgYSBCbG9jayBDaGFpciBhcGkga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckZyb21Xcm9uZ0NoYWluPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9uc1xuICApOiBQcm9taXNlPENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPiB8IENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eGlkLCByZWNvdmVyeUFkZHJlc3MsIHdhbGxldCwgd2FsbGV0UGFzc3BocmFzZSwgeHBydiwgYXBpS2V5IH0gPSBwYXJhbXM7XG5cbiAgICAvLyBwYXJhbXMucmVjb3ZlcnlDb2luIHVzZWQgdG8gYmUgcGFyYW1zLmNvaW4sIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgcmVjb3ZlcnlDb2luID0gcGFyYW1zLmNvaW4gfHwgcGFyYW1zLnJlY292ZXJ5Q29pbjtcbiAgICBpZiAoIXJlY292ZXJ5Q29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIG9iamVjdCByZWNvdmVyeUNvaW4nKTtcbiAgICB9XG4gICAgLy8gc2lnbmVkIHNob3VsZCBkZWZhdWx0IHRvIHRydWUsIGFuZCBvbmx5IGJlIGRpc2FibGVkIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIChub3QgdW5kZWZpbmVkKVxuICAgIGNvbnN0IHNpZ25lZCA9IHBhcmFtcy5zaWduZWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3Qgc291cmNlQ29pbkZhbWlseSA9IHRoaXMuZ2V0RmFtaWx5KCk7XG4gICAgY29uc3QgcmVjb3ZlcnlDb2luRmFtaWx5ID0gcmVjb3ZlcnlDb2luLmdldEZhbWlseSgpO1xuICAgIGNvbnN0IHN1cHBvcnRlZFJlY292ZXJ5Q29pbnMgPSBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3Zlcmllc1tzb3VyY2VDb2luRmFtaWx5XTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHN1cHBvcnRlZFJlY292ZXJ5Q29pbnMpIHx8ICFzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zLmluY2x1ZGVzKHJlY292ZXJ5Q29pbkZhbWlseSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3Zlcnkgb2YgJHtzb3VyY2VDb2luRmFtaWx5fSBiYWxhbmNlcyBmcm9tICR7cmVjb3ZlcnlDb2luRmFtaWx5fSB3YWxsZXRzIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlY292ZXJDcm9zc0NoYWluPFROdW1iZXI+KHRoaXMuYml0Z28sIHtcbiAgICAgIHNvdXJjZUNvaW46IHRoaXMsXG4gICAgICByZWNvdmVyeUNvaW4sXG4gICAgICB3YWxsZXRJZDogd2FsbGV0LFxuICAgICAgdHhpZCxcbiAgICAgIHJlY292ZXJ5QWRkcmVzcyxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHNpZ25lZCA/IHdhbGxldFBhc3NwaHJhc2UgOiB1bmRlZmluZWQsXG4gICAgICB4cHJ2OiBzaWduZWQgPyB4cHJ2IDogdW5kZWZpbmVkLFxuICAgICAgYXBpS2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGJpcDMyIGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIgYW5kIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ6IEJ1ZmZlcik6IHsgcHViOiBzdHJpbmc7IHBydjogc3RyaW5nIH0ge1xuICAgIGlmICghc2VlZCkge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgaGFzIGJvdGggYSBub3JtYWwgMjU2IGJpdCBwcml2YXRlIGtleSBhbmQgYSAyNTZcbiAgICAgIC8vIGJpdCBjaGFpbiBjb2RlLCBib3RoIG9mIHdoaWNoIG11c3QgYmUgcmFuZG9tLiA1MTIgYml0cyBpcyB0aGVyZWZvcmUgdGhlXG4gICAgICAvLyBtYXhpbXVtIGVudHJvcHkgYW5kIGdpdmVzIHVzIG1heGltdW0gc2VjdXJpdHkgYWdhaW5zdCBjcmFja2luZy5cbiAgICAgIHNlZWQgPSByYW5kb21CeXRlcyg1MTIgLyA4KTtcbiAgICB9XG4gICAgY29uc3QgZXh0ZW5kZWRLZXkgPSBCSVAzMi5mcm9tU2VlZChzZWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBleHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBwcnY6IGV4dGVuZGVkS2V5LnRvQmFzZTU4KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIGZvcm1hdCBiYXNlZCBvbiB3YWxsZXQgcHJvcGVydGllcyBhbmQgbmV0d29ya1xuICAgKiBAcGFyYW0gd2FsbGV0IC0gVGhlIHdhbGxldCB0byBjaGVja1xuICAgKiBAcGFyYW0gcmVxdWVzdGVkRm9ybWF0IC0gT3B0aW9uYWwgZXhwbGljaXRseSByZXF1ZXN0ZWQgZm9ybWF0XG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2FjdGlvbiBmb3JtYXQgdG8gdXNlLCBvciB1bmRlZmluZWQgaWYgbm8gZGVmYXVsdCBhcHBsaWVzXG4gICAqL1xuICBnZXREZWZhdWx0VHhGb3JtYXQod2FsbGV0OiBXYWxsZXQsIHJlcXVlc3RlZEZvcm1hdD86IFR4Rm9ybWF0KTogVHhGb3JtYXQge1xuICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgPT09ICdsZWdhY3knKSB7XG4gICAgICByZXR1cm4gJ3BzYnQtbGl0ZSc7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0ZWRGb3JtYXQgPz8gJ3BzYnQtbGl0ZSc7XG4gIH1cblxuICBhc3luYyBnZXRFeHRyYVByZWJ1aWxkUGFyYW1zKGJ1aWxkUGFyYW1zOiBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyAmIHsgd2FsbGV0OiBXYWxsZXQgfSk6IFByb21pc2U8e1xuICAgIHR4Rm9ybWF0PzogVHhGb3JtYXQ7XG4gICAgY2hhbmdlQWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mM1tdIHwgU2NyaXB0VHlwZTJPZjM7XG4gICAgYWxsb3dlZElucHV0U2NyaXB0VHlwZXM/OiBTY3JpcHRUeXBlMk9mM1tdO1xuICB9PiB7XG4gICAgY29uc3QgcmVxdWVzdGVkRm9ybWF0ID0gYnVpbGRQYXJhbXMudHhGb3JtYXQgYXMgVHhGb3JtYXQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHhGb3JtYXQgPSB0aGlzLmdldERlZmF1bHRUeEZvcm1hdChidWlsZFBhcmFtcy53YWxsZXQsIHJlcXVlc3RlZEZvcm1hdCk7XG4gICAgbGV0IGNoYW5nZUFkZHJlc3NUeXBlID0gYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUgYXMgU2NyaXB0VHlwZTJPZjNbXSB8IFNjcmlwdFR5cGUyT2YzIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gaWYgdGhlIGFkZHJlc3NUeXBlIGlzIG5vdCBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gZGVmYXVsdCB0byBwMnRyTXVzaWcyIGZvciB0ZXN0bmV0IGhvdCB3YWxsZXRzIGZvciBzdGFnZWQgcm9sbG91dCBvZiBwMnRyTXVzaWcyXG4gICAgaWYgKFxuICAgICAgYnVpbGRQYXJhbXMuYWRkcmVzc1R5cGUgPT09IHVuZGVmaW5lZCAmJiAvLyBhZGRyZXNzVHlwZSBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgY2hhbmdlQWRkcmVzc2BcbiAgICAgIGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3NUeXBlID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3MgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgYnVpbGRQYXJhbXMud2FsbGV0LnR5cGUoKSA9PT0gJ2hvdCdcbiAgICApIHtcbiAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gWydwMnRyTXVzaWcyJywgJ3Ayd3NoJywgJ3Ayc2hQMndzaCcsICdwMnNoJywgJ3AydHInXTtcbiAgICB9XG5cbiAgICAvLyBnZXRIYWxmU2lnbmVkTGVnYWN5Rm9ybWF0KCkgb25seSBzdXBwb3J0cyBwMm1zLWJhc2VkIHR5cGVzIChwMnNoLCBwMnNoUDJ3c2gsIHAyd3NoKS5cbiAgICAvLyBGaWx0ZXIgY2hhbmdlIG91dHB1dHMgYW5kIHJlc3RyaWN0IGlucHV0IHNlbGVjdGlvbiB0byB0aGVzZSB0eXBlcy5cbiAgICBjb25zdCBsZWdhY3lDb21wYXRpYmxlVHlwZXM6IFNjcmlwdFR5cGUyT2YzW10gPSBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJ107XG4gICAgbGV0IGFsbG93ZWRJbnB1dFNjcmlwdFR5cGVzOiBTY3JpcHRUeXBlMk9mM1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHJlcXVlc3RlZEZvcm1hdCA9PT0gJ2xlZ2FjeScpIHtcbiAgICAgIGFsbG93ZWRJbnB1dFNjcmlwdFR5cGVzID0gbGVnYWN5Q29tcGF0aWJsZVR5cGVzO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlQWRkcmVzc1R5cGUpKSB7XG4gICAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gY2hhbmdlQWRkcmVzc1R5cGUuZmlsdGVyKCh0KTogdCBpcyBTY3JpcHRUeXBlMk9mMyA9PlxuICAgICAgICAgIGxlZ2FjeUNvbXBhdGlibGVUeXBlcy5pbmNsdWRlcyh0IGFzIFNjcmlwdFR5cGUyT2YzKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VBZGRyZXNzVHlwZSAhPT0gdW5kZWZpbmVkICYmICFsZWdhY3lDb21wYXRpYmxlVHlwZXMuaW5jbHVkZXMoY2hhbmdlQWRkcmVzc1R5cGUpKSB7XG4gICAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gbGVnYWN5Q29tcGF0aWJsZVR5cGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eEZvcm1hdCxcbiAgICAgIGNoYW5nZUFkZHJlc3NUeXBlLFxuICAgICAgYWxsb3dlZElucHV0U2NyaXB0VHlwZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByZUNyZWF0ZUJpdEdvKHBhcmFtczogUHJlY3JlYXRlQml0R29PcHRpb25zKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgcHJlc2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHBhcmFtcy53YWxsZXREYXRhICYmIGlzVXR4b1dhbGxldERhdGEocGFyYW1zLndhbGxldERhdGEpICYmIGlzRGVzY3JpcHRvcldhbGxldERhdGEocGFyYW1zLndhbGxldERhdGEpKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIGNvbnN0IHJldHVybkxlZ2FjeUZvcm1hdCA9IChwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnR4Rm9ybWF0ID09PSAnbGVnYWN5JztcblxuICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBhICdwc2J0LWxpdGUnIHRyYW5zYWN0aW9uIGZvcm1hdCwgd2Ugd2FudCB0byBpbmRpY2F0ZSBpbiBzaWduaW5nIHRvIG5vdCBmYWlsXG4gICAgY29uc3QgdHhIZXggPSAocGFyYW1zLnR4SGV4ID8/IHBhcmFtcy50eFByZWJ1aWxkPy50eEhleCkgYXMgc3RyaW5nO1xuICAgIGlmIChcbiAgICAgIHR4SGV4ICYmXG4gICAgICB1dHhvbGliLmJpdGdvLmlzUHNidCh0eEhleCBhcyBzdHJpbmcpICYmXG4gICAgICB1dHhvbGliLmJpdGdvLmlzUHNidExpdGUodXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eEhleCwgdGhpcy5uZXR3b3JrKSkgJiZcbiAgICAgIHBhcmFtcy5hbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4ID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogdHJ1ZSwgcmV0dXJuTGVnYWN5Rm9ybWF0IH07XG4gICAgfVxuICAgIHJldHVybiB7IC4uLnBhcmFtcywgcmV0dXJuTGVnYWN5Rm9ybWF0IH07XG4gIH1cblxuICBhc3luYyBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQoXG4gICAgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICAgIGtleWNoYWluczogS2V5Y2hhaW5zVHJpcGxldFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB3YWxsZXRQYXJhbXM7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRSZWNvdmVyeVByb3ZpZGVyKGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlciB7XG4gICAgcmV0dXJuIGZvckNvaW4odGhpcy5nZXRDaGFpbigpLCBhcGlUb2tlbik7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoe1xuICAgIG11bHRpU2lnVHlwZSxcbiAgICBwdWJsaWNLZXksXG4gICAgcHJ2LFxuICB9OiB7XG4gICAgbXVsdGlTaWdUeXBlOiBNdWx0aXNpZ1R5cGU7XG4gICAgcHVibGljS2V5OiBzdHJpbmc7XG4gICAgcHJ2OiBzdHJpbmc7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlID09PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0c3MgYXVkaXRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb2luJyk7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZFBydihwcnYpICYmICFpc1ZhbGlkWHBydihwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgaWYgKHB1YmxpY0tleSkge1xuICAgICAgY29uc3QgZ2VuUHViS2V5ID0gQklQMzIuZnJvbUJhc2U1OChwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICAgIGlmIChnZW5QdWJLZXkgIT09IHB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmxpYyBrZXkgZG9lcyBub3QgbWF0Y2ggcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==